From 05f0df66ac502ecfc2f2a72f01360963d9fce167 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Wed, 25 Oct 2023 15:38:45 -0400 Subject: [PATCH 01/29] Add Conjure Prefix and DTLS transports - Add port randomization to Min transport - Add Prefix and DTLS transports, with port randomization - Drop Obsf4 transport - Enable Conjure IPv6 dials - Add new tactics for Conjure transport selection and for DTLS transport STUN server address configuration - Update embedded Conjure ClientConf - Fully disable TAPDANCE-OSSH - NewUDPConn: add dial mode and IPv4/IPv6 address specification - Refactor WriteTimeoutUDPConn for common use - Add ResolveParameters.PreresolvedDomain, allowing for one ResolveParameters to be shared for multiple domain resolutions - ObfuscatedSSHConn: skip 0-byte writes, just in case those trigger unintended underlying transport traffic --- go.mod | 68 +-- go.sum | 193 ++++++--- psiphon/UDPConn.go | 218 +++++++--- psiphon/common/net.go | 77 ++++ .../common/obfuscator/obfuscatedSshConn.go | 43 +- psiphon/common/parameters/parameters.go | 53 ++- psiphon/common/prng/prng.go | 9 + psiphon/common/protocol/protocol.go | 62 ++- psiphon/common/protocol/serverEntry.go | 4 + psiphon/common/quic/quic.go | 90 +--- psiphon/common/refraction/config.go | 30 +- psiphon/common/refraction/embedded_config.go | 5 +- psiphon/common/refraction/refraction.go | 391 ++++++++++++------ psiphon/common/resolver/resolver.go | 21 +- psiphon/common/resolver/resolver_test.go | 43 +- psiphon/config.go | 39 ++ psiphon/dataStore.go | 1 - psiphon/dialParameters.go | 45 +- psiphon/meekConn.go | 4 +- psiphon/net.go | 54 ++- psiphon/notice.go | 34 +- psiphon/serverApi.go | 86 ++-- psiphon/tunnel.go | 28 +- 23 files changed, 1097 insertions(+), 501 deletions(-) diff --git a/go.mod b/go.mod index 3b61dbcbe..93e9f62e1 100644 --- a/go.mod +++ b/go.mod @@ -2,17 +2,9 @@ module github.com/Psiphon-Labs/psiphon-tunnel-core go 1.19 -// When this is the main module, use a patched version of -// refraction/gotapdance with -// https://github.com/Psiphon-Labs/psiphon-tunnel-core/commit/2a4121d9 -replace github.com/refraction-networking/gotapdance => ./replace/gotapdance +replace gitlab.com/yawning/obfs4.git => github.com/jmwample/obfs4 v0.0.0-20230725223418-2d2e5b4a16ba -// When this is the main module, gitlab.com/yawning/obfs4, used by -// refraction-networking/gotapdance, is pinned at 816cff15 the last revision -// published without a GPL license. This version lacks obfuscation -// improvements added in revision 1a6129b6, but these changes apply only on -// the server side. -replace gitlab.com/yawning/obfs4.git => ./replace/obfs4.git +replace github.com/pion/dtls/v2 => github.com/mingyech/dtls/v2 v2.0.0 require ( github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e @@ -31,63 +23,73 @@ require ( github.com/florianl/go-nfqueue v1.1.1-0.20200829120558-a2f196e98ab0 github.com/gobwas/glob v0.2.4-0.20180402141543-f00a7392b439 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e - github.com/google/gopacket v1.1.19-0.20200831200443-df1bbd09a561 + github.com/google/gopacket v1.1.19 github.com/grafov/m3u8 v0.0.0-20171211212457-6ab8f28ed427 - github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 + github.com/hashicorp/golang-lru v1.0.2 github.com/juju/ratelimit v1.0.2 github.com/marusama/semaphore v0.0.0-20171214154724-565ffd8e868a github.com/miekg/dns v1.1.44-0.20210804161652-ab67aa642300 github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 - github.com/oschwald/maxminddb-golang v1.2.1-0.20170901134056-26fe5ace1c70 + github.com/oschwald/maxminddb-golang v1.12.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/refraction-networking/gotapdance v1.2.0 + github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 + github.com/refraction-networking/gotapdance v1.7.7 github.com/refraction-networking/utls v1.3.3 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 - github.com/sirupsen/logrus v1.8.1 - github.com/stretchr/testify v1.7.1 + github.com/sirupsen/logrus v1.9.3 + github.com/stretchr/testify v1.8.4 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 github.com/wader/filtertransport v0.0.0-20200316221534-bdd9e61eee78 - golang.org/x/crypto v0.10.0 - golang.org/x/net v0.11.0 + golang.org/x/crypto v0.14.0 + golang.org/x/net v0.17.0 golang.org/x/sync v0.1.0 - golang.org/x/sys v0.9.0 - golang.org/x/term v0.9.0 + golang.org/x/sys v0.13.0 + golang.org/x/term v0.13.0 ) require ( - git.torproject.org/pluggable-transports/goptlib.git v1.2.0 // indirect github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 // indirect - github.com/BurntSushi/toml v0.3.1 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect github.com/Psiphon-Labs/qtls-go1-19 v0.0.0-20230608213623-d58aa73e519a // indirect github.com/Psiphon-Labs/qtls-go1-20 v0.0.0-20230608214729-dd57d6787acf // indirect - github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dchest/siphash v1.2.3-0.20201109081723-a21c2e7914a8 // indirect + github.com/dchest/siphash v1.2.3 // indirect github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 // indirect - github.com/gaukas/godicttls v0.0.3 // indirect + github.com/flynn/noise v1.0.0 // indirect + github.com/gaukas/godicttls v0.0.4 // indirect github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3-0.20210916003710-5d5e8c018a13 // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect github.com/josharian/native v1.0.0 // indirect github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 // indirect - github.com/klauspost/compress v1.16.6 // indirect + github.com/klauspost/compress v1.16.7 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/mdlayher/netlink v1.4.2-0.20210930205308-a81a8c23d40a // indirect github.com/mdlayher/socket v0.0.0-20210624160740-9dbe287ded84 // indirect - github.com/mroth/weightedrand v0.4.1 // indirect + github.com/mroth/weightedrand v1.0.0 // indirect github.com/onsi/ginkgo/v2 v2.2.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pion/dtls/v2 v2.2.7 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/sctp v1.8.8 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.3 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect + github.com/refraction-networking/ed25519 v0.1.2 // indirect + github.com/refraction-networking/obfs4 v0.1.2 // indirect github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507 // indirect - gitlab.com/yawning/obfs4.git v0.0.0-20190120164510-816cff15f425 // indirect + gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib v1.5.0 // indirect golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/text v0.10.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/tools v0.6.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.2.1 // indirect ) diff --git a/go.sum b/go.sum index 5efe91feb..13539e81d 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,8 @@ -git.torproject.org/pluggable-transports/goptlib.git v1.2.0 h1:0qRF7Dw5qXd0FtZkjWUiAh5GTutRtDGL4GXUDJ4qMHs= -git.torproject.org/pluggable-transports/goptlib.git v1.2.0/go.mod h1:4PBMl1dg7/3vMWSoWb46eGWlrxkUyn/CAJmxhDLAlDs= github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 h1:CVuXDbdzPW0XCNYTldy5dQues57geAs+vfwz3FTTpy8= github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e h1:NPfqIbzmijrl0VclX2t8eO5EPBhqe47LLGKpRrcVjXk= github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e/go.mod h1:ZdY5pBfat/WVzw3eXbIf7N1nZN0XD5H5+X8ZMDWbCs4= github.com/Psiphon-Labs/bolt v0.0.0-20200624191537-23cedaef7ad7 h1:Hx/NCZTnvoKZuIBwSmxE58KKoNLXIGG6hBJYN7pj9Ag= @@ -18,14 +17,13 @@ github.com/Psiphon-Labs/quic-go v0.0.0-20230626192210-73f29effc9da h1:TI2+ExyFR3 github.com/Psiphon-Labs/quic-go v0.0.0-20230626192210-73f29effc9da/go.mod h1:wTIxqsKVrEQIxVIIYOEHuscY+PM3h6Wz79u5aF60fo0= github.com/Psiphon-Labs/tls-tris v0.0.0-20230824155421-58bf6d336a9a h1:BOfU6ghaMsT/c40sWHmf3PXNwIendYXzL6tRv6NbPog= github.com/Psiphon-Labs/tls-tris v0.0.0-20230824155421-58bf6d336a9a/go.mod h1:v3y9GXFo9Sf2mO6auD2ExGG7oDgrK8TI7eb49ZnUxrE= -github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI= -github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/armon/go-proxyproto v0.0.0-20180202201750-5b7edb60ff5f h1:SaJ6yqg936TshyeFZqQE+N+9hYkIeL9AMr7S4voCl10= github.com/armon/go-proxyproto v0.0.0-20180202201750-5b7edb60ff5f/go.mod h1:QmP9hvJ91BbJmGVGSbutW19IC0Q9phDCLGaomwTJbgU= github.com/bifurcation/mint v0.0.0-20180306135233-198357931e61 h1:BU+NxuoaYPIvvp8NNkNlLr8aA0utGyuunf4Q3LJ0bh0= github.com/bifurcation/mint v0.0.0-20180306135233-198357931e61/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9 h1:a1zrFsLFac2xoM6zG1u72DWJwZG3ayttYLfmLbxVETk= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -38,14 +36,15 @@ github.com/cognusion/go-cache-lru v0.0.0-20170419142635-f73e2280ecea/go.mod h1:M github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/siphash v1.2.3-0.20201109081723-a21c2e7914a8 h1:/3Ns/G7byyjzX76ElLmWJzmr4Ln2xAJy5mXdyowmGck= -github.com/dchest/siphash v1.2.3-0.20201109081723-a21c2e7914a8/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= +github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= +github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= github.com/deckarep/golang-set v0.0.0-20171013212420-1d4478f51bed h1:njG8LmGD6JCWJu4bwIKmkOHvch70UOEIqczl5vp7Gok= github.com/deckarep/golang-set v0.0.0-20171013212420-1d4478f51bed/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/dgraph-io/badger v1.5.4-0.20180815194500-3a87f6d9c273 h1:45qZ7jowabqhyi3l9Ervox4dhQvLGB5BJPdC8w0a77k= github.com/dgraph-io/badger v1.5.4-0.20180815194500-3a87f6d9c273/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 h1:afESQBXJEnj3fu+34X//E8Wg3nEbMJxJkwSc0tPePK0= github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d h1:rtM8HsT3NG37YPjz8sYSbUSdElP9lUsQENYzJDZDUBE= github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= @@ -53,9 +52,12 @@ github.com/elazarl/goproxy/ext v0.0.0-20200809112317-0581fc3aee2d h1:st1tmvy+4du github.com/elazarl/goproxy/ext v0.0.0-20200809112317-0581fc3aee2d/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/florianl/go-nfqueue v1.1.1-0.20200829120558-a2f196e98ab0 h1:7ZJyJV4KiWBijCCzUPvVaqxsDxO36+KD0XKBdEN3I+8= github.com/florianl/go-nfqueue v1.1.1-0.20200829120558-a2f196e98ab0/go.mod h1:2z3Tfqwv2ueuK6h563xUHRcCh1mv38wS9EjiWiesk84= +github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= +github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/gaukas/godicttls v0.0.3 h1:YNDIf0d9adcxOijiLrEzpfZGAkNwLRzPaG6OjU7EITk= -github.com/gaukas/godicttls v0.0.3/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= +github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= +github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobwas/glob v0.2.4-0.20180402141543-f00a7392b439 h1:T6zlOdzrYuHf6HUKujm9bzkzbZ5Iv/xf6rs8BHZDpoI= @@ -65,9 +67,8 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3-0.20210916003710-5d5e8c018a13 h1:yztvEbaW/qZGubeP7+Lug7PXl7NBfilUK6mw3jq25gQ= -github.com/golang/protobuf v1.5.3-0.20210916003710-5d5e8c018a13/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -75,19 +76,17 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gopacket v1.1.19-0.20200831200443-df1bbd09a561 h1:VB5cLlMqQWruyqG6OW/EHDLUawT/hel1I3ElBE4iHg0= -github.com/google/gopacket v1.1.19-0.20200831200443-df1bbd09a561/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/grafov/m3u8 v0.0.0-20171211212457-6ab8f28ed427 h1:xh96CCAZTX8LJPFoOVRgTwZbn2DvJl8fyCyivohhSIg= github.com/grafov/m3u8 v0.0.0-20171211212457-6ab8f28ed427/go.mod h1:PdjzaU/pJUo4jTIn2rcgMFs+HqBGl/sPJLr8BI0Xq/I= -github.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 h1:UnszMmmmm5vLwWzDjTFVIkfhvWF1NdrmChl8L2NUDCw= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/josharian/native v0.0.0-20200817173448-b6b71def0850/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk= github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= @@ -105,14 +104,16 @@ github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI= github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 h1:PJPDf8OUfOK1bb/NeTKd4f1QXZItOX389VN3B6qC8ro= github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/keltia/proxy v0.9.3/go.mod h1:fLU4DmBPG0oh0md9fWggE2oG2m7Lchv3eim+GiO3pZY= -github.com/keltia/ripe-atlas v0.0.0-20211221125000-f6eb808d5dc6/go.mod h1:zYa+dM8811qRhclezc/AKX9imyQwPjjSk2cH0xTgTag= -github.com/klauspost/compress v1.16.6 h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk= -github.com/klauspost/compress v1.16.6/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/marusama/semaphore v0.0.0-20171214154724-565ffd8e868a h1:6SRny9FLB1eWasPyDUqBQnMi9NhXU01XIlB0ao89YoI= github.com/marusama/semaphore v0.0.0-20171214154724-565ffd8e868a/go.mod h1:TmeOqAKoDinfPfSohs14CO3VcEf7o+Bem6JiNe05yrQ= github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43 h1:WgyLFv10Ov49JAQI/ZLUkCZ7VJS3r74hwFIGXJsgZlY= @@ -136,30 +137,51 @@ github.com/mdlayher/socket v0.0.0-20210624160740-9dbe287ded84 h1:L1jnQ6o+K3M574e github.com/mdlayher/socket v0.0.0-20210624160740-9dbe287ded84/go.mod h1:GAFlyu4/XV68LkQKYzKhIo/WW7j3Zi0YRAz/BOoanUc= github.com/miekg/dns v1.1.44-0.20210804161652-ab67aa642300 h1:cpzamikkKRyu3TZF14CsVFf/CmhlrqZ+7P9aVZYtXz8= github.com/miekg/dns v1.1.44-0.20210804161652-ab67aa642300/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mingyech/dtls/v2 v2.0.0 h1:RKN1CjBs8wct3JnrcRmqnfH3BO0ocYLEhmg62uaHq+A= +github.com/mingyech/dtls/v2 v2.0.0/go.mod h1:Jvjs/Mzb6dWhNbhnobeR2HC8nmjF5AaLezvpVo+PQ1U= github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 h1:w1QuuAA2km2Hax+EPamrq5ZRBeaNv2vsjvgB4an0zoU= github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557/go.mod h1:QuAqW7/z+iv6aWFJdrA8kCbsF0OOJVKCICqTcYBexuY= -github.com/mroth/weightedrand v0.4.1 h1:rHcbUBopmi/3x4nnrvwGJBhX9d0vk+KgoLUZeDP6YyI= -github.com/mroth/weightedrand v0.4.1/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/mroth/weightedrand v1.0.0 h1:V8JeHChvl2MP1sAoXq4brElOcza+jxLkRuwvtQu8L3E= +github.com/mroth/weightedrand v1.0.0/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI= github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= -github.com/oschwald/maxminddb-golang v1.2.1-0.20170901134056-26fe5ace1c70 h1:2skBNJsk5emoC/p8tOS9DQL5Ia7ND1UNEdmgfvP+mPI= -github.com/oschwald/maxminddb-golang v1.2.1-0.20170901134056-26fe5ace1c70/go.mod h1:3jhIUymTJ5VREKyIhWm66LJiQt04F0UCDdodShpjWsY= +github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc= +github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs= +github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pebbe/zmq4 v1.2.10 h1:wQkqRZ3CZeABIeidr3e8uQZMMH5YAykA/WN0L5zkd1c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/sctp v1.8.8 h1:5EdnnKI4gpyR1a1TwbiS/wxEgcUWBHsc7ILAjARJB+U= +github.com/pion/sctp v1.8.8/go.mod h1:igF9nZBrjh5AtmKc7U30jXltsFHicFCXSmWA2GWRaWs= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.2-0.20230802201558-f2dffd80896b/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= +github.com/pion/transport/v2 v2.2.3 h1:XcOE3/x41HOSKbl1BfyY1TF1dERx7lVvlMCbXU7kfvA= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/refraction-networking/utls v1.0.0/go.mod h1:tz9gX959MEFfFN5whTIocCLUG57WiILqtdVxI8c6Wj0= +github.com/refraction-networking/conjure v0.7.7 h1:8vWFmSzmkNSrVr1TI4BRbgCD1tc3FTIm40PzjI2olRQ= +github.com/refraction-networking/conjure v0.7.7/go.mod h1:/UxAcot49ii6ejyvBrSo3g10yyUEavaGJT1Iy47oAfU= +github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 h1:IP2pvATIC1QBj2/+biLxTJa23PxRIiDwrPvvE4Sh6cw= +github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312/go.mod h1:iOb7GmuSvk/LZsd40L+D/cKmVGIjpFWQkbtOPggJrcA= +github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= +github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= +github.com/refraction-networking/gotapdance v1.7.7 h1:RSdDCA0v4n/iIxCnxLF6uCoJdlo000R+IKGvELfpc/A= +github.com/refraction-networking/gotapdance v1.7.7/go.mod h1:KORLtX2tKFXb2YDhynsQmGcLmmAHW20CVvdhP5kuAFA= +github.com/refraction-networking/obfs4 v0.1.2 h1:J842O4fGSkd2W8ogYj0KN6gqVVY+Cpqodw9qFGL7wVU= +github.com/refraction-networking/obfs4 v0.1.2/go.mod h1:wAl/+gWiLsrcykJA3nKJHx89f5/gXGM8UKvty7+mvbM= github.com/refraction-networking/utls v1.3.3 h1:f/TBLX7KBciRyFH3bwupp+CE4fzoYKCirhdRcC490sw= github.com/refraction-networking/utls v1.3.3/go.mod h1:DlecWW1LMlMJu+9qpzzQqdHDT/C2LAe03EdpLUz/RL8= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= @@ -167,32 +189,45 @@ github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 h1:7YvPJVmEeFHR1T github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507 h1:ML7ZNtcln5UBo5Wv7RIv9Xg3Pr5VuRCWLFXEwda54Y4= github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507/go.mod h1:DbI1gxrXI2jRGw7XGEUZQOOMd6PsnKzRrCKabvvMrwM= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8 h1:zLV6q4e8Jv9EHjNg/iHfzwDkCve6Ua5jCygptrtXHvI= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/wader/filtertransport v0.0.0-20200316221534-bdd9e61eee78 h1:9sreu9e9KOihf2Y0NbpyfWhd1XFDcL4GTkPYL4IvMrg= github.com/wader/filtertransport v0.0.0-20200316221534-bdd9e61eee78/go.mod h1:HazXTRLhXFyq80TQp7PUXi6BKE6mS+ydEdzEqNBKopQ= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib v1.5.0 h1:rzdY78Ox2T+VlXcxGxELF+6VyUXlZBhmRqZu5etLm+c= +gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib v1.5.0/go.mod h1:70bhd4JKW/+1HLfm+TMrgHJsUHG4coelMWwiVEJ2gAg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 h1:sBdrWpxhGDdTAYNqbgBLAR+ULAPPhfgncLr1X0lyWtg= golang.org/x/exp v0.0.0-20221012211006-4de253d81b95/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -211,13 +246,20 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -226,8 +268,6 @@ golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -248,36 +288,61 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/psiphon/UDPConn.go b/psiphon/UDPConn.go index 2bc3854bb..1dedd1765 100644 --- a/psiphon/UDPConn.go +++ b/psiphon/UDPConn.go @@ -21,28 +21,60 @@ package psiphon import ( "context" - "math/rand" "net" "strconv" "syscall" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors" + "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/prng" ) -// NewUDPConn resolves addr and configures a new *net.UDPConn. The UDP socket +// NewUDPConn resolves raddr and configures a new *net.UDPConn. The UDP socket // is created using options in DialConfig, including DeviceBinder. The // returned UDPAddr uses DialConfig options IPv6Synthesizer and // ResolvedIPCallback. // -// The UDP conn is not dialed; it is intended for use with WriteTo using the -// returned UDPAddr, not Write. +// The network input may be "udp", "udp4", or "udp6". When "udp4" or "udp6" is +// specified, the raddr host IP address or resolved domain addresses must +// include IP address of the corresponding type. +// +// If laddr is specified, the UDP socket is bound to that local address. Any +// laddr host must be an IP address. +// +// If useDial is specified, the UDP socket is "connected" to the raddr remote +// address; otherwise the UDP socket is "unconnected", and each write +// (WriteTo) can specify an arbitrary remote address. +// +// The caller should wrap the returned conn with common.WriteTimeoutUDPConn, +// as appropriate. // // The returned conn is not a common.Closer; the caller is expected to wrap // this conn with another higher-level conn that provides that interface. func NewUDPConn( - ctx context.Context, addr string, config *DialConfig) (net.PacketConn, *net.UDPAddr, error) { + ctx context.Context, + network string, + dial bool, + laddr string, + raddr string, + config *DialConfig) (*net.UDPConn, *net.UDPAddr, error) { + + switch network { + case "udp", "udp4", "udp6": + default: + return nil, nil, errors.TraceNew("invalid network") + } + + if laddr != "" { + localHost, _, err := net.SplitHostPort(laddr) + if err != nil { + return nil, nil, errors.Trace(err) + } + if net.ParseIP(localHost) == nil { + return nil, nil, errors.TraceNew("invalid local address") + } + } - host, strPort, err := net.SplitHostPort(addr) + host, strPort, err := net.SplitHostPort(raddr) if err != nil { return nil, nil, errors.Trace(err) } @@ -68,7 +100,37 @@ func NewUDPConn( return nil, nil, errors.TraceNew("no IP address") } - ipAddr := ipAddrs[rand.Intn(len(ipAddrs))] + var ipAddr net.IP + + if network == "udp" { + + // Pick any IP address, IPv4 or IPv6. + + ipAddr = ipAddrs[prng.Intn(len(ipAddrs))] + + network = "udp4" + if ipAddr.To4() == nil { + network = "udp6" + } + + } else { + + // "udp4" or "udp6" was specified, so pick from either IPv4 or IPv6 + // candidates. + + prng.Shuffle(len(ipAddrs), func(i, j int) { + ipAddrs[i], ipAddrs[j] = ipAddrs[j], ipAddrs[i] + }) + for _, nextIPAddr := range ipAddrs { + if (network == "udp6") == (nextIPAddr.To4() == nil) { + ipAddr = nextIPAddr + break + } + } + if ipAddr == nil { + return nil, nil, errors.TraceNew("no IP address for network") + } + } if config.IPv6Synthesizer != nil { if ipAddr.To4() != nil { @@ -82,66 +144,110 @@ func NewUDPConn( } } - listen := &net.ListenConfig{ - Control: func(_, _ string, c syscall.RawConn) error { - var controlErr error - err := c.Control(func(fd uintptr) { + controlFunc := func(_, _ string, c syscall.RawConn) error { + var controlErr error + err := c.Control(func(fd uintptr) { - socketFD := int(fd) + socketFD := int(fd) - setAdditionalSocketOptions(socketFD) + setAdditionalSocketOptions(socketFD) - if config.BPFProgramInstructions != nil { - err := setSocketBPF(config.BPFProgramInstructions, socketFD) - if err != nil { - controlErr = errors.Tracef("setSocketBPF failed: %s", err) - return - } + if config.BPFProgramInstructions != nil { + err := setSocketBPF(config.BPFProgramInstructions, socketFD) + if err != nil { + controlErr = errors.Tracef("setSocketBPF failed: %s", err) + return } + } - if config.DeviceBinder != nil { - _, err := config.DeviceBinder.BindToDevice(socketFD) - if err != nil { - controlErr = errors.Tracef("BindToDevice failed: %s", err) - return - } + if config.DeviceBinder != nil { + _, err := config.DeviceBinder.BindToDevice(socketFD) + if err != nil { + controlErr = errors.Tracef("BindToDevice failed: %s", err) + return } - }) - if controlErr != nil { - return errors.Trace(controlErr) } - return errors.Trace(err) - }, + }) + if controlErr != nil { + return errors.Trace(controlErr) + } + return errors.Trace(err) } - network := "udp4" - if ipAddr.To4() == nil { - network = "udp6" - } + var udpConn *net.UDPConn - // It's necessary to create an "unconnected" UDP socket, for use with - // WriteTo, as required by quic-go. As documented in net.ListenUDP: with - // an unspecified IP address, the resulting conn "listens on all - // available IP addresses of the local system except multicast IP - // addresses". - // - // Limitation: these UDP sockets are not necessarily closed when a device - // changes active network (e.g., WiFi to mobile). It's possible that a - // QUIC connection does not immediately close on a network change, and - // instead outbound packets are sent from a different active interface. - // As quic-go does not yet support connection migration, these packets - // will be dropped by the server. This situation is mitigated by use of - // DeviceBinder; by network change event detection, which initiates new - // tunnel connections; and by timeouts/keep-alives. - - conn, err := listen.ListenPacket(ctx, network, "") - if err != nil { - return nil, nil, errors.Trace(err) - } + if dial { + + // Create a "connected" UDP socket, which is associated with a fixed + // remote address. Writes will always send to that address. + // + // This mode is required for the Conjure DTLS transport. + // + // Unlike non-dial mode, the UDP socket doesn't listen on all local + // IPs, and LocalAddr will return an address with a specific IP address. + + var addr net.Addr + if laddr != "" { + + // ResolveUDPAddr won't resolve a domain here -- there's a check + // above that the host in laddr must be an IP address. + addr, err = net.ResolveUDPAddr(network, laddr) + if err != nil { + return nil, nil, errors.Trace(err) + } + } + + dialer := &net.Dialer{ + Control: controlFunc, + LocalAddr: addr, + } - udpConn, ok := conn.(*net.UDPConn) - if !ok { - return nil, nil, errors.Tracef("unexpected conn type: %T", conn) + conn, err := dialer.DialContext( + ctx, network, net.JoinHostPort(ipAddr.String(), strPort)) + if err != nil { + return nil, nil, errors.Trace(err) + } + + var ok bool + udpConn, ok = conn.(*net.UDPConn) + if !ok { + return nil, nil, errors.Tracef("unexpected conn type: %T", conn) + } + + } else { + + // Create an "unconnected" UDP socket, which can be used with WriteTo, + // which specifies a remote address per write. + // + // This mode is required by quic-go. + // + // As documented in net.ListenUDP: with an unspecified IP address, the + // resulting conn "listens on all available IP addresses of the local + // system except multicast IP addresses". + // + // Limitation: these UDP sockets are not necessarily closed when a device + // changes active network (e.g., WiFi to mobile). It's possible that a + // QUIC connection does not immediately close on a network change, and + // instead outbound packets are sent from a different active interface. + // As quic-go does not yet support connection migration, these packets + // will be dropped by the server. This situation is mitigated by use of + // DeviceBinder; by network change event detection, which initiates new + // tunnel connections; and by timeouts/keep-alives. + + listen := &net.ListenConfig{ + Control: controlFunc, + } + + conn, err := listen.ListenPacket(ctx, network, laddr) + if err != nil { + return nil, nil, errors.Trace(err) + } + + var ok bool + udpConn, ok = conn.(*net.UDPConn) + if !ok { + return nil, nil, errors.Tracef("unexpected conn type: %T", conn) + } } if config.ResolvedIPCallback != nil { diff --git a/psiphon/common/net.go b/psiphon/common/net.go index 05eb83a59..658254435 100644 --- a/psiphon/common/net.go +++ b/psiphon/common/net.go @@ -26,6 +26,7 @@ import ( "net/http" "strconv" "sync" + "time" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/prng" @@ -309,3 +310,79 @@ func ParseDNSQuestion(request []byte) (string, error) { } return "", nil } + +// WriteTimeoutUDPConn sets write deadlines before each UDP packet write. +// +// Generally, a UDP packet write doesn't block. However, Go's +// internal/poll.FD.WriteMsg continues to loop when syscall.SendmsgN fails +// with EAGAIN, which indicates that an OS socket buffer is currently full; +// in certain OS states this may cause WriteMsgUDP/etc. to block +// indefinitely. In this scenario, we want to instead behave as if the packet +// were dropped, so we set a write deadline which will eventually interrupt +// any EAGAIN loop. +type WriteTimeoutUDPConn struct { + *net.UDPConn +} + +func (conn *WriteTimeoutUDPConn) Write(b []byte) (int, error) { + + err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) + if err != nil { + return 0, errors.Trace(err) + } + + // Do not wrap any I/O err returned by udpConn + return conn.UDPConn.Write(b) +} + +func (conn *WriteTimeoutUDPConn) WriteMsgUDP(b, oob []byte, addr *net.UDPAddr) (int, int, error) { + + err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) + if err != nil { + return 0, 0, errors.Trace(err) + } + + // Do not wrap any I/O err returned by udpConn + return conn.UDPConn.WriteMsgUDP(b, oob, addr) +} + +func (conn *WriteTimeoutUDPConn) WriteTo(b []byte, addr net.Addr) (int, error) { + + err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) + if err != nil { + return 0, errors.Trace(err) + } + + // Do not wrap any I/O err returned by udpConn + return conn.UDPConn.WriteTo(b, addr) +} + +func (conn *WriteTimeoutUDPConn) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { + + err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) + if err != nil { + return 0, errors.Trace(err) + } + + // Do not wrap any I/O err returned by udpConn + return conn.UDPConn.WriteToUDP(b, addr) +} + +// WriteTimeoutPacketConn is the equivilent of WriteTimeoutUDPConn for +// non-*net.UDPConns. +type WriteTimeoutPacketConn struct { + net.PacketConn +} + +const UDP_PACKET_WRITE_TIMEOUT = 1 * time.Second + +func (conn *WriteTimeoutPacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { + + err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) + if err != nil { + return 0, errors.Trace(err) + } + + // Do not wrap any I/O err returned by udpConn + return conn.PacketConn.WriteTo(b, addr) +} diff --git a/psiphon/common/obfuscator/obfuscatedSshConn.go b/psiphon/common/obfuscator/obfuscatedSshConn.go index 200b8050c..7cef40e6d 100644 --- a/psiphon/common/obfuscator/obfuscatedSshConn.go +++ b/psiphon/common/obfuscator/obfuscatedSshConn.go @@ -546,33 +546,36 @@ func (conn *ObfuscatedSSHConn) transformAndWrite(buffer []byte) error { preamble, prefixLen := conn.obfuscator.SendPreamble() - // Writes the prefix first, then the rest of the preamble after a delay. - _, err := conn.Conn.Write(preamble[:prefixLen]) - if err != nil { - return errors.Trace(err) - } + if prefixLen > 0 { - // Adds random delay defined by OSSH prefix split config. - if config := conn.obfuscator.osshPrefixSplitConfig; config != nil { - rng := prng.NewPRNGWithSeed(config.Seed) - delay := rng.Period(config.MinDelay, config.MaxDelay) + // Writes the prefix first, then the rest of the preamble after a delay. + _, err := conn.Conn.Write(preamble[:prefixLen]) + if err != nil { + return errors.Trace(err) + } - timer := time.NewTimer(delay) + // Adds random delay defined by OSSH prefix split config. + if config := conn.obfuscator.osshPrefixSplitConfig; config != nil { + rng := prng.NewPRNGWithSeed(config.Seed) + delay := rng.Period(config.MinDelay, config.MaxDelay) - var err error - select { - case <-conn.runCtx.Done(): - err = conn.runCtx.Err() - case <-timer.C: - } - timer.Stop() + timer := time.NewTimer(delay) - if err != nil { - return errors.Trace(err) + var err error + select { + case <-conn.runCtx.Done(): + err = conn.runCtx.Err() + case <-timer.C: + } + timer.Stop() + + if err != nil { + return errors.Trace(err) + } } } - _, err = conn.Conn.Write(preamble[prefixLen:]) + _, err := conn.Conn.Write(preamble[prefixLen:]) if err != nil { return errors.Trace(err) } diff --git a/psiphon/common/parameters/parameters.go b/psiphon/common/parameters/parameters.go index cfd22afc7..f2fd521f2 100755 --- a/psiphon/common/parameters/parameters.go +++ b/psiphon/common/parameters/parameters.go @@ -295,7 +295,12 @@ const ( ConjureDecoyRegistrarWidth = "ConjureDecoyRegistrarWidth" ConjureDecoyRegistrarMinDelay = "ConjureDecoyRegistrarMinDelay" ConjureDecoyRegistrarMaxDelay = "ConjureDecoyRegistrarMaxDelay" - ConjureTransportObfs4Probability = "ConjureTransportObfs4Probability" + ConjureEnableIPv6Dials = "ConjureEnableIPv6Dials" + ConjureEnablePortRandomization = "ConjureEnablePortRandomization" + ConjureEnableRegistrationOverrides = "ConjureEnableRegistrationOverrides" + ConjureLimitTransportsProbability = "ConjureLimitTransportsProbability" + ConjureLimitTransports = "ConjureLimitTransports" + ConjureSTUNServerAddresses = "ConjureSTUNServerAddresses" CustomHostNameRegexes = "CustomHostNameRegexes" CustomHostNameProbability = "CustomHostNameProbability" CustomHostNameLimitProtocols = "CustomHostNameLimitProtocols" @@ -674,8 +679,12 @@ var defaultParameters = map[string]struct { ConjureDecoyRegistrarWidth: {value: 5, minimum: 0}, ConjureDecoyRegistrarMinDelay: {value: time.Duration(0), minimum: time.Duration(0)}, ConjureDecoyRegistrarMaxDelay: {value: time.Duration(0), minimum: time.Duration(0)}, - - ConjureTransportObfs4Probability: {value: 0.0, minimum: 0.0}, + ConjureEnableIPv6Dials: {value: true}, + ConjureEnablePortRandomization: {value: true}, + ConjureEnableRegistrationOverrides: {value: false}, + ConjureLimitTransportsProbability: {value: 1.0, minimum: 0.0}, + ConjureLimitTransports: {value: protocol.ConjureTransports{}}, + ConjureSTUNServerAddresses: {value: []string{}}, CustomHostNameRegexes: {value: RegexStrings{}}, CustomHostNameProbability: {value: 0.0, minimum: 0.0}, @@ -1168,6 +1177,15 @@ func (p *Parameters) Set( } return nil, errors.Trace(err) } + case protocol.ConjureTransports: + if skipOnError { + newValue = v.PruneInvalid() + } else { + err := v.Validate() + if err != nil { + return nil, errors.Trace(err) + } + } } // Enforce any minimums. Assumes defaultParameters[name] @@ -1686,3 +1704,32 @@ func (p ParametersAccessor) ProtocolTransformScopedSpecNames(name string) transf p.snapshot.getValue(name, &value) return value } + +// ConjureTransports returns a protocol.ConjureTransports parameter value. If +// there is a corresponding Probability value, a weighted coin flip will be +// performed and, depending on the result, the value or the parameter default +// will be returned. +func (p ParametersAccessor) ConjureTransports(name string) protocol.ConjureTransports { + + probabilityName := name + "Probability" + _, ok := p.snapshot.parameters[probabilityName] + if ok { + probabilityValue := float64(1.0) + p.snapshot.getValue(probabilityName, &probabilityValue) + if !prng.FlipWeightedCoin(probabilityValue) { + defaultParameter, ok := defaultParameters[name] + if ok { + defaultValue, ok := defaultParameter.value.(protocol.ConjureTransports) + if ok { + value := make(protocol.ConjureTransports, len(defaultValue)) + copy(value, defaultValue) + return value + } + } + } + } + + value := protocol.ConjureTransports{} + p.snapshot.getValue(name, &value) + return value +} diff --git a/psiphon/common/prng/prng.go b/psiphon/common/prng/prng.go index 4505874b3..a68e3057a 100644 --- a/psiphon/common/prng/prng.go +++ b/psiphon/common/prng/prng.go @@ -269,6 +269,11 @@ func (p *PRNG) Perm(n int) []int { return p.rand.Perm(n) } +// Shuffle is equivilent to math/rand.Shuffle. +func (p *PRNG) Shuffle(n int, swap func(i, j int)) { + p.rand.Shuffle(n, swap) +} + // Range selects a random integer in [min, max]. // If min < 0, min is set to 0. If max < min, min is returned. func (p *PRNG) Range(min, max int) int { @@ -381,6 +386,10 @@ func Perm(n int) []int { return p.Perm(n) } +func Shuffle(n int, swap func(i, j int)) { + p.Shuffle(n, swap) +} + func Range(min, max int) int { return p.Range(min, max) } diff --git a/psiphon/common/protocol/protocol.go b/psiphon/common/protocol/protocol.go index 341406a09..9405e455a 100644 --- a/psiphon/common/protocol/protocol.go +++ b/psiphon/common/protocol/protocol.go @@ -85,9 +85,6 @@ const ( CHANNEL_REJECT_REASON_SPLIT_TUNNEL = 0xFE000000 PSIPHON_API_HANDSHAKE_AUTHORIZATIONS = "authorizations" - - CONJURE_TRANSPORT_MIN_OSSH = "Min-OSSH" - CONJURE_TRANSPORT_OBFS4_OSSH = "Obfs4-OSSH" ) var SupportedServerEntrySources = []string{ @@ -108,7 +105,8 @@ type TunnelProtocols []string func (t TunnelProtocols) Validate() error { for _, p := range t { - if !common.Contains(SupportedTunnelProtocols, p) { + if !common.Contains(SupportedTunnelProtocols, p) || + common.Contains(DisabledTunnelProtocols, p) { return errors.Tracef("invalid tunnel protocol: %s", p) } } @@ -118,7 +116,8 @@ func (t TunnelProtocols) Validate() error { func (t TunnelProtocols) PruneInvalid() TunnelProtocols { u := make(TunnelProtocols, 0) for _, p := range t { - if common.Contains(SupportedTunnelProtocols, p) { + if common.Contains(SupportedTunnelProtocols, p) && + !common.Contains(DisabledTunnelProtocols, p) { u = append(u, p) } } @@ -166,6 +165,22 @@ var DefaultDisabledTunnelProtocols = TunnelProtocols{ TUNNEL_PROTOCOL_CONJURE_OBFUSCATED_SSH, } +// DisabledTunnelProtocols are protocols which are still integrated, but which +// cannot be enabled in tactics and cannot be selected by clients. +var DisabledTunnelProtocols = TunnelProtocols{ + + // TUNNEL_PROTOCOL_TAPDANCE_OBFUSCATED_SSH should not be reenabled without + // retesting the integration. github.com/refraction-networking/gotapdance + // and github.com/refraction-networking/conjure have undergone major + // changes since TapDance was last active and tested. + // + // Furthermore, existing deployed clients will use the same ClientConf for + // both TapDance and Conjure, which creates a risk that enabling TapDance + // via tactics may cause existing clients to use Conjure ClientConf + // decoys for TapDance, which may violate load assumptions. + TUNNEL_PROTOCOL_TAPDANCE_OBFUSCATED_SSH, +} + func TunnelProtocolUsesTCP(protocol string) bool { return protocol != TUNNEL_PROTOCOL_QUIC_OBFUSCATED_SSH && protocol != TUNNEL_PROTOCOL_FRONTED_MEEK_QUIC_OBFUSCATED_SSH @@ -524,6 +539,43 @@ func (labeledVersions LabeledQUICVersions) PruneInvalid() LabeledQUICVersions { return l } +const ( + CONJURE_TRANSPORT_MIN_OSSH = "Min-OSSH" + CONJURE_TRANSPORT_PREFIX_OSSH = "Prefix-OSSH" + CONJURE_TRANSPORT_DTLS_OSSH = "DTLS-OSSH" +) + +var SupportedConjureTransports = ConjureTransports{ + CONJURE_TRANSPORT_MIN_OSSH, + CONJURE_TRANSPORT_PREFIX_OSSH, + CONJURE_TRANSPORT_DTLS_OSSH, +} + +func ConjureTransportUsesSTUN(transport string) bool { + return transport == CONJURE_TRANSPORT_DTLS_OSSH +} + +type ConjureTransports []string + +func (transports ConjureTransports) Validate() error { + for _, t := range transports { + if !common.Contains(SupportedConjureTransports, t) { + return errors.Tracef("invalid Conjure transport: %s", t) + } + } + return nil +} + +func (transports ConjureTransports) PruneInvalid() ConjureTransports { + u := make(ConjureTransports, 0) + for _, t := range transports { + if common.Contains(SupportedConjureTransports, t) { + u = append(u, t) + } + } + return u +} + type HandshakeResponse struct { SSHSessionID string `json:"ssh_session_id"` Homepages []string `json:"homepages"` diff --git a/psiphon/common/protocol/serverEntry.go b/psiphon/common/protocol/serverEntry.go index 44961c0ed..f7edf18cc 100644 --- a/psiphon/common/protocol/serverEntry.go +++ b/psiphon/common/protocol/serverEntry.go @@ -569,6 +569,10 @@ func (serverEntry *ServerEntry) GetSupportedProtocols( continue } + if common.Contains(DisabledTunnelProtocols, tunnelProtocol) { + continue + } + if len(limitTunnelProtocols) > 0 { if !common.Contains(limitTunnelProtocols, tunnelProtocol) { continue diff --git a/psiphon/common/quic/quic.go b/psiphon/common/quic/quic.go index 78534af17..0a07c439f 100644 --- a/psiphon/common/quic/quic.go +++ b/psiphon/common/quic/quic.go @@ -69,7 +69,6 @@ const ( SERVER_HANDSHAKE_TIMEOUT = 30 * time.Second SERVER_IDLE_TIMEOUT = 5 * time.Minute CLIENT_IDLE_TIMEOUT = 30 * time.Second - UDP_PACKET_WRITE_TIMEOUT = 1 * time.Second ) // Enabled indicates if QUIC functionality is enabled. @@ -401,8 +400,9 @@ func Dial( // see ObfuscatedPacketConn.writePacket for the server-side // downstream limitation. - // Ensure blocked packet writes eventually timeout. - packetConn = &writeTimeoutPacketConn{ + // Ensure blocked packet writes eventually timeout. Note that quic-go + // manages read deadlines; we set only the write deadline here. + packetConn = &common.WriteTimeoutPacketConn{ PacketConn: packetConn, } @@ -415,7 +415,7 @@ func Dial( } else { // Ensure blocked packet writes eventually timeout. - packetConn = &writeTimeoutUDPConn{ + packetConn = &common.WriteTimeoutUDPConn{ UDPConn: udpConn, } } @@ -527,83 +527,6 @@ func Dial( return conn, nil } -// writeTimeoutUDPConn sets write deadlines before each UDP packet write. -// -// Generally, a UDP packet write doesn't block. However, Go's -// internal/poll.FD.WriteMsg continues to loop when syscall.SendmsgN fails -// with EAGAIN, which indicates that an OS socket buffer is currently full; -// in certain OS states this may cause WriteMsgUDP/etc. to block -// indefinitely. In this scenario, we want to instead behave as if the packet -// were dropped, so we set a write deadline which will eventually interrupt -// any EAGAIN loop. -// -// Note that quic-go manages read deadlines; we set only the write deadline -// here. -type writeTimeoutUDPConn struct { - *net.UDPConn -} - -func (conn *writeTimeoutUDPConn) Write(b []byte) (int, error) { - - err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) - if err != nil { - return 0, errors.Trace(err) - } - - // Do not wrap any I/O err returned by udpConn - return conn.UDPConn.Write(b) -} - -func (conn *writeTimeoutUDPConn) WriteMsgUDP(b, oob []byte, addr *net.UDPAddr) (int, int, error) { - - err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) - if err != nil { - return 0, 0, errors.Trace(err) - } - - // Do not wrap any I/O err returned by udpConn - return conn.UDPConn.WriteMsgUDP(b, oob, addr) -} - -func (conn *writeTimeoutUDPConn) WriteTo(b []byte, addr net.Addr) (int, error) { - - err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) - if err != nil { - return 0, errors.Trace(err) - } - - // Do not wrap any I/O err returned by udpConn - return conn.UDPConn.WriteTo(b, addr) -} - -func (conn *writeTimeoutUDPConn) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { - - err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) - if err != nil { - return 0, errors.Trace(err) - } - - // Do not wrap any I/O err returned by udpConn - return conn.UDPConn.WriteToUDP(b, addr) -} - -// writeTimeoutPacketConn is the equivilent of writeTimeoutUDPConn for -// non-*net.UDPConns. -type writeTimeoutPacketConn struct { - net.PacketConn -} - -func (conn *writeTimeoutPacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { - - err := conn.SetWriteDeadline(time.Now().Add(UDP_PACKET_WRITE_TIMEOUT)) - if err != nil { - return 0, errors.Trace(err) - } - - // Do not wrap any I/O err returned by udpConn - return conn.PacketConn.WriteTo(b, addr) -} - // Conn is a net.Conn and psiphon/common.Closer. type Conn struct { packetConn net.PacketConn @@ -884,8 +807,9 @@ func (t *QUICTransporter) dialQUIC() (retConnection quicConnection, retErr error return nil, errors.Tracef("unexpected packetConn type: %T", packetConn) } - // Ensure blocked packet writes eventually timeout. - packetConn = &writeTimeoutUDPConn{ + // Ensure blocked packet writes eventually timeout. Note that quic-go + // manages read deadlines; we set only the write deadline here. + packetConn = &common.WriteTimeoutUDPConn{ UDPConn: udpConn, } diff --git a/psiphon/common/refraction/config.go b/psiphon/common/refraction/config.go index 69a8ce772..68ff9a660 100644 --- a/psiphon/common/refraction/config.go +++ b/psiphon/common/refraction/config.go @@ -67,10 +67,10 @@ type ConjureConfig struct { // should be synchronized with the Conjure station configuration. APIRegistrarDelay time.Duration - // DecoyRegistrarDialer specifies a custom dialer to be used for decoy - // registration. Only one of API registration or decoy registration can be - // enabled for a single dial. - DecoyRegistrarDialer common.NetDialer + // DoDecoyRegistration indicates to use decoy registration instead of API + // registration. Only one of API registration or decoy registration can + // be enabled for a single dial. + DoDecoyRegistration bool // DecoyRegistrarWidth specifies how many decoys to use per registration. DecoyRegistrarWidth int @@ -83,10 +83,28 @@ type ConjureConfig struct { // ignored. DecoyRegistrarDelay time.Duration - // Transport may be protocol.CONJURE_TRANSPORT_MIN_OSSH or - // protocol.CONJURE_TRANSPORT_OBFS4_OSSH. + // EnableIPv6Dials specifies whether to attempt to dial an IPv6 phantom in + // addition to and concurrent with an IPv4 phantom dial. + EnableIPv6Dials bool + + // EnablePortRandomization specifies whether to enable destination port + // randomization. + EnablePortRandomization bool + + // EnableRegistrationOverrides specifies whether to allow the Conjure + // system to provide parameter overrides, such as alternative prefixes, + // in the registration response. + EnableRegistrationOverrides bool + + // Transport may be protocol.CONJURE_TRANSPORT_MIN_OSSH, + // protocol.CONJURE_TRANSPORT_PREFIX_OSSH, or + // protcol.CONJURE_TRANSPORT_DTLS_OSSH. Transport string + // STUNServerAddress specifies the STUN server to use with + // protcol.CONJURE_TRANSPORT_DTLS_OSSH. + STUNServerAddress string + // DiagnosticID identifies this dial in diagnostics. DiagnosticID string diff --git a/psiphon/common/refraction/embedded_config.go b/psiphon/common/refraction/embedded_config.go index 0fafcd2d1..521f5ae69 100644 --- a/psiphon/common/refraction/embedded_config.go +++ b/psiphon/common/refraction/embedded_config.go @@ -1,3 +1,4 @@ +//go:build PSIPHON_ENABLE_REFRACTION_NETWORKING // +build PSIPHON_ENABLE_REFRACTION_NETWORKING /* @@ -35,7 +36,7 @@ import ( // See: https://github.com/go-bindata/go-bindata#lower-memory-footprint. // // The embedded ClientConf value is from: -// https://github.com/refraction-networking/gotapdance/blob/88b8e2e421cc808af2e65777c78bfc8cb4906a58/assets/ClientConf +// https://github.com/refraction-networking/gotapdance/blob/5ff25418c6f2e86c487630796d98453fe2b2634c/assets/ClientConf // // It is processed with "hexdump -ve '"\\\x" 1/1 "%.2x"' ClientConf > embeddedClientConf". func getEmbeddedClientConf() []byte { @@ -56,4 +57,4 @@ func getEmbeddedClientConf() []byte { return b } -var embeddedClientConf = "\x0a\xbb\xea\x0d\x0a\x4c\x0a\x17\x61\x64\x64\x6d\x61\x73\x62\x6e\x70\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x61\x64\x64\x6d\x61\x73\x62\x70\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcb\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6e\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe6\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x45\x78\x70\x72\x65\x73\x73\x77\x61\x79\x2d\x45\x2d\x31\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x3e\x0a\x09\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x45\x78\x70\x72\x65\x73\x73\x77\x61\x79\x2d\x45\x2d\x33\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa6\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xb2\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x0a\x52\x0a\x1d\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x64\x6c\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x15\x06\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x15\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf4\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x6c\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x6d\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x61\x6d\x61\x64\x6f\x72\x2e\x6e\x65\x74\x15\x1f\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x6f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xc0\x81\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6f\x70\x65\x6e\x6a\x65\x72\x69\x63\x68\x6f\x2e\x63\x6f\x6d\x15\xdd\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x69\x63\x68\x6d\x65\x6d\x6f\x72\x69\x65\x73\x2e\x6f\x72\x67\x15\xdc\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x09\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x6f\x75\x6e\x74\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x06\x7d\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x59\x0a\x24\x61\x63\x74\x2d\x73\x68\x72\x69\x6e\x65\x2d\x73\x74\x61\x67\x65\x2e\x6d\x69\x63\x68\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6f\x6e\x65\x73\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x71\x61\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\xda\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xdb\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x61\x75\x64\x69\x6f\x76\x69\x73\x75\x61\x6c\x66\x72\x6f\x6d\x73\x70\x61\x69\x6e\x2e\x63\x6f\x6d\x15\xd6\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x7a\x70\x61\x73\x73\x76\x61\x2e\x63\x6f\x6d\x15\xd8\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x6f\x6d\x73\x64\x65\x76\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\xd9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x62\x67\x2e\x67\x69\x62\x64\x69\x73\x74\x2e\x6f\x72\x67\x15\x09\xe1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x61\x64\x6d\x69\x6e\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xd5\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x10\x6d\x64\x63\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x6f\x72\x67\x15\xfd\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4a\x0a\x14\x64\x65\x76\x2e\x6d\x64\x63\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x6f\x72\x67\x15\xfe\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4d\x0a\x18\x62\x65\x7a\x61\x6b\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x84\x08\x0a\x4f\x0a\x1a\x6d\x69\x63\x68\x72\x2d\x64\x65\x6d\x6f\x30\x31\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x84\x08\x0a\x50\x0a\x1b\x70\x73\x2e\x63\x6f\x76\x65\x6e\x61\x6e\x74\x68\x6f\x75\x73\x65\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\x67\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x56\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x6d\x73\x65\x74\x75\x70\x2d\x69\x6c\x61\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd1\xd8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x72\x65\x70\x6f\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdd\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x71\x75\x6f\x64\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb1\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x61\x63\x63\x6f\x75\x6e\x74\x73\x2e\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x3f\x25\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x67\x72\x69\x73\x2d\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x62\x61\x73\x65\x2e\x6f\x72\x67\x15\xd8\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x66\x6c\x65\x78\x70\x6c\x6d\x2e\x74\x72\x75\x2e\x63\x6f\x6d\x15\x64\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xd4\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x66\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x73\x6f\x70\x68\x65\x6f\x6e\x65\x75\x2e\x6e\x65\x74\x15\x68\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x68\x6f\x73\x74\x77\x69\x72\x65\x2e\x63\x6f\x6d\x15\x14\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x62\x67\x2e\x67\x61\x72\x64\x65\x6e\x63\x69\x74\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x08\xdf\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x61\x66\x65\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x68\x72\x2e\x63\x61\x15\xed\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc0\x87\x01\x0a\x53\x0a\x1e\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x15\x3c\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x15\x3d\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x06\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc8\xf3\x03\x0a\x5b\x0a\x26\x72\x61\x63\x6b\x69\x72\x74\x65\x73\x74\x73\x65\x72\x76\x65\x72\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc8\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xcb\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x70\x73\x2e\x6c\x69\x6e\x63\x6f\x6c\x6e\x6b\x31\x32\x2e\x6f\x72\x67\x15\x6e\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x4c\x0a\x17\x70\x73\x2e\x6d\x69\x6c\x61\x6e\x61\x72\x65\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x71\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x73\x2e\x6d\x63\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x70\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x40\x0a\x0b\x70\x73\x2e\x77\x6c\x70\x73\x2e\x6e\x65\x74\x15\x73\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x40\x0a\x0b\x70\x73\x2e\x77\x69\x68\x69\x2e\x6f\x72\x67\x15\x72\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x63\x61\x65\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\x8e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x03\x0a\x4f\x0a\x1a\x62\x61\x63\x6b\x75\x70\x2e\x63\x72\x65\x61\x74\x65\x34\x73\x74\x65\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1c\x77\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\xfa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xb8\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x73\x6c\x6f\x77\x2e\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x26\xfa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xb8\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x6e\x6c\x69\x6e\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x70\x73\x2e\x6a\x65\x6e\x69\x73\x6f\x6e\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\xe4\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\xe6\xf3\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\xe2\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xff\xff\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\x0a\x38\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xfc\xff\x0f\x0a\x48\x0a\x13\x61\x74\x6c\x61\x73\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x07\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\xa4\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x75\x6e\x69\x76\x65\x61\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\x81\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x02\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x61\x6c\x6d\x6f\x6e\x74\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x65\xfd\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x64\x6f\x65\x74\x65\x72\x74\x6f\x65\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x6c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x70\x69\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x64\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x67\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x6d\x73\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x66\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x63\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x73\x74\x61\x67\x69\x6e\x67\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x04\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x65\x62\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x63\x68\x65\x63\x6b\x6f\x75\x74\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\xd5\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x65\x62\x64\x69\x73\x6b\x2e\x70\x72\x69\x6e\x74\x74\x6f\x70\x72\x65\x73\x73\x2e\x63\x6f\x6d\x15\xd4\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x45\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6d\x6f\x68\x65\x67\x61\x6e\x67\x61\x6d\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x02\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x43\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x63\x69\x74\x79\x77\x6f\x72\x6b\x73\x2e\x73\x61\x72\x61\x74\x6f\x67\x61\x73\x70\x72\x69\x6e\x67\x73\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x0c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x6f\x75\x69\x73\x69\x61\x6e\x61\x73\x74\x6f\x6e\x65\x2e\x62\x69\x7a\x15\x0a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x09\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x6f\x74\x63\x68\x65\x69\x67\x68\x74\x62\x6c\x6f\x67\x2e\x63\x6f\x6d\x15\x08\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x65\x78\x70\x65\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\xbb\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x74\x6f\x70\x64\x65\x73\x6b\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xe6\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x61\x62\x63\x6f\x69\x6e\x64\x75\x73\x74\x72\x69\x65\x73\x2e\x63\x6f\x6d\x15\xe7\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xef\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd1\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x74\x6f\x74\x73\x63\x6f\x72\x65\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x59\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x63\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x73\x74\x61\x74\x75\x73\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x93\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6e\x65\x77\x62\x72\x61\x6e\x63\x68\x65\x73\x2e\x6f\x72\x67\x15\x5f\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x61\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x6d\x61\x69\x6c\x2e\x67\x62\x63\x61\x6d\x70\x62\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x0c\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x75\x70\x64\x61\x74\x65\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x10\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x11\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xe3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xcd\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xfb\x03\x0a\x45\x0a\x10\x77\x65\x62\x64\x61\x76\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\xee\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x89\x40\x0a\x4d\x0a\x18\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x12\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x73\x62\x72\x6a\x2e\x77\x6f\x72\x6b\x15\x57\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x73\x74\x75\x64\x65\x6e\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x56\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6a\x65\x73\x73\x65\x6c\x6f\x77\x65\x64\x65\x73\x69\x67\x6e\x73\x2e\x63\x6f\x6d\x15\x55\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x9b\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x73\x74\x61\x67\x69\x6e\x67\x2d\x63\x6f\x6d\x6d\x73\x70\x6f\x72\x74\x61\x6c\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x50\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6e\x61\x72\x73\x64\x69\x67\x69\x74\x61\x6c\x73\x74\x75\x64\x69\x6f\x2e\x63\x6f\x6d\x15\xcd\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x14\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xcc\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xce\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x64\x63\x73\x65\x70\x6d\x2d\x63\x73\x61\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x23\x00\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3c\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xcb\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x61\x69\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc9\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3d\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x70\x73\x2e\x70\x61\x6e\x74\x68\x65\x72\x6e\x65\x74\x2e\x6e\x65\x74\x15\x2e\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x64\x61\x6e\x73\x76\x69\x6c\x6c\x65\x2e\x6f\x72\x67\x15\x2f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x08\x0a\x4e\x0a\x19\x70\x73\x2e\x77\x65\x62\x62\x65\x72\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x2c\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x72\x65\x64\x6d\x69\x6e\x65\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x48\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x72\x65\x6d\x63\x73\x61\x76\x65\x2e\x6f\x72\x67\x15\x2b\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x70\x73\x2e\x77\x65\x73\x74\x6d\x69\x63\x68\x69\x67\x61\x6e\x61\x76\x69\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x1f\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x70\x73\x2e\x67\x6f\x77\x63\x73\x2e\x6e\x65\x74\x15\x30\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x73\x2e\x77\x61\x76\x65\x72\x6c\x79\x6b\x31\x32\x2e\x6e\x65\x74\x15\x88\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x73\x6f\x66\x74\x70\x68\x6f\x6e\x65\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\x2d\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfa\x03\x0a\x49\x0a\x13\x64\x61\x74\x61\x64\x69\x72\x65\x63\x74\x2e\x6d\x70\x6f\x67\x2e\x6f\x72\x67\x15\x22\xfc\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x80\x80\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x69\x65\x77\x73\x2e\x72\x61\x70\x69\x64\x66\x69\x72\x65\x64\x61\x74\x61\x2e\x63\x6f\x6d\x15\xa4\x27\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x84\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x2c\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x2d\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x76\x32\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x30\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x6e\x64\x72\x65\x77\x64\x65\x6f\x72\x69\x6f\x2e\x63\x6f\x6d\x15\xfd\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x6d\x73\x2d\x63\x72\x65\x64\x65\x6e\x74\x69\x61\x6c\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x5c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x63\x68\x65\x6d\x73\x65\x61\x72\x63\x68\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x5a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x67\x70\x73\x6d\x64\x6d\x2e\x67\x72\x61\x6e\x74\x70\x73\x2e\x6e\x65\x74\x15\x25\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x48\x0a\x13\x73\x31\x37\x39\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x07\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x73\x2d\x61\x69\x63\x63\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x05\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x76\x67\x7a\x76\x6f\x6f\x72\x64\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x04\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x09\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x38\x30\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x08\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x62\x66\x78\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3c\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfc\x01\x0a\x4f\x0a\x1a\x6b\x69\x64\x64\x6c\x61\x62\x73\x68\x61\x72\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x65\x62\x2e\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x44\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\xc3\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x6f\x6e\x64\x65\x6d\x61\x6e\x64\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x6d\x67\x69\x73\x2d\x73\x74\x61\x67\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x66\x75\x6c\x6c\x66\x72\x61\x6d\x65\x2e\x63\x6f\x6d\x15\x18\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xe0\x87\x01\x0a\x55\x0a\x20\x77\x77\x77\x2e\x63\x61\x74\x70\x72\x6f\x64\x75\x63\x74\x69\x76\x69\x74\x79\x6f\x70\x74\x69\x6d\x69\x7a\x65\x72\x2e\x63\x6f\x6d\x15\x1d\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xc0\x87\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x1c\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xe0\x87\x01\x0a\x5d\x0a\x28\x62\x65\x61\x74\x73\x6f\x6e\x63\x61\x6e\x63\x65\x72\x63\x68\x61\x72\x69\x74\x79\x2e\x65\x71\x75\x61\x74\x6f\x72\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xbf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xbe\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x64\x65\x73\x74\x69\x6e\x79\x2e\x68\x61\x6d\x69\x6c\x74\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x13\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xe7\xf3\x03\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x74\x6f\x6c\x6c\x72\x6f\x61\x64\x73\x69\x6e\x76\x69\x72\x67\x69\x6e\x69\x61\x2e\x63\x6f\x6d\x15\xc7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x62\x6c\x75\x65\x2e\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x79\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfb\x03\x0a\x4a\x0a\x15\x61\x67\x65\x6e\x74\x2e\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x78\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x74\x75\x6c\x69\x70\x2e\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x7a\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x6c\x6f\x67\x69\x6e\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x77\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x64\x2d\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xfc\xfd\x07\x0a\x58\x0a\x23\x61\x61\x63\x6f\x6c\x6c\x61\x62\x61\x72\x63\x68\x69\x76\x65\x2e\x68\x75\x6d\x69\x6e\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x64\x75\x6e\x64\x65\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x1f\xa8\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xf0\xf2\x01\x0a\x50\x0a\x1b\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x63\x61\x72\x69\x6e\x67\x34\x77\x61\x72\x64\x2e\x6f\x72\x67\x15\x29\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x73\x73\x74\x65\x73\x74\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\x9a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6a\x69\x72\x61\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x96\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6b\x6c\x61\x76\x6f\x6e\x73\x2e\x69\x6e\x74\x65\x6c\x6c\x61\x76\x2e\x63\x6f\x6d\x15\x08\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x75\x6e\x69\x76\x65\x70\x72\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x98\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x5b\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x73\x76\x6e\x2e\x69\x6e\x74\x65\x6c\x6c\x61\x76\x2e\x63\x6f\x6d\x15\x07\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\x9f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x74\x69\x73\x2e\x73\x70\x73\x70\x2e\x65\x64\x75\x2e\x73\x61\x15\x9e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x69\x6b\x69\x68\x6f\x73\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6c\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x49\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x23\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x4a\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x4f\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x6d\x69\x74\x6f\x6f\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd5\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x74\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x67\x6c\x61\x6e\x63\x65\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\x75\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x69\x6e\x73\x74\x65\x72\x6c\x61\x77\x2e\x63\x6f\x2e\x75\x6b\x15\x72\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x6d\x73\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x73\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x73\x65\x63\x75\x72\x65\x2e\x62\x6c\x6f\x6f\x64\x2d\x70\x72\x65\x73\x73\x75\x72\x65\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x71\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x73\x74\x61\x67\x69\x6e\x67\x2d\x64\x72\x61\x78\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x6e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x79\x2e\x63\x79\x62\x65\x72\x74\x72\x61\x69\x6c\x73\x2e\x63\x6f\x6d\x15\xda\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4e\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x6d\x69\x74\x68\x62\x72\x6f\x74\x68\x65\x72\x73\x66\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x1b\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x73\x74\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x19\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x69\x73\x6f\x76\x2e\x67\x61\x15\x16\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x79\x6e\x74\x68\x65\x73\x79\x73\x2e\x69\x6e\x66\x6f\x15\x15\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x69\x6d\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdf\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x62\x6e\x61\x64\x6d\x30\x31\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x49\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x46\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x47\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x5c\x0a\x27\x65\x6e\x63\x6f\x6d\x70\x61\x73\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x64\x65\x76\x61\x70\x70\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x49\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xe2\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x33\x64\x6c\x61\x6e\x64\x73\x63\x61\x70\x65\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xe5\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xe4\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x6e\x3b\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe8\x81\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x66\x6c\x61\x74\x61\x62\x6c\x65\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6d\x15\x0c\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x61\x70\x69\x67\x77\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\xc7\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x65\x65\x63\x73\x33\x31\x32\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfb\x03\x0a\x50\x0a\x1b\x6f\x70\x61\x6c\x2e\x77\x75\x6f\x6d\x2e\x75\x6e\x69\x76\x72\x65\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x30\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc8\x8c\x01\x0a\x3c\x0a\x07\x73\x63\x34\x2e\x65\x64\x75\x15\x72\x83\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x0f\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\x08\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x76\x70\x6e\x2d\x6d\x67\x6d\x74\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x60\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xb8\x01\x0a\x49\x0a\x14\x6d\x73\x72\x74\x65\x6b\x62\x6f\x78\x2e\x61\x78\x69\x73\x63\x61\x70\x2e\x69\x6e\x15\x46\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x61\x78\x69\x73\x63\x61\x70\x69\x74\x61\x6c\x2e\x63\x6f\x2e\x69\x6e\x15\x4a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6d\x2d\x61\x73\x70\x69\x72\x65\x2e\x61\x78\x69\x73\x63\x61\x70\x2e\x69\x6e\x15\x4b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x70\x73\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x48\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x6c\x65\x73\x6c\x69\x65\x6b\x31\x32\x2e\x6e\x65\x74\x15\x4a\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x64\x66\x72\x65\x79\x2d\x6c\x65\x65\x2e\x6f\x72\x67\x15\x28\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x67\x6f\x64\x66\x72\x65\x79\x2d\x6c\x65\x65\x2e\x6f\x72\x67\x15\x29\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x10\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x74\x72\x61\x69\x74\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x04\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x61\x72\x6f\x6e\x62\x65\x6c\x74\x73\x2e\x63\x6f\x6d\x15\x05\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x76\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6c\x69\x62\x2d\x70\x72\x6f\x78\x79\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x86\x7c\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x77\x69\x6b\x69\x32\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x61\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x61\x70\x70\x6c\x79\x2e\x6d\x69\x63\x68\x69\x67\x61\x6e\x73\x74\x61\x66\x66\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xfb\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xc0\x87\x01\x0a\x46\x0a\x11\x63\x6c\x6f\x75\x64\x2e\x64\x65\x73\x61\x69\x6c\x6c\x65\x2e\x66\x72\x15\x38\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x65\x62\x67\x6f\x61\x74\x2e\x6e\x65\x69\x6c\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x34\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x32\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x58\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x51\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x67\x77\x2d\x6d\x73\x75\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x1e\xc3\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf0\x02\x0a\x4d\x0a\x18\x70\x61\x73\x73\x77\x6f\x72\x64\x2e\x66\x6c\x69\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x73\x65\x72\x76\x69\x63\x69\x6e\x67\x73\x75\x70\x72\x65\x6d\x65\x2e\x63\x6f\x6d\x15\x52\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2d\x74\x65\x73\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x51\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc0\x8a\x01\x0a\x4b\x0a\x16\x76\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x16\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xe3\x01\x0a\x54\x0a\x1f\x70\x61\x79\x6d\x65\x6e\x74\x73\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x57\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x61\x79\x61\x66\x69\x6e\x61\x6e\x63\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x56\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x63\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9f\x08\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x68\x61\x72\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x61\x75\x74\x68\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x3b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x73\x75\x72\x76\x65\x79\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x69\x6e\x74\x65\x72\x6e\x68\x65\x61\x6c\x74\x68\x73\x74\x75\x64\x79\x2d\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x69\x6e\x74\x65\x72\x6e\x68\x65\x61\x6c\x74\x68\x73\x74\x75\x64\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5c\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x6f\x6e\x66\x6c\x75\x65\x6e\x63\x65\x2e\x61\x63\x74\x69\x76\x65\x73\x74\x65\x70\x2e\x6f\x72\x67\x15\x43\xfd\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x70\x70\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x34\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x70\x70\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb4\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\xe8\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe0\x87\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x76\x70\x6e\x2d\x30\x31\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x84\x27\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x41\x0a\x0c\x74\x75\x62\x65\x73\x6f\x63\x6b\x2e\x6e\x65\x74\x15\x6a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x6f\x72\x74\x61\x6c\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x0e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x69\x6c\x64\x66\x69\x72\x65\x2d\x65\x6e\x65\x72\x67\x79\x2e\x63\x6f\x6d\x15\x11\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x61\x70\x70\x73\x74\x6f\x72\x65\x2e\x63\x6f\x6d\x15\x23\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xe0\x87\x01\x0a\x49\x0a\x14\x72\x65\x70\x6f\x2e\x62\x72\x69\x67\x68\x74\x6f\x6e\x6b\x31\x32\x2e\x63\x6f\x6d\x15\x1a\xa6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x65\x79\x6f\x6e\x64\x65\x6e\x65\x72\x67\x79\x2e\x63\x61\x15\x27\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xc0\x87\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x67\x72\x6f\x75\x70\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x13\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xcf\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x47\x48\x41\x50\x53\x41\x4c\x49\x4f\x57\x45\x42\x2e\x47\x48\x41\x50\x53\x2e\x4f\x52\x47\x15\xb0\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xe6\xf3\x03\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x63\x08\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x70\x72\x6f\x64\x73\x74\x61\x67\x69\x6e\x67\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x04\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\x93\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6c\x73\x69\x2d\x73\x70\x61\x72\x63\x2d\x30\x31\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xeb\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x6f\x6d\x65\x73\x74\x69\x63\x75\x6e\x69\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x8c\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x76\x74\x65\x73\x74\x76\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x17\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x75\x74\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x6c\x69\x62\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1b\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6a\x70\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6f\x72\x67\x15\x31\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe7\xf3\x03\x0a\x51\x0a\x1c\x77\x68\x65\x30\x31\x2d\x66\x61\x69\x6c\x6f\x76\x65\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf1\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x61\x67\x6c\x61\x6e\x65\x2d\x64\x65\x76\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6a\x70\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6f\x72\x67\x15\x29\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x51\x0a\x1c\x77\x68\x65\x30\x32\x2d\x66\x61\x69\x6c\x6f\x76\x65\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x65\x78\x6e\x65\x78\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8d\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x03\x0a\x4c\x0a\x17\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x93\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x64\x65\x73\x74\x69\x6e\x79\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x4c\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x08\x0a\x45\x0a\x10\x66\x65\x69\x67\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf1\x61\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\xa1\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\x8e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x6f\x6f\x72\x65\x68\x65\x61\x64\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x8f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x59\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\x92\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x65\x63\x65\x6c\x6c\x75\x6c\x61\x72\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x91\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x6f\x6f\x72\x65\x68\x65\x61\x64\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x94\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x07\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf4\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x6e\x64\x65\x76\x63\x6f\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x09\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6b\x61\x74\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6e\x65\x74\x15\x94\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x65\x63\x6f\x6d\x6d\x65\x72\x63\x65\x2e\x70\x72\x69\x6e\x63\x65\x2d\x63\x6f\x72\x70\x2e\x63\x6f\x6d\x15\x02\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x62\x65\x73\x74\x63\x6f\x2e\x63\x6f\x2e\x6a\x70\x15\x03\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x79\x66\x69\x6e\x61\x6e\x63\x69\x61\x6c\x61\x69\x64\x2e\x63\x61\x73\x65\x2e\x65\x64\x75\x15\x04\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe2\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x72\x65\x66\x65\x72\x72\x61\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x79\x76\x72\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x80\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x68\x65\x61\x6c\x74\x68\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x7b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x64\x65\x66\x6f\x78\x2e\x63\x6f\x6d\x15\x79\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x6e\x6f\x74\x69\x63\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x78\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x64\x66\x73\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x7f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x69\x73\x2d\x74\x65\x73\x74\x2e\x73\x70\x73\x70\x2e\x65\x64\x75\x2e\x73\x61\x15\x7e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x69\x71\x76\x69\x73\x69\x6f\x6e\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x7d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6d\x70\x6c\x6f\x79\x65\x72\x74\x6f\x6f\x6c\x6b\x69\x74\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x7c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xec\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xed\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe8\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe9\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe6\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe7\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf4\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x7a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x46\x0a\x11\x62\x61\x73\x2e\x6d\x69\x64\x6c\x61\x6e\x64\x70\x73\x2e\x6f\x72\x67\x15\x79\x20\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x64\x65\x6d\x6f\x61\x70\x70\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x1f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x61\x70\x73\x6e\x61\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x44\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x79\x63\x6c\x6f\x75\x64\x71\x75\x6f\x74\x65\x2e\x63\x6f\x6d\x15\x23\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x68\x73\x2d\x73\x63\x39\x2d\x70\x72\x6f\x64\x2d\x63\x64\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\x25\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x73\x73\x6f\x6d\x61\x6e\x61\x67\x65\x72\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x52\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x61\x66\x61\x61\x73\x2e\x6c\x6b\x73\x63\x64\x2e\x63\x6f\x6d\x15\x27\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x58\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x6f\x63\x6b\x65\x74\x2e\x77\x61\x79\x6c\x61\x6e\x64\x75\x6e\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x95\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xd7\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x68\x76\x74\x63\x2e\x64\x74\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\xa8\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8d\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8c\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9e\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8e\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x61\x79\x6e\x65\x67\x65\x69\x73\x74\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa1\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x72\x6d\x61\x6e\x61\x69\x6e\x73\x77\x6f\x72\x74\x68\x2e\x6f\x72\x67\x15\x78\x43\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x04\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x03\x0a\x4b\x0a\x16\x73\x70\x61\x72\x74\x61\x6e\x61\x72\x63\x68\x69\x76\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x82\x0b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x41\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x42\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x65\x73\x74\x2e\x74\x65\x63\x68\x6e\x6f\x63\x69\x61\x74\x65\x2e\x69\x6e\x15\x3e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x2e\x75\x70\x63\x68\x2e\x65\x64\x75\x2e\x70\x65\x15\x40\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x69\x67\x73\x2d\x7a\x61\x2d\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x42\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x6c\x62\x65\x72\x69\x63\x68\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x24\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x61\x79\x73\x74\x61\x67\x65\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\xd4\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\xd4\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x73\x74\x61\x67\x69\x6e\x67\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\xd4\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x04\x0a\x48\x0a\x13\x64\x65\x76\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\xd4\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x64\x72\x79\x64\x65\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x08\xb4\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\xd6\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x77\x6c\x6f\x67\x69\x6e\x2e\x63\x6f\x6d\x15\xf2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\xf3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x62\x0a\x2d\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x76\x32\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xf0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x69\x6c\x6c\x69\x6e\x67\x2e\x6a\x6f\x63\x61\x72\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\xf1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\xf4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x75\x62\x6c\x69\x63\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x16\x22\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x08\x0a\x52\x0a\x1d\x6c\x69\x67\x68\x74\x73\x70\x65\x65\x64\x2e\x72\x61\x76\x65\x6e\x6e\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x06\x39\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x88\x04\x0a\x42\x0a\x0d\x6b\x6d\x73\x2e\x73\x73\x69\x63\x61\x2e\x63\x6f\x6d\x15\xf8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x72\x65\x61\x73\x70\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xf9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x69\x76\x69\x6e\x67\x73\x74\x6f\x6e\x65\x73\x61\x2e\x6f\x72\x67\x15\x7f\xa0\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x03\x0a\x50\x0a\x1b\x72\x65\x67\x69\x73\x74\x72\x79\x2e\x74\x6f\x6f\x6c\x73\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0b\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\xc2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x12\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\xc3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6c\x69\x62\x72\x61\x72\x79\x2e\x6c\x69\x6e\x64\x65\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x09\x1d\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x26\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x51\x0a\x1c\x6e\x61\x79\x6f\x74\x65\x63\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x27\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x4c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x64\x65\x76\x65\x6c\x6f\x70\x65\x72\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x46\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x32\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x47\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x48\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x49\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x6c\x66\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x1e\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x4e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x65\x78\x74\x73\x65\x72\x76\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\x4f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x61\x74\x65\x72\x6c\x6f\x6f\x63\x6f\x6e\x74\x61\x69\x6e\x65\x72\x2e\x63\x6f\x6d\x15\x7d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x7f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x70\x72\x6f\x74\x65\x63\x74\x65\x64\x2e\x67\x61\x72\x74\x6e\x65\x72\x64\x65\x6d\x6f\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xb0\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x64\x61\x74\x61\x65\x78\x70\x6f\x72\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x79\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x67\x72\x61\x74\x68\x77\x6f\x6c\x2e\x64\x6b\x15\x78\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x78\x74\x65\x6e\x64\x65\x64\x72\x65\x61\x63\x68\x2e\x63\x6f\x6d\x15\x11\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x76\x70\x6e\x32\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd4\x10\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\xfc\xff\x0f\x0a\x42\x0a\x0d\x77\x68\x61\x74\x73\x6d\x79\x69\x70\x2e\x6f\x72\x67\x15\x62\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\x82\x08\x0a\x48\x0a\x13\x66\x69\x6c\x74\x65\x72\x2e\x6d\x79\x62\x65\x64\x66\x6f\x72\x64\x2e\x75\x73\x15\x20\xa3\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xff\xff\x03\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x93\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x92\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xc0\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x90\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8f\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8e\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x65\x62\x2e\x62\x61\x65\x2e\x68\x6f\x75\x73\x65\x15\x5c\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x73\x2e\x63\x61\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x7a\xc9\xcf\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfb\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x9d\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x6c\x61\x6b\x65\x6d\x69\x63\x68\x69\x67\x61\x6e\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x0b\x68\x6d\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x02\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x47\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x48\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x45\x0a\x10\x6c\x74\x65\x72\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4d\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x03\x0a\x62\x0a\x2d\x6d\x73\x2d\x64\x69\x67\x69\x74\x61\x6c\x63\x61\x72\x64\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xeb\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6c\x69\x6e\x6b\x2e\x63\x6f\x64\x65\x73\x74\x6f\x72\x6d\x2e\x63\x6f\x2e\x75\x6b\x15\xea\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x64\x65\x6c\x65\x67\x61\x74\x65\x73\x2e\x6f\x68\x65\x61\x2e\x6f\x72\x67\x15\xee\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x4a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x61\x66\x69\x62\x6d\x6f\x62\x69\x6c\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x6e\x64\x65\x72\x73\x6f\x6e\x6d\x69\x6c\x6c\x65\x72\x2e\x63\x6f\x6d\x15\xca\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x73\x61\x35\x35\x34\x35\x68\x65\x64\x67\x65\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\xcd\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x80\x02\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x4b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6a\x73\x73\x2e\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x36\x25\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x62\x69\x72\x64\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x68\x65\x7a\x62\x65\x74\x74\x79\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4c\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfa\x03\x0a\x40\x0a\x0b\x62\x6d\x73\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x93\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xe6\xf3\x03\x0a\x3f\x0a\x0a\x66\x77\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x8f\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x69\x70\x63\x61\x6d\x74\x61\x6c\x6b\x2e\x63\x6f\x6d\x15\xcc\xbb\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x66\x0a\x31\x6d\x73\x2d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x61\x63\x74\x69\x76\x69\x74\x79\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x15\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x74\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x75\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x6d\x65\x6d\x62\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x17\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x6d\x73\x2d\x6d\x65\x73\x73\x61\x67\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x18\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x6d\x65\x74\x61\x64\x61\x74\x61\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x19\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x38\x34\x62\x62\x35\x66\x2e\x36\x66\x62\x64\x2e\x64\x6e\x2e\x67\x6c\x6f\x62\x2e\x75\x73\x15\x71\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe0\x02\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc0\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x6f\x6e\x6c\x69\x6e\x65\x74\x72\x61\x69\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x70\x72\x6f\x64\x75\x63\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6a\x64\x2e\x64\x65\x6d\x6f\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf7\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x7a\x6f\x72\x62\x69\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf2\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe8\x03\x0a\x4c\x0a\x17\x61\x73\x75\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf3\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe8\x03\x0a\x51\x0a\x1c\x62\x61\x63\x6b\x75\x70\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\xa6\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x20\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xff\xff\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x1f\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe6\xfc\x03\x0a\x4b\x0a\x16\x70\x73\x2e\x6f\x61\x6b\x72\x69\x64\x67\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x25\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe7\xf3\x03\x0a\x55\x0a\x20\x61\x64\x6d\x69\x6e\x2d\x73\x65\x71\x63\x6f\x72\x65\x2e\x62\x72\x63\x66\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x56\x0a\x21\x63\x6c\x69\x65\x6e\x74\x2d\x73\x65\x71\x63\x6f\x72\x65\x2e\x62\x72\x63\x66\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8d\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfc\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfd\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfa\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfb\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x68\x79\x70\x65\x72\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x2e\x63\x6e\x15\x99\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x65\x62\x2d\x64\x65\x76\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x63\x6c\x6f\x75\x64\x2e\x6e\x6c\x15\x45\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x77\x6d\x61\x2d\x65\x73\x2e\x63\x6f\x6d\x15\x5f\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x61\x74\x68\x77\x65\x62\x77\x6f\x72\x6b\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1e\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x73\x61\x67\x65\x37\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x25\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xa0\x04\x0a\x58\x0a\x23\x6d\x79\x72\x70\x73\x73\x65\x72\x76\x69\x63\x65\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3f\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x72\x67\x77\x2d\x75\x6d\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x05\xa9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf0\x02\x0a\x4f\x0a\x1a\x63\x61\x70\x74\x69\x76\x65\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x70\x65\x70\x6c\x69\x6e\x6b\x2e\x63\x6f\x6d\x15\x54\xfa\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x9b\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x9d\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xce\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xcf\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x99\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x98\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x3f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x72\x74\x6d\x70\x73\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\xd4\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x59\x0a\x24\x77\x77\x77\x2e\x6c\x69\x73\x74\x65\x6e\x69\x6e\x67\x2e\x6d\x69\x63\x68\x69\x67\x61\x6e\x61\x73\x73\x65\x73\x73\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xad\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x73\x74\x6f\x72\x79\x74\x65\x6c\x6c\x69\x6e\x67\x34\x65\x6d\x70\x6f\x77\x65\x72\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xab\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x33\x31\x6c\x61\x62\x73\x2e\x63\x6f\x6d\x15\x6a\xdc\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6b\x69\x70\x69\x63\x2e\x63\x6f\x6d\x2e\x6b\x77\x15\x87\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x78\x74\x65\x6e\x64\x65\x64\x72\x65\x61\x63\x68\x2e\x63\x6f\x6d\x15\x55\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x86\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x85\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x61\x62\x6c\x65\x61\x75\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x8a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x56\x49\x53\x43\x31\x2e\x6d\x79\x71\x6e\x61\x70\x63\x6c\x6f\x75\x64\x2e\x63\x6f\x6d\x15\x1e\x18\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x67\x77\x61\x2e\x33\x63\x78\x2e\x75\x73\x15\x8a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xa3\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x6f\x72\x67\x15\xfe\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x4a\x0a\x15\x74\x61\x78\x68\x65\x6c\x70\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5c\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5a\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x68\x35\x70\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5b\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x61\x6d\x70\x75\x73\x63\x61\x6c\x6c\x2e\x75\x61\x64\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1b\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x52\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x79\x6f\x75\x72\x63\x6c\x6f\x75\x64\x73\x68\x61\x72\x65\x2e\x6e\x65\x74\x15\xae\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x79\x6f\x75\x72\x63\x6c\x6f\x75\x64\x73\x68\x61\x72\x65\x2e\x6e\x65\x74\x15\xab\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x6c\x61\x6d\x70\x2e\x63\x6f\x62\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x3c\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xba\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb9\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb6\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb4\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf4\x01\x0a\x4c\x0a\x17\x6b\x72\x6f\x67\x65\x6c\x2d\x76\x70\x6e\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x99\xab\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xb8\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9a\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x19\x6b\x72\x6f\x67\x65\x6c\x2d\x6c\x69\x6e\x75\x78\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x9b\xab\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa5\x75\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x99\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x98\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x97\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9a\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xec\x01\x0a\x52\x0a\x1d\x69\x6d\x6f\x62\x69\x6c\x65\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x65\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x61\x69\x72\x62\x6f\x73\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2d\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xe3\x01\x0a\x52\x0a\x1d\x70\x73\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x64\x65\x6d\x6f\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x53\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x84\x08\x0a\x47\x0a\x12\x63\x69\x2e\x69\x71\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9d\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x65\x70\x76\x61\x75\x6c\x74\x2e\x63\x6f\x6d\x15\x8e\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x70\x73\x73\x6f\x75\x74\x68\x68\x61\x76\x65\x6e\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7f\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x86\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xa0\x8a\x01\x0a\x4d\x0a\x18\x63\x6c\x75\x62\x73\x65\x63\x72\x65\x74\x73\x2e\x63\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x8f\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x03\x0a\x44\x0a\x0f\x65\x71\x74\x6c\x2e\x70\x68\x65\x77\x65\x62\x2e\x6f\x72\x67\x15\x3a\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x7a\x6f\x65\x6c\x6c\x6e\x65\x72\x2d\x6c\x61\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3b\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x03\x0a\x49\x0a\x14\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6e\x65\x74\x15\x38\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2d\x69\x6e\x70\x73\x79\x67\x68\x74\x31\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x39\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x67\x66\x67\x2d\x61\x70\x70\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x39\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x69\x6d\x70\x65\x72\x69\x61\x64\x65\x6d\x2e\x63\x6f\x6d\x15\x36\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6c\x69\x76\x65\x2d\x62\x74\x70\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x39\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x32\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x33\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x65\x62\x6d\x61\x69\x6c\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x34\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x69\x6e\x63\x6b\x6e\x65\x79\x63\x74\x69\x2e\x6f\x72\x67\x15\xb6\xa5\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6c\x69\x76\x65\x2d\x72\x70\x73\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x3a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x74\x70\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3d\x0a\x08\x73\x63\x61\x6e\x73\x2e\x69\x6f\x15\x14\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\xfd\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\xfa\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x6d\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x79\x2d\x64\x65\x76\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6f\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x05\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x06\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x98\x8a\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x03\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x02\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x98\x8a\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x63\x73\x72\x65\x64\x68\x61\x77\x6b\x73\x2e\x6f\x72\x67\x15\x55\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x46\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x74\x74\x61\x77\x61\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1a\x3c\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6d\x73\x2d\x73\x65\x6c\x66\x72\x65\x67\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x1e\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x67\x6f\x76\x70\x6e\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xfd\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xff\x0f\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x63\x6f\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x3e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x67\x69\x73\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x3c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x67\x32\x38\x31\x2d\x31\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x67\x32\x38\x31\x2d\x33\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x79\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6d\x6f\x68\x65\x67\x61\x6e\x65\x6e\x74\x65\x72\x74\x61\x69\x6e\x6d\x65\x6e\x74\x2e\x63\x6f\x6d\x15\x89\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x74\x61\x78\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x87\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x69\x71\x73\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x84\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9a\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x63\x69\x2e\x63\x6f\x6d\x15\x85\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x83\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x65\x64\x75\x63\x61\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x10\xce\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x9e\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x7a\x70\x65\x6e\x74\x72\x75\x73\x74\x65\x65\x2e\x69\x6e\x66\x6f\x15\xbc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x70\x72\x6f\x67\x72\x65\x73\x73\x2e\x73\x6b\x65\x74\x63\x68\x6c\x65\x2e\x63\x6f\x6d\x15\xb9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x64\x62\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\xbb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x62\x61\x64\x73\x74\x6f\x72\x65\x2d\x6c\x61\x62\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xb5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x67\x61\x74\x65\x77\x61\x79\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xb7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x70\x6f\x72\x74\x61\x6c\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xb6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x92\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8f\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8c\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x89\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x8a\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x11\x63\x61\x6d\x70\x75\x73\x2e\x61\x6c\x62\x69\x6f\x6e\x2e\x65\x64\x75\x15\x97\x0b\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xa6\x80\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3f\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3c\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x40\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x41\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xe7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x75\x61\x74\x6c\x6f\x67\x69\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xde\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xdc\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xdd\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xe2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x6f\x63\x69\x61\x6c\x67\x69\x73\x74\x2e\x63\x6f\x6d\x15\xb9\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf8\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xe5\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x6f\x63\x69\x61\x6c\x67\x69\x73\x74\x2e\x63\x6f\x6d\x15\xb6\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x73\x74\x72\x65\x65\x74\x73\x69\x64\x65\x2e\x69\x6f\x15\xb5\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf8\x01\x0a\x49\x0a\x14\x67\x6f\x76\x70\x6e\x2e\x74\x65\x73\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xfd\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xff\x0f\x0a\x50\x0a\x1b\x6d\x6f\x62\x69\x6c\x65\x69\x72\x6f\x6e\x76\x73\x70\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xaa\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xf0\xf4\x01\x0a\x51\x0a\x1c\x63\x6c\x61\x73\x73\x72\x6f\x6f\x6d\x2e\x64\x63\x6d\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf2\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x77\x77\x77\x2e\x6f\x70\x65\x6e\x77\x69\x72\x65\x6c\x65\x73\x73\x32\x30\x32\x30\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x42\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x74\x61\x67\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x27\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x73\x75\x72\x76\x65\x79\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x26\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x73\x72\x73\x70\x6f\x72\x74\x61\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x25\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x73\x69\x74\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x24\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x73\x65\x73\x73\x69\x6f\x6e\x67\x61\x74\x65\x77\x61\x79\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x23\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x59\x0a\x24\x6d\x73\x2d\x73\x64\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x22\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x64\x73\x72\x65\x66\x72\x65\x73\x68\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x21\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x20\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x73\x61\x6d\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x72\x65\x70\x6f\x72\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x6e\x61\x67\x65\x68\x66\x2e\x70\x68\x61\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb9\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x6f\x75\x73\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfc\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x72\x32\x76\x34\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfb\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x72\x31\x76\x34\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfa\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xd5\x07\x28\x80\xe3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x19\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x14\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x69\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6e\x65\x74\x15\x50\xe4\x8c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf9\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x68\x61\x72\x64\x79\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x44\x7c\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf1\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf0\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf3\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf2\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf5\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf7\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf6\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x07\x0a\x56\x0a\x21\x72\x65\x64\x63\x61\x70\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x6d\x69\x6f\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9c\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x61\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4f\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x98\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x7a\x69\x64\x61\x6e\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x33\x6e\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x77\x61\x6c\x74\x6f\x6e\x72\x65\x73\x69\x64\x65\x6e\x74\x69\x61\x6c\x2e\x63\x6f\x6d\x15\xd6\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x61\x72\x74\x2e\x70\x72\x69\x6e\x74\x74\x6f\x70\x72\x65\x73\x73\x2e\x63\x6f\x6d\x15\xd3\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x07\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x6b\x69\x61\x66\x69\x6e\x61\x6e\x63\x65\x2e\x64\x65\x15\x7f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x79\x77\x61\x74\x65\x72\x2e\x73\x61\x72\x61\x74\x6f\x67\x61\x73\x70\x72\x69\x6e\x67\x73\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x11\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x67\x73\x2e\x66\x6f\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xc2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x04\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x3e\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x38\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xea\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x6c\x65\x72\x74\x75\x73\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xa4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x02\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xa0\xfd\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x36\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xe8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x70\x72\x6f\x78\x75\x72\x65\x2e\x63\x6f\x6d\x15\x03\xdf\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6c\x61\x73\x65\x72\x66\x69\x63\x68\x65\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xb7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x65\x62\x65\x6f\x63\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xb5\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x61\x72\x63\x74\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x2e\x63\x6f\x6d\x15\x8f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x61\x72\x32\x70\x68\x61\x72\x6d\x61\x63\x65\x75\x74\x69\x63\x61\x6c\x73\x2e\x63\x6f\x6d\x15\x8e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x69\x6e\x67\x6c\x65\x62\x79\x66\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x90\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x64\x65\x76\x65\x6c\x6f\x70\x65\x72\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x93\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x72\x61\x6e\x64\x6f\x6c\x70\x68\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\xfa\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x63\x68\x65\x7a\x62\x65\x74\x74\x79\x2e\x73\x74\x6f\x72\x65\x15\x1e\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x63\x68\x6f\x6f\x6c\x63\x72\x61\x66\x74\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1a\x26\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8c\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x69\x6b\x69\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x83\x91\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x76\x63\x73\x66\x6f\x72\x65\x73\x69\x74\x65\x2e\x76\x63\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\xa8\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x44\x0a\x0f\x63\x61\x72\x35\x34\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x34\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x94\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x69\x6c\x65\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x08\x37\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x69\x6c\x65\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x07\x37\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x81\x04\x0a\x43\x0a\x0e\x77\x65\x62\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x26\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6e\x61\x6e\x6f\x74\x75\x62\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdc\x43\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x94\xfd\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x67\x0a\x32\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x73\x6d\x74\x6f\x6d\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x68\x70\x73\x6b\x31\x32\x2e\x6e\x65\x74\x15\xc5\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xfc\xff\x0f\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb0\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x40\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3e\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xab\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xaa\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x63\x69\x64\x69\x74\x72\x61\x69\x6e\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x64\x6d\x2e\x69\x70\x66\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\xbb\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x10\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb3\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb2\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2f\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2c\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfd\x01\x0a\x49\x0a\x14\x70\x72\x73\x77\x65\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x73\x74\x61\x67\x69\x6e\x67\x2e\x6c\x6f\x63\x75\x73\x7a\x6f\x6f\x6d\x2e\x6f\x72\x67\x15\x40\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x2b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x2a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x29\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x28\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x70\x6c\x65\x79\x73\x2e\x63\x6f\x6d\x15\x2e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x15\x2d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x66\x72\x65\x65\x70\x62\x78\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x25\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x63\x61\x6c\x6c\x61\x69\x6d\x2e\x6f\x72\x67\x15\xb5\x60\xcf\x8f\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x38\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf0\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x69\x6e\x66\x69\x6e\x69\x74\x65\x77\x65\x62\x64\x65\x73\x69\x67\x6e\x2e\x63\x6f\x6d\x15\xae\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x70\x61\x72\x74\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x5e\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x6c\x69\x76\x6f\x6e\x69\x61\x70\x75\x62\x6c\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x15\xea\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x34\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x75\x62\x6c\x69\x63\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x67\x32\x38\x31\x2d\x32\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x67\x6c\x6f\x62\x61\x6c\x63\x6f\x6c\x6c\x65\x63\x74\x69\x6f\x6e\x2e\x6e\x65\x74\x15\x39\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x65\x2d\x61\x70\x63\x2e\x63\x6f\x6d\x15\x3a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x89\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xec\x01\x0a\x51\x0a\x1b\x74\x72\x61\x6e\x73\x66\x65\x72\x2e\x6b\x65\x63\x63\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x7c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\xbf\x02\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x8b\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x98\x8a\x01\x0a\x4b\x0a\x16\x6d\x79\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x70\x61\x73\x73\x69\x6e\x65\x74\x2e\x63\x6f\x6d\x15\x64\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x85\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x98\x8a\x01\x0a\x4e\x0a\x19\x73\x74\x61\x67\x69\x6e\x67\x2d\x6d\x61\x67\x6e\x6f\x78\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x6d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x76\x61\x6e\x73\x69\x73\x2e\x63\x6c\x15\x6c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x88\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x87\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x86\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa5\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\xf0\xf2\x01\x0a\x4a\x0a\x15\x6c\x61\x6c\x69\x67\x61\x74\x65\x73\x74\x2e\x64\x65\x6e\x61\x72\x69\x6f\x2e\x65\x73\x15\xc7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa2\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xf0\xf2\x01\x0a\x56\x0a\x21\x66\x2d\x6c\x61\x6e\x64\x70\x61\x67\x65\x2d\x70\x2d\x31\x2d\x65\x6c\x61\x73\x74\x69\x63\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xbe\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x73\x69\x63\x61\x74\x65\x73\x74\x2e\x73\x73\x69\x63\x61\x2e\x63\x6f\x6d\x15\xbf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6b\x69\x62\x61\x6e\x61\x2d\x6c\x61\x6e\x64\x69\x6e\x67\x70\x61\x67\x65\x73\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xc2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x9b\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x66\x6f\x72\x65\x73\x74\x61\x72\x65\x61\x2e\x6f\x72\x67\x15\x4d\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x42\x0a\x0d\x76\x70\x6e\x32\x2e\x6d\x74\x72\x69\x2e\x6f\x72\x67\x15\x28\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xb8\x01\x0a\x50\x0a\x1b\x63\x6c\x65\x61\x6e\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x70\x75\x74\x69\x6e\x67\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\x9e\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6f\x6d\x65\x6b\x61\x2d\x64\x65\x6d\x6f\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1a\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x74\x2e\x61\x74\x68\x65\x6e\x61\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xd8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x65\x78\x74\x72\x61\x6e\x65\x74\x2e\x62\x72\x6f\x6b\x65\x72\x6c\x69\x6e\x6b\x73\x6f\x66\x74\x77\x61\x72\x65\x2e\x63\x6f\x6d\x15\xd6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x40\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x52\x0a\x1d\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x6d\x61\x6e\x74\x6c\x65\x74\x65\x73\x74\x69\x6e\x67\x2e\x63\x6f\x2e\x75\x6b\x15\xd2\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x63\x33\x2e\x63\x6f\x72\x70\x6f\x72\x61\x74\x65\x63\x6f\x73\x74\x63\x6f\x6e\x74\x72\x6f\x6c\x2e\x63\x6f\x6d\x15\xd3\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x65\x67\x72\x65\x65\x61\x75\x64\x69\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x44\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x64\x65\x67\x72\x65\x65\x61\x75\x64\x69\x74\x2d\x74\x65\x73\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x44\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x94\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x73\x75\x62\x2e\x73\x6f\x75\x74\x68\x67\x61\x74\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x85\xf4\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8c\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8d\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8e\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xa1\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x95\xbf\x02\x0a\x4c\x0a\x17\x6c\x61\x62\x31\x31\x2e\x65\x65\x63\x73\x2e\x62\x65\x72\x6b\x65\x6c\x65\x79\x2e\x65\x64\x75\x15\x41\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6c\x6f\x62\x73\x74\x65\x72\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x73\x75\x68\x6c\x61\x2e\x63\x68\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x33\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x6d\x65\x6d\x62\x65\x72\x73\x2e\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x68\x6f\x73\x70\x69\x74\x61\x6c\x73\x2e\x6f\x72\x67\x15\x30\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x31\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x76\x69\x73\x75\x61\x6c\x69\x7a\x65\x74\x73\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xb9\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x5d\x0a\x28\x6d\x73\x2d\x75\x70\x67\x72\x61\x64\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x75\x73\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x6a\x0a\x35\x6d\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x72\x65\x71\x75\x69\x72\x65\x6d\x65\x6e\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x28\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x29\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x69\x67\x73\x2d\x7a\x61\x2d\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x2e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x61\x6b\x61\x79\x61\x6d\x61\x66\x75\x6b\x75\x2e\x63\x6f\x2e\x6a\x70\x15\x2f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x67\x0a\x32\x6d\x73\x2d\x76\x69\x64\x65\x6f\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x70\x69\x6c\x6c\x61\x72\x6c\x65\x61\x72\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xe1\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x65\x65\x30\x31\x2e\x77\x68\x69\x74\x65\x63\x6c\x6f\x75\x64\x2e\x6e\x65\x74\x15\x6c\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x76\x6f\x69\x63\x65\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x15\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3b\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x56\x0a\x21\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x70\x72\x69\x6e\x67\x2d\x6c\x61\x6b\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe7\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x39\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x37\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x36\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x33\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xcf\xf8\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x32\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3d\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x70\x2d\x6c\x76\x6c\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x90\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xfd\x07\x0a\x4c\x0a\x17\x70\x2d\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xfc\xfd\x07\x0a\x47\x0a\x12\x77\x77\x77\x2e\x68\x61\x74\x68\x69\x74\x72\x75\x73\x74\x2e\x6f\x72\x67\x15\xb8\x80\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x69\x63\x6d\x61\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x45\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x65\x72\x67\x6f\x70\x68\x69\x6c\x6a\x6f\x75\x72\x6e\x61\x6c\x2e\x6f\x72\x67\x15\xb7\x80\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x69\x70\x73\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x76\x69\x6c\x6c\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x08\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xe8\xf3\x03\x0a\x58\x0a\x23\x72\x61\x63\x6b\x69\x72\x70\x72\x6f\x64\x2d\x6e\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x74\x72\x67\x2e\x6d\x65\x64\x69\x61\x15\x59\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x37\x31\x37\x36\x32\x39\x37\x2d\x63\x35\x61\x34\x61\x66\x65\x62\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xa2\xb7\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf8\x01\x0a\x51\x0a\x1c\x63\x61\x65\x6e\x2d\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x70\x73\x2e\x66\x72\x61\x6e\x6b\x66\x6f\x72\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x53\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x62\x70\x73\x2e\x62\x72\x6f\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x85\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x74\x72\x61\x6d\x73\x2e\x72\x74\x73\x6f\x2e\x63\x6f\x6d\x15\x7d\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x74\x61\x73\x70\x72\x64\x37\x30\x32\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xab\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\x24\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x61\x72\x73\x65\x61\x74\x63\x6f\x6d\x70\x61\x73\x73\x2e\x63\x6f\x6d\x15\x9c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x31\x2e\x63\x68\x65\x6c\x73\x65\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4c\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x62\x68\x31\x32\x2e\x67\x65\x6f\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\x0f\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x76\x65\x72\x61\x64\x61\x72\x2e\x63\x6f\x6d\x15\x97\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x65\x72\x6b\x65\x6e\x62\x69\x6a\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x9c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x75\x6e\x6c\x6f\x63\x6b\x6d\x65\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\x9a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\x9f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6f\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x0f\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6e\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfe\x0f\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc4\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc5\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc2\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x61\x74\x77\x61\x74\x65\x72\x62\x65\x65\x72\x2e\x63\x6f\x6d\x15\xc3\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x61\x61\x61\x31\x62\x2e\x6f\x72\x67\x15\xc0\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x6d\x6f\x72\x69\x61\x6c\x62\x72\x61\x63\x65\x6c\x65\x74\x73\x2e\x63\x6f\x6d\x15\xc1\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x68\x6f\x62\x6f\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x70\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x72\x6f\x62\x69\x6e\x73\x6f\x6e\x66\x75\x6e\x64\x73\x2e\x63\x6f\x6d\x15\xc7\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x79\x2e\x69\x72\x68\x63\x2e\x63\x6f\x6d\x15\x1b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x70\x72\x6f\x63\x65\x73\x73\x69\x6e\x67\x2d\x73\x74\x61\x67\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\x51\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x6d\x79\x69\x6e\x73\x75\x72\x61\x6e\x63\x65\x2e\x6d\x65\x74\x6c\x69\x66\x65\x61\x69\x67\x61\x6e\x62\x2e\x63\x6f\x6d\x15\x52\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x62\x6c\x6f\x72\x70\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x53\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x6c\x6d\x61\x69\x6c\x65\x6d\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x54\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x75\x64\x61\x2d\x68\x69\x64\x65\x61\x6b\x69\x2e\x74\x6f\x6b\x79\x6f\x15\x55\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x70\x6d\x6c\x69\x67\x68\x74\x73\x2e\x63\x6f\x6d\x15\x58\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x64\x61\x76\x65\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x59\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x6f\x74\x65\x63\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x52\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\xfc\xff\x0f\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x64\x75\x6c\x6f\x67\x77\x65\x62\x32\x62\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x95\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe6\xf3\x03\x0a\x51\x0a\x1c\x70\x75\x72\x63\x68\x61\x73\x69\x6e\x67\x2d\x64\x65\x76\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\xc0\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\xc6\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x4f\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x74\x65\x73\x74\x2e\x77\x65\x62\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x74\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x6a\x63\x2d\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x73\x6a\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1e\x2e\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x83\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x68\x65\x6c\x70\x64\x65\x73\x6b\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x14\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x61\x6e\x74\x68\x65\x72\x6e\x65\x74\x2e\x6e\x65\x74\x15\x1f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x66\x0a\x31\x6d\x73\x2d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x16\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x75\x69\x67\x65\x6c\x7a\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7d\x08\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x75\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x70\x73\x2e\x67\x6d\x73\x74\x73\x2e\x6f\x72\x67\x15\x1c\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x03\x0a\x66\x0a\x31\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x73\x6c\x6f\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x73\x74\x72\x61\x74\x65\x67\x69\x63\x72\x69\x73\x6b\x73\x2e\x63\x6f\x6d\x15\x5c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x63\x6f\x6c\x6c\x65\x63\x74\x69\x65\x66\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x5d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6d\x70\x74\x63\x71\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x93\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x54\x0a\x1f\x77\x65\x62\x35\x36\x74\x65\x73\x74\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x92\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x61\x32\x67\x75\x69\x64\x65\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x91\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x51\x0a\x1c\x61\x6c\x75\x6d\x6e\x69\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x90\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x55\x0a\x20\x61\x7a\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8f\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x63\x61\x6e\x64\x77\x69\x6e\x74\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8e\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x4e\x0a\x19\x6d\x70\x73\x2d\x70\x72\x74\x67\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x15\xb2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\xc6\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x65\x7a\x70\x61\x70\x65\x72\x74\x72\x61\x69\x6c\x2e\x63\x6f\x6d\x15\xa2\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x45\x0a\x10\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x69\x7a\x61\x2e\x6e\x6c\x15\x0a\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x45\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\x81\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x15\x49\x2a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x64\x65\x76\x32\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x43\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x2e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x67\x65\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x62\x75\x69\x6c\x64\x15\x29\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x62\x69\x6c\x76\x61\x72\x64\x73\x65\x78\x70\x65\x72\x74\x65\x6e\x2e\x73\x65\x15\x28\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x67\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x66\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x69\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x6a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\x10\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xfc\xff\x0f\x0a\x4b\x0a\x16\x61\x70\x69\x2e\x61\x74\x68\x65\x6e\x61\x2e\x6f\x74\x70\x32\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x70\x69\x2e\x61\x74\x68\x65\x6e\x61\x2e\x6f\x74\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x70\x61\x74\x69\x65\x6e\x74\x63\x6f\x6e\x6e\x65\x63\x74\x33\x36\x35\x2e\x63\x6f\x6d\x15\xa2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x6f\x62\x69\x6c\x65\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\xa1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x74\x69\x6d\x65\x66\x6f\x72\x63\x65\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\xa0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x79\x61\x6c\x6c\x61\x68\x71\x75\x69\x74\x2e\x6f\x72\x67\x15\xe7\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x63\x6f\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x65\x75\x70\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x83\x9e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x6c\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x78\x69\x73\x63\x6f\x70\x65\x2e\x63\x6f\x6d\x15\x13\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xbc\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x65\x72\x70\x73\x6b\x31\x32\x2e\x6f\x72\x67\x15\xa8\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xbb\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xb8\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x69\x6e\x6b\x61\x64\x6f\x6f\x2e\x66\x72\x15\x11\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb6\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb4\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb5\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x66\x63\x61\x2e\x69\x63\x6f\x6e\x69\x78\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x97\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x59\x0a\x24\x73\x74\x61\x67\x69\x6e\x67\x2d\x6f\x6e\x62\x6f\x61\x72\x64\x69\x6e\x67\x2e\x72\x70\x6d\x69\x72\x61\x69\x6c\x70\x65\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\xd1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x61\x70\x74\x69\x76\x65\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x70\x65\x70\x6c\x69\x6e\x6b\x2e\x63\x6f\x6d\x15\x31\xbb\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xa0\x01\x0a\x43\x0a\x0e\x61\x63\x63\x2e\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xc9\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x78\x64\x74\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\xce\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x68\x6f\x74\x74\x75\x62\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x73\x2e\x63\x61\x15\x39\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x76\x69\x73\x2d\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xea\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xae\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6b\x62\x2d\x64\x65\x76\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xab\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xaa\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xad\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x66\x61\x76\x72\x6f\x2e\x6e\x65\x74\x15\xe9\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x65\x64\x64\x69\x6e\x67\x2e\x68\x75\x6e\x67\x65\x72\x74\x69\x6e\x2d\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x63\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x81\x04\x0a\x45\x0a\x10\x6b\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x63\x72\x65\x64\x69\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x72\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x65\x73\x74\x2e\x72\x6f\x61\x6d\x65\x72\x31\x2e\x63\x6f\x6d\x15\x73\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x6d\x73\x2d\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x74\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x63\x72\x61\x6e\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xab\xb1\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x6b\x63\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x77\x65\x62\x6d\x61\x69\x6c\x2e\x63\x75\x64\x61\x73\x65\x74\x65\x61\x6d\x2e\x63\x6f\x6d\x15\x6f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x2e\x6a\x70\x15\x70\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x69\x6e\x74\x2d\x7a\x75\x72\x69\x63\x68\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x3a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6f\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x6d\x65\x6c\x6c\x69\x61\x2d\x6c\x69\x6e\x65\x2e\x63\x6f\x2e\x6a\x70\x15\x35\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x63\x72\x73\x63\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x15\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x72\x6d\x2e\x65\x72\x61\x6d\x65\x74\x2e\x63\x6f\x6d\x15\x36\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6b\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6a\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6c\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x74\x73\x6f\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1f\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2e\x68\x61\x6d\x69\x6c\x74\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x2a\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x31\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x47\x0a\x12\x70\x73\x2e\x73\x61\x75\x67\x61\x74\x75\x63\x6b\x70\x73\x2e\x63\x6f\x6d\x15\x29\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x40\x0a\x0b\x67\x6c\x70\x61\x77\x65\x62\x2e\x6f\x72\x67\x15\x27\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x6d\x2d\x6d\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x26\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x40\x0a\x0b\x64\x65\x76\x2e\x76\x63\x6d\x2e\x63\x6f\x6d\x15\x64\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x61\x70\x70\x73\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x45\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2b\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2e\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x70\x73\x2e\x67\x6c\x65\x6e\x6c\x61\x6b\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2f\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x6d\x62\x67\x2e\x68\x75\x72\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xe8\xe8\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xac\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xfd\x07\x0a\x4d\x0a\x18\x70\x2d\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xab\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xfd\x07\x0a\x4d\x0a\x18\x64\x2d\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xec\xfc\x07\x0a\x48\x0a\x13\x33\x64\x70\x72\x69\x6d\x65\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x70\x62\x78\x2e\x62\x73\x63\x73\x2e\x6d\x65\x72\x63\x75\x72\x79\x2e\x6e\x65\x74\x15\xc3\x0b\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x8d\x01\x0a\x48\x0a\x13\x64\x2d\x69\x64\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb3\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\xfc\xfd\x07\x0a\x4c\x0a\x17\x62\x69\x67\x64\x61\x74\x61\x31\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x29\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x62\x69\x67\x64\x61\x74\x61\x31\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x70\x34\x2e\x64\x65\x74\x2e\x75\x74\x72\x6f\x70\x69\x63\x6d\x65\x64\x69\x61\x2e\x6e\x65\x74\x15\x72\xb7\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x6d\x73\x6d\x73\x68\x65\x65\x74\x6d\x65\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x60\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6c\x6f\x63\x2e\x6d\x73\x6d\x73\x68\x65\x65\x74\x6d\x65\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x61\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x75\x6d\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x93\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6d\x73\x6d\x63\x2d\x73\x79\x6e\x63\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x90\x61\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xaf\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x69\x2e\x62\x62\x73\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x33\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8c\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x5f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf8\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0a\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf8\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf8\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0f\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x72\x74\x67\x2e\x73\x6f\x75\x74\x68\x67\x61\x74\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x17\xf4\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x63\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x47\x0a\x12\x77\x77\x77\x2e\x74\x72\x69\x6d\x61\x73\x63\x6f\x72\x70\x2e\x6e\x65\x74\x15\xe5\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xb0\xfc\x0f\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x5f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6e\x68\x6d\x73\x68\x6f\x70\x2e\x63\x6f\x2e\x75\x6b\x15\x5e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa2\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa3\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xec\x01\x0a\x46\x0a\x11\x75\x6d\x63\x2d\x6d\x65\x64\x69\x61\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x88\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x9d\x01\x0a\x4c\x0a\x17\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x6e\x65\x77\x68\x6f\x6d\x65\x73\x2e\x63\x6f\x6d\x15\x62\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa4\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa5\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd4\x03\x28\x80\xec\x01\x0a\x4c\x0a\x17\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x68\x61\x73\x73\x6b\x31\x32\x2e\x6f\x72\x67\x15\x88\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x6d\x61\x69\x6c\x2e\x6d\x79\x67\x61\x6d\x65\x72\x63\x61\x72\x64\x2e\x6e\x65\x74\x15\xe7\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x2f\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2c\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2d\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2b\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x69\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6e\x65\x74\x15\x33\xe4\x8c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x07\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x77\x61\x76\x65\x72\x6c\x79\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x1c\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xfd\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x63\x61\x6c\x67\x61\x72\x79\x61\x72\x65\x61\x2e\x63\x6f\x6d\x15\x6a\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x72\x65\x76\x6f\x64\x65\x72\x6d\x2e\x63\x6f\x6d\x15\x69\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x73\x74\x72\x61\x74\x65\x67\x69\x63\x72\x69\x73\x6b\x73\x2e\x63\x6f\x6d\x15\x56\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x72\x75\x73\x73\x65\x6c\x6c\x69\x6e\x76\x65\x73\x74\x6d\x65\x6e\x74\x73\x70\x65\x6e\x73\x69\x6f\x6e\x70\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x55\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x65\x6e\x77\x6c\x2e\x6d\x79\x65\x73\x70\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x54\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x32\x32\x2e\x65\x73\x63\x61\x70\x65\x66\x72\x6f\x6d\x74\x68\x65\x2e\x6e\x65\x74\x15\x53\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x63\x6f\x6c\x6c\x65\x63\x74\x69\x65\x66\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x52\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x69\x6e\x74\x2d\x72\x75\x73\x73\x65\x6c\x6c\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x51\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6f\x65\x6c\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xf7\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x74\x74\x61\x77\x61\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x12\x3c\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x73\x63\x69\x65\x6e\x74\x69\x61\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x6f\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xfb\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd6\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd4\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd2\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd3\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x70\x61\x79\x2e\x61\x66\x66\x67\x6c\x6f\x2e\x63\x6f\x6d\x15\x1e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x4a\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\x81\x01\x0a\x4f\x0a\x1a\x64\x65\x76\x33\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x49\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x24\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x73\x6a\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x03\x2e\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xfc\xff\x0f\x0a\x52\x0a\x1d\x69\x6e\x74\x2d\x7a\x75\x72\x69\x63\x68\x2d\x74\x72\x75\x73\x74\x65\x65\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xaf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x6e\x74\x2d\x66\x69\x64\x65\x6c\x69\x74\x79\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xb0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x66\x0a\x31\x6d\x73\x2d\x73\x65\x6c\x66\x72\x65\x67\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xb1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x75\x61\x74\x2d\x65\x6d\x62\x61\x72\x6b\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\xaa\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xab\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x92\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x74\x65\x63\x65\x6e\x74\x72\x61\x6c\x2e\x63\x6f\x6d\x15\xb2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x65\x6c\x70\x73\x2e\x75\x73\x15\x0a\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4c\x0a\x17\x6d\x61\x76\x65\x72\x69\x63\x6b\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x69\x64\x65\x6f\x72\x74\x72\x31\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xd0\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x77\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x73\x6f\x61\x72\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x65\x73\x6c\x69\x65\x6b\x31\x32\x2e\x6e\x65\x74\x15\xc5\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x63\x70\x61\x6e\x65\x6c\x31\x31\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x54\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x97\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x74\x73\x2e\x70\x72\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb2\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x64\x61\x74\x61\x63\x6f\x76\x65\x72\x2e\x63\x6f\x6d\x15\x96\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xa0\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x69\x73\x75\x61\x6c\x69\x7a\x65\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xb8\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9a\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x65\x62\x6d\x61\x69\x6c\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\xa8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x72\x65\x70\x6f\x72\x74\x73\x2e\x69\x61\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xd8\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6e\x6f\x74\x69\x63\x65\x6d\x61\x6e\x61\x67\x65\x72\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xae\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x70\x70\x69\x6e\x67\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xa1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\xa0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6f\x67\x69\x73\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x69\x6e\x65\x74\x76\x61\x73\x73\x2e\x63\x6f\x6d\x15\xa3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x15\x50\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x65\x62\x63\x68\x61\x74\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\xa4\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x68\x69\x6e\x6f\x72\x65\x61\x6c\x74\x79\x2e\x63\x6f\x6d\x15\x29\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xc0\x87\x01\x0a\x49\x0a\x14\x6c\x6f\x63\x61\x74\x65\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\xc4\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x69\x74\x73\x2d\x6d\x67\x69\x73\x74\x73\x74\x77\x65\x62\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x63\x61\x6d\x70\x75\x73\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x64\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6b\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6a\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x69\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x61\x69\x72\x70\x6f\x72\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\xa2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe6\xf3\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xdd\x03\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb4\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb5\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb6\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb7\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6d\x63\x65\x73\x61\x2d\x74\x63\x2d\x6c\x73\x66\x69\x6c\x74\x65\x72\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x13\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x4d\x0a\x18\x61\x70\x69\x2e\x62\x61\x63\x6b\x75\x70\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x6d\x15\xb1\x97\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x82\x01\x0a\x5a\x0a\x25\x6d\x63\x65\x73\x61\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x0f\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x5a\x0a\x25\x6d\x63\x65\x73\x61\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x66\x69\x6c\x74\x65\x72\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x11\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x81\x04\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6e\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x01\x0a\x4f\x0a\x1a\x63\x68\x6f\x69\x63\x65\x2d\x70\x62\x78\x2e\x63\x68\x61\x72\x74\x65\x72\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\xd3\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x61\x65\x64\x73\x2e\x6f\x72\x67\x15\x78\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xf0\xf2\x01\x0a\x5d\x0a\x28\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x6e\x74\x65\x72\x76\x65\x6e\x74\x69\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xe3\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x41\x0a\x0c\x74\x6f\x6d\x64\x6f\x62\x65\x73\x2e\x63\x6f\x6d\x15\x28\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4a\x0a\x15\x6d\x65\x72\x72\x69\x6c\x6c\x76\x69\x6c\x6c\x65\x63\x68\x6f\x69\x72\x2e\x63\x6f\x6d\x15\x29\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfb\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x63\x70\x73\x74\x61\x72\x73\x2e\x6f\x72\x67\x15\x2a\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfb\x03\x0a\x53\x0a\x1e\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xfc\xfd\x07\x0a\x4e\x0a\x19\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa7\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xfc\xfd\x07\x0a\x58\x0a\x23\x72\x65\x64\x63\x61\x70\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa2\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x51\x0a\x1c\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xfc\xfd\x07\x0a\x44\x0a\x0f\x73\x79\x73\x2e\x62\x69\x6f\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x50\x3c\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x6e\x6f\x77\x66\x6f\x78\x2e\x61\x73\x75\x73\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x48\xe8\xc2\x43\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xcc\x05\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x69\x65\x66\x64\x66\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\xad\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x69\x6d\x6d\x65\x72\x73\x69\x76\x65\x64\x65\x73\x69\x67\x6e\x73\x74\x75\x64\x69\x6f\x73\x2e\x63\x6f\x6d\x15\x88\xb0\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x68\x65\x61\x6c\x74\x68\x79\x6d\x69\x6e\x64\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd6\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd7\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x72\x65\x70\x72\x69\x6e\x74\x2d\x61\x70\x6d\x73\x2e\x6f\x72\x67\x15\x9b\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x65\x72\x67\x6f\x70\x68\x69\x6c\x6a\x6f\x75\x72\x6e\x61\x6c\x2e\x6f\x72\x67\x15\xba\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x62\x6c\x6f\x67\x2e\x70\x72\x65\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb9\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x66\x69\x6c\x65\x74\x72\x61\x6e\x73\x66\x65\x72\x2e\x69\x6e\x65\x6f\x2e\x63\x6f\x2e\x61\x74\x15\x56\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x57\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x73\x74\x61\x67\x69\x6e\x67\x2d\x61\x6d\x65\x79\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x55\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x70\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\xab\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x63\x6f\x2e\x6a\x70\x15\xad\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\xac\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6b\x6c\x61\x6e\x74\x65\x6e\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xb2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x67\x6f\x76\x65\x72\x6e\x6f\x72\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xab\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xac\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x66\x6f\x2e\x63\x6f\x6d\x2e\x62\x6f\x15\xae\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb0\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x63\x61\x72\x65\x65\x72\x73\x2e\x77\x65\x6d\x2e\x63\x61\x15\x07\x40\x76\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x40\x0a\x0b\x70\x61\x64\x2e\x62\x65\x6e\x6a\x2e\x63\x63\x15\x9d\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x72\x65\x6d\x6f\x6e\x74\x2e\x6e\x65\x74\x15\x07\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x04\x0a\x4d\x0a\x18\x64\x65\x73\x74\x69\x6e\x79\x2e\x77\x61\x79\x6c\x61\x6e\x64\x75\x6e\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x89\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x73\x61\x74\x36\x74\x65\x73\x74\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x2d\x41\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x67\x72\x70\x73\x2e\x6f\x72\x67\x15\xd0\x7b\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x64\x65\x72\x6e\x72\x75\x67\x73\x2e\x63\x6f\x6d\x15\xd6\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x64\x65\x72\x6e\x72\x75\x67\x73\x2e\x63\x6f\x6d\x15\xd4\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x0b\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x51\x0a\x1c\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\x0b\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xc7\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x74\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\x3f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x65\x63\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xeb\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x75\x70\x70\x6f\x72\x74\x2e\x6f\x74\x73\x65\x67\x6f\x70\x73\x2e\x6f\x72\x67\x15\x08\x31\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2d\x6c\x69\x62\x72\x61\x72\x79\x37\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x04\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x3c\x0a\x07\x62\x65\x6e\x6a\x2e\x63\x63\x15\x9e\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x76\x6f\x79\x61\x67\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x02\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xde\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x69\x70\x74\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xed\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x86\x04\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdc\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdd\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x56\x0a\x21\x73\x6a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x74\x65\x73\x74\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x81\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x68\x61\x76\x65\x6d\x6f\x6d\x65\x6e\x74\x75\x6d\x2e\x6f\x72\x67\x15\xee\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x61\x70\x70\x2e\x73\x65\x6e\x67\x6a\x6f\x6f\x2e\x63\x6f\x6d\x15\x31\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x86\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xc0\x81\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x69\x63\x65\x32\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x82\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x49\x0a\x14\x69\x63\x65\x32\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x83\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\x13\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x6c\x69\x65\x6e\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x83\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x6e\x73\x75\x72\x61\x77\x61\x72\x65\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x50\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xe3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x63\x66\x72\x6e\x61\x69\x63\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x15\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd1\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd0\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x4d\x0a\x18\x61\x63\x74\x69\x76\x69\x74\x79\x2e\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x2e\x63\x6f\x6d\x15\x19\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x77\x73\x77\x61\x66\x2e\x63\x6f\x6d\x70\x61\x73\x73\x73\x70\x71\x61\x2e\x63\x6f\x6d\x15\x18\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x36\x33\x30\x31\x37\x30\x35\x2d\x36\x37\x38\x34\x38\x62\x62\x36\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xba\xfe\xc2\x43\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x84\x01\x0a\x50\x0a\x1b\x67\x69\x67\x61\x73\x70\x61\x63\x65\x64\x73\x30\x31\x2e\x67\x73\x63\x6c\x75\x73\x74\x65\x72\x2e\x63\x6f\x6d\x15\x5a\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x4d\x0a\x18\x64\x6f\x65\x70\x6c\x61\x73\x6d\x61\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe1\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x98\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\xff\xff\x03\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\x93\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x72\x64\x65\x72\x2e\x6d\x61\x69\x7a\x65\x78\x2e\x63\x6f\x6d\x15\x36\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x87\x01\x0a\x45\x0a\x10\x70\x72\x74\x67\x2e\x39\x39\x74\x65\x63\x68\x73\x2e\x63\x6f\x6d\x15\x56\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x65\x6c\x70\x73\x2e\x75\x73\x15\x19\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x63\x65\x6e\x74\x65\x72\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x7e\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x77\x6d\x74\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x0a\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xb8\x01\x0a\x55\x0a\x20\x74\x65\x6d\x67\x61\x74\x65\x77\x61\x79\x2d\x74\x65\x73\x74\x2e\x6d\x79\x67\x75\x61\x72\x64\x69\x61\x6e\x63\x75\x2e\x63\x6f\x6d\x15\x27\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x69\x70\x61\x6c\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x20\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6a\x67\x6d\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\x24\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x79\x6f\x75\x72\x63\x61\x73\x65\x2e\x6d\x69\x6e\x73\x74\x65\x72\x6c\x61\x77\x2e\x63\x6f\x2e\x75\x6b\x15\x25\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xfd\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xfa\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x48\x0a\x13\x70\x62\x78\x2e\x63\x68\x61\x72\x74\x65\x72\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\xc5\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x69\x74\x64\x69\x72\x65\x63\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x93\x14\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x80\x08\x0a\x48\x0a\x13\x6d\x79\x63\x68\x61\x72\x74\x2e\x66\x68\x63\x6b\x7a\x6f\x6f\x2e\x63\x6f\x6d\x15\x89\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe1\xbc\x02\x0a\x4c\x0a\x17\x70\x72\x6f\x67\x72\x65\x73\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x69\x6e\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x11\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x63\x6f\x6c\x6c\x61\x62\x63\x61\x72\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x61\x66\x2e\x63\x2d\x74\x72\x61\x63\x65\x2e\x64\x65\x15\xb2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x75\x61\x74\x2e\x69\x6c\x61\x6e\x69\x72\x65\x73\x6f\x72\x74\x2e\x63\x6f\x6d\x15\xb3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x67\x73\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\xbe\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xb5\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xff\xff\x03\x0a\x4e\x0a\x19\x74\x72\x61\x76\x65\x6c\x61\x70\x70\x72\x6f\x76\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xac\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xad\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x62\x75\x79\x62\x61\x62\x79\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xab\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6f\x75\x74\x61\x67\x65\x6d\x61\x70\x2e\x61\x64\x61\x6d\x73\x65\x6c\x65\x63\x74\x72\x69\x63\x2e\x63\x6f\x6f\x70\x15\xb0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x70\x70\x62\x61\x73\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xb1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x48\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe1\xf3\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x49\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\xe1\xf3\x03\x0a\x6e\x0a\x39\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x69\x6e\x74\x65\x72\x61\x63\x74\x69\x6f\x6e\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x48\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x75\x74\x68\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x47\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x61\x6a\x66\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\x4c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x05\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xec\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x68\x6f\x74\x74\x75\x62\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x73\x2e\x63\x6f\x6d\x15\x3a\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x63\x61\x63\x74\x69\x2e\x62\x62\x73\x2e\x73\x66\x6a\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x72\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8c\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x71\x61\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x74\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6e\x65\x77\x61\x79\x67\x6f\x2e\x6e\x65\x74\x15\x85\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x04\x0a\x4a\x0a\x15\x63\x72\x6d\x2e\x73\x69\x6d\x70\x6c\x65\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x2e\x64\x6b\x15\xc2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6b\x68\x64\x63\x31\x32\x30\x37\x2e\x64\x6d\x63\x2e\x6f\x72\x67\x15\x22\x03\x8b\x9b\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\xc0\x85\x04\x0a\x46\x0a\x11\x72\x65\x70\x72\x65\x68\x65\x6e\x73\x69\x62\x6c\x65\x2e\x6e\x65\x74\x15\x46\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x81\x04\x0a\x54\x0a\x1f\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6d\x61\x64\x69\x73\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xe7\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x57\x0a\x22\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x72\x69\x6c\x6c\x69\x75\x6d\x61\x63\x61\x64\x65\x6d\x79\x2e\x75\x73\x15\xe6\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x69\x6e\x64\x69\x61\x6e\x61\x79\x6f\x75\x74\x68\x62\x61\x6c\x6c\x65\x74\x2e\x63\x6f\x6d\x15\x3a\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x55\x0a\x20\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x65\x61\x73\x74\x73\x68\x6f\x72\x65\x6c\x65\x61\x64\x65\x72\x73\x2e\x63\x6f\x6d\x15\xeb\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x55\x0a\x20\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6e\x65\x77\x73\x74\x61\x6e\x64\x61\x72\x64\x66\x6c\x69\x6e\x74\x2e\x6f\x72\x67\x15\xea\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x70\x73\x64\x6f\x77\x61\x67\x69\x61\x63\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x80\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x70\x73\x2e\x6c\x61\x6e\x73\x69\x6e\x67\x2e\x6e\x65\x78\x74\x65\x63\x68\x68\x69\x67\x68\x2e\x6f\x72\x67\x15\xcd\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5d\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5c\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5b\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x73\x63\x34\x2e\x65\x64\x75\x15\x12\x83\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x61\x72\x63\x68\x6d\x65\x6e\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x03\x27\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x61\x72\x63\x68\x6d\x65\x6e\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x04\x27\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x4c\x0a\x17\x6c\x69\x6e\x67\x75\x69\x73\x74\x69\x63\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x03\x0a\x4a\x0a\x15\x6c\x69\x62\x70\x72\x6f\x78\x79\x6d\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x61\x6c\x65\x72\x74\x75\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x61\x70\x70\x73\x32\x2e\x70\x68\x61\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xef\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x76\x69\x6c\x6c\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x15\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xbf\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xbe\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc1\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc0\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc3\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc2\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x4c\x0a\x17\x61\x73\x2d\x61\x72\x63\x68\x69\x76\x65\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x09\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc6\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x70\x64\x63\x62\x6f\x6f\x6b\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x54\xfd\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x6a\x6f\x62\x65\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x55\xfd\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x54\x0a\x1f\x76\x69\x73\x69\x74\x69\x6e\x67\x2d\x73\x63\x68\x6f\x6c\x61\x72\x73\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4b\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4a\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x47\xb7\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x61\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\x2e\x62\x72\x6f\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8d\x85\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x72\x75\x6c\x65\x33\x31\x35\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x63\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x65\x66\x69\x6c\x65\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x62\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xa9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x62\x61\x72\x66\x74\x62\x64\x73\x73\x2e\x67\x61\x62\x61\x72\x61\x64\x6d\x69\x73\x73\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x5f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x79\x68\x79\x75\x6e\x64\x61\x69\x66\x69\x6e\x61\x6e\x63\x65\x2e\x64\x65\x15\xa7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x6f\x63\x6b\x65\x74\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x61\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x67\x61\x62\x61\x72\x61\x64\x6d\x69\x73\x73\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x60\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x72\x73\x63\x74\x72\x61\x69\x6e\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x6d\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x74\x73\x73\x79\x73\x74\x65\x6d\x2e\x70\x6c\x15\x5a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x61\x79\x6d\x65\x6e\x74\x73\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x5d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa1\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x65\x76\x2d\x75\x70\x6c\x6f\x61\x64\x2e\x6b\x70\x6d\x70\x2e\x6f\x72\x67\x15\x17\x04\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x5b\x0a\x26\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x79\x72\x6f\x6e\x63\x65\x6e\x74\x65\x72\x63\x68\x61\x72\x74\x65\x72\x2e\x6f\x72\x67\x15\x65\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x6e\x73\x61\x75\x74\x68\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x73\x79\x6e\x73\x74\x6f\x72\x31\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x32\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x6f\x6f\x64\x6c\x65\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6e\x65\x74\x15\x67\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x63\x0a\x2e\x6d\x73\x2d\x72\x65\x70\x6f\x72\x74\x62\x75\x69\x6c\x64\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xb9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x78\x69\x73\x65\x61\x6c\x68\x61\x72\x6e\x65\x73\x73\x2e\x63\x6f\x6d\x15\xbb\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x70\x65\x6f\x70\x6c\x65\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\xb7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x64\x65\x70\x74\x61\x70\x70\x73\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x72\x65\x67\x69\x73\x74\x72\x79\x61\x70\x70\x73\x2e\x6e\x65\x74\x15\x0a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x68\x61\x74\x73\x6d\x79\x69\x70\x2e\x6f\x72\x67\x15\x3b\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xa0\x82\x08\x0a\x4a\x0a\x15\x65\x61\x6d\x63\x77\x65\x62\x33\x2e\x75\x73\x66\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x82\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x74\x68\x65\x63\x6f\x6d\x70\x6c\x65\x74\x65\x73\x6c\x65\x65\x70\x70\x72\x6f\x67\x72\x61\x6d\x2e\x63\x6f\x6d\x15\x0d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x37\x37\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xfa\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6c\x69\x73\x64\x2d\x75\x63\x6d\x31\x2d\x6d\x73\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\x7a\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x65\x78\x70\x63\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\x79\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfe\x01\x0a\x44\x0a\x0f\x73\x73\x70\x72\x2e\x63\x67\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x06\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x67\x6d\x73\x2e\x63\x67\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x04\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x73\x75\x70\x70\x6c\x69\x65\x72\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x6d\x6b\x76\x6d\x31\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x71\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x65\x76\x65\x6e\x74\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x31\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x59\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfa\x03\x0a\x47\x0a\x12\x77\x61\x69\x74\x6c\x69\x73\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x56\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xf0\x81\x01\x0a\x45\x0a\x10\x63\x73\x74\x61\x63\x6b\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x69\x6e\x73\x74\x61\x6c\x6c\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xdd\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x6b\x61\x74\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x6e\x65\x74\x15\xd5\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x50\x0a\x1b\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x64\x65\x74\x72\x6f\x69\x74\x6c\x75\x76\x2e\x63\x6f\x6d\x15\xd4\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd3\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x72\x65\x73\x65\x6c\x6c\x65\x72\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd2\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd9\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x54\x0a\x1f\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x73\x69\x6f\x6e\x64\x65\x74\x72\x6f\x69\x74\x2e\x6f\x72\x67\x15\xd8\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd7\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd6\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdb\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xda\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x63\x6d\x32\x72\x72\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf8\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x77\x61\x73\x74\x65\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x46\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x10\x0a\x4c\x0a\x17\x62\x6f\x72\x67\x2d\x72\x73\x74\x75\x64\x69\x6f\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x6f\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x03\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x77\x65\x62\x6d\x6f\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x6e\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x67\x6d\x73\x74\x73\x2e\x6f\x72\x67\x15\x0d\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x6d\x61\x69\x6c\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\x7d\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x7e\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x35\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x78\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x56\x0a\x21\x77\x77\x77\x2e\x64\x72\x68\x79\x64\x72\x6f\x76\x61\x63\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x81\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x14\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf4\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x72\x61\x63\x65\x66\x61\x63\x65\x2e\x63\x6f\x6d\x15\x0f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x73\x6c\x70\x72\x6f\x67\x72\x61\x6d\x66\x69\x6e\x64\x65\x72\x2e\x63\x6f\x6d\x15\x0d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xed\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x64\x73\x74\x65\x63\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x5c\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xe3\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x5a\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xe3\x01\x0a\x51\x0a\x1c\x6a\x75\x73\x74\x69\x63\x65\x77\x65\x62\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x12\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x65\x73\x6f\x75\x72\x63\x65\x73\x2e\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x2e\x63\x6f\x6d\x15\x13\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x67\x69\x67\x61\x73\x70\x61\x63\x65\x76\x6d\x30\x32\x2e\x67\x69\x67\x61\x73\x70\x61\x63\x65\x2e\x6e\x65\x74\x15\x57\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x76\x69\x65\x6e\x6e\x61\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb3\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x1a\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x62\x2e\x77\x65\x69\x73\x65\x72\x68\x6f\x73\x70\x69\x74\x61\x6c\x2e\x6f\x72\x67\x15\xa4\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\xa5\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x70\x6f\x77\x65\x72\x6e\x65\x74\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\x9f\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x74\x65\x73\x74\x2e\x63\x6f\x6d\x15\xa2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x63\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\xa0\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x74\x69\x6e\x74\x65\x6e\x74\x6f\x6e\x65\x72\x76\x65\x72\x73\x61\x6e\x64\x2e\x64\x65\x15\x19\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x75\x6d\x75\x6c\x75\x73\x6d\x65\x64\x69\x61\x2e\x63\x6f\x6d\x15\x18\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x1b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x61\x61\x73\x75\x70\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x1a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x65\x63\x6f\x6d\x6d\x65\x72\x63\x65\x2e\x70\x72\x69\x6e\x63\x65\x62\x75\x69\x6c\x64\x69\x6e\x67\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x14\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x6f\x67\x6e\x69\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x17\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x16\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x6f\x62\x61\x6c\x74\x2d\x64\x65\x76\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x73\x65\x65\x6c\x69\x76\x65\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\x1c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x64\x65\x6e\x74\x2d\x62\x69\x6f\x70\x73\x79\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe1\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6c\x65\x61\x72\x6e\x69\x6e\x67\x73\x70\x61\x63\x65\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x30\xc6\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x84\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xaf\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x73\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x6c\x69\x76\x6f\x6e\x69\x61\x70\x75\x62\x6c\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x02\xea\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x02\x0a\x41\x0a\x0c\x76\x69\x73\x2d\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xe7\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xac\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x67\x72\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe8\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x77\x6f\x72\x6c\x64\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x77\x6f\x72\x6c\x64\x74\x72\x61\x76\x65\x6c\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x91\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x8f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x69\x6e\x74\x65\x6c\x2e\x66\x6f\x6f\x64\x62\x75\x79\x2e\x63\x6f\x6d\x15\x8e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x6f\x72\x74\x61\x6c\x2e\x72\x6b\x6d\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\x8d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x4d\x79\x43\x68\x61\x72\x74\x54\x65\x73\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x42\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x95\xff\x02\x0a\x4a\x0a\x15\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x63\x6c\x6f\x75\x64\x6c\x61\x62\x2e\x6e\x65\x74\x15\x94\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x33\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x38\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x50\x0a\x1b\x32\x30\x31\x39\x2e\x61\x6e\x6e\x75\x61\x6c\x72\x65\x70\x6f\x72\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x39\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x66\x69\x6c\x65\x73\x2e\x65\x6d\x70\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x15\x8c\xd2\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x66\x6c\x69\x6e\x74\x72\x65\x67\x69\x73\x74\x72\x79\x2e\x63\x74\x73\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x01\x0a\x4b\x0a\x16\x6b\x6a\x6c\x65\x61\x63\x68\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa2\x6a\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf0\x02\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x45\x0a\x10\x66\x72\x61\x6e\x6b\x6c\x69\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x41\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x5b\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xff\xff\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x6d\x6f\x6c\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xe8\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6b\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x5d\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x5c\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x77\x65\x62\x63\x70\x61\x63\x73\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x1c\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x6e\x7a\x69\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x62\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x45\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x61\x79\x6d\x65\x6e\x74\x73\x2e\x69\x63\x70\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x99\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe6\x19\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x75\x6d\x70\x68\x6f\x74\x6f\x2d\x70\x6f\x72\x74\x61\x6c\x73\x2e\x70\x68\x6f\x74\x6f\x73\x2e\x6e\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7c\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x68\x70\x73\x76\x69\x6b\x69\x6e\x67\x73\x2e\x6f\x72\x67\x15\x47\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x70\x68\x6f\x74\x6f\x73\x2e\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x72\x68\x69\x6e\x6f\x72\x65\x61\x6c\x74\x79\x2e\x63\x6f\x6d\x15\x28\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\xc0\x87\x01\x0a\x4a\x0a\x15\x6d\x65\x74\x6c\x69\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x6e\x65\x75\x72\x6f\x64\x65\x67\x65\x6e\x65\x72\x61\x74\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x63\x69\x2e\x63\x6f\x6d\x15\x6e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x61\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xec\x01\x0a\x4b\x0a\x16\x65\x65\x63\x73\x34\x39\x30\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x61\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x43\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x74\x75\x73\x2e\x69\x74\x73\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x91\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x79\x76\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x65\x6f\x74\x74\x61\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe2\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x41\x0a\x0c\x6d\x6f\x6e\x72\x6f\x65\x69\x73\x64\x2e\x75\x73\x15\xdb\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\xf0\xf2\x01\x0a\x44\x0a\x0f\x6d\x69\x62\x61\x62\x79\x61\x6e\x64\x75\x73\x2e\x63\x6f\x6d\x15\xe3\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x76\x65\x63\x74\x6f\x72\x74\x6f\x6f\x6c\x2e\x63\x6f\x6d\x15\x9f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x33\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x58\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x8b\x01\x0a\x44\x0a\x0f\x75\x70\x6c\x6f\x61\x64\x2e\x6b\x70\x6d\x70\x2e\x6f\x72\x67\x15\x13\x04\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x98\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x61\x72\x74\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\x57\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x61\x69\x6c\x2e\x61\x75\x74\x68\x6f\x72\x61\x63\x61\x64\x65\x6d\x79\x70\x72\x6f\x2e\x63\x6f\x6d\x15\x56\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6f\x73\x2e\x62\x75\x69\x6c\x64\x61\x6d\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x4c\xd7\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x84\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x6f\x71\x75\x69\x6c\x6c\x65\x74\x72\x69\x62\x65\x2e\x6f\x72\x67\x15\x9a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4f\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4e\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xec\x01\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x18\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4b\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4c\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xec\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xc4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x77\x70\x79\x2d\x65\x6e\x74\x72\x79\x2e\x63\x6f\x6d\x15\xc2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xc3\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xc1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x79\x72\x69\x6f\x6e\x2e\x73\x65\x63\x75\x72\x69\x63\x6f\x72\x65\x2e\x63\x61\x15\xbf\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x6f\x6c\x61\x72\x34\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe8\x3a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x6f\x62\x69\x2e\x61\x6c\x6d\x61\x69\x6c\x65\x6d\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x37\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xc7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6a\x75\x70\x79\x74\x65\x72\x68\x75\x62\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xee\x01\x0a\x42\x0a\x0d\x68\x6f\x70\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x98\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x66\x65\x6e\x69\x78\x78\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x97\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x76\x65\x6e\x74\x72\x69\x63\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x9a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x74\x6e\x6d\x2e\x6a\x63\x6f\x66\x66\x65\x79\x2e\x63\x6f\x2e\x75\x6b\x15\xdc\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xe1\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x75\x73\x79\x73\x70\x72\x64\x37\x30\x32\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdc\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x76\x69\x76\x61\x74\x72\x61\x63\x6b\x65\x72\x2e\x63\x6f\x6d\x15\x9e\xd6\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x84\x04\x0a\x49\x0a\x14\x67\x65\x6e\x6f\x6d\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x03\x0a\x47\x0a\x12\x62\x72\x74\x2e\x64\x61\x6e\x67\x6d\x75\x63\x68\x65\x6e\x2e\x63\x6f\x6d\x15\x2e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x33\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x2f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x72\x73\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x6d\x15\x29\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x73\x75\x72\x76\x2e\x6a\x6f\x63\x61\x72\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\x30\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x65\x61\x6b\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x0d\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x68\x75\x62\x62\x6c\x65\x2e\x70\x6c\x61\x6e\x74\x62\x69\x6f\x6c\x6f\x67\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0a\xc4\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6b\x65\x65\x6c\x65\x72\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x77\x6f\x72\x6b\x73\x2d\x64\x65\x73\x69\x67\x6e\x2e\x63\x6f\x6d\x15\x89\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x61\x69\x72\x70\x61\x72\x6b\x2e\x6f\x6e\x65\x15\x88\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x87\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x86\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x7a\x6f\x72\x67\x7a\x61\x61\x6d\x2e\x6e\x6c\x15\x85\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x7a\x65\x6b\x75\x72\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x84\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x75\x6e\x69\x76\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x83\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x68\x79\x6d\x6e\x61\x72\x79\x2e\x6f\x72\x67\x15\x1f\x87\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xfb\x03\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x77\x61\x74\x65\x72\x2d\x73\x6f\x66\x74\x65\x6e\x65\x72\x73\x2d\x66\x69\x6c\x74\x65\x72\x73\x2e\x63\x6f\x6d\x15\xc6\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x70\x73\x75\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x37\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xc2\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x6c\x73\x32\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa8\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x65\x73\x74\x2e\x64\x72\x6f\x77\x6e\x61\x74\x74\x61\x63\x6b\x2e\x63\x6f\x6d\x15\x28\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x28\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x70\x69\x67\x77\x2d\x74\x73\x74\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6b\xc7\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x6c\x79\x6e\x63\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x11\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x84\x04\x0a\x4c\x0a\x17\x70\x73\x2e\x68\x6f\x6c\x6c\x61\x6e\x64\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\x54\x3b\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xe7\xf3\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xdc\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x25\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x69\x6b\x69\x68\x6f\x73\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x7a\x69\x79\x61\x6e\x67\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x67\x72\x61\x64\x65\x72\x32\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x26\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x21\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x23\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x61\x6d\x70\x75\x73\x63\x61\x6c\x6c\x64\x65\x76\x2e\x75\x61\x64\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1a\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x24\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x66\x75\x73\x65\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x31\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe3\x01\x0a\x4a\x0a\x15\x69\x6e\x66\x6f\x67\x70\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x30\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe3\x01\x0a\x44\x0a\x0f\x73\x62\x32\x2e\x64\x65\x6d\x6d\x61\x70\x73\x2e\x6f\x72\x67\x15\x84\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6c\x71\x63\x6f\x6e\x6e\x65\x63\x74\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x7a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2f\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xe3\x01\x0a\x47\x0a\x12\x67\x72\x65\x67\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2e\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xe3\x01\x0a\x49\x0a\x14\x63\x6c\x6f\x75\x64\x2e\x67\x62\x63\x61\x6d\x70\x62\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x28\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x75\x6e\x69\x6f\x6e\x73\x2e\x6d\x61\x6e\x70\x6f\x77\x65\x72\x2e\x67\x6f\x76\x2e\x65\x67\x15\x7c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x66\x69\x72\x65\x77\x61\x6c\x6c\x2e\x63\x68\x61\x72\x6c\x6f\x74\x74\x65\x6e\x65\x74\x2e\x6f\x72\x67\x15\x7e\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x01\x0a\x4d\x0a\x18\x6c\x71\x61\x63\x6c\x74\x65\x73\x74\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x65\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x72\x63\x68\x69\x76\x65\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x2e\x6a\x70\x15\x2e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x61\x6c\x6c\x65\x2d\x73\x63\x68\x77\x61\x72\x7a\x2e\x64\x65\x15\x32\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x74\x65\x6d\x67\x61\x74\x65\x77\x61\x79\x2d\x70\x72\x6f\x64\x2e\x6d\x79\x67\x75\x61\x72\x64\x69\x61\x6e\x63\x75\x2e\x63\x6f\x6d\x15\x33\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x36\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\x38\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x64\x67\x63\x61\x2e\x67\x6f\x76\x2e\x6b\x77\x15\x3b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x62\x67\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x28\x00\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x6d\x61\x69\x6c\x2e\x67\x62\x63\x73\x2e\x6f\x72\x67\x15\x0d\xb8\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x77\x69\x6b\x69\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc2\x68\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x72\x72\x6e\x64\x62\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x74\x70\x63\x2e\x65\x64\x75\x15\x2a\x01\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x65\x63\x79\x63\x6c\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x30\x33\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x73\x6d\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\xed\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x32\x30\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xec\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x39\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xeb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x65\x62\x68\x6f\x6f\x6b\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x05\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x02\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x6f\x6b\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x03\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x6c\x6f\x75\x64\x2e\x74\x72\x67\x2e\x6d\x65\x64\x69\x61\x15\x09\xb6\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x63\x68\x61\x72\x74\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x77\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x96\xbf\x02\x0a\x47\x0a\x12\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x74\x64\x64\x65\x6d\x6f\x2e\x68\x75\x15\xee\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x70\x0a\x3b\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x61\x64\x6d\x69\x6e\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x97\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x6d\x73\x2d\x65\x6d\x61\x69\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x99\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x6d\x73\x2d\x65\x6e\x72\x6f\x6c\x6c\x6d\x65\x6e\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x9b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x68\x65\x72\x69\x66\x66\x73\x61\x6c\x65\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x9c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x63\x0a\x2e\x6d\x73\x2d\x64\x69\x67\x69\x74\x61\x6c\x72\x69\x67\x68\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x9d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x9f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x29\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x47\x0a\x12\x6d\x67\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x15\x4f\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x72\x65\x73\x2e\x65\x6d\x6f\x6c\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xe4\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x70\x73\x70\x61\x79\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\xdc\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x63\x68\x61\x72\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x63\x6f\x6d\x15\xdd\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x70\x61\x72\x74\x6e\x65\x72\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x6d\x69\x2e\x63\x6f\x6d\x15\xde\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x52\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x88\x10\x0a\x4a\x0a\x15\x73\x66\x77\x2e\x61\x65\x72\x6f\x73\x70\x61\x63\x65\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x4c\x51\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x63\x77\x2e\x73\x74\x68\x6f\x73\x74\x73\x2e\x6e\x65\x74\x15\x4d\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfb\x03\x0a\x49\x0a\x14\x72\x61\x76\x70\x6e\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\x80\x02\x0a\x49\x0a\x14\x72\x61\x76\x70\x6e\x33\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x80\x02\x0a\x48\x0a\x13\x77\x77\x77\x2e\x66\x75\x74\x75\x72\x65\x61\x72\x63\x68\x73\x2e\x6f\x72\x67\x15\xe0\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x63\x61\x64\x65\x6d\x69\x63\x70\x72\x6f\x66\x69\x6c\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x61\x64\x64\x76\x61\x6e\x74\x61\x67\x65\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\xa9\xbc\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x6c\x72\x63\x65\x72\x65\x62\x72\x6f\x2e\x6d\x6c\x6c\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe8\xa9\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x61\x70\x70\x73\x74\x6f\x72\x65\x2e\x63\x6f\x6d\x15\x23\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe0\x87\x01\x0a\x46\x0a\x11\x77\x65\x63\x61\x72\x65\x61\x64\x76\x69\x73\x6f\x72\x2e\x6f\x72\x67\x15\x15\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x3f\x0a\x0a\x6d\x6f\x74\x68\x75\x72\x2e\x6f\x72\x67\x15\x16\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x77\x77\x77\x2e\x76\x69\x65\x77\x62\x69\x71\x75\x69\x74\x79\x65\x67\x2e\x75\x73\x15\x3c\x1f\xf2\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x69\x70\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc5\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x72\x6f\x61\x64\x6d\x61\x70\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x72\x6f\x61\x64\x6d\x61\x70\x2d\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6a\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x62\x65\x74\x61\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\xd6\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xd9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\xd5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x65\x78\x64\x65\x76\x2e\x68\x65\x61\x6c\x74\x68\x74\x72\x75\x73\x74\x65\x75\x72\x6f\x70\x65\x2e\x63\x6f\x6d\x15\xd4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xdb\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x6f\x6d\x63\x61\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0f\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\x99\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x7e\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x34\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x5c\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x4e\x0a\x19\x6d\x79\x63\x68\x61\x72\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\x66\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xe8\xbc\x02\x0a\x4e\x0a\x19\x69\x6e\x74\x2d\x65\x6e\x77\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x92\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x68\x6f\x73\x74\x65\x64\x66\x61\x78\x2e\x63\x6f\x6d\x15\x93\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x75\x70\x65\x72\x69\x63\x65\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x60\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x73\x75\x70\x65\x72\x69\x63\x65\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x61\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x6c\x6f\x67\x69\x6e\x2e\x76\x61\x6e\x74\x72\x65\x65\x2e\x63\x6f\x6d\x15\x8e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x31\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4a\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x95\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x32\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4b\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x6d\x6b\x76\x6d\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x24\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x6d\x61\x6e\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x25\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x31\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x69\x64\x70\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x9f\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x68\x6f\x6b\x69\x77\x69\x6b\x69\x70\x65\x64\x2e\x6e\x65\x74\x15\x9f\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0c\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0d\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0e\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2e\x72\x65\x6e\x61\x69\x73\x73\x61\x6e\x63\x65\x70\x73\x61\x2e\x63\x6f\x6d\x15\x43\x7b\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x1b\xa9\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x62\x73\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x2e\x6b\x72\x15\x78\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x2d\x6f\x6e\x79\x78\x39\x39\x38\x2d\x77\x61\x66\x2e\x64\x65\x67\x2e\x72\x65\x64\x15\xe6\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x27\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x6f\x72\x6c\x65\x61\x6e\x73\x74\x6f\x77\x65\x72\x2e\x63\x6f\x6d\x15\xec\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6f\x6e\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xed\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x69\x2e\x62\x63\x63\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x4c\x97\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x67\x6f\x6f\x64\x79\x65\x61\x72\x2e\x68\x6b\x15\x36\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x78\x65\x6e\x61\x70\x70\x64\x65\x76\x2d\x73\x66\x30\x31\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x63\x75\x74\x63\x6f\x76\x61\x75\x6c\x74\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\x3a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x74\x73\x75\x6d\x76\x70\x6e\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x46\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xff\x0f\x0a\x54\x0a\x1f\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x73\x6d\x74\x64\x2d\x77\x77\x77\x32\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x64\x69\x6a\x6b\x73\x74\x72\x61\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x0d\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xa6\x80\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x0c\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x49\x0a\x14\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x7a\x65\x6b\x75\x72\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x7c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x7a\x6f\x72\x67\x7a\x61\x61\x6d\x2e\x6e\x6c\x15\x7d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x7e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x69\x7a\x61\x2e\x6e\x6c\x15\x7f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x2e\x62\x65\x77\x75\x7a\x74\x2e\x6e\x6c\x15\x78\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x79\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x75\x6e\x69\x76\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x7b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x62\x65\x77\x75\x7a\x74\x2e\x6e\x6c\x15\x80\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x81\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x0e\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf4\x01\x0a\x4a\x0a\x15\x70\x73\x75\x6d\x30\x36\x2d\x31\x30\x30\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x3f\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xe3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x03\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xfc\xff\x0f\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x77\x69\x7a\x61\x72\x64\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x04\x10\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x04\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xd0\x07\x28\xfc\xff\x0f\x0a\x49\x0a\x14\x67\x61\x74\x65\x77\x61\x79\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x94\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x65\x6e\x64\x70\x6c\x61\x79\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x6e\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x68\x70\x73\x6b\x31\x32\x2e\x6e\x65\x74\x15\xd0\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0d\x63\x61\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xd0\x80\x02\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6b\x61\x74\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6e\x65\x74\x15\x94\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x65\x6c\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x69\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x65\x62\x6d\x61\x69\x6c\x2e\x61\x62\x69\x73\x6e\x79\x2e\x70\x65\x6f\x70\x6c\x65\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x73\x70\x65\x65\x64\x74\x65\x73\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x0f\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x67\x72\x6f\x75\x70\x73\x2d\x65\x78\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf6\x01\x0a\x46\x0a\x11\x6d\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\xdd\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x65\x65\x63\x73\x34\x38\x39\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9c\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe1\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfb\x03\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9b\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xec\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x73\x74\x61\x67\x69\x6e\x67\x2e\x62\x65\x74\x61\x2e\x61\x6c\x75\x6d\x6e\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8c\x01\x0a\x42\x0a\x0d\x65\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x65\x63\x73\x65\x6c\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x91\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x76\x69\x73\x69\x6f\x6e\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd8\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x77\x65\x62\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd6\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x34\x32\x31\x38\x38\x39\x39\x2d\x38\x36\x35\x61\x32\x35\x66\x61\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xd7\xfc\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x84\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x69\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd3\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x75\x64\x64\x61\x74\x68\x2e\x63\x6f\x6d\x15\x83\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6b\x65\x6c\x6c\x65\x79\x62\x72\x6f\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x36\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x85\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x82\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x88\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x86\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8a\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x65\x72\x6f\x65\x6d\x62\x65\x64\x64\x65\x64\x2e\x63\x6f\x6d\x15\xa5\xbf\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x73\x69\x70\x72\x65\x63\x6f\x72\x64\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x2f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x72\x61\x69\x6c\x74\x61\x6b\x65\x72\x2e\x63\x6f\x6d\x15\xa2\xbf\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x2d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x74\x61\x6d\x6b\x61\x61\x72\x74\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\x2c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x31\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x68\x71\x2d\x70\x61\x74\x72\x6f\x6e\x65\x6e\x2e\x61\x74\x15\x30\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x61\x64\x73\x65\x6c\x66\x73\x65\x72\x76\x69\x63\x65\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\xaf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x68\x6b\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x70\x61\x74\x69\x65\x6e\x74\x63\x6f\x6e\x6e\x65\x63\x74\x33\x36\x35\x2e\x63\x6f\x6d\x15\xe1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xe2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x76\x6f\x6c\x75\x6e\x74\x65\x65\x72\x73\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x6a\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x61\x66\x31\x32\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdd\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x33\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xde\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x34\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x73\x2d\x64\x65\x76\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\xe4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x07\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x65\x6c\x66\x73\x65\x72\x76\x69\x63\x65\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x06\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x61\x74\x61\x6c\x6f\x67\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xc1\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x5c\x0a\x27\x30\x2d\x73\x65\x61\x72\x63\x68\x2e\x70\x72\x6f\x71\x75\x65\x73\x74\x2e\x63\x6f\x6d\x2e\x63\x61\x74\x61\x6c\x6f\x67\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xc2\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x6e\x67\x69\x6e\x78\x2e\x65\x68\x72\x6d\x65\x64\x62\x69\x6c\x6c\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xdd\xd6\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x70\x68\x65\x6e\x6f\x6d\x65\x31\x30\x6b\x2e\x6f\x72\x67\x15\x09\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x6d\x73\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\x08\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6f\x6d\x73\x71\x61\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x54\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x65\x62\x2d\x6d\x77\x30\x31\x2d\x74\x65\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x56\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x65\x62\x2d\x6d\x77\x30\x32\x2d\x74\x65\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x57\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x65\x73\x74\x2e\x77\x61\x65\x70\x61\x2e\x6f\x72\x67\x15\x50\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x51\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x52\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x59\x0a\x24\x63\x66\x70\x63\x61\x2d\x77\x65\x62\x63\x68\x65\x63\x6b\x6f\x75\x74\x2e\x66\x69\x6e\x65\x61\x72\x74\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4f\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x69\x6f\x74\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1d\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x6e\x63\x65\x6e\x74\x72\x61\x6c\x2e\x6a\x64\x63\x74\x65\x6b\x2e\x63\x6f\x6d\x15\x9e\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x61\x70\x70\x62\x61\x73\x65\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xb7\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x68\x65\x63\x6b\x69\x6e\x2e\x6f\x68\x65\x61\x2e\x6f\x72\x67\x15\xb6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x70\x72\x6f\x63\x65\x73\x73\x69\x6e\x67\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xba\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\xb9\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6c\x61\x6e\x64\x72\x65\x63\x6f\x72\x64\x73\x70\x61\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xb8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6f\x70\x65\x6e\x6a\x65\x72\x69\x63\x68\x6f\x2e\x63\x6f\x6d\x15\xfa\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\xe0\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x63\x70\x61\x6e\x65\x6c\x2e\x63\x68\x69\x63\x61\x67\x6f\x6c\x61\x6e\x64\x64\x61\x72\x74\x65\x72\x73\x2e\x63\x6f\x6d\x15\x92\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x62\x72\x69\x67\x68\x74\x73\x69\x64\x65\x61\x63\x61\x64\x65\x6d\x79\x2e\x63\x6f\x6d\x15\x4d\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x8c\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xd5\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x62\x72\x69\x67\x68\x74\x73\x69\x64\x65\x6f\x68\x69\x6f\x2e\x63\x6f\x6d\x15\x4e\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x95\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x94\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x76\x77\x67\x69\x77\x65\x62\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x69\x65\x15\xe5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x69\x73\x74\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x1e\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x19\x6d\x61\x69\x6c\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x45\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf2\xff\x07\x0a\x41\x0a\x0c\x74\x61\x70\x70\x65\x72\x69\x65\x74\x2e\x6e\x75\x15\xe3\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x73\x65\x63\x75\x72\x69\x74\x79\x2d\x6c\x61\x62\x2e\x69\x74\x15\xe2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\xdf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\xb6\x38\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xe3\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x71\x61\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x64\x65\x72\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xad\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xb3\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x65\x78\x74\x68\x72\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xcc\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x39\x36\x31\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xca\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x6f\x6e\x72\x6f\x65\x69\x73\x64\x2e\x75\x73\x15\xe7\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xf0\xf2\x01\x0a\x47\x0a\x12\x66\x72\x65\x65\x64\x6f\x6d\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xd0\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x72\x6b\x74\x70\x6f\x73\x69\x74\x69\x65\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x70\x70\x73\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x65\x64\x63\x61\x70\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x99\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x63\x61\x64\x72\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x6d\x61\x74\x72\x69\x78\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x86\x80\x01\x0a\x4c\x0a\x17\x77\x69\x72\x65\x6c\x65\x73\x73\x6c\x6f\x67\x69\x6e\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x94\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x87\x01\x0a\x5a\x0a\x25\x62\x65\x61\x74\x73\x6f\x6e\x63\x61\x6e\x63\x65\x72\x63\x68\x61\x72\x69\x74\x79\x2e\x65\x71\x75\x61\x74\x6f\x72\x2d\x74\x65\x73\x74\x2e\x63\x6f\x6d\x15\x86\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x72\x6f\x76\x69\x64\x65\x72\x73\x2e\x69\x72\x68\x63\x2e\x63\x6f\x6d\x15\x8a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x65\x74\x6c\x61\x62\x2e\x70\x63\x63\x73\x6b\x31\x32\x2e\x63\x6f\x6d\x15\x29\xc7\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\xa8\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x64\x61\x72\x6b\x6c\x61\x62\x2e\x63\x6f\x15\xcf\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xcb\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x72\x65\x64\x69\x72\x65\x63\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x6d\x61\x72\x6b\x74\x70\x6f\x73\x69\x74\x69\x65\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\x0b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x6f\x6e\x6e\x65\x63\x74\x73\x70\x2e\x63\x6f\x6d\x15\xd1\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xd0\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x1e\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa7\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x64\x61\x74\x61\x2e\x6e\x68\x6d\x2e\x61\x63\x2e\x75\x6b\x15\x3e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x72\x6d\x68\x62\x69\x67\x62\x61\x73\x73\x2e\x63\x6f\x6d\x15\x3f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x3d\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xcf\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x74\x2e\x61\x74\x68\x65\x6e\x61\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x42\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x6c\x73\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x41\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\x44\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xdd\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xde\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xdf\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xb3\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x70\x6c\x65\x79\x73\x2e\x63\x6f\x6d\x15\x72\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x11\x69\x6e\x74\x72\x61\x6e\x65\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x79\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x9f\x75\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xe3\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x65\x73\x73\x2e\x61\x63\x74\x69\x76\x65\x73\x74\x65\x70\x2e\x6f\x72\x67\x15\x7d\xda\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x0b\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xe0\x87\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4c\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x15\x6e\x65\x74\x77\x6f\x72\x6b\x61\x63\x63\x65\x73\x73\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x1f\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x7a\x0a\x41\x0a\x0c\x76\x32\x6d\x73\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x86\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe6\xf3\x03\x0a\x45\x0a\x10\x62\x73\x73\x62\x70\x72\x6f\x64\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1f\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x62\x73\x73\x62\x74\x65\x73\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x24\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x7a\x75\x65\x72\x63\x68\x65\x72\x70\x6f\x72\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x16\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x7a\x75\x65\x72\x63\x68\x65\x72\x70\x6f\x72\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x15\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x50\x0a\x1b\x64\x61\x76\x6d\x61\x69\x6c\x2e\x77\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x17\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x6f\x72\x74\x61\x6c\x31\x2d\x67\x65\x6f\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x3d\x54\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x88\x10\x0a\x4e\x0a\x19\x6c\x69\x6d\x6f\x73\x75\x72\x76\x65\x79\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xab\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6e\x6f\x76\x6f\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xc1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x37\x38\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xfa\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x15\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x7a\x70\x65\x6e\x2e\x69\x6e\x66\x6f\x15\xbd\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x0d\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x70\x72\x6f\x6a\x65\x63\x74\x73\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x2d\xac\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x0e\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x61\x69\x63\x63\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x6a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x68\x69\x74\x73\x2e\x73\x69\x64\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\x6d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xd4\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x70\x62\x78\x2e\x62\x65\x6e\x6a\x2e\x63\x63\x15\x94\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x74\x65\x6e\x66\x6f\x72\x65\x2e\x6e\x65\x74\x15\x4d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x63\x6f\x6d\x15\x4a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x75\x61\x74\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x46\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x65\x73\x65\x61\x72\x63\x68\x69\x64\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xda\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x64\x61\x6d\x73\x67\x75\x69\x74\x61\x72\x2e\x65\x72\x72\x61\x6e\x74\x6e\x65\x74\x2e\x63\x6f\x6d\x15\x85\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1e\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\xfd\x01\x0a\x5a\x0a\x25\x73\x6d\x74\x64\x2d\x73\x63\x68\x65\x64\x75\x6c\x69\x6e\x67\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd9\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x22\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x74\x70\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x24\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x25\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x22\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x6e\x74\x2d\x72\x70\x73\x2d\x65\x6d\x70\x6c\x6f\x79\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x26\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8f\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x73\x74\x61\x67\x69\x6e\x67\x2d\x73\x74\x73\x73\x65\x72\x76\x69\x63\x65\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x27\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x77\x72\x2e\x63\x73\x72\x65\x64\x68\x61\x77\x6b\x73\x2e\x6f\x72\x67\x15\xb9\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x10\x74\x65\x61\x63\x68\x2e\x61\x6c\x62\x69\x6f\x6e\x2e\x65\x64\x75\x15\x8a\x0b\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4b\x0a\x16\x73\x74\x72\x65\x61\x6d\x69\x6e\x67\x2e\x77\x6b\x61\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x11\xe8\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x73\x6d\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\xd3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x32\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x34\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x33\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x36\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x35\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x38\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x37\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x30\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x39\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xda\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x35\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xed\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5c\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x73\x61\x62\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x08\x0a\x55\x0a\x20\x65\x64\x75\x63\x61\x74\x69\x6f\x6e\x2d\x73\x74\x61\x67\x69\x6e\x67\x31\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5b\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x73\x36\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x37\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xef\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x63\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x62\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x67\x61\x6c\x61\x78\x79\x2e\x70\x68\x79\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xa4\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfb\x03\x0a\x40\x0a\x0b\x71\x2e\x6f\x77\x6f\x2e\x61\x63\x2e\x63\x6e\x15\x5a\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\xd4\x03\x28\x80\xf3\x01\x0a\x48\x0a\x13\x76\x62\x2d\x6f\x74\x2d\x74\x73\x74\x2d\x61\x6d\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x5f\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6c\x61\x62\x65\x6c\x2e\x6d\x62\x6e\x69\x2e\x6f\x72\x67\x15\x2c\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x48\x0a\x13\x72\x61\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x40\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x80\x02\x0a\x48\x0a\x13\x72\x61\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x73\x75\x70\x65\x72\x73\x73\x6c\x2e\x69\x6e\x66\x6f\x15\xc5\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x73\x61\x6c\x61\x64\x6d\x6f\x6e\x65\x79\x2e\x63\x6f\x2e\x75\x6b\x15\xbe\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x63\x63\x2d\x74\x61\x62\x6c\x65\x61\x75\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xc0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x6f\x72\x65\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x73\x65\x6c\x66\x73\x65\x72\x76\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\xc6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x67\x69\x73\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\xc7\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8e\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x32\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xf2\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x61\x64\x72\x69\x61\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x28\xa1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x9a\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x99\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x01\x0a\x54\x0a\x1f\x73\x75\x70\x65\x72\x6d\x6f\x6e\x2d\x30\x31\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x73\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\x8a\x01\x0a\x48\x0a\x13\x63\x6c\x6f\x75\x64\x2e\x61\x7a\x6f\x6e\x63\x6f\x6c\x6f\x72\x2e\x63\x6f\x6d\x15\xfe\xbd\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd1\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8e\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8c\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8d\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x74\x67\x2e\x73\x74\x6f\x65\x74\x65\x72\x61\x75\x2e\x75\x73\x15\xec\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xe9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x65\x73\x75\x69\x74\x65\x2e\x63\x69\x74\x79\x6f\x66\x7a\x61\x63\x68\x61\x72\x79\x2e\x6f\x72\x67\x15\xe6\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x61\x61\x73\x2e\x61\x7a\x2e\x62\x77\x61\x70\x70\x2e\x6c\x6b\x73\x63\x64\x2e\x63\x6f\x6d\x15\xe7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x66\x6c\x65\x65\x74\x62\x72\x61\x6b\x65\x2e\x63\x6f\x6d\x15\x10\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfe\x03\x0a\x51\x0a\x1c\x64\x61\x74\x61\x73\x65\x74\x63\x61\x74\x61\x6c\x6f\x67\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x61\x6e\x64\x65\x76\x6c\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x63\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x70\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x80\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xa8\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x40\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x42\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x70\x61\x72\x65\x6e\x74\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xe9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x70\x61\x70\x65\x72\x63\x75\x74\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xe8\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x62\x6f\x6d\x67\x61\x72\x2e\x6d\x69\x64\x6c\x61\x6e\x64\x70\x73\x2e\x6f\x72\x67\x15\x2a\x0d\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6d\x79\x67\x69\x6e\x75\x74\x72\x69\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\xce\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x74\x63\x77\x73\x73\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\xed\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x79\x73\x74\x65\x6d\x2e\x73\x6b\x6f\x75\x67\x72\x75\x70\x70\x65\x6e\x2e\x64\x6b\x15\xea\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xee\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x68\x61\x74\x2d\x74\x65\x73\x74\x69\x6e\x67\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x66\x77\x2d\x64\x65\x6e\x74\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x80\x02\x0a\x4c\x0a\x17\x66\x77\x2d\x64\x65\x6e\x74\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\x82\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x77\x65\x62\x36\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xab\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x70\x6f\x6b\x65\x72\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x7a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6e\x65\x69\x6c\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x78\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x61\x74\x65\x72\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1a\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xa0\x04\x0a\x4b\x0a\x16\x73\x74\x75\x64\x65\x6e\x74\x73\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x14\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\x7c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x67\x72\x61\x79\x6c\x6f\x67\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x16\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xa0\x04\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1a\x08\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x61\x70\x69\x74\x65\x73\x74\x2e\x64\x65\x6d\x6f\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xe7\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x70\x6c\x73\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x0e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x64\x65\x61\x72\x62\x6f\x72\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x2c\x5e\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x73\x74\x61\x67\x69\x6e\x67\x2e\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\x30\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x73\x74\x61\x67\x69\x6e\x67\x2e\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x15\x31\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x65\x69\x7a\x65\x74\x68\x65\x61\x77\x6b\x77\x61\x72\x64\x2e\x6f\x72\x67\x15\x2f\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x15\x2d\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x64\x63\x6f\x75\x6e\x63\x69\x6c\x2e\x6f\x72\x67\x15\x2a\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x15\x2b\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xde\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x03\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xec\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0e\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0f\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x86\x04\x0a\x49\x0a\x14\x73\x74\x61\x6d\x6b\x61\x61\x72\x74\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd6\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6e\x76\x6d\x6f\x6e\x6c\x69\x6e\x65\x62\x69\x65\x64\x65\x6e\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x77\x77\x77\x2e\x71\x61\x31\x2e\x69\x6f\x15\xda\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x62\x6f\x72\x67\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x44\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x81\x04\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x68\x65\x61\x64\x31\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x45\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x80\x03\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc5\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x67\x6f\x76\x15\xe0\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x75\x61\x73\x61\x70\x69\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd8\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\xb8\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x79\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x7c\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\x8e\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x73\x74\x61\x67\x65\x32\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x63\x6f\x2e\x6a\x70\x15\x84\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\x9c\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x64\x62\x61\x63\x69\x2e\x69\x71\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x65\x64\x63\x61\x70\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xfc\xfd\x07\x0a\x4f\x0a\x1a\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\x6c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x65\x62\x61\x70\x70\x73\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x6d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x70\x6f\x72\x74\x61\x6c\x2e\x6a\x62\x73\x6d\x61\x63\x2e\x69\x6e\x66\x6f\x15\x6b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x72\x69\x61\x6c\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x64\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x65\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\x95\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd1\x07\x28\x80\xfe\x03\x0a\x4a\x0a\x15\x61\x6e\x73\x69\x62\x6c\x65\x2e\x65\x6e\x67\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xe7\x2a\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x70\x73\x63\x6f\x6e\x66\x69\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x69\xec\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x73\x72\x73\x76\x2e\x6f\x70\x65\x6e\x73\x63\x69\x65\x6e\x63\x65\x67\x72\x69\x64\x2e\x6f\x72\x67\x15\x6b\xec\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe4\x01\x0a\x45\x0a\x10\x62\x73\x73\x62\x70\x70\x72\x64\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1d\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x61\x71\x75\x69\x6e\x61\x73\x2e\x65\x64\x75\x15\xa2\x0d\x5c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x65\x63\x75\x72\x65\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x6f\x72\x67\x15\x10\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x73\x2e\x61\x73\x68\x6c\x65\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x06\x7a\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x84\x08\x0a\x4d\x0a\x18\x61\x70\x70\x62\x61\x73\x65\x2d\x73\x74\x61\x67\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\x4f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x47\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x73\x73\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\x46\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x63\x68\x61\x72\x6d\x6d\x2d\x64\x65\x76\x2e\x6f\x72\x67\x15\x09\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x68\x66\x61\x63\x69\x6c\x69\x74\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x11\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x24\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x70\x61\x2d\x76\x70\x6e\x2d\x31\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0d\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xff\x0f\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\xfc\xff\x0f\x0a\x44\x0a\x0f\x6d\x75\x73\x69\x63\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x20\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\x82\x08\x0a\x4d\x0a\x18\x63\x72\x73\x63\x6f\x6e\x63\x6f\x72\x65\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x5d\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x6c\x6f\x67\x69\x73\x74\x69\x63\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x63\x6f\x6d\x15\xc2\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x72\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x3c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x76\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x42\x4d\x48\x56\x49\x44\x59\x4f\x52\x4f\x55\x54\x45\x52\x32\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xfe\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x72\x65\x64\x63\x61\x70\x2e\x72\x61\x69\x6e\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x86\x57\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x92\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xa0\xfd\x01\x0a\x4d\x0a\x18\x75\x6b\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x75\x6e\x69\x70\x65\x72\x2e\x65\x6e\x65\x72\x67\x79\x15\x19\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x64\x72\x61\x78\x2e\x6d\x79\x65\x73\x70\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x18\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x79\x2d\x61\x6d\x65\x79\x2d\x6f\x73\x2d\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x15\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x14\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x6f\x6d\x6d\x73\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x17\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x2d\x6d\x61\x67\x6e\x6f\x78\x2d\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x16\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x2e\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x6f\x6d\x6d\x74\x65\x73\x74\x2e\x64\x69\x61\x6c\x6f\x67\x69\x78\x2e\x63\x6f\x6d\x15\x1d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x72\x72\x61\x6e\x74\x65\x2e\x65\x75\x15\x1c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x6d\x69\x77\x6d\x70\x2e\x63\x6f\x6d\x15\x29\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6c\x69\x66\x65\x67\x6f\x61\x6c\x73\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6c\x69\x66\x65\x67\x6f\x61\x6c\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x68\x72\x69\x74\x6e\x2e\x69\x74\x6f\x65\x6e\x2e\x63\x6f\x2e\x6a\x70\x15\xd0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x31\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x6d\x32\x2e\x73\x74\x72\x61\x74\x79\x78\x69\x74\x2e\x63\x6f\x6d\x15\xce\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x6d\x31\x2e\x73\x74\x72\x61\x74\x79\x78\x69\x74\x2e\x63\x6f\x6d\x15\xcc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\xcb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd3\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x73\x70\x6d\x73\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x78\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x63\x6a\x61\x73\x2e\x6f\x72\x67\x15\xe7\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x6d\x6f\x6e\x72\x6f\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x37\xb2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe6\xf3\x03\x0a\x43\x0a\x0e\x71\x61\x2e\x74\x65\x6c\x65\x72\x6f\x70\x2e\x63\x6f\x6d\x15\xd5\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x74\x65\x6c\x65\x72\x6f\x70\x2e\x63\x6f\x6d\x15\xd4\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x67\x72\x69\x74\x79\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x70\x6c\x15\x40\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x61\x79\x61\x66\x69\x6e\x61\x6e\x63\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x3e\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x77\x70\x72\x6f\x64\x75\x63\x74\x73\x2e\x63\x6f\x6d\x15\x3c\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x62\x61\x72\x72\x61\x63\x75\x64\x61\x63\x65\x6e\x74\x72\x61\x6c\x2e\x62\x61\x63\x6b\x6f\x66\x68\x65\x61\x64\x62\x6f\x6f\x6b\x2e\x63\x6f\x6d\x15\x3d\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x70\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x74\x65\x73\x74\x63\x6f\x72\x65\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x6d\x61\x69\x6c\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x2c\xce\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x50\x0a\x1b\x70\x6f\x72\x74\x61\x6c\x2e\x61\x6e\x64\x65\x72\x74\x6f\x6e\x63\x61\x73\x74\x69\x6e\x67\x73\x2e\x63\x6f\x6d\x15\x86\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x05\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4b\x0a\x16\x61\x6c\x65\x72\x74\x75\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x52\x0a\x1d\x67\x61\x6c\x6c\x65\x72\x79\x2d\x74\x6f\x6f\x6c\x2d\x64\x65\x76\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xc8\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xcf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xce\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x73\x74\x61\x67\x69\x6e\x67\x2d\x75\x6e\x69\x70\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xcc\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x79\x2e\x64\x65\x70\x6f\x74\x64\x72\x75\x67\x2e\x63\x6f\x6d\x15\xd1\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x6f\x6f\x64\x6c\x65\x2e\x32\x32\x69\x74\x72\x69\x67\x2e\x6f\x72\x67\x15\x72\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6d\x65\x64\x2e\x62\x6c\x75\x65\x2e\x79\x62\x72\x63\x2e\x61\x72\x63\x2d\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xec\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x63\x6f\x6c\x6f\x64\x65\x74\x72\x6f\x69\x74\x2e\x63\x6f\x6d\x15\x1d\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x69\x65\x65\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x65\x63\x65\x2d\x73\x63\x61\x6e\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x69\x2d\x64\x61\x74\x61\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdb\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x72\x6d\x77\x65\x62\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x70\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\x76\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x7a\x70\x61\x73\x73\x76\x61\x2e\x63\x6f\x6d\x15\x74\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x68\x6f\x6c\x6c\x61\x6e\x64\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\xb5\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\x72\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x68\x6f\x6f\x76\x65\x72\x70\x72\x65\x73\x65\x72\x76\x65\x2e\x63\x6f\x6d\x15\x70\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x63\x63\x2d\x6b\x6c\x61\x6e\x74\x65\x6e\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x6f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x73\x6f\x70\x68\x65\x6f\x6e\x65\x75\x2e\x6e\x65\x74\x15\x6e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0d\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa0\x04\x0a\x4c\x0a\x17\x63\x70\x73\x63\x61\x64\x6d\x69\x6e\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x11\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xa0\x04\x0a\x4e\x0a\x19\x61\x70\x70\x6c\x79\x2e\x73\x65\x6e\x74\x65\x63\x68\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x63\x6f\x6d\x15\xc6\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xc0\x87\x01\x0a\x42\x0a\x0d\x62\x61\x66\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x63\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x75\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x33\x30\x31\x2e\x61\x64\x63\x6f\x75\x6e\x63\x69\x6c\x2e\x6f\x72\x67\x15\x37\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x5e\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe5\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x15\x33\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x6c\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x70\x73\x2e\x79\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x6d\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x6a\x69\x72\x61\x2e\x73\x74\x75\x64\x69\x6f\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5b\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfb\x03\x0a\x49\x0a\x14\x70\x73\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x6a\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x73\x2e\x77\x61\x76\x65\x77\x61\x73\x68\x74\x65\x6e\x61\x77\x2e\x6f\x72\x67\x15\x68\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0a\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x68\x65\x61\x64\x32\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x46\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x80\x03\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x33\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4c\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd6\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\xe1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6e\x77\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xe2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x06\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\xa0\xfd\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x64\x65\x62\x74\x68\x61\x63\x6b\x65\x72\x2e\x63\x6f\x2e\x75\x6b\x15\xdd\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x68\x64\x73\x6f\x6e\x61\x72\x71\x75\x62\x65\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xdf\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x34\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4d\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x72\x61\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3a\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x47\x0a\x12\x6e\x6f\x74\x69\x66\x79\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xb2\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xbe\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\x59\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x61\x70\x69\x32\x2e\x67\x74\x76\x2e\x63\x6f\x6d\x2e\x70\x6c\x15\xb2\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x69\x6c\x61\x6e\x69\x72\x65\x73\x6f\x72\x74\x2e\x63\x6f\x6d\x15\xad\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x74\x72\x61\x6e\x73\x70\x6f\x72\x74\x61\x74\x69\x6f\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xac\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc8\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x70\x72\x6f\x6d\x6f\x74\x69\x6f\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xaa\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x67\x6f\x6c\x66\x63\x6c\x75\x62\x2e\x63\x6f\x6d\x15\xaf\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x70\x6f\x63\x6f\x6e\x6f\x2e\x63\x6f\x6d\x15\xae\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x67\x61\x74\x65\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x0b\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xd5\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x14\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x70\x73\x2e\x66\x75\x6c\x74\x6f\x6e\x70\x69\x72\x61\x74\x65\x73\x2e\x6e\x65\x74\x15\x44\x79\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x54\x0a\x1f\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x66\x6f\x77\x6c\x65\x72\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x32\xa2\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x63\x70\x61\x6e\x65\x6c\x2e\x64\x72\x6f\x70\x2e\x74\x69\x6d\x62\x65\x72\x63\x72\x65\x65\x6b\x2e\x63\x6f\x6d\x15\xd0\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x61\x70\x65\x78\x2e\x68\x65\x61\x6c\x74\x68\x74\x72\x75\x73\x74\x65\x75\x72\x6f\x70\x65\x2e\x63\x6f\x6d\x15\x20\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x15\x73\x65\x63\x75\x72\x65\x2e\x6f\x6e\x73\x70\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4f\x0a\x1a\x62\x61\x6d\x2d\x63\x6f\x6f\x6c\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xfe\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x70\x61\x6e\x65\x6c\x2e\x64\x65\x6d\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8a\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x64\x65\x76\x15\x8b\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\xfc\xff\x0f\x0a\x48\x0a\x13\x63\x6f\x6e\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd9\x0e\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x74\x6c\x65\x73\x63\x6f\x72\x65\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x82\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x83\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x64\x69\x73\x6b\x2e\x6d\x6f\x74\x6f\x72\x63\x69\x74\x79\x63\x61\x6e\x65\x63\x6f\x72\x73\x6f\x2e\x63\x6f\x6d\x15\x84\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x61\x64\x76\x61\x6e\x63\x65\x74\x68\x65\x73\x63\x65\x6e\x65\x2e\x63\x6f\x6d\x15\x85\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x87\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x88\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x6e\x6f\x72\x67\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x89\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x51\x0a\x1c\x65\x6d\x6f\x6e\x63\x6d\x73\x2e\x6c\x61\x62\x31\x31\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x75\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x69\x73\x75\x74\x61\x70\x70\x30\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa3\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x47\x0a\x12\x6e\x6c\x70\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6f\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x4d\x0a\x18\x78\x65\x6e\x61\x70\x70\x2d\x73\x66\x30\x32\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x15\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x71\x61\x2e\x72\x65\x67\x69\x73\x74\x72\x79\x61\x70\x70\x73\x2e\x6e\x65\x74\x15\x5f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x60\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x5a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x69\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x65\x64\x74\x65\x65\x6e\x2e\x63\x74\x73\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x12\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x10\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xa0\xfd\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x6c\x6f\x63\x6b\x67\x65\x6e\x65\x73\x69\x73\x38\x2e\x63\x6f\x6d\x15\x0c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x0d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6e\x61\x74\x61\x73\x63\x69\x61\x2e\x63\x6f\x2e\x75\x6b\x15\x0e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x69\x74\x77\x61\x72\x64\x65\x6e\x2e\x73\x74\x65\x72\x65\x6f\x69\x74\x2e\x64\x65\x15\x10\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6f\x6e\x62\x6f\x61\x72\x64\x69\x6e\x67\x2e\x72\x70\x6d\x69\x72\x61\x69\x6c\x70\x65\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\x11\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x63\x6c\x6f\x75\x64\x2e\x6b\x61\x73\x73\x65\x6d\x6d\x65\x6c\x2e\x63\x6f\x6d\x15\x12\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6a\x65\x6c\x6c\x79\x66\x69\x6e\x2e\x6b\x61\x73\x73\x65\x6d\x6d\x65\x6c\x2e\x63\x6f\x6d\x15\x13\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x70\x72\x74\x67\x2e\x68\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2d\x56\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x82\x04\x0a\x43\x0a\x0e\x73\x72\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x64\x65\x76\x2e\x63\x65\x6c\x74\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x45\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x69\x6b\x69\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x69\x73\x64\x62\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf3\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x63\x61\x73\x68\x6e\x65\x74\x72\x64\x69\x72\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcf\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x61\x62\x72\x61\x6d\x73\x70\x6c\x61\x6e\x65\x74\x61\x72\x69\x75\x6d\x2e\x6f\x72\x67\x15\xd4\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x69\x73\x70\x61\x64\x6d\x69\x6e\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x55\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x73\x68\x6f\x70\x2e\x72\x65\x63\x73\x70\x6f\x72\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x69\x73\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xb5\xa5\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x2a\x2e\x70\x72\x6f\x78\x79\x32\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd6\x03\x28\x80\xfe\x01\x0a\x4f\x0a\x1a\x61\x75\x78\x65\x6e\x74\x65\x72\x70\x72\x69\x73\x65\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xe1\x03\x28\x80\x83\x01\x0a\x47\x0a\x12\x6d\x63\x66\x73\x64\x62\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x56\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xde\x03\x28\x80\x83\x01\x0a\x50\x0a\x1b\x74\x72\x61\x76\x65\x6c\x65\x72\x73\x61\x62\x72\x6f\x61\x64\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x57\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x7a\x69\x6d\x62\x72\x61\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3b\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x6f\x73\x61\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x52\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x2a\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xd3\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6e\x65\x69\x67\x68\x62\x6f\x72\x68\x6f\x6f\x64\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x73\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6d\x73\x30\x31\x2e\x63\x61\x73\x63\x61\x64\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcb\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x73\x70\x6f\x72\x74\x63\x61\x6d\x70\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5f\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x64\x65\x76\x2e\x61\x74\x74\x61\x77\x61\x72\x64\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x6c\x69\x73\x74\x69\x6e\x67\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x96\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x65\x62\x6d\x61\x69\x6c\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x11\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x4d\x0a\x18\x6c\x63\x74\x6c\x76\x6f\x69\x63\x65\x73\x2e\x63\x6c\x65\x61\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x78\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x82\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x63\x6c\x61\x72\x69\x74\x79\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1c\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6f\x6e\x76\x69\x76\x69\x61\x6c\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3d\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x73\x69\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x87\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x63\x62\x63\x63\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x68\x65\x6c\x6d\x68\x6f\x6c\x74\x7a\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x24\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x65\x62\x35\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x74\x66\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x99\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x7d\x47\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xe0\x03\x28\x80\x83\x01\x0a\x4b\x0a\x16\x6a\x6f\x75\x72\x6e\x61\x6c\x6f\x66\x65\x78\x70\x65\x72\x74\x69\x73\x65\x2e\x6f\x72\x67\x15\x3e\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x96\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x70\x72\x6c\x6d\x61\x73\x74\x65\x72\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x63\x68\x65\x63\x6b\x64\x61\x74\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xec\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xe0\x03\x28\x80\x83\x01\x0a\x43\x0a\x0e\x69\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x89\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x68\x65\x70\x2e\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x47\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa5\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x74\x6f\x72\x61\x67\x65\x2d\x61\x63\x63\x65\x73\x73\x31\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x37\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x73\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xdf\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x6d\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x27\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaf\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6d\x73\x30\x32\x2e\x63\x61\x73\x63\x61\x64\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcc\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x66\x75\x74\x6f\x6d\x61\x6b\x69\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x90\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6c\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x64\x69\x73\x6b\x2e\x62\x6f\x6c\x64\x65\x72\x62\x79\x64\x65\x73\x69\x67\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdf\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x2a\x2e\x70\x72\x6f\x78\x79\x31\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x02\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xfe\x01\x0a\x46\x0a\x11\x69\x6e\x63\x6c\x75\x73\x69\x6f\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x63\x61\x6d\x70\x73\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6b\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x65\x7a\x70\x72\x6f\x78\x79\x61\x75\x74\x68\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xba\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe8\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x62\x65\x61\x63\x6f\x6e\x2d\x63\x65\x6e\x74\x65\x72\x2e\x6f\x72\x67\x15\xa0\xa4\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x73\x33\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe7\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x6c\x69\x73\x74\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x62\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xdd\x03\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xdd\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe9\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x32\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe6\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x62\x65\x74\x61\x2e\x61\x64\x76\x61\x6e\x63\x65\x6d\x65\x6e\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x8c\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x73\x65\x6c\x66\x63\x68\x65\x63\x6b\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xe0\x03\x28\x80\x83\x01\x0a\x40\x0a\x0b\x73\x69\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x88\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbc\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x78\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x63\x61\x6c\x65\x6e\x64\x61\x72\x2e\x63\x68\x65\x6d\x69\x73\x74\x72\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x15\x1a\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x61\x70\x70\x73\x2e\x64\x32\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x47\x0e\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x34\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe8\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x36\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xdf\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x31\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe5\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xdf\x03\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x63\x6f\x73\x6d\x65\x74\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x43\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x64\x69\x67\x69\x74\x61\x6c\x73\x69\x67\x6e\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfb\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9d\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x61\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x73\x31\x30\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe4\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x61\x63\x68\x69\x65\x76\x65\x6d\x65\x6e\x74\x73\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x59\x0e\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xdf\x03\x28\x80\x83\x01\x0a\x4c\x0a\x17\x73\x70\x61\x72\x74\x61\x6e\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xdf\x03\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x69\x73\x69\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfe\x03\x0a\x44\x0a\x0f\x61\x64\x6d\x69\x6e\x73\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa1\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb9\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x70\x65\x6f\x70\x6c\x65\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x62\x69\x65\x72\x64\x6f\x63\x74\x6f\x72\x2e\x63\x6f\x6d\x15\x65\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x72\x65\x64\x63\x61\x70\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa4\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x6d\x73\x75\x61\x6c\x75\x6d\x6e\x69\x2e\x63\x6f\x6d\x15\x15\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x8c\x01\x0a\x4f\x0a\x1a\x69\x73\x6d\x67\x6d\x74\x31\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe1\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x17\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x68\x69\x73\x6f\x63\x63\x73\x2e\x63\x65\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x1a\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb0\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x66\x69\x72\x65\x6c\x61\x62\x2e\x6f\x72\x67\x15\x29\x82\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x01\x0a\x4c\x0a\x17\x62\x72\x6f\x61\x64\x63\x61\x73\x74\x2e\x61\x6c\x65\x72\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x57\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x40\x0a\x0b\x61\x66\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x65\x02\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x73\x74\x6f\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x10\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8c\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0e\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x73\x63\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\xb3\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x95\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x70\x73\x79\x63\x68\x6f\x6c\x6f\x67\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x6e\x65\x74\x66\x69\x6c\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x54\x02\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\x91\x03\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6d\x65\x64\x69\x61\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x63\x74\x71\x61\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x50\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x6d\x73\x75\x70\x68\x79\x73\x69\x63\x73\x63\x6c\x75\x62\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xd6\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x83\x91\x03\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf6\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x63\x6f\x64\x65\x70\x72\x6f\x64\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x08\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd9\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x85\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x65\x6c\x6f\x67\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4e\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x6f\x66\x66\x69\x63\x65\x77\x65\x62\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xca\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9f\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9b\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x6d\x61\x69\x6c\x2e\x61\x73\x65\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x80\x08\x0a\x48\x0a\x13\x77\x65\x62\x73\x76\x63\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf5\x03\x0a\x4c\x0a\x17\x74\x6f\x6e\x65\x70\x65\x72\x66\x65\x63\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x67\x69\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcb\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x48\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6a\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x73\x74\x75\x64\x65\x6e\x74\x6a\x6f\x62\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x27\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x03\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd7\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6c\x6f\x6e\x2d\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xe2\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x87\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x73\x75\x66\x61\x6d\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\xd1\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x70\x62\x64\x62\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc0\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x73\x75\x66\x61\x6d\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\xd1\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x67\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x98\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x71\x61\x2e\x63\x73\x74\x6f\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x8c\x01\x0a\x45\x0a\x10\x6d\x61\x69\x6c\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x81\x04\x0a\x47\x0a\x12\x65\x76\x65\x6e\x74\x73\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xe3\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x41\x0a\x0c\x6f\x70\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\xcf\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x1a\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\x81\x04\x0a\x52\x0a\x1d\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x1b\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x57\x0a\x22\x6d\x6f\x6c\x65\x63\x75\x6c\x61\x72\x62\x69\x6f\x70\x68\x79\x73\x69\x63\x73\x2e\x6e\x61\x74\x73\x63\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\xe6\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd3\x07\x28\x80\xfe\x03\x0a\x55\x0a\x20\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x19\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x4a\x0a\x15\x2a\x2e\x31\x2e\x6f\x63\x61\x2e\x6e\x66\x6c\x78\x76\x69\x64\x65\x6f\x2e\x6e\x65\x74\x15\x02\x32\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x40\x0a\x50\x0a\x1b\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x18\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x4e\x0a\x19\x61\x66\x72\x69\x63\x61\x2d\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\x04\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x89\x40\x0a\x47\x0a\x12\x73\x74\x74\x2e\x6e\x61\x74\x73\x63\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1b\xe6\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x03\x0a\x45\x0a\x10\x63\x69\x72\x72\x75\x73\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\x15\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x89\x40\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x63\x68\x65\x6d\x69\x73\x74\x72\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xeb\x1b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x98\x8a\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa0\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x16\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x81\x04\x0a\x40\x0a\x0b\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x53\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\xe8\x81\x01\x0a\x4f\x0a\x1a\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x15\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x49\x0a\x14\x72\x65\x70\x6f\x73\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfc\x90\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc6\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa9\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x31\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xc9\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\x8f\x03\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x2a\x2e\x75\x72\x62\x61\x6e\x6c\x61\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbf\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x32\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2a\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\x92\x03\x28\x80\xe3\x01\x0a\x49\x0a\x14\x71\x75\x69\x74\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x8e\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2d\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x33\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2b\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xe3\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb1\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x70\x73\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\x97\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x76\x69\x70\x65\x72\x64\x62\x2e\x6f\x72\x67\x15\xdb\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x73\x75\x70\x70\x6f\x72\x74\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x55\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x6d\x61\x63\x79\x74\x63\x62\x64\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc5\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\x98\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x2a\x2e\x67\x72\x69\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x16\x88\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc1\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb4\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb7\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x77\x73\x74\x61\x74\x73\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x29\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xfc\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x76\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x2a\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xd9\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x6d\x69\x2d\x6d\x61\x70\x64\x61\x74\x61\x2e\x6e\x65\x74\x15\xaf\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x63\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x01\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x70\x73\x2e\x6c\x61\x69\x6e\x67\x73\x62\x75\x72\x67\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9a\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x90\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc2\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x57\x46\x54\x53\x30\x2e\x77\x6d\x75\x70\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x15\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbd\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x72\x65\x67\x69\x73\x74\x65\x72\x2e\x72\x65\x73\x6e\x65\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x73\x0b\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6c\x69\x62\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x22\x2c\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\xc0\x8a\x01\x0a\x52\x0a\x1d\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x71\x61\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x2a\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x28\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x8a\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x06\x0c\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb9\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xec\x24\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe8\x81\x01\x0a\x4c\x0a\x17\x2a\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbc\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x11\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x95\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x6f\x65\x75\x73\x72\x65\x70\x6f\x72\x74\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x23\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x20\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x6c\x69\x74\x65\x72\x61\x72\x79\x77\x6f\x72\x6c\x64\x73\x2e\x63\x6f\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x79\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x2e\x62\x79\x72\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x98\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x4b\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x61\x75\x74\x68\x2d\x69\x6e\x74\x65\x72\x73\x74\x69\x74\x69\x61\x6c\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x99\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x68\x6f\x6d\x65\x70\x61\x67\x65\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x67\x65\x6e\x65\x74\x69\x63\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4a\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x53\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x76\x72\x61\x63\x6b\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb3\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x73\x73\x74\x69\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xcb\x05\x28\x80\xfc\x01\x0a\x48\x0a\x13\x70\x73\x2e\x64\x75\x72\x61\x6e\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x99\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x71\x61\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x2e\x70\x65\x72\x72\x79\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9e\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x53\x0a\x1e\x6d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x72\x65\x70\x6f\x72\x74\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb6\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xba\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xf0\x01\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x6c\x69\x73\x37\x34\x34\x30\x2e\x73\x6c\x69\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x15\x61\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\xf0\x81\x01\x0a\x49\x0a\x14\x2a\x2e\x73\x65\x63\x75\x72\x69\x74\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x21\x02\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x77\x77\x77\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x6f\x76\x70\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd8\x03\x28\x80\x88\x10\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x84\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x68\x64\x72\x66\x2d\x64\x74\x66\x2e\x6f\x72\x67\x15\x4f\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb8\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xf0\x01\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xc8\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf8\x01\x0a\x47\x0a\x12\x2a\x2e\x63\x63\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x96\x08\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x63\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x96\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x2a\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x65\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x77\x65\x73\x74\x68\x69\x6c\x6c\x73\x61\x74\x68\x6c\x65\x74\x69\x63\x2e\x63\x6f\x6d\x15\x56\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9c\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x2a\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x85\x0d\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\xd5\x03\x28\x80\x86\x04\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xce\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x73\x69\x62\x6b\x6f\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc6\x89\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x67\x61\x67\x65\x6d\x65\x6e\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x48\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x8f\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x61\x63\x63\x65\x73\x73\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xf0\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x73\x2e\x6f\x77\x6f\x73\x73\x6f\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x95\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x68\x74\x74\x70\x2d\x67\x61\x74\x65\x30\x32\x2e\x67\x72\x69\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x2b\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf4\x01\x0a\x49\x0a\x14\x70\x73\x2e\x6d\x6f\x72\x72\x69\x63\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9c\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x70\x73\x2e\x63\x6f\x72\x75\x6e\x6e\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x68\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x03\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x6a\x69\x68\x63\x76\x2e\x6f\x72\x67\x15\x2e\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4a\x0a\x15\x2a\x2e\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x78\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x33\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xcb\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x6c\x6f\x67\x69\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb7\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x70\x72\x69\x74\x7a\x6b\x65\x72\x6e\x65\x75\x72\x6f\x70\x73\x79\x63\x68\x2e\x6f\x72\x67\x15\x4d\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xd6\x05\x28\x80\xfb\x03\x0a\x47\x0a\x12\x63\x75\x63\x66\x6c\x31\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xe7\x02\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xca\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf8\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xb9\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xdf\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x70\x73\x2e\x73\x68\x65\x70\x68\x65\x72\x64\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x67\x59\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x01\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x63\x6f\x65\x75\x73\x77\x65\x62\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x2b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x86\x04\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x52\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x6a\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x42\x42\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x06\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x90\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xe0\x03\x28\x80\x82\x01\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x77\x61\x72\x74\x7a\x63\x72\x65\x65\x6b\x2e\x6f\x72\x67\x15\x0e\x1f\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x86\x04\x0a\x47\x0a\x12\x63\x75\x63\x66\x6c\x32\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xc8\x05\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x01\x0c\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xae\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x6c\x73\x61\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x4c\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x67\x72\x6f\x75\x70\x65\x72\x64\x65\x6d\x6f\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x18\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbe\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x02\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x06\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x4a\x0a\x15\x72\x73\x34\x2e\x72\x65\x75\x74\x68\x65\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x42\x70\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x57\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x64\x65\x76\x38\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x2b\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb2\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x74\x65\x73\x74\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x02\x0a\x50\x0a\x1b\x77\x61\x79\x66\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x7d\xa5\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x62\x61\x6d\x2d\x61\x73\x62\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\x93\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x61\x66\x65\x72\x74\x65\x65\x6e\x73\x2e\x6f\x72\x67\x15\x65\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x04\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2d\x6c\x69\x62\x72\x61\x72\x79\x33\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x22\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x35\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\xa0\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x51\x0a\x1c\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x6e\x6f\x74\x65\x62\x6f\x6f\x6b\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3b\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x31\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x0a\x45\x0a\x10\x6f\x70\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x80\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x31\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x7b\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\x8f\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x6d\x79\x6e\x6d\x75\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\xe1\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xae\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xa6\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6c\x61\x70\x65\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xe1\xb5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd8\x03\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1e\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x05\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x80\x10\x0a\x43\x0a\x0e\x77\x69\x6b\x69\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x3b\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x37\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x73\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x76\x70\x6e\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x81\x1e\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xcc\x03\x28\xe8\x81\x01\x0a\x41\x0a\x0c\x65\x69\x73\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x36\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x76\x70\x6e\x2e\x73\x74\x75\x64\x65\x6e\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x84\x1e\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\xe8\x81\x01\x0a\x4a\x0a\x15\x63\x68\x69\x6c\x64\x66\x69\x6e\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6f\x72\x67\x15\xdc\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x6d\x79\x75\x73\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3d\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6c\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x73\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x4f\x0a\x1a\x70\x73\x68\x61\x72\x74\x66\x6f\x72\x64\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7c\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x41\x0a\x0c\x2a\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\x63\x39\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xfc\xff\x0f\x0a\x4f\x0a\x1a\x65\x64\x75\x70\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdb\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x62\x68\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x77\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x51\x0a\x1c\x70\x73\x63\x61\x73\x73\x6f\x70\x6f\x6c\x69\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x79\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xec\xd8\x03\x28\x80\x86\x04\x0a\x42\x0a\x0d\x70\x73\x2e\x67\x69\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x44\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x08\x0a\x49\x0a\x14\x67\x63\x73\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x65\x72\x65\x73\x2d\x75\x74\x69\x6c\x69\x74\x79\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2a\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x6d\x6f\x6f\x64\x6c\x65\x32\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xdf\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x75\x63\x63\x65\x73\x73\x76\x6c\x63\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7e\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xd8\x03\x28\x80\x86\x04\x0a\x57\x0a\x22\x61\x70\x70\x73\x2e\x70\x72\x6f\x63\x75\x72\x65\x6d\x65\x6e\x74\x2e\x66\x69\x6e\x61\x6e\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd8\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x88\x10\x0a\x5f\x0a\x2a\x77\x77\x77\x2e\x63\x6f\x75\x6e\x74\x72\x79\x73\x69\x64\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6d\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x69\x7a\x7a\x79\x66\x69\x6c\x65\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x6e\x69\x6c\x65\x73\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x71\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x5e\x0a\x29\x77\x77\x77\x2e\x62\x72\x61\x6e\x64\x79\x77\x69\x6e\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x74\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x2a\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x17\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x81\x04\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x38\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x75\x9e\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\x80\x02\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6f\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x38\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x9e\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x55\x0a\x20\x72\x69\x76\x65\x72\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6c\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x86\x04\x0a\x5e\x0a\x29\x62\x65\x72\x72\x69\x65\x6e\x73\x70\x72\x69\x6e\x67\x73\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x75\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd9\x03\x28\x80\x86\x04\x0a\x52\x0a\x1d\x73\x6a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x76\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x41\x0a\x0c\x2a\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\xc8\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd0\x07\x28\x80\xd4\x02\x0a\x4b\x0a\x16\x62\x68\x63\x73\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x78\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x70\x73\x6d\x61\x72\x63\x65\x6c\x6c\x75\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7a\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xdf\x03\x28\x80\x8b\x01\x0a\x5a\x0a\x25\x77\x61\x74\x65\x72\x76\x6c\x69\x65\x74\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6e\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xef\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x64\x65\x65\x70\x62\x6c\x75\x65\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x72\x6f\x6a\x65\x63\x74\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x64\x65\x6d\x6f\x2e\x74\x61\x6e\x64\x65\x6d\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x63\x73\x67\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x73\x68\x69\x62\x2d\x69\x64\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x79\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0d\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xcf\x07\x28\x80\x80\x02\x0a\x47\x0a\x12\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7d\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x65\x78\x70\x6c\x6f\x72\x61\x74\x69\x6f\x6e\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x19\xbf\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xb5\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x15\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x66\x6c\x75\x78\x70\x72\x65\x70\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb8\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x6c\x72\x63\x2d\x74\x73\x75\x6b\x65\x6d\x6f\x6e\x6f\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfd\xa3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x05\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x73\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8f\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xe0\x03\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x74\x32\x64\x2d\x67\x65\x6e\x65\x73\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb5\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x52\x0a\x1d\x61\x61\x64\x74\x2d\x65\x73\x74\x69\x6d\x61\x74\x65\x2e\x75\x6d\x74\x72\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xce\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x73\x74\x61\x74\x73\x2e\x72\x65\x66\x72\x61\x63\x74\x69\x6f\x6e\x2e\x6e\x65\x74\x77\x6f\x72\x6b\x15\x58\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd5\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6d\x69\x73\x73\x69\x6f\x6e\x73\x74\x72\x6f\x6e\x67\x2e\x6f\x72\x67\x15\xb5\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd5\x03\x28\x80\xfc\x01\x0a\x58\x0a\x23\x64\x65\x76\x2d\x6b\x65\x76\x69\x6e\x77\x6c\x69\x2d\x61\x64\x6d\x69\x6e\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x26\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0b\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x45\x0a\x10\x61\x72\x74\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x31\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x61\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x94\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x73\x70\x71\x72\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x2a\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\x1f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x5b\x0a\x26\x63\x61\x65\x6e\x2d\x73\x77\x2d\x61\x64\x6d\x69\x6e\x30\x31\x2e\x61\x64\x73\x72\x6f\x6f\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x6b\x62\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6d\x67\x65\x74\x69\x74\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa9\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\x8e\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x69\x6e\x74\x6d\x65\x64\x63\x6d\x65\x72\x65\x67\x69\x73\x74\x65\x72\x2e\x6f\x72\x67\x15\xc0\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x77\x61\x6c\x6b\x65\x7a\x2e\x6f\x72\x67\x15\x64\xfe\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdd\x03\x28\x80\x8b\x01\x0a\x51\x0a\x1c\x73\x74\x61\x67\x69\x6e\x67\x2d\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x0d\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x74\x68\x2d\x64\x65\x76\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfa\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x5b\x0a\x26\x63\x61\x65\x6e\x2d\x73\x77\x2d\x61\x64\x6d\x69\x6e\x30\x31\x2e\x61\x64\x73\x72\x6f\x6f\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd2\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x08\x0a\x53\x0a\x1e\x73\x6d\x74\x64\x2d\x77\x77\x77\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x23\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x04\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x67\x76\x74\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x99\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x68\x6f\x6d\x65\x66\x72\x6f\x6e\x74\x73\x74\x72\x6f\x6e\x67\x2e\x6f\x72\x67\x15\x37\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x6e\x61\x2e\x73\x68\x65\x72\x6d\x61\x6e\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x69\x64\x70\x2d\x6d\x63\x6f\x6d\x6d\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x91\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb5\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x6d\x65\x64\x73\x74\x75\x64\x65\x6e\x74\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x08\x0a\x51\x0a\x1c\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x64\x61\x74\x61\x2e\x73\x63\x61\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x69\x62\x79\x74\x65\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x86\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x16\x61\x73\x6b\x6d\x75\x73\x69\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\xd0\x07\x28\x80\xfe\xff\x07\x0a\x4b\x0a\x16\x73\x72\x6f\x74\x72\x61\x69\x6e\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x64\x70\x2d\x6d\x63\x6f\x6d\x6d\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x65\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x2a\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\x37\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x2a\x2e\x64\x65\x76\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8b\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xdf\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x70\x68\x61\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x76\x69\x70\x65\x72\x64\x62\x2e\x6f\x72\x67\x15\xd9\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x6d\x61\x64\x65\x6c\x69\x6e\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3a\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa0\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x61\x64\x6d\x69\x6e\x2e\x63\x61\x72\x65\x65\x72\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6d\x69\x73\x65\x61\x67\x72\x61\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x41\x0a\x0c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x99\xca\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9e\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xdf\x03\x28\x80\x8b\x01\x0a\x48\x0a\x13\x6c\x61\x73\x65\x72\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xe3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x79\x77\x61\x79\x2e\x6f\x72\x67\x15\xfe\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9f\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x51\x0a\x1c\x69\x74\x73\x63\x6f\x6d\x6d\x77\x65\x62\x2d\x64\x65\x76\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x75\x6d\x68\x65\x61\x6c\x74\x68\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x6f\x72\x67\x15\xf8\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x80\x08\x0a\x5f\x0a\x2a\x6c\x73\x61\x2d\x70\x68\x79\x73\x2d\x73\x70\x69\x74\x7a\x2d\x64\x6f\x63\x64\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x75\x6d\x6d\x73\x66\x61\x63\x75\x6c\x74\x79\x64\x65\x76\x65\x6c\x6f\x70\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xc2\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xdd\x03\x28\x80\x82\x01\x0a\x49\x0a\x14\x6d\x6f\x74\x69\x6f\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x76\x65\x6c\x6f\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x63\x73\x67\x2d\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x5b\x0a\x26\x70\x65\x72\x66\x73\x6f\x6e\x61\x72\x2d\x73\x70\x68\x72\x61\x63\x6b\x2d\x6d\x61\x63\x63\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x1d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x69\x74\x73\x63\x6f\x6d\x6d\x77\x65\x62\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x70\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x4e\x0a\x19\x72\x68\x6e\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x52\x0a\x1d\x63\x61\x74\x73\x77\x65\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x75\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x06\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x64\x69\x6c\x6c\x2e\x6d\x6c\x6c\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe9\xa9\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x08\x0a\x47\x0a\x12\x73\x69\x70\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4d\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x73\x6f\x6c\x61\x72\x32\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe4\x3a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xde\x03\x28\x80\x8b\x01\x0a\x54\x0a\x1f\x6c\x6f\x63\x61\x6c\x2d\x64\x65\x76\x2e\x62\x75\x73\x74\x65\x73\x74\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd7\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x4b\x0a\x16\x6c\x61\x6d\x70\x6f\x72\x74\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcb\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x63\x6f\x6d\x15\x1d\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x68\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\x90\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb3\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xde\x03\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x66\x75\x73\x69\x6f\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x63\x63\x6c\x69\x62\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x74\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xed\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x19\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x1a\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xd1\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x66\x69\x6c\x65\x64\x65\x70\x6f\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x91\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa1\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\x92\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x02\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd1\x03\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x61\x70\x70\x73\x2e\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x64\x65\x76\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x76\x65\x6e\x74\x75\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x73\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa9\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xec\x01\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6d\x79\x62\x61\x79\x2e\x62\x61\x79\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x7c\xd4\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x69\x63\x61\x2e\x65\x6c\x61\x73\x74\x69\x63\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x5f\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x68\x69\x73\x74\x6f\x72\x79\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x63\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x03\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd1\x03\x28\x80\xfe\x01\x0a\x4c\x0a\x17\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x65\x73\x6b\x79\x6d\x6f\x73\x2e\x63\x6f\x6d\x15\x3b\xf4\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfe\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x62\x61\x63\x6b\x75\x70\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x84\x04\x0a\x46\x0a\x11\x6d\x79\x6b\x69\x64\x6e\x65\x79\x67\x75\x69\x64\x65\x2e\x6f\x72\x67\x15\x07\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x24\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xde\x03\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x61\x72\x65\x65\x72\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xde\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x16\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa8\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\x8d\x02\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x6d\x65\x64\x73\x74\x75\x64\x65\x6e\x74\x61\x75\x78\x69\x6c\x69\x61\x72\x79\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x42\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x64\x61\x74\x61\x64\x69\x72\x65\x63\x74\x2e\x6d\x70\x6f\x67\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x6f\x72\x67\x15\x3c\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x65\x62\x69\x6c\x6c\x2e\x70\x69\x65\x67\x2e\x63\x6f\x6d\x15\xc3\x4f\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xc9\x05\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x63\x63\x2e\x65\x64\x75\x15\xaa\x20\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x61\x6c\x65\x72\x74\x75\x73\x2e\x6a\x63\x63\x6d\x69\x2e\x65\x64\x75\x15\x21\xc8\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x7c\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x76\x69\x61\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x76\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd7\x03\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x16\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xd6\x03\x28\x80\xfe\x03\x0a\x41\x0a\x0c\x69\x63\x61\x2e\x74\x61\x64\x6c\x2e\x6e\x65\x74\x15\x72\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd6\x03\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x63\x61\x74\x73\x77\x65\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x81\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x32\x38\x30\x2e\x6f\x72\x67\x15\x1d\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x69\x74\x72\x69\x78\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x7d\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\x8f\x06\x28\x80\xfe\x07\x0a\x3c\x0a\x07\x65\x6e\x73\x61\x2e\x66\x69\x15\x5b\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x71\x75\x6f\x64\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x14\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x73\x2e\x63\x63\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x43\x7a\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xda\x03\x28\x80\x84\x08\x0a\x48\x0a\x13\x65\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xec\xde\x03\x28\x80\x8b\x01\x0a\x48\x0a\x13\x73\x61\x62\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x29\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x4c\x0a\x17\x6d\x69\x6f\x63\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa6\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x4f\x0a\x1a\x76\x6f\x61\x6c\x74\x65\x33\x2e\x76\x6f\x61\x6c\x74\x65\x2e\x62\x6f\x72\x67\x65\x73\x73\x2e\x63\x6f\x6d\x15\xb5\x8f\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xda\x03\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x70\x72\x6f\x62\x6c\x65\x6d\x2d\x72\x6f\x75\x6c\x65\x74\x74\x65\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdc\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x74\x73\x65\x61\x72\x63\x68\x2e\x76\x69\x70\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xce\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x45\x0a\x10\x63\x61\x6e\x76\x61\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x62\x6c\x61\x63\x6b\x62\x6f\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x48\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x64\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd6\x03\x28\x80\xf3\x01\x0a\x56\x0a\x21\x69\x64\x70\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x26\xd1\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x78\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x79\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7b\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xec\x01\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x63\x6c\x6f\x75\x64\x2e\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x69\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x67\x69\x6e\x67\x63\x65\x6e\x74\x65\x72\x73\x2e\x6f\x72\x67\x15\x6c\xc8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x6c\x75\x67\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x14\xbc\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xd6\x03\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x2e\x6c\x73\x73\x75\x2e\x65\x64\x75\x15\x7d\xd8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x90\xd7\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x65\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x66\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x43\x0a\x0e\x73\x6d\x73\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x5f\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\x90\x03\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x72\x65\x6d\x6f\x74\x65\x2e\x63\x68\x61\x72\x6c\x65\x76\x6f\x69\x78\x63\x6f\x75\x6e\x74\x79\x2e\x6f\x72\x67\x15\x58\x3d\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xec\x01\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x94\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x72\x67\x77\x2d\x6d\x73\x75\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x15\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xd6\x03\x28\x80\xf0\x02\x0a\x3f\x0a\x0a\x63\x73\x65\x6d\x64\x6d\x2e\x63\x6f\x6d\x15\x55\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\xd6\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfd\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\x90\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\xd7\x03\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x90\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x63\x72\x61\x70\x6f\x6d\x65\x2e\x6f\x72\x67\x15\x9f\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xde\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x6c\x69\x62\x69\x6e\x74\x72\x61\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xde\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xc9\x05\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xf4\x01\x28\x80\x83\x01\x0a\x50\x0a\x1b\x63\x6f\x72\x6e\x69\x63\x68\x6f\x6e\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x70\x6f\x6c\x69\x63\x79\x6d\x61\x6b\x65\x72\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x64\x61\x73\x68\x61\x70\x70\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xbc\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd7\x03\x28\x80\x88\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x28\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x70\x73\x2e\x70\x77\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x99\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x73\x73\x6c\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x73\x73\x6c\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x72\x79\x6f\x75\x74\x68\x64\x61\x74\x61\x2e\x6f\x72\x67\x15\xa1\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x67\x6f\x76\x2e\x6f\x72\x67\x15\x1e\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xda\x03\x28\x80\xfe\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x68\x64\x2e\x6e\x65\x74\x15\xa2\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\x8d\x02\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xd6\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x6f\x6d\x6d\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xf4\x01\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0b\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xd1\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0c\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd4\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x64\x77\x61\x70\x70\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xe1\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa3\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\x8d\x02\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa1\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xda\x03\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x61\x74\x74\x65\x6e\x64\x61\x6e\x63\x65\x6f\x6e\x64\x65\x6d\x61\x6e\x64\x2e\x63\x6f\x6d\x15\x68\x7f\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x28\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\x90\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x06\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xc9\x05\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7b\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa7\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa4\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa5\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\x8d\x02\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x76\x69\x64\x79\x6f\x2d\x31\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xc2\x02\x28\xa0\x8a\x01\x0a\x55\x0a\x20\x76\x69\x64\x79\x6f\x2d\x67\x61\x74\x65\x77\x61\x79\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcd\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xc2\x02\x28\xa0\x8a\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa0\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\x8d\x02\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x73\x75\x70\x65\x72\x6d\x6f\x6e\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6e\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6c\x69\x73\x2e\x73\x66\x6c\x64\x6c\x69\x62\x2e\x6f\x72\x67\x15\x03\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbf\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xa9\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x65\x70\x2e\x6f\x76\x70\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xec\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xda\x03\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\x90\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x72\x65\x70\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5e\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x63\x61\x6e\x74\x6f\x6e\x70\x6c\x2e\x6f\x72\x67\x15\x48\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x61\x79\x66\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x7f\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x6f\x66\x74\x77\x61\x72\x65\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x69\x7a\x61\x72\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x73\x75\x62\x61\x6b\x65\x72\x73\x2e\x63\x6f\x6d\x15\x91\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xde\x03\x28\x80\x83\x01\x0a\x4a\x0a\x15\x73\x74\x61\x74\x67\x65\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\x91\x03\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x17\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x63\x6f\x6d\x74\x61\x67\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\x90\x03\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x73\x67\x73\x69\x74\x65\x73\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xb5\x02\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x35\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xde\x03\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x39\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xe9\x02\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x6d\x65\x65\x74\x69\x6e\x67\x73\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\xf8\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdf\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xd6\x03\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7c\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xda\x03\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\xcb\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xde\x03\x28\x80\x82\x01\x0a\x51\x0a\x1c\x61\x61\x6f\x70\x65\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf3\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x92\xdf\x03\x28\x80\x8b\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa1\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf5\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x8b\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x63\x61\x6e\x74\x6f\x6e\x70\x6c\x2e\x6f\x72\x67\x15\x6a\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x51\x0a\x1c\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2d\x74\x65\x73\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\x90\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x6e\x70\x73\x2e\x6d\x63\x2d\x69\x73\x64\x2e\x6f\x72\x67\x15\x84\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x63\x63\x67\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfa\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\x91\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x72\x61\x64\x6c\x69\x66\x65\x63\x79\x63\x6c\x65\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xd6\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x6c\x69\x73\x74\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0d\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x52\x0a\x1d\x64\x61\x74\x61\x2e\x73\x75\x73\x74\x61\x69\x6e\x61\x62\x69\x6c\x69\x74\x79\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x9f\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xd6\x03\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x6d\x65\x72\x69\x74\x2d\x64\x6e\x6f\x74\x65\x30\x31\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\xc5\x74\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf4\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x98\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x73\x6f\x63\x69\x61\x6c\x77\x6f\x72\x6b\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9f\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x65\x6d\x75\x6e\x69\x78\x6e\x65\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\xc9\x05\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x72\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xda\x03\x28\x80\xfe\x07\x0a\x48\x0a\x13\x76\x6f\x66\x66\x69\x63\x65\x32\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x02\x80\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x1e\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xda\x03\x28\x80\x86\x04\x0a\x3f\x0a\x0a\x77\x77\x77\x2e\x64\x69\x73\x2e\x75\x73\x15\x12\x40\x3f\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x76\x6c\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9a\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x72\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf6\xde\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x60\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x70\x63\x63\x73\x2d\x63\x75\x63\x31\x2e\x70\x63\x63\x73\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x15\x2b\xc7\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x52\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\x90\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x9d\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x65\x69\x73\x2d\x74\x65\x73\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x37\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x76\x70\x6e\x2d\x65\x75\x2e\x6c\x74\x75\x2e\x65\x64\x75\x15\xcb\x91\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x46\x0a\x11\x62\x69\x6f\x70\x6c\x61\x73\x6d\x6f\x6e\x69\x63\x73\x2e\x6f\x72\x67\x15\x0a\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x70\x61\x72\x74\x61\x6e\x63\x61\x73\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3e\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x83\x01\x0a\x48\x0a\x13\x69\x63\x61\x6e\x64\x65\x63\x69\x64\x65\x73\x74\x75\x64\x79\x2e\x6f\x72\x67\x15\x19\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd6\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x6c\x73\x2e\x6c\x61\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x42\x8d\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd6\x03\x28\x80\x84\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x77\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xde\x03\x28\x80\x82\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xfb\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x4a\x0a\x15\x63\x61\x74\x61\x6c\x6f\x67\x2e\x74\x6c\x6e\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x0c\xa1\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\x90\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x92\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x51\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x32\x2d\x64\x65\x76\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xce\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x61\x70\x70\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x68\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x32\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd0\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x3e\x0a\x09\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa0\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xf1\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\x90\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x62\x61\x6b\x65\x72\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\xe2\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd7\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\x7d\x74\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x0a\x4c\x0a\x17\x70\x73\x2e\x6e\x65\x77\x6c\x6f\x74\x68\x72\x6f\x70\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9d\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x82\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\xa0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x75\x6e\x64\x65\x72\x73\x74\x61\x6e\x64\x69\x6e\x67\x2d\x73\x74\x72\x6f\x6b\x65\x2e\x6f\x72\x67\x15\xa2\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x51\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xda\x03\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x0a\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x70\x68\x72\x61\x67\x6c\x75\x74\x2e\x6d\x74\x72\x69\x2e\x6f\x72\x67\x15\x0c\x05\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x61\x72\x6d\x6c\x69\x62\x2e\x6f\x72\x67\x15\x84\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xd4\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xda\x03\x28\x80\x82\x08\x0a\x3c\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x15\x0a\x1c\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x62\x61\x6e\x6e\x65\x72\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xd9\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6c\x73\x61\x2d\x62\x6f\x6d\x67\x61\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xec\x01\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x75\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xfc\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x19\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xc9\x05\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xc9\x05\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x69\x6d\x70\x75\x74\x61\x74\x69\x6f\x6e\x73\x65\x72\x76\x65\x72\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x64\x1d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xec\x01\x28\x80\xe3\x01\x0a\x4b\x0a\x16\x73\x6e\x6f\x6f\x74\x6c\x65\x73\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf8\xe2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd6\x03\x28\x80\x82\x08\x0a\x50\x0a\x1b\x69\x6e\x73\x74\x72\x75\x63\x74\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xc9\x05\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x70\x73\x73\x74\x69\x67\x6e\x61\x63\x65\x2e\x65\x75\x70\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x77\xd0\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xda\x03\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x75\x73\x74\x61\x69\x6e\x61\x62\x69\x6c\x69\x74\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x76\x70\x6c\x61\x63\x65\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x93\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x48\x0a\x13\x77\x65\x62\x77\x6f\x72\x6b\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x14\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xde\x03\x28\x80\x82\x01\x0a\x51\x0a\x1c\x74\x72\x61\x76\x65\x6c\x65\x72\x73\x61\x72\x63\x68\x69\x76\x65\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xde\x03\x28\x80\x83\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x62\x72\x68\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xf5\xf5\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x62\x74\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\xae\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xff\xff\x03\x0a\x4b\x0a\x16\x70\x72\x6f\x6a\x65\x63\x74\x6c\x6f\x67\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf8\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6f\x6e\x77\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xb2\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\xc9\x05\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x0b\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\xd2\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xcc\x05\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6d\x61\x2e\x65\x64\x75\x15\x6f\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xda\x03\x28\x80\xfe\x07\x0a\x48\x0a\x13\x64\x65\x61\x72\x62\x6f\x72\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1d\x5e\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\x9f\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\x8d\x02\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x73\x6d\x74\x64\x2d\x64\x65\x76\x32\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x64\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x69\x6b\x69\x2e\x63\x69\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x87\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8f\xc9\x05\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x16\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x3e\x0a\x09\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x15\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x6c\x74\x65\x72\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x62\x61\x6e\x6e\x65\x72\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x0f\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xac\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xde\x03\x28\x80\x83\x01\x0a\x4b\x0a\x16\x7a\x68\x61\x6e\x67\x77\x65\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x19\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x63\x63\x62\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x72\x73\x64\x70\x72\x6f\x67\x72\x61\x6d\x2e\x73\x69\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x52\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x72\x69\x70\x65\x6e\x76\x69\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x10\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x7a\x69\x6d\x62\x72\x61\x2e\x6c\x6c\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x68\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd6\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x73\x6f\x73\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4d\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xec\x01\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7a\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xda\x03\x28\x80\xfe\x07\x0a\x4a\x0a\x15\x62\x6c\x61\x63\x6b\x62\x6f\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x6b\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xde\x03\x28\x80\x82\x01\x0a\x4d\x0a\x18\x67\x73\x63\x61\x6e\x2d\x77\x69\x6b\x69\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xfc\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x31\x38\x30\x30\x65\x61\x72\x6c\x79\x6f\x6e\x2e\x6f\x72\x67\x15\xd3\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfb\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd3\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x6d\x69\x63\x68\x69\x67\x61\x6e\x70\x72\x65\x73\x63\x68\x6f\x6f\x6c\x2e\x6f\x72\x67\x15\xdb\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfb\x03\x0a\x51\x0a\x1c\x6e\x65\x77\x67\x61\x74\x65\x77\x61\x79\x2e\x77\x65\x62\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xea\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xde\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xeb\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x69\x64\x70\x2e\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x27\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6d\x69\x62\x79\x74\x65\x73\x2d\x6d\x65\x7a\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdf\x03\x28\x80\x82\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x61\x6e\x76\x61\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x6f\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x58\x0a\x23\x6d\x79\x63\x63\x73\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x1a\xd1\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xc9\x05\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x14\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd6\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x64\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x8d\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x68\x61\x72\x65\x2e\x61\x6e\x61\x6e\x64\x70\x73\x2e\x63\x6f\x6d\x15\xc5\xbf\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xef\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x3c\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xda\x03\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa2\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x73\x65\x62\x65\x77\x61\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x80\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd6\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa1\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x61\x76\x65\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x6f\x72\x67\x15\x79\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x61\x64\x67\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x51\x0a\x1c\x6d\x69\x63\x68\x72\x6f\x73\x73\x2d\x61\x6c\x70\x68\x61\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x4f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x64\x61\x74\x61\x2e\x6f\x69\x72\x61\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x1f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x6f\x72\x72\x6f\x6d\x65\x61\x6e\x2e\x64\x69\x67\x69\x74\x61\x6c\x15\xb0\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x67\x69\x73\x2e\x63\x72\x69\x64\x61\x74\x61\x2e\x6f\x72\x67\x15\xad\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x96\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x0a\x89\x8a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x63\x68\x65\x64\x75\x6c\x69\x6e\x67\x2e\x6d\x75\x73\x69\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\xde\x03\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x19\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xcf\x03\x28\x80\xfe\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x65\x7a\x61\x63\x63\x65\x73\x73\x2e\x62\x6f\x72\x67\x65\x73\x73\x2e\x63\x6f\x6d\x15\xb2\x8f\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x66\x69\x6e\x6c\x61\x6e\x64\x69\x61\x2e\x65\x64\x75\x15\x1c\x1b\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x73\x75\x72\x66\x2e\x75\x72\x63\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbd\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x03\x1a\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xda\x03\x28\x80\x82\x08\x0a\x4a\x0a\x15\x62\x74\x6d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\xae\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x40\x0a\x0b\x73\x63\x63\x63\x6d\x68\x61\x2e\x6f\x72\x67\x15\x4d\x59\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\x81\x06\x0a\x45\x0a\x10\x77\x77\x77\x2e\x75\x72\x63\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x28\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x12\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\x90\x03\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x69\x63\x61\x75\x74\x68\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\x90\x03\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xeb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x68\x72\x6c\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xea\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x08\x0a\x50\x0a\x1b\x74\x65\x73\x74\x2e\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x64\x65\x76\x2e\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x65\x64\x63\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xc9\x05\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x63\x6c\x6f\x75\x64\x2e\x6d\x65\x6e\x6f\x6d\x69\x6e\x65\x65\x63\x6f\x2e\x63\x6f\x6d\x15\x06\xf1\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xcc\x05\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x03\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xcd\x03\x28\x94\x8c\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x85\xc4\x02\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6c\x61\x72\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x50\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x67\x72\x61\x64\x65\x76\x69\x65\x77\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe4\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x75\x72\x70\x68\x79\x2e\x6c\x61\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x09\x1b\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x61\x74\x65\x72\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x52\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x62\x74\x70\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd6\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x65\x63\x6f\x61\x63\x68\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x67\x72\x61\x64\x65\x72\x34\x38\x34\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xde\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd2\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x65\x6c\x61\x6e\x6f\x6d\x61\x61\x6c\x6c\x79\x2e\x6f\x72\x67\x15\x59\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x6c\x61\x72\x6d\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x6f\x75\x74\x68\x66\x69\x65\x6c\x64\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x15\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xc9\x05\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x69\x6d\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdd\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x65\x6e\x63\x6f\x72\x65\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x19\x62\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x73\x61\x74\x75\x72\x6e\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x15\x62\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x06\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8b\xd2\x03\x28\x80\xfe\x01\x0a\x56\x0a\x21\x63\x6f\x6c\x6f\x6d\x61\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x68\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x04\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd2\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x05\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd2\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xc9\x05\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xde\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x63\x73\x67\x61\x64\x6d\x69\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x68\x70\x6c\x2e\x6f\x72\x67\x15\xfe\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xff\xff\x03\x0a\x59\x0a\x24\x72\x69\x76\x65\x72\x73\x69\x64\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6b\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x69\x74\x63\x64\x65\x76\x65\x6c\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x91\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x5b\x0a\x26\x72\x69\x76\x65\x72\x76\x61\x6c\x6c\x65\x79\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x65\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x73\x61\x62\x65\x72\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x55\x0a\x20\x64\x61\x74\x61\x73\x65\x74\x63\x61\x74\x61\x6c\x6f\x67\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x70\x77\x72\x73\x63\x68\x6c\x2e\x6d\x65\x6e\x6f\x6d\x69\x6e\x65\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x06\xff\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xda\x03\x28\x80\x80\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x61\x72\x6d\x6c\x69\x62\x2e\x6f\x72\x67\x15\xae\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x66\x61\x63\x65\x63\x2d\x61\x70\x2d\x70\x63\x31\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x62\x6f\x72\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x73\x61\x70\x73\x70\x73\x63\x68\x6f\x6f\x6c\x2e\x6d\x63\x2d\x69\x73\x64\x2e\x6f\x72\x67\x15\x85\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xde\x03\x28\x80\x8b\x01\x0a\x49\x0a\x14\x6d\x73\x69\x74\x65\x73\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf6\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x63\x63\x67\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\x92\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x76\x70\x6e\x2e\x6e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\xc0\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x79\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xda\x03\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7b\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x2e\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd6\x03\x28\x80\x86\x04\x0a\x4a\x0a\x15\x73\x61\x62\x69\x6e\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa2\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa9\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x28\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xec\x01\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x66\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x70\x2d\x69\x64\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8f\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x59\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x78\x33\x33\x31\x33\x63\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x0b\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8f\xc9\x05\x28\x80\x82\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xab\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\x8d\x02\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x61\x70\x70\x73\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x66\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf6\xde\x03\x28\x80\x8b\x01\x0a\x58\x0a\x23\x6f\x74\x70\x6c\x2d\x76\x6f\x69\x63\x65\x2d\x6d\x69\x76\x6f\x69\x63\x65\x2e\x6f\x72\x69\x6f\x6e\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x8c\xa3\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x39\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x6a\x61\x74\x63\x36\x36\x39\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x36\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x73\x73\x62\x78\x65\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x74\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7c\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x73\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x64\x61\x63\x65\x6e\x74\x65\x72\x2e\x6f\x72\x67\x15\x5b\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x23\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x73\x6f\x63\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x66\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8b\xdf\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xc9\x05\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x64\x75\x63\x6b\x75\x6c\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xde\x03\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8a\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xb1\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\x8d\x02\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x70\x76\x6f\x69\x63\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdf\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x03\xb2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x3f\x0a\x0a\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x70\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xda\x03\x28\x80\xfe\x07\x0a\x41\x0a\x0c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x70\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x71\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x86\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xf0\x01\x28\x80\x80\x08\x0a\x47\x0a\x12\x70\x68\x61\x72\x6d\x61\x63\x79\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd6\x03\x28\x80\x82\x01\x0a\x4a\x0a\x15\x76\x68\x6f\x73\x74\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1a\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x5c\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\x82\x08\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x76\x64\x69\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x04\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x74\x72\x69\x2d\x63\x79\x62\x65\x72\x2e\x75\x6d\x74\x72\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xde\x5c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x80\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd7\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x6a\x75\x72\x79\x2e\x63\x6f\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x2e\x6d\x69\x2e\x75\x73\x15\x76\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xda\x03\x28\x80\xfe\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x6f\x6c\x76\x65\x72\x69\x6e\x65\x73\x6f\x66\x74\x2e\x6f\x72\x67\x15\xd9\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x69\x73\x69\x74\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x73\x68\x65\x72\x69\x66\x66\x2e\x63\x6f\x6d\x15\x71\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x69\x68\x6f\x73\x74\x33\x62\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x6d\x70\x72\x69\x6e\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xde\x03\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x66\x69\x6c\x65\x64\x65\x70\x6f\x74\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x24\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xde\x03\x28\x80\x83\x01\x0a\x50\x0a\x1b\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xde\x03\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x62\x61\x6d\x2d\x6d\x61\x63\x63\x2d\x32\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x86\x93\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6e\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x78\x06\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x70\x70\x73\x2e\x67\x6e\x6f\x73\x69\x73\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\x93\x02\x28\x80\xf3\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xf9\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa0\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x4d\x0a\x18\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x63\x6c\x61\x72\x65\x63\x6f\x2e\x6e\x65\x74\x15\x4d\x74\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x0f\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x71\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xc9\x05\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xc9\x05\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x37\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x52\x0a\x1d\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x42\x0a\x0d\x70\x73\x2e\x72\x61\x79\x64\x65\x72\x2e\x6f\x72\x67\x15\x6a\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xda\x03\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x24\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x3e\x0a\x09\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6a\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xec\x01\x28\x80\x86\x04\x0a\x4b\x0a\x16\x62\x61\x72\x72\x61\x63\x75\x64\x61\x31\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1e\x74\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd6\x03\x28\x80\x82\x01\x0a\x4b\x0a\x16\x62\x61\x72\x72\x61\x63\x75\x64\x61\x32\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1f\x74\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x61\x75\x78\x65\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdc\x9b\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xec\x01\x28\x80\x80\x08\x0a\x4b\x0a\x16\x6a\x65\x66\x66\x65\x72\x73\x6f\x6e\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd7\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\x90\x03\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x6d\x70\x72\x69\x6e\x74\x2d\x74\x65\x73\x74\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xde\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x6c\x69\x73\x74\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xc4\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x33\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc7\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x90\xdf\x03\x28\x80\x82\x01\x0a\x4c\x0a\x17\x61\x66\x72\x69\x63\x61\x6e\x77\x6f\x72\x6c\x64\x68\x69\x73\x74\x6f\x72\x79\x2e\x6f\x72\x67\x15\x1d\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\x8f\x06\x28\x80\x89\x40\x0a\x48\x0a\x13\x77\x77\x77\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x87\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0f\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xd1\x03\x28\x80\xfe\x01\x0a\x4f\x0a\x1a\x6d\x69\x63\x68\x72\x6f\x73\x73\x2d\x75\x61\x74\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x99\x4f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x51\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfe\xef\x01\x28\x80\x86\x04\x0a\x4b\x0a\x16\x6d\x69\x63\x68\x69\x67\x61\x6e\x72\x6f\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x4f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x49\x0a\x14\x75\x6d\x2d\x67\x72\x61\x66\x61\x6e\x61\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x37\xa9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd6\x03\x28\x80\xf0\x02\x0a\x45\x0a\x10\x74\x72\x69\x66\x65\x63\x74\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x75\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xd6\x03\x28\xc0\x8a\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x5b\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd7\x03\x28\x80\x82\x08\x0a\x4b\x0a\x16\x62\x6f\x79\x6c\x65\x6c\x61\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x11\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x70\x73\x2e\x62\x6f\x79\x6e\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa6\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x56\x0a\x21\x70\x6c\x61\x79\x67\x72\x6f\x75\x6e\x64\x2e\x69\x6f\x73\x63\x6f\x61\x72\x65\x6e\x61\x63\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x8c\x59\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xd6\x03\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x61\x73\x6b\x62\x72\x69\x64\x61\x2e\x6f\x72\x67\x15\xda\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x73\x2e\x62\x61\x74\x68\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x98\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x6f\x76\x69\x64\x65\x6c\x73\x69\x65\x2e\x6f\x72\x67\x15\x9a\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x21\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x1e\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xde\x03\x28\x80\xf5\x01\x0a\x51\x0a\x1c\x61\x72\x6b\x6c\x65\x67\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8d\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x67\x69\x6e\x67\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x70\x73\x2e\x6b\x69\x6e\x67\x73\x66\x6f\x72\x64\x2e\x6f\x72\x67\x15\x65\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xda\x03\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x2d\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x0e\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xda\x03\x28\x80\x82\x08\x0a\x4b\x0a\x16\x62\x6c\x75\x65\x2e\x73\x63\x61\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd2\xd6\x03\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x88\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x70\x72\x6f\x6a\x65\x63\x74\x67\x75\x61\x72\x64\x6f\x68\x69\x6f\x2e\x6f\x72\x67\x15\x6f\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd6\x03\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x73\x2e\x63\x68\x61\x72\x65\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x69\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xda\x03\x28\x80\xfe\x07\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x1e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\x90\x03\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x1e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd7\x03\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x32\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x18\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xd7\x03\x28\x80\x8b\x01\x0a\x3e\x0a\x09\x6d\x6d\x74\x73\x62\x2e\x6f\x72\x67\x15\xd8\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x66\x69\x6e\x64\x2d\x70\x61\x6e\x63\x61\x6e\x63\x65\x72\x2d\x65\x61\x72\x6c\x79\x2e\x6f\x72\x67\x15\x2b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7e\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xc9\x05\x28\x80\xf3\x01\x0a\x58\x0a\x23\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x6d\x61\x69\x6c\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x2b\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xde\x03\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x68\x69\x62\x2d\x69\x64\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x87\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xde\x03\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x89\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x70\x65\x7a\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xf8\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\xc0\x81\x08\x0a\x47\x0a\x12\x70\x6f\x72\x74\x61\x6c\x2e\x61\x69\x72\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\xef\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x62\x61\x79\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x3a\x52\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xde\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x63\x69\x74\x72\x69\x78\x2e\x77\x6d\x63\x63\x2e\x6f\x72\x67\x15\x4e\xae\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xe0\x92\x02\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc7\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x65\x62\x61\x63\x63\x65\x73\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb7\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x69\x6e\x65\x6d\x61\x63\x75\x72\x69\x6f\x73\x61\x2e\x6f\x72\x67\x15\x78\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd6\x03\x28\x80\xf3\x01\x0a\x58\x0a\x23\x62\x72\x69\x64\x67\x6d\x61\x6e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x69\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xda\x03\x28\x80\x82\x08\x0a\x4b\x0a\x16\x77\x77\x77\x32\x2d\x75\x61\x74\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x59\x0a\x24\x65\x61\x75\x63\x6c\x61\x69\x72\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x66\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x58\x0a\x23\x62\x75\x63\x68\x61\x6e\x61\x6e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x67\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xda\x03\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x07\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8e\xd7\x03\x28\x80\x86\x04\x0a\x49\x0a\x14\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x68\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x35\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6f\x6c\x6c\x65\x63\x74\x6f\x72\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x86\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xc9\x05\x28\x80\x82\x01\x0a\x4b\x0a\x16\x6d\x69\x74\x6f\x6f\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x65\x62\x6d\x61\x69\x6c\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd4\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\x90\x03\x28\x80\xf3\x01\x0a\x59\x0a\x24\x70\x6f\x6c\x69\x63\x79\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x21\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xc9\x05\x28\x80\x83\x01\x0a\x45\x0a\x10\x6d\x70\x72\x69\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x94\xdf\x03\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd2\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x66\x69\x74\x75\x73\x63\x2e\x6f\x72\x67\x15\x1a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x72\x6f\x63\x75\x72\x65\x6d\x65\x6e\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5f\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x74\x71\x69\x70\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xbb\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x08\x0a\x52\x0a\x1d\x6d\x69\x77\x6f\x72\x6b\x73\x70\x61\x63\x65\x2d\x61\x70\x70\x73\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x70\x61\x63\x73\x2e\x77\x6d\x63\x63\x2e\x6f\x72\x67\x15\x37\xae\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x70\x72\x6f\x78\x79\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x70\x70\x6d\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\xd8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x70\x6f\x72\x74\x61\x6c\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x4e\x0a\x19\x65\x67\x74\x61\x6f\x6e\x6c\x69\x6e\x65\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9d\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd6\x03\x28\x80\x82\x01\x0a\x50\x0a\x1b\x66\x75\x73\x69\x6f\x6e\x2d\x74\x69\x73\x73\x75\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xfc\x01\x0a\x3f\x0a\x0a\x65\x66\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x71\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x90\xdf\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x70\x6e\x2e\x6c\x76\x64\x68\x65\x61\x6c\x74\x68\x63\x65\x6e\x74\x65\x72\x2e\x63\x6f\x6d\x15\x5c\x37\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x61\x6c\x74\x61\x72\x75\x6d\x2e\x6f\x72\x67\x15\x39\x06\x48\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x47\x0a\x12\x6e\x65\x6c\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xde\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x67\x61\x74\x65\x77\x61\x79\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x9c\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa6\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xd6\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd7\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xc9\x05\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x69\x6c\x2e\x74\x62\x63\x68\x73\x2e\x6f\x72\x67\x15\x02\x4b\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\x90\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x72\x76\x69\x63\x65\x61\x70\x69\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x43\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xe9\x02\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\xde\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xd6\x03\x28\x80\xf5\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xde\x03\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x93\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x62\x61\x6e\x64\x6d\x65\x6d\x62\x65\x72\x2e\x63\x6f\x6d\x15\xd6\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x68\x65\x72\x65\x69\x67\x6f\x61\x70\x70\x2e\x6f\x72\x67\x15\xd7\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xd6\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x70\x6c\x61\x73\x6d\x61\x70\x69\x63\x74\x75\x72\x65\x6f\x66\x74\x68\x65\x64\x61\x79\x2e\x6f\x72\x67\x15\x22\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x72\x73\x63\x6c\x2d\x67\x72\x73\x73\x2e\x6f\x72\x67\x15\x24\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x34\x38\x35\x2e\x6f\x72\x67\x15\x1f\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x94\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x68\x63\x64\x6c\x69\x6c\x73\x2e\x68\x6f\x77\x65\x6c\x6c\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xa4\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x45\x0a\x10\x61\x70\x70\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xde\x03\x28\x80\x83\x01\x0a\x48\x0a\x13\x62\x72\x61\x76\x6f\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xde\x03\x28\x80\x82\x01\x0a\x40\x0a\x0b\x6d\x73\x63\x2d\x64\x72\x2e\x73\x69\x74\x65\x15\xb2\x75\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x79\x2e\x75\x6d\x63\x75\x2e\x6f\x72\x67\x15\xc3\xbc\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\xa0\xfb\x01\x0a\x44\x0a\x0f\x6d\x6c\x73\x2e\x6c\x61\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x46\x8d\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd6\x03\x28\x80\x84\x01\x0a\x49\x0a\x14\x67\x65\x65\x63\x73\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x70\x73\x2e\x66\x6f\x77\x6c\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x97\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x75\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x02\xd3\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x3f\x0a\x0a\x64\x62\x73\x65\x65\x72\x2e\x6f\x72\x67\x15\x45\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\x91\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x73\x75\x2d\x67\x72\x61\x66\x61\x6e\x61\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x13\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xe0\x02\x0a\x46\x0a\x11\x6d\x73\x75\x2d\x65\x6c\x6b\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x0e\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd6\x03\x28\x80\xe0\x02\x0a\x4f\x0a\x1a\x73\x68\x69\x62\x2d\x73\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaf\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xde\x03\x28\x80\x82\x01\x0a\x4c\x0a\x17\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x73\x2e\x6d\x69\x64\x65\x6e\x74\x61\x6c\x2e\x6f\x72\x67\x15\x55\xba\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x6e\x65\x74\x6c\x61\x62\x32\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x63\x86\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x69\x65\x73\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x85\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\xb5\x75\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x31\x32\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf2\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x97\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xda\x03\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x77\x69\x6c\x6c\x61\x72\x64\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xac\x96\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x67\x6c\x6f\x67\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6a\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\xf5\x01\x0a\x41\x0a\x0c\x76\x70\x6e\x2e\x75\x6d\x63\x75\x2e\x6f\x72\x67\x15\xd0\xbc\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x73\x75\x73\x75\x72\x67\x65\x72\x79\x67\x6f\x61\x6c\x2e\x63\x6f\x6d\x15\xb7\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6b\x75\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\x46\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd7\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbd\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x77\x68\x6f\x76\x69\x6c\x6c\x65\x2e\x63\x68\x63\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa1\x18\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x8b\x89\x8a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xdf\x03\x28\x80\x82\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x09\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x92\xec\x01\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x76\x70\x6c\x61\x63\x65\x73\x74\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x93\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x61\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2b\x01\x48\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\xfe\x07\x0a\x45\x0a\x10\x72\x65\x6d\x6f\x74\x65\x2e\x67\x65\x6e\x6e\x65\x74\x2e\x75\x73\x15\x09\xba\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x44\x0a\x0f\x73\x79\x62\x6f\x78\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xdf\x03\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x63\x63\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\x5a\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\x8b\x01\x0a\x50\x0a\x1b\x6d\x65\x2d\x77\x65\x62\x31\x2d\x64\x65\x76\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x15\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x91\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xde\x03\x28\x80\x82\x01\x0a\x45\x0a\x10\x66\x6d\x73\x2e\x62\x66\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5a\xc2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xd6\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x74\x62\x63\x68\x73\x2e\x6f\x72\x67\x15\x64\x4b\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x6d\x79\x67\x6f\x75\x74\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\x11\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd6\x03\x28\x80\xfc\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x22\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x48\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd6\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x68\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xda\x03\x28\x80\xfe\x07\x0a\x45\x0a\x10\x72\x65\x6d\x6f\x74\x65\x2e\x67\x65\x6e\x6e\x65\x74\x2e\x75\x73\x15\x02\xba\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x67\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x70\x73\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x74\x65\x63\x68\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xd0\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x78\x33\x33\x31\x33\x2e\x65\x65\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\x0b\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x92\xc9\x05\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x80\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xc9\x05\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x95\xc9\x05\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x72\x75\x73\x74\x65\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x31\x38\x33\x2e\x6f\x72\x67\x15\x31\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xaa\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xad\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\x8d\x02\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x68\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xb0\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\x8d\x02\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x69\x73\x2e\x67\x61\x79\x6c\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x2e\xa7\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xd6\x03\x28\x80\x82\x08\x0a\x57\x0a\x22\x6c\x75\x6e\x61\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xc8\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xc9\x05\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x6d\x79\x6a\x64\x6c\x2e\x63\x6f\x6d\x15\xfd\xdb\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\x84\x04\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x75\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x8e\xd0\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x47\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x70\x6d\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xde\xbc\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\x80\x10\x0a\x47\x0a\x12\x77\x77\x77\x32\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x94\x4f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x4d\x0a\x18\x6b\x69\x74\x7a\x6d\x61\x6e\x6c\x61\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x84\x08\x0a\x56\x0a\x21\x69\x64\x70\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x26\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x62\x67\x2e\x79\x70\x73\x69\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xab\xa7\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x21\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x6d\x69\x63\x68\x69\x67\x61\x6e\x72\x6f\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb1\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x4f\x0a\x1a\x6d\x69\x63\x68\x72\x6f\x73\x73\x2d\x75\x61\x74\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb0\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x51\x0a\x1c\x6d\x69\x63\x68\x72\x6f\x73\x73\x2d\x61\x6c\x70\x68\x61\x2e\x62\x75\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaf\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x41\x0a\x0c\x6d\x61\x69\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd1\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xde\x03\x28\xf0\xf2\x01\x0a\x44\x0a\x0f\x73\x72\x63\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x0a\x64\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x67\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xda\x03\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x65\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x69\x7a\x7a\x74\x69\x6e\x63\x74\x2e\x63\x6f\x6d\x15\x6c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xd6\x03\x28\x80\xfc\x01\x0a\x49\x0a\x14\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x1b\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x99\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xde\x03\x28\x80\x8b\x01\x0a\x3d\x0a\x08\x6d\x62\x6e\x69\x2e\x6f\x72\x67\x15\x6a\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x61\x64\x2d\x65\x78\x39\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x36\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x36\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x98\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xb2\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x69\x74\x61\x73\x74\x73\x74\x37\x30\x31\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x1e\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x4e\x4b\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x08\x1a\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x6c\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x70\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x6d\x0a\x4c\x0a\x0a\x61\x6d\x61\x64\x6f\x72\x2e\x6e\x65\x74\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x2a\x00\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0a\x52\x0a\x10\x77\x77\x77\x2e\x68\x6f\x73\x74\x77\x69\x72\x65\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x16\x3e\xff\xfe\x2d\xc9\x33\x0a\x58\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x9a\x04\x0a\x58\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x9b\x04\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x12\x05\x44\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x12\x04\x44\x0a\x52\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x00\x14\x04\x18\x00\x00\x00\x00\x00\x00\x00\x17\xd5\x36\x19\x0a\x52\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x00\x14\x04\x18\x00\x00\x00\x00\x00\x00\x00\x17\xd5\x36\x22\x0a\x52\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x70\x0a\x51\x0a\x0f\x64\x65\x76\x61\x70\x70\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x73\x0a\x61\x0a\x1f\x68\x73\x2d\x73\x63\x39\x2d\x70\x72\x6f\x64\x2d\x63\x64\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x20\x01\xec\x0b\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x0a\x50\x0a\x0e\x65\x64\x75\x63\x61\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x22\x06\x01\x98\x01\x10\x02\x06\x00\x16\x0a\x58\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x10\x00\x00\x00\x00\x00\x00\x68\x14\x33\x79\x0a\x58\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x10\x00\x00\x00\x00\x00\x00\x68\x14\x34\x79\x0a\x57\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x06\x47\x00\x30\x36\x00\x00\x00\x00\x00\x00\x68\x1b\xb1\x9d\x0a\x57\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\xb0\x9d\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x09\x34\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x08\x34\x0a\x55\x0a\x13\x62\x69\x6c\x76\x61\x72\x64\x73\x65\x78\x70\x65\x72\x74\x65\x6e\x2e\x73\x65\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x32\x10\x2a\x02\x02\x50\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x52\x0a\x51\x0a\x0f\x77\x77\x77\x2e\x65\x72\x70\x73\x6b\x31\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x32\x10\x2a\x04\x4e\x42\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x0a\x5c\x0a\x1a\x77\x65\x64\x64\x69\x6e\x67\x2e\x68\x75\x6e\x67\x65\x72\x74\x69\x6e\x2d\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x2a\x00\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x0a\x5c\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x09\xcf\x0a\x5c\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x08\xcf\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x44\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x43\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x47\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x45\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x46\x49\x0a\x52\x0a\x10\x66\x72\x61\x6e\x6b\x6c\x69\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x00\x65\x0a\x50\x0a\x0e\x62\x65\x61\x6b\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x13\x0a\x52\x0a\x10\x70\x73\x75\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x59\x0a\x5c\x0a\x1a\x69\x64\x70\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x59\x0a\x57\x0a\x15\x70\x73\x75\x6d\x30\x36\x2d\x31\x30\x30\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x63\x0a\x50\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x35\x00\x00\x00\x00\x00\x00\x68\x1f\x50\x7f\x0a\x50\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x30\x00\x00\x00\x00\x00\x00\x68\x1f\x51\x7f\x0a\x4f\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\xa5\xa2\x0a\x4f\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\xa4\xa2\x0a\x54\x0a\x12\x70\x73\x63\x6f\x6e\x66\x69\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x80\x01\x01\x92\x00\x41\x02\x36\x01\x05\x0a\x5b\x0a\x19\x70\x73\x72\x73\x76\x2e\x6f\x70\x65\x6e\x73\x63\x69\x65\x6e\x63\x65\x67\x72\x69\x64\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe4\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x80\x01\x01\x92\x00\x41\x02\x36\x01\x07\x0a\x4f\x0a\x0d\x6d\x61\x69\x6c\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x32\x10\x20\x01\x48\xa8\x08\x00\x22\x06\x01\x98\x01\x10\x02\x06\x00\x44\x0a\x4e\x0a\x0c\x6d\x72\x61\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x58\x0a\x52\x0a\x10\x67\x61\x74\x65\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x11\x0a\x5c\x0a\x1a\x62\x61\x6d\x2d\x63\x6f\x6f\x6c\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x07\xf0\x18\x01\x70\x00\x02\xd6\xbe\xd9\xff\xfe\xb4\xc1\x53\x0a\x5c\x0a\x1a\x69\x73\x6d\x67\x6d\x74\x31\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x32\x10\x20\x02\x23\x09\xbc\xe1\x00\x00\x00\x00\x00\x00\x23\x09\xbc\xe1\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x32\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\x92\x03\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x42\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x45\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x33\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x43\x0a\x53\x0a\x11\x77\x77\x77\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xe0\x03\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x02\x48\x0a\x53\x0a\x11\x6c\x73\x61\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x0a\x5b\x0a\x19\x67\x72\x6f\x75\x70\x65\x72\x64\x65\x6d\x6f\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x0a\x57\x0a\x15\x77\x65\x62\x64\x65\x76\x38\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x00\x04\x0a\x52\x0a\x10\x6e\x6f\x74\x65\x62\x6f\x6f\x6b\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x59\x0a\x51\x0a\x0f\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x32\x10\x20\x01\x48\xa8\x08\x00\x11\x92\x01\x98\x01\x10\x01\x92\x00\x49\x0a\x52\x0a\x10\x6f\x70\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x28\x0a\x58\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x31\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\x8f\x03\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x23\x0a\x4f\x0a\x0d\x6d\x79\x6e\x6d\x75\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x02\x25\x0a\x50\x0a\x0e\x6d\x79\x75\x73\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x11\x92\x01\x98\x01\x10\x01\x92\x00\x61\x0a\x4b\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x32\x10\x26\x07\xf0\x18\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\x64\x00\x00\x00\x00\x00\x00\x23\x09\x4b\x64\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\xbf\x00\x00\x00\x00\x00\x00\x23\x09\x4b\xbf\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x98\x41\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x99\x41\x0a\x49\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x85\xd1\x0a\x49\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\x84\xd1\x0a\x5b\x0a\x19\x69\x64\x70\x2e\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x0a\x53\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x32\x10\x26\x20\x01\x2a\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0a\x53\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x32\x10\x26\x20\x01\x2a\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\x66\x00\x00\x00\x00\x00\x00\x23\x09\x4b\x66\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\xc1\x00\x00\x00\x00\x00\x00\x23\x09\x4b\xc1\x10\x81\x09\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x22\x94\x02\x0a\x2b\x08\x4f\x12\x10\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x39\x30\x2e\x30\x2f\x32\x34\x12\x15\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x36\x38\x37\x66\x3a\x31\x3a\x3a\x2f\x36\x34\x0a\x36\x08\x0a\x12\x0e\x31\x34\x31\x2e\x32\x31\x39\x2e\x30\x2e\x30\x2f\x31\x36\x12\x0b\x33\x35\x2e\x38\x2e\x30\x2e\x30\x2f\x31\x36\x12\x15\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x37\x66\x66\x66\x3a\x32\x3a\x3a\x2f\x36\x34\x0a\x27\x08\x0a\x12\x0b\x33\x35\x2e\x36\x2e\x30\x2e\x30\x2f\x31\x36\x12\x16\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x36\x38\x37\x66\x3a\x31\x3a\x3a\x2f\x31\x31\x32\x0a\x83\x01\x08\x01\x12\x10\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x38\x34\x2e\x30\x2f\x32\x34\x12\x10\x31\x39\x32\x2e\x32\x30\x33\x2e\x31\x39\x35\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x38\x38\x2e\x32\x34\x32\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x34\x31\x2e\x32\x32\x39\x2e\x30\x2f\x32\x34\x12\x10\x32\x30\x36\x2e\x32\x30\x31\x2e\x31\x35\x37\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x33\x35\x2e\x31\x36\x38\x2e\x30\x2f\x32\x33\x12\x16\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x37\x66\x66\x66\x3a\x32\x3a\x3a\x2f\x31\x31\x32\x2a\x24\x0a\x20\xa1\xcb\x97\xbe\x69\x7c\x5e\xd5\xae\xfd\x78\xff\xa4\xdb\x7e\x68\x10\x10\x24\x60\x35\x11\xe4\x0a\x89\x95\x1b\xc1\x58\x80\x71\x77\x10\x5a" +var embeddedClientConf = "\x0a\x9c\xb9\x0d\x0a\x4c\x0a\x17\x61\x64\x64\x6d\x61\x73\x62\x6e\x70\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x61\x64\x64\x6d\x61\x73\x62\x70\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcb\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6e\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe6\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x45\x78\x70\x72\x65\x73\x73\x77\x61\x79\x2d\x45\x2d\x31\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x3e\x0a\x09\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x45\x78\x70\x72\x65\x73\x73\x77\x61\x79\x2d\x45\x2d\x33\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa6\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xb2\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x0a\x52\x0a\x1d\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x64\x6c\x2e\x73\x6f\x75\x72\x63\x65\x66\x6f\x72\x67\x65\x2e\x6e\x65\x74\x15\x06\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x15\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf4\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x6c\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x6d\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x61\x6d\x61\x64\x6f\x72\x2e\x6e\x65\x74\x15\x1f\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x6f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xc0\x81\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6f\x70\x65\x6e\x6a\x65\x72\x69\x63\x68\x6f\x2e\x63\x6f\x6d\x15\xdd\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x69\x63\x68\x6d\x65\x6d\x6f\x72\x69\x65\x73\x2e\x6f\x72\x67\x15\xdc\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x09\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x6f\x75\x6e\x74\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x06\x7d\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x59\x0a\x24\x61\x63\x74\x2d\x73\x68\x72\x69\x6e\x65\x2d\x73\x74\x61\x67\x65\x2e\x6d\x69\x63\x68\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6f\x6e\x65\x73\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x71\x61\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\xda\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xdb\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x61\x75\x64\x69\x6f\x76\x69\x73\x75\x61\x6c\x66\x72\x6f\x6d\x73\x70\x61\x69\x6e\x2e\x63\x6f\x6d\x15\xd6\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x7a\x70\x61\x73\x73\x76\x61\x2e\x63\x6f\x6d\x15\xd8\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x6f\x6d\x73\x64\x65\x76\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\xd9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x62\x67\x2e\x67\x69\x62\x64\x69\x73\x74\x2e\x6f\x72\x67\x15\x09\xe1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x61\x64\x6d\x69\x6e\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xd5\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x10\x6d\x64\x63\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x6f\x72\x67\x15\xfd\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4a\x0a\x14\x64\x65\x76\x2e\x6d\x64\x63\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x6f\x72\x67\x15\xfe\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4d\x0a\x18\x62\x65\x7a\x61\x6b\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x84\x08\x0a\x4f\x0a\x1a\x6d\x69\x63\x68\x72\x2d\x64\x65\x6d\x6f\x30\x31\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x84\x08\x0a\x50\x0a\x1b\x70\x73\x2e\x63\x6f\x76\x65\x6e\x61\x6e\x74\x68\x6f\x75\x73\x65\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\x67\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x56\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x6d\x73\x65\x74\x75\x70\x2d\x69\x6c\x61\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd1\xd8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x72\x65\x70\x6f\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdd\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x71\x75\x6f\x64\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb1\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x61\x63\x63\x6f\x75\x6e\x74\x73\x2e\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x3f\x25\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x67\x72\x69\x73\x2d\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x62\x61\x73\x65\x2e\x6f\x72\x67\x15\xd8\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x66\x6c\x65\x78\x70\x6c\x6d\x2e\x74\x72\x75\x2e\x63\x6f\x6d\x15\x64\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xd4\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x66\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x73\x6f\x70\x68\x65\x6f\x6e\x65\x75\x2e\x6e\x65\x74\x15\x68\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x68\x6f\x73\x74\x77\x69\x72\x65\x2e\x63\x6f\x6d\x15\x14\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x62\x67\x2e\x67\x61\x72\x64\x65\x6e\x63\x69\x74\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x08\xdf\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x61\x66\x65\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x61\x63\x74\x69\x76\x61\x74\x65\x68\x72\x2e\x63\x61\x15\xed\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc0\x87\x01\x0a\x53\x0a\x1e\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x15\x3c\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x15\x3d\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x06\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc8\xf3\x03\x0a\x5b\x0a\x26\x72\x61\x63\x6b\x69\x72\x74\x65\x73\x74\x73\x65\x72\x76\x65\x72\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc8\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xcb\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x70\x73\x2e\x6c\x69\x6e\x63\x6f\x6c\x6e\x6b\x31\x32\x2e\x6f\x72\x67\x15\x6e\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x4c\x0a\x17\x70\x73\x2e\x6d\x69\x6c\x61\x6e\x61\x72\x65\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x71\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x73\x2e\x6d\x63\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x70\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x40\x0a\x0b\x70\x73\x2e\x77\x6c\x70\x73\x2e\x6e\x65\x74\x15\x73\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x40\x0a\x0b\x70\x73\x2e\x77\x69\x68\x69\x2e\x6f\x72\x67\x15\x72\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x63\x61\x65\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\x8e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x03\x0a\x4f\x0a\x1a\x62\x61\x63\x6b\x75\x70\x2e\x63\x72\x65\x61\x74\x65\x34\x73\x74\x65\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1c\x77\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\xfa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xb8\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x73\x6c\x6f\x77\x2e\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x26\xfa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xb8\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x6e\x6c\x69\x6e\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x70\x73\x2e\x6a\x65\x6e\x69\x73\x6f\x6e\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\xe4\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\xe6\xf3\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\xe2\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xff\xff\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\x0a\x38\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xfc\xff\x0f\x0a\x48\x0a\x13\x61\x74\x6c\x61\x73\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x07\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\xa4\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x75\x6e\x69\x76\x65\x61\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\x81\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x02\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x61\x6c\x6d\x6f\x6e\x74\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x65\xfd\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x64\x6f\x65\x74\x65\x72\x74\x6f\x65\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x6c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x70\x69\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x64\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x67\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x6d\x73\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x66\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x63\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x73\x74\x61\x67\x69\x6e\x67\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x04\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x65\x62\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x63\x68\x65\x63\x6b\x6f\x75\x74\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\xd5\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x65\x62\x64\x69\x73\x6b\x2e\x70\x72\x69\x6e\x74\x74\x6f\x70\x72\x65\x73\x73\x2e\x63\x6f\x6d\x15\xd4\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x45\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6d\x6f\x68\x65\x67\x61\x6e\x67\x61\x6d\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x02\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x43\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x63\x69\x74\x79\x77\x6f\x72\x6b\x73\x2e\x73\x61\x72\x61\x74\x6f\x67\x61\x73\x70\x72\x69\x6e\x67\x73\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x0c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x6f\x75\x69\x73\x69\x61\x6e\x61\x73\x74\x6f\x6e\x65\x2e\x62\x69\x7a\x15\x0a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x09\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x6f\x74\x63\x68\x65\x69\x67\x68\x74\x62\x6c\x6f\x67\x2e\x63\x6f\x6d\x15\x08\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x65\x78\x70\x65\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\xbb\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x74\x6f\x70\x64\x65\x73\x6b\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xe6\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x61\x62\x63\x6f\x69\x6e\x64\x75\x73\x74\x72\x69\x65\x73\x2e\x63\x6f\x6d\x15\xe7\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xef\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd1\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x74\x6f\x74\x73\x63\x6f\x72\x65\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x59\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x63\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x73\x74\x61\x74\x75\x73\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x93\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6e\x65\x77\x62\x72\x61\x6e\x63\x68\x65\x73\x2e\x6f\x72\x67\x15\x5f\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x61\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x6d\x61\x69\x6c\x2e\x67\x62\x63\x61\x6d\x70\x62\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x0c\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x75\x70\x64\x61\x74\x65\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x10\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x11\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xe3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xcd\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xfb\x03\x0a\x45\x0a\x10\x77\x65\x62\x64\x61\x76\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\xee\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x89\x40\x0a\x4d\x0a\x18\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x12\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x73\x62\x72\x6a\x2e\x77\x6f\x72\x6b\x15\x57\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x73\x74\x75\x64\x65\x6e\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x56\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6a\x65\x73\x73\x65\x6c\x6f\x77\x65\x64\x65\x73\x69\x67\x6e\x73\x2e\x63\x6f\x6d\x15\x55\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x9b\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x73\x74\x61\x67\x69\x6e\x67\x2d\x63\x6f\x6d\x6d\x73\x70\x6f\x72\x74\x61\x6c\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x50\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6e\x61\x72\x73\x64\x69\x67\x69\x74\x61\x6c\x73\x74\x75\x64\x69\x6f\x2e\x63\x6f\x6d\x15\xcd\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x14\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xcc\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xce\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x64\x63\x73\x65\x70\x6d\x2d\x63\x73\x61\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x23\x00\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3c\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xcb\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x61\x69\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc9\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3d\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x70\x73\x2e\x70\x61\x6e\x74\x68\x65\x72\x6e\x65\x74\x2e\x6e\x65\x74\x15\x2e\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x64\x61\x6e\x73\x76\x69\x6c\x6c\x65\x2e\x6f\x72\x67\x15\x2f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x08\x0a\x4e\x0a\x19\x70\x73\x2e\x77\x65\x62\x62\x65\x72\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x2c\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x72\x65\x64\x6d\x69\x6e\x65\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x48\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x72\x65\x6d\x63\x73\x61\x76\x65\x2e\x6f\x72\x67\x15\x2b\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x70\x73\x2e\x77\x65\x73\x74\x6d\x69\x63\x68\x69\x67\x61\x6e\x61\x76\x69\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x1f\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x70\x73\x2e\x67\x6f\x77\x63\x73\x2e\x6e\x65\x74\x15\x30\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x73\x2e\x77\x61\x76\x65\x72\x6c\x79\x6b\x31\x32\x2e\x6e\x65\x74\x15\x88\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x73\x6f\x66\x74\x70\x68\x6f\x6e\x65\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\x2d\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfa\x03\x0a\x49\x0a\x13\x64\x61\x74\x61\x64\x69\x72\x65\x63\x74\x2e\x6d\x70\x6f\x67\x2e\x6f\x72\x67\x15\x22\xfc\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x80\x80\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x69\x65\x77\x73\x2e\x72\x61\x70\x69\x64\x66\x69\x72\x65\x64\x61\x74\x61\x2e\x63\x6f\x6d\x15\xa4\x27\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x84\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x2c\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x2d\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x76\x32\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x30\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x6e\x64\x72\x65\x77\x64\x65\x6f\x72\x69\x6f\x2e\x63\x6f\x6d\x15\xfd\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x6d\x73\x2d\x63\x72\x65\x64\x65\x6e\x74\x69\x61\x6c\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x5c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x63\x68\x65\x6d\x73\x65\x61\x72\x63\x68\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x5a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x67\x70\x73\x6d\x64\x6d\x2e\x67\x72\x61\x6e\x74\x70\x73\x2e\x6e\x65\x74\x15\x25\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x48\x0a\x13\x73\x31\x37\x39\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x07\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x73\x2d\x61\x69\x63\x63\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x05\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x76\x67\x7a\x76\x6f\x6f\x72\x64\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x04\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x09\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x38\x30\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x08\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x62\x66\x78\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3c\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfc\x01\x0a\x4f\x0a\x1a\x6b\x69\x64\x64\x6c\x61\x62\x73\x68\x61\x72\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x65\x62\x2e\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x44\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\xc3\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x6f\x6e\x64\x65\x6d\x61\x6e\x64\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x6d\x67\x69\x73\x2d\x73\x74\x61\x67\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x66\x75\x6c\x6c\x66\x72\x61\x6d\x65\x2e\x63\x6f\x6d\x15\x18\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xe0\x87\x01\x0a\x55\x0a\x20\x77\x77\x77\x2e\x63\x61\x74\x70\x72\x6f\x64\x75\x63\x74\x69\x76\x69\x74\x79\x6f\x70\x74\x69\x6d\x69\x7a\x65\x72\x2e\x63\x6f\x6d\x15\x1d\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xc0\x87\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x1c\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xe0\x87\x01\x0a\x5d\x0a\x28\x62\x65\x61\x74\x73\x6f\x6e\x63\x61\x6e\x63\x65\x72\x63\x68\x61\x72\x69\x74\x79\x2e\x65\x71\x75\x61\x74\x6f\x72\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xbf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xbe\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x64\x65\x73\x74\x69\x6e\x79\x2e\x68\x61\x6d\x69\x6c\x74\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x13\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xe7\xf3\x03\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x74\x6f\x6c\x6c\x72\x6f\x61\x64\x73\x69\x6e\x76\x69\x72\x67\x69\x6e\x69\x61\x2e\x63\x6f\x6d\x15\xc7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x61\x67\x65\x6e\x74\x2e\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x78\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x74\x75\x6c\x69\x70\x2e\x73\x61\x6c\x69\x65\x6e\x74\x72\x69\x73\x6b\x2e\x6e\x65\x74\x15\x7a\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x6c\x6f\x67\x69\x6e\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x77\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x64\x2d\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xfc\xfd\x07\x0a\x58\x0a\x23\x61\x61\x63\x6f\x6c\x6c\x61\x62\x61\x72\x63\x68\x69\x76\x65\x2e\x68\x75\x6d\x69\x6e\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x64\x75\x6e\x64\x65\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x1f\xa8\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xf0\xf2\x01\x0a\x50\x0a\x1b\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x63\x61\x72\x69\x6e\x67\x34\x77\x61\x72\x64\x2e\x6f\x72\x67\x15\x29\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x73\x73\x74\x65\x73\x74\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\x9a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6a\x69\x72\x61\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x96\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6b\x6c\x61\x76\x6f\x6e\x73\x2e\x69\x6e\x74\x65\x6c\x6c\x61\x76\x2e\x63\x6f\x6d\x15\x08\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x75\x6e\x69\x76\x65\x70\x72\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x98\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x5b\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x73\x76\x6e\x2e\x69\x6e\x74\x65\x6c\x6c\x61\x76\x2e\x63\x6f\x6d\x15\x07\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\x9f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x74\x69\x73\x2e\x73\x70\x73\x70\x2e\x65\x64\x75\x2e\x73\x61\x15\x9e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x69\x6b\x69\x68\x6f\x73\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6c\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x49\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x23\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x4a\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x4f\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x6d\x69\x74\x6f\x6f\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd5\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x74\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x67\x6c\x61\x6e\x63\x65\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\x75\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x69\x6e\x73\x74\x65\x72\x6c\x61\x77\x2e\x63\x6f\x2e\x75\x6b\x15\x72\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x6d\x73\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x73\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x73\x65\x63\x75\x72\x65\x2e\x62\x6c\x6f\x6f\x64\x2d\x70\x72\x65\x73\x73\x75\x72\x65\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x71\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x73\x74\x61\x67\x69\x6e\x67\x2d\x64\x72\x61\x78\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x6e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x79\x2e\x63\x79\x62\x65\x72\x74\x72\x61\x69\x6c\x73\x2e\x63\x6f\x6d\x15\xda\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4e\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x6d\x69\x74\x68\x62\x72\x6f\x74\x68\x65\x72\x73\x66\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x1b\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x73\x74\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x19\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x69\x73\x6f\x76\x2e\x67\x61\x15\x16\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x79\x6e\x74\x68\x65\x73\x79\x73\x2e\x69\x6e\x66\x6f\x15\x15\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x69\x6d\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdf\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x62\x6e\x61\x64\x6d\x30\x31\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x49\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x46\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x47\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x5c\x0a\x27\x65\x6e\x63\x6f\x6d\x70\x61\x73\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x64\x65\x76\x61\x70\x70\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x49\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xe2\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x33\x64\x6c\x61\x6e\x64\x73\x63\x61\x70\x65\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xe5\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xe4\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x6e\x3b\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe8\x81\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x66\x6c\x61\x74\x61\x62\x6c\x65\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6d\x15\x0c\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x61\x70\x69\x67\x77\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\xc7\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x8b\x01\x0a\x50\x0a\x1b\x6f\x70\x61\x6c\x2e\x77\x75\x6f\x6d\x2e\x75\x6e\x69\x76\x72\x65\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x30\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc8\x8c\x01\x0a\x3c\x0a\x07\x73\x63\x34\x2e\x65\x64\x75\x15\x72\x83\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x0f\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\x08\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x76\x70\x6e\x2d\x6d\x67\x6d\x74\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x60\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xb8\x01\x0a\x49\x0a\x14\x6d\x73\x72\x74\x65\x6b\x62\x6f\x78\x2e\x61\x78\x69\x73\x63\x61\x70\x2e\x69\x6e\x15\x46\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x61\x78\x69\x73\x63\x61\x70\x69\x74\x61\x6c\x2e\x63\x6f\x2e\x69\x6e\x15\x4a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6d\x2d\x61\x73\x70\x69\x72\x65\x2e\x61\x78\x69\x73\x63\x61\x70\x2e\x69\x6e\x15\x4b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x70\x73\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x48\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x6c\x65\x73\x6c\x69\x65\x6b\x31\x32\x2e\x6e\x65\x74\x15\x4a\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x64\x66\x72\x65\x79\x2d\x6c\x65\x65\x2e\x6f\x72\x67\x15\x28\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x67\x6f\x64\x66\x72\x65\x79\x2d\x6c\x65\x65\x2e\x6f\x72\x67\x15\x29\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x10\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x74\x72\x61\x69\x74\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x04\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x61\x72\x6f\x6e\x62\x65\x6c\x74\x73\x2e\x63\x6f\x6d\x15\x05\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x76\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6c\x69\x62\x2d\x70\x72\x6f\x78\x79\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x86\x7c\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x61\x70\x70\x6c\x79\x2e\x6d\x69\x63\x68\x69\x67\x61\x6e\x73\x74\x61\x66\x66\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xfb\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xc0\x87\x01\x0a\x46\x0a\x11\x63\x6c\x6f\x75\x64\x2e\x64\x65\x73\x61\x69\x6c\x6c\x65\x2e\x66\x72\x15\x38\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x65\x62\x67\x6f\x61\x74\x2e\x6e\x65\x69\x6c\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x34\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x32\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x58\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x51\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x67\x77\x2d\x6d\x73\x75\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x1e\xc3\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf0\x02\x0a\x4d\x0a\x18\x70\x61\x73\x73\x77\x6f\x72\x64\x2e\x66\x6c\x69\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x73\x65\x72\x76\x69\x63\x69\x6e\x67\x73\x75\x70\x72\x65\x6d\x65\x2e\x63\x6f\x6d\x15\x52\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2d\x74\x65\x73\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x51\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xc0\x8a\x01\x0a\x4b\x0a\x16\x76\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x16\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xe3\x01\x0a\x54\x0a\x1f\x70\x61\x79\x6d\x65\x6e\x74\x73\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x57\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x61\x79\x61\x66\x69\x6e\x61\x6e\x63\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x56\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x63\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9f\x08\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x68\x61\x72\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x61\x75\x74\x68\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x3b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x73\x75\x72\x76\x65\x79\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x69\x6e\x74\x65\x72\x6e\x68\x65\x61\x6c\x74\x68\x73\x74\x75\x64\x79\x2d\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x69\x6e\x74\x65\x72\x6e\x68\x65\x61\x6c\x74\x68\x73\x74\x75\x64\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5c\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x6f\x6e\x66\x6c\x75\x65\x6e\x63\x65\x2e\x61\x63\x74\x69\x76\x65\x73\x74\x65\x70\x2e\x6f\x72\x67\x15\x43\xfd\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x70\x70\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x34\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x70\x70\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb4\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\xe8\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe0\x87\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x76\x70\x6e\x2d\x30\x31\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x84\x27\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x41\x0a\x0c\x74\x75\x62\x65\x73\x6f\x63\x6b\x2e\x6e\x65\x74\x15\x6a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x6f\x72\x74\x61\x6c\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x0e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x69\x6c\x64\x66\x69\x72\x65\x2d\x65\x6e\x65\x72\x67\x79\x2e\x63\x6f\x6d\x15\x11\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x61\x70\x70\x73\x74\x6f\x72\x65\x2e\x63\x6f\x6d\x15\x23\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xe0\x87\x01\x0a\x49\x0a\x14\x72\x65\x70\x6f\x2e\x62\x72\x69\x67\x68\x74\x6f\x6e\x6b\x31\x32\x2e\x63\x6f\x6d\x15\x1a\xa6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x65\x79\x6f\x6e\x64\x65\x6e\x65\x72\x67\x79\x2e\x63\x61\x15\x27\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xc0\x87\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x67\x72\x6f\x75\x70\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x13\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xcf\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x47\x48\x41\x50\x53\x41\x4c\x49\x4f\x57\x45\x42\x2e\x47\x48\x41\x50\x53\x2e\x4f\x52\x47\x15\xb0\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xe6\xf3\x03\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x63\x08\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x70\x72\x6f\x64\x73\x74\x61\x67\x69\x6e\x67\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x04\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\x93\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6c\x73\x69\x2d\x73\x70\x61\x72\x63\x2d\x30\x31\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xeb\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x6f\x6d\x65\x73\x74\x69\x63\x75\x6e\x69\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x8c\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x76\x74\x65\x73\x74\x76\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x17\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x75\x74\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x6c\x69\x62\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1b\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6a\x70\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6f\x72\x67\x15\x31\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe7\xf3\x03\x0a\x51\x0a\x1c\x77\x68\x65\x30\x31\x2d\x66\x61\x69\x6c\x6f\x76\x65\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf1\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x61\x67\x6c\x61\x6e\x65\x2d\x64\x65\x76\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6a\x70\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6f\x72\x67\x15\x29\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x51\x0a\x1c\x77\x68\x65\x30\x32\x2d\x66\x61\x69\x6c\x6f\x76\x65\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x65\x78\x6e\x65\x78\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8d\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x03\x0a\x4c\x0a\x17\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x93\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x64\x65\x73\x74\x69\x6e\x79\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x4c\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x08\x0a\x45\x0a\x10\x66\x65\x69\x67\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf1\x61\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\xa1\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\x8e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x6f\x6f\x72\x65\x68\x65\x61\x64\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x8f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x59\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\x92\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x65\x63\x65\x6c\x6c\x75\x6c\x61\x72\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x91\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x6f\x6f\x72\x65\x68\x65\x61\x64\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x94\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x07\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf4\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x6e\x64\x65\x76\x63\x6f\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x09\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6b\x61\x74\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6e\x65\x74\x15\x94\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x65\x63\x6f\x6d\x6d\x65\x72\x63\x65\x2e\x70\x72\x69\x6e\x63\x65\x2d\x63\x6f\x72\x70\x2e\x63\x6f\x6d\x15\x02\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x62\x65\x73\x74\x63\x6f\x2e\x63\x6f\x2e\x6a\x70\x15\x03\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x79\x66\x69\x6e\x61\x6e\x63\x69\x61\x6c\x61\x69\x64\x2e\x63\x61\x73\x65\x2e\x65\x64\x75\x15\x04\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe2\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x72\x65\x66\x65\x72\x72\x61\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x79\x76\x72\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x80\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x68\x65\x61\x6c\x74\x68\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x7b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x64\x65\x66\x6f\x78\x2e\x63\x6f\x6d\x15\x79\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x6e\x6f\x74\x69\x63\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x78\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x64\x66\x73\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x7f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x69\x73\x2d\x74\x65\x73\x74\x2e\x73\x70\x73\x70\x2e\x65\x64\x75\x2e\x73\x61\x15\x7e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x69\x71\x76\x69\x73\x69\x6f\x6e\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x7d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6d\x70\x6c\x6f\x79\x65\x72\x74\x6f\x6f\x6c\x6b\x69\x74\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x7c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xec\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xed\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe8\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe9\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe6\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x65\x65\x70\x66\x69\x65\x6c\x64\x2e\x6e\x65\x74\x15\xe7\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf4\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x7a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x46\x0a\x11\x62\x61\x73\x2e\x6d\x69\x64\x6c\x61\x6e\x64\x70\x73\x2e\x6f\x72\x67\x15\x79\x20\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x64\x65\x6d\x6f\x61\x70\x70\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x1f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x61\x70\x73\x6e\x61\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x44\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x79\x63\x6c\x6f\x75\x64\x71\x75\x6f\x74\x65\x2e\x63\x6f\x6d\x15\x23\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x68\x73\x2d\x73\x63\x39\x2d\x70\x72\x6f\x64\x2d\x63\x64\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\x25\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4d\x0a\x18\x73\x73\x6f\x6d\x61\x6e\x61\x67\x65\x72\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x52\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x61\x66\x61\x61\x73\x2e\x6c\x6b\x73\x63\x64\x2e\x63\x6f\x6d\x15\x27\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x58\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x6f\x63\x6b\x65\x74\x2e\x77\x61\x79\x6c\x61\x6e\x64\x75\x6e\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x95\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xd7\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x68\x76\x74\x63\x2e\x64\x74\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\xa8\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8d\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8c\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9e\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8e\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x61\x79\x6e\x65\x67\x65\x69\x73\x74\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa1\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x72\x6d\x61\x6e\x61\x69\x6e\x73\x77\x6f\x72\x74\x68\x2e\x6f\x72\x67\x15\x78\x43\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x04\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x03\x0a\x4b\x0a\x16\x73\x70\x61\x72\x74\x61\x6e\x61\x72\x63\x68\x69\x76\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x82\x0b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x41\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x42\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x65\x73\x74\x2e\x74\x65\x63\x68\x6e\x6f\x63\x69\x61\x74\x65\x2e\x69\x6e\x15\x3e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x2e\x75\x70\x63\x68\x2e\x65\x64\x75\x2e\x70\x65\x15\x40\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x69\x67\x73\x2d\x7a\x61\x2d\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x42\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x64\x72\x79\x64\x65\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x08\xb4\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\xd6\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x77\x6c\x6f\x67\x69\x6e\x2e\x63\x6f\x6d\x15\xf2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\xf3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x62\x0a\x2d\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x76\x32\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xf0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x69\x6c\x6c\x69\x6e\x67\x2e\x6a\x6f\x63\x61\x72\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\xf1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x72\x65\x76\x65\x6e\x75\x65\x77\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\xf4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x75\x62\x6c\x69\x63\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x16\x22\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x08\x0a\x52\x0a\x1d\x6c\x69\x67\x68\x74\x73\x70\x65\x65\x64\x2e\x72\x61\x76\x65\x6e\x6e\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x06\x39\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x88\x04\x0a\x42\x0a\x0d\x6b\x6d\x73\x2e\x73\x73\x69\x63\x61\x2e\x63\x6f\x6d\x15\xf8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x72\x65\x61\x73\x70\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xf9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x69\x76\x69\x6e\x67\x73\x74\x6f\x6e\x65\x73\x61\x2e\x6f\x72\x67\x15\x7f\xa0\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x03\x0a\x50\x0a\x1b\x72\x65\x67\x69\x73\x74\x72\x79\x2e\x74\x6f\x6f\x6c\x73\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0b\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x74\x63\x63\x72\x6f\x63\x6b\x73\x2e\x63\x6f\x6d\x15\xc2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x12\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\xc3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6c\x69\x62\x72\x61\x72\x79\x2e\x6c\x69\x6e\x64\x65\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x09\x1d\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x08\x0a\x51\x0a\x1c\x6e\x61\x79\x6f\x74\x65\x63\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x27\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x74\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x2e\x66\x72\x15\x4c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x64\x65\x76\x65\x6c\x6f\x70\x65\x72\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x46\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x32\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x47\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x48\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x49\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x6c\x66\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x1e\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x4e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x65\x78\x74\x73\x65\x72\x76\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\x4f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x61\x74\x65\x72\x6c\x6f\x6f\x63\x6f\x6e\x74\x61\x69\x6e\x65\x72\x2e\x63\x6f\x6d\x15\x7d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x7f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x70\x72\x6f\x74\x65\x63\x74\x65\x64\x2e\x67\x61\x72\x74\x6e\x65\x72\x64\x65\x6d\x6f\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xb0\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x64\x61\x74\x61\x65\x78\x70\x6f\x72\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x79\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x67\x72\x61\x74\x68\x77\x6f\x6c\x2e\x64\x6b\x15\x78\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x78\x74\x65\x6e\x64\x65\x64\x72\x65\x61\x63\x68\x2e\x63\x6f\x6d\x15\x11\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x76\x70\x6e\x32\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd4\x10\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\xfc\xff\x0f\x0a\x42\x0a\x0d\x77\x68\x61\x74\x73\x6d\x79\x69\x70\x2e\x6f\x72\x67\x15\x62\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\x82\x08\x0a\x48\x0a\x13\x66\x69\x6c\x74\x65\x72\x2e\x6d\x79\x62\x65\x64\x66\x6f\x72\x64\x2e\x75\x73\x15\x20\xa3\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xff\xff\x03\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x93\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x92\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xc0\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x90\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8f\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x70\x31\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8e\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x65\x62\x2e\x62\x61\x65\x2e\x68\x6f\x75\x73\x65\x15\x5c\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x73\x2e\x63\x61\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x7a\xc9\xcf\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfb\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x9d\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x6c\x61\x6b\x65\x6d\x69\x63\x68\x69\x67\x61\x6e\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x0b\x68\x6d\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x02\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x47\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x48\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x45\x0a\x10\x6c\x74\x65\x72\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4d\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x03\x0a\x62\x0a\x2d\x6d\x73\x2d\x64\x69\x67\x69\x74\x61\x6c\x63\x61\x72\x64\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xeb\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6c\x69\x6e\x6b\x2e\x63\x6f\x64\x65\x73\x74\x6f\x72\x6d\x2e\x63\x6f\x2e\x75\x6b\x15\xea\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x64\x65\x6c\x65\x67\x61\x74\x65\x73\x2e\x6f\x68\x65\x61\x2e\x6f\x72\x67\x15\xee\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x4a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x61\x66\x69\x62\x6d\x6f\x62\x69\x6c\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x6e\x64\x65\x72\x73\x6f\x6e\x6d\x69\x6c\x6c\x65\x72\x2e\x63\x6f\x6d\x15\xca\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x73\x61\x35\x35\x34\x35\x68\x65\x64\x67\x65\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\xcd\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x80\x02\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x4b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6a\x73\x73\x2e\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x36\x25\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x62\x6d\x73\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x93\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xe6\xf3\x03\x0a\x3f\x0a\x0a\x66\x77\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x8f\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x69\x70\x63\x61\x6d\x74\x61\x6c\x6b\x2e\x63\x6f\x6d\x15\xcc\xbb\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x66\x0a\x31\x6d\x73\x2d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x61\x63\x74\x69\x76\x69\x74\x79\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x15\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x74\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x75\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x6d\x65\x6d\x62\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x17\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x6d\x73\x2d\x6d\x65\x73\x73\x61\x67\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x18\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x6d\x65\x74\x61\x64\x61\x74\x61\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x19\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x38\x34\x62\x62\x35\x66\x2e\x36\x66\x62\x64\x2e\x64\x6e\x2e\x67\x6c\x6f\x62\x2e\x75\x73\x15\x71\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe0\x02\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc0\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x6f\x6e\x6c\x69\x6e\x65\x74\x72\x61\x69\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x70\x72\x6f\x64\x75\x63\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6a\x64\x2e\x64\x65\x6d\x6f\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf7\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x7a\x6f\x72\x62\x69\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf2\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe8\x03\x0a\x4c\x0a\x17\x61\x73\x75\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xf3\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe8\x03\x0a\x51\x0a\x1c\x62\x61\x63\x6b\x75\x70\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\xa6\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x20\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xff\xff\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x1f\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe6\xfc\x03\x0a\x4b\x0a\x16\x70\x73\x2e\x6f\x61\x6b\x72\x69\x64\x67\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x25\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe7\xf3\x03\x0a\x55\x0a\x20\x61\x64\x6d\x69\x6e\x2d\x73\x65\x71\x63\x6f\x72\x65\x2e\x62\x72\x63\x66\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x56\x0a\x21\x63\x6c\x69\x65\x6e\x74\x2d\x73\x65\x71\x63\x6f\x72\x65\x2e\x62\x72\x63\x66\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8d\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfc\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfd\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfa\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xfb\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x68\x79\x70\x65\x72\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x2e\x63\x6e\x15\x99\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x65\x62\x2d\x64\x65\x76\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x63\x6c\x6f\x75\x64\x2e\x6e\x6c\x15\x45\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x77\x6d\x61\x2d\x65\x73\x2e\x63\x6f\x6d\x15\x5f\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x61\x74\x68\x77\x65\x62\x77\x6f\x72\x6b\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1e\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x73\x61\x67\x65\x37\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x25\x74\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xa0\x04\x0a\x58\x0a\x23\x6d\x79\x72\x70\x73\x73\x65\x72\x76\x69\x63\x65\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3f\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x72\x67\x77\x2d\x75\x6d\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x05\xa9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf0\x02\x0a\x4f\x0a\x1a\x63\x61\x70\x74\x69\x76\x65\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x70\x65\x70\x6c\x69\x6e\x6b\x2e\x63\x6f\x6d\x15\x54\xfa\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x9b\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x9d\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xce\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xcf\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x99\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x6b\x73\x75\x70\x70\x6c\x79\x2e\x63\x6f\x6d\x15\x98\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x3f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x59\x0a\x24\x77\x77\x77\x2e\x6c\x69\x73\x74\x65\x6e\x69\x6e\x67\x2e\x6d\x69\x63\x68\x69\x67\x61\x6e\x61\x73\x73\x65\x73\x73\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xad\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x73\x74\x6f\x72\x79\x74\x65\x6c\x6c\x69\x6e\x67\x34\x65\x6d\x70\x6f\x77\x65\x72\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xab\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x33\x31\x6c\x61\x62\x73\x2e\x63\x6f\x6d\x15\x6a\xdc\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6b\x69\x70\x69\x63\x2e\x63\x6f\x6d\x2e\x6b\x77\x15\x87\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x78\x74\x65\x6e\x64\x65\x64\x72\x65\x61\x63\x68\x2e\x63\x6f\x6d\x15\x55\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x86\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x85\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x61\x62\x6c\x65\x61\x75\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x8a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x56\x49\x53\x43\x31\x2e\x6d\x79\x71\x6e\x61\x70\x63\x6c\x6f\x75\x64\x2e\x63\x6f\x6d\x15\x1e\x18\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x67\x77\x61\x2e\x33\x63\x78\x2e\x75\x73\x15\x8a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xa3\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x6f\x72\x67\x15\xfe\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x4a\x0a\x15\x74\x61\x78\x68\x65\x6c\x70\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5c\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5a\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x68\x35\x70\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x5b\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x61\x6d\x70\x75\x73\x63\x61\x6c\x6c\x2e\x75\x61\x64\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1b\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x52\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x79\x6f\x75\x72\x63\x6c\x6f\x75\x64\x73\x68\x61\x72\x65\x2e\x6e\x65\x74\x15\xae\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x79\x6f\x75\x72\x63\x6c\x6f\x75\x64\x73\x68\x61\x72\x65\x2e\x6e\x65\x74\x15\xab\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x6c\x61\x6d\x70\x2e\x63\x6f\x62\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x3c\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xba\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb9\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb6\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf4\x01\x0a\x41\x0a\x0c\x62\x6f\x6f\x6b\x61\x6c\x69\x76\x65\x2e\x69\x6f\x15\xb4\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf4\x01\x0a\x4c\x0a\x17\x6b\x72\x6f\x67\x65\x6c\x2d\x76\x70\x6e\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x99\xab\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xb8\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9a\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x19\x6b\x72\x6f\x67\x65\x6c\x2d\x6c\x69\x6e\x75\x78\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x9b\xab\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa5\x75\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x99\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x98\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x97\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9a\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xec\x01\x0a\x52\x0a\x1d\x69\x6d\x6f\x62\x69\x6c\x65\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x65\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x61\x69\x72\x62\x6f\x73\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2d\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xe3\x01\x0a\x52\x0a\x1d\x70\x73\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x64\x65\x6d\x6f\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x53\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x84\x08\x0a\x47\x0a\x12\x63\x69\x2e\x69\x71\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9d\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x65\x70\x76\x61\x75\x6c\x74\x2e\x63\x6f\x6d\x15\x8e\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x70\x73\x73\x6f\x75\x74\x68\x68\x61\x76\x65\x6e\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7f\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x86\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xa0\x8a\x01\x0a\x4d\x0a\x18\x63\x6c\x75\x62\x73\x65\x63\x72\x65\x74\x73\x2e\x63\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x8f\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x03\x0a\x44\x0a\x0f\x65\x71\x74\x6c\x2e\x70\x68\x65\x77\x65\x62\x2e\x6f\x72\x67\x15\x3a\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x7a\x6f\x65\x6c\x6c\x6e\x65\x72\x2d\x6c\x61\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3b\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x03\x0a\x49\x0a\x14\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6e\x65\x74\x15\x38\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2d\x69\x6e\x70\x73\x79\x67\x68\x74\x31\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x39\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x67\x66\x67\x2d\x61\x70\x70\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x39\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x69\x6d\x70\x65\x72\x69\x61\x64\x65\x6d\x2e\x63\x6f\x6d\x15\x36\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6c\x69\x76\x65\x2d\x62\x74\x70\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x39\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x32\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x33\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x65\x62\x6d\x61\x69\x6c\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x34\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x69\x6e\x63\x6b\x6e\x65\x79\x63\x74\x69\x2e\x6f\x72\x67\x15\xb6\xa5\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6c\x69\x76\x65\x2d\x72\x70\x73\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x3a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x74\x70\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x3b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3d\x0a\x08\x73\x63\x61\x6e\x73\x2e\x69\x6f\x15\x14\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\xfd\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\xfa\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x6d\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x79\x2d\x64\x65\x76\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6f\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x05\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x06\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x98\x8a\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x03\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x02\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x98\x8a\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x63\x73\x72\x65\x64\x68\x61\x77\x6b\x73\x2e\x6f\x72\x67\x15\x55\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x46\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x74\x74\x61\x77\x61\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1a\x3c\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6d\x73\x2d\x73\x65\x6c\x66\x72\x65\x67\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2e\x68\x73\x69\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\x1e\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x67\x6f\x76\x70\x6e\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xfd\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xff\x0f\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x63\x6f\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x3e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x67\x69\x73\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x3c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6d\x6f\x68\x65\x67\x61\x6e\x65\x6e\x74\x65\x72\x74\x61\x69\x6e\x6d\x65\x6e\x74\x2e\x63\x6f\x6d\x15\x89\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x74\x61\x78\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x87\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x69\x71\x73\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x84\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9a\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x63\x69\x2e\x63\x6f\x6d\x15\x85\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x83\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x65\x64\x75\x63\x61\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x10\xce\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x9e\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x7a\x70\x65\x6e\x74\x72\x75\x73\x74\x65\x65\x2e\x69\x6e\x66\x6f\x15\xbc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x70\x72\x6f\x67\x72\x65\x73\x73\x2e\x73\x6b\x65\x74\x63\x68\x6c\x65\x2e\x63\x6f\x6d\x15\xb9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x64\x62\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\xbb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x62\x61\x64\x73\x74\x6f\x72\x65\x2d\x6c\x61\x62\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xb5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x67\x61\x74\x65\x77\x61\x79\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xb7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x70\x6f\x72\x74\x61\x6c\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xb6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x92\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8f\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8c\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x89\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x8a\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x11\x63\x61\x6d\x70\x75\x73\x2e\x61\x6c\x62\x69\x6f\x6e\x2e\x65\x64\x75\x15\x97\x0b\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xa6\x80\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3f\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3c\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x40\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x41\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xe7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x75\x61\x74\x6c\x6f\x67\x69\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xde\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xdc\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xdd\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xe2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x6f\x63\x69\x61\x6c\x67\x69\x73\x74\x2e\x63\x6f\x6d\x15\xb9\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf8\x01\x0a\x51\x0a\x1c\x6d\x61\x6e\x61\x67\x65\x6d\x65\x6e\x74\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xe5\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x73\x6f\x63\x69\x61\x6c\x67\x69\x73\x74\x2e\x63\x6f\x6d\x15\xb6\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x73\x74\x72\x65\x65\x74\x73\x69\x64\x65\x2e\x69\x6f\x15\xb5\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf8\x01\x0a\x49\x0a\x14\x67\x6f\x76\x70\x6e\x2e\x74\x65\x73\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xfd\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xff\x0f\x0a\x50\x0a\x1b\x6d\x6f\x62\x69\x6c\x65\x69\x72\x6f\x6e\x76\x73\x70\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xaa\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xf0\xf4\x01\x0a\x51\x0a\x1c\x63\x6c\x61\x73\x73\x72\x6f\x6f\x6d\x2e\x64\x63\x6d\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf2\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x74\x61\x67\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x27\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x5d\x0a\x28\x6d\x73\x2d\x73\x75\x72\x76\x65\x79\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x26\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x73\x72\x73\x70\x6f\x72\x74\x61\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x25\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x73\x69\x74\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x24\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x64\x0a\x2f\x6d\x73\x2d\x73\x65\x73\x73\x69\x6f\x6e\x67\x61\x74\x65\x77\x61\x79\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x23\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x59\x0a\x24\x6d\x73\x2d\x73\x64\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x22\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x64\x73\x72\x65\x66\x72\x65\x73\x68\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x21\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x73\x63\x6f\x72\x6d\x63\x6c\x6f\x75\x64\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x20\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x73\x61\x6d\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x72\x65\x70\x6f\x72\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x6e\x61\x67\x65\x68\x66\x2e\x70\x68\x61\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb9\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x6f\x75\x73\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfc\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x72\x32\x76\x34\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfb\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x72\x31\x76\x34\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xfa\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xd5\x07\x28\x80\xe3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x19\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x14\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x69\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6e\x65\x74\x15\x50\xe4\x8c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf9\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x68\x61\x72\x64\x79\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x44\x7c\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf1\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf0\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf3\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf2\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf5\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf7\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xf6\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x07\x0a\x56\x0a\x21\x72\x65\x64\x63\x61\x70\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x6d\x69\x6f\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9c\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x61\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4f\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x98\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x77\x61\x6c\x74\x6f\x6e\x72\x65\x73\x69\x64\x65\x6e\x74\x69\x61\x6c\x2e\x63\x6f\x6d\x15\xd6\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x61\x72\x74\x2e\x70\x72\x69\x6e\x74\x74\x6f\x70\x72\x65\x73\x73\x2e\x63\x6f\x6d\x15\xd3\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x07\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x6b\x69\x61\x66\x69\x6e\x61\x6e\x63\x65\x2e\x64\x65\x15\x7f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x79\x77\x61\x74\x65\x72\x2e\x73\x61\x72\x61\x74\x6f\x67\x61\x73\x70\x72\x69\x6e\x67\x73\x63\x69\x74\x79\x2e\x63\x6f\x6d\x15\x11\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x67\x73\x2e\x66\x6f\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xc2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x04\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x3e\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x38\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xea\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x6c\x65\x72\x74\x75\x73\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xa4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x02\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xa0\xfd\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x36\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xe8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x70\x72\x6f\x78\x75\x72\x65\x2e\x63\x6f\x6d\x15\x03\xdf\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6c\x61\x73\x65\x72\x66\x69\x63\x68\x65\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xb7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x65\x62\x65\x6f\x63\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xb5\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x69\x72\x74\x75\x61\x6c\x6c\x61\x62\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x6e\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x76\x61\x72\x63\x74\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x2e\x63\x6f\x6d\x15\x8f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x61\x72\x32\x70\x68\x61\x72\x6d\x61\x63\x65\x75\x74\x69\x63\x61\x6c\x73\x2e\x63\x6f\x6d\x15\x8e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x69\x6e\x67\x6c\x65\x62\x79\x66\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x90\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x64\x65\x76\x65\x6c\x6f\x70\x65\x72\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x93\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x72\x61\x6e\x64\x6f\x6c\x70\x68\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\xfa\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x63\x68\x65\x7a\x62\x65\x74\x74\x79\x2e\x73\x74\x6f\x72\x65\x15\x1e\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfb\x03\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x63\x68\x6f\x6f\x6c\x63\x72\x61\x66\x74\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1a\x26\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x8c\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x69\x6b\x69\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x83\x91\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x76\x63\x73\x66\x6f\x72\x65\x73\x69\x74\x65\x2e\x76\x63\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\xa8\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x44\x0a\x0f\x63\x61\x72\x35\x34\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x34\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x94\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x69\x6c\x65\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x08\x37\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x69\x6c\x65\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x07\x37\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x81\x04\x0a\x43\x0a\x0e\x77\x65\x62\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x26\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6e\x61\x6e\x6f\x74\x75\x62\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdc\x43\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x94\xfd\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x67\x0a\x32\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x73\x6d\x74\x6f\x6d\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x68\x70\x73\x6b\x31\x32\x2e\x6e\x65\x74\x15\xc5\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xfc\xff\x0f\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb0\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x40\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x3e\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xab\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xaa\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x63\x69\x64\x69\x74\x72\x61\x69\x6e\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x64\x6d\x2e\x69\x70\x66\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\xbb\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x10\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb3\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xb2\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2f\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2c\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\xfd\x01\x0a\x49\x0a\x14\x70\x72\x73\x77\x65\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x73\x74\x61\x67\x69\x6e\x67\x2e\x6c\x6f\x63\x75\x73\x7a\x6f\x6f\x6d\x2e\x6f\x72\x67\x15\x40\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x2b\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x2a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x29\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x28\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x70\x6c\x65\x79\x73\x2e\x63\x6f\x6d\x15\x2e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x15\x2d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x66\x72\x65\x65\x70\x62\x78\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x25\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x63\x61\x6c\x6c\x61\x69\x6d\x2e\x6f\x72\x67\x15\xb5\x60\xcf\x8f\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x38\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf0\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x69\x6e\x66\x69\x6e\x69\x74\x65\x77\x65\x62\x64\x65\x73\x69\x67\x6e\x2e\x63\x6f\x6d\x15\xae\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x70\x61\x72\x74\x61\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x5e\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x6c\x69\x76\x6f\x6e\x69\x61\x70\x75\x62\x6c\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x15\xea\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x34\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x75\x62\x6c\x69\x63\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x67\x6c\x6f\x62\x61\x6c\x63\x6f\x6c\x6c\x65\x63\x74\x69\x6f\x6e\x2e\x6e\x65\x74\x15\x39\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x65\x2d\x61\x70\x63\x2e\x63\x6f\x6d\x15\x3a\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x89\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xec\x01\x0a\x51\x0a\x1b\x74\x72\x61\x6e\x73\x66\x65\x72\x2e\x6b\x65\x63\x63\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x7c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\xbf\x02\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x8b\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x98\x8a\x01\x0a\x4b\x0a\x16\x6d\x79\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x70\x61\x73\x73\x69\x6e\x65\x74\x2e\x63\x6f\x6d\x15\x64\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x85\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x98\x8a\x01\x0a\x4e\x0a\x19\x73\x74\x61\x67\x69\x6e\x67\x2d\x6d\x61\x67\x6e\x6f\x78\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x6d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x76\x61\x6e\x73\x69\x73\x2e\x63\x6c\x15\x6c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x88\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x87\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x86\xa4\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x98\x8a\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa5\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\xf0\xf2\x01\x0a\x4a\x0a\x15\x6c\x61\x6c\x69\x67\x61\x74\x65\x73\x74\x2e\x64\x65\x6e\x61\x72\x69\x6f\x2e\x65\x73\x15\xc7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa2\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xf0\xf2\x01\x0a\x56\x0a\x21\x66\x2d\x6c\x61\x6e\x64\x70\x61\x67\x65\x2d\x70\x2d\x31\x2d\x65\x6c\x61\x73\x74\x69\x63\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xbe\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x73\x69\x63\x61\x74\x65\x73\x74\x2e\x73\x73\x69\x63\x61\x2e\x63\x6f\x6d\x15\xbf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6b\x69\x62\x61\x6e\x61\x2d\x6c\x61\x6e\x64\x69\x6e\x67\x70\x61\x67\x65\x73\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xc2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x9b\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x66\x6f\x72\x65\x73\x74\x61\x72\x65\x61\x2e\x6f\x72\x67\x15\x4d\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x42\x0a\x0d\x76\x70\x6e\x32\x2e\x6d\x74\x72\x69\x2e\x6f\x72\x67\x15\x28\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xb8\x01\x0a\x50\x0a\x1b\x63\x6c\x65\x61\x6e\x6d\x61\x69\x6c\x2e\x63\x6f\x6d\x70\x75\x74\x69\x6e\x67\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\x9e\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6f\x6d\x65\x6b\x61\x2d\x64\x65\x6d\x6f\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1a\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x74\x2e\x61\x74\x68\x65\x6e\x61\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xd8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x65\x78\x74\x72\x61\x6e\x65\x74\x2e\x62\x72\x6f\x6b\x65\x72\x6c\x69\x6e\x6b\x73\x6f\x66\x74\x77\x61\x72\x65\x2e\x63\x6f\x6d\x15\xd6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x40\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x52\x0a\x1d\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x6d\x61\x6e\x74\x6c\x65\x74\x65\x73\x74\x69\x6e\x67\x2e\x63\x6f\x2e\x75\x6b\x15\xd2\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x63\x33\x2e\x63\x6f\x72\x70\x6f\x72\x61\x74\x65\x63\x6f\x73\x74\x63\x6f\x6e\x74\x72\x6f\x6c\x2e\x63\x6f\x6d\x15\xd3\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x65\x67\x72\x65\x65\x61\x75\x64\x69\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x44\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x64\x65\x67\x72\x65\x65\x61\x75\x64\x69\x74\x2d\x74\x65\x73\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x44\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x94\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x73\x75\x62\x2e\x73\x6f\x75\x74\x68\x67\x61\x74\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x85\xf4\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8c\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8d\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x8e\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xa1\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x95\xbf\x02\x0a\x4c\x0a\x17\x6c\x61\x62\x31\x31\x2e\x65\x65\x63\x73\x2e\x62\x65\x72\x6b\x65\x6c\x65\x79\x2e\x65\x64\x75\x15\x41\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x73\x75\x68\x6c\x61\x2e\x63\x68\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x33\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x6d\x65\x6d\x62\x65\x72\x73\x2e\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x68\x6f\x73\x70\x69\x74\x61\x6c\x73\x2e\x6f\x72\x67\x15\x30\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x31\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x76\x69\x73\x75\x61\x6c\x69\x7a\x65\x74\x73\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xb9\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x5d\x0a\x28\x6d\x73\x2d\x75\x70\x67\x72\x61\x64\x65\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x75\x73\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x6a\x0a\x35\x6d\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x72\x65\x71\x75\x69\x72\x65\x6d\x65\x6e\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x28\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x29\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x69\x67\x73\x2d\x7a\x61\x2d\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x2e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x61\x6b\x61\x79\x61\x6d\x61\x66\x75\x6b\x75\x2e\x63\x6f\x2e\x6a\x70\x15\x2f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x67\x0a\x32\x6d\x73\x2d\x76\x69\x64\x65\x6f\x64\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x70\x69\x6c\x6c\x61\x72\x6c\x65\x61\x72\x6e\x69\x6e\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x2d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xe1\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x65\x65\x30\x31\x2e\x77\x68\x69\x74\x65\x63\x6c\x6f\x75\x64\x2e\x6e\x65\x74\x15\x6c\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x76\x6f\x69\x63\x65\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x15\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x3b\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x56\x0a\x21\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x70\x72\x69\x6e\x67\x2d\x6c\x61\x6b\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe7\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x39\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x37\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x36\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x33\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xcf\xf8\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x32\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3d\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x70\x2d\x6c\x76\x6c\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x90\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xfd\x07\x0a\x4c\x0a\x17\x70\x2d\x6d\x68\x65\x61\x6c\x74\x68\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xfc\xfd\x07\x0a\x47\x0a\x12\x77\x77\x77\x2e\x68\x61\x74\x68\x69\x74\x72\x75\x73\x74\x2e\x6f\x72\x67\x15\xb8\x80\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x69\x63\x6d\x61\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x45\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x65\x72\x67\x6f\x70\x68\x69\x6c\x6a\x6f\x75\x72\x6e\x61\x6c\x2e\x6f\x72\x67\x15\xb7\x80\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x69\x70\x73\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x76\x69\x6c\x6c\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x08\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xe8\xf3\x03\x0a\x58\x0a\x23\x72\x61\x63\x6b\x69\x72\x70\x72\x6f\x64\x2d\x6e\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x74\x72\x67\x2e\x6d\x65\x64\x69\x61\x15\x59\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x37\x31\x37\x36\x32\x39\x37\x2d\x63\x35\x61\x34\x61\x66\x65\x62\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xa2\xb7\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf8\x01\x0a\x51\x0a\x1c\x63\x61\x65\x6e\x2d\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x70\x73\x2e\x66\x72\x61\x6e\x6b\x66\x6f\x72\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x53\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x62\x70\x73\x2e\x62\x72\x6f\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x85\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x74\x72\x61\x6d\x73\x2e\x72\x74\x73\x6f\x2e\x63\x6f\x6d\x15\x7d\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x74\x61\x73\x70\x72\x64\x37\x30\x32\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xab\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\x24\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x61\x72\x73\x65\x61\x74\x63\x6f\x6d\x70\x61\x73\x73\x2e\x63\x6f\x6d\x15\x9c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x31\x2e\x63\x68\x65\x6c\x73\x65\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4c\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x62\x68\x31\x32\x2e\x67\x65\x6f\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\x0f\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x76\x65\x72\x61\x64\x61\x72\x2e\x63\x6f\x6d\x15\x97\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x65\x72\x6b\x65\x6e\x62\x69\x6a\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x9c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x75\x6e\x6c\x6f\x63\x6b\x6d\x65\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\x9a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\x9f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6f\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x0f\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x6e\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfe\x0f\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc4\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc5\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc2\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x61\x74\x77\x61\x74\x65\x72\x62\x65\x65\x72\x2e\x63\x6f\x6d\x15\xc3\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x61\x61\x61\x31\x62\x2e\x6f\x72\x67\x15\xc0\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x6d\x6f\x72\x69\x61\x6c\x62\x72\x61\x63\x65\x6c\x65\x74\x73\x2e\x63\x6f\x6d\x15\xc1\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x68\x6f\x62\x6f\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x70\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x72\x6f\x62\x69\x6e\x73\x6f\x6e\x66\x75\x6e\x64\x73\x2e\x63\x6f\x6d\x15\xc7\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x79\x2e\x69\x72\x68\x63\x2e\x63\x6f\x6d\x15\x1b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x70\x72\x6f\x63\x65\x73\x73\x69\x6e\x67\x2d\x73\x74\x61\x67\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\x51\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x6d\x79\x69\x6e\x73\x75\x72\x61\x6e\x63\x65\x2e\x6d\x65\x74\x6c\x69\x66\x65\x61\x69\x67\x61\x6e\x62\x2e\x63\x6f\x6d\x15\x52\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x62\x6c\x6f\x72\x70\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x53\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x6c\x6d\x61\x69\x6c\x65\x6d\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x54\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x75\x64\x61\x2d\x68\x69\x64\x65\x61\x6b\x69\x2e\x74\x6f\x6b\x79\x6f\x15\x55\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x70\x6d\x6c\x69\x67\x68\x74\x73\x2e\x63\x6f\x6d\x15\x58\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x64\x61\x76\x65\x2e\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x59\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x6f\x74\x65\x63\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x52\x9c\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\xfc\xff\x0f\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x64\x75\x6c\x6f\x67\x77\x65\x62\x32\x62\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x95\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe6\xf3\x03\x0a\x51\x0a\x1c\x70\x75\x72\x63\x68\x61\x73\x69\x6e\x67\x2d\x64\x65\x76\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2d\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\xc0\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\xc6\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x4f\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x74\x65\x73\x74\x2e\x77\x65\x62\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x74\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x6a\x63\x2d\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x73\x6a\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1e\x2e\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x83\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x68\x65\x6c\x70\x64\x65\x73\x6b\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x14\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x61\x6e\x74\x68\x65\x72\x6e\x65\x74\x2e\x6e\x65\x74\x15\x1f\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x66\x0a\x31\x6d\x73\x2d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x16\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x75\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x70\x73\x2e\x67\x6d\x73\x74\x73\x2e\x6f\x72\x67\x15\x1c\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x03\x0a\x66\x0a\x31\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x73\x6c\x6f\x67\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x1a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x73\x74\x72\x61\x74\x65\x67\x69\x63\x72\x69\x73\x6b\x73\x2e\x63\x6f\x6d\x15\x5c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x63\x6f\x6c\x6c\x65\x63\x74\x69\x65\x66\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x5d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6d\x70\x74\x63\x71\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x93\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x54\x0a\x1f\x77\x65\x62\x35\x36\x74\x65\x73\x74\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x92\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x61\x32\x67\x75\x69\x64\x65\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x91\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x51\x0a\x1c\x61\x6c\x75\x6d\x6e\x69\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x90\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x55\x0a\x20\x61\x7a\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8f\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x63\x61\x6e\x64\x77\x69\x6e\x74\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8e\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x4e\x0a\x19\x6d\x70\x73\x2d\x70\x72\x74\x67\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x15\xb2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\xc6\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x65\x7a\x70\x61\x70\x65\x72\x74\x72\x61\x69\x6c\x2e\x63\x6f\x6d\x15\xa2\xdd\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x45\x0a\x10\x61\x63\x63\x2e\x6c\x6f\x67\x69\x6e\x2e\x69\x7a\x61\x2e\x6e\x6c\x15\x0a\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x45\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\x81\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x15\x49\x2a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x64\x65\x76\x32\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x43\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x2e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x67\x65\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x62\x75\x69\x6c\x64\x15\x29\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x62\x69\x6c\x76\x61\x72\x64\x73\x65\x78\x70\x65\x72\x74\x65\x6e\x2e\x73\x65\x15\x28\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x67\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x66\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x69\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x6a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x76\x70\x6e\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\x10\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xfc\xff\x0f\x0a\x4b\x0a\x16\x61\x70\x69\x2e\x61\x74\x68\x65\x6e\x61\x2e\x6f\x74\x70\x32\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x70\x69\x2e\x61\x74\x68\x65\x6e\x61\x2e\x6f\x74\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x70\x61\x74\x69\x65\x6e\x74\x63\x6f\x6e\x6e\x65\x63\x74\x33\x36\x35\x2e\x63\x6f\x6d\x15\xa2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x6f\x62\x69\x6c\x65\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\xa1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x74\x69\x6d\x65\x66\x6f\x72\x63\x65\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\xa0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x79\x61\x6c\x6c\x61\x68\x71\x75\x69\x74\x2e\x6f\x72\x67\x15\xe7\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x63\x6f\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x65\x75\x70\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x83\x9e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x6c\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x78\x69\x73\x63\x6f\x70\x65\x2e\x63\x6f\x6d\x15\x13\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xbc\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x65\x72\x70\x73\x6b\x31\x32\x2e\x6f\x72\x67\x15\xa8\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xbb\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x61\x6d\x65\x72\x69\x63\x61\x6e\x2d\x77\x61\x74\x65\x72\x2e\x75\x73\x15\xb8\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x69\x6e\x6b\x61\x64\x6f\x6f\x2e\x66\x72\x15\x11\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb6\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb4\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\xb5\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x66\x63\x61\x2e\x69\x63\x6f\x6e\x69\x78\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x97\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x59\x0a\x24\x73\x74\x61\x67\x69\x6e\x67\x2d\x6f\x6e\x62\x6f\x61\x72\x64\x69\x6e\x67\x2e\x72\x70\x6d\x69\x72\x61\x69\x6c\x70\x65\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\xd1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x61\x70\x74\x69\x76\x65\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x70\x65\x70\x6c\x69\x6e\x6b\x2e\x63\x6f\x6d\x15\x31\xbb\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xa0\x01\x0a\x43\x0a\x0e\x61\x63\x63\x2e\x61\x70\x69\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xc9\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x78\x64\x74\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\xce\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x68\x6f\x74\x74\x75\x62\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x73\x2e\x63\x61\x15\x39\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x76\x69\x73\x2d\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xea\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xae\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6b\x62\x2d\x64\x65\x76\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xab\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xaa\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xad\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x65\x64\x64\x69\x6e\x67\x2e\x68\x75\x6e\x67\x65\x72\x74\x69\x6e\x2d\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x15\x63\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x81\x04\x0a\x45\x0a\x10\x6b\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x5c\x0a\x27\x6d\x73\x2d\x63\x72\x65\x64\x69\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x72\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x65\x73\x74\x2e\x72\x6f\x61\x6d\x65\x72\x31\x2e\x63\x6f\x6d\x15\x73\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x5f\x0a\x2a\x6d\x73\x2d\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x74\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x63\x72\x61\x6e\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xab\xb1\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x6b\x63\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x77\x65\x62\x6d\x61\x69\x6c\x2e\x63\x75\x64\x61\x73\x65\x74\x65\x61\x6d\x2e\x63\x6f\x6d\x15\x6f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x2e\x6a\x70\x15\x70\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x69\x6e\x74\x2d\x7a\x75\x72\x69\x63\x68\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x3a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6f\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x63\x61\x6d\x65\x6c\x6c\x69\x61\x2d\x6c\x69\x6e\x65\x2e\x63\x6f\x2e\x6a\x70\x15\x35\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x63\x72\x73\x63\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x15\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x72\x6d\x2e\x65\x72\x61\x6d\x65\x74\x2e\x63\x6f\x6d\x15\x36\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6b\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6a\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6c\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x74\x73\x6f\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1f\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2e\x68\x61\x6d\x69\x6c\x74\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x2a\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x31\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x47\x0a\x12\x70\x73\x2e\x73\x61\x75\x67\x61\x74\x75\x63\x6b\x70\x73\x2e\x63\x6f\x6d\x15\x29\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe7\xf3\x03\x0a\x40\x0a\x0b\x67\x6c\x70\x61\x77\x65\x62\x2e\x6f\x72\x67\x15\x27\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x6d\x2d\x6d\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x26\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x40\x0a\x0b\x64\x65\x76\x2e\x76\x63\x6d\x2e\x63\x6f\x6d\x15\x64\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x61\x70\x70\x73\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x45\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2b\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2e\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x70\x73\x2e\x67\x6c\x65\x6e\x6c\x61\x6b\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2f\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x6d\x62\x67\x2e\x68\x75\x72\x6f\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xe8\xe8\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xac\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xfd\x07\x0a\x4d\x0a\x18\x70\x2d\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xab\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xfd\x07\x0a\x4d\x0a\x18\x64\x2d\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xec\xfc\x07\x0a\x48\x0a\x13\x33\x64\x70\x72\x69\x6d\x65\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x70\x62\x78\x2e\x62\x73\x63\x73\x2e\x6d\x65\x72\x63\x75\x72\x79\x2e\x6e\x65\x74\x15\xc3\x0b\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x8d\x01\x0a\x48\x0a\x13\x64\x2d\x69\x64\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb3\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\xfc\xfd\x07\x0a\x4d\x0a\x18\x63\x70\x34\x2e\x64\x65\x74\x2e\x75\x74\x72\x6f\x70\x69\x63\x6d\x65\x64\x69\x61\x2e\x6e\x65\x74\x15\x72\xb7\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x6d\x73\x6d\x73\x68\x65\x65\x74\x6d\x65\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x60\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6c\x6f\x63\x2e\x6d\x73\x6d\x73\x68\x65\x65\x74\x6d\x65\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x61\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x75\x6d\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x93\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6d\x73\x6d\x63\x2d\x73\x79\x6e\x63\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x90\x61\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xaf\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x69\x2e\x62\x62\x73\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x33\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8c\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x5f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf8\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0a\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf8\x01\x0a\x4c\x0a\x17\x67\x65\x74\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf8\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0f\xce\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x72\x74\x67\x2e\x73\x6f\x75\x74\x68\x67\x61\x74\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x17\xf4\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x63\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x47\x0a\x12\x77\x77\x77\x2e\x74\x72\x69\x6d\x61\x73\x63\x6f\x72\x70\x2e\x6e\x65\x74\x15\xe5\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xb0\xfc\x0f\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x5f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6e\x68\x6d\x73\x68\x6f\x70\x2e\x63\x6f\x2e\x75\x6b\x15\x5e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa2\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa3\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xec\x01\x0a\x46\x0a\x11\x75\x6d\x63\x2d\x6d\x65\x64\x69\x61\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x88\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x9d\x01\x0a\x4c\x0a\x17\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x6e\x65\x77\x68\x6f\x6d\x65\x73\x2e\x63\x6f\x6d\x15\x62\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa4\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\xa5\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd4\x03\x28\x80\xec\x01\x0a\x4c\x0a\x17\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x68\x61\x73\x73\x6b\x31\x32\x2e\x6f\x72\x67\x15\x88\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x6d\x61\x69\x6c\x2e\x6d\x79\x67\x61\x6d\x65\x72\x63\x61\x72\x64\x2e\x6e\x65\x74\x15\xe7\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x84\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x2f\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2c\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2d\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x2b\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x69\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6e\x65\x74\x15\x33\xe4\x8c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x07\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x77\x61\x76\x65\x72\x6c\x79\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x1c\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xfd\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x63\x61\x6c\x67\x61\x72\x79\x61\x72\x65\x61\x2e\x63\x6f\x6d\x15\x6a\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x72\x65\x76\x6f\x64\x65\x72\x6d\x2e\x63\x6f\x6d\x15\x69\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x73\x74\x72\x61\x74\x65\x67\x69\x63\x72\x69\x73\x6b\x73\x2e\x63\x6f\x6d\x15\x56\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x56\x0a\x21\x72\x75\x73\x73\x65\x6c\x6c\x69\x6e\x76\x65\x73\x74\x6d\x65\x6e\x74\x73\x70\x65\x6e\x73\x69\x6f\x6e\x70\x6c\x61\x6e\x2e\x63\x6f\x6d\x15\x55\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x65\x6e\x77\x6c\x2e\x6d\x79\x65\x73\x70\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x54\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x32\x32\x2e\x65\x73\x63\x61\x70\x65\x66\x72\x6f\x6d\x74\x68\x65\x2e\x6e\x65\x74\x15\x53\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x2e\x63\x6f\x6c\x6c\x65\x63\x74\x69\x65\x66\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x52\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x69\x6e\x74\x2d\x72\x75\x73\x73\x65\x6c\x6c\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x51\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6f\x65\x6c\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xf7\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x74\x74\x61\x77\x61\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x12\x3c\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd6\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd4\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd2\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd3\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x43\x0a\x0e\x70\x61\x79\x2e\x61\x66\x66\x67\x6c\x6f\x2e\x63\x6f\x6d\x15\x1e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x4a\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xf0\x81\x01\x0a\x4f\x0a\x1a\x64\x65\x76\x33\x2e\x6d\x65\x64\x69\x63\x61\x6c\x6e\x65\x74\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x49\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x24\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x73\x6a\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x03\x2e\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xfc\xff\x0f\x0a\x52\x0a\x1d\x69\x6e\x74\x2d\x7a\x75\x72\x69\x63\x68\x2d\x74\x72\x75\x73\x74\x65\x65\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xaf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x6e\x74\x2d\x66\x69\x64\x65\x6c\x69\x74\x79\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xb0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x66\x0a\x31\x6d\x73\x2d\x73\x65\x6c\x66\x72\x65\x67\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xb1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x75\x61\x74\x2d\x65\x6d\x62\x61\x72\x6b\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x63\x6f\x6d\x15\xaa\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xab\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x92\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\xf0\xf2\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x6f\x74\x65\x63\x65\x6e\x74\x72\x61\x6c\x2e\x63\x6f\x6d\x15\xb2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x65\x6c\x70\x73\x2e\x75\x73\x15\x0a\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4c\x0a\x17\x76\x69\x64\x65\x6f\x72\x74\x72\x31\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xd0\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x77\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x65\x73\x6c\x69\x65\x6b\x31\x32\x2e\x6e\x65\x74\x15\xc5\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x63\x70\x61\x6e\x65\x6c\x31\x31\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x54\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x68\x6f\x73\x74\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x97\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x74\x73\x2e\x70\x72\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb2\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x64\x61\x74\x61\x63\x6f\x76\x65\x72\x2e\x63\x6f\x6d\x15\x96\xdb\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xa0\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x69\x73\x75\x61\x6c\x69\x7a\x65\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xb8\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9a\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x65\x62\x6d\x61\x69\x6c\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\xa8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x72\x65\x70\x6f\x72\x74\x73\x2e\x69\x61\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xd8\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6e\x6f\x74\x69\x63\x65\x6d\x61\x6e\x61\x67\x65\x72\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xae\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x70\x70\x69\x6e\x67\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xa1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\xa0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6f\x67\x69\x73\x2d\x70\x6f\x72\x74\x61\x6c\x2e\x69\x6e\x65\x74\x76\x61\x73\x73\x2e\x63\x6f\x6d\x15\xa3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x15\x50\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x65\x62\x63\x68\x61\x74\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\xa4\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x68\x69\x6e\x6f\x72\x65\x61\x6c\x74\x79\x2e\x63\x6f\x6d\x15\x29\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xc0\x87\x01\x0a\x49\x0a\x14\x6c\x6f\x63\x61\x74\x65\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\xc4\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x69\x74\x73\x2d\x6d\x67\x69\x73\x74\x73\x74\x77\x65\x62\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x63\x61\x6d\x70\x75\x73\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x64\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6b\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x6a\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x65\x73\x74\x6f\x74\x74\x61\x77\x61\x2e\x6e\x65\x74\x15\x69\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x61\x69\x72\x70\x6f\x72\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x38\xa2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe6\xf3\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xdd\x03\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb4\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb5\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb6\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xb7\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6d\x63\x65\x73\x61\x2d\x74\x63\x2d\x6c\x73\x66\x69\x6c\x74\x65\x72\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x13\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x4d\x0a\x18\x61\x70\x69\x2e\x62\x61\x63\x6b\x75\x70\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x6d\x15\xb1\x97\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x82\x01\x0a\x5a\x0a\x25\x6d\x63\x65\x73\x61\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x0f\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x5a\x0a\x25\x6d\x63\x65\x73\x61\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x66\x69\x6c\x74\x65\x72\x31\x61\x2e\x6d\x63\x65\x73\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x11\x0c\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x81\x04\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x6e\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x01\x0a\x4f\x0a\x1a\x63\x68\x6f\x69\x63\x65\x2d\x70\x62\x78\x2e\x63\x68\x61\x72\x74\x65\x72\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\xd3\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x61\x65\x64\x73\x2e\x6f\x72\x67\x15\x78\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xf0\xf2\x01\x0a\x5d\x0a\x28\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x6e\x74\x65\x72\x76\x65\x6e\x74\x69\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xe3\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x41\x0a\x0c\x74\x6f\x6d\x64\x6f\x62\x65\x73\x2e\x63\x6f\x6d\x15\x28\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4a\x0a\x15\x6d\x65\x72\x72\x69\x6c\x6c\x76\x69\x6c\x6c\x65\x63\x68\x6f\x69\x72\x2e\x63\x6f\x6d\x15\x29\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfb\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x63\x70\x73\x74\x61\x72\x73\x2e\x6f\x72\x67\x15\x2a\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfb\x03\x0a\x53\x0a\x1e\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xfc\xfd\x07\x0a\x4e\x0a\x19\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa7\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xfc\xfd\x07\x0a\x58\x0a\x23\x72\x65\x64\x63\x61\x70\x70\x72\x6f\x64\x75\x63\x74\x69\x6f\x6e\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa2\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x51\x0a\x1c\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xfc\xfd\x07\x0a\x44\x0a\x0f\x73\x79\x73\x2e\x62\x69\x6f\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x50\x3c\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x6e\x6f\x77\x66\x6f\x78\x2e\x61\x73\x75\x73\x63\x6f\x6d\x6d\x2e\x63\x6f\x6d\x15\x48\xe8\xc2\x43\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xcc\x05\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x69\x65\x66\x64\x66\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\xad\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x69\x6d\x6d\x65\x72\x73\x69\x76\x65\x64\x65\x73\x69\x67\x6e\x73\x74\x75\x64\x69\x6f\x73\x2e\x63\x6f\x6d\x15\x88\xb0\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x68\x65\x61\x6c\x74\x68\x79\x6d\x69\x6e\x64\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd6\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x77\x77\x77\x2e\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd7\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x72\x65\x70\x72\x69\x6e\x74\x2d\x61\x70\x6d\x73\x2e\x6f\x72\x67\x15\x9b\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x65\x72\x67\x6f\x70\x68\x69\x6c\x6a\x6f\x75\x72\x6e\x61\x6c\x2e\x6f\x72\x67\x15\xba\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x62\x6c\x6f\x67\x2e\x70\x72\x65\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb9\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x66\x69\x6c\x65\x74\x72\x61\x6e\x73\x66\x65\x72\x2e\x69\x6e\x65\x6f\x2e\x63\x6f\x2e\x61\x74\x15\x56\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x76\x65\x72\x7a\x65\x6b\x65\x72\x64\x65\x69\x6e\x66\x6f\x72\x6d\x61\x74\x69\x65\x61\x70\x69\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x57\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x73\x74\x61\x67\x69\x6e\x67\x2d\x61\x6d\x65\x79\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x55\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x70\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\xab\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x63\x6f\x2e\x6a\x70\x15\xad\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\xac\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6b\x6c\x61\x6e\x74\x65\x6e\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xb2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x67\x6f\x76\x65\x72\x6e\x6f\x72\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xab\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xac\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x66\x6f\x2e\x63\x6f\x6d\x2e\x62\x6f\x15\xae\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb0\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x63\x61\x72\x65\x65\x72\x73\x2e\x77\x65\x6d\x2e\x63\x61\x15\x07\x40\x76\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x10\x0a\x40\x0a\x0b\x70\x61\x64\x2e\x62\x65\x6e\x6a\x2e\x63\x63\x15\x9d\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x72\x65\x6d\x6f\x6e\x74\x2e\x6e\x65\x74\x15\x07\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x88\x04\x0a\x4d\x0a\x18\x64\x65\x73\x74\x69\x6e\x79\x2e\x77\x61\x79\x6c\x61\x6e\x64\x75\x6e\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x89\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x73\x61\x74\x36\x74\x65\x73\x74\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x2d\x41\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x67\x72\x70\x73\x2e\x6f\x72\x67\x15\xd0\x7b\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x64\x65\x72\x6e\x72\x75\x67\x73\x2e\x63\x6f\x6d\x15\xd6\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x64\x65\x72\x6e\x72\x75\x67\x73\x2e\x63\x6f\x6d\x15\xd4\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x0b\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x51\x0a\x1c\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\x0b\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xc7\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x74\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\x3f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x75\x70\x70\x6f\x72\x74\x2e\x6f\x74\x73\x65\x67\x6f\x70\x73\x2e\x6f\x72\x67\x15\x08\x31\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2d\x6c\x69\x62\x72\x61\x72\x79\x37\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x04\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x3c\x0a\x07\x62\x65\x6e\x6a\x2e\x63\x63\x15\x9e\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x76\x6f\x79\x61\x67\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x02\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xde\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x69\x70\x74\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xed\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x86\x04\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdc\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdd\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x56\x0a\x21\x73\x6a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x74\x65\x73\x74\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x81\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x69\x68\x61\x76\x65\x6d\x6f\x6d\x65\x6e\x74\x75\x6d\x2e\x6f\x72\x67\x15\xee\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x61\x70\x70\x2e\x73\x65\x6e\x67\x6a\x6f\x6f\x2e\x63\x6f\x6d\x15\x31\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x86\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xc0\x81\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x69\x63\x65\x32\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x82\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x49\x0a\x14\x69\x63\x65\x32\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x83\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x86\x04\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\x13\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x6c\x69\x65\x6e\x2d\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x83\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x69\x6e\x73\x75\x72\x61\x77\x61\x72\x65\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x50\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xe3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x63\x66\x72\x6e\x61\x69\x63\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x15\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd1\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xd0\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x4d\x0a\x18\x61\x63\x74\x69\x76\x69\x74\x79\x2e\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x2e\x63\x6f\x6d\x15\x19\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x77\x73\x77\x61\x66\x2e\x63\x6f\x6d\x70\x61\x73\x73\x73\x70\x71\x61\x2e\x63\x6f\x6d\x15\x18\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x36\x33\x30\x31\x37\x30\x35\x2d\x36\x37\x38\x34\x38\x62\x62\x36\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xba\xfe\xc2\x43\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x84\x01\x0a\x50\x0a\x1b\x67\x69\x67\x61\x73\x70\x61\x63\x65\x64\x73\x30\x31\x2e\x67\x73\x63\x6c\x75\x73\x74\x65\x72\x2e\x63\x6f\x6d\x15\x5a\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x65\x72\x69\x65\x6d\x61\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x98\xb0\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\xff\xff\x03\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\x93\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6f\x72\x64\x65\x72\x2e\x6d\x61\x69\x7a\x65\x78\x2e\x63\x6f\x6d\x15\x36\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x87\x01\x0a\x45\x0a\x10\x70\x72\x74\x67\x2e\x39\x39\x74\x65\x63\x68\x73\x2e\x63\x6f\x6d\x15\x56\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x65\x6c\x70\x73\x2e\x75\x73\x15\x19\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x63\x65\x6e\x74\x65\x72\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\x7e\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x77\x6d\x74\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x0a\x6a\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xb8\x01\x0a\x55\x0a\x20\x74\x65\x6d\x67\x61\x74\x65\x77\x61\x79\x2d\x74\x65\x73\x74\x2e\x6d\x79\x67\x75\x61\x72\x64\x69\x61\x6e\x63\x75\x2e\x63\x6f\x6d\x15\x27\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x69\x70\x61\x6c\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x20\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6a\x67\x6d\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\x24\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x79\x6f\x75\x72\x63\x61\x73\x65\x2e\x6d\x69\x6e\x73\x74\x65\x72\x6c\x61\x77\x2e\x63\x6f\x2e\x75\x6b\x15\x25\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xfd\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x98\x8a\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xfa\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x98\x8a\x01\x0a\x48\x0a\x13\x70\x62\x78\x2e\x63\x68\x61\x72\x74\x65\x72\x74\x65\x63\x68\x2e\x6e\x65\x74\x15\xc5\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x69\x74\x64\x69\x72\x65\x63\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x93\x14\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x80\x08\x0a\x48\x0a\x13\x6d\x79\x63\x68\x61\x72\x74\x2e\x66\x68\x63\x6b\x7a\x6f\x6f\x2e\x63\x6f\x6d\x15\x89\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe1\xbc\x02\x0a\x4d\x0a\x18\x63\x6f\x6c\x6c\x61\x62\x63\x61\x72\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x61\x66\x2e\x63\x2d\x74\x72\x61\x63\x65\x2e\x64\x65\x15\xb2\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x75\x61\x74\x2e\x69\x6c\x61\x6e\x69\x72\x65\x73\x6f\x72\x74\x2e\x63\x6f\x6d\x15\xb3\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x67\x73\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\xbe\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xb5\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x73\x63\x68\x65\x64\x75\x6c\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xff\xff\x03\x0a\x4e\x0a\x19\x74\x72\x61\x76\x65\x6c\x61\x70\x70\x72\x6f\x76\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xac\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xad\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x62\x75\x79\x62\x61\x62\x79\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xab\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6f\x75\x74\x61\x67\x65\x6d\x61\x70\x2e\x61\x64\x61\x6d\x73\x65\x6c\x65\x63\x74\x72\x69\x63\x2e\x63\x6f\x6f\x70\x15\xb0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x70\x70\x62\x61\x73\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xb1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x48\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xe1\xf3\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x49\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\xe1\xf3\x03\x0a\x6e\x0a\x39\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x69\x6e\x74\x65\x72\x61\x63\x74\x69\x6f\x6e\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x48\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x75\x74\x68\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x76\x63\x15\x47\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x61\x6a\x66\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\x4c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x05\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xec\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x68\x6f\x74\x74\x75\x62\x65\x73\x73\x65\x6e\x74\x69\x61\x6c\x73\x2e\x63\x6f\x6d\x15\x3a\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x63\x61\x63\x74\x69\x2e\x62\x62\x73\x2e\x73\x66\x6a\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x72\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8c\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x71\x61\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x74\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6e\x65\x77\x61\x79\x67\x6f\x2e\x6e\x65\x74\x15\x85\xc2\xf5\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x88\x04\x0a\x4a\x0a\x15\x63\x72\x6d\x2e\x73\x69\x6d\x70\x6c\x65\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x2e\x64\x6b\x15\xc2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6b\x68\x64\x63\x31\x32\x30\x37\x2e\x64\x6d\x63\x2e\x6f\x72\x67\x15\x22\x03\x8b\x9b\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\xc0\x85\x04\x0a\x46\x0a\x11\x72\x65\x70\x72\x65\x68\x65\x6e\x73\x69\x62\x6c\x65\x2e\x6e\x65\x74\x15\x46\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x81\x04\x0a\x54\x0a\x1f\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6d\x61\x64\x69\x73\x6f\x6e\x2d\x61\x63\x61\x64\x65\x6d\x79\x2e\x6f\x72\x67\x15\xe7\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x57\x0a\x22\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x74\x72\x69\x6c\x6c\x69\x75\x6d\x61\x63\x61\x64\x65\x6d\x79\x2e\x75\x73\x15\xe6\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x69\x6e\x64\x69\x61\x6e\x61\x79\x6f\x75\x74\x68\x62\x61\x6c\x6c\x65\x74\x2e\x63\x6f\x6d\x15\x3a\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x55\x0a\x20\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x65\x61\x73\x74\x73\x68\x6f\x72\x65\x6c\x65\x61\x64\x65\x72\x73\x2e\x63\x6f\x6d\x15\xeb\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x55\x0a\x20\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6e\x65\x77\x73\x74\x61\x6e\x64\x61\x72\x64\x66\x6c\x69\x6e\x74\x2e\x6f\x72\x67\x15\xea\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x70\x73\x64\x6f\x77\x61\x67\x69\x61\x63\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x80\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x70\x73\x2e\x6c\x61\x6e\x73\x69\x6e\x67\x2e\x6e\x65\x78\x74\x65\x63\x68\x68\x69\x67\x68\x2e\x6f\x72\x67\x15\xcd\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5d\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5c\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x74\x6d\x73\x2d\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x5b\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x73\x63\x34\x2e\x65\x64\x75\x15\x12\x83\x5a\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x61\x72\x63\x68\x6d\x65\x6e\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x03\x27\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x61\x72\x63\x68\x6d\x65\x6e\x74\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x04\x27\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x4c\x0a\x17\x6c\x69\x6e\x67\x75\x69\x73\x74\x69\x63\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x03\x0a\x4a\x0a\x15\x6c\x69\x62\x70\x72\x6f\x78\x79\x6d\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x61\x6c\x65\x72\x74\x75\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x61\x70\x70\x73\x32\x2e\x70\x68\x61\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xef\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x76\x69\x6c\x6c\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x15\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xf0\xf2\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xbf\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xbe\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc1\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc0\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc3\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc2\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x07\x0a\x4c\x0a\x17\x61\x73\x2d\x61\x72\x63\x68\x69\x76\x65\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x09\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xc6\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x70\x64\x63\x62\x6f\x6f\x6b\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x54\xfd\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x44\x0a\x0f\x6a\x6f\x62\x65\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x55\xfd\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x54\x0a\x1f\x76\x69\x73\x69\x74\x69\x6e\x67\x2d\x73\x63\x68\x6f\x6c\x61\x72\x73\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4b\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x4a\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x47\xb7\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x61\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\x2e\x62\x72\x6f\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8d\x85\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x72\x75\x6c\x65\x33\x31\x35\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x63\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x65\x66\x69\x6c\x65\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x62\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xa9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x62\x61\x72\x66\x74\x62\x64\x73\x73\x2e\x67\x61\x62\x61\x72\x61\x64\x6d\x69\x73\x73\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x5f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x79\x68\x79\x75\x6e\x64\x61\x69\x66\x69\x6e\x61\x6e\x63\x65\x2e\x64\x65\x15\xa7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x6f\x63\x6b\x65\x74\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x61\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x67\x61\x62\x61\x72\x61\x64\x6d\x69\x73\x73\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x60\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x72\x73\x63\x74\x72\x61\x69\x6e\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x6d\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x74\x73\x73\x79\x73\x74\x65\x6d\x2e\x70\x6c\x15\x5a\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x61\x79\x6d\x65\x6e\x74\x73\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x5d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xa1\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x64\x65\x76\x2d\x75\x70\x6c\x6f\x61\x64\x2e\x6b\x70\x6d\x70\x2e\x6f\x72\x67\x15\x17\x04\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfc\x01\x0a\x5b\x0a\x26\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x79\x72\x6f\x6e\x63\x65\x6e\x74\x65\x72\x63\x68\x61\x72\x74\x65\x72\x2e\x6f\x72\x67\x15\x65\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x88\x10\x0a\x48\x0a\x13\x6e\x73\x61\x75\x74\x68\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x73\x79\x6e\x73\x74\x6f\x72\x31\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x32\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x6f\x6f\x64\x6c\x65\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6e\x65\x74\x15\x67\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x63\x0a\x2e\x6d\x73\x2d\x72\x65\x70\x6f\x72\x74\x62\x75\x69\x6c\x64\x65\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xb9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6d\x61\x78\x69\x73\x65\x61\x6c\x68\x61\x72\x6e\x65\x73\x73\x2e\x63\x6f\x6d\x15\xbb\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xb4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x70\x65\x6f\x70\x6c\x65\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\xb7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x64\x65\x70\x74\x61\x70\x70\x73\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x72\x65\x67\x69\x73\x74\x72\x79\x61\x70\x70\x73\x2e\x6e\x65\x74\x15\x0a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x68\x61\x74\x73\x6d\x79\x69\x70\x2e\x6f\x72\x67\x15\x3b\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xa0\x82\x08\x0a\x4a\x0a\x15\x65\x61\x6d\x63\x77\x65\x62\x33\x2e\x75\x73\x66\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x82\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x50\x0a\x1b\x74\x68\x65\x63\x6f\x6d\x70\x6c\x65\x74\x65\x73\x6c\x65\x65\x70\x70\x72\x6f\x67\x72\x61\x6d\x2e\x63\x6f\x6d\x15\x0d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x37\x37\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xfa\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6c\x69\x73\x64\x2d\x75\x63\x6d\x31\x2d\x6d\x73\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\x7a\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x65\x78\x70\x63\x2e\x6c\x69\x73\x64\x2e\x75\x73\x15\x79\xbf\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfe\x01\x0a\x44\x0a\x0f\x73\x73\x70\x72\x2e\x63\x67\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x06\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x67\x6d\x73\x2e\x63\x67\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x04\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x73\x75\x70\x70\x6c\x69\x65\x72\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x6d\x6b\x76\x6d\x31\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x71\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x65\x76\x65\x6e\x74\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x31\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x59\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfa\x03\x0a\x47\x0a\x12\x77\x61\x69\x74\x6c\x69\x73\x74\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x56\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xf0\x81\x01\x0a\x45\x0a\x10\x63\x73\x74\x61\x63\x6b\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x69\x6e\x73\x74\x61\x6c\x6c\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xdd\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x6b\x61\x74\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x6e\x65\x74\x15\xd5\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x50\x0a\x1b\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x64\x65\x74\x72\x6f\x69\x74\x6c\x75\x76\x2e\x63\x6f\x6d\x15\xd4\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd3\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x72\x65\x73\x65\x6c\x6c\x65\x72\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd2\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd9\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x54\x0a\x1f\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x6d\x69\x73\x73\x69\x6f\x6e\x64\x65\x74\x72\x6f\x69\x74\x2e\x6f\x72\x67\x15\xd8\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd7\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xd6\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xdb\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x68\x79\x64\x72\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\xda\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x63\x6d\x32\x72\x72\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf8\x14\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x77\x61\x73\x74\x65\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x46\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x10\x0a\x4c\x0a\x17\x62\x6f\x72\x67\x2d\x72\x73\x74\x75\x64\x69\x6f\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x6f\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x03\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x77\x65\x62\x6d\x6f\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x6e\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x03\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x67\x6d\x73\x74\x73\x2e\x6f\x72\x67\x15\x0d\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x6d\x61\x69\x6c\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\x7d\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x7e\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x35\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x78\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x56\x0a\x21\x77\x77\x77\x2e\x64\x72\x68\x79\x64\x72\x6f\x76\x61\x63\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x81\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x14\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf4\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x72\x61\x63\x65\x66\x61\x63\x65\x2e\x63\x6f\x6d\x15\x0f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x73\x6c\x70\x72\x6f\x67\x72\x61\x6d\x66\x69\x6e\x64\x65\x72\x2e\x63\x6f\x6d\x15\x0d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xed\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x64\x73\x74\x65\x63\x68\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x5c\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xe3\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x5a\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xe3\x01\x0a\x51\x0a\x1c\x6a\x75\x73\x74\x69\x63\x65\x77\x65\x62\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x12\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x65\x73\x6f\x75\x72\x63\x65\x73\x2e\x72\x65\x61\x6c\x74\x79\x73\x6f\x75\x74\x68\x2e\x63\x6f\x6d\x15\x13\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x67\x69\x67\x61\x73\x70\x61\x63\x65\x76\x6d\x30\x32\x2e\x67\x69\x67\x61\x73\x70\x61\x63\x65\x2e\x6e\x65\x74\x15\x57\x26\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x1a\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x62\x2e\x77\x65\x69\x73\x65\x72\x68\x6f\x73\x70\x69\x74\x61\x6c\x2e\x6f\x72\x67\x15\xa4\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\xa5\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x70\x6f\x77\x65\x72\x6e\x65\x74\x2e\x6d\x63\x61\x6e\x65\x6e\x79\x2e\x62\x69\x7a\x15\x9f\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x74\x65\x73\x74\x2e\x63\x6f\x6d\x15\xa2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x63\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\xa0\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x74\x69\x6e\x74\x65\x6e\x74\x6f\x6e\x65\x72\x76\x65\x72\x73\x61\x6e\x64\x2e\x64\x65\x15\x19\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x75\x6d\x75\x6c\x75\x73\x6d\x65\x64\x69\x61\x2e\x63\x6f\x6d\x15\x18\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\x1b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x61\x61\x73\x75\x70\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\x1a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x65\x63\x6f\x6d\x6d\x65\x72\x63\x65\x2e\x70\x72\x69\x6e\x63\x65\x62\x75\x69\x6c\x64\x69\x6e\x67\x73\x79\x73\x74\x65\x6d\x73\x2e\x63\x6f\x6d\x15\x14\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x6f\x67\x6e\x69\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x17\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x16\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x6f\x62\x61\x6c\x74\x2d\x64\x65\x76\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x73\x65\x65\x6c\x69\x76\x65\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\x1c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x64\x65\x6e\x74\x2d\x62\x69\x6f\x70\x73\x79\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe1\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6c\x65\x61\x72\x6e\x69\x6e\x67\x73\x70\x61\x63\x65\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x30\xc6\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x84\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xaf\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x70\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x73\xd0\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x6c\x69\x76\x6f\x6e\x69\x61\x70\x75\x62\x6c\x69\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x02\xea\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x02\x0a\x41\x0a\x0c\x76\x69\x73\x2d\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xe7\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\xac\xc8\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x67\x72\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe8\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x56\x0a\x21\x77\x6f\x72\x6c\x64\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x77\x6f\x72\x6c\x64\x74\x72\x61\x76\x65\x6c\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x91\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x6f\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x8f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x69\x6e\x74\x65\x6c\x2e\x66\x6f\x6f\x64\x62\x75\x79\x2e\x63\x6f\x6d\x15\x8e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x6f\x72\x74\x61\x6c\x2e\x72\x6b\x6d\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\x8d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x4d\x79\x43\x68\x61\x72\x74\x54\x65\x73\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x42\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x95\xff\x02\x0a\x4a\x0a\x15\x77\x61\x61\x73\x2e\x63\x75\x64\x61\x63\x6c\x6f\x75\x64\x6c\x61\x62\x2e\x6e\x65\x74\x15\x94\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x33\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x35\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x38\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x50\x0a\x1b\x32\x30\x31\x39\x2e\x61\x6e\x6e\x75\x61\x6c\x72\x65\x70\x6f\x72\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x39\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x66\x69\x6c\x65\x73\x2e\x65\x6d\x70\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x15\x8c\xd2\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x66\x6c\x69\x6e\x74\x72\x65\x67\x69\x73\x74\x72\x79\x2e\x63\x74\x73\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\xa0\xfd\x01\x0a\x45\x0a\x10\x66\x72\x61\x6e\x6b\x6c\x69\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x41\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x5b\x22\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xff\xff\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x6d\x6f\x6c\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xe8\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6b\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x5d\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x5c\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x77\x65\x62\x63\x70\x61\x63\x73\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x1c\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x6e\x7a\x69\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x62\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x45\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe6\x19\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x75\x6d\x70\x68\x6f\x74\x6f\x2d\x70\x6f\x72\x74\x61\x6c\x73\x2e\x70\x68\x6f\x74\x6f\x73\x2e\x6e\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7c\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x68\x70\x73\x76\x69\x6b\x69\x6e\x67\x73\x2e\x6f\x72\x67\x15\x47\x32\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x70\x68\x6f\x74\x6f\x73\x2e\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x72\x68\x69\x6e\x6f\x72\x65\x61\x6c\x74\x79\x2e\x63\x6f\x6d\x15\x28\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\xc0\x87\x01\x0a\x4a\x0a\x15\x6d\x65\x74\x6c\x69\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x6e\x65\x75\x72\x6f\x64\x65\x67\x65\x6e\x65\x72\x61\x74\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6c\x74\x61\x69\x72\x63\x69\x2e\x63\x6f\x6d\x15\x6e\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x61\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xec\x01\x0a\x4b\x0a\x16\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x70\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x43\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x74\x75\x73\x2e\x69\x74\x73\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x91\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x79\x76\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x65\x6f\x74\x74\x61\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe2\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x41\x0a\x0c\x6d\x6f\x6e\x72\x6f\x65\x69\x73\x64\x2e\x75\x73\x15\xdb\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\xf0\xf2\x01\x0a\x44\x0a\x0f\x6d\x69\x62\x61\x62\x79\x61\x6e\x64\x75\x73\x2e\x63\x6f\x6d\x15\xe3\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x76\x65\x63\x74\x6f\x72\x74\x6f\x6f\x6c\x2e\x63\x6f\x6d\x15\x9f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x33\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x58\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x8b\x01\x0a\x44\x0a\x0f\x75\x70\x6c\x6f\x61\x64\x2e\x6b\x70\x6d\x70\x2e\x6f\x72\x67\x15\x13\x04\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x4c\x0a\x17\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x98\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x61\x72\x74\x2e\x74\x68\x65\x62\x6f\x6f\x6b\x70\x61\x74\x63\x68\x2e\x63\x6f\x6d\x15\x57\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6d\x61\x69\x6c\x2e\x61\x75\x74\x68\x6f\x72\x61\x63\x61\x64\x65\x6d\x79\x70\x72\x6f\x2e\x63\x6f\x6d\x15\x56\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6f\x73\x2e\x62\x75\x69\x6c\x64\x61\x6d\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x4c\xd7\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x84\x04\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x6f\x71\x75\x69\x6c\x6c\x65\x74\x72\x69\x62\x65\x2e\x6f\x72\x67\x15\x9a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4f\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4e\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xec\x01\x0a\x4a\x0a\x15\x73\x75\x70\x70\x6f\x72\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x68\x65\x6c\x70\x64\x65\x73\x6b\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x18\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4b\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x4c\x73\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xec\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xc4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x77\x70\x79\x2d\x65\x6e\x74\x72\x79\x2e\x63\x6f\x6d\x15\xc2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xc3\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xc1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x79\x72\x69\x6f\x6e\x2e\x73\x65\x63\x75\x72\x69\x63\x6f\x72\x65\x2e\x63\x61\x15\xbf\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x6f\x6c\x61\x72\x34\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe8\x3a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x6f\x62\x69\x2e\x61\x6c\x6d\x61\x69\x6c\x65\x6d\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x37\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\xc7\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6a\x75\x70\x79\x74\x65\x72\x68\x75\x62\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xee\x01\x0a\x42\x0a\x0d\x68\x6f\x70\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x98\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x66\x65\x6e\x69\x78\x78\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x97\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x76\x65\x6e\x74\x72\x69\x63\x2e\x6d\x69\x2e\x33\x63\x78\x2e\x75\x73\x15\x9a\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x74\x6e\x6d\x2e\x6a\x63\x6f\x66\x66\x65\x79\x2e\x63\x6f\x2e\x75\x6b\x15\xdc\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2d\x61\x74\x2e\x6f\x74\x61\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\xe1\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x75\x73\x79\x73\x70\x72\x64\x37\x30\x32\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdc\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x76\x69\x76\x61\x74\x72\x61\x63\x6b\x65\x72\x2e\x63\x6f\x6d\x15\x9e\xd6\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x84\x04\x0a\x49\x0a\x14\x67\x65\x6e\x6f\x6d\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x03\x0a\x47\x0a\x12\x62\x72\x74\x2e\x64\x61\x6e\x67\x6d\x75\x63\x68\x65\x6e\x2e\x63\x6f\x6d\x15\x2e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x33\x2e\x74\x72\x65\x61\x63\x79\x2e\x63\x6f\x2e\x75\x6b\x15\x2f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x72\x73\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x6d\x15\x29\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x73\x75\x72\x76\x2e\x6a\x6f\x63\x61\x72\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\x30\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x65\x61\x6b\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x0d\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x68\x75\x62\x62\x6c\x65\x2e\x70\x6c\x61\x6e\x74\x62\x69\x6f\x6c\x6f\x67\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0a\xc4\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6b\x65\x65\x6c\x65\x72\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x77\x6f\x72\x6b\x73\x2d\x64\x65\x73\x69\x67\x6e\x2e\x63\x6f\x6d\x15\x89\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x61\x69\x72\x70\x61\x72\x6b\x2e\x6f\x6e\x65\x15\x88\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x87\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x86\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x7a\x6f\x72\x67\x7a\x61\x61\x6d\x2e\x6e\x6c\x15\x85\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x7a\x65\x6b\x75\x72\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x84\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x75\x6e\x69\x76\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x83\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x68\x79\x6d\x6e\x61\x72\x79\x2e\x6f\x72\x67\x15\x1f\x87\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xfb\x03\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x77\x61\x74\x65\x72\x2d\x73\x6f\x66\x74\x65\x6e\x65\x72\x73\x2d\x66\x69\x6c\x74\x65\x72\x73\x2e\x63\x6f\x6d\x15\xc6\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x70\x73\x75\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x37\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x61\x71\x75\x61\x70\x75\x72\x65\x77\x61\x74\x65\x72\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xc2\xd4\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x6c\x73\x32\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa8\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x65\x73\x74\x2e\x64\x72\x6f\x77\x6e\x61\x74\x74\x61\x63\x6b\x2e\x63\x6f\x6d\x15\x28\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x28\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x70\x69\x67\x77\x2d\x74\x73\x74\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6b\xc7\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x6c\x79\x6e\x63\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x11\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x84\x04\x0a\x4c\x0a\x17\x70\x73\x2e\x68\x6f\x6c\x6c\x61\x6e\x64\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\x54\x3b\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xe7\xf3\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6d\x61\x6e\x69\x73\x74\x65\x65\x2e\x6f\x72\x67\x15\xdc\x2d\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x15\x25\xb8\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x77\x69\x6b\x69\x68\x6f\x73\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x26\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x21\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x23\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x61\x6d\x70\x75\x73\x63\x61\x6c\x6c\x64\x65\x76\x2e\x75\x61\x64\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1a\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x24\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x66\x75\x73\x65\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x31\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe3\x01\x0a\x4a\x0a\x15\x69\x6e\x66\x6f\x67\x70\x73\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x30\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe3\x01\x0a\x44\x0a\x0f\x73\x62\x32\x2e\x64\x65\x6d\x6d\x61\x70\x73\x2e\x6f\x72\x67\x15\x84\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6c\x71\x63\x6f\x6e\x6e\x65\x63\x74\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x7a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2f\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xe3\x01\x0a\x47\x0a\x12\x67\x72\x65\x67\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x2e\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xe3\x01\x0a\x49\x0a\x14\x63\x6c\x6f\x75\x64\x2e\x67\x62\x63\x61\x6d\x70\x62\x65\x6c\x6c\x2e\x63\x6f\x6d\x15\x28\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x75\x6e\x69\x6f\x6e\x73\x2e\x6d\x61\x6e\x70\x6f\x77\x65\x72\x2e\x67\x6f\x76\x2e\x65\x67\x15\x7c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x66\x69\x72\x65\x77\x61\x6c\x6c\x2e\x63\x68\x61\x72\x6c\x6f\x74\x74\x65\x6e\x65\x74\x2e\x6f\x72\x67\x15\x7e\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x01\x0a\x4d\x0a\x18\x6c\x71\x61\x63\x6c\x74\x65\x73\x74\x2e\x6c\x71\x67\x72\x6f\x75\x70\x2e\x6f\x72\x67\x2e\x75\x6b\x15\x65\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x72\x63\x68\x69\x76\x65\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x2e\x63\x6f\x2e\x6a\x70\x15\x2e\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x61\x6c\x6c\x65\x2d\x73\x63\x68\x77\x61\x72\x7a\x2e\x64\x65\x15\x32\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x74\x65\x6d\x67\x61\x74\x65\x77\x61\x79\x2d\x70\x72\x6f\x64\x2e\x6d\x79\x67\x75\x61\x72\x64\x69\x61\x6e\x63\x75\x2e\x63\x6f\x6d\x15\x33\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x63\x68\x61\x74\x6f\x76\x65\x72\x74\x61\x6b\x65\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x36\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x73\x2e\x63\x61\x73\x70\x65\x72\x77\x79\x2e\x67\x6f\x76\x15\x38\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x64\x67\x63\x61\x2e\x67\x6f\x76\x2e\x6b\x77\x15\x3b\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x62\x67\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x28\x00\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x6d\x61\x69\x6c\x2e\x67\x62\x63\x73\x2e\x6f\x72\x67\x15\x0d\xb8\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x4d\x0a\x18\x72\x72\x6e\x64\x62\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x74\x70\x63\x2e\x65\x64\x75\x15\x2a\x01\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x72\x65\x63\x79\x63\x6c\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x30\x33\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x73\x6d\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\xed\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x32\x30\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xec\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x39\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xeb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x65\x62\x68\x6f\x6f\x6b\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x05\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x02\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x6f\x6b\x2d\x68\x6f\x6d\x6f\x6c\x6f\x67\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\x03\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x6c\x6f\x75\x64\x2e\x74\x72\x67\x2e\x6d\x65\x64\x69\x61\x15\x09\xb6\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x63\x68\x61\x72\x74\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x77\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x96\xbf\x02\x0a\x47\x0a\x12\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x74\x64\x64\x65\x6d\x6f\x2e\x68\x75\x15\xee\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x70\x0a\x3b\x6d\x73\x2d\x6e\x6f\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x61\x64\x6d\x69\x6e\x69\x73\x74\x72\x61\x74\x69\x6f\x6e\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x97\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x6d\x73\x2d\x65\x6d\x61\x69\x6c\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x99\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x61\x0a\x2c\x6d\x73\x2d\x65\x6e\x72\x6f\x6c\x6c\x6d\x65\x6e\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x9b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x68\x65\x72\x69\x66\x66\x73\x61\x6c\x65\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x9c\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x63\x0a\x2e\x6d\x73\x2d\x64\x69\x67\x69\x74\x61\x6c\x72\x69\x67\x68\x74\x73\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x9d\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x77\x69\x6c\x73\x6f\x6e\x73\x61\x75\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\x9f\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x29\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x47\x0a\x12\x6d\x67\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x15\x4f\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x72\x65\x73\x2e\x65\x6d\x6f\x6c\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\xe4\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x70\x73\x70\x61\x79\x72\x6f\x6c\x6c\x2e\x63\x6f\x6d\x15\xdc\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x77\x77\x77\x2e\x63\x68\x61\x72\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x63\x6f\x6d\x15\xdd\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x70\x61\x72\x74\x6e\x65\x72\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x6d\x69\x2e\x63\x6f\x6d\x15\xde\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x74\x62\x61\x69\x73\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x52\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x88\x10\x0a\x4a\x0a\x15\x73\x66\x77\x2e\x61\x65\x72\x6f\x73\x70\x61\x63\x65\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x4c\x51\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x63\x77\x2e\x73\x74\x68\x6f\x73\x74\x73\x2e\x6e\x65\x74\x15\x4d\x25\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfb\x03\x0a\x49\x0a\x14\x72\x61\x76\x70\x6e\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\x80\x02\x0a\x49\x0a\x14\x72\x61\x76\x70\x6e\x33\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x80\x02\x0a\x48\x0a\x13\x77\x77\x77\x2e\x66\x75\x74\x75\x72\x65\x61\x72\x63\x68\x73\x2e\x6f\x72\x67\x15\xe0\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x63\x61\x64\x65\x6d\x69\x63\x70\x72\x6f\x66\x69\x6c\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x61\x64\x64\x76\x61\x6e\x74\x61\x67\x65\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\xa9\xbc\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x4b\x0a\x16\x6c\x72\x63\x65\x72\x65\x62\x72\x6f\x2e\x6d\x6c\x6c\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe8\xa9\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x61\x70\x70\x73\x74\x6f\x72\x65\x2e\x63\x6f\x6d\x15\x23\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe0\x87\x01\x0a\x46\x0a\x11\x77\x65\x63\x61\x72\x65\x61\x64\x76\x69\x73\x6f\x72\x2e\x6f\x72\x67\x15\x15\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x3f\x0a\x0a\x6d\x6f\x74\x68\x75\x72\x2e\x6f\x72\x67\x15\x16\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x69\x70\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc5\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x72\x6f\x61\x64\x6d\x61\x70\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x72\x6f\x61\x64\x6d\x61\x70\x2d\x71\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6a\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x62\x65\x74\x61\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\xd6\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xd9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\xd5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x65\x78\x64\x65\x76\x2e\x68\x65\x61\x6c\x74\x68\x74\x72\x75\x73\x74\x65\x75\x72\x6f\x70\x65\x2e\x63\x6f\x6d\x15\xd4\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd0\x07\x28\x80\xf3\x01\x0a\x5e\x0a\x29\x6d\x73\x2d\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\xdb\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x6f\x6d\x63\x61\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0f\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\x99\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x7e\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x69\x63\x65\x34\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x77\x65\x62\x73\x2e\x63\x6f\x6d\x15\x5c\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x4e\x0a\x19\x6d\x79\x63\x68\x61\x72\x74\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x65\x61\x6c\x74\x68\x2e\x63\x6f\x6d\x15\x66\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xe8\xbc\x02\x0a\x4e\x0a\x19\x69\x6e\x74\x2d\x65\x6e\x77\x2d\x6d\x65\x6d\x62\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x92\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x79\x68\x6f\x73\x74\x65\x64\x66\x61\x78\x2e\x63\x6f\x6d\x15\x93\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x75\x70\x65\x72\x69\x63\x65\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x60\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x73\x75\x70\x65\x72\x69\x63\x65\x2e\x63\x68\x69\x6e\x6f\x6f\x6b\x73\x65\x72\x76\x65\x72\x73\x2e\x63\x6f\x6d\x15\x61\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x6c\x6f\x67\x69\x6e\x2e\x76\x61\x6e\x74\x72\x65\x65\x2e\x63\x6f\x6d\x15\x8e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x31\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4a\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x95\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x32\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4b\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x6d\x6b\x76\x6d\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x24\xcb\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x6d\x61\x6e\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x25\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x31\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x69\x64\x70\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x9f\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x68\x6f\x6b\x69\x77\x69\x6b\x69\x70\x65\x64\x2e\x6e\x65\x74\x15\x9f\xb8\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0c\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0d\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6f\x61\x6b\x6c\x61\x6e\x64\x2e\x65\x64\x75\x15\x0e\x02\xd2\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x73\x2e\x72\x65\x6e\x61\x69\x73\x73\x61\x6e\x63\x65\x70\x73\x61\x2e\x63\x6f\x6d\x15\x43\x7b\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x68\x75\x64\x73\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x1b\xa9\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x62\x73\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x2e\x6b\x72\x15\x78\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x70\x2d\x6f\x6e\x79\x78\x39\x39\x38\x2d\x77\x61\x66\x2e\x64\x65\x67\x2e\x72\x65\x64\x15\xe6\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x6b\x68\x70\x73\x2e\x6f\x72\x67\x15\x27\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x6f\x72\x6c\x65\x61\x6e\x73\x74\x6f\x77\x65\x72\x2e\x63\x6f\x6d\x15\xec\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6f\x6e\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xed\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x70\x69\x2e\x62\x63\x63\x2e\x62\x61\x72\x72\x61\x63\x75\x64\x61\x6e\x65\x74\x77\x6f\x72\x6b\x73\x2e\x63\x6f\x6d\x15\x4c\x97\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x67\x6f\x6f\x64\x79\x65\x61\x72\x2e\x68\x6b\x15\x36\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x78\x65\x6e\x61\x70\x70\x64\x65\x76\x2d\x73\x66\x30\x31\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x63\x75\x74\x63\x6f\x76\x61\x75\x6c\x74\x2e\x63\x75\x74\x63\x6f\x2e\x63\x6f\x6d\x15\x3a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x69\x74\x73\x75\x6d\x76\x70\x6e\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x46\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xfc\xff\x0f\x0a\x54\x0a\x1f\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x73\x6d\x74\x64\x2d\x77\x77\x77\x32\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x0d\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xa6\x80\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x0c\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x49\x0a\x14\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x7a\x65\x6b\x75\x72\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x7c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x7a\x6f\x72\x67\x7a\x61\x61\x6d\x2e\x6e\x6c\x15\x7d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x7e\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x69\x7a\x61\x2e\x6e\x6c\x15\x7f\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x2e\x62\x65\x77\x75\x7a\x74\x2e\x6e\x6c\x15\x78\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x79\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x74\x73\x74\x2e\x6d\x69\x6a\x6e\x75\x6e\x69\x76\x65\x7a\x6f\x72\x67\x2e\x6e\x6c\x15\x7b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x62\x65\x77\x75\x7a\x74\x2e\x6e\x6c\x15\x80\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x61\x63\x63\x2e\x6d\x69\x6a\x6e\x2e\x75\x6d\x63\x7a\x6f\x72\x67\x76\x65\x72\x7a\x65\x6b\x65\x72\x69\x6e\x67\x2e\x6e\x6c\x15\x81\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x76\x6e\x2e\x62\x69\x74\x6c\x65\x61\x70\x2e\x6e\x65\x74\x15\x0e\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf4\x01\x0a\x4a\x0a\x15\x70\x73\x75\x6d\x30\x36\x2d\x31\x30\x30\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x3f\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xe3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x03\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\xfc\xff\x0f\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x77\x69\x7a\x61\x72\x64\x2e\x75\x6d\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x04\x10\xd7\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x67\x68\x61\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x04\x26\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xd0\x07\x28\xfc\xff\x0f\x0a\x49\x0a\x14\x67\x61\x74\x65\x77\x61\x79\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x94\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x68\x70\x73\x6b\x31\x32\x2e\x6e\x65\x74\x15\xd0\x27\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x43\x0a\x0d\x63\x61\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xd0\x80\x02\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6b\x61\x74\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x6e\x65\x74\x15\x94\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x65\x6c\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x69\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x65\x62\x6d\x61\x69\x6c\x2e\x61\x62\x69\x73\x6e\x79\x2e\x70\x65\x6f\x70\x6c\x65\x2e\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x73\x70\x65\x65\x64\x74\x65\x73\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x0f\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x67\x72\x6f\x75\x70\x73\x2d\x65\x78\x74\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf6\x01\x0a\x46\x0a\x11\x6d\x69\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x15\xdd\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x63\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xe1\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xfb\x03\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9a\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xec\x01\x0a\x42\x0a\x0d\x61\x75\x74\x6f\x67\x72\x61\x64\x65\x72\x2e\x69\x6f\x15\x9b\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xec\x01\x0a\x54\x0a\x1f\x77\x77\x77\x2e\x73\x74\x61\x67\x69\x6e\x67\x2e\x62\x65\x74\x61\x2e\x61\x6c\x75\x6d\x6e\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8c\x01\x0a\x42\x0a\x0d\x65\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x55\x0a\x20\x64\x65\x76\x69\x63\x65\x34\x32\x31\x38\x38\x39\x39\x2d\x38\x36\x35\x61\x32\x35\x66\x61\x2e\x77\x64\x32\x67\x6f\x2e\x63\x6f\x6d\x15\xd7\xfc\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x84\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\xaf\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x75\x64\x64\x61\x74\x68\x2e\x63\x6f\x6d\x15\x83\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6b\x65\x6c\x6c\x65\x79\x62\x72\x6f\x73\x2e\x63\x6c\x6f\x75\x64\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\x36\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xe3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x85\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x82\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x88\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x86\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x88\x10\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x63\x6f\x6d\x65\x74\x73\x2e\x6e\x65\x74\x15\x8a\x38\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x65\x72\x6f\x65\x6d\x62\x65\x64\x64\x65\x64\x2e\x63\x6f\x6d\x15\xa5\xbf\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x73\x69\x70\x72\x65\x63\x6f\x72\x64\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x2f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x72\x61\x69\x6c\x74\x61\x6b\x65\x72\x2e\x63\x6f\x6d\x15\xa2\xbf\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x2d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x74\x61\x6d\x6b\x61\x61\x72\x74\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\x2c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x31\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x68\x71\x2d\x70\x61\x74\x72\x6f\x6e\x65\x6e\x2e\x61\x74\x15\x30\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x61\x64\x73\x65\x6c\x66\x73\x65\x72\x76\x69\x63\x65\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\xaf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x68\x6b\x67\x61\x74\x65\x77\x61\x79\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x70\x61\x74\x69\x65\x6e\x74\x63\x6f\x6e\x6e\x65\x63\x74\x33\x36\x35\x2e\x63\x6f\x6d\x15\xe1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\xe2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x76\x6f\x6c\x75\x6e\x74\x65\x65\x72\x73\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x6a\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x61\x66\x31\x32\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdd\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x33\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xde\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x34\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdf\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x73\x2d\x64\x65\x76\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\xe4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xe5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x73\x74\x2e\x7a\x6f\x72\x67\x61\x70\x70\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x07\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x65\x6c\x66\x73\x65\x72\x76\x69\x63\x65\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x06\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x61\x74\x61\x6c\x6f\x67\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xc1\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x5c\x0a\x27\x30\x2d\x73\x65\x61\x72\x63\x68\x2e\x70\x72\x6f\x71\x75\x65\x73\x74\x2e\x63\x6f\x6d\x2e\x63\x61\x74\x61\x6c\x6f\x67\x2e\x77\x62\x6c\x69\x62\x2e\x6f\x72\x67\x15\xc2\x44\x66\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x6e\x67\x69\x6e\x78\x2e\x65\x68\x72\x6d\x65\x64\x62\x69\x6c\x6c\x69\x6e\x67\x2e\x63\x6f\x6d\x15\xdd\xd6\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x70\x68\x65\x6e\x6f\x6d\x65\x31\x30\x6b\x2e\x6f\x72\x67\x15\x09\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x6d\x73\x2e\x67\x6d\x73\x75\x61\x65\x2e\x63\x6f\x6d\x15\x08\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6f\x6d\x73\x71\x61\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x54\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x65\x62\x2d\x6d\x77\x30\x31\x2d\x74\x65\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x56\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x65\x62\x2d\x6d\x77\x30\x32\x2d\x74\x65\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x61\x6d\x65\x72\x69\x63\x61\x73\x2e\x63\x6f\x6d\x15\x57\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x65\x73\x74\x2e\x77\x61\x65\x70\x61\x2e\x6f\x72\x67\x15\x50\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x51\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\x52\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x59\x0a\x24\x63\x66\x70\x63\x61\x2d\x77\x65\x62\x63\x68\x65\x63\x6b\x6f\x75\x74\x2e\x66\x69\x6e\x65\x61\x72\x74\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4f\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x69\x6f\x74\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1d\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x6e\x63\x65\x6e\x74\x72\x61\x6c\x2e\x6a\x64\x63\x74\x65\x6b\x2e\x63\x6f\x6d\x15\x9e\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x61\x70\x70\x62\x61\x73\x65\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xb7\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x68\x65\x63\x6b\x69\x6e\x2e\x6f\x68\x65\x61\x2e\x6f\x72\x67\x15\xb6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x70\x72\x6f\x63\x65\x73\x73\x69\x6e\x67\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\xba\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\xb9\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6c\x61\x6e\x64\x72\x65\x63\x6f\x72\x64\x73\x70\x61\x2e\x61\x64\x61\x6d\x73\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\xb8\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6f\x70\x65\x6e\x6a\x65\x72\x69\x63\x68\x6f\x2e\x63\x6f\x6d\x15\xfa\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6b\x65\x6e\x74\x69\x73\x64\x2e\x6f\x72\x67\x15\xe0\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x63\x70\x61\x6e\x65\x6c\x2e\x63\x68\x69\x63\x61\x67\x6f\x6c\x61\x6e\x64\x64\x61\x72\x74\x65\x72\x73\x2e\x63\x6f\x6d\x15\x92\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x62\x72\x69\x67\x68\x74\x73\x69\x64\x65\x61\x63\x61\x64\x65\x6d\x79\x2e\x63\x6f\x6d\x15\x4d\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x6f\x66\x66\x69\x63\x65\x2e\x63\x6f\x6c\x6f\x2e\x6d\x74\x75\x67\x65\x65\x6b\x2e\x63\x6f\x6d\x15\x8c\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xd5\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x62\x72\x69\x67\x68\x74\x73\x69\x64\x65\x6f\x68\x69\x6f\x2e\x63\x6f\x6d\x15\x4e\x23\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x95\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x94\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x76\x77\x67\x69\x77\x65\x62\x70\x6c\x61\x74\x66\x6f\x72\x6d\x2e\x69\x65\x15\xe5\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x69\x73\x74\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x1e\x24\xfd\xa3\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x19\x6d\x61\x69\x6c\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x45\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf2\xff\x07\x0a\x41\x0a\x0c\x74\x61\x70\x70\x65\x72\x69\x65\x74\x2e\x6e\x75\x15\xe3\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x73\x65\x63\x75\x72\x69\x74\x79\x2d\x6c\x61\x62\x2e\x69\x74\x15\xe2\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\xdf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\xb6\x38\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\xe3\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x71\x61\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x64\x65\x72\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xad\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xb3\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x65\x78\x74\x68\x72\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xcc\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x39\x36\x31\x68\x6f\x6d\x65\x2e\x63\x6f\x6d\x15\xca\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x6f\x6e\x72\x6f\x65\x69\x73\x64\x2e\x75\x73\x15\xe7\xb1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\xf0\xf2\x01\x0a\x47\x0a\x12\x66\x72\x65\x65\x64\x6f\x6d\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\xd0\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6d\x61\x72\x6b\x74\x70\x6f\x73\x69\x74\x69\x65\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x61\x70\x70\x73\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x72\x65\x64\x63\x61\x70\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x99\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x6d\x61\x74\x72\x69\x78\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x86\x80\x01\x0a\x4c\x0a\x17\x77\x69\x72\x65\x6c\x65\x73\x73\x6c\x6f\x67\x69\x6e\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x94\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x87\x01\x0a\x5a\x0a\x25\x62\x65\x61\x74\x73\x6f\x6e\x63\x61\x6e\x63\x65\x72\x63\x68\x61\x72\x69\x74\x79\x2e\x65\x71\x75\x61\x74\x6f\x72\x2d\x74\x65\x73\x74\x2e\x63\x6f\x6d\x15\x86\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x72\x6f\x76\x69\x64\x65\x72\x73\x2e\x69\x72\x68\x63\x2e\x63\x6f\x6d\x15\x8a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6e\x65\x74\x6c\x61\x62\x2e\x70\x63\x63\x73\x6b\x31\x32\x2e\x63\x6f\x6d\x15\x29\xc7\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x65\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\xa8\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x62\x61\x64\x73\x74\x6f\x72\x65\x2e\x64\x61\x72\x6b\x6c\x61\x62\x2e\x63\x6f\x15\xcf\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xcb\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x72\x65\x64\x69\x72\x65\x63\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4a\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x6d\x61\x72\x6b\x74\x70\x6f\x73\x69\x74\x69\x65\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\x0b\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x6f\x6e\x6e\x65\x63\x74\x73\x70\x2e\x63\x6f\x6d\x15\xd1\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xd0\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x1e\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa7\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x64\x61\x74\x61\x2e\x6e\x68\x6d\x2e\x61\x63\x2e\x75\x6b\x15\x3e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x72\x6d\x68\x62\x69\x67\x62\x61\x73\x73\x2e\x63\x6f\x6d\x15\x3f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x68\x65\x61\x6c\x74\x68\x6f\x70\x74\x69\x6f\x6e\x73\x2e\x6f\x72\x67\x15\x3d\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xcf\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x74\x2e\x61\x74\x68\x65\x6e\x61\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x42\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x6c\x73\x2e\x74\x65\x73\x74\x73\x74\x73\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x41\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\x44\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xdd\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xde\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xdf\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\xb3\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x69\x70\x6c\x65\x79\x73\x2e\x63\x6f\x6d\x15\x72\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x11\x69\x6e\x74\x72\x61\x6e\x65\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x79\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x9f\x75\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xe3\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x63\x63\x65\x73\x73\x2e\x61\x63\x74\x69\x76\x65\x73\x74\x65\x70\x2e\x6f\x72\x67\x15\x7d\xda\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x74\x72\x65\x6d\x61\x74\x65\x63\x68\x2e\x63\x6f\x6d\x15\x0b\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xe0\x87\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x6f\x70\x73\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4c\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x15\x6e\x65\x74\x77\x6f\x72\x6b\x61\x63\x63\x65\x73\x73\x2e\x6d\x63\x63\x2e\x65\x64\x75\x15\x1f\xa3\x99\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x7a\x0a\x41\x0a\x0c\x76\x32\x6d\x73\x2e\x7a\x70\x73\x2e\x6f\x72\x67\x15\x86\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xe6\xf3\x03\x0a\x45\x0a\x10\x62\x73\x73\x62\x70\x72\x6f\x64\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1f\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x62\x73\x73\x62\x74\x65\x73\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x24\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x7a\x75\x65\x72\x63\x68\x65\x72\x70\x6f\x72\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x16\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfb\x03\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x7a\x75\x65\x72\x63\x68\x65\x72\x70\x6f\x72\x74\x61\x6c\x2e\x63\x6f\x6d\x15\x15\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfb\x03\x0a\x50\x0a\x1b\x64\x61\x76\x6d\x61\x69\x6c\x2e\x77\x65\x78\x63\x68\x61\x6e\x67\x65\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x17\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x70\x6f\x72\x74\x61\x6c\x31\x2d\x67\x65\x6f\x2e\x73\x61\x62\x75\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x3d\x54\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x88\x10\x0a\x4e\x0a\x19\x6c\x69\x6d\x6f\x73\x75\x72\x76\x65\x79\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xab\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x6e\x6f\x76\x6f\x2e\x63\x72\x65\x64\x70\x61\x79\x2e\x63\x6f\x6d\x2e\x62\x72\x15\xc1\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x31\x37\x38\x32\x35\x30\x2e\x63\x75\x64\x61\x64\x70\x73\x2e\x63\x6f\x6d\x15\xfa\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x15\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x7a\x70\x65\x6e\x2e\x69\x6e\x66\x6f\x15\xbd\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x0d\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x70\x72\x6f\x6a\x65\x63\x74\x73\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x2d\xac\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x61\x6e\x6c\x61\x77\x69\x6e\x63\x2e\x63\x6f\x6d\x15\x0e\xbe\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x5a\x0a\x25\x6d\x73\x2d\x61\x69\x63\x63\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x6a\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x68\x69\x74\x73\x2e\x73\x69\x64\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\x6d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xd4\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x70\x62\x78\x2e\x62\x65\x6e\x6a\x2e\x63\x63\x15\x94\xd1\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x74\x65\x6e\x66\x6f\x72\x65\x2e\x6e\x65\x74\x15\x4d\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x63\x6f\x6d\x15\x4a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x75\x61\x74\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x46\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x65\x73\x65\x61\x72\x63\x68\x69\x64\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xda\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x64\x61\x6d\x73\x67\x75\x69\x74\x61\x72\x2e\x65\x72\x72\x61\x6e\x74\x6e\x65\x74\x2e\x63\x6f\x6d\x15\x85\xd5\x4f\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1e\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\xfd\x01\x0a\x5a\x0a\x25\x73\x6d\x74\x64\x2d\x73\x63\x68\x65\x64\x75\x6c\x69\x6e\x67\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd9\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x22\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x74\x70\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x24\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x72\x61\x69\x6c\x77\x61\x79\x73\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x25\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x78\x61\x6c\x74\x2e\x63\x6f\x6d\x15\x22\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x6e\x74\x2d\x72\x70\x73\x2d\x65\x6d\x70\x6c\x6f\x79\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x26\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8f\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x73\x74\x61\x67\x69\x6e\x67\x2d\x73\x74\x73\x73\x65\x72\x76\x69\x63\x65\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x27\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x77\x72\x2e\x63\x73\x72\x65\x64\x68\x61\x77\x6b\x73\x2e\x6f\x72\x67\x15\xb9\x70\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x10\x74\x65\x61\x63\x68\x2e\x61\x6c\x62\x69\x6f\x6e\x2e\x65\x64\x75\x15\x8a\x0b\x7c\x93\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4b\x0a\x16\x73\x74\x72\x65\x61\x6d\x69\x6e\x67\x2e\x77\x6b\x61\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x11\xe8\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x73\x6d\x63\x2e\x63\x6f\x6d\x2e\x73\x61\x15\xd3\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x32\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd2\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x34\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd5\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x33\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd4\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x36\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd7\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x35\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd6\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x38\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd9\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x37\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd8\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x61\x66\x31\x30\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xdb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x39\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xda\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x73\x35\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xed\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5c\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x48\x0a\x13\x73\x61\x62\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x08\x0a\x55\x0a\x20\x65\x64\x75\x63\x61\x74\x69\x6f\x6e\x2d\x73\x74\x61\x67\x69\x6e\x67\x31\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5b\x10\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x73\x36\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x37\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xef\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x63\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x6c\x6c\x69\x73\x6f\x66\x74\x67\x72\x6f\x75\x70\x2e\x63\x6f\x6d\x15\x62\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x67\x61\x6c\x61\x78\x79\x2e\x70\x68\x79\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xa4\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfb\x03\x0a\x40\x0a\x0b\x71\x2e\x6f\x77\x6f\x2e\x61\x63\x2e\x63\x6e\x15\x5a\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\xd4\x03\x28\x80\xf3\x01\x0a\x48\x0a\x13\x76\x62\x2d\x6f\x74\x2d\x74\x73\x74\x2d\x61\x6d\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x5f\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6c\x61\x62\x65\x6c\x2e\x6d\x62\x6e\x69\x2e\x6f\x72\x67\x15\x2c\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x48\x0a\x13\x72\x61\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x40\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x80\x02\x0a\x48\x0a\x13\x72\x61\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x73\x75\x70\x65\x72\x73\x73\x6c\x2e\x69\x6e\x66\x6f\x15\xc5\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x73\x61\x6c\x61\x64\x6d\x6f\x6e\x65\x79\x2e\x63\x6f\x2e\x75\x6b\x15\xbe\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x63\x63\x2d\x74\x61\x62\x6c\x65\x61\x75\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\xc0\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x6f\x72\x65\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x73\x65\x6c\x66\x73\x65\x72\x76\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\xc6\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x67\x69\x73\x2e\x70\x70\x69\x2e\x63\x6f\x6f\x70\x15\xc7\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8e\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x32\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xf2\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x61\x64\x72\x69\x61\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x28\xa1\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x9a\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x61\x6c\x70\x68\x61\x2e\x70\x72\x65\x76\x6f\x2e\x6e\x65\x74\x15\x99\x24\x40\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x82\x01\x0a\x54\x0a\x1f\x73\x75\x70\x65\x72\x6d\x6f\x6e\x2d\x30\x31\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x73\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x1c\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xa0\x8a\x01\x0a\x48\x0a\x13\x63\x6c\x6f\x75\x64\x2e\x61\x7a\x6f\x6e\x63\x6f\x6c\x6f\x72\x2e\x63\x6f\x6d\x15\xfe\xbd\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd1\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8e\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8c\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x61\x75\x74\x6f\x6b\x6e\x6f\x77\x6c\x65\x64\x67\x65\x2e\x6e\x65\x74\x15\x8d\xbd\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x70\x72\x74\x67\x2e\x73\x74\x6f\x65\x74\x65\x72\x61\x75\x2e\x75\x73\x15\xec\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x69\x61\x6e\x73\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x6f\x6d\x15\xe9\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x65\x73\x75\x69\x74\x65\x2e\x63\x69\x74\x79\x6f\x66\x7a\x61\x63\x68\x61\x72\x79\x2e\x6f\x72\x67\x15\xe6\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x61\x61\x73\x2e\x61\x7a\x2e\x62\x77\x61\x70\x70\x2e\x6c\x6b\x73\x63\x64\x2e\x63\x6f\x6d\x15\xe7\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x66\x6c\x65\x65\x74\x62\x72\x61\x6b\x65\x2e\x63\x6f\x6d\x15\x10\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfe\x03\x0a\x51\x0a\x1c\x64\x61\x74\x61\x73\x65\x74\x63\x61\x74\x61\x6c\x6f\x67\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2d\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x61\x6e\x64\x65\x76\x6c\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x63\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x70\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x80\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x88\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3d\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x62\x6f\x61\x72\x64\x72\x65\x61\x64\x65\x72\x2e\x63\x6f\x6d\x15\xa8\xda\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf8\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3e\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x41\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x40\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x43\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x42\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x70\x61\x72\x65\x6e\x74\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xe9\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x70\x61\x70\x65\x72\x63\x75\x74\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xe8\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x62\x6f\x6d\x67\x61\x72\x2e\x6d\x69\x64\x6c\x61\x6e\x64\x70\x73\x2e\x6f\x72\x67\x15\x2a\x0d\x36\x8e\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6d\x79\x67\x69\x6e\x75\x74\x72\x69\x74\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\xce\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\x8b\x01\x0a\x47\x0a\x12\x74\x63\x77\x73\x73\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\xed\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x79\x73\x74\x65\x6d\x2e\x73\x6b\x6f\x75\x67\x72\x75\x70\x70\x65\x6e\x2e\x64\x6b\x15\xea\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x73\x74\x72\x61\x74\x66\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6f\x2e\x75\x6b\x15\xee\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x63\x68\x61\x74\x2d\x74\x65\x73\x74\x69\x6e\x67\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x66\x77\x2d\x64\x65\x6e\x74\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x54\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x80\x02\x0a\x4c\x0a\x17\x66\x77\x2d\x64\x65\x6e\x74\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\x9a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\x82\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x77\x65\x62\x36\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xab\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x70\x6f\x6b\x65\x72\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x7a\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x6e\x65\x69\x6c\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x78\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa9\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x61\x74\x65\x72\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x1a\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xa0\x04\x0a\x4b\x0a\x16\x73\x74\x75\x64\x65\x6e\x74\x73\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x14\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xa0\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x70\x72\x65\x70\x72\x6f\x64\x2d\x63\x68\x6f\x2e\x6f\x72\x67\x15\x7c\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x67\x72\x61\x79\x6c\x6f\x67\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x16\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xa0\x04\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1a\x08\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x61\x70\x69\x74\x65\x73\x74\x2e\x64\x65\x6d\x6f\x2e\x79\x6f\x74\x74\x61\x62\x79\x74\x65\x2e\x63\x6f\x6d\x15\xe7\x36\x6f\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x57\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x70\x6c\x73\x2e\x6d\x69\x6a\x6e\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x0e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x64\x65\x61\x72\x62\x6f\x72\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x2c\x5e\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x73\x74\x61\x67\x69\x6e\x67\x2e\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\x30\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x73\x74\x61\x67\x69\x6e\x67\x2e\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x15\x31\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x65\x69\x7a\x65\x74\x68\x65\x61\x77\x6b\x77\x61\x72\x64\x2e\x6f\x72\x67\x15\x2f\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x15\x2d\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x64\x63\x6f\x75\x6e\x63\x69\x6c\x2e\x6f\x72\x67\x15\x2a\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x15\x2b\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x76\x62\x69\x73\x64\x2e\x6f\x72\x67\x15\xde\x3a\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x03\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xec\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0e\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x86\x04\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0f\x47\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x86\x04\x0a\x49\x0a\x14\x73\x74\x61\x6d\x6b\x61\x61\x72\x74\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd6\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x6e\x76\x6d\x6f\x6e\x6c\x69\x6e\x65\x62\x69\x65\x64\x65\x6e\x2e\x61\x63\x63\x2e\x6e\x76\x6d\x2e\x6e\x6c\x15\xd7\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x77\x77\x77\x2e\x71\x61\x31\x2e\x69\x6f\x15\xda\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x62\x6f\x72\x67\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x44\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x81\x04\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x68\x65\x61\x64\x31\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x45\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x80\x03\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc5\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x67\x6f\x76\x15\xe0\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x75\x61\x73\x61\x70\x69\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd8\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\xb8\xb0\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x79\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\x7c\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x86\x04\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\x8e\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xfc\x01\x0a\x49\x0a\x14\x73\x74\x61\x67\x65\x32\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x63\x6f\x2e\x6a\x70\x15\x84\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x73\x77\x6d\x69\x74\x65\x63\x68\x2e\x6f\x72\x67\x15\x9c\x20\x3a\x45\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x64\x62\x61\x63\x69\x2e\x69\x71\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x72\x65\x64\x63\x61\x70\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\xfc\xfd\x07\x0a\x4f\x0a\x1a\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x74\x65\x63\x68\x63\x75\x2e\x63\x6f\x6d\x15\x6c\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x65\x62\x61\x70\x70\x73\x2e\x6d\x69\x73\x73\x6f\x75\x6c\x61\x63\x6f\x75\x6e\x74\x79\x2e\x75\x73\x15\x6d\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x70\x6f\x72\x74\x61\x6c\x2e\x6a\x62\x73\x6d\x61\x63\x2e\x69\x6e\x66\x6f\x15\x6b\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x74\x72\x69\x61\x6c\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x64\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x61\x73\x75\x70\x72\x65\x6d\x65\x2e\x75\x73\x15\x65\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x74\x63\x61\x70\x73\x2e\x6e\x65\x74\x15\x95\x24\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd1\x07\x28\x80\xfe\x03\x0a\x4a\x0a\x15\x61\x6e\x73\x69\x62\x6c\x65\x2e\x65\x6e\x67\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xe7\x2a\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x70\x73\x63\x6f\x6e\x66\x69\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x69\xec\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x73\x72\x73\x76\x2e\x6f\x70\x65\x6e\x73\x63\x69\x65\x6e\x63\x65\x67\x72\x69\x64\x2e\x6f\x72\x67\x15\x6b\xec\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe4\x01\x0a\x45\x0a\x10\x62\x73\x73\x62\x70\x70\x72\x64\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x1d\x16\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x61\x71\x75\x69\x6e\x61\x73\x2e\x65\x64\x75\x15\xa2\x0d\x5c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x65\x63\x75\x72\x65\x2e\x6d\x6f\x6e\x72\x6f\x65\x6d\x69\x2e\x6f\x72\x67\x15\x10\x7a\xe3\x32\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x73\x2e\x61\x73\x68\x6c\x65\x79\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x06\x7a\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x84\x08\x0a\x4d\x0a\x18\x61\x70\x70\x62\x61\x73\x65\x2d\x73\x74\x61\x67\x65\x2e\x77\x74\x69\x2e\x67\x6c\x6f\x62\x61\x6c\x15\x4f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\x47\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x73\x73\x2e\x6e\x68\x63\x67\x6f\x76\x2e\x63\x6f\x6d\x15\x46\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x63\x68\x61\x72\x6d\x6d\x2d\x64\x65\x76\x2e\x6f\x72\x67\x15\x09\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x68\x66\x61\x63\x69\x6c\x69\x74\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\x11\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x24\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x70\x61\x2d\x76\x70\x6e\x2d\x31\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0d\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xfc\xff\x0f\x0a\x3f\x0a\x0a\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0c\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\xfc\xff\x0f\x0a\x44\x0a\x0f\x6d\x75\x73\x69\x63\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x20\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\x82\x08\x0a\x4d\x0a\x18\x63\x72\x73\x63\x6f\x6e\x63\x6f\x72\x65\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x5d\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x6c\x6f\x67\x69\x73\x74\x69\x63\x73\x6f\x6e\x6c\x69\x6e\x65\x2e\x63\x6f\x6d\x15\xc2\x22\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x72\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x68\x65\x63\x6b\x69\x6e\x74\x6f\x63\x61\x73\x68\x2e\x63\x6f\x6d\x15\x3c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x62\x72\x72\x69\x63\x65\x2e\x65\x64\x75\x15\x76\xd8\x5c\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x42\x4d\x48\x56\x49\x44\x59\x4f\x52\x4f\x55\x54\x45\x52\x32\x2e\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\xfe\x8d\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x72\x65\x64\x63\x61\x70\x2e\x72\x61\x69\x6e\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\x86\x57\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfb\x03\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\x92\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\xa0\xfd\x01\x0a\x4d\x0a\x18\x75\x6b\x70\x65\x6e\x73\x69\x6f\x6e\x73\x2e\x75\x6e\x69\x70\x65\x72\x2e\x65\x6e\x65\x72\x67\x79\x15\x19\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x64\x72\x61\x78\x2e\x6d\x79\x65\x73\x70\x73\x2e\x63\x6f\x2e\x75\x6b\x15\x18\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x79\x2d\x61\x6d\x65\x79\x2d\x6f\x73\x2d\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x15\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x68\x61\x74\x70\x72\x6f\x78\x79\x2e\x63\x68\x61\x74\x62\x6f\x74\x2e\x76\x67\x7a\x2e\x6e\x6c\x15\x14\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x6f\x6d\x6d\x73\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x17\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x79\x2d\x6d\x61\x67\x6e\x6f\x78\x2d\x70\x65\x6e\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x16\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x2e\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x63\x6f\x6d\x6d\x74\x65\x73\x74\x2e\x64\x69\x61\x6c\x6f\x67\x69\x78\x2e\x63\x6f\x6d\x15\x1d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x72\x72\x61\x6e\x74\x65\x2e\x65\x75\x15\x1c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x6d\x69\x77\x6d\x70\x2e\x63\x6f\x6d\x15\x29\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x6c\x69\x66\x65\x67\x6f\x61\x6c\x73\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2f\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x6c\x69\x66\x65\x67\x6f\x61\x6c\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x68\x72\x69\x74\x6e\x2e\x69\x74\x6f\x65\x6e\x2e\x63\x6f\x2e\x6a\x70\x15\xd0\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x61\x66\x31\x2e\x6b\x72\x61\x75\x7a\x6f\x2e\x70\x6c\x15\xd1\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x6d\x32\x2e\x73\x74\x72\x61\x74\x79\x78\x69\x74\x2e\x63\x6f\x6d\x15\xce\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x6d\x31\x2e\x73\x74\x72\x61\x74\x79\x78\x69\x74\x2e\x63\x6f\x6d\x15\xcc\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x6d\x68\x64\x64\x65\x6d\x6f\x2e\x63\x6f\x6d\x15\xcb\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd3\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x73\x70\x6d\x73\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x78\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x63\x6a\x61\x73\x2e\x6f\x72\x67\x15\xe7\x21\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x14\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x45\x0a\x10\x6d\x6f\x6e\x72\x6f\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x37\xb2\xbe\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\xe6\xf3\x03\x0a\x43\x0a\x0e\x71\x61\x2e\x74\x65\x6c\x65\x72\x6f\x70\x2e\x63\x6f\x6d\x15\xd5\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x74\x65\x6c\x65\x72\x6f\x70\x2e\x63\x6f\x6d\x15\xd4\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x69\x6e\x74\x65\x67\x72\x69\x74\x79\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x70\x6c\x15\x40\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x72\x61\x79\x61\x66\x69\x6e\x61\x6e\x63\x69\x6e\x67\x2e\x63\x6f\x6d\x15\x3e\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x77\x70\x72\x6f\x64\x75\x63\x74\x73\x2e\x63\x6f\x6d\x15\x3c\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x62\x61\x72\x72\x61\x63\x75\x64\x61\x63\x65\x6e\x74\x72\x61\x6c\x2e\x62\x61\x63\x6b\x6f\x66\x68\x65\x61\x64\x62\x6f\x6f\x6b\x2e\x63\x6f\x6d\x15\x3d\xb3\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x70\x03\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x74\x65\x73\x74\x63\x6f\x72\x65\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x9f\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x6d\x61\x69\x6c\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x2c\xce\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x50\x0a\x1b\x70\x6f\x72\x74\x61\x6c\x2e\x61\x6e\x64\x65\x72\x74\x6f\x6e\x63\x61\x73\x74\x69\x6e\x67\x73\x2e\x63\x6f\x6d\x15\x86\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x12\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x65\x65\x69\x73\x64\x2e\x6f\x72\x67\x15\x05\x36\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4b\x0a\x16\x61\x6c\x65\x72\x74\x75\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x88\x10\x0a\x52\x0a\x1d\x67\x61\x6c\x6c\x65\x72\x79\x2d\x74\x6f\x6f\x6c\x2d\x64\x65\x76\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x77\x71\x61\x2e\x6e\x65\x74\x15\xc8\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xcf\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xce\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x73\x74\x61\x67\x69\x6e\x67\x2d\x75\x6e\x69\x70\x65\x72\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xcc\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x79\x2e\x64\x65\x70\x6f\x74\x64\x72\x75\x67\x2e\x63\x6f\x6d\x15\xd1\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x6f\x6f\x64\x6c\x65\x2e\x32\x32\x69\x74\x72\x69\x67\x2e\x6f\x72\x67\x15\x72\x71\x31\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x6d\x65\x64\x2e\x62\x6c\x75\x65\x2e\x79\x62\x72\x63\x2e\x61\x72\x63\x2d\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xec\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xe3\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x63\x6f\x6c\x6f\x64\x65\x74\x72\x6f\x69\x74\x2e\x63\x6f\x6d\x15\x1d\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x8b\x01\x0a\x52\x0a\x1d\x61\x69\x2d\x64\x61\x74\x61\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdb\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x70\x73\x2e\x6f\x67\x69\x73\x2d\x72\x69\x2e\x6a\x70\x15\x76\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x65\x7a\x70\x61\x73\x73\x76\x61\x2e\x63\x6f\x6d\x15\x74\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x68\x6f\x6c\x6c\x61\x6e\x64\x63\x68\x72\x69\x73\x74\x69\x61\x6e\x2e\x6f\x72\x67\x15\xb5\x23\xe4\x88\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x73\x6f\x70\x68\x65\x6f\x6e\x2e\x6e\x65\x74\x15\x72\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x68\x6f\x6f\x76\x65\x72\x70\x72\x65\x73\x65\x72\x76\x65\x2e\x63\x6f\x6d\x15\x70\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x61\x63\x63\x2d\x6b\x6c\x61\x6e\x74\x65\x6e\x2e\x6f\x6c\x79\x6d\x70\x69\x61\x2e\x6e\x6c\x15\x6f\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x73\x6f\x70\x68\x65\x6f\x6e\x65\x75\x2e\x6e\x65\x74\x15\x6e\x32\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0d\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xa0\x04\x0a\x4c\x0a\x17\x63\x70\x73\x63\x61\x64\x6d\x69\x6e\x2e\x63\x73\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x11\xc3\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xa0\x04\x0a\x4e\x0a\x19\x61\x70\x70\x6c\x79\x2e\x73\x65\x6e\x74\x65\x63\x68\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x63\x6f\x6d\x15\xc6\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\xc0\x87\x01\x0a\x42\x0a\x0d\x62\x61\x66\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x63\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x6d\x61\x69\x6c\x2e\x6d\x63\x6d\x69\x6c\x6c\x61\x6e\x2d\x6d\x63\x67\x65\x65\x2e\x63\x6f\x6d\x15\x75\xb1\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x33\x30\x31\x2e\x61\x64\x63\x6f\x75\x6e\x63\x69\x6c\x2e\x6f\x72\x67\x15\x37\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x74\x61\x67\x69\x6e\x67\x2e\x63\x75\x64\x61\x6f\x70\x73\x2e\x63\x6f\x6d\x15\x5e\x96\xeb\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x15\x33\xb2\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x77\x61\x73\x68\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x6c\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x70\x73\x2e\x79\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x75\x73\x15\x6d\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x70\x73\x2e\x64\x65\x78\x74\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x6a\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x70\x73\x2e\x77\x61\x76\x65\x77\x61\x73\x68\x74\x65\x6e\x61\x77\x2e\x6f\x72\x67\x15\x68\xd5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0a\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x62\x6f\x72\x67\x2d\x68\x65\x61\x64\x32\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x46\xc2\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x80\x03\x0a\x4e\x0a\x19\x76\x64\x69\x2d\x61\x2d\x63\x73\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x04\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x33\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4c\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd6\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x73\x63\x69\x63\x2e\x63\x6f\x6d\x15\xe1\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x74\x61\x67\x69\x6e\x67\x2d\x65\x6e\x77\x2e\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\xe2\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x06\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\xa0\xfd\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x64\x65\x62\x74\x68\x61\x63\x6b\x65\x72\x2e\x63\x6f\x2e\x75\x6b\x15\xdd\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x6d\x68\x64\x73\x6f\x6e\x61\x72\x71\x75\x62\x65\x2e\x6d\x79\x68\x65\x61\x6c\x74\x68\x64\x69\x72\x65\x63\x74\x2e\x63\x6f\x6d\x15\xdf\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x62\x6e\x73\x73\x62\x30\x34\x2e\x64\x61\x76\x65\x6e\x70\x6f\x72\x74\x2e\x65\x64\x75\x15\x4d\xc6\xca\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x41\x0a\x0c\x6d\x72\x61\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3a\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x47\x0a\x12\x6e\x6f\x74\x69\x66\x79\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xb2\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xbe\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x6c\x6f\x63\x61\x74\x69\x6f\x6e\x73\x2e\x63\x6f\x6d\x70\x6c\x65\x74\x65\x62\x61\x74\x74\x65\x72\x79\x73\x6f\x75\x72\x63\x65\x2e\x63\x6f\x6d\x15\x59\x20\x0b\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x61\x70\x69\x32\x2e\x67\x74\x76\x2e\x63\x6f\x6d\x2e\x70\x6c\x15\xb2\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x69\x6c\x61\x6e\x69\x72\x65\x73\x6f\x72\x74\x2e\x63\x6f\x6d\x15\xad\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x74\x72\x61\x6e\x73\x70\x6f\x72\x74\x61\x74\x69\x6f\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xac\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x6d\x65\x64\x69\x61\x67\x2e\x63\x6f\x6d\x15\xc8\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x70\x72\x6f\x6d\x6f\x74\x69\x6f\x6e\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x2e\x63\x6f\x6d\x15\xaa\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x67\x6f\x6c\x66\x63\x6c\x75\x62\x2e\x63\x6f\x6d\x15\xaf\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x6e\x65\x77\x73\x72\x6f\x6f\x6d\x2e\x6d\x6f\x68\x65\x67\x61\x6e\x73\x75\x6e\x70\x6f\x63\x6f\x6e\x6f\x2e\x63\x6f\x6d\x15\xae\xb1\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x67\x61\x74\x65\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x0b\xe6\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x67\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xd5\xb1\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x62\x72\x6f\x6e\x73\x6f\x6e\x68\x67\x2e\x6f\x72\x67\x15\x14\x8c\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfe\x07\x0a\x49\x0a\x14\x70\x73\x2e\x66\x75\x6c\x74\x6f\x6e\x70\x69\x72\x61\x74\x65\x73\x2e\x6e\x65\x74\x15\x44\x79\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x54\x0a\x1f\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x66\x6f\x77\x6c\x65\x72\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x32\xa2\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x63\x70\x61\x6e\x65\x6c\x2e\x64\x72\x6f\x70\x2e\x74\x69\x6d\x62\x65\x72\x63\x72\x65\x65\x6b\x2e\x63\x6f\x6d\x15\xd0\xb0\x03\x4a\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x61\x70\x65\x78\x2e\x68\x65\x61\x6c\x74\x68\x74\x72\x75\x73\x74\x65\x75\x72\x6f\x70\x65\x2e\x63\x6f\x6d\x15\x20\x39\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x15\x73\x65\x63\x75\x72\x65\x2e\x6f\x6e\x73\x70\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xd0\x07\x28\x80\xa6\x80\x01\x0a\x4f\x0a\x1a\x62\x61\x6d\x2d\x63\x6f\x6f\x6c\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xfe\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x70\x61\x6e\x65\x6c\x2e\x64\x65\x6d\x6f\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x8a\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x64\x65\x76\x15\x8b\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x61\x6c\x76\x69\x6e\x2e\x65\x64\x75\x15\x0b\xa9\x6a\x99\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\xfc\xff\x0f\x0a\x4b\x0a\x16\x74\x6c\x65\x73\x63\x6f\x72\x65\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x82\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x83\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x64\x69\x73\x6b\x2e\x6d\x6f\x74\x6f\x72\x63\x69\x74\x79\x63\x61\x6e\x65\x63\x6f\x72\x73\x6f\x2e\x63\x6f\x6d\x15\x84\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x61\x64\x76\x61\x6e\x63\x65\x74\x68\x65\x73\x63\x65\x6e\x65\x2e\x63\x6f\x6d\x15\x85\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x87\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x66\x6c\x6f\x77\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x88\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x6e\x6f\x72\x67\x2e\x6e\x65\x74\x77\x61\x74\x65\x72\x2e\x63\x6f\x6d\x15\x89\xb9\x10\xc7\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x50\x0a\x1b\x69\x73\x75\x74\x61\x70\x70\x30\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa3\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x0f\x0a\x4d\x0a\x18\x78\x65\x6e\x61\x70\x70\x2d\x73\x66\x30\x32\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x2e\x6d\x61\x6e\x61\x67\x65\x64\x77\x61\x79\x2e\x63\x6f\x6d\x15\x15\xb1\xe1\xad\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x71\x61\x2e\x72\x65\x67\x69\x73\x74\x72\x79\x61\x70\x70\x73\x2e\x6e\x65\x74\x15\x5f\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6f\x6d\x73\x73\x74\x2e\x73\x68\x69\x73\x65\x69\x64\x6f\x75\x73\x61\x2e\x63\x6f\x6d\x15\x60\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x61\x73\x70\x63\x2e\x63\x6f\x2e\x75\x6b\x15\x5a\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x60\x0a\x2b\x6d\x73\x2d\x69\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x2d\x76\x61\x6c\x2e\x68\x65\x61\x6c\x74\x68\x73\x61\x66\x65\x74\x79\x69\x6e\x73\x74\x69\x74\x75\x74\x65\x2e\x63\x6f\x6d\x15\x5c\x3b\x71\x40\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x65\x64\x74\x65\x65\x6e\x2e\x63\x74\x73\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x12\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x10\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0d\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\xa0\xfd\x01\x0a\x48\x0a\x13\x66\x77\x2d\x61\x74\x73\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0c\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\xa0\xfd\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x6c\x6f\x63\x6b\x67\x65\x6e\x65\x73\x69\x73\x38\x2e\x63\x6f\x6d\x15\x0c\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x72\x70\x6d\x69\x2e\x63\x6f\x2e\x75\x6b\x15\x0d\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6e\x61\x74\x61\x73\x63\x69\x61\x2e\x63\x6f\x2e\x75\x6b\x15\x0e\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x69\x74\x77\x61\x72\x64\x65\x6e\x2e\x73\x74\x65\x72\x65\x6f\x69\x74\x2e\x64\x65\x15\x10\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x6f\x6e\x62\x6f\x61\x72\x64\x69\x6e\x67\x2e\x72\x70\x6d\x69\x72\x61\x69\x6c\x70\x65\x6e\x2e\x63\x6f\x2e\x75\x6b\x15\x11\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x63\x6c\x6f\x75\x64\x2e\x6b\x61\x73\x73\x65\x6d\x6d\x65\x6c\x2e\x63\x6f\x6d\x15\x12\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6a\x65\x6c\x6c\x79\x66\x69\x6e\x2e\x6b\x61\x73\x73\x65\x6d\x6d\x65\x6c\x2e\x63\x6f\x6d\x15\x13\xb2\xc1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x70\x72\x74\x67\x2e\x68\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2d\x56\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x82\x04\x0a\x43\x0a\x0e\x73\x72\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x64\x65\x76\x2e\x63\x65\x6c\x74\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x45\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x69\x6b\x69\x2e\x68\x70\x63\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x0c\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x69\x73\x64\x62\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf3\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x63\x61\x73\x68\x6e\x65\x74\x72\x64\x69\x72\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcf\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x61\x62\x72\x61\x6d\x73\x70\x6c\x61\x6e\x65\x74\x61\x72\x69\x75\x6d\x2e\x6f\x72\x67\x15\xd4\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x69\x73\x70\x61\x64\x6d\x69\x6e\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x55\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x73\x68\x6f\x70\x2e\x72\x65\x63\x73\x70\x6f\x72\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x69\x73\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xb5\xa5\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x2a\x2e\x70\x72\x6f\x78\x79\x32\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd6\x03\x28\x80\xfe\x01\x0a\x4f\x0a\x1a\x61\x75\x78\x65\x6e\x74\x65\x72\x70\x72\x69\x73\x65\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1f\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xe1\x03\x28\x80\x83\x01\x0a\x47\x0a\x12\x6d\x63\x66\x73\x64\x62\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x56\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xde\x03\x28\x80\x83\x01\x0a\x50\x0a\x1b\x74\x72\x61\x76\x65\x6c\x65\x72\x73\x61\x62\x72\x6f\x61\x64\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x57\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x7a\x69\x6d\x62\x72\x61\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3b\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x6f\x73\x61\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x52\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x2a\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xd3\xa4\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x6e\x65\x69\x67\x68\x62\x6f\x72\x68\x6f\x6f\x64\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x73\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6d\x73\x30\x31\x2e\x63\x61\x73\x63\x61\x64\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcb\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x73\x70\x6f\x72\x74\x63\x61\x6d\x70\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5f\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x64\x65\x76\x2e\x61\x74\x74\x61\x77\x61\x72\x64\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x6c\x69\x73\x74\x69\x6e\x67\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x96\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x65\x62\x6d\x61\x69\x6c\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x11\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xa0\xfd\x01\x0a\x4d\x0a\x18\x6c\x63\x74\x6c\x76\x6f\x69\x63\x65\x73\x2e\x63\x6c\x65\x61\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x78\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x82\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x63\x6c\x61\x72\x69\x74\x79\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1c\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6f\x6e\x76\x69\x76\x69\x61\x6c\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3d\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x73\x69\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x87\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x80\x02\x0a\x45\x0a\x10\x63\x62\x63\x63\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x68\x65\x6c\x6d\x68\x6f\x6c\x74\x7a\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x24\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x65\x62\x35\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x74\x66\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x99\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x7d\x47\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xe0\x03\x28\x80\x83\x01\x0a\x4b\x0a\x16\x6a\x6f\x75\x72\x6e\x61\x6c\x6f\x66\x65\x78\x70\x65\x72\x74\x69\x73\x65\x2e\x6f\x72\x67\x15\x3e\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x96\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x70\x72\x6c\x6d\x61\x73\x74\x65\x72\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x4c\x0a\x17\x63\x68\x65\x63\x6b\x64\x61\x74\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xec\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xe0\x03\x28\x80\x83\x01\x0a\x43\x0a\x0e\x69\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x89\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaa\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x68\x65\x70\x2e\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x47\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa5\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x74\x6f\x72\x61\x67\x65\x2d\x61\x63\x63\x65\x73\x73\x31\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x37\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x73\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xdf\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x72\x6d\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x27\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x64\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xaf\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6d\x73\x30\x32\x2e\x63\x61\x73\x63\x61\x64\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcc\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x66\x75\x74\x6f\x6d\x61\x6b\x69\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x01\x0a\x48\x0a\x13\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x90\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6c\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x20\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x64\x69\x73\x6b\x2e\x62\x6f\x6c\x64\x65\x72\x62\x79\x64\x65\x73\x69\x67\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdf\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x2a\x2e\x70\x72\x6f\x78\x79\x31\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x02\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\xfe\x01\x0a\x46\x0a\x11\x69\x6e\x63\x6c\x75\x73\x69\x6f\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x63\x61\x6d\x70\x73\x2e\x63\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6b\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x65\x7a\x70\x72\x6f\x78\x79\x61\x75\x74\x68\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xba\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe8\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x62\x65\x61\x63\x6f\x6e\x2d\x63\x65\x6e\x74\x65\x72\x2e\x6f\x72\x67\x15\xa0\xa4\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x73\x33\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe7\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x6c\x69\x73\x74\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x62\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xdd\x03\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x71\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xdd\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe9\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x32\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe6\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x62\x65\x74\x61\x2e\x61\x64\x76\x61\x6e\x63\x65\x6d\x65\x6e\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x8c\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x73\x65\x6c\x66\x63\x68\x65\x63\x6b\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xe0\x03\x28\x80\x83\x01\x0a\x40\x0a\x0b\x73\x69\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x88\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x02\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbc\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x78\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x63\x61\x6c\x65\x6e\x64\x61\x72\x2e\x63\x68\x65\x6d\x69\x73\x74\x72\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x15\x1a\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x61\x70\x70\x73\x2e\x64\x32\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x47\x0e\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x34\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe8\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x36\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xdf\x03\x28\x80\x83\x01\x0a\x44\x0a\x0f\x73\x31\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe5\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xdf\x03\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x63\x6f\x73\x6d\x65\x74\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x43\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x64\x69\x67\x69\x74\x61\x6c\x73\x69\x67\x6e\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfb\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9d\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x61\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x73\x31\x30\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe4\x64\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x61\x63\x68\x69\x65\x76\x65\x6d\x65\x6e\x74\x73\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x59\x0e\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xdf\x03\x28\x80\x83\x01\x0a\x4c\x0a\x17\x73\x70\x61\x72\x74\x61\x6e\x70\x61\x72\x74\x6e\x65\x72\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xdf\x03\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x69\x73\x69\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfe\x03\x0a\x44\x0a\x0f\x61\x64\x6d\x69\x6e\x73\x76\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa1\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb9\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x70\x65\x6f\x70\x6c\x65\x2e\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x21\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x62\x69\x65\x72\x64\x6f\x63\x74\x6f\x72\x2e\x63\x6f\x6d\x15\x65\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x72\x65\x64\x63\x61\x70\x2e\x62\x72\x69\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\x7b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfe\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa4\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x6d\x73\x75\x61\x6c\x75\x6d\x6e\x69\x2e\x63\x6f\x6d\x15\x15\xaa\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x8c\x01\x0a\x4f\x0a\x1a\x69\x73\x6d\x67\x6d\x74\x31\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe1\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x17\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x68\x69\x73\x6f\x63\x63\x73\x2e\x63\x65\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2e\x1a\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x41\x0a\x0c\x6e\x73\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb0\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x03\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa8\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x66\x69\x72\x65\x6c\x61\x62\x2e\x6f\x72\x67\x15\x29\x82\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfe\x01\x0a\x4c\x0a\x17\x62\x72\x6f\x61\x64\x63\x61\x73\x74\x2e\x61\x6c\x65\x72\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x57\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x40\x0a\x0b\x61\x66\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x65\x02\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x74\x65\x63\x68\x73\x74\x6f\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x10\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8c\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0e\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x73\x63\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x13\xb3\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xfe\x07\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x95\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x70\x73\x79\x63\x68\x6f\x6c\x6f\x67\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\xd0\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x6e\x65\x74\x66\x69\x6c\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x54\x02\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\x91\x03\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6d\x65\x64\x69\x61\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x76\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x63\x74\x71\x61\x2e\x63\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x50\x0a\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x6d\x73\x75\x70\x68\x79\x73\x69\x63\x73\x63\x6c\x75\x62\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xd6\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x83\x91\x03\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf6\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x63\x6f\x64\x65\x70\x72\x6f\x64\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x08\x0b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd9\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x85\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x65\x6c\x6f\x67\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4e\x23\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf5\x01\x0a\x4f\x0a\x1a\x6f\x66\x66\x69\x63\x65\x77\x65\x62\x61\x70\x70\x73\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x32\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xca\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9f\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x66\x72\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x25\x20\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9b\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x6d\x61\x69\x6c\x2e\x61\x73\x65\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\xca\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x80\x08\x0a\x48\x0a\x13\x77\x65\x62\x73\x76\x63\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x07\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf5\x03\x0a\x4c\x0a\x17\x74\x6f\x6e\x65\x70\x65\x72\x66\x65\x63\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x44\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x67\x69\x74\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xcb\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x48\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6a\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x73\x74\x75\x64\x65\x6e\x74\x6a\x6f\x62\x73\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x27\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf5\x03\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd7\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6c\x6f\x6e\x2d\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xe2\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x87\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x73\x75\x66\x61\x6d\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\xd1\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf5\x01\x0a\x45\x0a\x10\x70\x62\x64\x62\x2e\x62\x63\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc0\x98\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x73\x75\x66\x61\x6d\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\xd1\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x63\x73\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x67\x14\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x98\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x71\x61\x2e\x63\x73\x74\x6f\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x8c\x01\x0a\x45\x0a\x10\x6d\x61\x69\x6c\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x25\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x81\x04\x0a\x47\x0a\x12\x65\x76\x65\x6e\x74\x73\x2e\x6c\x6f\x6e\x63\x61\x70\x61\x2e\x6f\x72\x67\x15\xe3\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x41\x0a\x0c\x6f\x70\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\xcf\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x56\x0a\x21\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x1a\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\x81\x04\x0a\x52\x0a\x1d\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x1b\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x57\x0a\x22\x6d\x6f\x6c\x65\x63\x75\x6c\x61\x72\x62\x69\x6f\x70\x68\x79\x73\x69\x63\x73\x2e\x6e\x61\x74\x73\x63\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x14\xe6\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd3\x07\x28\x80\xfe\x03\x0a\x55\x0a\x20\x77\x77\x77\x2e\x73\x69\x73\x64\x2d\x6d\x63\x73\x62\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x19\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x0a\x4a\x0a\x15\x2a\x2e\x31\x2e\x6f\x63\x61\x2e\x6e\x66\x6c\x78\x76\x69\x64\x65\x6f\x2e\x6e\x65\x74\x15\x02\x32\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x88\x40\x0a\x50\x0a\x1b\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x18\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x4e\x0a\x19\x61\x66\x72\x69\x63\x61\x2d\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\x04\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x89\x40\x0a\x47\x0a\x12\x73\x74\x74\x2e\x6e\x61\x74\x73\x63\x69\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1b\xe6\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xfe\x03\x0a\x45\x0a\x10\x63\x69\x72\x72\x75\x73\x2e\x68\x2d\x6e\x65\x74\x2e\x6f\x72\x67\x15\x15\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x89\x40\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x63\x68\x65\x6d\x69\x73\x74\x72\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xeb\x1b\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x98\x8a\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa0\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x32\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x16\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x81\x04\x0a\x40\x0a\x0b\x76\x70\x6e\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x53\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\xe8\x81\x01\x0a\x4f\x0a\x1a\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x70\x6f\x6c\x69\x63\x79\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x15\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x81\x04\x0a\x49\x0a\x14\x72\x65\x70\x6f\x73\x2e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfc\x90\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc6\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa9\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x31\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xc9\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\x8f\x03\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x2a\x2e\x75\x72\x62\x61\x6e\x6c\x61\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x67\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbf\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x32\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2a\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\x92\x03\x28\x80\xe3\x01\x0a\x49\x0a\x14\x71\x75\x69\x74\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x8e\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2d\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x0a\x47\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x33\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x15\x2b\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xe3\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb1\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x70\x73\x2e\x73\x72\x65\x73\x64\x2e\x6f\x72\x67\x15\x97\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x76\x69\x70\x65\x72\x64\x62\x2e\x6f\x72\x67\x15\xdb\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x73\x75\x70\x70\x6f\x72\x74\x2e\x6e\x6f\x72\x74\x68\x76\x69\x6c\x6c\x65\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x55\xc6\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x6d\x61\x63\x79\x74\x63\x62\x64\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc5\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf5\x01\x0a\x49\x0a\x14\x6d\x73\x65\x74\x75\x70\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\x98\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x2a\x2e\x67\x72\x69\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x16\x88\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc1\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb4\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xb7\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x77\x73\x74\x61\x74\x73\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x29\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xfc\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x76\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x2a\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xd9\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x6d\x69\x2d\x6d\x61\x70\x64\x61\x74\x61\x2e\x6e\x65\x74\x15\xaf\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x63\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x01\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x70\x73\x2e\x6c\x61\x69\x6e\x67\x73\x62\x75\x72\x67\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9a\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x90\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xc2\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x57\x46\x54\x53\x30\x2e\x77\x6d\x75\x70\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\x15\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbd\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x72\x65\x67\x69\x73\x74\x65\x72\x2e\x72\x65\x73\x6e\x65\x74\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x73\x0b\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6c\x69\x62\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x22\x2c\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xd0\x07\x28\xc0\x8a\x01\x0a\x52\x0a\x1d\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x71\x61\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x2a\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x28\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\xc0\x8a\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x06\x0c\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb9\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x76\x70\x6e\x2e\x65\x67\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xec\x24\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\xe8\x81\x01\x0a\x4c\x0a\x17\x2a\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbc\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x11\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x95\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x6f\x65\x75\x73\x72\x65\x70\x6f\x72\x74\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x23\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x88\x10\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x20\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x6c\x69\x74\x65\x72\x61\x72\x79\x77\x6f\x72\x6c\x64\x73\x2e\x63\x6f\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x79\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x2e\x62\x79\x72\x6f\x6e\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x98\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x82\x08\x0a\x40\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x4b\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x61\x75\x74\x68\x2d\x69\x6e\x74\x65\x72\x73\x74\x69\x74\x69\x61\x6c\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x99\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x68\x6f\x6d\x65\x70\x61\x67\x65\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4e\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x67\x65\x6e\x65\x74\x69\x63\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4a\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x53\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x76\x72\x61\x63\x6b\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb3\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x73\x73\x74\x69\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x30\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xcb\x05\x28\x80\xfc\x01\x0a\x48\x0a\x13\x70\x73\x2e\x64\x75\x72\x61\x6e\x64\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x99\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x52\x0a\x1d\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x71\x61\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf5\x01\x0a\x47\x0a\x12\x70\x73\x2e\x70\x65\x72\x72\x79\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9e\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x53\x0a\x1e\x6d\x6c\x65\x61\x72\x6e\x69\x6e\x67\x72\x65\x70\x6f\x72\x74\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x08\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb6\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xd0\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xba\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xf0\x01\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x6c\x69\x73\x37\x34\x34\x30\x2e\x73\x6c\x69\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x15\x61\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\xf0\x81\x01\x0a\x49\x0a\x14\x2a\x2e\x73\x65\x63\x75\x72\x69\x74\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x21\x02\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\xf3\x01\x0a\x58\x0a\x23\x77\x77\x77\x2e\x72\x65\x73\x65\x61\x72\x63\x68\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x6f\x76\x70\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x0f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd8\x03\x28\x80\x88\x10\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x84\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xab\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x68\x64\x72\x66\x2d\x64\x74\x66\x2e\x6f\x72\x67\x15\x4f\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfb\x03\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb8\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xf0\x01\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xc8\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf8\x01\x0a\x47\x0a\x12\x2a\x2e\x63\x63\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x96\x08\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x63\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x96\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xd0\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x2a\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x65\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x77\x65\x73\x74\x68\x69\x6c\x6c\x73\x61\x74\x68\x6c\x65\x74\x69\x63\x2e\x63\x6f\x6d\x15\x56\x01\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf5\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9c\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x2a\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x85\x0d\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\xd5\x03\x28\x80\x86\x04\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xce\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x73\x69\x62\x6b\x6f\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc6\x89\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x67\x61\x67\x65\x6d\x65\x6e\x74\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x48\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x2a\x2e\x63\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x8f\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf5\x01\x0a\x48\x0a\x13\x61\x63\x63\x65\x73\x73\x2e\x61\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xf0\x01\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x70\x73\x2e\x6f\x77\x6f\x73\x73\x6f\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x95\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x68\x74\x74\x70\x2d\x67\x61\x74\x65\x30\x32\x2e\x67\x72\x69\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x2b\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\xf4\x01\x0a\x49\x0a\x14\x70\x73\x2e\x6d\x6f\x72\x72\x69\x63\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9c\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x08\x0a\x49\x0a\x14\x70\x73\x2e\x63\x6f\x72\x75\x6e\x6e\x61\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x68\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x03\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x6a\x69\x68\x63\x76\x2e\x6f\x72\x67\x15\x2e\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfb\x03\x0a\x4a\x0a\x15\x2a\x2e\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x78\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x33\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xcb\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf8\x01\x0a\x44\x0a\x0f\x6c\x6f\x67\x69\x6e\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x9b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x2a\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb7\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xf5\x01\x0a\x4b\x0a\x16\x70\x72\x69\x74\x7a\x6b\x65\x72\x6e\x65\x75\x72\x6f\x70\x73\x79\x63\x68\x2e\x6f\x72\x67\x15\x4d\xba\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xd6\x05\x28\x80\xfb\x03\x0a\x47\x0a\x12\x63\x75\x63\x66\x6c\x31\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xe7\x02\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x63\x6c\x65\x61\x72\x70\x61\x73\x73\x30\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\xca\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf8\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xb9\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xdf\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x70\x73\x2e\x73\x68\x65\x70\x68\x65\x72\x64\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x67\x59\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x01\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x63\x6f\x65\x75\x73\x77\x65\x62\x74\x65\x73\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x2b\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x86\x04\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x52\x04\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xad\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x6a\x2e\x69\x74\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x42\x42\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x06\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x90\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xe0\x03\x28\x80\x82\x01\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x73\x77\x61\x72\x74\x7a\x63\x72\x65\x65\x6b\x2e\x6f\x72\x67\x15\x0e\x1f\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x86\x04\x0a\x47\x0a\x12\x63\x75\x63\x66\x6c\x32\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xc8\x05\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x01\x0c\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xae\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x6c\x73\x61\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x4c\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x67\x72\x6f\x75\x70\x65\x72\x64\x65\x6d\x6f\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x18\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xbe\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x02\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x06\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x80\x10\x0a\x4a\x0a\x15\x72\x73\x34\x2e\x72\x65\x75\x74\x68\x65\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x42\x70\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x72\x6f\x74\x6f\x74\x79\x70\x65\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x57\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x65\x62\x64\x65\x76\x38\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x2b\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x2a\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x69\x73\x64\x2e\x6f\x72\x67\x15\xb2\x30\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x4a\x0a\x15\x74\x65\x73\x74\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x02\x0a\x50\x0a\x1b\x77\x61\x79\x66\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x7d\xa5\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x62\x61\x6d\x2d\x61\x73\x62\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\x93\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x73\x61\x66\x65\x72\x74\x65\x65\x6e\x73\x2e\x6f\x72\x67\x15\x65\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x04\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2d\x6c\x69\x62\x72\x61\x72\x79\x33\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x22\xc2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x35\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\xa0\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x51\x0a\x1c\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x08\x0a\x45\x0a\x10\x6e\x6f\x74\x65\x62\x6f\x6f\x6b\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3b\xc7\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x31\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x0a\x45\x0a\x10\x6f\x70\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x80\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x31\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x7b\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\x8f\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x6d\x79\x6e\x6d\x75\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\xe1\xc8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xae\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\xa6\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x52\x0a\x1d\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x6c\x61\x70\x65\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xe1\xb5\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd8\x03\x28\x80\xfe\x03\x0a\x42\x0a\x0d\x2a\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1e\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x76\x70\x6e\x65\x78\x74\x2e\x66\x65\x72\x72\x69\x73\x2e\x65\x64\x75\x15\x05\x64\x39\xa1\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x80\x10\x0a\x43\x0a\x0e\x77\x69\x6b\x69\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x3b\xe7\x29\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x37\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\x73\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x41\x0a\x0c\x76\x70\x6e\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x81\x1e\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xcc\x03\x28\xe8\x81\x01\x0a\x41\x0a\x0c\x65\x69\x73\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x36\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x76\x70\x6e\x2e\x73\x74\x75\x64\x65\x6e\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x84\x1e\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\xe8\x81\x01\x0a\x4a\x0a\x15\x63\x68\x69\x6c\x64\x66\x69\x6e\x64\x6d\x69\x63\x68\x69\x67\x61\x6e\x2e\x6f\x72\x67\x15\xdc\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xfb\x03\x0a\x43\x0a\x0e\x6d\x79\x75\x73\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x15\x3d\xc0\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x77\x77\x77\x2e\x6c\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x73\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x86\x04\x0a\x4f\x0a\x1a\x70\x73\x68\x61\x72\x74\x66\x6f\x72\x64\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7c\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x08\x0a\x41\x0a\x0c\x2a\x2e\x6d\x61\x63\x6f\x6d\x62\x2e\x65\x64\x75\x15\x63\x39\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\xfc\xff\x0f\x0a\x4f\x0a\x1a\x65\x64\x75\x70\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdb\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd0\x07\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x62\x68\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x77\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x51\x0a\x1c\x70\x73\x63\x61\x73\x73\x6f\x70\x6f\x6c\x69\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x79\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xec\xd8\x03\x28\x80\x86\x04\x0a\x42\x0a\x0d\x70\x73\x2e\x67\x69\x72\x65\x73\x64\x2e\x6e\x65\x74\x15\x44\x78\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x84\x08\x0a\x49\x0a\x14\x67\x63\x73\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x65\x72\x65\x73\x2d\x75\x74\x69\x6c\x69\x74\x79\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2a\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x6d\x6f\x6f\x64\x6c\x65\x32\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\xdf\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x75\x63\x63\x65\x73\x73\x76\x6c\x63\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7e\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xd8\x03\x28\x80\x86\x04\x0a\x57\x0a\x22\x61\x70\x70\x73\x2e\x70\x72\x6f\x63\x75\x72\x65\x6d\x65\x6e\x74\x2e\x66\x69\x6e\x61\x6e\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd8\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x88\x10\x0a\x5f\x0a\x2a\x77\x77\x77\x2e\x63\x6f\x75\x6e\x74\x72\x79\x73\x69\x64\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6d\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x69\x7a\x7a\x79\x66\x69\x6c\x65\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x0a\x55\x0a\x20\x6e\x69\x6c\x65\x73\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x71\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x86\x04\x0a\x5e\x0a\x29\x77\x77\x77\x2e\x62\x72\x61\x6e\x64\x79\x77\x69\x6e\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x74\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x2a\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x73\x69\x73\x64\x2d\x74\x63\x2d\x6c\x73\x74\x62\x72\x69\x64\x67\x65\x31\x61\x2e\x73\x69\x73\x64\x2e\x63\x63\x15\x17\xd6\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x81\x04\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x38\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x75\x9e\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd0\x07\x28\x80\x80\x02\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6f\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\xd0\x07\x28\x80\x86\x04\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x38\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x9e\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x80\x02\x0a\x55\x0a\x20\x72\x69\x76\x65\x72\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6c\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\x86\x04\x0a\x5e\x0a\x29\x62\x65\x72\x72\x69\x65\x6e\x73\x70\x72\x69\x6e\x67\x73\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x75\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x97\xd9\x03\x28\x80\x86\x04\x0a\x52\x0a\x1d\x73\x6a\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x76\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x41\x0a\x0c\x2a\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\xc8\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd0\x07\x28\x80\xd4\x02\x0a\x4b\x0a\x16\x62\x68\x63\x73\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x78\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x70\x73\x6d\x61\x72\x63\x65\x6c\x6c\x75\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7a\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x86\x04\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xdf\x03\x28\x80\x8b\x01\x0a\x5a\x0a\x25\x77\x61\x74\x65\x72\x76\x6c\x69\x65\x74\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6e\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x82\x08\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xef\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x64\x65\x65\x70\x62\x6c\x75\x65\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaa\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x72\x6f\x6a\x65\x63\x74\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x64\x65\x6d\x6f\x2e\x74\x61\x6e\x64\x65\x6d\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd3\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x63\x73\x67\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xd0\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x73\x68\x69\x62\x2d\x69\x64\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x79\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0d\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x76\x70\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\xb5\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xcf\x07\x28\x80\x80\x02\x0a\x47\x0a\x12\x70\x73\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x7d\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x86\x04\x0a\x50\x0a\x1b\x65\x78\x70\x6c\x6f\x72\x61\x74\x69\x6f\x6e\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x19\xbf\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xb5\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x15\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x66\x6c\x75\x78\x70\x72\x65\x70\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb8\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x6c\x72\x63\x2d\x74\x73\x75\x6b\x65\x6d\x6f\x6e\x6f\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfd\xa3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x08\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x05\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x63\x73\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8f\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8a\xe0\x03\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x74\x32\x64\x2d\x67\x65\x6e\x65\x73\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb5\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x52\x0a\x1d\x61\x61\x64\x74\x2d\x65\x73\x74\x69\x6d\x61\x74\x65\x2e\x75\x6d\x74\x72\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xce\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa6\xd0\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x73\x74\x61\x74\x73\x2e\x72\x65\x66\x72\x61\x63\x74\x69\x6f\x6e\x2e\x6e\x65\x74\x77\x6f\x72\x6b\x15\x58\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd5\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x6d\x69\x73\x73\x69\x6f\x6e\x73\x74\x72\x6f\x6e\x67\x2e\x6f\x72\x67\x15\xb5\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd5\x03\x28\x80\xfc\x01\x0a\x58\x0a\x23\x64\x65\x76\x2d\x6b\x65\x76\x69\x6e\x77\x6c\x69\x2d\x61\x64\x6d\x69\x6e\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x26\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xd0\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0b\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x45\x0a\x10\x61\x72\x74\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x76\x31\x2e\x74\x69\x70\x73\x34\x68\x65\x61\x6c\x74\x68\x2e\x6f\x72\x67\x15\x61\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x94\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x3f\x0a\x0a\x2a\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\x1f\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x5b\x0a\x26\x63\x61\x65\x6e\x2d\x73\x77\x2d\x61\x64\x6d\x69\x6e\x30\x31\x2e\x61\x64\x73\x72\x6f\x6f\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd4\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x6b\x62\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6d\x67\x65\x74\x69\x74\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa9\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf5\x8e\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x69\x6e\x74\x6d\x65\x64\x63\x6d\x65\x72\x65\x67\x69\x73\x74\x65\x72\x2e\x6f\x72\x67\x15\xc0\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x77\x61\x6c\x6b\x65\x7a\x2e\x6f\x72\x67\x15\x64\xfe\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdd\x03\x28\x80\x8b\x01\x0a\x51\x0a\x1c\x73\x74\x61\x67\x69\x6e\x67\x2d\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x0d\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x0a\x52\x0a\x1d\x61\x74\x68\x2d\x64\x65\x76\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfa\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\x8b\x01\x0a\x5b\x0a\x26\x63\x61\x65\x6e\x2d\x73\x77\x2d\x61\x64\x6d\x69\x6e\x30\x31\x2e\x61\x64\x73\x72\x6f\x6f\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd2\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x08\x0a\x53\x0a\x1e\x73\x6d\x74\x64\x2d\x77\x77\x77\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x23\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x04\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x8b\x01\x0a\x46\x0a\x11\x67\x76\x74\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd0\x07\x28\x80\xfc\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x99\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x68\x6f\x6d\x65\x66\x72\x6f\x6e\x74\x73\x74\x72\x6f\x6e\x67\x2e\x6f\x72\x67\x15\x37\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x6e\x61\x2e\x73\x68\x65\x72\x6d\x61\x6e\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x69\x64\x70\x2d\x6d\x63\x6f\x6d\x6d\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2d\x70\x65\x72\x73\x6f\x6e\x61\x6c\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x91\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb5\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x82\x01\x0a\x4e\x0a\x19\x6d\x65\x64\x73\x74\x75\x64\x65\x6e\x74\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x32\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xd0\x07\x28\x80\x82\x08\x0a\x51\x0a\x1c\x61\x70\x70\x73\x61\x6e\x79\x77\x68\x65\x72\x65\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xd0\x07\x28\x80\x82\x08\x0a\x4b\x0a\x16\x64\x61\x74\x61\x2e\x73\x63\x61\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xd0\x07\x28\x80\xf3\x01\x0a\x4c\x0a\x16\x61\x73\x6b\x6d\x75\x73\x69\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\xd0\x07\x28\x80\xfe\xff\x07\x0a\x4b\x0a\x16\x73\x72\x6f\x74\x72\x61\x69\x6e\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x50\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x69\x64\x70\x2d\x6d\x63\x6f\x6d\x6d\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x65\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x82\x01\x0a\x3f\x0a\x0a\x2a\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\x37\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x2a\x2e\x64\x65\x76\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa5\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8b\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xdf\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x70\x68\x61\x62\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x76\x69\x70\x65\x72\x64\x62\x2e\x6f\x72\x67\x15\xd9\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x82\x01\x0a\x4b\x0a\x16\x6d\x61\x64\x65\x6c\x69\x6e\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x3a\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd0\x07\x28\x80\x82\x01\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa0\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x0a\x4c\x0a\x17\x61\x64\x6d\x69\x6e\x2e\x63\x61\x72\x65\x65\x72\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1a\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x6d\x69\x73\x65\x61\x67\x72\x61\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x8b\x01\x0a\x41\x0a\x0c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x99\xca\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd0\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9e\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xdf\x03\x28\x80\x8b\x01\x0a\x48\x0a\x13\x6c\x61\x73\x65\x72\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x20\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xe3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x6d\x69\x68\x65\x61\x6c\x74\x68\x79\x77\x61\x79\x2e\x6f\x72\x67\x15\xfe\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9f\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x51\x0a\x1c\x69\x74\x73\x63\x6f\x6d\x6d\x77\x65\x62\x2d\x64\x65\x76\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd0\x07\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x75\x6d\x68\x65\x61\x6c\x74\x68\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x6f\x72\x67\x15\xf8\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xd0\x07\x28\x80\x80\x08\x0a\x5f\x0a\x2a\x6c\x73\x61\x2d\x70\x68\x79\x73\x2d\x73\x70\x69\x74\x7a\x2d\x64\x6f\x63\x64\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf4\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x75\x6d\x6d\x73\x66\x61\x63\x75\x6c\x74\x79\x64\x65\x76\x65\x6c\x6f\x70\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x15\xc2\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xdd\x03\x28\x80\x82\x01\x0a\x49\x0a\x14\x6d\x6f\x74\x69\x6f\x6e\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x84\x08\x0a\x48\x0a\x13\x76\x65\x6c\x6f\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x80\x08\x0a\x4a\x0a\x15\x63\x73\x67\x2d\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x0a\x5b\x0a\x26\x70\x65\x72\x66\x73\x6f\x6e\x61\x72\x2d\x73\x70\x68\x72\x61\x63\x6b\x2d\x6d\x61\x63\x63\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6d\x1d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\x80\x02\x0a\x4d\x0a\x18\x69\x74\x73\x63\x6f\x6d\x6d\x77\x65\x62\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x70\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x8b\x01\x0a\x4e\x0a\x19\x72\x68\x6e\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x53\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xd0\x07\x28\x80\x82\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x44\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd0\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x2a\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0f\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x8b\x01\x0a\x52\x0a\x1d\x63\x61\x74\x73\x77\x65\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xd0\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x2a\x2e\x68\x6f\x75\x73\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x75\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x06\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x64\x69\x6c\x6c\x2e\x6d\x6c\x6c\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\xe9\xa9\x27\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xd0\x07\x28\x80\x82\x08\x0a\x47\x0a\x12\x73\x69\x70\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4d\x1d\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x80\x10\x0a\x4b\x0a\x16\x73\x6f\x6c\x61\x72\x32\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe4\x3a\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xde\x03\x28\x80\x8b\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x63\x6f\x6d\x15\x1d\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x68\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\x90\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb3\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xde\x03\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc3\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x66\x75\x73\x69\x6f\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xfc\x01\x0a\x46\x0a\x11\x77\x63\x63\x6c\x69\x62\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x74\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xed\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x19\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x1a\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xd1\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x66\x69\x6c\x65\x64\x65\x70\x6f\x74\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x23\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa1\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\x92\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x02\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xd1\x03\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x61\x70\x70\x73\x2e\x61\x6e\x61\x6c\x79\x74\x69\x63\x73\x2e\x64\x65\x76\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x21\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x76\x65\x6e\x74\x75\x72\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x73\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa9\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xec\x01\x28\x80\xf3\x01\x0a\x49\x0a\x14\x6d\x79\x62\x61\x79\x2e\x62\x61\x79\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x7c\xd4\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x49\x0a\x14\x69\x63\x61\x2e\x65\x6c\x61\x73\x74\x69\x63\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x5f\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x68\x69\x73\x74\x6f\x72\x79\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x63\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa3\x02\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x03\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\xd1\x03\x28\x80\xfe\x01\x0a\x4c\x0a\x17\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x65\x73\x6b\x79\x6d\x6f\x73\x2e\x63\x6f\x6d\x15\x3b\xf4\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfe\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x62\x61\x63\x6b\x75\x70\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x34\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x84\x04\x0a\x46\x0a\x11\x6d\x79\x6b\x69\x64\x6e\x65\x79\x67\x75\x69\x64\x65\x2e\x6f\x72\x67\x15\x07\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x24\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xde\x03\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x61\x72\x65\x65\x72\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1b\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xde\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x16\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa8\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\x8d\x02\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x6d\x65\x64\x73\x74\x75\x64\x65\x6e\x74\x61\x75\x78\x69\x6c\x69\x61\x72\x79\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x42\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x64\x61\x74\x61\x64\x69\x72\x65\x63\x74\x2e\x6d\x70\x6f\x67\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x6f\x72\x67\x15\x3c\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x65\x62\x69\x6c\x6c\x2e\x70\x69\x65\x67\x2e\x63\x6f\x6d\x15\xc3\x4f\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xc9\x05\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x63\x63\x2e\x65\x64\x75\x15\xaa\x20\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x61\x6c\x65\x72\x74\x75\x73\x2e\x6a\x63\x63\x6d\x69\x2e\x65\x64\x75\x15\x21\xc8\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x7c\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x77\x77\x77\x2e\x76\x69\x61\x2e\x74\x61\x64\x6c\x2e\x6f\x72\x67\x15\x76\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd7\x03\x28\x80\xfc\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x16\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xd6\x03\x28\x80\xfe\x03\x0a\x41\x0a\x0c\x69\x63\x61\x2e\x74\x61\x64\x6c\x2e\x6e\x65\x74\x15\x72\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xd6\x03\x28\x80\xfc\x01\x0a\x52\x0a\x1d\x63\x61\x74\x73\x77\x65\x62\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x81\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x32\x38\x30\x2e\x6f\x72\x67\x15\x1d\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x63\x69\x74\x72\x69\x78\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x7d\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\x8f\x06\x28\x80\xfe\x07\x0a\x3c\x0a\x07\x65\x6e\x73\x61\x2e\x66\x69\x15\x5b\x76\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x47\x0a\x12\x71\x75\x6f\x64\x2e\x6c\x69\x62\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\xa8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xfc\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x14\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x70\x73\x2e\x63\x63\x63\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x43\x7a\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbc\xda\x03\x28\x80\x84\x08\x0a\x48\x0a\x13\x65\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xec\xde\x03\x28\x80\x8b\x01\x0a\x48\x0a\x13\x73\x61\x62\x65\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x29\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4e\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x4c\x0a\x17\x6d\x69\x6f\x63\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa6\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x4f\x0a\x1a\x76\x6f\x61\x6c\x74\x65\x33\x2e\x76\x6f\x61\x6c\x74\x65\x2e\x62\x6f\x72\x67\x65\x73\x73\x2e\x63\x6f\x6d\x15\xb5\x8f\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xda\x03\x28\x80\xf3\x01\x0a\x5b\x0a\x26\x70\x72\x6f\x62\x6c\x65\x6d\x2d\x72\x6f\x75\x6c\x65\x74\x74\x65\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdc\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x63\x74\x73\x65\x61\x72\x63\x68\x2e\x76\x69\x70\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xce\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x45\x0a\x10\x63\x61\x6e\x76\x61\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x4a\x0a\x15\x62\x6c\x61\x63\x6b\x62\x6f\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x48\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x6d\x61\x69\x6c\x2e\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x64\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd6\x03\x28\x80\xf3\x01\x0a\x56\x0a\x21\x69\x64\x70\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x26\xd1\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x78\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x79\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x74\x75\x64\x65\x6e\x74\x6c\x69\x66\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x72\x65\x6d\x6f\x74\x65\x73\x75\x70\x70\x6f\x72\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7b\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xec\x01\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x63\x6c\x6f\x75\x64\x2e\x64\x65\x6c\x74\x61\x63\x6f\x75\x6e\x74\x79\x6d\x69\x2e\x6f\x72\x67\x15\x69\xfd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x61\x67\x69\x6e\x67\x63\x65\x6e\x74\x65\x72\x73\x2e\x6f\x72\x67\x15\x6c\xc8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x40\x0a\x0b\x6c\x75\x67\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x14\xbc\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xd6\x03\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x2e\x6c\x73\x73\x75\x2e\x65\x64\x75\x15\x7d\xd8\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x90\xd7\x03\x28\x80\x82\x08\x0a\x43\x0a\x0e\x73\x6d\x73\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x5f\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\x90\x03\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x72\x65\x6d\x6f\x74\x65\x2e\x63\x68\x61\x72\x6c\x65\x76\x6f\x69\x78\x63\x6f\x75\x6e\x74\x79\x2e\x6f\x72\x67\x15\x58\x3d\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xec\x01\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x94\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x72\x67\x77\x2d\x6d\x73\x75\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x15\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xd6\x03\x28\x80\xf0\x02\x0a\x3f\x0a\x0a\x63\x73\x65\x6d\x64\x6d\x2e\x63\x6f\x6d\x15\x55\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\xd6\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xfd\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\x90\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xe0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\xd7\x03\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x90\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x63\x72\x61\x70\x6f\x6d\x65\x2e\x6f\x72\x67\x15\x9f\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xde\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x6c\x69\x62\x69\x6e\x74\x72\x61\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xde\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xc9\x05\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xf4\x01\x28\x80\x83\x01\x0a\x50\x0a\x1b\x63\x6f\x72\x6e\x69\x63\x68\x6f\x6e\x2e\x6c\x72\x63\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x70\x6f\x6c\x69\x63\x79\x6d\x61\x6b\x65\x72\x2e\x61\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x64\x61\x73\x68\x61\x70\x70\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xbc\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd7\x03\x28\x80\x88\x10\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x28\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x70\x73\x2e\x70\x77\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x99\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x73\x73\x6c\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x73\x73\x6c\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x67\x72\x79\x6f\x75\x74\x68\x64\x61\x74\x61\x2e\x6f\x72\x67\x15\xa1\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x44\x0a\x0f\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x67\x6f\x76\x2e\x6f\x72\x67\x15\x1e\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xda\x03\x28\x80\xfe\x03\x0a\x45\x0a\x10\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x68\x64\x2e\x6e\x65\x74\x15\xa2\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\x8d\x02\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x37\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xd6\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x63\x6f\x6d\x6d\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x49\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbd\xf4\x01\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0b\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xd1\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0c\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd4\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x64\x77\x61\x70\x70\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xe1\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa3\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa1\x8d\x02\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa1\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xda\x03\x28\x80\x82\x08\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x61\x74\x74\x65\x6e\x64\x61\x6e\x63\x65\x6f\x6e\x64\x65\x6d\x61\x6e\x64\x2e\x63\x6f\x6d\x15\x68\x7f\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x64\x69\x67\x69\x74\x61\x6c\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x28\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\x90\x03\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x06\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\xc9\x05\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7b\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa7\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa4\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa5\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa7\x8d\x02\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x76\x69\x64\x79\x6f\x2d\x31\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcc\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xc2\x02\x28\xa0\x8a\x01\x0a\x55\x0a\x20\x76\x69\x64\x79\x6f\x2d\x67\x61\x74\x65\x77\x61\x79\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcd\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xc2\x02\x28\xa0\x8a\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2e\x6e\x65\x74\x15\xa0\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\x8d\x02\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x73\x75\x70\x65\x72\x6d\x6f\x6e\x2e\x6c\x73\x61\x69\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6e\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6c\x69\x73\x2e\x73\x66\x6c\x64\x6c\x69\x62\x2e\x6f\x72\x67\x15\x03\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbf\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xa9\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x65\x70\x2e\x6f\x76\x70\x72\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xec\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xda\x03\x28\x80\x82\x08\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\x90\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x70\x72\x65\x70\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5e\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x49\x0a\x14\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x63\x61\x6e\x74\x6f\x6e\x70\x6c\x2e\x6f\x72\x67\x15\x48\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x77\x61\x79\x66\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x15\x7f\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x6f\x66\x74\x77\x61\x72\x65\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7f\xa0\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x69\x7a\x61\x72\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x74\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x73\x75\x62\x61\x6b\x65\x72\x73\x2e\x63\x6f\x6d\x15\x91\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xde\x03\x28\x80\x83\x01\x0a\x4a\x0a\x15\x73\x74\x61\x74\x67\x65\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0c\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\x91\x03\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x17\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x63\x6f\x6d\x74\x61\x67\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\x90\x03\x28\x80\xfc\x01\x0a\x4b\x0a\x16\x63\x73\x67\x73\x69\x74\x65\x73\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xb5\x02\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x1d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x35\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xde\x03\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x39\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xe9\x02\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x6d\x65\x65\x74\x69\x6e\x67\x73\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x15\xf8\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xdf\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xd6\x03\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7c\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xda\x03\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\xcb\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf0\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xde\x03\x28\x80\x82\x01\x0a\x51\x0a\x1c\x61\x61\x6f\x70\x65\x73\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf3\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x92\xdf\x03\x28\x80\x8b\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xa1\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf5\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x8b\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x63\x61\x6e\x74\x6f\x6e\x70\x6c\x2e\x6f\x72\x67\x15\x6a\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x51\x0a\x1c\x72\x65\x70\x6f\x72\x74\x69\x6e\x67\x2d\x74\x65\x73\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\x90\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x63\x6e\x70\x73\x2e\x6d\x63\x2d\x69\x73\x64\x2e\x6f\x72\x67\x15\x84\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x63\x63\x67\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xfa\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9c\x91\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x67\x72\x61\x64\x6c\x69\x66\x65\x63\x79\x63\x6c\x65\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x4f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xd6\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x83\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x6c\x69\x73\x74\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0d\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x52\x0a\x1d\x64\x61\x74\x61\x2e\x73\x75\x73\x74\x61\x69\x6e\x61\x62\x69\x6c\x69\x74\x79\x2e\x67\x6c\x62\x72\x63\x2e\x6f\x72\x67\x15\x9f\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xd6\x03\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x6d\x65\x72\x69\x74\x2d\x64\x6e\x6f\x74\x65\x30\x31\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\xc5\x74\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf4\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x98\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x73\x6f\x63\x69\x61\x6c\x77\x6f\x72\x6b\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x9f\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x65\x6d\x75\x6e\x69\x78\x6e\x65\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\xc9\x05\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x72\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xda\x03\x28\x80\xfe\x07\x0a\x48\x0a\x13\x76\x6f\x66\x66\x69\x63\x65\x32\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x02\x80\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x1e\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xda\x03\x28\x80\x86\x04\x0a\x3f\x0a\x0a\x77\x77\x77\x2e\x64\x69\x73\x2e\x75\x73\x15\x12\x40\x3f\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6c\x76\x6c\x32\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9a\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x72\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x61\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf6\xde\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x5f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x60\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x70\x63\x63\x73\x2d\x63\x75\x63\x31\x2e\x70\x63\x63\x73\x6d\x61\x69\x6c\x2e\x6e\x65\x74\x15\x2b\xc7\x39\xce\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\x82\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x52\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\x90\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x9d\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x65\x69\x73\x2d\x74\x65\x73\x74\x2e\x67\x76\x73\x75\x2e\x65\x64\x75\x15\x37\x06\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfa\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x76\x70\x6e\x2d\x65\x75\x2e\x6c\x74\x75\x2e\x65\x64\x75\x15\xcb\x91\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x46\x0a\x11\x62\x69\x6f\x70\x6c\x61\x73\x6d\x6f\x6e\x69\x63\x73\x2e\x6f\x72\x67\x15\x0a\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x48\x0a\x13\x73\x70\x61\x72\x74\x61\x6e\x63\x61\x73\x68\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3e\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x83\x01\x0a\x48\x0a\x13\x69\x63\x61\x6e\x64\x65\x63\x69\x64\x65\x73\x74\x75\x64\x79\x2e\x6f\x72\x67\x15\x19\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd6\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x6d\x6c\x73\x2e\x6c\x61\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x42\x8d\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd6\x03\x28\x80\x84\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x77\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xde\x03\x28\x80\x82\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xfb\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x4a\x0a\x15\x63\x61\x74\x61\x6c\x6f\x67\x2e\x74\x6c\x6e\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x0c\xa1\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\x90\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x92\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x51\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x3e\x0a\x09\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa0\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xf1\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\x90\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x77\x77\x2e\x62\x61\x6b\x65\x72\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\xe2\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xd7\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\x7d\x74\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x0a\x4c\x0a\x17\x70\x73\x2e\x6e\x65\x77\x6c\x6f\x74\x68\x72\x6f\x70\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x9d\x59\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb7\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa0\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4d\x0a\x18\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x73\x73\x2e\x61\x74\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb4\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfd\xde\x03\x28\x80\x82\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x62\x6d\x63\x32\x2e\x6f\x72\x67\x15\xa0\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x75\x6e\x64\x65\x72\x73\x74\x61\x6e\x64\x69\x6e\x67\x2d\x73\x74\x72\x6f\x6b\x65\x2e\x6f\x72\x67\x15\xa2\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x51\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xda\x03\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x0a\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x93\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x70\x68\x72\x61\x67\x6c\x75\x74\x2e\x6d\x74\x72\x69\x2e\x6f\x72\x67\x15\x0c\x05\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x61\x72\x6d\x6c\x69\x62\x2e\x6f\x72\x67\x15\x84\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xd4\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xda\x03\x28\x80\x82\x08\x0a\x3c\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x15\x0a\x1c\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x62\x61\x6e\x6e\x65\x72\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xd9\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x6c\x73\x61\x2d\x62\x6f\x6d\x67\x61\x72\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\xec\x01\x28\x80\xf5\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x75\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xfc\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x19\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xc9\x05\x28\x80\x8b\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xc9\x05\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x69\x6d\x70\x75\x74\x61\x74\x69\x6f\x6e\x73\x65\x72\x76\x65\x72\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x64\x1d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xec\x01\x28\x80\xe3\x01\x0a\x4b\x0a\x16\x73\x6e\x6f\x6f\x74\x6c\x65\x73\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf8\xe2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd6\x03\x28\x80\x82\x08\x0a\x50\x0a\x1b\x69\x6e\x73\x74\x72\x75\x63\x74\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x16\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xc9\x05\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x70\x73\x73\x74\x69\x67\x6e\x61\x63\x65\x2e\x65\x75\x70\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x77\xd0\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xda\x03\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x73\x75\x73\x74\x61\x69\x6e\x61\x62\x69\x6c\x69\x74\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3d\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x3f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x76\x70\x6c\x61\x63\x65\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x93\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x48\x0a\x13\x77\x65\x62\x77\x6f\x72\x6b\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x14\x0a\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xde\x03\x28\x80\x82\x01\x0a\x51\x0a\x1c\x74\x72\x61\x76\x65\x6c\x65\x72\x73\x61\x72\x63\x68\x69\x76\x65\x2e\x69\x73\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x58\x66\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xde\x03\x28\x80\x83\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x62\x72\x68\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\xf5\xf5\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x62\x74\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x45\xae\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xff\xff\x03\x0a\x4b\x0a\x16\x70\x72\x6f\x6a\x65\x63\x74\x6c\x6f\x67\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf8\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\xf5\x01\x0a\x46\x0a\x11\x6f\x6e\x77\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xb2\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\xc9\x05\x28\x80\xf3\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x0b\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x03\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1c\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x65\x64\x7a\x6f\x6e\x65\x2e\x6e\x65\x74\x15\xd2\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa4\xcc\x05\x28\x80\xf3\x01\x0a\x48\x0a\x13\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6d\x61\x2e\x65\x64\x75\x15\x6f\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xda\x03\x28\x80\xfe\x07\x0a\x48\x0a\x13\x64\x65\x61\x72\x62\x6f\x72\x6e\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x1d\x5e\x27\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xd6\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\x9f\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x96\x8d\x02\x28\x80\xf3\x01\x0a\x54\x0a\x1f\x73\x6d\x74\x64\x2d\x64\x65\x76\x32\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb7\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf9\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x64\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x69\x6b\x69\x2e\x63\x69\x74\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x87\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8f\xc9\x05\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x16\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x3e\x0a\x09\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x15\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xff\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x6c\x74\x65\x72\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xee\xbc\x6c\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x46\x0a\x11\x62\x61\x6e\x6e\x65\x72\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x0f\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x74\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xac\xbc\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xde\x03\x28\x80\x83\x01\x0a\x4b\x0a\x16\x7a\x68\x61\x6e\x67\x77\x65\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc8\x19\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x63\x63\x62\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x72\x73\x64\x70\x72\x6f\x67\x72\x61\x6d\x2e\x73\x69\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x52\x21\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x72\x69\x70\x65\x6e\x76\x69\x73\x69\x6f\x6e\x2e\x63\x6f\x6d\x15\x10\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\x90\x03\x28\x80\x82\x01\x0a\x47\x0a\x12\x7a\x69\x6d\x62\x72\x61\x2e\x6c\x6c\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x68\xe0\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\xd6\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x73\x6f\x73\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4d\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa0\xec\x01\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7a\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xda\x03\x28\x80\xfe\x07\x0a\x4a\x0a\x15\x62\x6c\x61\x63\x6b\x62\x6f\x61\x72\x64\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x6b\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xde\x03\x28\x80\x82\x01\x0a\x4d\x0a\x18\x67\x73\x63\x61\x6e\x2d\x77\x69\x6b\x69\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xfc\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x31\x38\x30\x30\x65\x61\x72\x6c\x79\x6f\x6e\x2e\x6f\x72\x67\x15\xd3\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfb\x03\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x4f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x6d\x69\x63\x68\x69\x67\x61\x6e\x70\x72\x65\x73\x63\x68\x6f\x6f\x6c\x2e\x6f\x72\x67\x15\xdb\x98\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfb\x03\x0a\x51\x0a\x1c\x6e\x65\x77\x67\x61\x74\x65\x77\x61\x79\x2e\x77\x65\x62\x2e\x69\x74\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xea\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xde\x03\x28\x80\x8b\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xeb\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xee\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x69\x64\x70\x2e\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x15\x27\xa4\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x63\x61\x6e\x76\x61\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x9b\x36\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x6f\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x58\x0a\x23\x6d\x79\x63\x63\x73\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x1a\xd1\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xc9\x05\x28\x80\x83\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x14\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd6\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x62\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xc9\x05\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xcf\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\x90\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x64\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x8d\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x73\x68\x61\x72\x65\x2e\x61\x6e\x61\x6e\x64\x70\x73\x2e\x63\x6f\x6d\x15\xc5\xbf\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xef\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x3c\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x73\x65\x62\x65\x77\x61\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x80\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd6\x03\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xa1\x18\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x61\x76\x65\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x6f\x72\x67\x15\x79\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x62\x61\x64\x67\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x64\x61\x74\x61\x2e\x6f\x69\x72\x61\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\x1f\x15\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x62\x6f\x72\x72\x6f\x6d\x65\x61\x6e\x2e\x64\x69\x67\x69\x74\x61\x6c\x15\xb0\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x44\x0a\x0f\x67\x69\x73\x2e\x63\x72\x69\x64\x61\x74\x61\x2e\x6f\x72\x67\x15\xad\x10\x3d\x94\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x96\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xda\x03\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x0a\x89\x8a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x0a\x4f\x0a\x1a\x73\x63\x68\x65\x64\x75\x6c\x69\x6e\x67\x2e\x6d\x75\x73\x69\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x31\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\xde\x03\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x19\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xcf\x03\x28\x80\xfe\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x65\x7a\x61\x63\x63\x65\x73\x73\x2e\x62\x6f\x72\x67\x65\x73\x73\x2e\x63\x6f\x6d\x15\xb2\x8f\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x66\x69\x6e\x6c\x61\x6e\x64\x69\x61\x2e\x65\x64\x75\x15\x1c\x1b\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2a\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x73\x75\x72\x66\x2e\x75\x72\x63\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbd\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x03\x1a\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xda\x03\x28\x80\x82\x08\x0a\x4a\x0a\x15\x62\x74\x6d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x4f\xae\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x40\x0a\x0b\x73\x63\x63\x63\x6d\x68\x61\x2e\x6f\x72\x67\x15\x4d\x59\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\x81\x06\x0a\x45\x0a\x10\x77\x77\x77\x2e\x75\x72\x63\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x28\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x67\x6c\x65\x6e\x6f\x61\x6b\x73\x2e\x65\x64\x75\x15\x12\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xda\x90\x03\x28\x80\xf3\x01\x0a\x48\x0a\x13\x74\x69\x63\x61\x75\x74\x68\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\x90\x03\x28\x80\xf5\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xeb\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x45\x0a\x10\x77\x77\x77\x2e\x68\x72\x6c\x72\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xea\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x46\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x08\x0a\x50\x0a\x1b\x74\x65\x73\x74\x2e\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x47\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x64\x65\x76\x2e\x61\x70\x69\x2e\x6d\x73\x69\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x48\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x46\x0a\x11\x65\x64\x63\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xc9\x05\x28\x80\xfc\x01\x0a\x4a\x0a\x15\x63\x6c\x6f\x75\x64\x2e\x6d\x65\x6e\x6f\x6d\x69\x6e\x65\x65\x63\x6f\x2e\x63\x6f\x6d\x15\x06\xf1\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xcc\x05\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe1\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x03\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xcd\x03\x28\x94\x8c\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x85\xc4\x02\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x63\x6c\x61\x72\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x50\x70\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x67\x72\x61\x64\x65\x76\x69\x65\x77\x2e\x77\x65\x62\x61\x70\x70\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xe4\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x75\x72\x70\x68\x79\x2e\x6c\x61\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x09\x1b\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x63\x61\x74\x65\x72\x69\x6e\x67\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x52\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8e\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x62\x74\x70\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x51\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd0\xd6\x03\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x65\x63\x6f\x61\x63\x68\x2e\x6d\x69\x73\x65\x72\x76\x65\x72\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x55\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\x90\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x6d\x65\x6c\x61\x6e\x6f\x6d\x61\x61\x6c\x6c\x79\x2e\x6f\x72\x67\x15\x59\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x61\x6c\x61\x72\x6d\x73\x2e\x64\x70\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x73\x6f\x75\x74\x68\x66\x69\x65\x6c\x64\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x15\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xc9\x05\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x69\x6d\x67\x2e\x6c\x69\x62\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xdd\xdf\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x65\x6e\x63\x6f\x72\x65\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x19\x62\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x4c\x0a\x17\x73\x61\x74\x75\x72\x6e\x2e\x6d\x6f\x6e\x72\x6f\x65\x2e\x6c\x69\x62\x2e\x6d\x69\x2e\x75\x73\x15\x15\x62\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x06\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8b\xd2\x03\x28\x80\xfe\x01\x0a\x56\x0a\x21\x63\x6f\x6c\x6f\x6d\x61\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x68\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb5\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x04\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd2\x03\x28\x80\xfe\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x05\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcd\xd2\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x13\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xc9\x05\x28\x80\x8b\x01\x0a\x4d\x0a\x18\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x10\x03\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xde\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x63\x73\x67\x61\x64\x6d\x69\x6e\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x77\x77\x77\x2e\x72\x68\x70\x6c\x2e\x6f\x72\x67\x15\xfe\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xff\xff\x03\x0a\x59\x0a\x24\x72\x69\x76\x65\x72\x73\x69\x64\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x6b\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x0b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x69\x74\x63\x64\x65\x76\x65\x6c\x2e\x6d\x61\x74\x68\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\x3d\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x63\x65\x61\x73\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x91\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x5b\x0a\x26\x72\x69\x76\x65\x72\x76\x61\x6c\x6c\x65\x79\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x65\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x73\x61\x62\x65\x72\x2d\x74\x65\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x55\x0a\x20\x64\x61\x74\x61\x73\x65\x74\x63\x61\x74\x61\x6c\x6f\x67\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2e\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x08\x0a\x50\x0a\x1b\x70\x77\x72\x73\x63\x68\x6c\x2e\x6d\x65\x6e\x6f\x6d\x69\x6e\x65\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x06\xff\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xda\x03\x28\x80\x80\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x66\x61\x72\x6d\x6c\x69\x62\x2e\x6f\x72\x67\x15\xae\xa4\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x50\x0a\x1b\x66\x61\x63\x65\x63\x2d\x61\x70\x2d\x70\x63\x31\x61\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x96\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x62\x6f\x72\x63\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x73\x61\x70\x73\x70\x73\x63\x68\x6f\x6f\x6c\x2e\x6d\x63\x2d\x69\x73\x64\x2e\x6f\x72\x67\x15\x85\xe3\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xde\x03\x28\x80\x8b\x01\x0a\x49\x0a\x14\x6d\x73\x69\x74\x65\x73\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf6\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x63\x63\x67\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xf7\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\x92\x03\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x76\x70\x6e\x2e\x6e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x07\xc0\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x79\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xda\x03\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x7b\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x4f\x0a\x1a\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x2e\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xd6\x03\x28\x80\x86\x04\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa9\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x28\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xec\x01\x28\x80\xf5\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x66\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x70\x2d\x69\x64\x6d\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8f\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x59\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xab\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\x8d\x02\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x61\x70\x70\x73\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x66\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf6\xde\x03\x28\x80\x8b\x01\x0a\x58\x0a\x23\x6f\x74\x70\x6c\x2d\x76\x6f\x69\x63\x65\x2d\x6d\x69\x76\x6f\x69\x63\x65\x2e\x6f\x72\x69\x6f\x6e\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x8c\xa3\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x39\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd1\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x6a\x61\x74\x63\x36\x36\x39\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x36\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x73\x73\x62\x78\x65\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x74\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x7c\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x73\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x61\x64\x61\x63\x65\x6e\x74\x65\x72\x2e\x6f\x72\x67\x15\x5b\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x23\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x43\x0a\x0e\x73\x6f\x63\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x66\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8b\xdf\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xc9\x05\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x64\x75\x63\x6b\x75\x6c\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xde\x03\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x8a\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6f\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x7a\x65\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xb1\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xae\x8d\x02\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x62\x70\x76\x6f\x69\x63\x65\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdf\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe8\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6f\x61\x69\x73\x64\x2e\x6f\x72\x67\x15\x03\xb2\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x3f\x0a\x0a\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x70\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xda\x03\x28\x80\xfe\x07\x0a\x41\x0a\x0c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\xb8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x70\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x71\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xda\x03\x28\x80\xfe\x07\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x86\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb0\xf0\x01\x28\x80\x80\x08\x0a\x47\x0a\x12\x70\x68\x61\x72\x6d\x61\x63\x79\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\xfd\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb8\xd6\x03\x28\x80\x82\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x5c\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\x82\x08\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xca\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\x90\x03\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x76\x64\x69\x6d\x6f\x6e\x69\x74\x6f\x72\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x04\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x74\x72\x69\x2d\x63\x79\x62\x65\x72\x2e\x75\x6d\x74\x72\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xde\x5c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x80\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa2\xd7\x03\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x6a\x75\x72\x79\x2e\x63\x6f\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x2e\x6d\x69\x2e\x75\x73\x15\x76\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xda\x03\x28\x80\xfe\x07\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb3\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x6f\x6c\x76\x65\x72\x69\x6e\x65\x73\x6f\x66\x74\x2e\x6f\x72\x67\x15\xd9\x72\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x76\x69\x73\x69\x74\x2e\x6d\x75\x73\x6b\x65\x67\x6f\x6e\x73\x68\x65\x72\x69\x66\x66\x2e\x63\x6f\x6d\x15\x71\x37\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\x80\xfe\x03\x0a\x4c\x0a\x17\x69\x68\x6f\x73\x74\x33\x62\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x2c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xda\x03\x28\x80\x82\x08\x0a\x4d\x0a\x18\x6d\x70\x72\x69\x6e\x74\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0e\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xde\x03\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x66\x69\x6c\x65\x64\x65\x70\x6f\x74\x2d\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x24\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xde\x03\x28\x80\x83\x01\x0a\x50\x0a\x1b\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2d\x71\x61\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xde\x03\x28\x80\x8b\x01\x0a\x4f\x0a\x1a\x62\x61\x6d\x2d\x6d\x61\x63\x63\x2d\x32\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x86\x93\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6e\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x78\x06\x6e\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x61\x70\x70\x73\x2e\x67\x6e\x6f\x73\x69\x73\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5d\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\x93\x02\x28\x80\xf3\x01\x0a\x56\x0a\x21\x76\x70\x6e\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xf9\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa0\x14\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x4d\x0a\x18\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x63\x6c\x61\x72\x65\x63\x6f\x2e\x6e\x65\x74\x15\x4d\x74\xdb\x42\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x0f\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x71\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xc9\x05\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x72\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa3\xc9\x05\x28\x80\xf3\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x37\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x52\x0a\x1d\x6f\x70\x65\x6e\x63\x6c\x69\x6e\x69\x63\x61\x2d\x64\x65\x76\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa4\x09\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xfd\x07\x0a\x42\x0a\x0d\x70\x73\x2e\x72\x61\x79\x64\x65\x72\x2e\x6f\x72\x67\x15\x6a\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xda\x03\x28\x80\xfe\x07\x0a\x42\x0a\x0d\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x25\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x24\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x42\x0a\x0d\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6d\x65\x64\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x26\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x3e\x0a\x09\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x6a\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaa\xec\x01\x28\x80\x86\x04\x0a\x4b\x0a\x16\x62\x61\x72\x72\x61\x63\x75\x64\x61\x31\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1e\x74\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xd6\x03\x28\x80\x82\x01\x0a\x4b\x0a\x16\x62\x61\x72\x72\x61\x63\x75\x64\x61\x32\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x1f\x74\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xd6\x03\x28\x80\x82\x01\x0a\x43\x0a\x0e\x61\x75\x78\x65\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xdc\x9b\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcf\xec\x01\x28\x80\x80\x08\x0a\x4b\x0a\x16\x6a\x65\x66\x66\x65\x72\x73\x6f\x6e\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd7\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb2\x90\x03\x28\x80\xf5\x01\x0a\x4e\x0a\x19\x6d\x70\x72\x69\x6e\x74\x2d\x74\x65\x73\x74\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x0d\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xde\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x2b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x6c\x69\x73\x74\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x08\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa8\xc4\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x33\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\x90\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x61\x66\x72\x69\x63\x61\x6e\x77\x6f\x72\x6c\x64\x68\x69\x73\x74\x6f\x72\x79\x2e\x6f\x72\x67\x15\x1d\x12\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x87\x8f\x06\x28\x80\x89\x40\x0a\x48\x0a\x13\x77\x77\x77\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x87\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x45\x0a\x10\x76\x70\x6e\x2e\x6e\x6f\x72\x63\x6f\x63\x6d\x68\x2e\x6f\x72\x67\x15\x0f\x07\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xd1\x03\x28\x80\xfe\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x68\x69\x6c\x6c\x73\x64\x61\x6c\x65\x2e\x65\x64\x75\x15\x51\xea\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfe\xef\x01\x28\x80\x86\x04\x0a\x4b\x0a\x16\x6d\x69\x63\x68\x69\x67\x61\x6e\x72\x6f\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x97\x4f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x49\x0a\x14\x75\x6d\x2d\x67\x72\x61\x66\x61\x6e\x61\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x37\xa9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd6\x03\x28\x80\xf0\x02\x0a\x45\x0a\x10\x74\x72\x69\x66\x65\x63\x74\x61\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbe\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x75\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xd6\x03\x28\xc0\x8a\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x5b\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\xd7\x03\x28\x80\x82\x08\x0a\x4b\x0a\x16\x62\x6f\x79\x6c\x65\x6c\x61\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x11\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x70\x73\x2e\x62\x6f\x79\x6e\x65\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\xa6\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x29\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x56\x0a\x21\x70\x6c\x61\x79\x67\x72\x6f\x75\x6e\x64\x2e\x69\x6f\x73\x63\x6f\x61\x72\x65\x6e\x61\x63\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\x8c\x59\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf2\xd6\x03\x28\x80\xfc\x01\x0a\x41\x0a\x0c\x61\x73\x6b\x62\x72\x69\x64\x61\x2e\x6f\x72\x67\x15\xda\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe7\xd6\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x70\x73\x2e\x62\x61\x74\x68\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x98\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xac\xda\x03\x28\x80\x82\x08\x0a\x45\x0a\x10\x70\x73\x2e\x6f\x76\x69\x64\x65\x6c\x73\x69\x65\x2e\x6f\x72\x67\x15\x9a\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x21\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\x80\xf5\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x1e\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf0\xde\x03\x28\x80\xf5\x01\x0a\x51\x0a\x1c\x61\x72\x6b\x6c\x65\x67\x2e\x73\x69\x74\x65\x73\x2e\x75\x6f\x66\x6d\x68\x6f\x73\x74\x69\x6e\x67\x2e\x6e\x65\x74\x15\x8d\xba\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x4f\x0a\x1a\x73\x74\x61\x67\x69\x6e\x67\x2e\x75\x6d\x6d\x73\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xae\xac\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x45\x0a\x10\x70\x73\x2e\x6b\x69\x6e\x67\x73\x66\x6f\x72\x64\x2e\x6f\x72\x67\x15\x65\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe9\xda\x03\x28\x80\x82\x08\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x2d\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\x0e\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdb\xda\x03\x28\x80\x82\x08\x0a\x4b\x0a\x16\x62\x6c\x75\x65\x2e\x73\x63\x61\x2e\x69\x73\x72\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x12\x20\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd2\xd6\x03\x28\x80\xf3\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x86\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x37\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x88\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x70\x72\x6f\x6a\x65\x63\x74\x67\x75\x61\x72\x64\x6f\x68\x69\x6f\x2e\x6f\x72\x67\x15\x6f\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd6\x03\x28\x80\xfc\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x84\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x49\x0a\x14\x77\x77\x77\x2e\x70\x73\x2e\x63\x68\x61\x72\x65\x6d\x69\x73\x64\x2e\x6f\x72\x67\x15\x69\xdd\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\xda\x03\x28\x80\xfe\x07\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x85\x1e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\x90\x03\x28\x80\xfe\x01\x0a\x53\x0a\x1e\x77\x77\x77\x2e\x6c\x69\x62\x70\x72\x6f\x78\x79\x2e\x6c\x69\x62\x72\x61\x72\x79\x2e\x77\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x88\x1e\xda\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x82\xd7\x03\x28\x80\xfe\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x70\x72\x6f\x78\x79\x32\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x18\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9f\xd7\x03\x28\x80\x8b\x01\x0a\x3e\x0a\x09\x6d\x6d\x74\x73\x62\x2e\x6f\x72\x67\x15\xd8\xd3\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x4d\x0a\x18\x66\x69\x6e\x64\x2d\x70\x61\x6e\x63\x61\x6e\x63\x65\x72\x2d\x65\x61\x72\x6c\x79\x2e\x6f\x72\x67\x15\x2b\x02\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x7e\x07\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xc9\x05\x28\x80\xf3\x01\x0a\x58\x0a\x23\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x32\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x18\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x57\x0a\x22\x6d\x61\x69\x6c\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x2b\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\xde\x03\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x36\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xa6\x0f\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x73\x68\x69\x62\x2d\x69\x64\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x87\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xea\xde\x03\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x64\x65\x76\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x89\x1c\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x70\x65\x7a\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\xf8\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xed\xd6\x03\x28\xc0\x81\x08\x0a\x47\x0a\x12\x70\x6f\x72\x74\x61\x6c\x2e\x61\x69\x72\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\xef\x94\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x47\x0a\x12\x76\x70\x6e\x2e\x62\x61\x79\x63\x6f\x6c\x6c\x65\x67\x65\x2e\x65\x64\x75\x15\x3a\x52\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xde\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x63\x69\x74\x72\x69\x78\x2e\x77\x6d\x63\x63\x2e\x6f\x72\x67\x15\x4e\xae\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xe0\x92\x02\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xc7\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb5\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x46\x0a\x11\x77\x65\x62\x61\x63\x63\x65\x73\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb7\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x31\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xb6\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x63\x69\x6e\x65\x6d\x61\x63\x75\x72\x69\x6f\x73\x61\x2e\x6f\x72\x67\x15\x78\xda\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd6\x03\x28\x80\xf3\x01\x0a\x58\x0a\x23\x62\x72\x69\x64\x67\x6d\x61\x6e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x69\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbe\xda\x03\x28\x80\x82\x08\x0a\x59\x0a\x24\x65\x61\x75\x63\x6c\x61\x69\x72\x65\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x66\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb3\xda\x03\x28\x80\x82\x08\x0a\x58\x0a\x23\x62\x75\x63\x68\x61\x6e\x61\x6e\x70\x6f\x77\x65\x72\x73\x63\x68\x6f\x6f\x6c\x2e\x62\x65\x72\x72\x69\x65\x6e\x72\x65\x73\x61\x2e\x6f\x72\x67\x15\x67\xf0\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb6\xda\x03\x28\x80\x82\x08\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x64\x69\x69\x73\x64\x2e\x6f\x72\x67\x15\x07\x30\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8e\xd7\x03\x28\x80\x86\x04\x0a\x49\x0a\x14\x72\x65\x73\x65\x61\x72\x63\x68\x2e\x63\x68\x6d\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x35\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4a\x0a\x15\x63\x6f\x6c\x6c\x65\x63\x74\x6f\x72\x2e\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x15\x86\x4e\xd8\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xc9\x05\x28\x80\x82\x01\x0a\x4b\x0a\x16\x6d\x69\x74\x6f\x6f\x6c\x73\x2e\x64\x65\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc9\x9f\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x59\x0a\x24\x70\x6f\x6c\x69\x63\x79\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x21\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x86\xc9\x05\x28\x80\x83\x01\x0a\x45\x0a\x10\x6d\x70\x72\x69\x6e\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x18\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x94\xdf\x03\x28\x80\x8b\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xd2\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x3f\x0a\x0a\x66\x69\x74\x75\x73\x63\x2e\x6f\x72\x67\x15\x1a\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x70\x72\x6f\x63\x75\x72\x65\x6d\x65\x6e\x74\x2e\x6c\x73\x61\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5f\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x74\x71\x69\x70\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xbb\x41\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x08\x0a\x52\x0a\x1d\x6d\x69\x77\x6f\x72\x6b\x73\x70\x61\x63\x65\x2d\x61\x70\x70\x73\x2e\x69\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x17\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdc\xde\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x70\x61\x63\x73\x2e\x77\x6d\x63\x63\x2e\x6f\x72\x67\x15\x37\xae\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x8b\x01\x0a\x4b\x0a\x16\x70\x72\x6f\x78\x79\x2e\x70\x6f\x6c\x69\x63\x65\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\xeb\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x46\x0a\x11\x70\x70\x6d\x2e\x69\x74\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\xd8\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x88\x10\x0a\x4c\x0a\x17\x70\x6f\x72\x74\x61\x6c\x64\x65\x76\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x27\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x50\x0a\x1b\x66\x75\x73\x69\x6f\x6e\x2d\x74\x69\x73\x73\x75\x65\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x1f\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xfc\x01\x0a\x3f\x0a\x0a\x65\x66\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x71\x40\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x90\xdf\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x73\x68\x69\x6e\x79\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x22\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x76\x70\x6e\x2e\x6c\x76\x64\x68\x65\x61\x6c\x74\x68\x63\x65\x6e\x74\x65\x72\x2e\x63\x6f\x6d\x15\x5c\x37\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x61\x6c\x74\x61\x72\x75\x6d\x2e\x6f\x72\x67\x15\x39\x06\x48\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x47\x0a\x12\x67\x61\x74\x65\x77\x61\x79\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x9c\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd7\xde\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xa6\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xfc\xd6\x03\x28\x80\x82\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb0\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x80\xd7\x03\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb2\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x91\xc9\x05\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x6d\x61\x69\x6c\x2e\x74\x62\x63\x68\x73\x2e\x6f\x72\x67\x15\x02\x4b\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\x90\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x73\x65\x72\x76\x69\x63\x65\x61\x70\x69\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x43\xb0\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xe9\x02\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\xde\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf1\xd6\x03\x28\x80\xf5\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x92\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe4\xde\x03\x28\x80\x82\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x93\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xde\xde\x03\x28\x80\x82\x01\x0a\x48\x0a\x13\x77\x77\x77\x2e\x6d\x62\x61\x6e\x64\x6d\x65\x6d\x62\x65\x72\x2e\x63\x6f\x6d\x15\xd6\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x68\x65\x72\x65\x69\x67\x6f\x61\x70\x70\x2e\x6f\x72\x67\x15\xd7\x04\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd5\xd6\x03\x28\x80\xf3\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x8c\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xeb\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x70\x6c\x61\x73\x6d\x61\x70\x69\x63\x74\x75\x72\x65\x6f\x66\x74\x68\x65\x64\x61\x79\x2e\x6f\x72\x67\x15\x22\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x34\x38\x35\x2e\x6f\x72\x67\x15\x1f\x03\xd5\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x51\x0a\x1c\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2d\x74\x65\x73\x74\x2e\x69\x74\x63\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x94\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcb\x90\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x77\x65\x62\x6c\x6f\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x95\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd8\x90\x03\x28\x80\xf3\x01\x0a\x4e\x0a\x19\x68\x63\x64\x6c\x69\x6c\x73\x2e\x68\x6f\x77\x65\x6c\x6c\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xa4\xa2\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x45\x0a\x10\x61\x70\x70\x73\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x33\xbd\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd3\xde\x03\x28\x80\x83\x01\x0a\x48\x0a\x13\x62\x72\x61\x76\x6f\x2e\x73\x70\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x28\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfc\x01\x0a\x3e\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x84\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd6\xde\x03\x28\x80\x82\x01\x0a\x40\x0a\x0b\x6d\x73\x63\x2d\x64\x72\x2e\x73\x69\x74\x65\x15\xb2\x75\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x40\x0a\x0b\x6d\x79\x2e\x75\x6d\x63\x75\x2e\x6f\x72\x67\x15\xc3\xbc\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\xa0\xfb\x01\x0a\x44\x0a\x0f\x6d\x6c\x73\x2e\x6c\x61\x63\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x46\x8d\x0c\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xd6\x03\x28\x80\x84\x01\x0a\x49\x0a\x14\x70\x73\x2e\x66\x6f\x77\x6c\x65\x72\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6e\x65\x74\x15\x97\x58\x26\xcc\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xda\x03\x28\x80\x82\x08\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x75\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x02\xd3\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x3f\x0a\x0a\x64\x62\x73\x65\x65\x72\x2e\x6f\x72\x67\x15\x45\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\x91\x03\x28\x80\xf3\x01\x0a\x4a\x0a\x15\x6d\x73\x75\x2d\x67\x72\x61\x66\x61\x6e\x61\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x13\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\xd6\x03\x28\x80\xe0\x02\x0a\x46\x0a\x11\x6d\x73\x75\x2d\x65\x6c\x6b\x2e\x6f\x73\x72\x69\x73\x2e\x6f\x72\x67\x15\x0e\xd9\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd6\x03\x28\x80\xe0\x02\x0a\x4f\x0a\x1a\x73\x68\x69\x62\x2d\x73\x70\x2d\x74\x65\x73\x74\x2e\x77\x77\x77\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xaf\xe5\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xde\x03\x28\x80\x82\x01\x0a\x4c\x0a\x17\x64\x61\x73\x68\x62\x6f\x61\x72\x64\x73\x2e\x6d\x69\x64\x65\x6e\x74\x61\x6c\x2e\x6f\x72\x67\x15\x55\xba\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x47\x0a\x12\x6e\x65\x74\x6c\x61\x62\x32\x2e\x77\x63\x63\x6e\x65\x74\x2e\x65\x64\x75\x15\x63\x86\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\xf3\x01\x0a\x4c\x0a\x17\x63\x6f\x6d\x6d\x75\x6e\x69\x74\x69\x65\x73\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x85\xea\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x15\xb5\x75\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\xf3\x01\x0a\x45\x0a\x10\x73\x31\x32\x2e\x6c\x69\x74\x65\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xf2\x42\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x97\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdd\xda\x03\x28\x80\xfe\x07\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x77\x69\x6c\x6c\x61\x72\x64\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xac\x96\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x67\x6c\x6f\x67\x2e\x6b\x62\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6a\x71\xe7\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\xf5\x01\x0a\x41\x0a\x0c\x76\x70\x6e\x2e\x75\x6d\x63\x75\x2e\x6f\x72\x67\x15\xd0\xbc\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x4b\x0a\x16\x77\x77\x77\x2e\x6d\x73\x75\x73\x75\x72\x67\x65\x72\x79\x67\x6f\x61\x6c\x2e\x63\x6f\x6d\x15\xb7\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4e\x0a\x19\x77\x77\x77\x2e\x6b\x75\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\x46\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x81\xd7\x03\x28\x80\x8b\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xbd\x07\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x33\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x93\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x50\x0a\x1b\x77\x68\x6f\x76\x69\x6c\x6c\x65\x2e\x63\x68\x63\x72\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xa1\x18\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\x80\x08\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x15\x8b\x89\x8a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x8d\xdf\x03\x28\x80\x82\x01\x0a\x40\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x63\x2e\x65\x64\x75\x15\x09\xc7\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x92\xec\x01\x28\x80\xf5\x01\x0a\x4d\x0a\x18\x76\x70\x6c\x61\x63\x65\x73\x74\x73\x74\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x93\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xfe\x07\x0a\x54\x0a\x1f\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x31\x30\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x97\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x47\x0a\x12\x77\x77\x77\x2e\x61\x61\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x15\x2b\x01\x48\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe6\xd6\x03\x28\x80\xfe\x07\x0a\x45\x0a\x10\x72\x65\x6d\x6f\x74\x65\x2e\x67\x65\x6e\x6e\x65\x74\x2e\x75\x73\x15\x09\xba\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x44\x0a\x0f\x73\x79\x62\x6f\x78\x2e\x63\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xc3\x0f\xd1\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x88\xdf\x03\x28\x80\x82\x01\x0a\x4f\x0a\x1a\x77\x77\x77\x2e\x6d\x63\x63\x65\x7a\x70\x72\x6f\x78\x79\x2e\x70\x61\x6c\x6e\x65\x74\x2e\x69\x6e\x66\x6f\x15\x5a\x75\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xef\xd6\x03\x28\x80\x8b\x01\x0a\x50\x0a\x1b\x6d\x65\x2d\x77\x65\x62\x31\x2d\x64\x65\x76\x2e\x65\x6e\x67\x69\x6e\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x36\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xde\x03\x28\x80\x82\x01\x0a\x4e\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x15\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x49\x0a\x14\x73\x68\x69\x62\x62\x6f\x6c\x65\x74\x68\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x91\x15\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf7\xde\x03\x28\x80\x82\x01\x0a\x45\x0a\x10\x66\x6d\x73\x2e\x62\x66\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x5a\xc2\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xd6\x03\x28\x80\xf3\x01\x0a\x47\x0a\x12\x6d\x69\x63\x6f\x6c\x6c\x61\x62\x2e\x74\x62\x63\x68\x73\x2e\x6f\x72\x67\x15\x64\x4b\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x6d\x79\x67\x6f\x75\x74\x63\x61\x72\x65\x2e\x6f\x72\x67\x15\x11\x05\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd6\x03\x28\x80\xfc\x01\x0a\x57\x0a\x22\x77\x77\x77\x2e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x22\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x48\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xce\xd6\x03\x28\x80\xf3\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x68\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xda\x03\x28\x80\xfe\x07\x0a\x45\x0a\x10\x72\x65\x6d\x6f\x74\x65\x2e\x67\x65\x6e\x6e\x65\x74\x2e\x75\x73\x15\x02\xba\x49\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x10\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x67\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x44\x0a\x0f\x70\x73\x73\x2e\x70\x73\x79\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x38\x30\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x4c\x0a\x17\x74\x65\x63\x68\x73\x6f\x6c\x75\x74\x69\x6f\x6e\x73\x2e\x77\x61\x79\x6e\x65\x2e\x65\x64\x75\x15\xd0\x00\xd9\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x6c\x73\x69\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x80\xb6\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xc9\x05\x28\x80\xf3\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x09\x9e\x4c\xa4\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x95\xc9\x05\x28\x80\xf3\x01\x0a\x45\x0a\x10\x74\x72\x75\x73\x74\x65\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x6b\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x40\x0a\x0b\x65\x65\x63\x73\x31\x38\x33\x2e\x6f\x72\x67\x15\x31\x71\xd4\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x98\xdf\x03\x28\x80\x82\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xaa\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\x8d\x02\x28\x80\xf3\x01\x0a\x46\x0a\x11\x61\x32\x34\x38\x2e\x65\x2e\x61\x6b\x61\x6d\x61\x69\x2e\x6e\x65\x74\x15\xad\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9b\x8d\x02\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x77\x77\x77\x2e\x61\x6b\x61\x6d\x61\x69\x68\x64\x2d\x73\x74\x61\x67\x69\x6e\x67\x2e\x6e\x65\x74\x15\xb0\xb8\x7a\xc0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb1\x8d\x02\x28\x80\xf3\x01\x0a\x4b\x0a\x16\x73\x69\x73\x2e\x67\x61\x79\x6c\x6f\x72\x64\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x63\x6f\x6d\x15\x2e\xa7\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf3\xd6\x03\x28\x80\x82\x08\x0a\x57\x0a\x22\x6c\x75\x6e\x61\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\xc8\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\x9d\xc9\x05\x28\x80\x83\x01\x0a\x4a\x0a\x15\x77\x77\x77\x2e\x65\x7a\x70\x72\x6f\x78\x79\x2e\x6d\x79\x6a\x64\x6c\x2e\x63\x6f\x6d\x15\xfd\xdb\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe5\xd6\x03\x28\x80\x84\x04\x0a\x47\x0a\x12\x77\x77\x77\x2e\x65\x75\x70\x73\x63\x68\x6f\x6f\x6c\x73\x2e\x6f\x72\x67\x15\x8e\xd0\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf3\x01\x0a\x44\x0a\x0f\x77\x77\x77\x2e\x75\x64\x6d\x65\x72\x63\x79\x2e\x65\x64\x75\x15\x47\x18\x6d\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\xf5\x01\x0a\x43\x0a\x0e\x70\x6d\x2e\x63\x61\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xde\xbc\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe2\xd6\x03\x28\x80\x80\x10\x0a\x4d\x0a\x18\x6b\x69\x74\x7a\x6d\x61\x6e\x6c\x61\x62\x2e\x6d\x65\x64\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x14\x78\xd6\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x84\x08\x0a\x56\x0a\x21\x69\x64\x70\x2e\x63\x6f\x6c\x6c\x65\x67\x65\x66\x6f\x72\x63\x72\x65\x61\x74\x69\x76\x65\x73\x74\x75\x64\x69\x65\x73\x2e\x65\x64\x75\x15\x26\xc3\x4a\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x82\x01\x0a\x48\x0a\x13\x6d\x62\x67\x2e\x79\x70\x73\x69\x6c\x69\x62\x72\x61\x72\x79\x2e\x6f\x72\x67\x15\xab\xa7\x6f\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x53\x0a\x1e\x77\x65\x62\x68\x6f\x73\x74\x69\x6e\x67\x34\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x21\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x4b\x0a\x16\x6d\x69\x63\x68\x69\x67\x61\x6e\x72\x6f\x73\x73\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\xb1\x5e\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xf0\xf2\x01\x0a\x41\x0a\x0c\x6d\x61\x69\x6c\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd1\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xcc\xde\x03\x28\xf0\xf2\x01\x0a\x44\x0a\x0f\x73\x72\x63\x32\x2e\x74\x63\x2e\x6d\x74\x75\x2e\x65\x64\x75\x15\x0a\x64\xdb\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x83\x01\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x67\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xda\x03\x28\x80\xfe\x07\x0a\x43\x0a\x0e\x77\x77\x77\x2e\x63\x6f\x70\x65\x73\x64\x2e\x6f\x72\x67\x15\x65\xdc\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe0\xda\x03\x28\x80\xfe\x07\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x69\x7a\x7a\x74\x69\x6e\x63\x74\x2e\x63\x6f\x6d\x15\x6c\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe3\xd6\x03\x28\x80\xfc\x01\x0a\x49\x0a\x14\x61\x70\x70\x2e\x67\x65\x6e\x65\x73\x66\x6f\x72\x67\x6f\x6f\x64\x2e\x6f\x72\x67\x15\x1b\x37\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd4\x90\x03\x28\x80\xf3\x01\x0a\x46\x0a\x11\x77\x77\x77\x2e\x64\x73\x63\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x99\x07\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xdf\xde\x03\x28\x80\x8b\x01\x0a\x3d\x0a\x08\x6d\x62\x6e\x69\x2e\x6f\x72\x67\x15\x6a\xd9\xd3\x8d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\x90\x03\x28\x80\xf3\x01\x0a\x4d\x0a\x18\x63\x61\x64\x2d\x65\x78\x39\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\x36\x4b\x09\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x0a\x4b\x0a\x16\x75\x6d\x76\x70\x6e\x36\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x15\x06\x98\x4b\xcf\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\x80\x02\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x72\x65\x6d\x63\x31\x2e\x6e\x65\x74\x15\xb2\x19\x44\xd0\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xee\xda\x03\x28\x80\x82\x08\x0a\x53\x0a\x1e\x69\x74\x61\x73\x74\x73\x74\x37\x30\x31\x61\x2e\x69\x74\x73\x65\x72\x76\x69\x63\x65\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x15\xd2\x0c\x08\x23\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\x80\xf5\x01\x0a\x42\x0a\x0d\x77\x77\x77\x2e\x61\x32\x67\x6f\x76\x2e\x6f\x72\x67\x15\x1e\x33\x6c\xc6\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xfc\xff\x0f\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x4e\x4b\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x08\x1a\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x6c\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x70\x0a\x4d\x0a\x0b\x75\x6d\x66\x6c\x69\x6e\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x02\x8d\xd8\x0a\x2c\x00\x01\x02\x00\x5e\xfe\x8d\xd8\x03\x6d\x0a\x4c\x0a\x0a\x61\x6d\x61\x64\x6f\x72\x2e\x6e\x65\x74\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb9\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x2a\x00\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0a\x52\x0a\x10\x77\x77\x77\x2e\x68\x6f\x73\x74\x77\x69\x72\x65\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x16\x3e\xff\xfe\x2d\xc9\x33\x0a\x58\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x9a\x04\x0a\x58\x0a\x16\x63\x68\x6f\x6f\x73\x65\x73\x6f\x6d\x65\x74\x68\x69\x6e\x67\x6e\x65\x77\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x9b\x04\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x12\x05\x44\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x65\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf5\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x12\x04\x44\x0a\x52\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x00\x14\x04\x18\x00\x00\x00\x00\x00\x00\x00\x17\xd5\x36\x19\x0a\x52\x0a\x10\x77\x77\x77\x2e\x73\x69\x67\x6e\x73\x33\x36\x35\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x00\x14\x04\x18\x00\x00\x00\x00\x00\x00\x00\x17\xd5\x36\x22\x0a\x52\x0a\x10\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x70\x0a\x51\x0a\x0f\x64\x65\x76\x61\x70\x70\x73\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x73\x0a\x61\x0a\x1f\x68\x73\x2d\x73\x63\x39\x2d\x70\x72\x6f\x64\x2d\x63\x64\x2e\x68\x65\x61\x6c\x74\x68\x73\x70\x61\x6e\x2e\x63\x6f\x2e\x75\x6b\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x20\x01\xec\x0b\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x0a\x50\x0a\x0e\x65\x64\x75\x63\x61\x74\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbb\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x22\x06\x01\x98\x01\x10\x02\x06\x00\x16\x0a\x58\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x10\x00\x00\x00\x00\x00\x00\x68\x14\x33\x79\x0a\x58\x0a\x16\x77\x61\x66\x74\x65\x73\x74\x2e\x75\x62\x74\x73\x75\x70\x70\x6f\x72\x74\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x10\x00\x00\x00\x00\x00\x00\x68\x14\x34\x79\x0a\x57\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x06\x47\x00\x30\x36\x00\x00\x00\x00\x00\x00\x68\x1b\xb1\x9d\x0a\x57\x0a\x15\x61\x63\x65\x79\x6f\x75\x72\x72\x65\x74\x69\x72\x65\x6d\x65\x6e\x74\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xfc\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\xb0\x9d\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x09\x34\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6b\x70\x6c\x2e\x67\x6f\x76\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xca\xd0\x07\x28\x80\x83\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x08\x34\x0a\x55\x0a\x13\x62\x69\x6c\x76\x61\x72\x64\x73\x65\x78\x70\x65\x72\x74\x65\x6e\x2e\x73\x65\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x32\x10\x2a\x02\x02\x50\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x52\x0a\x51\x0a\x0f\x77\x77\x77\x2e\x65\x72\x70\x73\x6b\x31\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x32\x10\x2a\x04\x4e\x42\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x0a\x5c\x0a\x1a\x77\x65\x64\x64\x69\x6e\x67\x2e\x68\x75\x6e\x67\x65\x72\x74\x69\x6e\x2d\x61\x72\x6d\x73\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc5\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x2a\x00\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x0a\x5c\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x09\xcf\x0a\x5c\x0a\x1a\x73\x74\x61\x74\x69\x63\x2e\x62\x6c\x61\x64\x65\x6f\x66\x65\x74\x65\x72\x6e\x69\x74\x79\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xb4\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x00\x20\x00\x00\x00\x00\x00\x00\x68\x1a\x08\xcf\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x44\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x43\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x47\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x45\x49\x0a\x53\x0a\x11\x77\x77\x77\x2e\x74\x70\x73\x2e\x6b\x31\x32\x2e\x6d\x69\x2e\x75\x73\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\x81\x04\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x46\x49\x0a\x52\x0a\x10\x66\x72\x61\x6e\x6b\x6c\x69\x6e\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x00\x65\x0a\x50\x0a\x0e\x62\x65\x61\x6b\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x13\x0a\x52\x0a\x10\x70\x73\x75\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x59\x0a\x5c\x0a\x1a\x69\x64\x70\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x66\x65\x64\x65\x72\x61\x74\x69\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x59\x0a\x57\x0a\x15\x70\x73\x75\x6d\x30\x36\x2d\x31\x30\x30\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x63\x0a\x50\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x35\x00\x00\x00\x00\x00\x00\x68\x1f\x50\x7f\x0a\x50\x0a\x0e\x73\x6d\x6f\x6b\x65\x79\x62\x65\x61\x72\x2e\x63\x6f\x6d\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x30\x00\x00\x00\x00\x00\x00\x68\x1f\x51\x7f\x0a\x4f\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\xa5\xa2\x0a\x4f\x0a\x0d\x62\x65\x79\x6f\x6e\x64\x69\x64\x6f\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\xa4\xa2\x0a\x54\x0a\x12\x70\x73\x63\x6f\x6e\x66\x69\x67\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x80\x01\x01\x92\x00\x41\x02\x36\x01\x05\x0a\x5b\x0a\x19\x70\x73\x72\x73\x76\x2e\x6f\x70\x65\x6e\x73\x63\x69\x65\x6e\x63\x65\x67\x72\x69\x64\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe4\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x80\x01\x01\x92\x00\x41\x02\x36\x01\x07\x0a\x4f\x0a\x0d\x6d\x61\x69\x6c\x32\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\x81\x04\x32\x10\x20\x01\x48\xa8\x08\x00\x22\x06\x01\x98\x01\x10\x02\x06\x00\x44\x0a\x4e\x0a\x0c\x6d\x72\x61\x6d\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x58\x0a\x52\x0a\x10\x67\x61\x74\x65\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xf4\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x30\x00\x11\x0a\x5c\x0a\x1a\x62\x61\x6d\x2d\x63\x6f\x6f\x6c\x2d\x31\x2e\x75\x6d\x6e\x65\x74\x2e\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc7\xd0\x07\x28\x80\xf3\x01\x32\x10\x26\x07\xf0\x18\x01\x70\x00\x02\xd6\xbe\xd9\xff\xfe\xb4\xc1\x53\x0a\x5c\x0a\x1a\x69\x73\x6d\x67\x6d\x74\x31\x2e\x72\x68\x73\x6e\x65\x74\x2e\x72\x68\x73\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfe\x03\x32\x10\x20\x02\x23\x09\xbc\xe1\x00\x00\x00\x00\x00\x00\x23\x09\xbc\xe1\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x32\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xf4\x92\x03\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x42\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x31\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc2\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x45\x0a\x54\x0a\x12\x70\x73\x75\x6d\x76\x6d\x30\x33\x2e\x61\x67\x6c\x74\x32\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xd0\x07\x28\x80\xe3\x01\x32\x10\x20\x01\x48\xa8\x68\xf7\x00\x01\x01\x92\x00\x41\x02\x31\x00\x43\x0a\x53\x0a\x11\x77\x77\x77\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xa5\xe0\x03\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x02\x48\x0a\x53\x0a\x11\x6c\x73\x61\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xba\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x0a\x5b\x0a\x19\x67\x72\x6f\x75\x70\x65\x72\x64\x65\x6d\x6f\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x0a\x57\x0a\x15\x77\x65\x62\x64\x65\x76\x38\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x8b\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x0a\x4d\x0a\x0b\x77\x77\x77\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x00\x04\x0a\x52\x0a\x10\x6e\x6f\x74\x65\x62\x6f\x6f\x6b\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc1\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x21\x99\x01\x98\x01\x10\x01\x99\x00\x59\x0a\x51\x0a\x0f\x77\x65\x62\x6d\x61\x69\x6c\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xbf\xd0\x07\x28\x80\x81\x04\x32\x10\x20\x01\x48\xa8\x08\x00\x11\x92\x01\x98\x01\x10\x01\x92\x00\x49\x0a\x52\x0a\x10\x6f\x70\x73\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc6\xd0\x07\x28\x80\x82\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x28\x0a\x58\x0a\x16\x73\x65\x72\x76\x69\x63\x65\x31\x2e\x69\x6e\x74\x65\x72\x6e\x65\x74\x32\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xe1\x8f\x03\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x01\x23\x0a\x4f\x0a\x0d\x6d\x79\x6e\x6d\x75\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\xfc\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x32\x00\x01\x98\x01\x10\x02\x00\x02\x25\x0a\x50\x0a\x0e\x6d\x79\x75\x73\x65\x72\x2e\x6e\x6d\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc8\xd0\x07\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x08\x00\x11\x92\x01\x98\x01\x10\x01\x92\x00\x61\x0a\x4b\x0a\x09\x75\x6d\x69\x63\x68\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc4\xd0\x07\x28\x80\x82\x01\x32\x10\x26\x07\xf0\x18\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\x64\x00\x00\x00\x00\x00\x00\x23\x09\x4b\x64\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x31\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\xbf\x00\x00\x00\x00\x00\x00\x23\x09\x4b\xbf\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x98\x41\x0a\x4f\x0a\x0d\x77\x77\x77\x2e\x6d\x65\x72\x69\x74\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xaf\xec\x01\x28\x80\xf4\x01\x32\x10\x26\x06\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x11\x99\x41\x0a\x49\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x37\x00\x00\x00\x00\x00\x00\x68\x1b\x85\xd1\x0a\x49\x0a\x07\x72\x6f\x7a\x65\x2e\x6d\x61\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc3\xd6\x03\x28\x80\xf3\x01\x32\x10\x26\x06\x47\x00\x30\x33\x00\x00\x00\x00\x00\x00\x68\x1b\x84\xd1\x0a\x5b\x0a\x19\x69\x64\x70\x2e\x74\x72\x61\x69\x6e\x69\x6e\x67\x2e\x69\x6e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x6f\x72\x67\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc9\x90\x03\x28\x80\xf3\x01\x32\x10\x20\x01\x48\xa8\x68\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x0a\x53\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x32\x10\x26\x20\x01\x2a\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0a\x53\x0a\x11\x77\x77\x77\x2e\x6b\x65\x74\x74\x65\x72\x69\x6e\x67\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xd9\x90\x03\x28\x80\xf3\x01\x32\x10\x26\x20\x01\x2a\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\x66\x00\x00\x00\x00\x00\x00\x23\x09\x4b\x66\x0a\x5b\x0a\x19\x63\x61\x64\x2d\x65\x78\x30\x33\x2e\x63\x61\x6d\x70\x75\x73\x61\x64\x2e\x6d\x73\x75\x2e\x65\x64\x75\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x20\xc0\xa9\x07\x28\xa0\xfb\x01\x32\x10\x20\x02\x23\x09\x4b\xc1\x00\x00\x00\x00\x00\x00\x23\x09\x4b\xc1\x10\x8d\x09\x1a\x24\x0a\x20\x51\x58\x68\xbe\x7f\x45\xab\x6f\x31\x0a\xfe\xd4\xb2\x29\xb7\xa4\x79\xfc\x9f\xde\x55\x3d\xea\x4c\xcd\xb3\x69\xab\x18\x99\xe7\x0c\x10\x5a\x22\xa2\x03\x0a\x37\x08\x0a\x12\x0e\x31\x34\x31\x2e\x32\x31\x39\x2e\x30\x2e\x30\x2f\x31\x36\x12\x0b\x33\x35\x2e\x38\x2e\x30\x2e\x30\x2f\x31\x36\x12\x14\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x35\x66\x65\x30\x3a\x3a\x31\x2f\x36\x34\x18\x00\x0a\x88\x01\x08\x0a\x12\x10\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x38\x34\x2e\x30\x2f\x32\x34\x12\x10\x31\x39\x32\x2e\x32\x30\x33\x2e\x31\x39\x35\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x38\x38\x2e\x32\x34\x32\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x34\x31\x2e\x32\x32\x39\x2e\x30\x2f\x32\x34\x12\x10\x32\x30\x36\x2e\x32\x30\x31\x2e\x31\x35\x37\x2e\x30\x2f\x32\x34\x12\x0f\x31\x39\x32\x2e\x33\x35\x2e\x31\x36\x38\x2e\x30\x2f\x32\x33\x12\x19\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x35\x66\x65\x30\x3a\x30\x30\x30\x31\x3a\x3a\x31\x2f\x36\x34\x18\x01\x0a\x46\x08\x0a\x12\x11\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x39\x30\x2e\x37\x38\x2f\x33\x32\x12\x12\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x39\x30\x2e\x31\x35\x39\x2f\x33\x32\x12\x19\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x35\x66\x65\x30\x3a\x30\x30\x30\x32\x3a\x3a\x31\x2f\x36\x34\x18\x01\x0a\x45\x08\x18\x12\x10\x31\x39\x32\x2e\x31\x32\x32\x2e\x31\x39\x30\x2e\x30\x2f\x32\x34\x12\x15\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x36\x38\x37\x66\x3a\x32\x3a\x3a\x2f\x36\x34\x12\x16\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x37\x66\x66\x66\x3a\x62\x3a\x3a\x32\x2f\x36\x34\x18\x01\x0a\x23\x08\x18\x12\x0e\x31\x32\x38\x2e\x31\x33\x38\x2e\x30\x2e\x30\x2f\x31\x36\x12\x0d\x32\x36\x32\x30\x3a\x31\x38\x66\x3a\x3a\x2f\x33\x32\x18\x01\x0a\x28\x08\x18\x12\x0b\x33\x35\x2e\x36\x2e\x30\x2e\x30\x2f\x31\x36\x12\x15\x32\x30\x30\x31\x3a\x34\x38\x61\x38\x3a\x36\x38\x37\x66\x3a\x32\x3a\x3a\x2f\x36\x34\x18\x00\x2a\x24\x0a\x20\xa1\xcb\x97\xbe\x69\x7c\x5e\xd5\xae\xfd\x78\xff\xa4\xdb\x7e\x68\x10\x10\x24\x60\x35\x11\xe4\x0a\x89\x95\x1b\xc1\x58\x80\x71\x77\x10\x5a\x32\x9a\x01\x08\x03\x12\x19\x68\x74\x74\x70\x73\x3a\x2f\x2f\x31\x2e\x31\x2e\x31\x2e\x31\x2f\x64\x6e\x73\x2d\x71\x75\x65\x72\x79\x1a\x14\x72\x2e\x72\x65\x66\x72\x61\x63\x74\x69\x6f\x6e\x2e\x6e\x65\x74\x77\x6f\x72\x6b\x22\x20\xa1\xcb\x97\xbe\x69\x7c\x5e\xd5\xae\xfd\x78\xff\xa4\xdb\x7e\x68\x10\x10\x24\x60\x35\x11\xe4\x0a\x89\x95\x1b\xc1\x58\x80\x71\x77\x2a\x24\x33\x2a\x46\x69\x72\x65\x66\x6f\x78\x5f\x36\x35\x2c\x31\x2a\x46\x69\x72\x65\x66\x6f\x78\x5f\x36\x33\x2c\x31\x2a\x69\x4f\x53\x5f\x31\x32\x5f\x31\x32\x1d\x73\x74\x75\x6e\x2e\x76\x6f\x69\x70\x2e\x62\x6c\x61\x63\x6b\x62\x65\x72\x72\x79\x2e\x63\x6f\x6d\x3a\x33\x34\x37\x38" diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 6192681e7..e69ce8d1a 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -21,16 +21,13 @@ */ /* - Package refraction wraps github.com/refraction-networking/gotapdance with net.Listener and net.Conn types that provide drop-in integration with Psiphon. - */ package refraction import ( "context" - "crypto/sha256" "fmt" "io/ioutil" "net" @@ -45,7 +42,12 @@ import ( "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/protocol" "github.com/armon/go-proxyproto" lrucache "github.com/cognusion/go-cache-lru" - refraction_networking_proto "github.com/refraction-networking/gotapdance/protobuf" + refraction_networking_assets "github.com/refraction-networking/conjure/pkg/client/assets" + refraction_networking_registration "github.com/refraction-networking/conjure/pkg/registrars/registration" + refraction_networking_transports "github.com/refraction-networking/conjure/pkg/transports/client" + refraction_networking_dtls "github.com/refraction-networking/conjure/pkg/transports/connecting/dtls" + refraction_networking_prefix "github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix" + refraction_networking_proto "github.com/refraction-networking/conjure/proto" refraction_networking_client "github.com/refraction-networking/gotapdance/tapdance" ) @@ -177,6 +179,9 @@ func (c *stationConn) GetMetrics() common.LogFields { return logFields } +// Dialer is the dialer function type expected by gotapdance. +type Dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) + // DialTapDance establishes a new TapDance connection to a TapDance station // specified in the config assets and forwarding through to the Psiphon server // specified by address. @@ -195,16 +200,25 @@ func DialTapDance( ctx context.Context, emitLogs bool, dataDirectory string, - dialer common.NetDialer, + dialer Dialer, address string) (net.Conn, error) { - return dial( - ctx, - emitLogs, - dataDirectory, - dialer, - address, - nil) + // TapDance is disabled. See comment for protocol.DisabledTunnelProtocols. + // With that DisabledTunnelProtocols configuration, clients should not + // reach this error. + // + // Note that in addition to this entry point being disabled, the TapDance + // ClientConf is no longer initialized in initRefractionNetworking below. + + return nil, errors.TraceNew("not supported") + + // return dial( + // ctx, + // emitLogs, + // dataDirectory, + // dialer, + // address, + // nil) } // DialConjure establishes a new Conjure connection to a Conjure station. @@ -217,7 +231,7 @@ func DialConjure( ctx context.Context, emitLogs bool, dataDirectory string, - dialer common.NetDialer, + dialer Dialer, address string, conjureConfig *ConjureConfig) (net.Conn, error) { @@ -234,7 +248,7 @@ func dial( ctx context.Context, emitLogs bool, dataDirectory string, - dialer common.NetDialer, + dialer Dialer, address string, conjureConfig *ConjureConfig) (net.Conn, error) { @@ -252,12 +266,16 @@ func dial( manager := newDialManager() refractionDialer := &refraction_networking_client.Dialer{ - TcpDialer: manager.makeManagedDialer(dialer.DialContext), - UseProxyHeader: true, + DialerWithLaddr: manager.makeManagedDialer(dialer), + V6Support: conjureConfig.EnableIPv6Dials, + UseProxyHeader: true, } - conjureCached := false - conjureDelay := time.Duration(0) + conjureMetricCached := false + conjureMetricDelay := time.Duration(0) + conjureMetricTransport := "" + conjureMetricPrefix := "" + conjureMetricSTUNServerAddress := "" var conjureCachedRegistration *refraction_networking_client.ConjureReg var conjureRecordRegistrar *recordRegistrar @@ -317,8 +335,8 @@ func dial( registration: conjureCachedRegistration, } - conjureCached = true - conjureDelay = 0 // report no delay + conjureMetricCached = true + conjureMetricDelay = 0 // report no delay } else if conjureConfig.APIRegistrarBidirectionalURL != "" { @@ -329,27 +347,29 @@ func dial( return nil, errors.TraceNew("missing APIRegistrarHTTPClient") } - refractionDialer.DarkDecoyRegistrar = &refraction_networking_client.APIRegistrarBidirectional{ - Endpoint: conjureConfig.APIRegistrarBidirectionalURL, - ConnectionDelay: conjureConfig.APIRegistrarDelay, - MaxRetries: 0, - Client: conjureConfig.APIRegistrarHTTPClient, + refractionDialer.DarkDecoyRegistrar, err = refraction_networking_registration.NewAPIRegistrar( + &refraction_networking_registration.Config{ + Target: conjureConfig.APIRegistrarBidirectionalURL, + Bidirectional: true, + Delay: conjureConfig.APIRegistrarDelay, + MaxRetries: 0, + HTTPClient: conjureConfig.APIRegistrarHTTPClient, + }) + if err != nil { + return nil, errors.Trace(err) } - conjureDelay = conjureConfig.APIRegistrarDelay + conjureMetricDelay = conjureConfig.APIRegistrarDelay - } else if conjureConfig.DecoyRegistrarDialer != nil { + } else if conjureConfig.DoDecoyRegistration { - refractionDialer.DarkDecoyRegistrar = &refraction_networking_client.DecoyRegistrar{ - TcpDialer: manager.makeManagedDialer( - conjureConfig.DecoyRegistrarDialer.DialContext), - } + refractionDialer.DarkDecoyRegistrar = refraction_networking_registration.NewDecoyRegistrar() refractionDialer.Width = conjureConfig.DecoyRegistrarWidth - // Limitation: the decoy regsitration delay is not currently exposed in the + // Limitation: the decoy registration delay is not currently exposed in the // gotapdance API. - conjureDelay = -1 // don't report delay + conjureMetricDelay = -1 // don't report delay } else { @@ -365,22 +385,103 @@ func dial( refractionDialer.DarkDecoyRegistrar = conjureRecordRegistrar } + // Conjure transport replay limitations: + // + // - For CONJURE_TRANSPORT_PREFIX_OSSH, the selected prefix is not replayed + // - For all transports, randomized port selection is not replayed + + randomizeDstPort := conjureConfig.EnablePortRandomization + disableOverrides := !conjureConfig.EnableRegistrationOverrides + + // TODO: EnableRegistrationOverrides is ignored and overrides are + // disabled. At this time, overrides appear to undo the + // FlushAfterPrefix policy we require for writeMergeConn. + disableOverrides = true + + conjureMetricTransport = conjureConfig.Transport + switch conjureConfig.Transport { + case protocol.CONJURE_TRANSPORT_MIN_OSSH: - refractionDialer.Transport = refraction_networking_proto.TransportType_Min - refractionDialer.TcpDialer = newMinTransportDialer(refractionDialer.TcpDialer) - case protocol.CONJURE_TRANSPORT_OBFS4_OSSH: - refractionDialer.Transport = refraction_networking_proto.TransportType_Obfs4 - default: - return nil, errors.Tracef("invalid Conjure transport: %s", conjureConfig.Transport) - } - if conjureCachedRegistration != nil { + transport, ok := refraction_networking_transports.GetTransportByID( + refraction_networking_proto.TransportType_Min) + if !ok { + return nil, errors.TraceNew("missing min transport") + } + + config, err := refraction_networking_transports.NewWithParams( + transport.Name(), + &refraction_networking_proto.GenericTransportParams{ + RandomizeDstPort: &randomizeDstPort}) + if err != nil { + return nil, errors.Trace(err) + } + + refractionDialer.Transport = transport.ID() + refractionDialer.TransportConfig = config + refractionDialer.DisableRegistrarOverrides = disableOverrides + refractionDialer.DialerWithLaddr = newWriteMergeDialer( + refractionDialer.DialerWithLaddr, false, 32) + + case protocol.CONJURE_TRANSPORT_PREFIX_OSSH: + + transport, ok := refraction_networking_transports.GetTransportByID( + refraction_networking_proto.TransportType_Prefix) + if !ok { + return nil, errors.TraceNew("missing prefix transport") + } + + prefixID := int32(refraction_networking_prefix.Rand) + flushPolicy := refraction_networking_prefix.FlushAfterPrefix + config, err := refraction_networking_transports.NewWithParams( + transport.Name(), + &refraction_networking_proto.PrefixTransportParams{ + RandomizeDstPort: &randomizeDstPort, + PrefixId: &prefixID, + CustomFlushPolicy: &flushPolicy}) + if err != nil { + return nil, errors.Trace(err) + } + + refractionDialer.Transport = transport.ID() + refractionDialer.TransportConfig = config + refractionDialer.DisableRegistrarOverrides = disableOverrides + refractionDialer.DialerWithLaddr = newWriteMergeDialer( + refractionDialer.DialerWithLaddr, true, 64) + + case protocol.CONJURE_TRANSPORT_DTLS_OSSH: + + transport, ok := refraction_networking_transports.GetTransportByID( + refraction_networking_proto.TransportType_DTLS) + if !ok { + return nil, errors.TraceNew("missing DTLS transport") + } + + config, err := refraction_networking_transports.NewWithParams( + transport.Name(), + &refraction_networking_proto.DTLSTransportParams{ + RandomizeDstPort: &randomizeDstPort}) + if err != nil { + return nil, errors.Trace(err) + } + + if conjureConfig.STUNServerAddress == "" { + return nil, errors.TraceNew("missing STUN server address") + } + config.SetParams( + &refraction_networking_dtls.ClientConfig{ + STUNServer: conjureConfig.STUNServerAddress, + }) + + conjureMetricSTUNServerAddress = conjureConfig.STUNServerAddress - // When using a cached registration, patch its TcpDialer to use the custom - // dialer for this dial. In the non-cached code path, gotapdance will set - // refractionDialer.TcpDialer into a new registration. - conjureCachedRegistration.TcpDialer = refractionDialer.TcpDialer + refractionDialer.Transport = transport.ID() + refractionDialer.TransportConfig = config + refractionDialer.DisableRegistrarOverrides = disableOverrides + + default: + return nil, errors.Tracef("invalid Conjure transport: %s", conjureConfig.Transport) } } @@ -436,14 +537,14 @@ func dial( // conjureRecordRegistrar.registration will be nil if there was no cached // registration _and_ registration didn't succeed before a cancel. if registration != nil { + conjureRegistrationCache.put(conjureConfig, registration, isCanceled) - // Do not retain a reference to the custom dialer, as its context will not - // be valid for future dials using this cached registration. Assumes that - // gotapdance will no longer reference the TcpDialer now that the - // connection is established. - registration.TcpDialer = nil + if conjureConfig.Transport == protocol.CONJURE_TRANSPORT_PREFIX_OSSH { - conjureRegistrationCache.put(conjureConfig, registration, isCanceled) + // Record the selected prefix name after registration, as + // the registrar may have overridden the client selection. + conjureMetricPrefix = registration.Transport.Name() + } } } else if conjureCachedRegistration != nil { @@ -471,9 +572,11 @@ func dial( if useConjure { // Retain these values for logging metrics. refractionConn.isConjure = true - refractionConn.conjureCached = conjureCached - refractionConn.conjureDelay = conjureDelay - refractionConn.conjureTransport = conjureConfig.Transport + refractionConn.conjureMetricCached = conjureMetricCached + refractionConn.conjureMetricDelay = conjureMetricDelay + refractionConn.conjureMetricTransport = conjureMetricTransport + refractionConn.conjureMetricPrefix = conjureMetricPrefix + refractionConn.conjureMetricSTUNServerAddress = conjureMetricSTUNServerAddress } return refractionConn, nil @@ -617,6 +720,10 @@ func (r *cachedRegistrar) Register( return r.registration, nil } +func (r *cachedRegistrar) PrepareRegKeys(_ [32]byte, _ []byte) error { + return nil +} + type recordRegistrar struct { registrar refraction_networking_client.Registrar registration *refraction_networking_client.ConjureReg @@ -634,14 +741,28 @@ func (r *recordRegistrar) Register( return registration, nil } -// minTransportConn buffers the first 32-byte random HMAC write performed by -// Conjure TransportType_Min, and prepends it to the subsequent first write -// made by OSSH. The purpose is to avoid a distinct fingerprint consisting of -// the initial TCP data packet always containing exactly 32 bytes of payload. -// The first write by OSSH will be a variable length multi-packet-sized -// sequence of random bytes. -type minTransportConn struct { +func (r *recordRegistrar) PrepareRegKeys(_ [32]byte, _ []byte) error { + return nil +} + +// writeMergeConn merges Conjure transport and subsequent OSSH writes in order +// to avoid fixed-sized first or second TCP packets always containing exactly +// the 32-byte or 64-byte HMAC tag. +// +// The Conjure Prefix transport will first write a prefix. writeMergeConn +// assumes the FlushAfterPrefix policy is used, so the first write call for +// that transport will be exactly the arbitrary sized prefix. The second +// write call will be the HMAC tag. Pass the first write through to the +// underlying conn, and then expect the HMAC tag on the second write, and +// handle as follows. +// +// The Conjure Min transport first calls write with an HMAC tag. Buffer this +// value and await the following initial OSSH write, and prepend the buffered +// HMAC tag to the random OSSH data. The first write by OSSH will be a +// variable length multi-packet-sized sequence of random bytes. +type writeMergeConn struct { net.Conn + tagSize int mutex sync.Mutex state int @@ -650,67 +771,83 @@ type minTransportConn struct { } const ( - stateMinTransportInit = iota - stateMinTransportBufferedHMAC - stateMinTransportWroteHMAC - stateMinTransportFailed + stateWriteMergeAwaitingPrefix = iota + stateWriteMergeAwaitingTag + stateWriteMergeBufferedTag + stateWriteMergeFinishedMerging + stateWriteMergeFailed ) -func newMinTransportConn(conn net.Conn) *minTransportConn { - return &minTransportConn{ - Conn: conn, - state: stateMinTransportInit, +func newWriteMergeConn(conn net.Conn, hasPrefix bool, tagSize int) *writeMergeConn { + c := &writeMergeConn{ + Conn: conn, + tagSize: tagSize, + } + if hasPrefix { + c.state = stateWriteMergeAwaitingPrefix + } else { + c.state = stateWriteMergeAwaitingTag } + return c } -func (conn *minTransportConn) Write(p []byte) (int, error) { +func (conn *writeMergeConn) Write(p []byte) (int, error) { conn.mutex.Lock() defer conn.mutex.Unlock() switch conn.state { - case stateMinTransportInit: - if len(p) != sha256.Size { - conn.state = stateMinTransportFailed - conn.err = errors.TraceNew("unexpected HMAC write size") + + case stateWriteMergeAwaitingPrefix: + conn.state = stateWriteMergeAwaitingTag + return conn.Conn.Write(p) + + case stateWriteMergeAwaitingTag: + if len(p) != conn.tagSize { + conn.state = stateWriteMergeFailed + conn.err = errors.Tracef("unexpected tag write size: %d", len(p)) return 0, conn.err } - conn.buffer = make([]byte, sha256.Size) + conn.buffer = make([]byte, conn.tagSize) copy(conn.buffer, p) - conn.state = stateMinTransportBufferedHMAC - return sha256.Size, nil - case stateMinTransportBufferedHMAC: + conn.state = stateWriteMergeBufferedTag + return conn.tagSize, nil + + case stateWriteMergeBufferedTag: conn.buffer = append(conn.buffer, p...) n, err := conn.Conn.Write(conn.buffer) - if n < sha256.Size { - conn.state = stateMinTransportFailed - conn.err = errors.TraceNew("failed to write HMAC") - if err == nil { - // As Write must return an error when failing to write the entire buffer, - // we don't expect to hit this case. - err = conn.err - } + if err != nil { + conn.state = stateWriteMergeFailed + conn.err = errors.Trace(err) } else { - conn.state = stateMinTransportWroteHMAC + conn.state = stateWriteMergeFinishedMerging + conn.buffer = nil + } + n -= conn.tagSize + if n < 0 { + n = 0 } - n -= sha256.Size - // Do not wrap Conn.Write errors, and do not return conn.err here. + // Do not wrap Conn.Write errors return n, err - case stateMinTransportWroteHMAC: + + case stateWriteMergeFinishedMerging: return conn.Conn.Write(p) - case stateMinTransportFailed: + + case stateWriteMergeFailed: + // Return the original error that caused the failure return 0, conn.err + default: return 0, errors.TraceNew("unexpected state") } } -func newMinTransportDialer(dialer common.Dialer) common.Dialer { - return func(ctx context.Context, network, address string) (net.Conn, error) { - conn, err := dialer(ctx, network, address) +func newWriteMergeDialer(dialer Dialer, hasPrefix bool, tagSize int) Dialer { + return func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) { + conn, err := dialer(ctx, network, laddr, raddr) if err != nil { return nil, errors.Trace(err) } - return newMinTransportConn(conn), nil + return newWriteMergeConn(conn, hasPrefix, tagSize), nil } } @@ -721,6 +858,9 @@ func newMinTransportDialer(dialer common.Dialer) common.Dialer { // are interrupted: // E.g., https://github.com/refraction-networking/gotapdance/blob/4d84655dad2e242b0af0459c31f687b12085dcca/tapdance/conn_raw.go#L307 // (...preceeding SetDeadline is insufficient for immediate cancellation.) +// +// This remains an issue with the Conjure Decoy Registrar: +// https://github.com/refraction-networking/conjure/blob/d9d58260cc7017ab0c64b120579b123a5b2d1c96/pkg/registrars/decoy-registrar/decoy-registrar.go#L208 type dialManager struct { ctxMutex sync.Mutex useRunCtx bool @@ -740,22 +880,19 @@ func newDialManager() *dialManager { } } -func (manager *dialManager) makeManagedDialer(dialer common.Dialer) common.Dialer { +func (manager *dialManager) makeManagedDialer(dialer Dialer) Dialer { - return func(ctx context.Context, network, address string) (net.Conn, error) { - return manager.dialWithDialer(dialer, ctx, network, address) + return func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) { + return manager.dialWithDialer(dialer, ctx, network, laddr, raddr) } } func (manager *dialManager) dialWithDialer( - dialer common.Dialer, + dialer Dialer, ctx context.Context, network string, - address string) (net.Conn, error) { - - if network != "tcp" { - return nil, errors.Tracef("unsupported network: %s", network) - } + laddr string, + raddr string) (net.Conn, error) { // The context for this dial is either: // - ctx, during the initial refraction_networking_client.DialContext, when @@ -779,7 +916,7 @@ func (manager *dialManager) dialWithDialer( } manager.ctxMutex.Unlock() - conn, err := dialer(ctx, network, address) + conn, err := dialer(ctx, network, laddr, raddr) if err != nil { return nil, errors.Trace(err) } @@ -789,7 +926,7 @@ func (manager *dialManager) dialWithDialer( // TapDance will run in a degraded state. // Limitation: if the underlying conn _also_ passes through CloseWrite, this // check may be insufficient. - if _, ok := conn.(common.CloseWriter); !ok { + if _, ok := conn.(common.CloseWriter); network == "tcp" && !ok { return nil, errors.TraceNew("underlying conn is not a CloseWriter") } @@ -844,10 +981,12 @@ type refractionConn struct { manager *dialManager isClosed int32 - isConjure bool - conjureCached bool - conjureDelay time.Duration - conjureTransport string + isConjure bool + conjureMetricCached bool + conjureMetricDelay time.Duration + conjureMetricTransport string + conjureMetricPrefix string + conjureMetricSTUNServerAddress string } func (conn *refractionConn) Close() error { @@ -867,17 +1006,33 @@ func (conn *refractionConn) GetMetrics() common.LogFields { if conn.isConjure { cached := "0" - if conn.conjureCached { + if conn.conjureMetricCached { cached = "1" } logFields["conjure_cached"] = cached - if conn.conjureDelay != -1 { - logFields["conjure_delay"] = fmt.Sprintf("%d", conn.conjureDelay/time.Millisecond) + if conn.conjureMetricDelay != -1 { + logFields["conjure_delay"] = fmt.Sprintf("%d", conn.conjureMetricDelay/time.Millisecond) } - logFields["conjure_transport"] = conn.conjureTransport + logFields["conjure_transport"] = conn.conjureMetricTransport + + if conn.conjureMetricPrefix != "" { + logFields["conjure_prefix"] = conn.conjureMetricPrefix + } + + if conn.conjureMetricSTUNServerAddress != "" { + logFields["conjure_stun"] = conn.conjureMetricSTUNServerAddress + } + + logFields["conjure_network"] = conn.RemoteAddr().Network() + + _, port, err := net.SplitHostPort(conn.RemoteAddr().String()) + if err == nil { + logFields["conjure_port_number"] = port + } } + return logFields } @@ -910,7 +1065,13 @@ func initRefractionNetworking(emitLogs bool, dataDirectory string) error { return } - refraction_networking_client.AssetsSetDir(assetsDir) + refraction_networking_assets.AssetsSetDir(assetsDir) + + // TapDance now uses a distinct Assets/ClientConf, + // refraction_networking_client.Assets. Do not configure the TapDance + // ClientConf to use the same configuration as Conjure, as the + // Conjure ClientConf may contain decoys that are appropriate for + // registration load but not full TapDance tunnel load. }) return initErr diff --git a/psiphon/common/resolver/resolver.go b/psiphon/common/resolver/resolver.go index 6ca519bcd..e7daf3de7 100644 --- a/psiphon/common/resolver/resolver.go +++ b/psiphon/common/resolver/resolver.go @@ -175,6 +175,10 @@ type ResolveParameters struct { // of making a request. PreresolvedIPAddress string + // PreresolvedDomain is the domain for which PreresolvedIPAddress is to be + // used. + PreresolvedDomain string + // AlternateDNSServer specifies an alterate DNS server (IP:port, or IP // only with port 53 assumed) to be used when either no system DNS // servers are available or when PreferAlternateDNSServer is set. @@ -314,7 +318,8 @@ func (r *Resolver) Stop() { // parameters and optional frontingProviderID context. func (r *Resolver) MakeResolveParameters( p parameters.ParametersAccessor, - frontingProviderID string) (*ResolveParameters, error) { + frontingProviderID string, + frontingDialDomain string) (*ResolveParameters, error) { params := &ResolveParameters{ AttemptsPerServer: p.Int(parameters.DNSResolverAttemptsPerServer), @@ -326,6 +331,9 @@ func (r *Resolver) MakeResolveParameters( // When a frontingProviderID is specified, generate a pre-resolved IP // address, based on tactics configuration. if frontingProviderID != "" { + if frontingDialDomain == "" { + return nil, errors.TraceNew("missing fronting dial domain") + } if p.WeightedCoinFlip(parameters.DNSResolverPreresolvedIPAddressProbability) { CIDRs := p.LabeledCIDRs(parameters.DNSResolverPreresolvedIPAddressCIDRs, frontingProviderID) if len(CIDRs) > 0 { @@ -335,16 +343,11 @@ func (r *Resolver) MakeResolveParameters( return nil, errors.Trace(err) } params.PreresolvedIPAddress = IP.String() + params.PreresolvedDomain = frontingDialDomain } } } - // When PreresolvedIPAddress is set, there's no DNS request and the - // following params can be skipped. - if params.PreresolvedIPAddress != "" { - return params, nil - } - // When preferring an alternate DNS server, select the alternate from // DNSResolverPreferredAlternateServers. This list is for circumvention // operations, such as using a public DNS server with a protocol @@ -496,7 +499,7 @@ func (r *Resolver) ResolveIP( ctx context.Context, networkID string, params *ResolveParameters, - hostname string) ([]net.IP, error) { + hostname string) (x []net.IP, y error) { // ResolveIP does _not_ lock r.mutex for the lifetime of the function, to // ensure many ResolveIP calls can run concurrently. @@ -536,7 +539,7 @@ func (r *Resolver) ResolveIP( // When PreresolvedIPAddress is set, tactics parameters determined the IP address // in this case. - if params.PreresolvedIPAddress != "" { + if params.PreresolvedIPAddress != "" && params.PreresolvedDomain == hostname { IP := net.ParseIP(params.PreresolvedIPAddress) if IP == nil { // Unexpected case, as MakeResolveParameters selects the IP address. diff --git a/psiphon/common/resolver/resolver_test.go b/psiphon/common/resolver/resolver_test.go index a447954a0..4ce824d91 100644 --- a/psiphon/common/resolver/resolver_test.go +++ b/psiphon/common/resolver/resolver_test.go @@ -62,6 +62,7 @@ func TestPublicDNSServers(t *testing.T) { func runTestMakeResolveParameters() error { frontingProviderID := "frontingProvider" + frontingDialDomain := exampleDomain alternateDNSServer := "172.16.0.1" alternateDNSServerWithPort := net.JoinHostPort(alternateDNSServer, resolverDNSPort) preferredAlternateDNSServer := "172.16.0.2" @@ -95,7 +96,7 @@ func runTestMakeResolveParameters() error { defer resolver.Stop() resolverParams, err := resolver.MakeResolveParameters( - params.Get(), frontingProviderID) + params.Get(), frontingProviderID, frontingDialDomain) if err != nil { return errors.Trace(err) } @@ -112,11 +113,7 @@ func runTestMakeResolveParameters() error { resolverParams.RequestTimeout != 5*time.Second || resolverParams.AwaitTimeout != 10*time.Millisecond || !CIDRContainsIP(exampleIPv4CIDR, resolverParams.PreresolvedIPAddress) || - resolverParams.AlternateDNSServer != "" || - resolverParams.PreferAlternateDNSServer != false || - resolverParams.ProtocolTransformName != "" || - resolverParams.ProtocolTransformSpec != nil || - resolverParams.IncludeEDNS0 != false { + resolverParams.PreresolvedDomain != frontingDialDomain { return errors.Tracef("unexpected resolver parameters: %+v", resolverParams) } @@ -145,7 +142,7 @@ func runTestMakeResolveParameters() error { } resolverParams, err = resolver.MakeResolveParameters( - params.Get(), frontingProviderID) + params.Get(), frontingProviderID, frontingDialDomain) if err != nil { return errors.Trace(err) } @@ -155,6 +152,7 @@ func runTestMakeResolveParameters() error { resolverParams.RequestTimeout != 5*time.Second || resolverParams.AwaitTimeout != 10*time.Millisecond || resolverParams.PreresolvedIPAddress != "" || + resolverParams.PreresolvedDomain != "" || resolverParams.AlternateDNSServer != preferredAlternateDNSServerWithPort || resolverParams.PreferAlternateDNSServer != true || resolverParams.ProtocolTransformName != transformName || @@ -175,7 +173,7 @@ func runTestMakeResolveParameters() error { } resolverParams, err = resolver.MakeResolveParameters( - params.Get(), frontingProviderID) + params.Get(), frontingProviderID, frontingDialDomain) if err != nil { return errors.Trace(err) } @@ -185,6 +183,7 @@ func runTestMakeResolveParameters() error { resolverParams.RequestTimeout != 5*time.Second || resolverParams.AwaitTimeout != 10*time.Millisecond || resolverParams.PreresolvedIPAddress != "" || + resolverParams.PreresolvedDomain != "" || resolverParams.AlternateDNSServer != alternateDNSServerWithPort || resolverParams.PreferAlternateDNSServer != false || resolverParams.ProtocolTransformName != "" || @@ -331,6 +330,7 @@ func runTestResolver() error { beforeMetrics = resolver.metrics params.PreresolvedIPAddress = exampleIPv4 + params.PreresolvedDomain = exampleDomain IPs, err = resolver.ResolveIP(ctx, networkID, params, exampleDomain) if err != nil { @@ -350,6 +350,33 @@ func runTestResolver() error { params.PreresolvedIPAddress = "" + // Test: PreresolvedIPAddress set for different domain + + beforeMetrics = resolver.metrics + + params.PreresolvedIPAddress = exampleIPv4 + params.PreresolvedDomain = "not.example.com" + + IPs, err = resolver.ResolveIP(ctx, networkID, params, exampleDomain) + if err != nil { + return errors.Trace(err) + } + + err = checkResult(IPs) + if err != nil { + return errors.Trace(err) + } + + if resolver.metrics.resolves != beforeMetrics.resolves+1 || + resolver.metrics.cacheHits != beforeMetrics.cacheHits+1 || + resolver.metrics.requestsIPv4 != beforeMetrics.requestsIPv4 || + resolver.metrics.requestsIPv6 != beforeMetrics.requestsIPv6 { + return errors.Tracef("unexpected metrics: %+v", resolver.metrics) + } + + params.PreresolvedIPAddress = "" + params.PreresolvedDomain = "" + // Test: change network ID, which must clear cache beforeMetrics = resolver.metrics diff --git a/psiphon/config.go b/psiphon/config.go index 210b7e4f2..0b3fd5731 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -797,6 +797,11 @@ type Config struct { ConjureDecoyRegistrarWidth *int ConjureDecoyRegistrarMinDelayMilliseconds *int ConjureDecoyRegistrarMaxDelayMilliseconds *int + ConjureEnableIPv6Dials *bool + ConjureEnablePortRandomization *bool + ConjureEnableRegistrationOverrides *bool + ConjureLimitTransports protocol.ConjureTransports + ConjureSTUNServerAddresses []string // HoldOffTunnelMinDurationMilliseconds and other HoldOffTunnel fields are // for testing purposes. @@ -1867,6 +1872,26 @@ func (config *Config) makeConfigParameters() map[string]interface{} { applyParameters[parameters.ConjureDecoyRegistrarMaxDelay] = fmt.Sprintf("%dms", *config.ConjureDecoyRegistrarMaxDelayMilliseconds) } + if config.ConjureEnableIPv6Dials != nil { + applyParameters[parameters.ConjureEnableIPv6Dials] = *config.ConjureEnableIPv6Dials + } + + if config.ConjureEnablePortRandomization != nil { + applyParameters[parameters.ConjureEnablePortRandomization] = *config.ConjureEnablePortRandomization + } + + if config.ConjureEnableRegistrationOverrides != nil { + applyParameters[parameters.ConjureEnableRegistrationOverrides] = *config.ConjureEnableRegistrationOverrides + } + + if config.ConjureLimitTransports != nil { + applyParameters[parameters.ConjureLimitTransports] = config.ConjureLimitTransports + } + + if config.ConjureSTUNServerAddresses != nil { + applyParameters[parameters.ConjureSTUNServerAddresses] = config.ConjureSTUNServerAddresses + } + if config.HoldOffTunnelMinDurationMilliseconds != nil { applyParameters[parameters.HoldOffTunnelMinDuration] = fmt.Sprintf("%dms", *config.HoldOffTunnelMinDurationMilliseconds) } @@ -2328,6 +2353,20 @@ func (config *Config) setDialParametersHash() { binary.Write(hash, binary.LittleEndian, int64(*config.ConjureDecoyRegistrarMaxDelayMilliseconds)) } + if config.ConjureLimitTransports != nil { + hash.Write([]byte("ConjureLimitTransports")) + for _, transport := range config.ConjureLimitTransports { + hash.Write([]byte(transport)) + } + } + + if config.ConjureSTUNServerAddresses != nil { + hash.Write([]byte("ConjureSTUNServerAddresses")) + for _, address := range config.ConjureSTUNServerAddresses { + hash.Write([]byte(address)) + } + } + if config.HoldOffTunnelMinDurationMilliseconds != nil { hash.Write([]byte("HoldOffTunnelMinDurationMilliseconds")) binary.Write(hash, binary.LittleEndian, int64(*config.HoldOffTunnelMinDurationMilliseconds)) diff --git a/psiphon/dataStore.go b/psiphon/dataStore.go index 992f2f363..0f596c3f0 100644 --- a/psiphon/dataStore.go +++ b/psiphon/dataStore.go @@ -609,7 +609,6 @@ type ServerEntryIterator struct { // NewServerEntryIterator and any returned ServerEntryIterator are not // designed for concurrent use as not all related datastore operations are // performed in a single transaction. -// func NewServerEntryIterator(config *Config) (bool, *ServerEntryIterator, error) { // When configured, this target server entry is the only candidate diff --git a/psiphon/dialParameters.go b/psiphon/dialParameters.go index 85011a35a..14ad20c59 100644 --- a/psiphon/dialParameters.go +++ b/psiphon/dialParameters.go @@ -138,6 +138,7 @@ type DialParameters struct { ConjureDecoyRegistrarDelay time.Duration ConjureDecoyRegistrarWidth int ConjureTransport string + ConjureSTUNServerAddress string LivenessTestSeed *prng.Seed @@ -623,10 +624,18 @@ func MakeDialParameters( if (!isReplay || !replayConjureTransport) && protocol.TunnelProtocolUsesConjure(dialParams.TunnelProtocol) { - dialParams.ConjureTransport = protocol.CONJURE_TRANSPORT_MIN_OSSH - if p.WeightedCoinFlip( - parameters.ConjureTransportObfs4Probability) { - dialParams.ConjureTransport = protocol.CONJURE_TRANSPORT_OBFS4_OSSH + // None of ConjureEnableIPv6Dials, ConjureEnablePortRandomization, or + // ConjureEnableRegistrationOverrides are set here for replay. The + // current value of these flag parameters is always applied. + + dialParams.ConjureTransport = selectConjureTransport(p) + if protocol.ConjureTransportUsesSTUN(dialParams.ConjureTransport) { + stunServerAddresses := p.Strings(parameters.ConjureSTUNServerAddresses) + if len(stunServerAddresses) == 0 { + return nil, errors.Tracef( + "no Conjure STUN servers addresses configured for transport %s", dialParams.ConjureTransport) + } + dialParams.ConjureSTUNServerAddress = stunServerAddresses[prng.Intn(len(stunServerAddresses))] } } @@ -824,7 +833,7 @@ func MakeDialParameters( if (!isReplay || !replayResolveParameters) && useResolver { dialParams.ResolveParameters, err = dialParams.resolver.MakeResolveParameters( - p, dialParams.FrontingProviderID) + p, dialParams.FrontingProviderID, dialParams.MeekFrontingDialAddress) if err != nil { return nil, errors.Trace(err) } @@ -1720,3 +1729,29 @@ func makeOSSHPrefixSplitConfig(p parameters.ParametersAccessor) (*obfuscator.OSS MaxDelay: maxDelay, }, nil } + +func selectConjureTransport( + p parameters.ParametersAccessor) string { + + limitConjureTransports := p.ConjureTransports(parameters.ConjureLimitTransports) + + transports := make([]string, 0) + + for _, transport := range protocol.SupportedConjureTransports { + + if len(limitConjureTransports) > 0 && + !common.Contains(limitConjureTransports, transport) { + continue + } + + transports = append(transports, transport) + } + + if len(transports) == 0 { + return "" + } + + choice := prng.Intn(len(transports)) + + return transports[choice] +} diff --git a/psiphon/meekConn.go b/psiphon/meekConn.go index 7de1a3499..78a67774a 100644 --- a/psiphon/meekConn.go +++ b/psiphon/meekConn.go @@ -381,9 +381,7 @@ func DialMeek( udpDialer := func(ctx context.Context) (net.PacketConn, *net.UDPAddr, error) { packetConn, remoteAddr, err := NewUDPConn( - ctx, - meekConfig.DialAddress, - dialConfig) + ctx, "udp", false, "", meekConfig.DialAddress, dialConfig) if err != nil { return nil, nil, errors.Trace(err) } diff --git a/psiphon/net.go b/psiphon/net.go index 80ddef7cf..1d07fb158 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -188,35 +188,49 @@ type NetworkIDGetter interface { GetNetworkID() string } -// NetDialer implements an interface that matches net.Dialer. -// Limitation: only "tcp" Dials are supported. -type NetDialer struct { - dialTCP common.Dialer -} +// RefractionNetworkingDialer implements psiphon/common/refraction.Dialer. -// NewNetDialer creates a new NetDialer. -func NewNetDialer(config *DialConfig) *NetDialer { - return &NetDialer{ - dialTCP: NewTCPDialer(config), - } +type RefractionNetworkingDialer struct { + config *DialConfig } -func (d *NetDialer) Dial(network, address string) (net.Conn, error) { - conn, err := d.DialContext(context.Background(), network, address) - if err != nil { - return nil, errors.Trace(err) +// NewRefractionNetworkingDialer creates a new RefractionNetworkingDialer. +func NewRefractionNetworkingDialer(config *DialConfig) *RefractionNetworkingDialer { + return &RefractionNetworkingDialer{ + config: config, } - return conn, nil } -func (d *NetDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { +func (d *RefractionNetworkingDialer) DialContext( + ctx context.Context, + network string, + laddr string, + raddr string) (net.Conn, error) { + switch network { - case "tcp": - conn, err := d.dialTCP(ctx, "tcp", address) + case "tcp", "tcp4", "tcp6": + + if laddr != "" { + return nil, errors.TraceNew("unexpected laddr for tcp dial") + } + conn, err := DialTCP(ctx, raddr, d.config) if err != nil { return nil, errors.Trace(err) } return conn, nil + + case "udp", "udp4", "udp6": + + udpConn, _, err := NewUDPConn(ctx, network, true, laddr, raddr, d.config) + if err != nil { + return nil, errors.Trace(err) + } + // Ensure blocked packet writes eventually timeout. + conn := &common.WriteTimeoutUDPConn{ + UDPConn: udpConn, + } + return conn, nil + default: return nil, errors.Tracef("unsupported network: %s", network) } @@ -367,14 +381,14 @@ func UntunneledResolveIP( ctx context.Context, config *Config, resolver *resolver.Resolver, - hostname, + hostname string, frontingProviderID string) ([]net.IP, error) { // Limitations: for untunneled resolves, there is currently no resolve // parameter replay, and no support for pre-resolved IPs. params, err := resolver.MakeResolveParameters( - config.GetParameters().Get(), frontingProviderID) + config.GetParameters().Get(), frontingProviderID, hostname) if err != nil { return nil, errors.Trace(err) } diff --git a/psiphon/notice.go b/psiphon/notice.go index b7c6cfdef..a559df8c3 100644 --- a/psiphon/notice.go +++ b/psiphon/notice.go @@ -24,6 +24,7 @@ import ( "encoding/json" "fmt" "io" + "net" "os" "sort" "strings" @@ -564,26 +565,27 @@ func noticeWithDialParameters(noticeType string, dialParams *DialParameters, pos if dialParams.ResolveParameters != nil { - if dialParams.ResolveParameters.PreresolvedIPAddress != "" { - nonredacted := common.EscapeRedactIPAddressString(dialParams.ResolveParameters.PreresolvedIPAddress) - args = append(args, "DNSPreresolved", nonredacted) - - } else { - - // See dialParams.ResolveParameters comment in getBaseAPIParameters. + // See dialParams.ResolveParameters comment in getBaseAPIParameters. - if dialParams.ResolveParameters.PreferAlternateDNSServer { - nonredacted := common.EscapeRedactIPAddressString(dialParams.ResolveParameters.AlternateDNSServer) - args = append(args, "DNSPreferred", nonredacted) + if dialParams.ResolveParameters.PreresolvedIPAddress != "" { + meekDialDomain, _, _ := net.SplitHostPort(dialParams.MeekDialAddress) + if dialParams.ResolveParameters.PreresolvedDomain == meekDialDomain { + nonredacted := common.EscapeRedactIPAddressString(dialParams.ResolveParameters.PreresolvedIPAddress) + args = append(args, "DNSPreresolved", nonredacted) } + } - if dialParams.ResolveParameters.ProtocolTransformName != "" { - args = append(args, "DNSTransform", dialParams.ResolveParameters.ProtocolTransformName) - } + if dialParams.ResolveParameters.PreferAlternateDNSServer { + nonredacted := common.EscapeRedactIPAddressString(dialParams.ResolveParameters.AlternateDNSServer) + args = append(args, "DNSPreferred", nonredacted) + } - if postDial { - args = append(args, "DNSAttempt", dialParams.ResolveParameters.GetFirstAttemptWithAnswer()) - } + if dialParams.ResolveParameters.ProtocolTransformName != "" { + args = append(args, "DNSTransform", dialParams.ResolveParameters.ProtocolTransformName) + } + + if postDial { + args = append(args, "DNSAttempt", dialParams.ResolveParameters.GetFirstAttemptWithAnswer()) } } diff --git a/psiphon/serverApi.go b/psiphon/serverApi.go index e33e19608..f9374942b 100644 --- a/psiphon/serverApi.go +++ b/psiphon/serverApi.go @@ -1075,51 +1075,57 @@ func getBaseAPIParameters( if dialParams.ResolveParameters != nil { + // Log enough information to distinguish several successful or + // failed circumvention cases of interest, including preferring + // alternate servers and/or using DNS protocol transforms, and + // appropriate for both handshake and failed_tunnel logging: + // + // - The initial attempt made by Resolver.ResolveIP, + // preferring an alternate DNS server and/or using a + // protocol transform succeeds (dns_result = 0, the initial + // attempt, 0, got the first result). + // + // - A second attempt may be used, still preferring an + // alternate DNS server but no longer using the protocol + // transform, which presumably failed (dns_result = 1, the + // second attempt, 1, got the first result). + // + // - Subsequent attempts will use the system DNS server and no + // protocol transforms (dns_result > 2). + // + // Due to the design of Resolver.ResolveIP, the notion + // of "success" is approximate; for example a successful + // response may arrive after a subsequent attempt succeeds, + // simply due to slow network conditions. It's also possible + // that, for a given attemp, only one of the two concurrent + // requests (A and AAAA) succeeded. + // + // Note that ResolveParameters.GetFirstAttemptWithAnswer + // semantics assume that dialParams.ResolveParameters wasn't + // used by or modified by any other dial. + // + // Some protocols may use both preresolved DNS as well as actual + // DNS requests, such as Conjure with the DTLS transport, which + // may resolve STUN server domains while using preresolved DNS + // for fronted API registration. + if dialParams.ResolveParameters.PreresolvedIPAddress != "" { - params["dns_preresolved"] = dialParams.ResolveParameters.PreresolvedIPAddress - - } else { - - // Log enough information to distinguish several successful or - // failed circumvention cases of interest, including preferring - // alternate servers and/or using DNS protocol transforms, and - // appropriate for both handshake and failed_tunnel logging: - // - // - The initial attempt made by Resolver.ResolveIP, - // preferring an alternate DNS server and/or using a - // protocol transform succeeds (dns_result = 0, the initial - // attempt, 0, got the first result). - // - // - A second attempt may be used, still preferring an - // alternate DNS server but no longer using the protocol - // transform, which presumably failed (dns_result = 1, the - // second attempt, 1, got the first result). - // - // - Subsequent attempts will use the system DNS server and no - // protocol transforms (dns_result > 2). - // - // Due to the design of Resolver.ResolveIP, the notion - // of "success" is approximate; for example a successful - // response may arrive after a subsequent attempt succeeds, - // simply due to slow network conditions. It's also possible - // that, for a given attemp, only one of the two concurrent - // requests (A and AAAA) succeeded. - // - // Note that ResolveParameters.GetFirstAttemptWithAnswer - // semantics assume that dialParams.ResolveParameters wasn't - // used by or modified by any other dial. - - if dialParams.ResolveParameters.PreferAlternateDNSServer { - params["dns_preferred"] = dialParams.ResolveParameters.AlternateDNSServer + meekDialDomain, _, _ := net.SplitHostPort(dialParams.MeekDialAddress) + if dialParams.ResolveParameters.PreresolvedDomain == meekDialDomain { + params["dns_preresolved"] = dialParams.ResolveParameters.PreresolvedIPAddress } + } - if dialParams.ResolveParameters.ProtocolTransformName != "" { - params["dns_transform"] = dialParams.ResolveParameters.ProtocolTransformName - } + if dialParams.ResolveParameters.PreferAlternateDNSServer { + params["dns_preferred"] = dialParams.ResolveParameters.AlternateDNSServer + } - params["dns_attempt"] = strconv.Itoa( - dialParams.ResolveParameters.GetFirstAttemptWithAnswer()) + if dialParams.ResolveParameters.ProtocolTransformName != "" { + params["dns_transform"] = dialParams.ResolveParameters.ProtocolTransformName } + + params["dns_attempt"] = strconv.Itoa( + dialParams.ResolveParameters.GetFirstAttemptWithAnswer()) } if dialParams.HTTPTransformerParameters != nil { diff --git a/psiphon/tunnel.go b/psiphon/tunnel.go index 958e765f6..fc3d45f3e 100644 --- a/psiphon/tunnel.go +++ b/psiphon/tunnel.go @@ -692,6 +692,9 @@ func dialTunnel( tlsOSSHApplyTrafficShaping := p.WeightedCoinFlip(parameters.TLSTunnelTrafficShapingProbability) tlsOSSHMinTLSPadding := p.Int(parameters.TLSTunnelMinTLSPadding) tlsOSSHMaxTLSPadding := p.Int(parameters.TLSTunnelMaxTLSPadding) + conjureEnableIPv6Dials := p.Bool(parameters.ConjureEnableIPv6Dials) + conjureEnablePortRandomization := p.Bool(parameters.ConjureEnablePortRandomization) + conjureEnableRegistrationOverrides := p.Bool(parameters.ConjureEnableRegistrationOverrides) p.Close() // Ensure that, unless the base context is cancelled, any replayed dial @@ -775,9 +778,7 @@ func dialTunnel( } else if protocol.TunnelProtocolUsesQUIC(dialParams.TunnelProtocol) { packetConn, remoteAddr, err := NewUDPConn( - ctx, - dialParams.DirectDialAddress, - dialParams.GetDialConfig()) + ctx, "udp", false, "", dialParams.DirectDialAddress, dialParams.GetDialConfig()) if err != nil { return nil, errors.Trace(err) } @@ -803,7 +804,7 @@ func dialTunnel( ctx, config.EmitRefractionNetworkingLogs, config.GetPsiphonDataDirectory(), - NewNetDialer(dialParams.GetDialConfig()), + NewRefractionNetworkingDialer(dialParams.GetDialConfig()).DialContext, dialParams.DirectDialAddress) if err != nil { return nil, errors.Trace(err) @@ -834,11 +835,15 @@ func dialTunnel( cacheKey := dialParams.NetworkID + "-" + diagnosticID conjureConfig := &refraction.ConjureConfig{ - RegistrationCacheTTL: dialParams.ConjureCachedRegistrationTTL, - RegistrationCacheKey: cacheKey, - Transport: dialParams.ConjureTransport, - DiagnosticID: diagnosticID, - Logger: NoticeCommonLogger(), + RegistrationCacheTTL: dialParams.ConjureCachedRegistrationTTL, + RegistrationCacheKey: cacheKey, + EnableIPv6Dials: conjureEnableIPv6Dials, + EnablePortRandomization: conjureEnablePortRandomization, + EnableRegistrationOverrides: conjureEnableRegistrationOverrides, + Transport: dialParams.ConjureTransport, + STUNServerAddress: dialParams.ConjureSTUNServerAddress, + DiagnosticID: diagnosticID, + Logger: NoticeCommonLogger(), } // Set extraFailureAction, which is invoked whenever the tunnel fails (i.e., @@ -928,8 +933,7 @@ func dialTunnel( // the decoy registrar connection, like Tapdance, is not, so force it off. // Any tunnel fragmentation metrics will refer to the "phantom" connection // only. - conjureConfig.DecoyRegistrarDialer = NewNetDialer( - dialParams.GetDialConfig().WithoutFragmentor()) + conjureConfig.DoDecoyRegistration = true conjureConfig.DecoyRegistrarWidth = dialParams.ConjureDecoyRegistrarWidth conjureConfig.DecoyRegistrarDelay = dialParams.ConjureDecoyRegistrarDelay } @@ -938,7 +942,7 @@ func dialTunnel( ctx, config.EmitRefractionNetworkingLogs, config.GetPsiphonDataDirectory(), - NewNetDialer(dialParams.GetDialConfig()), + NewRefractionNetworkingDialer(dialParams.GetDialConfig()).DialContext, dialParams.DirectDialAddress, conjureConfig) if err != nil { From 14bcfa346c5ab8da8f572495ec3dcd96642a9725 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Fri, 27 Oct 2023 12:13:36 -0400 Subject: [PATCH 02/29] Fixes - Resolve !PSIPHON_ENABLE_REFRACTION_NETWORKING compile error - Explicitly log IPv4/IPv6 network type - Log new stats in psiphond - Add missing hash field names in Config.makeConfigParameters --- psiphon/common/refraction/config.go | 5 +++++ psiphon/common/refraction/refraction.go | 12 ++++++------ psiphon/common/refraction/refraction_disabled.go | 6 +++--- psiphon/config.go | 12 ++++++------ psiphon/server/api.go | 4 ++++ 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/psiphon/common/refraction/config.go b/psiphon/common/refraction/config.go index 68ff9a660..b5f63e8be 100644 --- a/psiphon/common/refraction/config.go +++ b/psiphon/common/refraction/config.go @@ -20,6 +20,8 @@ package refraction import ( + "context" + "net" "net/http" "time" @@ -111,3 +113,6 @@ type ConjureConfig struct { // Logger is used for logging diagnostics. Logger common.Logger } + +// Dialer is the dialer function type expected by gotapdance. +type Dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index e69ce8d1a..714ea72d1 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -179,9 +179,6 @@ func (c *stationConn) GetMetrics() common.LogFields { return logFields } -// Dialer is the dialer function type expected by gotapdance. -type Dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) - // DialTapDance establishes a new TapDance connection to a TapDance station // specified in the config assets and forwarding through to the Psiphon server // specified by address. @@ -1025,10 +1022,13 @@ func (conn *refractionConn) GetMetrics() common.LogFields { logFields["conjure_stun"] = conn.conjureMetricSTUNServerAddress } - logFields["conjure_network"] = conn.RemoteAddr().Network() - - _, port, err := net.SplitHostPort(conn.RemoteAddr().String()) + host, port, err := net.SplitHostPort(conn.RemoteAddr().String()) if err == nil { + network := "IPv4" + if IP := net.ParseIP(host); IP != nil && IP.To4() == nil { + network = "IPv6" + } + logFields["conjure_network"] = network logFields["conjure_port_number"] = port } } diff --git a/psiphon/common/refraction/refraction_disabled.go b/psiphon/common/refraction/refraction_disabled.go index 69424fe9c..38b35ad08 100644 --- a/psiphon/common/refraction/refraction_disabled.go +++ b/psiphon/common/refraction/refraction_disabled.go @@ -1,3 +1,4 @@ +//go:build !PSIPHON_ENABLE_REFRACTION_NETWORKING // +build !PSIPHON_ENABLE_REFRACTION_NETWORKING /* @@ -25,7 +26,6 @@ import ( "context" "net" - "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors" ) @@ -45,12 +45,12 @@ func Listen(_ string) (net.Listener, error) { } // DialTapDance establishes a new Tapdance connection to a Tapdance station. -func DialTapDance(_ context.Context, _ bool, _ string, _ common.NetDialer, _ string) (net.Conn, error) { +func DialTapDance(_ context.Context, _ bool, _ string, _ Dialer, _ string) (net.Conn, error) { return nil, errors.TraceNew("operation is not enabled") } // DialConjure establishes a new Conjure connection to a Conjure station. -func DialConjure(_ context.Context, _ bool, _ string, _ common.NetDialer, _ string, _ *ConjureConfig) (net.Conn, error) { +func DialConjure(_ context.Context, _ bool, _ string, _ Dialer, _ string, _ *ConjureConfig) (net.Conn, error) { return nil, errors.TraceNew("operation is not enabled") } diff --git a/psiphon/config.go b/psiphon/config.go index 0b3fd5731..8f8af9ee4 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -2472,7 +2472,7 @@ func (config *Config) setDialParametersHash() { } if config.DNSResolverProtocolTransformScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("DNSResolverProtocolTransformScopedSpecNames")) encodedDNSResolverProtocolTransformScopedSpecNames, _ := json.Marshal(config.DNSResolverProtocolTransformScopedSpecNames) hash.Write(encodedDNSResolverProtocolTransformScopedSpecNames) @@ -2506,7 +2506,7 @@ func (config *Config) setDialParametersHash() { } if config.DirectHTTPProtocolTransformScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("DirectHTTPProtocolTransformScopedSpecNames")) encodedDirectHTTPProtocolTransformScopedSpecNames, _ := json.Marshal(config.DirectHTTPProtocolTransformScopedSpecNames) hash.Write(encodedDirectHTTPProtocolTransformScopedSpecNames) @@ -2525,7 +2525,7 @@ func (config *Config) setDialParametersHash() { } if config.FrontedHTTPProtocolTransformScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("FrontedHTTPProtocolTransformScopedSpecNames")) encodedFrontedHTTPProtocolTransformScopedSpecNames, _ := json.Marshal(config.FrontedHTTPProtocolTransformScopedSpecNames) hash.Write(encodedFrontedHTTPProtocolTransformScopedSpecNames) @@ -2544,7 +2544,7 @@ func (config *Config) setDialParametersHash() { } if config.OSSHObfuscatorSeedTransformScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("OSSHObfuscatorSeedTransformScopedSpecNames")) encodedOSSHObfuscatorSeedTransformScopedSpecNames, _ := json.Marshal(config.OSSHObfuscatorSeedTransformScopedSpecNames) hash.Write(encodedOSSHObfuscatorSeedTransformScopedSpecNames) @@ -2563,7 +2563,7 @@ func (config *Config) setDialParametersHash() { } if config.ObfuscatedQUICNonceTransformScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("ObfuscatedQUICNonceTransformScopedSpecNames")) encodedObfuscatedQUICNonceTransformScopedSpecNames, _ := json.Marshal(config.ObfuscatedQUICNonceTransformScopedSpecNames) hash.Write(encodedObfuscatedQUICNonceTransformScopedSpecNames) @@ -2581,7 +2581,7 @@ func (config *Config) setDialParametersHash() { } if config.OSSHPrefixScopedSpecNames != nil { - hash.Write([]byte("")) + hash.Write([]byte("OSSHPrefixScopedSpecNames")) encodedOSSHPrefixScopedSpecNames, _ := json.Marshal(config.OSSHPrefixScopedSpecNames) hash.Write(encodedOSSHPrefixScopedSpecNames) } diff --git a/psiphon/server/api.go b/psiphon/server/api.go index 94aabec12..2afaead05 100644 --- a/psiphon/server/api.go +++ b/psiphon/server/api.go @@ -939,6 +939,10 @@ var baseDialParams = []requestParamSpec{ {"conjure_cached", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, {"conjure_delay", isIntString, requestParamOptional | requestParamLogStringAsInt}, {"conjure_transport", isAnyString, requestParamOptional}, + {"conjure_prefix", isAnyString, requestParamOptional}, + {"conjure_stun", isAnyString, requestParamOptional}, + {"conjure_network", isAnyString, requestParamOptional}, + {"conjure_port_number", isAnyString, requestParamOptional}, {"split_tunnel", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, {"split_tunnel_regions", isRegionCode, requestParamOptional | requestParamArray}, {"dns_preresolved", isAnyString, requestParamOptional}, From a94404b7f065cce9ad3a550b686c5b02979ce03b Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Fri, 27 Oct 2023 12:27:11 -0400 Subject: [PATCH 03/29] Vendor dependencies --- vendor/github.com/BurntSushi/toml/.gitignore | 7 +- vendor/github.com/BurntSushi/toml/.travis.yml | 15 - vendor/github.com/BurntSushi/toml/COMPATIBLE | 3 - vendor/github.com/BurntSushi/toml/Makefile | 19 - vendor/github.com/BurntSushi/toml/README.md | 230 +- vendor/github.com/BurntSushi/toml/decode.go | 505 +- .../BurntSushi/toml/decode_go116.go | 19 + .../github.com/BurntSushi/toml/deprecated.go | 29 + vendor/github.com/BurntSushi/toml/doc.go | 36 +- vendor/github.com/BurntSushi/toml/encode.go | 621 +- .../BurntSushi/toml/encoding_types.go | 19 - .../BurntSushi/toml/encoding_types_1.1.go | 18 - vendor/github.com/BurntSushi/toml/error.go | 279 + .../github.com/BurntSushi/toml/internal/tz.go | 36 + vendor/github.com/BurntSushi/toml/lex.go | 846 +- .../toml/{decode_meta.go => meta.go} | 124 +- vendor/github.com/BurntSushi/toml/parse.go | 715 +- vendor/github.com/BurntSushi/toml/session.vim | 1 - .../github.com/BurntSushi/toml/type_fields.go | 4 +- .../toml/{type_check.go => type_toml.go} | 23 +- .../agl/ed25519/extra25519/extra25519.go | 340 - vendor/github.com/dchest/siphash/.travis.yml | 10 - vendor/github.com/dchest/siphash/README.md | 2 - vendor/github.com/dchest/siphash/blocks.go | 1 + .../github.com/dchest/siphash/blocks_amd64.s | 1 + .../github.com/dchest/siphash/blocks_asm.go | 1 + vendor/github.com/dchest/siphash/hash.go | 1 + vendor/github.com/dchest/siphash/hash128.go | 2 + .../github.com/dchest/siphash/hash128_amd64.s | 12 +- vendor/github.com/dchest/siphash/hash_amd64.s | 12 +- vendor/github.com/dchest/siphash/hash_arm.go | 1 + vendor/github.com/dchest/siphash/hash_asm.go | 1 + vendor/github.com/flynn/noise/CONTRIBUTING.md | 1 + .../ed25519 => flynn/noise}/LICENSE | 6 +- vendor/github.com/flynn/noise/README.md | 5 + vendor/github.com/flynn/noise/cipher_suite.go | 224 + vendor/github.com/flynn/noise/hkdf.go | 49 + vendor/github.com/flynn/noise/patterns.go | 141 + vendor/github.com/flynn/noise/state.go | 600 + vendor/github.com/flynn/noise/vectors.txt | 28640 ++++++++++++++++ .../gaukas/godicttls/exttype_values.go | 7 +- .../gaukas/godicttls/quic_frame_types.go | 112 + .../godicttls/quic_transport_error_codes.go | 70 + .../godicttls/quic_transport_parameters.go | 91 + .../github.com/google/go-cmp/cmp/compare.go | 64 +- .../google/go-cmp/cmp/internal/diff/diff.go | 44 +- .../google/go-cmp/cmp/internal/value/zero.go | 48 - .../github.com/google/go-cmp/cmp/options.go | 10 +- vendor/github.com/google/go-cmp/cmp/path.go | 20 +- .../google/go-cmp/cmp/report_compare.go | 10 +- .../google/go-cmp/cmp/report_reflect.go | 11 +- .../google/go-cmp/cmp/report_slices.go | 25 +- .../google/go-cmp/cmp/report_text.go | 1 + .../google/gopacket/layers/enums.go | 2 + .../google/gopacket/layers/erspan2.go | 86 + .../google/gopacket/layers/layertypes.go | 2 + .../github.com/google/gopacket/layers/lldp.go | 14 +- .../google/gopacket/layers/ports.go | 1 + .../google/gopacket/layers/radius.go | 560 + .../github.com/google/gopacket/layers/sip.go | 20 +- .../github.com/google/gopacket/layers/tls.go | 18 +- .../hashicorp/golang-lru/.golangci.yml | 30 + vendor/github.com/hashicorp/golang-lru/2q.go | 3 +- .../github.com/hashicorp/golang-lru/LICENSE | 2 + .../github.com/hashicorp/golang-lru/README.md | 26 +- vendor/github.com/hashicorp/golang-lru/arc.go | 1 - vendor/github.com/hashicorp/golang-lru/lru.go | 181 +- .../hashicorp/golang-lru/simplelru/lru.go | 22 +- .../golang-lru/simplelru/lru_interface.go | 49 +- .../hashicorp/golang-lru/testing.go | 16 + .../github.com/klauspost/compress/README.md | 6 + .../github.com/klauspost/compress/SECURITY.md | 2 +- .../klauspost/compress/zstd/enc_base.go | 1 + .../klauspost/compress/zstd/enc_dfast.go | 2 +- .../klauspost/compress/zstd/enc_fast.go | 11 +- vendor/github.com/libp2p/go-reuseport/LICENSE | 13 + .../github.com/libp2p/go-reuseport/README.md | 48 + vendor/github.com/libp2p/go-reuseport/addr.go | 20 + .../libp2p/go-reuseport/codecov.yml | 3 + .../libp2p/go-reuseport/control_freebsd.go | 27 + .../libp2p/go-reuseport/control_plan9.go | 9 + .../libp2p/go-reuseport/control_unix.go | 23 + .../libp2p/go-reuseport/control_wasm.go | 11 + .../libp2p/go-reuseport/control_windows.go | 17 + .../libp2p/go-reuseport/interface.go | 72 + .../libp2p/go-reuseport/version.json | 3 + .../github.com/mroth/weightedrand/README.md | 8 +- .../oschwald/maxminddb-golang/.golangci.toml | 452 + .../oschwald/maxminddb-golang/.travis.yml | 23 - .../oschwald/maxminddb-golang/README.md | 4 +- .../oschwald/maxminddb-golang/appveyor.yml | 19 - .../oschwald/maxminddb-golang/decoder.go | 428 +- .../oschwald/maxminddb-golang/deserializer.go | 31 + .../oschwald/maxminddb-golang/errors.go | 8 +- .../oschwald/maxminddb-golang/mmap_unix.go | 9 +- .../oschwald/maxminddb-golang/mmap_windows.go | 1 + .../oschwald/maxminddb-golang/node.go | 58 + .../oschwald/maxminddb-golang/reader.go | 232 +- .../maxminddb-golang/reader_appengine.go | 26 - .../maxminddb-golang/reader_memory.go | 26 + .../oschwald/maxminddb-golang/reader_mmap.go | 64 + .../oschwald/maxminddb-golang/reader_other.go | 61 - .../oschwald/maxminddb-golang/set_zero_120.go | 10 + .../maxminddb-golang/set_zero_pre120.go | 10 + .../oschwald/maxminddb-golang/traverse.go | 200 +- .../oschwald/maxminddb-golang/verifier.go | 38 +- .../pelletier/go-toml/.dockerignore | 2 + .../github.com/pelletier/go-toml/.gitignore | 5 + .../pelletier/go-toml/CONTRIBUTING.md | 132 + .../github.com/pelletier/go-toml/Dockerfile | 11 + vendor/github.com/pelletier/go-toml/LICENSE | 247 + vendor/github.com/pelletier/go-toml/Makefile | 29 + .../go-toml/PULL_REQUEST_TEMPLATE.md | 5 + vendor/github.com/pelletier/go-toml/README.md | 176 + .../github.com/pelletier/go-toml/SECURITY.md | 19 + .../pelletier/go-toml/azure-pipelines.yml | 188 + .../github.com/pelletier/go-toml/benchmark.sh | 35 + vendor/github.com/pelletier/go-toml/doc.go | 23 + .../pelletier/go-toml/example-crlf.toml | 30 + .../github.com/pelletier/go-toml/example.toml | 30 + vendor/github.com/pelletier/go-toml/fuzz.go | 31 + vendor/github.com/pelletier/go-toml/fuzz.sh | 15 + .../pelletier/go-toml/keysparsing.go | 112 + vendor/github.com/pelletier/go-toml/lexer.go | 1031 + .../github.com/pelletier/go-toml/localtime.go | 287 + .../github.com/pelletier/go-toml/marshal.go | 1308 + .../go-toml/marshal_OrderPreserve_test.toml | 39 + .../pelletier/go-toml/marshal_test.toml | 39 + vendor/github.com/pelletier/go-toml/parser.go | 507 + .../github.com/pelletier/go-toml/position.go | 29 + vendor/github.com/pelletier/go-toml/token.go | 136 + vendor/github.com/pelletier/go-toml/toml.go | 533 + .../github.com/pelletier/go-toml/tomlpub.go | 71 + .../pelletier/go-toml/tomltree_create.go | 155 + .../pelletier/go-toml/tomltree_write.go | 552 + .../pelletier/go-toml/tomltree_writepub.go | 6 + vendor/github.com/pion/dtls/v2/.editorconfig | 23 + vendor/github.com/pion/dtls/v2/.gitignore | 28 + vendor/github.com/pion/dtls/v2/.golangci.yml | 140 + .../github.com/pion/dtls/v2/.goreleaser.yml | 5 + vendor/github.com/pion/dtls/v2/AUTHORS.txt | 57 + vendor/github.com/pion/dtls/v2/LICENSE | 9 + vendor/github.com/pion/dtls/v2/README.md | 173 + vendor/github.com/pion/dtls/v2/certificate.go | 161 + .../github.com/pion/dtls/v2/cipher_suite.go | 276 + .../pion/dtls/v2/cipher_suite_go114.go | 44 + vendor/github.com/pion/dtls/v2/codecov.yml | 22 + .../pion/dtls/v2/compression_method.go | 12 + vendor/github.com/pion/dtls/v2/config.go | 257 + vendor/github.com/pion/dtls/v2/conn.go | 1033 + vendor/github.com/pion/dtls/v2/crypto.go | 228 + vendor/github.com/pion/dtls/v2/dtls.go | 5 + vendor/github.com/pion/dtls/v2/errors.go | 157 + .../github.com/pion/dtls/v2/errors_errno.go | 22 + .../github.com/pion/dtls/v2/errors_noerrno.go | 18 + vendor/github.com/pion/dtls/v2/flight.go | 104 + .../github.com/pion/dtls/v2/flight0handler.go | 138 + .../github.com/pion/dtls/v2/flight1handler.go | 145 + .../github.com/pion/dtls/v2/flight2handler.go | 64 + .../github.com/pion/dtls/v2/flight3handler.go | 291 + .../pion/dtls/v2/flight4bhandler.go | 144 + .../github.com/pion/dtls/v2/flight4handler.go | 403 + .../pion/dtls/v2/flight5bhandler.go | 78 + .../github.com/pion/dtls/v2/flight5handler.go | 357 + .../github.com/pion/dtls/v2/flight6handler.go | 85 + .../github.com/pion/dtls/v2/flighthandler.go | 68 + .../pion/dtls/v2/fragment_buffer.go | 132 + .../pion/dtls/v2/handshake_cache.go | 172 + vendor/github.com/pion/dtls/v2/handshaker.go | 351 + .../v2/internal/ciphersuite/aes_128_ccm.go | 33 + .../v2/internal/ciphersuite/aes_256_ccm.go | 33 + .../dtls/v2/internal/ciphersuite/aes_ccm.go | 113 + .../v2/internal/ciphersuite/ciphersuite.go | 98 + .../tls_ecdhe_ecdsa_with_aes_128_ccm.go | 14 + .../tls_ecdhe_ecdsa_with_aes_128_ccm8.go | 14 + ...tls_ecdhe_ecdsa_with_aes_128_gcm_sha256.go | 108 + .../tls_ecdhe_ecdsa_with_aes_256_cbc_sha.go | 114 + ...tls_ecdhe_ecdsa_with_aes_256_gcm_sha384.go | 39 + .../tls_ecdhe_psk_with_aes_128_cbc_sha256.go | 118 + .../tls_ecdhe_rsa_with_aes_128_gcm_sha256.go | 25 + .../tls_ecdhe_rsa_with_aes_256_cbc_sha.go | 25 + .../tls_ecdhe_rsa_with_aes_256_gcm_sha384.go | 25 + .../tls_psk_with_aes_128_cbc_sha256.go | 113 + .../ciphersuite/tls_psk_with_aes_128_ccm.go | 14 + .../ciphersuite/tls_psk_with_aes_128_ccm8.go | 14 + .../tls_psk_with_aes_128_gcm_sha256.go | 35 + .../ciphersuite/tls_psk_with_aes_256_ccm8.go | 14 + .../ciphersuite/types/authentication_type.go | 14 + .../types/key_exchange_algorithm.go | 20 + .../pion/dtls/v2/internal/closer/closer.go | 48 + .../pion/dtls/v2/internal/util/util.go | 42 + vendor/github.com/pion/dtls/v2/listener.go | 83 + vendor/github.com/pion/dtls/v2/packet.go | 12 + .../pion/dtls/v2/pkg/crypto/ccm/ccm.go | 254 + .../dtls/v2/pkg/crypto/ciphersuite/cbc.go | 177 + .../dtls/v2/pkg/crypto/ciphersuite/ccm.go | 107 + .../v2/pkg/crypto/ciphersuite/ciphersuite.go | 76 + .../dtls/v2/pkg/crypto/ciphersuite/gcm.go | 103 + .../clientcertificate/client_certificate.go | 25 + .../dtls/v2/pkg/crypto/elliptic/elliptic.go | 115 + .../pion/dtls/v2/pkg/crypto/hash/hash.go | 129 + .../pion/dtls/v2/pkg/crypto/prf/prf.go | 255 + .../dtls/v2/pkg/crypto/signature/signature.go | 27 + .../v2/pkg/crypto/signaturehash/errors.go | 12 + .../pkg/crypto/signaturehash/signaturehash.go | 96 + .../pion/dtls/v2/pkg/protocol/alert/alert.go | 166 + .../dtls/v2/pkg/protocol/application_data.go | 29 + .../v2/pkg/protocol/change_cipher_spec.go | 30 + .../v2/pkg/protocol/compression_method.go | 51 + .../pion/dtls/v2/pkg/protocol/content.go | 24 + .../pion/dtls/v2/pkg/protocol/errors.go | 109 + .../dtls/v2/pkg/protocol/extension/alpn.go | 80 + .../dtls/v2/pkg/protocol/extension/errors.go | 20 + .../v2/pkg/protocol/extension/extension.go | 102 + .../protocol/extension/renegotiation_info.go | 46 + .../v2/pkg/protocol/extension/server_name.go | 81 + .../extension/srtp_protection_profile.go | 24 + .../extension/supported_elliptic_curves.go | 65 + .../extension/supported_point_formats.go | 65 + .../supported_signature_algorithms.go | 73 + .../protocol/extension/use_master_secret.go | 48 + .../v2/pkg/protocol/extension/use_srtp.go | 62 + .../v2/pkg/protocol/handshake/cipher_suite.go | 32 + .../dtls/v2/pkg/protocol/handshake/errors.go | 28 + .../v2/pkg/protocol/handshake/handshake.go | 150 + .../dtls/v2/pkg/protocol/handshake/header.go | 53 + .../protocol/handshake/message_certificate.go | 69 + .../handshake/message_certificate_request.go | 144 + .../handshake/message_certificate_verify.go | 64 + .../handshake/message_client_hello.go | 141 + .../handshake/message_client_key_exchange.go | 81 + .../protocol/handshake/message_finished.go | 30 + .../handshake/message_hello_verify_request.go | 65 + .../handshake/message_server_hello.go | 122 + .../handshake/message_server_hello_done.go | 24 + .../handshake/message_server_key_exchange.go | 148 + .../dtls/v2/pkg/protocol/handshake/random.go | 52 + .../v2/pkg/protocol/recordlayer/errors.go | 19 + .../v2/pkg/protocol/recordlayer/header.go | 64 + .../pkg/protocol/recordlayer/recordlayer.go | 102 + .../pion/dtls/v2/pkg/protocol/version.go | 24 + vendor/github.com/pion/dtls/v2/renovate.json | 6 + vendor/github.com/pion/dtls/v2/resume.go | 22 + vendor/github.com/pion/dtls/v2/session.go | 24 + .../pion/dtls/v2/srtp_protection_profile.go | 17 + vendor/github.com/pion/dtls/v2/state.go | 216 + .../github.com/pion/dtls/v2/state_getters.go | 11 + vendor/github.com/pion/dtls/v2/util.go | 41 + vendor/github.com/pion/logging/.golangci.yml | 13 + vendor/github.com/pion/logging/.travis.yml | 19 + vendor/github.com/pion/logging/LICENSE | 21 + vendor/github.com/pion/logging/README.md | 41 + vendor/github.com/pion/logging/logger.go | 228 + vendor/github.com/pion/logging/scoped.go | 72 + vendor/github.com/pion/randutil/.travis.yml | 142 + vendor/github.com/pion/randutil/LICENSE | 21 + vendor/github.com/pion/randutil/README.md | 14 + vendor/github.com/pion/randutil/codecov.yml | 20 + vendor/github.com/pion/randutil/crypto.go | 30 + vendor/github.com/pion/randutil/math.go | 72 + vendor/github.com/pion/randutil/renovate.json | 15 + vendor/github.com/pion/sctp/.gitignore | 28 + vendor/github.com/pion/sctp/.golangci.yml | 137 + vendor/github.com/pion/sctp/.goreleaser.yml | 5 + vendor/github.com/pion/sctp/AUTHORS.txt | 35 + vendor/github.com/pion/sctp/LICENSE | 9 + vendor/github.com/pion/sctp/README.md | 34 + vendor/github.com/pion/sctp/ack_timer.go | 108 + vendor/github.com/pion/sctp/association.go | 2584 ++ .../github.com/pion/sctp/association_stats.go | 64 + vendor/github.com/pion/sctp/chunk.go | 12 + vendor/github.com/pion/sctp/chunk_abort.go | 96 + .../github.com/pion/sctp/chunk_cookie_ack.go | 53 + .../github.com/pion/sctp/chunk_cookie_echo.go | 54 + vendor/github.com/pion/sctp/chunk_error.go | 103 + .../github.com/pion/sctp/chunk_forward_tsn.go | 151 + .../github.com/pion/sctp/chunk_heartbeat.go | 86 + .../pion/sctp/chunk_heartbeat_ack.go | 96 + vendor/github.com/pion/sctp/chunk_init.go | 138 + vendor/github.com/pion/sctp/chunk_init_ack.go | 140 + .../github.com/pion/sctp/chunk_init_common.go | 164 + .../pion/sctp/chunk_payload_data.go | 208 + vendor/github.com/pion/sctp/chunk_reconfig.go | 108 + .../pion/sctp/chunk_selective_ack.go | 151 + vendor/github.com/pion/sctp/chunk_shutdown.go | 72 + .../pion/sctp/chunk_shutdown_ack.go | 53 + .../pion/sctp/chunk_shutdown_complete.go | 53 + vendor/github.com/pion/sctp/chunkheader.go | 100 + vendor/github.com/pion/sctp/chunktype.go | 70 + vendor/github.com/pion/sctp/codecov.yml | 22 + vendor/github.com/pion/sctp/control_queue.go | 32 + vendor/github.com/pion/sctp/error_cause.go | 101 + .../pion/sctp/error_cause_header.go | 50 + ...error_cause_invalid_mandatory_parameter.go | 22 + .../sctp/error_cause_protocol_violation.go | 57 + .../error_cause_unrecognized_chunk_type.go | 31 + .../sctp/error_cause_user_initiated_abort.go | 49 + vendor/github.com/pion/sctp/packet.go | 189 + vendor/github.com/pion/sctp/param.go | 44 + .../github.com/pion/sctp/param_chunk_list.go | 31 + .../github.com/pion/sctp/param_ecn_capable.go | 22 + .../pion/sctp/param_forward_tsn_supported.go | 31 + .../pion/sctp/param_heartbeat_info.go | 24 + .../pion/sctp/param_outgoing_reset_request.go | 94 + vendor/github.com/pion/sctp/param_random.go | 24 + .../pion/sctp/param_reconfig_response.go | 98 + .../sctp/param_requested_hmac_algorithm.go | 78 + .../pion/sctp/param_state_cookie.go | 49 + .../pion/sctp/param_supported_extensions.go | 32 + vendor/github.com/pion/sctp/paramheader.go | 73 + vendor/github.com/pion/sctp/paramtype.go | 116 + vendor/github.com/pion/sctp/payload_queue.go | 182 + vendor/github.com/pion/sctp/pending_queue.go | 142 + .../github.com/pion/sctp/reassembly_queue.go | 355 + vendor/github.com/pion/sctp/renovate.json | 6 + vendor/github.com/pion/sctp/rtx_timer.go | 222 + vendor/github.com/pion/sctp/sctp.go | 5 + vendor/github.com/pion/sctp/stream.go | 467 + vendor/github.com/pion/sctp/util.go | 61 + vendor/github.com/pion/stun/.gitignore | 28 + vendor/github.com/pion/stun/.golangci.yml | 137 + vendor/github.com/pion/stun/.goreleaser.yml | 5 + vendor/github.com/pion/stun/AUTHORS.txt | 40 + vendor/github.com/pion/stun/LICENSE | 9 + vendor/github.com/pion/stun/Makefile | 39 + vendor/github.com/pion/stun/README.md | 186 + vendor/github.com/pion/stun/addr.go | 163 + vendor/github.com/pion/stun/agent.go | 233 + vendor/github.com/pion/stun/attributes.go | 254 + .../github.com/pion/stun/attributes_debug.go | 37 + vendor/github.com/pion/stun/checks.go | 53 + vendor/github.com/pion/stun/checks_debug.go | 65 + vendor/github.com/pion/stun/client.go | 722 + vendor/github.com/pion/stun/codecov.yml | 22 + vendor/github.com/pion/stun/errorcode.go | 162 + vendor/github.com/pion/stun/errors.go | 66 + vendor/github.com/pion/stun/fingerprint.go | 70 + .../github.com/pion/stun/fingerprint_debug.go | 22 + vendor/github.com/pion/stun/helpers.go | 109 + vendor/github.com/pion/stun/integrity.go | 126 + .../github.com/pion/stun/integrity_debug.go | 22 + .../pion/stun/internal/hmac/hmac.go | 156 + .../pion/stun/internal/hmac/pool.go | 92 + .../pion/stun/internal/hmac/vendor.sh | 7 + vendor/github.com/pion/stun/message.go | 622 + vendor/github.com/pion/stun/renovate.json | 6 + vendor/github.com/pion/stun/stun.go | 54 + vendor/github.com/pion/stun/textattrs.go | 132 + vendor/github.com/pion/stun/uattrs.go | 66 + vendor/github.com/pion/stun/uri.go | 257 + vendor/github.com/pion/stun/xoraddr.go | 150 + .../github.com/pion/transport/v2/.gitignore | 28 + .../pion/transport/v2/.golangci.yml | 137 + .../pion/transport/v2/.goreleaser.yml | 5 + .../github.com/pion/transport/v2/AUTHORS.txt | 29 + vendor/github.com/pion/transport/v2/LICENSE | 9 + vendor/github.com/pion/transport/v2/README.md | 34 + .../github.com/pion/transport/v2/codecov.yml | 22 + .../pion/transport/v2/connctx/connctx.go | 177 + .../pion/transport/v2/connctx/pipe.go | 14 + .../pion/transport/v2/deadline/deadline.go | 117 + vendor/github.com/pion/transport/v2/net.go | 418 + .../pion/transport/v2/packetio/buffer.go | 351 + .../pion/transport/v2/packetio/errors.go | 30 + .../pion/transport/v2/packetio/hardlimit.go | 9 + .../transport/v2/packetio/no_hardlimit.go | 9 + .../pion/transport/v2/renovate.json | 6 + .../transport/v2/replaydetector/fixedbig.go | 81 + .../v2/replaydetector/replaydetector.go | 119 + .../pion/transport/v2/stdnet/net.go | 167 + .../pion/transport/v2/udp/batchconn.go | 171 + .../github.com/pion/transport/v2/udp/conn.go | 389 + .../pion/transport/v2/utils/xor/xor_amd64.go | 29 + .../pion/transport/v2/utils/xor/xor_amd64.s | 56 + .../pion/transport/v2/utils/xor/xor_arm.go | 60 + .../pion/transport/v2/utils/xor/xor_arm.s | 116 + .../pion/transport/v2/utils/xor/xor_arm64.go | 31 + .../pion/transport/v2/utils/xor/xor_arm64.s | 69 + .../transport/v2/utils/xor/xor_generic.go | 78 + .../pion/transport/v2/utils/xor/xor_ppc64x.go | 29 + .../pion/transport/v2/utils/xor/xor_ppc64x.s | 87 + .../refraction-networking/conjure/LICENSE | 201 + .../conjure/pkg/client/assets/assets.go | 459 + .../conjure/pkg/core/core.go | 45 + .../conjure/pkg/core/interfaces/interfaces.go | 105 + .../conjure/pkg/core/keys.go | 125 + .../conjure/pkg/dtls/config.go | 18 + .../conjure/pkg/dtls/dial.go | 83 + .../conjure/pkg/dtls/heartbeat.go | 123 + .../conjure/pkg/dtls/heartbeatConfig.go | 34 + .../conjure/pkg/dtls/listener.go | 265 + .../conjure/pkg/dtls/not1reader.go | 19 + .../conjure/pkg/dtls/sctpconn.go | 259 + .../conjure/pkg/dtls/seedtocert.go | 124 + .../conjure/pkg/dtls/server.go | 80 + .../conjure/pkg/phantoms/compat.go | 244 + .../conjure/pkg/phantoms/phantom_selector.go | 189 + .../conjure/pkg/phantoms/phantoms.go | 173 + .../conjure/pkg/phantoms/station_phantoms.go | 193 + .../decoy-registrar/decoy-registrar.go | 441 + .../pkg/registrars/decoy-registrar/utils.go | 284 + .../pkg/registrars/dns-registrar/dns/dns.go | 616 + .../dns-registrar/encryption/encryption.go | 84 + .../dns-registrar/msgformat/msgformat.go | 46 + .../dns-registrar/queuepacketconn/clientid.go | 28 + .../dns-registrar/queuepacketconn/consts.go | 22 + .../queuepacketconn/queuepacketconn.go | 163 + .../dns-registrar/remotemap/remotemap.go | 152 + .../dns-registrar/requester/config.go | 63 + .../registrars/dns-registrar/requester/dns.go | 216 + .../dns-registrar/requester/http.go | 175 + .../dns-registrar/requester/requester.go | 274 + .../registrars/dns-registrar/requester/tls.go | 134 + .../dns-registrar/requester/utls.go | 270 + .../dns-registrar/requester/weightedlist.go | 201 + .../conjure/pkg/registrars/lib/registrars.go | 22 + .../registrars/registration/api-registrar.go | 241 + .../pkg/registrars/registration/config.go | 68 + .../registration/decoy-registrar.go | 17 + .../registrars/registration/dns-registrar.go | 237 + .../conjure/pkg/station/log/logger.go | 378 + .../conjure/pkg/transports/anypb_nourl.go | 35 + .../pkg/transports/client/transports.go | 141 + .../pkg/transports/connecting/dtls/client.go | 316 + .../pkg/transports/connecting/dtls/dtls.go | 191 + .../pkg/transports/connecting/dtls/nat.go | 147 + .../conjure/pkg/transports/obfuscate.go | 287 + .../conjure/pkg/transports/registration.go | 28 + .../conjure/pkg/transports/transports.go | 65 + .../pkg/transports/wrapping/min/client.go | 144 + .../pkg/transports/wrapping/min/min.go | 130 + .../pkg/transports/wrapping/obfs4/client.go | 164 + .../pkg/transports/wrapping/obfs4/keys.go | 40 + .../pkg/transports/wrapping/obfs4/obfs4.go | 222 + .../wrapping/obfs4/obfs4_license.txt | 57 + .../pkg/transports/wrapping/obfs4/utils.go | 116 + .../pkg/transports/wrapping/prefix/README.md | 155 + .../pkg/transports/wrapping/prefix/client.go | 505 + .../pkg/transports/wrapping/prefix/prefix.go | 454 + .../conjure/proto/Makefile | 24 + .../conjure/proto/README.txt | 23 + .../protobuf => conjure/proto}/extensions.go | 2 +- .../conjure/proto/mod.rs | 3 + .../conjure/proto/signalling.pb.go | 3162 ++ .../proto}/signalling.proto | 140 +- .../conjure/proto/signalling.rs | 7937 +++++ .../ed25519/LICENSE | 0 .../ed25519/edwards25519/const.go | 0 .../ed25519/edwards25519/edwards25519.go | 85 +- .../ed25519/extra25519/extra25519.go | 2 +- .../gotapdance/ed25519/edwards25519/const.go | 1411 - .../ed25519/edwards25519/edwards25519.go | 1773 - .../gotapdance/protobuf/Makefile | 28 - .../gotapdance/protobuf/README.md | 7 - .../gotapdance/protobuf/signalling.pb.go | 2227 -- .../gotapdance/tapdance/TODO | 4 - .../gotapdance/tapdance/assets.go | 44 +- .../gotapdance/tapdance/common.go | 13 +- .../gotapdance/tapdance/conjure.go | 1087 +- .../gotapdance/tapdance/conn_flow.go | 5 +- .../gotapdance/tapdance/conn_raw.go | 14 +- .../gotapdance/tapdance/dialer.go | 140 +- .../gotapdance/tapdance/interfaces.go | 21 + .../gotapdance/tapdance/logger.go | 7 + .../gotapdance/tapdance/phantoms/phantoms.go | 273 - .../tapdance/registrar_bidirectional.go | 213 - .../gotapdance/tapdance/utils.go | 17 +- .../refraction-networking/obfs4}/LICENSE | 0 .../obfs4}/common/csrand/csrand.go | 2 +- .../obfs4}/common/drbg/hash_drbg.go | 4 +- .../obfs4}/common/ntor/ntor.go | 54 +- .../obfs4}/common/probdist/weighted_dist.go | 6 +- .../common/replayfilter/replay_filter.go | 4 +- .../obfs4}/transports/base/base.go | 4 +- .../transports/obfs4/framing/framing.go | 39 +- .../obfs4}/transports/obfs4/handshake_ntor.go | 8 +- .../obfs4}/transports/obfs4/obfs4.go | 20 +- .../obfs4}/transports/obfs4/packet.go | 4 +- .../obfs4}/transports/obfs4/statefile.go | 32 +- vendor/github.com/sirupsen/logrus/README.md | 12 +- .../github.com/sirupsen/logrus/buffer_pool.go | 9 - vendor/github.com/sirupsen/logrus/entry.go | 21 +- vendor/github.com/sirupsen/logrus/logger.go | 13 + vendor/github.com/sirupsen/logrus/writer.go | 34 +- .../testify/assert/assertion_compare.go | 60 +- .../assert/assertion_compare_can_convert.go | 2 +- .../testify/assert/assertion_format.go | 224 +- .../testify/assert/assertion_forward.go | 448 +- .../testify/assert/assertion_order.go | 24 +- .../stretchr/testify/assert/assertions.go | 418 +- .../github.com/stretchr/testify/assert/doc.go | 43 +- .../testify/assert/http_assertions.go | 12 +- .../stretchr/testify/require/doc.go | 23 +- .../stretchr/testify/require/require.go | 466 +- .../testify/require/require_forward.go | 448 +- .../github.com/stretchr/testify/suite/doc.go | 59 +- .../stretchr/testify/suite/interfaces.go | 13 + .../stretchr/testify/suite/suite.go | 49 +- .../pluggable-transports/goptlib}/.gitignore | 0 .../pluggable-transports/goptlib}/COPYING | 0 .../pluggable-transports/goptlib}/ChangeLog | 17 + .../pluggable-transports/goptlib}/README | 10 +- .../pluggable-transports/goptlib}/args.go | 0 .../pluggable-transports/goptlib}/pt.go | 66 +- .../pluggable-transports/goptlib}/socks.go | 0 .../goptlib}/test_authcookie | 0 vendor/golang.org/x/crypto/blake2s/blake2s.go | 246 + .../x/crypto/blake2s/blake2s_386.go | 33 + .../golang.org/x/crypto/blake2s/blake2s_386.s | 430 + .../x/crypto/blake2s/blake2s_amd64.go | 38 + .../x/crypto/blake2s/blake2s_amd64.s | 433 + .../x/crypto/blake2s/blake2s_generic.go | 178 + .../x/crypto/blake2s/blake2s_ref.go | 18 + vendor/golang.org/x/crypto/blake2s/blake2x.go | 178 + .../golang.org/x/crypto/blake2s/register.go | 22 + .../x/crypto/chacha20/chacha_arm64.go | 4 +- .../x/crypto/chacha20/chacha_arm64.s | 4 +- .../x/crypto/chacha20/chacha_noasm.go | 4 +- .../golang.org/x/crypto/cryptobyte/builder.go | 5 + .../golang.org/x/crypto/cryptobyte/string.go | 11 + vendor/golang.org/x/crypto/sha3/sha3.go | 14 +- vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 10 +- vendor/golang.org/x/crypto/sha3/shake.go | 29 +- vendor/golang.org/x/net/http2/Dockerfile | 51 - vendor/golang.org/x/net/http2/Makefile | 3 - vendor/golang.org/x/net/http2/server.go | 86 +- vendor/golang.org/x/net/http2/transport.go | 63 +- vendor/golang.org/x/net/idna/idna9.0.0.go | 2 +- vendor/golang.org/x/net/idna/tables13.0.0.go | 2988 +- vendor/golang.org/x/net/idna/tables15.0.0.go | 5145 +++ vendor/golang.org/x/net/idna/trie.go | 21 - vendor/golang.org/x/net/idna/trie12.0.0.go | 31 + vendor/golang.org/x/net/idna/trie13.0.0.go | 31 + vendor/golang.org/x/sys/cpu/cpu.go | 5 +- vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 2 +- vendor/golang.org/x/sys/cpu/cpu_x86.go | 7 + vendor/golang.org/x/sys/cpu/hwcap_linux.go | 4 +- .../sys/internal/unsafeheader/unsafeheader.go | 30 - vendor/golang.org/x/sys/unix/mkerrors.sh | 5 +- vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/ptrace_darwin.go | 6 - vendor/golang.org/x/sys/unix/ptrace_ios.go | 6 - vendor/golang.org/x/sys/unix/syscall_aix.go | 17 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 14 - .../golang.org/x/sys/unix/syscall_darwin.go | 236 +- .../x/sys/unix/syscall_darwin_amd64.go | 1 - .../x/sys/unix/syscall_darwin_arm64.go | 1 - .../x/sys/unix/syscall_dragonfly.go | 198 - .../golang.org/x/sys/unix/syscall_freebsd.go | 192 - vendor/golang.org/x/sys/unix/syscall_linux.go | 194 +- .../x/sys/unix/syscall_linux_amd64.go | 2 +- .../x/sys/unix/syscall_linux_arm64.go | 2 +- .../x/sys/unix/syscall_linux_loong64.go | 2 +- .../x/sys/unix/syscall_linux_mips64x.go | 2 +- .../x/sys/unix/syscall_linux_riscv64.go | 13 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 272 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 74 - .../golang.org/x/sys/unix/syscall_solaris.go | 32 - vendor/golang.org/x/sys/unix/syscall_unix.go | 11 + .../x/sys/unix/syscall_zos_s390x.go | 15 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 52 +- .../x/sys/unix/zerrors_linux_386.go | 11 + .../x/sys/unix/zerrors_linux_amd64.go | 11 + .../x/sys/unix/zerrors_linux_arm.go | 11 + .../x/sys/unix/zerrors_linux_arm64.go | 13 + .../x/sys/unix/zerrors_linux_loong64.go | 13 + .../x/sys/unix/zerrors_linux_mips.go | 11 + .../x/sys/unix/zerrors_linux_mips64.go | 11 + .../x/sys/unix/zerrors_linux_mips64le.go | 11 + .../x/sys/unix/zerrors_linux_mipsle.go | 11 + .../x/sys/unix/zerrors_linux_ppc.go | 11 + .../x/sys/unix/zerrors_linux_ppc64.go | 11 + .../x/sys/unix/zerrors_linux_ppc64le.go | 11 + .../x/sys/unix/zerrors_linux_riscv64.go | 11 + .../x/sys/unix/zerrors_linux_s390x.go | 11 + .../x/sys/unix/zerrors_linux_sparc64.go | 11 + .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 22 - .../x/sys/unix/zsyscall_aix_ppc64.go | 22 - .../x/sys/unix/zsyscall_darwin_amd64.go | 40 +- .../x/sys/unix/zsyscall_darwin_amd64.s | 149 - .../x/sys/unix/zsyscall_darwin_arm64.go | 40 +- .../x/sys/unix/zsyscall_darwin_arm64.s | 149 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 22 - .../x/sys/unix/zsyscall_freebsd_386.go | 22 - .../x/sys/unix/zsyscall_freebsd_amd64.go | 22 - .../x/sys/unix/zsyscall_freebsd_arm.go | 22 - .../x/sys/unix/zsyscall_freebsd_arm64.go | 22 - .../x/sys/unix/zsyscall_freebsd_riscv64.go | 22 - .../x/sys/unix/zsyscall_illumos_amd64.go | 10 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 55 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 16 + .../x/sys/unix/zsyscall_netbsd_386.go | 29 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 29 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 29 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 29 +- .../x/sys/unix/zsyscall_openbsd_386.go | 32 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 22 - .../x/sys/unix/zsyscall_openbsd_arm.go | 32 +- .../x/sys/unix/zsyscall_openbsd_arm64.go | 32 +- .../x/sys/unix/zsyscall_openbsd_mips64.go | 32 +- .../x/sys/unix/zsyscall_openbsd_ppc64.go | 32 +- .../x/sys/unix/zsyscall_openbsd_riscv64.go | 32 +- .../x/sys/unix/zsyscall_solaris_amd64.go | 256 +- .../x/sys/unix/zsyscall_zos_s390x.go | 11 - .../x/sys/unix/zsysnum_linux_386.go | 1 + .../x/sys/unix/zsysnum_linux_amd64.go | 1 + .../x/sys/unix/zsysnum_linux_arm.go | 1 + .../x/sys/unix/zsysnum_linux_arm64.go | 1 + .../x/sys/unix/zsysnum_linux_loong64.go | 1 + .../x/sys/unix/zsysnum_linux_mips.go | 1 + .../x/sys/unix/zsysnum_linux_mips64.go | 1 + .../x/sys/unix/zsysnum_linux_mips64le.go | 1 + .../x/sys/unix/zsysnum_linux_mipsle.go | 1 + .../x/sys/unix/zsysnum_linux_ppc.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 1 + .../x/sys/unix/zsysnum_linux_riscv64.go | 3 + .../x/sys/unix/zsysnum_linux_s390x.go | 2 + .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 57 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 + .../x/sys/unix/ztypes_linux_amd64.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 + .../x/sys/unix/ztypes_linux_arm64.go | 2 + .../x/sys/unix/ztypes_linux_loong64.go | 2 + .../x/sys/unix/ztypes_linux_mips.go | 2 + .../x/sys/unix/ztypes_linux_mips64.go | 2 + .../x/sys/unix/ztypes_linux_mips64le.go | 2 + .../x/sys/unix/ztypes_linux_mipsle.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 + .../x/sys/unix/ztypes_linux_ppc64.go | 2 + .../x/sys/unix/ztypes_linux_ppc64le.go | 2 + .../x/sys/unix/ztypes_linux_riscv64.go | 29 + .../x/sys/unix/ztypes_linux_s390x.go | 2 + .../x/sys/unix/ztypes_linux_sparc64.go | 2 + .../golang.org/x/sys/windows/exec_windows.go | 89 +- .../x/sys/windows/security_windows.go | 21 +- vendor/golang.org/x/sys/windows/service.go | 4 + .../x/sys/windows/syscall_windows.go | 57 +- .../golang.org/x/sys/windows/types_windows.go | 7 + .../x/sys/windows/zsyscall_windows.go | 54 +- vendor/golang.org/x/term/term_unix.go | 2 +- .../x/text/unicode/bidi/tables13.0.0.go | 4 +- .../x/text/unicode/bidi/tables15.0.0.go | 2043 ++ .../x/text/unicode/norm/tables13.0.0.go | 4 +- .../x/text/unicode/norm/tables15.0.0.go | 7908 +++++ vendor/golang.org/x/text/unicode/norm/trie.go | 2 +- vendor/google.golang.org/protobuf/AUTHORS | 3 - .../google.golang.org/protobuf/CONTRIBUTORS | 3 - .../protobuf/encoding/prototext/decode.go | 116 +- .../protobuf/encoding/prototext/encode.go | 53 +- .../protobuf/encoding/protowire/wire.go | 12 +- .../protobuf/internal/descfmt/stringer.go | 66 +- .../internal/encoding/defval/default.go | 78 +- .../encoding/messageset/messageset.go | 7 +- .../protobuf/internal/encoding/tag/tag.go | 96 +- .../protobuf/internal/encoding/text/decode.go | 35 +- .../internal/encoding/text/decode_number.go | 49 +- .../protobuf/internal/encoding/text/doc.go | 4 +- .../protobuf/internal/encoding/text/encode.go | 10 +- .../protobuf/internal/filedesc/build.go | 19 +- .../protobuf/internal/filedesc/desc.go | 380 +- .../protobuf/internal/filedesc/desc_init.go | 36 +- .../protobuf/internal/filedesc/desc_lazy.go | 80 +- .../protobuf/internal/filedesc/desc_list.go | 167 +- .../protobuf/internal/filedesc/placeholder.go | 136 +- .../protobuf/internal/filetype/build.go | 87 +- .../protobuf/internal/genid/descriptor_gen.go | 138 +- .../protobuf/internal/genid/type_gen.go | 6 + .../protobuf/internal/impl/api_export.go | 42 +- .../protobuf/internal/impl/checkinit.go | 12 +- .../protobuf/internal/impl/codec_extension.go | 36 +- .../protobuf/internal/impl/codec_field.go | 90 +- .../protobuf/internal/impl/codec_map.go | 20 +- .../protobuf/internal/impl/codec_message.go | 30 +- .../protobuf/internal/impl/codec_tables.go | 290 +- .../protobuf/internal/impl/convert.go | 229 +- .../protobuf/internal/impl/convert_list.go | 42 +- .../protobuf/internal/impl/convert_map.go | 32 +- .../protobuf/internal/impl/decode.go | 21 +- .../protobuf/internal/impl/enum.go | 10 +- .../protobuf/internal/impl/extension.go | 26 +- .../protobuf/internal/impl/legacy_enum.go | 57 +- .../protobuf/internal/impl/legacy_export.go | 18 +- .../internal/impl/legacy_extension.go | 100 +- .../protobuf/internal/impl/legacy_message.go | 122 +- .../protobuf/internal/impl/merge.go | 32 +- .../protobuf/internal/impl/message.go | 41 +- .../protobuf/internal/impl/message_reflect.go | 74 +- .../internal/impl/message_reflect_field.go | 118 +- .../protobuf/internal/impl/validate.go | 50 +- .../protobuf/internal/impl/weak.go | 16 +- .../protobuf/internal/order/order.go | 18 +- .../protobuf/internal/order/range.go | 22 +- .../protobuf/internal/strs/strings_unsafe.go | 8 +- .../protobuf/internal/version/version.go | 54 +- .../protobuf/proto/decode.go | 3 +- .../google.golang.org/protobuf/proto/doc.go | 24 +- .../protobuf/proto/encode.go | 5 +- .../google.golang.org/protobuf/proto/equal.go | 178 +- .../google.golang.org/protobuf/proto/size.go | 10 +- .../reflect/protodesc/desc_resolve.go | 6 +- .../protobuf/reflect/protoreflect/proto.go | 32 +- .../protobuf/reflect/protoreflect/source.go | 1 + .../reflect/protoreflect/source_gen.go | 41 + .../protobuf/reflect/protoreflect/type.go | 1 + .../protobuf/reflect/protoreflect/value.go | 2 +- .../reflect/protoreflect/value_equal.go | 168 + .../reflect/protoreflect/value_union.go | 6 +- .../reflect/protoregistry/registry.go | 4 +- .../protobuf/runtime/protoimpl/version.go | 8 +- .../types/descriptorpb/descriptor.pb.go | 1880 +- .../protobuf/types/known/anypb/any.pb.go | 495 + vendor/modules.txt | 174 +- 715 files changed, 113484 insertions(+), 16183 deletions(-) delete mode 100644 vendor/github.com/BurntSushi/toml/.travis.yml delete mode 100644 vendor/github.com/BurntSushi/toml/COMPATIBLE delete mode 100644 vendor/github.com/BurntSushi/toml/Makefile create mode 100644 vendor/github.com/BurntSushi/toml/decode_go116.go create mode 100644 vendor/github.com/BurntSushi/toml/deprecated.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types.go delete mode 100644 vendor/github.com/BurntSushi/toml/encoding_types_1.1.go create mode 100644 vendor/github.com/BurntSushi/toml/error.go create mode 100644 vendor/github.com/BurntSushi/toml/internal/tz.go rename vendor/github.com/BurntSushi/toml/{decode_meta.go => meta.go} (59%) delete mode 100644 vendor/github.com/BurntSushi/toml/session.vim rename vendor/github.com/BurntSushi/toml/{type_check.go => type_toml.go} (75%) delete mode 100644 vendor/github.com/agl/ed25519/extra25519/extra25519.go delete mode 100644 vendor/github.com/dchest/siphash/.travis.yml create mode 100644 vendor/github.com/flynn/noise/CONTRIBUTING.md rename vendor/github.com/{refraction-networking/gotapdance/ed25519 => flynn/noise}/LICENSE (88%) create mode 100644 vendor/github.com/flynn/noise/README.md create mode 100644 vendor/github.com/flynn/noise/cipher_suite.go create mode 100644 vendor/github.com/flynn/noise/hkdf.go create mode 100644 vendor/github.com/flynn/noise/patterns.go create mode 100644 vendor/github.com/flynn/noise/state.go create mode 100644 vendor/github.com/flynn/noise/vectors.txt create mode 100644 vendor/github.com/gaukas/godicttls/quic_frame_types.go create mode 100644 vendor/github.com/gaukas/godicttls/quic_transport_error_codes.go create mode 100644 vendor/github.com/gaukas/godicttls/quic_transport_parameters.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/zero.go create mode 100644 vendor/github.com/google/gopacket/layers/erspan2.go create mode 100644 vendor/github.com/google/gopacket/layers/radius.go create mode 100644 vendor/github.com/hashicorp/golang-lru/.golangci.yml create mode 100644 vendor/github.com/hashicorp/golang-lru/testing.go create mode 100644 vendor/github.com/libp2p/go-reuseport/LICENSE create mode 100644 vendor/github.com/libp2p/go-reuseport/README.md create mode 100644 vendor/github.com/libp2p/go-reuseport/addr.go create mode 100644 vendor/github.com/libp2p/go-reuseport/codecov.yml create mode 100644 vendor/github.com/libp2p/go-reuseport/control_freebsd.go create mode 100644 vendor/github.com/libp2p/go-reuseport/control_plan9.go create mode 100644 vendor/github.com/libp2p/go-reuseport/control_unix.go create mode 100644 vendor/github.com/libp2p/go-reuseport/control_wasm.go create mode 100644 vendor/github.com/libp2p/go-reuseport/control_windows.go create mode 100644 vendor/github.com/libp2p/go-reuseport/interface.go create mode 100644 vendor/github.com/libp2p/go-reuseport/version.json create mode 100644 vendor/github.com/oschwald/maxminddb-golang/.golangci.toml delete mode 100644 vendor/github.com/oschwald/maxminddb-golang/.travis.yml delete mode 100644 vendor/github.com/oschwald/maxminddb-golang/appveyor.yml create mode 100644 vendor/github.com/oschwald/maxminddb-golang/deserializer.go create mode 100644 vendor/github.com/oschwald/maxminddb-golang/node.go delete mode 100644 vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go create mode 100644 vendor/github.com/oschwald/maxminddb-golang/reader_memory.go create mode 100644 vendor/github.com/oschwald/maxminddb-golang/reader_mmap.go delete mode 100644 vendor/github.com/oschwald/maxminddb-golang/reader_other.go create mode 100644 vendor/github.com/oschwald/maxminddb-golang/set_zero_120.go create mode 100644 vendor/github.com/oschwald/maxminddb-golang/set_zero_pre120.go create mode 100644 vendor/github.com/pelletier/go-toml/.dockerignore create mode 100644 vendor/github.com/pelletier/go-toml/.gitignore create mode 100644 vendor/github.com/pelletier/go-toml/CONTRIBUTING.md create mode 100644 vendor/github.com/pelletier/go-toml/Dockerfile create mode 100644 vendor/github.com/pelletier/go-toml/LICENSE create mode 100644 vendor/github.com/pelletier/go-toml/Makefile create mode 100644 vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/github.com/pelletier/go-toml/README.md create mode 100644 vendor/github.com/pelletier/go-toml/SECURITY.md create mode 100644 vendor/github.com/pelletier/go-toml/azure-pipelines.yml create mode 100644 vendor/github.com/pelletier/go-toml/benchmark.sh create mode 100644 vendor/github.com/pelletier/go-toml/doc.go create mode 100644 vendor/github.com/pelletier/go-toml/example-crlf.toml create mode 100644 vendor/github.com/pelletier/go-toml/example.toml create mode 100644 vendor/github.com/pelletier/go-toml/fuzz.go create mode 100644 vendor/github.com/pelletier/go-toml/fuzz.sh create mode 100644 vendor/github.com/pelletier/go-toml/keysparsing.go create mode 100644 vendor/github.com/pelletier/go-toml/lexer.go create mode 100644 vendor/github.com/pelletier/go-toml/localtime.go create mode 100644 vendor/github.com/pelletier/go-toml/marshal.go create mode 100644 vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml create mode 100644 vendor/github.com/pelletier/go-toml/marshal_test.toml create mode 100644 vendor/github.com/pelletier/go-toml/parser.go create mode 100644 vendor/github.com/pelletier/go-toml/position.go create mode 100644 vendor/github.com/pelletier/go-toml/token.go create mode 100644 vendor/github.com/pelletier/go-toml/toml.go create mode 100644 vendor/github.com/pelletier/go-toml/tomlpub.go create mode 100644 vendor/github.com/pelletier/go-toml/tomltree_create.go create mode 100644 vendor/github.com/pelletier/go-toml/tomltree_write.go create mode 100644 vendor/github.com/pelletier/go-toml/tomltree_writepub.go create mode 100644 vendor/github.com/pion/dtls/v2/.editorconfig create mode 100644 vendor/github.com/pion/dtls/v2/.gitignore create mode 100644 vendor/github.com/pion/dtls/v2/.golangci.yml create mode 100644 vendor/github.com/pion/dtls/v2/.goreleaser.yml create mode 100644 vendor/github.com/pion/dtls/v2/AUTHORS.txt create mode 100644 vendor/github.com/pion/dtls/v2/LICENSE create mode 100644 vendor/github.com/pion/dtls/v2/README.md create mode 100644 vendor/github.com/pion/dtls/v2/certificate.go create mode 100644 vendor/github.com/pion/dtls/v2/cipher_suite.go create mode 100644 vendor/github.com/pion/dtls/v2/cipher_suite_go114.go create mode 100644 vendor/github.com/pion/dtls/v2/codecov.yml create mode 100644 vendor/github.com/pion/dtls/v2/compression_method.go create mode 100644 vendor/github.com/pion/dtls/v2/config.go create mode 100644 vendor/github.com/pion/dtls/v2/conn.go create mode 100644 vendor/github.com/pion/dtls/v2/crypto.go create mode 100644 vendor/github.com/pion/dtls/v2/dtls.go create mode 100644 vendor/github.com/pion/dtls/v2/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/errors_errno.go create mode 100644 vendor/github.com/pion/dtls/v2/errors_noerrno.go create mode 100644 vendor/github.com/pion/dtls/v2/flight.go create mode 100644 vendor/github.com/pion/dtls/v2/flight0handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight1handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight2handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight3handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight4bhandler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight4handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight5bhandler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight5handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flight6handler.go create mode 100644 vendor/github.com/pion/dtls/v2/flighthandler.go create mode 100644 vendor/github.com/pion/dtls/v2/fragment_buffer.go create mode 100644 vendor/github.com/pion/dtls/v2/handshake_cache.go create mode 100644 vendor/github.com/pion/dtls/v2/handshaker.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_128_ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_256_ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/ciphersuite.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm8.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_gcm_sha256.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_cbc_sha.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_gcm_sha384.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_psk_with_aes_128_cbc_sha256.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_128_gcm_sha256.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_cbc_sha.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_gcm_sha384.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_cbc_sha256.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm8.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_gcm_sha256.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_256_ccm8.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/authentication_type.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/key_exchange_algorithm.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/closer/closer.go create mode 100644 vendor/github.com/pion/dtls/v2/internal/util/util.go create mode 100644 vendor/github.com/pion/dtls/v2/listener.go create mode 100644 vendor/github.com/pion/dtls/v2/packet.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/ccm/ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/cbc.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ciphersuite.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/clientcertificate/client_certificate.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/elliptic/elliptic.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/hash/hash.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/prf/prf.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/signature/signature.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/signaturehash.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/alert/alert.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/application_data.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/change_cipher_spec.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/compression_method.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/content.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/alpn.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/extension.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/renegotiation_info.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/server_name.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/srtp_protection_profile.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_elliptic_curves.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_point_formats.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_signature_algorithms.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_master_secret.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_srtp.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/cipher_suite.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/handshake.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/header.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_request.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_verify.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_hello.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_key_exchange.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_finished.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_hello_verify_request.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello_done.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_key_exchange.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/random.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/header.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go create mode 100644 vendor/github.com/pion/dtls/v2/pkg/protocol/version.go create mode 100644 vendor/github.com/pion/dtls/v2/renovate.json create mode 100644 vendor/github.com/pion/dtls/v2/resume.go create mode 100644 vendor/github.com/pion/dtls/v2/session.go create mode 100644 vendor/github.com/pion/dtls/v2/srtp_protection_profile.go create mode 100644 vendor/github.com/pion/dtls/v2/state.go create mode 100644 vendor/github.com/pion/dtls/v2/state_getters.go create mode 100644 vendor/github.com/pion/dtls/v2/util.go create mode 100644 vendor/github.com/pion/logging/.golangci.yml create mode 100644 vendor/github.com/pion/logging/.travis.yml create mode 100644 vendor/github.com/pion/logging/LICENSE create mode 100644 vendor/github.com/pion/logging/README.md create mode 100644 vendor/github.com/pion/logging/logger.go create mode 100644 vendor/github.com/pion/logging/scoped.go create mode 100644 vendor/github.com/pion/randutil/.travis.yml create mode 100644 vendor/github.com/pion/randutil/LICENSE create mode 100644 vendor/github.com/pion/randutil/README.md create mode 100644 vendor/github.com/pion/randutil/codecov.yml create mode 100644 vendor/github.com/pion/randutil/crypto.go create mode 100644 vendor/github.com/pion/randutil/math.go create mode 100644 vendor/github.com/pion/randutil/renovate.json create mode 100644 vendor/github.com/pion/sctp/.gitignore create mode 100644 vendor/github.com/pion/sctp/.golangci.yml create mode 100644 vendor/github.com/pion/sctp/.goreleaser.yml create mode 100644 vendor/github.com/pion/sctp/AUTHORS.txt create mode 100644 vendor/github.com/pion/sctp/LICENSE create mode 100644 vendor/github.com/pion/sctp/README.md create mode 100644 vendor/github.com/pion/sctp/ack_timer.go create mode 100644 vendor/github.com/pion/sctp/association.go create mode 100644 vendor/github.com/pion/sctp/association_stats.go create mode 100644 vendor/github.com/pion/sctp/chunk.go create mode 100644 vendor/github.com/pion/sctp/chunk_abort.go create mode 100644 vendor/github.com/pion/sctp/chunk_cookie_ack.go create mode 100644 vendor/github.com/pion/sctp/chunk_cookie_echo.go create mode 100644 vendor/github.com/pion/sctp/chunk_error.go create mode 100644 vendor/github.com/pion/sctp/chunk_forward_tsn.go create mode 100644 vendor/github.com/pion/sctp/chunk_heartbeat.go create mode 100644 vendor/github.com/pion/sctp/chunk_heartbeat_ack.go create mode 100644 vendor/github.com/pion/sctp/chunk_init.go create mode 100644 vendor/github.com/pion/sctp/chunk_init_ack.go create mode 100644 vendor/github.com/pion/sctp/chunk_init_common.go create mode 100644 vendor/github.com/pion/sctp/chunk_payload_data.go create mode 100644 vendor/github.com/pion/sctp/chunk_reconfig.go create mode 100644 vendor/github.com/pion/sctp/chunk_selective_ack.go create mode 100644 vendor/github.com/pion/sctp/chunk_shutdown.go create mode 100644 vendor/github.com/pion/sctp/chunk_shutdown_ack.go create mode 100644 vendor/github.com/pion/sctp/chunk_shutdown_complete.go create mode 100644 vendor/github.com/pion/sctp/chunkheader.go create mode 100644 vendor/github.com/pion/sctp/chunktype.go create mode 100644 vendor/github.com/pion/sctp/codecov.yml create mode 100644 vendor/github.com/pion/sctp/control_queue.go create mode 100644 vendor/github.com/pion/sctp/error_cause.go create mode 100644 vendor/github.com/pion/sctp/error_cause_header.go create mode 100644 vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go create mode 100644 vendor/github.com/pion/sctp/error_cause_protocol_violation.go create mode 100644 vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go create mode 100644 vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go create mode 100644 vendor/github.com/pion/sctp/packet.go create mode 100644 vendor/github.com/pion/sctp/param.go create mode 100644 vendor/github.com/pion/sctp/param_chunk_list.go create mode 100644 vendor/github.com/pion/sctp/param_ecn_capable.go create mode 100644 vendor/github.com/pion/sctp/param_forward_tsn_supported.go create mode 100644 vendor/github.com/pion/sctp/param_heartbeat_info.go create mode 100644 vendor/github.com/pion/sctp/param_outgoing_reset_request.go create mode 100644 vendor/github.com/pion/sctp/param_random.go create mode 100644 vendor/github.com/pion/sctp/param_reconfig_response.go create mode 100644 vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go create mode 100644 vendor/github.com/pion/sctp/param_state_cookie.go create mode 100644 vendor/github.com/pion/sctp/param_supported_extensions.go create mode 100644 vendor/github.com/pion/sctp/paramheader.go create mode 100644 vendor/github.com/pion/sctp/paramtype.go create mode 100644 vendor/github.com/pion/sctp/payload_queue.go create mode 100644 vendor/github.com/pion/sctp/pending_queue.go create mode 100644 vendor/github.com/pion/sctp/reassembly_queue.go create mode 100644 vendor/github.com/pion/sctp/renovate.json create mode 100644 vendor/github.com/pion/sctp/rtx_timer.go create mode 100644 vendor/github.com/pion/sctp/sctp.go create mode 100644 vendor/github.com/pion/sctp/stream.go create mode 100644 vendor/github.com/pion/sctp/util.go create mode 100644 vendor/github.com/pion/stun/.gitignore create mode 100644 vendor/github.com/pion/stun/.golangci.yml create mode 100644 vendor/github.com/pion/stun/.goreleaser.yml create mode 100644 vendor/github.com/pion/stun/AUTHORS.txt create mode 100644 vendor/github.com/pion/stun/LICENSE create mode 100644 vendor/github.com/pion/stun/Makefile create mode 100644 vendor/github.com/pion/stun/README.md create mode 100644 vendor/github.com/pion/stun/addr.go create mode 100644 vendor/github.com/pion/stun/agent.go create mode 100644 vendor/github.com/pion/stun/attributes.go create mode 100644 vendor/github.com/pion/stun/attributes_debug.go create mode 100644 vendor/github.com/pion/stun/checks.go create mode 100644 vendor/github.com/pion/stun/checks_debug.go create mode 100644 vendor/github.com/pion/stun/client.go create mode 100644 vendor/github.com/pion/stun/codecov.yml create mode 100644 vendor/github.com/pion/stun/errorcode.go create mode 100644 vendor/github.com/pion/stun/errors.go create mode 100644 vendor/github.com/pion/stun/fingerprint.go create mode 100644 vendor/github.com/pion/stun/fingerprint_debug.go create mode 100644 vendor/github.com/pion/stun/helpers.go create mode 100644 vendor/github.com/pion/stun/integrity.go create mode 100644 vendor/github.com/pion/stun/integrity_debug.go create mode 100644 vendor/github.com/pion/stun/internal/hmac/hmac.go create mode 100644 vendor/github.com/pion/stun/internal/hmac/pool.go create mode 100644 vendor/github.com/pion/stun/internal/hmac/vendor.sh create mode 100644 vendor/github.com/pion/stun/message.go create mode 100644 vendor/github.com/pion/stun/renovate.json create mode 100644 vendor/github.com/pion/stun/stun.go create mode 100644 vendor/github.com/pion/stun/textattrs.go create mode 100644 vendor/github.com/pion/stun/uattrs.go create mode 100644 vendor/github.com/pion/stun/uri.go create mode 100644 vendor/github.com/pion/stun/xoraddr.go create mode 100644 vendor/github.com/pion/transport/v2/.gitignore create mode 100644 vendor/github.com/pion/transport/v2/.golangci.yml create mode 100644 vendor/github.com/pion/transport/v2/.goreleaser.yml create mode 100644 vendor/github.com/pion/transport/v2/AUTHORS.txt create mode 100644 vendor/github.com/pion/transport/v2/LICENSE create mode 100644 vendor/github.com/pion/transport/v2/README.md create mode 100644 vendor/github.com/pion/transport/v2/codecov.yml create mode 100644 vendor/github.com/pion/transport/v2/connctx/connctx.go create mode 100644 vendor/github.com/pion/transport/v2/connctx/pipe.go create mode 100644 vendor/github.com/pion/transport/v2/deadline/deadline.go create mode 100644 vendor/github.com/pion/transport/v2/net.go create mode 100644 vendor/github.com/pion/transport/v2/packetio/buffer.go create mode 100644 vendor/github.com/pion/transport/v2/packetio/errors.go create mode 100644 vendor/github.com/pion/transport/v2/packetio/hardlimit.go create mode 100644 vendor/github.com/pion/transport/v2/packetio/no_hardlimit.go create mode 100644 vendor/github.com/pion/transport/v2/renovate.json create mode 100644 vendor/github.com/pion/transport/v2/replaydetector/fixedbig.go create mode 100644 vendor/github.com/pion/transport/v2/replaydetector/replaydetector.go create mode 100644 vendor/github.com/pion/transport/v2/stdnet/net.go create mode 100644 vendor/github.com/pion/transport/v2/udp/batchconn.go create mode 100644 vendor/github.com/pion/transport/v2/udp/conn.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.s create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_arm.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_arm.s create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.s create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_generic.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.go create mode 100644 vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.s create mode 100644 vendor/github.com/refraction-networking/conjure/LICENSE create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/client/assets/assets.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/core/core.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/core/interfaces/interfaces.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/core/keys.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/config.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/dial.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeatConfig.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/not1reader.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/dtls/server.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/phantoms/compat.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantom_selector.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantoms.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/phantoms/station_phantoms.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/decoy-registrar.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/utils.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns/dns.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption/encryption.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat/msgformat.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/clientid.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/consts.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/queuepacketconn.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap/remotemap.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/config.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/dns.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/http.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/requester.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/tls.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/utls.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/weightedlist.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/lib/registrars.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/api-registrar.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/config.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/decoy-registrar.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/dns-registrar.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/station/log/logger.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/anypb_nourl.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/client/transports.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/dtls.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/obfuscate.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/registration.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/client.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/min.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/client.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/keys.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4_license.txt create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/utils.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/README.md create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/prefix.go create mode 100644 vendor/github.com/refraction-networking/conjure/proto/Makefile create mode 100644 vendor/github.com/refraction-networking/conjure/proto/README.txt rename vendor/github.com/refraction-networking/{gotapdance/protobuf => conjure/proto}/extensions.go (98%) create mode 100644 vendor/github.com/refraction-networking/conjure/proto/mod.rs create mode 100644 vendor/github.com/refraction-networking/conjure/proto/signalling.pb.go rename vendor/github.com/refraction-networking/{gotapdance/protobuf => conjure/proto}/signalling.proto (68%) create mode 100644 vendor/github.com/refraction-networking/conjure/proto/signalling.rs rename vendor/github.com/{agl => refraction-networking}/ed25519/LICENSE (100%) rename vendor/github.com/{agl => refraction-networking}/ed25519/edwards25519/const.go (100%) rename vendor/github.com/{agl => refraction-networking}/ed25519/edwards25519/edwards25519.go (96%) rename vendor/github.com/refraction-networking/{gotapdance => }/ed25519/extra25519/extra25519.go (99%) delete mode 100644 vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/const.go delete mode 100644 vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/edwards25519.go delete mode 100644 vendor/github.com/refraction-networking/gotapdance/protobuf/Makefile delete mode 100644 vendor/github.com/refraction-networking/gotapdance/protobuf/README.md delete mode 100644 vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.pb.go delete mode 100644 vendor/github.com/refraction-networking/gotapdance/tapdance/TODO create mode 100644 vendor/github.com/refraction-networking/gotapdance/tapdance/interfaces.go delete mode 100644 vendor/github.com/refraction-networking/gotapdance/tapdance/phantoms/phantoms.go delete mode 100644 vendor/github.com/refraction-networking/gotapdance/tapdance/registrar_bidirectional.go rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/LICENSE (100%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/common/csrand/csrand.go (97%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/common/drbg/hash_drbg.go (96%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/common/ntor/ntor.go (93%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/common/probdist/weighted_dist.go (97%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/common/replayfilter/replay_filter.go (96%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/base/base.go (95%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/obfs4/framing/framing.go (92%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/obfs4/handshake_ntor.go (98%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/obfs4/obfs4.go (96%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/obfs4/packet.go (97%) rename vendor/{gitlab.com/yawning/obfs4.git => github.com/refraction-networking/obfs4}/transports/obfs4/statefile.go (89%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/.gitignore (100%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/COPYING (100%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/ChangeLog (79%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/README (64%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/args.go (100%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/pt.go (93%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/socks.go (100%) rename vendor/{git.torproject.org/pluggable-transports/goptlib.git => gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib}/test_authcookie (100%) create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s.go create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_386.go create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_386.s create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_generic.go create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2s_ref.go create mode 100644 vendor/golang.org/x/crypto/blake2s/blake2x.go create mode 100644 vendor/golang.org/x/crypto/blake2s/register.go delete mode 100644 vendor/golang.org/x/net/http2/Dockerfile delete mode 100644 vendor/golang.org/x/net/http2/Makefile create mode 100644 vendor/golang.org/x/net/idna/tables15.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie12.0.0.go create mode 100644 vendor/golang.org/x/net/idna/trie13.0.0.go delete mode 100644 vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go delete mode 100644 vendor/google.golang.org/protobuf/AUTHORS delete mode 100644 vendor/google.golang.org/protobuf/CONTRIBUTORS create mode 100644 vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go create mode 100644 vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore index 0cd380037..fe79e3add 100644 --- a/vendor/github.com/BurntSushi/toml/.gitignore +++ b/vendor/github.com/BurntSushi/toml/.gitignore @@ -1,5 +1,2 @@ -TAGS -tags -.*.swp -tomlcheck/tomlcheck -toml.test +/toml.test +/toml-test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml deleted file mode 100644 index 8b8afc4f0..000000000 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - tip -install: - - go install ./... - - go get github.com/BurntSushi/toml-test -script: - - export PATH="$PATH:$HOME/gopath/bin" - - make test diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE deleted file mode 100644 index 6efcfd0ce..000000000 --- a/vendor/github.com/BurntSushi/toml/COMPATIBLE +++ /dev/null @@ -1,3 +0,0 @@ -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) - diff --git a/vendor/github.com/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile deleted file mode 100644 index 3600848d3..000000000 --- a/vendor/github.com/BurntSushi/toml/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -install: - go install ./... - -test: install - go test -v - toml-test toml-test-decoder - toml-test -encoder toml-test-encoder - -fmt: - gofmt -w *.go */*.go - colcheck *.go */*.go - -tags: - find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS - -push: - git push origin master - git push github master - diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md index 7c1b37ecc..3651cfa96 100644 --- a/vendor/github.com/BurntSushi/toml/README.md +++ b/vendor/github.com/BurntSushi/toml/README.md @@ -1,46 +1,26 @@ -## TOML parser and encoder for Go with reflection - TOML stands for Tom's Obvious, Minimal Language. This Go package provides a -reflection interface similar to Go's standard library `json` and `xml` -packages. This package also supports the `encoding.TextUnmarshaler` and -`encoding.TextMarshaler` interfaces so that you can define custom data -representations. (There is an example of this below.) - -Spec: https://github.com/toml-lang/toml +reflection interface similar to Go's standard library `json` and `xml` packages. -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) +Compatible with TOML version [v1.0.0](https://toml.io/en/v1.0.0). -Documentation: https://godoc.org/github.com/BurntSushi/toml +Documentation: https://godocs.io/github.com/BurntSushi/toml -Installation: +See the [releases page](https://github.com/BurntSushi/toml/releases) for a +changelog; this information is also in the git tag annotations (e.g. `git show +v0.4.0`). -```bash -go get github.com/BurntSushi/toml -``` +This library requires Go 1.13 or newer; add it to your go.mod with: -Try the toml validator: + % go get github.com/BurntSushi/toml@latest -```bash -go get github.com/BurntSushi/toml/cmd/tomlv -tomlv some-toml-file.toml -``` +It also comes with a TOML validator CLI tool: -[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml) - -### Testing - -This package passes all tests in -[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder -and the encoder. + % go install github.com/BurntSushi/toml/cmd/tomlv@latest + % tomlv some-toml-file.toml ### Examples - -This package works similarly to how the Go standard library handles `XML` -and `JSON`. Namely, data is loaded into Go values via reflection. - -For the simplest example, consider some TOML file as just a list of keys -and values: +For the simplest example, consider some TOML file as just a list of keys and +values: ```toml Age = 25 @@ -50,29 +30,23 @@ Perfection = [ 6, 28, 496, 8128 ] DOB = 1987-07-05T05:45:00Z ``` -Which could be defined in Go as: +Which can be decoded with: ```go type Config struct { - Age int - Cats []string - Pi float64 - Perfection []int - DOB time.Time // requires `import time` + Age int + Cats []string + Pi float64 + Perfection []int + DOB time.Time } -``` -And then decoded with: - -```go var conf Config -if _, err := toml.Decode(tomlData, &conf); err != nil { - // handle error -} +_, err := toml.Decode(tomlData, &conf) ``` -You can also use struct tags if your struct field name doesn't map to a TOML -key value directly: +You can also use struct tags if your struct field name doesn't map to a TOML key +value directly: ```toml some_key_NAME = "wat" @@ -80,139 +54,67 @@ some_key_NAME = "wat" ```go type TOML struct { - ObscureKey string `toml:"some_key_NAME"` + ObscureKey string `toml:"some_key_NAME"` } ``` -### Using the `encoding.TextUnmarshaler` interface +Beware that like other decoders **only exported fields** are considered when +encoding and decoding; private fields are silently ignored. -Here's an example that automatically parses duration strings into -`time.Duration` values: +### Using the `Marshaler` and `encoding.TextUnmarshaler` interfaces +Here's an example that automatically parses values in a `mail.Address`: ```toml -[[song]] -name = "Thunder Road" -duration = "4m49s" - -[[song]] -name = "Stairway to Heaven" -duration = "8m03s" -``` - -Which can be decoded with: - -```go -type song struct { - Name string - Duration duration -} -type songs struct { - Song []song -} -var favorites songs -if _, err := toml.Decode(blob, &favorites); err != nil { - log.Fatal(err) -} - -for _, s := range favorites.Song { - fmt.Printf("%s (%s)\n", s.Name, s.Duration) -} +contacts = [ + "Donald Duck ", + "Scrooge McDuck ", +] ``` -And you'll also need a `duration` type that satisfies the -`encoding.TextUnmarshaler` interface: +Can be decoded with: ```go -type duration struct { - time.Duration +// Create address type which satisfies the encoding.TextUnmarshaler interface. +type address struct { + *mail.Address } -func (d *duration) UnmarshalText(text []byte) error { +func (a *address) UnmarshalText(text []byte) error { var err error - d.Duration, err = time.ParseDuration(string(text)) + a.Address, err = mail.ParseAddress(string(text)) return err } -``` - -### More complex usage - -Here's an example of how to load the example from the official spec page: - -```toml -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] -``` - -And the corresponding Go types are: - -```go -type tomlConfig struct { - Title string - Owner ownerInfo - DB database `toml:"database"` - Servers map[string]server - Clients clients -} -type ownerInfo struct { - Name string - Org string `toml:"organization"` - Bio string - DOB time.Time -} - -type database struct { - Server string - Ports []int - ConnMax int `toml:"connection_max"` - Enabled bool -} - -type server struct { - IP string - DC string -} - -type clients struct { - Data [][]interface{} - Hosts []string +// Decode it. +func decode() { + blob := ` + contacts = [ + "Donald Duck ", + "Scrooge McDuck ", + ] + ` + + var contacts struct { + Contacts []address + } + + _, err := toml.Decode(blob, &contacts) + if err != nil { + log.Fatal(err) + } + + for _, c := range contacts.Contacts { + fmt.Printf("%#v\n", c.Address) + } + + // Output: + // &mail.Address{Name:"Donald Duck", Address:"donald@duckburg.com"} + // &mail.Address{Name:"Scrooge McDuck", Address:"scrooge@duckburg.com"} } ``` -Note that a case insensitive match will be tried if an exact match can't be -found. +To target TOML specifically you can implement `UnmarshalTOML` TOML interface in +a similar way. -A working example of the above can be found in `_examples/example.{go,toml}`. +### More complex usage +See the [`_example/`](/_example) directory for a more complex example. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go index b0fd51d5b..4d38f3bfc 100644 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ b/vendor/github.com/BurntSushi/toml/decode.go @@ -1,146 +1,188 @@ package toml import ( + "bytes" + "encoding" + "encoding/json" "fmt" "io" "io/ioutil" "math" + "os" "reflect" + "strconv" "strings" "time" ) -func e(format string, args ...interface{}) error { - return fmt.Errorf("toml: "+format, args...) -} - // Unmarshaler is the interface implemented by objects that can unmarshal a // TOML description of themselves. type Unmarshaler interface { UnmarshalTOML(interface{}) error } -// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. -func Unmarshal(p []byte, v interface{}) error { - _, err := Decode(string(p), v) +// Unmarshal decodes the contents of data in TOML format into a pointer v. +// +// See [Decoder] for a description of the decoding process. +func Unmarshal(data []byte, v interface{}) error { + _, err := NewDecoder(bytes.NewReader(data)).Decode(v) return err } +// Decode the TOML data in to the pointer v. +// +// See [Decoder] for a description of the decoding process. +func Decode(data string, v interface{}) (MetaData, error) { + return NewDecoder(strings.NewReader(data)).Decode(v) +} + +// DecodeFile reads the contents of a file and decodes it with [Decode]. +func DecodeFile(path string, v interface{}) (MetaData, error) { + fp, err := os.Open(path) + if err != nil { + return MetaData{}, err + } + defer fp.Close() + return NewDecoder(fp).Decode(v) +} + // Primitive is a TOML value that hasn't been decoded into a Go value. -// When using the various `Decode*` functions, the type `Primitive` may -// be given to any value, and its decoding will be delayed. // -// A `Primitive` value can be decoded using the `PrimitiveDecode` function. +// This type can be used for any value, which will cause decoding to be delayed. +// You can use [PrimitiveDecode] to "manually" decode these values. // -// The underlying representation of a `Primitive` value is subject to change. -// Do not rely on it. +// NOTE: The underlying representation of a `Primitive` value is subject to +// change. Do not rely on it. // -// N.B. Primitive values are still parsed, so using them will only avoid -// the overhead of reflection. They can be useful when you don't know the -// exact type of TOML data until run time. +// NOTE: Primitive values are still parsed, so using them will only avoid the +// overhead of reflection. They can be useful when you don't know the exact type +// of TOML data until runtime. type Primitive struct { undecoded interface{} context Key } -// DEPRECATED! -// -// Use MetaData.PrimitiveDecode instead. -func PrimitiveDecode(primValue Primitive, v interface{}) error { - md := MetaData{decoded: make(map[string]bool)} - return md.unify(primValue.undecoded, rvalue(v)) -} +// The significand precision for float32 and float64 is 24 and 53 bits; this is +// the range a natural number can be stored in a float without loss of data. +const ( + maxSafeFloat32Int = 16777215 // 2^24-1 + maxSafeFloat64Int = int64(9007199254740991) // 2^53-1 +) -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) +// Decoder decodes TOML data. // -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) -func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { - md.context = primValue.context - defer func() { md.context = nil }() - return md.unify(primValue.undecoded, rvalue(v)) -} - -// Decode will decode the contents of `data` in TOML format into a pointer -// `v`. +// TOML tables correspond to Go structs or maps; they can be used +// interchangeably, but structs offer better type safety. // -// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be -// used interchangeably.) +// TOML table arrays correspond to either a slice of structs or a slice of maps. // -// TOML arrays of tables correspond to either a slice of structs or a slice -// of maps. +// TOML datetimes correspond to [time.Time]. Local datetimes are parsed in the +// local timezone. // -// TOML datetimes correspond to Go `time.Time` values. +// [time.Duration] types are treated as nanoseconds if the TOML value is an +// integer, or they're parsed with time.ParseDuration() if they're strings. // -// All other TOML types (float, string, int, bool and array) correspond -// to the obvious Go types. +// All other TOML types (float, string, int, bool and array) correspond to the +// obvious Go types. // -// An exception to the above rules is if a type implements the -// encoding.TextUnmarshaler interface. In this case, any primitive TOML value -// (floats, strings, integers, booleans and datetimes) will be converted to -// a byte string and given to the value's UnmarshalText method. See the -// Unmarshaler example for a demonstration with time duration strings. +// An exception to the above rules is if a type implements the TextUnmarshaler +// interface, in which case any primitive TOML value (floats, strings, integers, +// booleans, datetimes) will be converted to a []byte and given to the value's +// UnmarshalText method. See the Unmarshaler example for a demonstration with +// email addresses. // -// Key mapping +// # Key mapping // -// TOML keys can map to either keys in a Go map or field names in a Go -// struct. The special `toml` struct tag may be used to map TOML keys to -// struct fields that don't match the key name exactly. (See the example.) -// A case insensitive match to struct names will be tried if an exact match -// can't be found. +// TOML keys can map to either keys in a Go map or field names in a Go struct. +// The special `toml` struct tag can be used to map TOML keys to struct fields +// that don't match the key name exactly (see the example). A case insensitive +// match to struct names will be tried if an exact match can't be found. // -// The mapping between TOML values and Go values is loose. That is, there -// may exist TOML values that cannot be placed into your representation, and -// there may be parts of your representation that do not correspond to -// TOML values. This loose mapping can be made stricter by using the IsDefined -// and/or Undecoded methods on the MetaData returned. +// The mapping between TOML values and Go values is loose. That is, there may +// exist TOML values that cannot be placed into your representation, and there +// may be parts of your representation that do not correspond to TOML values. +// This loose mapping can be made stricter by using the IsDefined and/or +// Undecoded methods on the MetaData returned. // -// This decoder will not handle cyclic types. If a cyclic type is passed, -// `Decode` will not terminate. -func Decode(data string, v interface{}) (MetaData, error) { +// This decoder does not handle cyclic types. Decode will not terminate if a +// cyclic type is passed. +type Decoder struct { + r io.Reader +} + +// NewDecoder creates a new Decoder. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{r: r} +} + +var ( + unmarshalToml = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + unmarshalText = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() + primitiveType = reflect.TypeOf((*Primitive)(nil)).Elem() +) + +// Decode TOML data in to the pointer `v`. +func (dec *Decoder) Decode(v interface{}) (MetaData, error) { rv := reflect.ValueOf(v) if rv.Kind() != reflect.Ptr { - return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) + s := "%q" + if reflect.TypeOf(v) == nil { + s = "%v" + } + + return MetaData{}, fmt.Errorf("toml: cannot decode to non-pointer "+s, reflect.TypeOf(v)) } if rv.IsNil() { - return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) - } - p, err := parse(data) - if err != nil { - return MetaData{}, err + return MetaData{}, fmt.Errorf("toml: cannot decode to nil value of %q", reflect.TypeOf(v)) } - md := MetaData{ - p.mapping, p.types, p.ordered, - make(map[string]bool, len(p.ordered)), nil, + + // Check if this is a supported type: struct, map, interface{}, or something + // that implements UnmarshalTOML or UnmarshalText. + rv = indirect(rv) + rt := rv.Type() + if rv.Kind() != reflect.Struct && rv.Kind() != reflect.Map && + !(rv.Kind() == reflect.Interface && rv.NumMethod() == 0) && + !rt.Implements(unmarshalToml) && !rt.Implements(unmarshalText) { + return MetaData{}, fmt.Errorf("toml: cannot decode to type %s", rt) } - return md, md.unify(p.mapping, indirect(rv)) -} -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at `fpath` and decode it for you. -func DecodeFile(fpath string, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadFile(fpath) + // TODO: parser should read from io.Reader? Or at the very least, make it + // read from []byte rather than string + data, err := ioutil.ReadAll(dec.r) if err != nil { return MetaData{}, err } - return Decode(string(bs), v) -} -// DecodeReader is just like Decode, except it will consume all bytes -// from the reader and decode it for you. -func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadAll(r) + p, err := parse(string(data)) if err != nil { return MetaData{}, err } - return Decode(string(bs), v) + + md := MetaData{ + mapping: p.mapping, + keyInfo: p.keyInfo, + keys: p.ordered, + decoded: make(map[string]struct{}, len(p.ordered)), + context: nil, + data: data, + } + return md, md.unify(p.mapping, rv) +} + +// PrimitiveDecode is just like the other Decode* functions, except it decodes a +// TOML value that has already been parsed. Valid primitive values can *only* be +// obtained from values filled by the decoder functions, including this method. +// (i.e., v may contain more [Primitive] values.) +// +// Meta data for primitive values is included in the meta data returned by the +// Decode* functions with one exception: keys returned by the Undecoded method +// will only reflect keys that were decoded. Namely, any keys hidden behind a +// Primitive will be considered undecoded. Executing this method will update the +// undecoded keys in the meta data. (See the example.) +func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { + md.context = primValue.context + defer func() { md.context = nil }() + return md.unify(primValue.undecoded, rvalue(v)) } // unify performs a sort of type unification based on the structure of `rv`, @@ -149,9 +191,9 @@ func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { // Any type mismatch produces an error. Finding a type that we don't know // how to handle produces an unsupported type error. func (md *MetaData) unify(data interface{}, rv reflect.Value) error { - // Special case. Look for a `Primitive` value. - if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { + // TODO: #76 would make this superfluous after implemented. + if rv.Type() == primitiveType { // Save the undecoded data and the key context into the primitive // value. context := make(Key, len(md.context)) @@ -163,36 +205,24 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error { return nil } - // Special case. Unmarshaler Interface support. - if rv.CanAddr() { - if v, ok := rv.Addr().Interface().(Unmarshaler); ok { - return v.UnmarshalTOML(data) - } + rvi := rv.Interface() + if v, ok := rvi.(Unmarshaler); ok { + return v.UnmarshalTOML(data) } - - // Special case. Handle time.Time values specifically. - // TODO: Remove this code when we decide to drop support for Go 1.1. - // This isn't necessary in Go 1.2 because time.Time satisfies the encoding - // interfaces. - if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { - return md.unifyDatetime(data, rv) - } - - // Special case. Look for a value satisfying the TextUnmarshaler interface. - if v, ok := rv.Interface().(TextUnmarshaler); ok { + if v, ok := rvi.(encoding.TextUnmarshaler); ok { return md.unifyText(data, v) } - // BUG(burntsushi) + + // TODO: // The behavior here is incorrect whenever a Go type satisfies the - // encoding.TextUnmarshaler interface but also corresponds to a TOML - // hash or array. In particular, the unmarshaler should only be applied - // to primitive TOML values. But at this point, it will be applied to - // all kinds of values and produce an incorrect error whenever those values - // are hashes or arrays (including arrays of tables). + // encoding.TextUnmarshaler interface but also corresponds to a TOML hash or + // array. In particular, the unmarshaler should only be applied to primitive + // TOML values. But at this point, it will be applied to all kinds of values + // and produce an incorrect error whenever those values are hashes or arrays + // (including arrays of tables). k := rv.Kind() - // laziness if k >= reflect.Int && k <= reflect.Uint64 { return md.unifyInt(data, rv) } @@ -218,17 +248,14 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error { case reflect.Bool: return md.unifyBool(data, rv) case reflect.Interface: - // we only support empty interfaces. - if rv.NumMethod() > 0 { - return e("unsupported type %s", rv.Type()) + if rv.NumMethod() > 0 { /// Only empty interfaces are supported. + return md.e("unsupported type %s", rv.Type()) } return md.unifyAnything(data, rv) - case reflect.Float32: - fallthrough - case reflect.Float64: + case reflect.Float32, reflect.Float64: return md.unifyFloat64(data, rv) } - return e("unsupported type %s", rv.Kind()) + return md.e("unsupported type %s", rv.Kind()) } func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { @@ -237,7 +264,7 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { if mapping == nil { return nil } - return e("type mismatch for %s: expected table but found %T", + return md.e("type mismatch for %s: expected table but found %T", rv.Type().String(), mapping) } @@ -259,17 +286,18 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { for _, i := range f.index { subv = indirect(subv.Field(i)) } + if isUnifiable(subv) { - md.decoded[md.context.add(key).String()] = true + md.decoded[md.context.add(key).String()] = struct{}{} md.context = append(md.context, key) - if err := md.unify(datum, subv); err != nil { + + err := md.unify(datum, subv) + if err != nil { return err } md.context = md.context[0 : len(md.context)-1] } else if f.name != "" { - // Bad user! No soup for you! - return e("cannot write unexported field %s.%s", - rv.Type().String(), f.name) + return md.e("cannot write unexported field %s.%s", rv.Type().String(), f.name) } } } @@ -277,28 +305,43 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { } func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { + keyType := rv.Type().Key().Kind() + if keyType != reflect.String && keyType != reflect.Interface { + return fmt.Errorf("toml: cannot decode to a map with non-string key type (%s in %q)", + keyType, rv.Type()) + } + tmap, ok := mapping.(map[string]interface{}) if !ok { if tmap == nil { return nil } - return badtype("map", mapping) + return md.badtype("map", mapping) } if rv.IsNil() { rv.Set(reflect.MakeMap(rv.Type())) } for k, v := range tmap { - md.decoded[md.context.add(k).String()] = true + md.decoded[md.context.add(k).String()] = struct{}{} md.context = append(md.context, k) - rvkey := indirect(reflect.New(rv.Type().Key())) rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) - if err := md.unify(v, rvval); err != nil { + + err := md.unify(v, indirect(rvval)) + if err != nil { return err } md.context = md.context[0 : len(md.context)-1] - rvkey.SetString(k) + rvkey := indirect(reflect.New(rv.Type().Key())) + + switch keyType { + case reflect.Interface: + rvkey.Set(reflect.ValueOf(k)) + case reflect.String: + rvkey.SetString(k) + } + rv.SetMapIndex(rvkey, rvval) } return nil @@ -310,12 +353,10 @@ func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { if !datav.IsValid() { return nil } - return badtype("slice", data) + return md.badtype("slice", data) } - sliceLen := datav.Len() - if sliceLen != rv.Len() { - return e("expected array length %d; got TOML array of length %d", - rv.Len(), sliceLen) + if l := datav.Len(); l != rv.Len() { + return md.e("expected array length %d; got TOML array of length %d", rv.Len(), l) } return md.unifySliceArray(datav, rv) } @@ -326,7 +367,7 @@ func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { if !datav.IsValid() { return nil } - return badtype("slice", data) + return md.badtype("slice", data) } n := datav.Len() if rv.IsNil() || rv.Cap() < n { @@ -337,37 +378,45 @@ func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { } func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { - sliceLen := data.Len() - for i := 0; i < sliceLen; i++ { - v := data.Index(i).Interface() - sliceval := indirect(rv.Index(i)) - if err := md.unify(v, sliceval); err != nil { + l := data.Len() + for i := 0; i < l; i++ { + err := md.unify(data.Index(i).Interface(), indirect(rv.Index(i))) + if err != nil { return err } } return nil } -func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { - if _, ok := data.(time.Time); ok { - rv.Set(reflect.ValueOf(data)) +func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { + _, ok := rv.Interface().(json.Number) + if ok { + if i, ok := data.(int64); ok { + rv.SetString(strconv.FormatInt(i, 10)) + } else if f, ok := data.(float64); ok { + rv.SetString(strconv.FormatFloat(f, 'f', -1, 64)) + } else { + return md.badtype("string", data) + } return nil } - return badtype("time.Time", data) -} -func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { if s, ok := data.(string); ok { rv.SetString(s) return nil } - return badtype("string", data) + return md.badtype("string", data) } func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { + rvk := rv.Kind() + if num, ok := data.(float64); ok { - switch rv.Kind() { + switch rvk { case reflect.Float32: + if num < -math.MaxFloat32 || num > math.MaxFloat32 { + return md.parseErr(errParseRange{i: num, size: rvk.String()}) + } fallthrough case reflect.Float64: rv.SetFloat(num) @@ -376,54 +425,60 @@ func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { } return nil } - return badtype("float", data) + + if num, ok := data.(int64); ok { + if (rvk == reflect.Float32 && (num < -maxSafeFloat32Int || num > maxSafeFloat32Int)) || + (rvk == reflect.Float64 && (num < -maxSafeFloat64Int || num > maxSafeFloat64Int)) { + return md.parseErr(errParseRange{i: num, size: rvk.String()}) + } + rv.SetFloat(float64(num)) + return nil + } + + return md.badtype("float", data) } func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { - if num, ok := data.(int64); ok { - if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { - switch rv.Kind() { - case reflect.Int, reflect.Int64: - // No bounds checking necessary. - case reflect.Int8: - if num < math.MinInt8 || num > math.MaxInt8 { - return e("value %d is out of range for int8", num) - } - case reflect.Int16: - if num < math.MinInt16 || num > math.MaxInt16 { - return e("value %d is out of range for int16", num) - } - case reflect.Int32: - if num < math.MinInt32 || num > math.MaxInt32 { - return e("value %d is out of range for int32", num) - } + _, ok := rv.Interface().(time.Duration) + if ok { + // Parse as string duration, and fall back to regular integer parsing + // (as nanosecond) if this is not a string. + if s, ok := data.(string); ok { + dur, err := time.ParseDuration(s) + if err != nil { + return md.parseErr(errParseDuration{s}) } - rv.SetInt(num) - } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { - unum := uint64(num) - switch rv.Kind() { - case reflect.Uint, reflect.Uint64: - // No bounds checking necessary. - case reflect.Uint8: - if num < 0 || unum > math.MaxUint8 { - return e("value %d is out of range for uint8", num) - } - case reflect.Uint16: - if num < 0 || unum > math.MaxUint16 { - return e("value %d is out of range for uint16", num) - } - case reflect.Uint32: - if num < 0 || unum > math.MaxUint32 { - return e("value %d is out of range for uint32", num) - } - } - rv.SetUint(unum) - } else { - panic("unreachable") + rv.SetInt(int64(dur)) + return nil } - return nil } - return badtype("integer", data) + + num, ok := data.(int64) + if !ok { + return md.badtype("integer", data) + } + + rvk := rv.Kind() + switch { + case rvk >= reflect.Int && rvk <= reflect.Int64: + if (rvk == reflect.Int8 && (num < math.MinInt8 || num > math.MaxInt8)) || + (rvk == reflect.Int16 && (num < math.MinInt16 || num > math.MaxInt16)) || + (rvk == reflect.Int32 && (num < math.MinInt32 || num > math.MaxInt32)) { + return md.parseErr(errParseRange{i: num, size: rvk.String()}) + } + rv.SetInt(num) + case rvk >= reflect.Uint && rvk <= reflect.Uint64: + unum := uint64(num) + if rvk == reflect.Uint8 && (num < 0 || unum > math.MaxUint8) || + rvk == reflect.Uint16 && (num < 0 || unum > math.MaxUint16) || + rvk == reflect.Uint32 && (num < 0 || unum > math.MaxUint32) { + return md.parseErr(errParseRange{i: num, size: rvk.String()}) + } + rv.SetUint(unum) + default: + panic("unreachable") + } + return nil } func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { @@ -431,7 +486,7 @@ func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { rv.SetBool(b) return nil } - return badtype("boolean", data) + return md.badtype("boolean", data) } func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { @@ -439,10 +494,16 @@ func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { return nil } -func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { +func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) error { var s string switch sdata := data.(type) { - case TextMarshaler: + case Marshaler: + text, err := sdata.MarshalTOML() + if err != nil { + return err + } + s = string(text) + case encoding.TextMarshaler: text, err := sdata.MarshalText() if err != nil { return err @@ -459,7 +520,7 @@ func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { case float64: s = fmt.Sprintf("%f", sdata) default: - return badtype("primitive (string-like)", data) + return md.badtype("primitive (string-like)", data) } if err := v.UnmarshalText([]byte(s)); err != nil { return err @@ -467,22 +528,54 @@ func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { return nil } +func (md *MetaData) badtype(dst string, data interface{}) error { + return md.e("incompatible types: TOML value has type %T; destination has type %s", data, dst) +} + +func (md *MetaData) parseErr(err error) error { + k := md.context.String() + return ParseError{ + LastKey: k, + Position: md.keyInfo[k].pos, + Line: md.keyInfo[k].pos.Line, + err: err, + input: string(md.data), + } +} + +func (md *MetaData) e(format string, args ...interface{}) error { + f := "toml: " + if len(md.context) > 0 { + f = fmt.Sprintf("toml: (last key %q): ", md.context) + p := md.keyInfo[md.context.String()].pos + if p.Line > 0 { + f = fmt.Sprintf("toml: line %d (last key %q): ", p.Line, md.context) + } + } + return fmt.Errorf(f+format, args...) +} + // rvalue returns a reflect.Value of `v`. All pointers are resolved. func rvalue(v interface{}) reflect.Value { return indirect(reflect.ValueOf(v)) } // indirect returns the value pointed to by a pointer. -// Pointers are followed until the value is not a pointer. -// New values are allocated for each nil pointer. // -// An exception to this rule is if the value satisfies an interface of -// interest to us (like encoding.TextUnmarshaler). +// Pointers are followed until the value is not a pointer. New values are +// allocated for each nil pointer. +// +// An exception to this rule is if the value satisfies an interface of interest +// to us (like encoding.TextUnmarshaler). func indirect(v reflect.Value) reflect.Value { if v.Kind() != reflect.Ptr { if v.CanSet() { pv := v.Addr() - if _, ok := pv.Interface().(TextUnmarshaler); ok { + pvi := pv.Interface() + if _, ok := pvi.(encoding.TextUnmarshaler); ok { + return pv + } + if _, ok := pvi.(Unmarshaler); ok { return pv } } @@ -498,12 +591,12 @@ func isUnifiable(rv reflect.Value) bool { if rv.CanSet() { return true } - if _, ok := rv.Interface().(TextUnmarshaler); ok { + rvi := rv.Interface() + if _, ok := rvi.(encoding.TextUnmarshaler); ok { + return true + } + if _, ok := rvi.(Unmarshaler); ok { return true } return false } - -func badtype(expected string, data interface{}) error { - return e("cannot load TOML value of type %T into a Go %s", data, expected) -} diff --git a/vendor/github.com/BurntSushi/toml/decode_go116.go b/vendor/github.com/BurntSushi/toml/decode_go116.go new file mode 100644 index 000000000..086d0b686 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode_go116.go @@ -0,0 +1,19 @@ +//go:build go1.16 +// +build go1.16 + +package toml + +import ( + "io/fs" +) + +// DecodeFS reads the contents of a file from [fs.FS] and decodes it with +// [Decode]. +func DecodeFS(fsys fs.FS, path string, v interface{}) (MetaData, error) { + fp, err := fsys.Open(path) + if err != nil { + return MetaData{}, err + } + defer fp.Close() + return NewDecoder(fp).Decode(v) +} diff --git a/vendor/github.com/BurntSushi/toml/deprecated.go b/vendor/github.com/BurntSushi/toml/deprecated.go new file mode 100644 index 000000000..b9e309717 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/deprecated.go @@ -0,0 +1,29 @@ +package toml + +import ( + "encoding" + "io" +) + +// TextMarshaler is an alias for encoding.TextMarshaler. +// +// Deprecated: use encoding.TextMarshaler +type TextMarshaler encoding.TextMarshaler + +// TextUnmarshaler is an alias for encoding.TextUnmarshaler. +// +// Deprecated: use encoding.TextUnmarshaler +type TextUnmarshaler encoding.TextUnmarshaler + +// PrimitiveDecode is an alias for MetaData.PrimitiveDecode(). +// +// Deprecated: use MetaData.PrimitiveDecode. +func PrimitiveDecode(primValue Primitive, v interface{}) error { + md := MetaData{decoded: make(map[string]struct{})} + return md.unify(primValue.undecoded, rvalue(v)) +} + +// DecodeReader is an alias for NewDecoder(r).Decode(v). +// +// Deprecated: use NewDecoder(reader).Decode(&value). +func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { return NewDecoder(r).Decode(v) } diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go index b371f396e..81a7c0fe9 100644 --- a/vendor/github.com/BurntSushi/toml/doc.go +++ b/vendor/github.com/BurntSushi/toml/doc.go @@ -1,27 +1,11 @@ -/* -Package toml provides facilities for decoding and encoding TOML configuration -files via reflection. There is also support for delaying decoding with -the Primitive type, and querying the set of keys in a TOML document with the -MetaData type. - -The specification implemented: https://github.com/toml-lang/toml - -The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify -whether a file is a valid TOML document. It can also be used to print the -type of each key in a TOML document. - -Testing - -There are two important types of tests used for this package. The first is -contained inside '*_test.go' files and uses the standard Go unit testing -framework. These tests are primarily devoted to holistically testing the -decoder and encoder. - -The second type of testing is used to verify the implementation's adherence -to the TOML specification. These tests have been factored into their own -project: https://github.com/BurntSushi/toml-test - -The reason the tests are in a separate project is so that they can be used by -any implementation of TOML. Namely, it is language agnostic. -*/ +// Package toml implements decoding and encoding of TOML files. +// +// This package supports TOML v1.0.0, as specified at https://toml.io +// +// There is also support for delaying decoding with the Primitive type, and +// querying the set of keys in a TOML document with the MetaData type. +// +// The github.com/BurntSushi/toml/cmd/tomlv package implements a TOML validator, +// and can be used to verify if TOML document is valid. It can also be used to +// print the type of each key. package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go index d905c21a2..9cd25d757 100644 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ b/vendor/github.com/BurntSushi/toml/encode.go @@ -2,57 +2,127 @@ package toml import ( "bufio" + "encoding" + "encoding/json" "errors" "fmt" "io" + "math" "reflect" "sort" "strconv" "strings" "time" + + "github.com/BurntSushi/toml/internal" ) type tomlEncodeError struct{ error } var ( - errArrayMixedElementTypes = errors.New( - "toml: cannot encode array with mixed element types") - errArrayNilElement = errors.New( - "toml: cannot encode array with nil element") - errNonString = errors.New( - "toml: cannot encode a map with non-string key type") - errAnonNonStruct = errors.New( - "toml: cannot encode an anonymous field that is not a struct") - errArrayNoTable = errors.New( - "toml: TOML array element cannot contain a table") - errNoKey = errors.New( - "toml: top-level values must be Go maps or structs") - errAnything = errors.New("") // used in testing + errArrayNilElement = errors.New("toml: cannot encode array with nil element") + errNonString = errors.New("toml: cannot encode a map with non-string key type") + errNoKey = errors.New("toml: top-level values must be Go maps or structs") + errAnything = errors.New("") // used in testing ) -var quotedReplacer = strings.NewReplacer( - "\t", "\\t", - "\n", "\\n", - "\r", "\\r", +var dblQuotedReplacer = strings.NewReplacer( "\"", "\\\"", "\\", "\\\\", + "\x00", `\u0000`, + "\x01", `\u0001`, + "\x02", `\u0002`, + "\x03", `\u0003`, + "\x04", `\u0004`, + "\x05", `\u0005`, + "\x06", `\u0006`, + "\x07", `\u0007`, + "\b", `\b`, + "\t", `\t`, + "\n", `\n`, + "\x0b", `\u000b`, + "\f", `\f`, + "\r", `\r`, + "\x0e", `\u000e`, + "\x0f", `\u000f`, + "\x10", `\u0010`, + "\x11", `\u0011`, + "\x12", `\u0012`, + "\x13", `\u0013`, + "\x14", `\u0014`, + "\x15", `\u0015`, + "\x16", `\u0016`, + "\x17", `\u0017`, + "\x18", `\u0018`, + "\x19", `\u0019`, + "\x1a", `\u001a`, + "\x1b", `\u001b`, + "\x1c", `\u001c`, + "\x1d", `\u001d`, + "\x1e", `\u001e`, + "\x1f", `\u001f`, + "\x7f", `\u007f`, ) -// Encoder controls the encoding of Go values to a TOML document to some -// io.Writer. +var ( + marshalToml = reflect.TypeOf((*Marshaler)(nil)).Elem() + marshalText = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + timeType = reflect.TypeOf((*time.Time)(nil)).Elem() +) + +// Marshaler is the interface implemented by types that can marshal themselves +// into valid TOML. +type Marshaler interface { + MarshalTOML() ([]byte, error) +} + +// Encoder encodes a Go to a TOML document. +// +// The mapping between Go values and TOML values should be precisely the same as +// for [Decode]. +// +// time.Time is encoded as a RFC 3339 string, and time.Duration as its string +// representation. +// +// The [Marshaler] and [encoding.TextMarshaler] interfaces are supported to +// encoding the value as custom TOML. // -// The indentation level can be controlled with the Indent field. +// If you want to write arbitrary binary data then you will need to use +// something like base64 since TOML does not have any binary types. +// +// When encoding TOML hashes (Go maps or structs), keys without any sub-hashes +// are encoded first. +// +// Go maps will be sorted alphabetically by key for deterministic output. +// +// The toml struct tag can be used to provide the key name; if omitted the +// struct field name will be used. If the "omitempty" option is present the +// following value will be skipped: +// +// - arrays, slices, maps, and string with len of 0 +// - struct with all zero values +// - bool false +// +// If omitzero is given all int and float types with a value of 0 will be +// skipped. +// +// Encoding Go values without a corresponding TOML representation will return an +// error. Examples of this includes maps with non-string keys, slices with nil +// elements, embedded non-struct types, and nested slices containing maps or +// structs. (e.g. [][]map[string]string is not allowed but []map[string]string +// is okay, as is []map[string][]string). +// +// NOTE: only exported keys are encoded due to the use of reflection. Unexported +// keys are silently discarded. type Encoder struct { - // A single indentation level. By default it is two spaces. + // String to use for a single indentation level; default is two spaces. Indent string - // hasWritten is whether we have written any output to w yet. - hasWritten bool w *bufio.Writer + hasWritten bool // written any output to w yet? } -// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer -// given. By default, a single indentation level is 2 spaces. +// NewEncoder create a new Encoder. func NewEncoder(w io.Writer) *Encoder { return &Encoder{ w: bufio.NewWriter(w), @@ -60,32 +130,14 @@ func NewEncoder(w io.Writer) *Encoder { } } -// Encode writes a TOML representation of the Go value to the underlying -// io.Writer. If the value given cannot be encoded to a valid TOML document, -// then an error is returned. -// -// The mapping between Go values and TOML values should be precisely the same -// as for the Decode* functions. Similarly, the TextMarshaler interface is -// supported by encoding the resulting bytes as strings. (If you want to write -// arbitrary binary data then you will need to use something like base64 since -// TOML does not have any binary types.) -// -// When encoding TOML hashes (i.e., Go maps or structs), keys without any -// sub-hashes are encoded first. +// Encode writes a TOML representation of the Go value to the [Encoder]'s writer. // -// If a Go map is encoded, then its keys are sorted alphabetically for -// deterministic output. More control over this behavior may be provided if -// there is demand for it. -// -// Encoding Go values without a corresponding TOML representation---like map -// types with non-string keys---will cause an error to be returned. Similarly -// for mixed arrays/slices, arrays/slices with nil elements, embedded -// non-struct types and nested slices containing maps or structs. -// (e.g., [][]map[string]string is not allowed but []map[string]string is OK -// and so is []map[string][]string.) +// An error is returned if the value given cannot be encoded to a valid TOML +// document. func (enc *Encoder) Encode(v interface{}) error { rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { + err := enc.safeEncode(Key([]string{}), rv) + if err != nil { return err } return enc.w.Flush() @@ -106,13 +158,15 @@ func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { } func (enc *Encoder) encode(key Key, rv reflect.Value) { - // Special case. Time needs to be in ISO8601 format. - // Special case. If we can marshal the type to text, then we used that. - // Basically, this prevents the encoder for handling these types as - // generic structs (or whatever the underlying type of a TextMarshaler is). - switch rv.Interface().(type) { - case time.Time, TextMarshaler: - enc.keyEqElement(key, rv) + // If we can marshal the type to text, then we use that. This prevents the + // encoder for handling these types as generic structs (or whatever the + // underlying type of a TextMarshaler is). + switch { + case isMarshaler(rv): + enc.writeKeyValue(key, rv, false) + return + case rv.Type() == primitiveType: // TODO: #76 would make this superfluous after implemented. + enc.encode(key, reflect.ValueOf(rv.Interface().(Primitive).undecoded)) return } @@ -123,12 +177,12 @@ func (enc *Encoder) encode(key Key, rv reflect.Value) { reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: - enc.keyEqElement(key, rv) + enc.writeKeyValue(key, rv, false) case reflect.Array, reflect.Slice: if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { enc.eArrayOfTables(key, rv) } else { - enc.keyEqElement(key, rv) + enc.writeKeyValue(key, rv, false) } case reflect.Interface: if rv.IsNil() { @@ -148,55 +202,114 @@ func (enc *Encoder) encode(key Key, rv reflect.Value) { case reflect.Struct: enc.eTable(key, rv) default: - panic(e("unsupported type for key '%s': %s", key, k)) + encPanic(fmt.Errorf("unsupported type for key '%s': %s", key, k)) } } -// eElement encodes any value that can be an array element (primitives and -// arrays). +// eElement encodes any value that can be an array element. func (enc *Encoder) eElement(rv reflect.Value) { switch v := rv.Interface().(type) { - case time.Time: - // Special case time.Time as a primitive. Has to come before - // TextMarshaler below because time.Time implements - // encoding.TextMarshaler, but we need to always use UTC. - enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) + case time.Time: // Using TextMarshaler adds extra quotes, which we don't want. + format := time.RFC3339Nano + switch v.Location() { + case internal.LocalDatetime: + format = "2006-01-02T15:04:05.999999999" + case internal.LocalDate: + format = "2006-01-02" + case internal.LocalTime: + format = "15:04:05.999999999" + } + switch v.Location() { + default: + enc.wf(v.Format(format)) + case internal.LocalDatetime, internal.LocalDate, internal.LocalTime: + enc.wf(v.In(time.UTC).Format(format)) + } return - case TextMarshaler: - // Special case. Use text marshaler if it's available for this value. - if s, err := v.MarshalText(); err != nil { + case Marshaler: + s, err := v.MarshalTOML() + if err != nil { encPanic(err) - } else { - enc.writeQuoted(string(s)) } + if s == nil { + encPanic(errors.New("MarshalTOML returned nil and no error")) + } + enc.w.Write(s) + return + case encoding.TextMarshaler: + s, err := v.MarshalText() + if err != nil { + encPanic(err) + } + if s == nil { + encPanic(errors.New("MarshalText returned nil and no error")) + } + enc.writeQuoted(string(s)) + return + case time.Duration: + enc.writeQuoted(v.String()) return + case json.Number: + n, _ := rv.Interface().(json.Number) + + if n == "" { /// Useful zero value. + enc.w.WriteByte('0') + return + } else if v, err := n.Int64(); err == nil { + enc.eElement(reflect.ValueOf(v)) + return + } else if v, err := n.Float64(); err == nil { + enc.eElement(reflect.ValueOf(v)) + return + } + encPanic(fmt.Errorf("unable to convert %q to int64 or float64", n)) } + switch rv.Kind() { + case reflect.Ptr: + enc.eElement(rv.Elem()) + return + case reflect.String: + enc.writeQuoted(rv.String()) case reflect.Bool: enc.wf(strconv.FormatBool(rv.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64: + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: enc.wf(strconv.FormatInt(rv.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, - reflect.Uint32, reflect.Uint64: + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: enc.wf(strconv.FormatUint(rv.Uint(), 10)) case reflect.Float32: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) + f := rv.Float() + if math.IsNaN(f) { + enc.wf("nan") + } else if math.IsInf(f, 0) { + enc.wf("%cinf", map[bool]byte{true: '-', false: '+'}[math.Signbit(f)]) + } else { + enc.wf(floatAddDecimal(strconv.FormatFloat(f, 'f', -1, 32))) + } case reflect.Float64: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) + f := rv.Float() + if math.IsNaN(f) { + enc.wf("nan") + } else if math.IsInf(f, 0) { + enc.wf("%cinf", map[bool]byte{true: '-', false: '+'}[math.Signbit(f)]) + } else { + enc.wf(floatAddDecimal(strconv.FormatFloat(f, 'f', -1, 64))) + } case reflect.Array, reflect.Slice: enc.eArrayOrSliceElement(rv) + case reflect.Struct: + enc.eStruct(nil, rv, true) + case reflect.Map: + enc.eMap(nil, rv, true) case reflect.Interface: enc.eElement(rv.Elem()) - case reflect.String: - enc.writeQuoted(rv.String()) default: - panic(e("unexpected primitive type: %s", rv.Kind())) + encPanic(fmt.Errorf("unexpected type: %T", rv.Interface())) } } -// By the TOML spec, all floats must have a decimal with at least one -// number on either side. +// By the TOML spec, all floats must have a decimal with at least one number on +// either side. func floatAddDecimal(fstr string) string { if !strings.Contains(fstr, ".") { return fstr + ".0" @@ -205,14 +318,14 @@ func floatAddDecimal(fstr string) string { } func (enc *Encoder) writeQuoted(s string) { - enc.wf("\"%s\"", quotedReplacer.Replace(s)) + enc.wf("\"%s\"", dblQuotedReplacer.Replace(s)) } func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { length := rv.Len() enc.wf("[") for i := 0; i < length; i++ { - elem := rv.Index(i) + elem := eindirect(rv.Index(i)) enc.eElement(elem) if i != length-1 { enc.wf(", ") @@ -226,44 +339,43 @@ func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { encPanic(errNoKey) } for i := 0; i < rv.Len(); i++ { - trv := rv.Index(i) + trv := eindirect(rv.Index(i)) if isNil(trv) { continue } - panicIfInvalidKey(key) enc.newline() - enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) + enc.wf("%s[[%s]]", enc.indentStr(key), key) enc.newline() - enc.eMapOrStruct(key, trv) + enc.eMapOrStruct(key, trv, false) } } func (enc *Encoder) eTable(key Key, rv reflect.Value) { - panicIfInvalidKey(key) if len(key) == 1 { // Output an extra newline between top-level tables. // (The newline isn't written if nothing else has been written though.) enc.newline() } if len(key) > 0 { - enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) + enc.wf("%s[%s]", enc.indentStr(key), key) enc.newline() } - enc.eMapOrStruct(key, rv) + enc.eMapOrStruct(key, rv, false) } -func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { - switch rv := eindirect(rv); rv.Kind() { +func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value, inline bool) { + switch rv.Kind() { case reflect.Map: - enc.eMap(key, rv) + enc.eMap(key, rv, inline) case reflect.Struct: - enc.eStruct(key, rv) + enc.eStruct(key, rv, inline) default: + // Should never happen? panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) } } -func (enc *Encoder) eMap(key Key, rv reflect.Value) { +func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) { rt := rv.Type() if rt.Key().Kind() != reflect.String { encPanic(errNonString) @@ -274,68 +386,100 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value) { var mapKeysDirect, mapKeysSub []string for _, mapKey := range rv.MapKeys() { k := mapKey.String() - if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { + if typeIsTable(tomlTypeOfGo(eindirect(rv.MapIndex(mapKey)))) { mapKeysSub = append(mapKeysSub, k) } else { mapKeysDirect = append(mapKeysDirect, k) } } - var writeMapKeys = func(mapKeys []string) { + var writeMapKeys = func(mapKeys []string, trailC bool) { sort.Strings(mapKeys) - for _, mapKey := range mapKeys { - mrv := rv.MapIndex(reflect.ValueOf(mapKey)) - if isNil(mrv) { - // Don't write anything for nil fields. + for i, mapKey := range mapKeys { + val := eindirect(rv.MapIndex(reflect.ValueOf(mapKey))) + if isNil(val) { continue } - enc.encode(key.add(mapKey), mrv) + + if inline { + enc.writeKeyValue(Key{mapKey}, val, true) + if trailC || i != len(mapKeys)-1 { + enc.wf(", ") + } + } else { + enc.encode(key.add(mapKey), val) + } } } - writeMapKeys(mapKeysDirect) - writeMapKeys(mapKeysSub) + + if inline { + enc.wf("{") + } + writeMapKeys(mapKeysDirect, len(mapKeysSub) > 0) + writeMapKeys(mapKeysSub, false) + if inline { + enc.wf("}") + } } -func (enc *Encoder) eStruct(key Key, rv reflect.Value) { +const is32Bit = (32 << (^uint(0) >> 63)) == 32 + +func pointerTo(t reflect.Type) reflect.Type { + if t.Kind() == reflect.Ptr { + return pointerTo(t.Elem()) + } + return t +} + +func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) { // Write keys for fields directly under this key first, because if we write - // a field that creates a new table, then all keys under it will be in that + // a field that creates a new table then all keys under it will be in that // table (not the one we're writing here). - rt := rv.Type() - var fieldsDirect, fieldsSub [][]int - var addFields func(rt reflect.Type, rv reflect.Value, start []int) + // + // Fields is a [][]int: for fieldsDirect this always has one entry (the + // struct index). For fieldsSub it contains two entries: the parent field + // index from tv, and the field indexes for the fields of the sub. + var ( + rt = rv.Type() + fieldsDirect, fieldsSub [][]int + addFields func(rt reflect.Type, rv reflect.Value, start []int) + ) addFields = func(rt reflect.Type, rv reflect.Value, start []int) { for i := 0; i < rt.NumField(); i++ { f := rt.Field(i) - // skip unexported fields - if f.PkgPath != "" && !f.Anonymous { + isEmbed := f.Anonymous && pointerTo(f.Type).Kind() == reflect.Struct + if f.PkgPath != "" && !isEmbed { /// Skip unexported fields. + continue + } + opts := getOptions(f.Tag) + if opts.skip { continue } - frv := rv.Field(i) - if f.Anonymous { - t := f.Type - switch t.Kind() { - case reflect.Struct: - // Treat anonymous struct fields with - // tag names as though they are not - // anonymous, like encoding/json does. - if getOptions(f.Tag).name == "" { - addFields(t, frv, f.Index) - continue - } - case reflect.Ptr: - if t.Elem().Kind() == reflect.Struct && - getOptions(f.Tag).name == "" { - if !frv.IsNil() { - addFields(t.Elem(), frv.Elem(), f.Index) - } - continue - } - // Fall through to the normal field encoding logic below - // for non-struct anonymous fields. + + frv := eindirect(rv.Field(i)) + + if is32Bit { + // Copy so it works correct on 32bit archs; not clear why this + // is needed. See #314, and https://www.reddit.com/r/golang/comments/pnx8v4 + // This also works fine on 64bit, but 32bit archs are somewhat + // rare and this is a wee bit faster. + copyStart := make([]int, len(start)) + copy(copyStart, start) + start = copyStart + } + + // Treat anonymous struct fields with tag names as though they are + // not anonymous, like encoding/json does. + // + // Non-struct anonymous fields use the normal encoding logic. + if isEmbed { + if getOptions(f.Tag).name == "" && frv.Kind() == reflect.Struct { + addFields(frv.Type(), frv, append(start, f.Index...)) + continue } } - if typeIsHash(tomlTypeOfGo(frv)) { + if typeIsTable(tomlTypeOfGo(frv)) { fieldsSub = append(fieldsSub, append(start, f.Index...)) } else { fieldsDirect = append(fieldsDirect, append(start, f.Index...)) @@ -344,48 +488,81 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value) { } addFields(rt, rv, nil) - var writeFields = func(fields [][]int) { + writeFields := func(fields [][]int) { for _, fieldIndex := range fields { - sft := rt.FieldByIndex(fieldIndex) - sf := rv.FieldByIndex(fieldIndex) - if isNil(sf) { - // Don't write anything for nil fields. + fieldType := rt.FieldByIndex(fieldIndex) + fieldVal := rv.FieldByIndex(fieldIndex) + + opts := getOptions(fieldType.Tag) + if opts.skip { + continue + } + if opts.omitempty && isEmpty(fieldVal) { continue } - opts := getOptions(sft.Tag) - if opts.skip { + fieldVal = eindirect(fieldVal) + + if isNil(fieldVal) { /// Don't write anything for nil fields. continue } - keyName := sft.Name + + keyName := fieldType.Name if opts.name != "" { keyName = opts.name } - if opts.omitempty && isEmpty(sf) { - continue - } - if opts.omitzero && isZero(sf) { + + if opts.omitzero && isZero(fieldVal) { continue } - enc.encode(key.add(keyName), sf) + if inline { + enc.writeKeyValue(Key{keyName}, fieldVal, true) + if fieldIndex[0] != len(fields)-1 { + enc.wf(", ") + } + } else { + enc.encode(key.add(keyName), fieldVal) + } } } + + if inline { + enc.wf("{") + } writeFields(fieldsDirect) writeFields(fieldsSub) + if inline { + enc.wf("}") + } } -// tomlTypeName returns the TOML type name of the Go value's type. It is -// used to determine whether the types of array elements are mixed (which is -// forbidden). If the Go value is nil, then it is illegal for it to be an array -// element, and valueIsNil is returned as true. - -// Returns the TOML type of a Go value. The type may be `nil`, which means -// no concrete TOML type could be found. +// tomlTypeOfGo returns the TOML type name of the Go value's type. +// +// It is used to determine whether the types of array elements are mixed (which +// is forbidden). If the Go value is nil, then it is illegal for it to be an +// array element, and valueIsNil is returned as true. +// +// The type may be `nil`, which means no concrete TOML type could be found. func tomlTypeOfGo(rv reflect.Value) tomlType { if isNil(rv) || !rv.IsValid() { return nil } + + if rv.Kind() == reflect.Struct { + if rv.Type() == timeType { + return tomlDatetime + } + if isMarshaler(rv) { + return tomlString + } + return tomlHash + } + + if isMarshaler(rv) { + return tomlString + } + switch rv.Kind() { case reflect.Bool: return tomlBool @@ -397,7 +574,7 @@ func tomlTypeOfGo(rv reflect.Value) tomlType { case reflect.Float32, reflect.Float64: return tomlFloat case reflect.Array, reflect.Slice: - if typeEqual(tomlHash, tomlArrayType(rv)) { + if isTableArray(rv) { return tomlArrayHash } return tomlArray @@ -407,54 +584,35 @@ func tomlTypeOfGo(rv reflect.Value) tomlType { return tomlString case reflect.Map: return tomlHash - case reflect.Struct: - switch rv.Interface().(type) { - case time.Time: - return tomlDatetime - case TextMarshaler: - return tomlString - default: - return tomlHash - } default: - panic("unexpected reflect.Kind: " + rv.Kind().String()) + encPanic(errors.New("unsupported type: " + rv.Kind().String())) + panic("unreachable") } } -// tomlArrayType returns the element type of a TOML array. The type returned -// may be nil if it cannot be determined (e.g., a nil slice or a zero length -// slize). This function may also panic if it finds a type that cannot be -// expressed in TOML (such as nil elements, heterogeneous arrays or directly -// nested arrays of tables). -func tomlArrayType(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { - return nil - } - firstType := tomlTypeOfGo(rv.Index(0)) - if firstType == nil { - encPanic(errArrayNilElement) +func isMarshaler(rv reflect.Value) bool { + return rv.Type().Implements(marshalText) || rv.Type().Implements(marshalToml) +} + +// isTableArray reports if all entries in the array or slice are a table. +func isTableArray(arr reflect.Value) bool { + if isNil(arr) || !arr.IsValid() || arr.Len() == 0 { + return false } - rvlen := rv.Len() - for i := 1; i < rvlen; i++ { - elem := rv.Index(i) - switch elemType := tomlTypeOfGo(elem); { - case elemType == nil: + ret := true + for i := 0; i < arr.Len(); i++ { + tt := tomlTypeOfGo(eindirect(arr.Index(i))) + // Don't allow nil. + if tt == nil { encPanic(errArrayNilElement) - case !typeEqual(firstType, elemType): - encPanic(errArrayMixedElementTypes) } - } - // If we have a nested array, then we must make sure that the nested - // array contains ONLY primitives. - // This checks arbitrarily nested arrays. - if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { - nest := tomlArrayType(eindirect(rv.Index(0))) - if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { - encPanic(errArrayNoTable) + + if ret && !typeEqual(tomlHash, tt) { + ret = false } } - return firstType + return ret } type tagOptions struct { @@ -499,8 +657,26 @@ func isEmpty(rv reflect.Value) bool { switch rv.Kind() { case reflect.Array, reflect.Slice, reflect.Map, reflect.String: return rv.Len() == 0 + case reflect.Struct: + if rv.Type().Comparable() { + return reflect.Zero(rv.Type()).Interface() == rv.Interface() + } + // Need to also check if all the fields are empty, otherwise something + // like this with uncomparable types will always return true: + // + // type a struct{ field b } + // type b struct{ s []string } + // s := a{field: b{s: []string{"AAA"}}} + for i := 0; i < rv.NumField(); i++ { + if !isEmpty(rv.Field(i)) { + return false + } + } + return true case reflect.Bool: return !rv.Bool() + case reflect.Ptr: + return rv.IsNil() } return false } @@ -511,18 +687,34 @@ func (enc *Encoder) newline() { } } -func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { +// Write a key/value pair: +// +// key = +// +// This is also used for "k = v" in inline tables; so something like this will +// be written in three calls: +// +// ┌───────────────────┐ +// │ ┌───┐ ┌────┐│ +// v v v v vv +// key = {k = 1, k2 = 2} +func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) { + /// Marshaler used on top-level document; call eElement() to just call + /// Marshal{TOML,Text}. if len(key) == 0 { - encPanic(errNoKey) + enc.eElement(val) + return } - panicIfInvalidKey(key) enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) enc.eElement(val) - enc.newline() + if !inline { + enc.newline() + } } func (enc *Encoder) wf(format string, v ...interface{}) { - if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { + _, err := fmt.Fprintf(enc.w, format, v...) + if err != nil { encPanic(err) } enc.hasWritten = true @@ -536,13 +728,25 @@ func encPanic(err error) { panic(tomlEncodeError{err}) } +// Resolve any level of pointers to the actual value (e.g. **string → string). func eindirect(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - return eindirect(v.Elem()) - default: + if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface { + if isMarshaler(v) { + return v + } + if v.CanAddr() { /// Special case for marshalers; see #358. + if pv := v.Addr(); isMarshaler(pv) { + return pv + } + } return v } + + if v.IsNil() { + return v + } + + return eindirect(v.Elem()) } func isNil(rv reflect.Value) bool { @@ -553,16 +757,3 @@ func isNil(rv reflect.Value) bool { return false } } - -func panicIfInvalidKey(key Key) { - for _, k := range key { - if len(k) == 0 { - encPanic(e("Key '%s' is not a valid table name. Key names "+ - "cannot be empty.", key.maybeQuotedAll())) - } - } -} - -func isValidKeyName(s string) bool { - return len(s) != 0 -} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go deleted file mode 100644 index d36e1dd60..000000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.2 - -package toml - -// In order to support Go 1.1, we define our own TextMarshaler and -// TextUnmarshaler types. For Go 1.2+, we just alias them with the -// standard library interfaces. - -import ( - "encoding" -) - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler encoding.TextMarshaler - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go deleted file mode 100644 index e8d503d04..000000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !go1.2 - -package toml - -// These interfaces were introduced in Go 1.2, so we add them manually when -// compiling for Go 1.1. - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler interface { - MarshalText() (text []byte, err error) -} - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/BurntSushi/toml/error.go b/vendor/github.com/BurntSushi/toml/error.go new file mode 100644 index 000000000..efd68865b --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/error.go @@ -0,0 +1,279 @@ +package toml + +import ( + "fmt" + "strings" +) + +// ParseError is returned when there is an error parsing the TOML syntax such as +// invalid syntax, duplicate keys, etc. +// +// In addition to the error message itself, you can also print detailed location +// information with context by using [ErrorWithPosition]: +// +// toml: error: Key 'fruit' was already created and cannot be used as an array. +// +// At line 4, column 2-7: +// +// 2 | fruit = [] +// 3 | +// 4 | [[fruit]] # Not allowed +// ^^^^^ +// +// [ErrorWithUsage] can be used to print the above with some more detailed usage +// guidance: +// +// toml: error: newlines not allowed within inline tables +// +// At line 1, column 18: +// +// 1 | x = [{ key = 42 # +// ^ +// +// Error help: +// +// Inline tables must always be on a single line: +// +// table = {key = 42, second = 43} +// +// It is invalid to split them over multiple lines like so: +// +// # INVALID +// table = { +// key = 42, +// second = 43 +// } +// +// Use regular for this: +// +// [table] +// key = 42 +// second = 43 +type ParseError struct { + Message string // Short technical message. + Usage string // Longer message with usage guidance; may be blank. + Position Position // Position of the error + LastKey string // Last parsed key, may be blank. + + // Line the error occurred. + // + // Deprecated: use [Position]. + Line int + + err error + input string +} + +// Position of an error. +type Position struct { + Line int // Line number, starting at 1. + Start int // Start of error, as byte offset starting at 0. + Len int // Lenght in bytes. +} + +func (pe ParseError) Error() string { + msg := pe.Message + if msg == "" { // Error from errorf() + msg = pe.err.Error() + } + + if pe.LastKey == "" { + return fmt.Sprintf("toml: line %d: %s", pe.Position.Line, msg) + } + return fmt.Sprintf("toml: line %d (last key %q): %s", + pe.Position.Line, pe.LastKey, msg) +} + +// ErrorWithPosition returns the error with detailed location context. +// +// See the documentation on [ParseError]. +func (pe ParseError) ErrorWithPosition() string { + if pe.input == "" { // Should never happen, but just in case. + return pe.Error() + } + + var ( + lines = strings.Split(pe.input, "\n") + col = pe.column(lines) + b = new(strings.Builder) + ) + + msg := pe.Message + if msg == "" { + msg = pe.err.Error() + } + + // TODO: don't show control characters as literals? This may not show up + // well everywhere. + + if pe.Position.Len == 1 { + fmt.Fprintf(b, "toml: error: %s\n\nAt line %d, column %d:\n\n", + msg, pe.Position.Line, col+1) + } else { + fmt.Fprintf(b, "toml: error: %s\n\nAt line %d, column %d-%d:\n\n", + msg, pe.Position.Line, col, col+pe.Position.Len) + } + if pe.Position.Line > 2 { + fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line-2, lines[pe.Position.Line-3]) + } + if pe.Position.Line > 1 { + fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line-1, lines[pe.Position.Line-2]) + } + fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line, lines[pe.Position.Line-1]) + fmt.Fprintf(b, "% 10s%s%s\n", "", strings.Repeat(" ", col), strings.Repeat("^", pe.Position.Len)) + return b.String() +} + +// ErrorWithUsage returns the error with detailed location context and usage +// guidance. +// +// See the documentation on [ParseError]. +func (pe ParseError) ErrorWithUsage() string { + m := pe.ErrorWithPosition() + if u, ok := pe.err.(interface{ Usage() string }); ok && u.Usage() != "" { + lines := strings.Split(strings.TrimSpace(u.Usage()), "\n") + for i := range lines { + if lines[i] != "" { + lines[i] = " " + lines[i] + } + } + return m + "Error help:\n\n" + strings.Join(lines, "\n") + "\n" + } + return m +} + +func (pe ParseError) column(lines []string) int { + var pos, col int + for i := range lines { + ll := len(lines[i]) + 1 // +1 for the removed newline + if pos+ll >= pe.Position.Start { + col = pe.Position.Start - pos + if col < 0 { // Should never happen, but just in case. + col = 0 + } + break + } + pos += ll + } + + return col +} + +type ( + errLexControl struct{ r rune } + errLexEscape struct{ r rune } + errLexUTF8 struct{ b byte } + errLexInvalidNum struct{ v string } + errLexInvalidDate struct{ v string } + errLexInlineTableNL struct{} + errLexStringNL struct{} + errParseRange struct { + i interface{} // int or float + size string // "int64", "uint16", etc. + } + errParseDuration struct{ d string } +) + +func (e errLexControl) Error() string { + return fmt.Sprintf("TOML files cannot contain control characters: '0x%02x'", e.r) +} +func (e errLexControl) Usage() string { return "" } + +func (e errLexEscape) Error() string { return fmt.Sprintf(`invalid escape in string '\%c'`, e.r) } +func (e errLexEscape) Usage() string { return usageEscape } +func (e errLexUTF8) Error() string { return fmt.Sprintf("invalid UTF-8 byte: 0x%02x", e.b) } +func (e errLexUTF8) Usage() string { return "" } +func (e errLexInvalidNum) Error() string { return fmt.Sprintf("invalid number: %q", e.v) } +func (e errLexInvalidNum) Usage() string { return "" } +func (e errLexInvalidDate) Error() string { return fmt.Sprintf("invalid date: %q", e.v) } +func (e errLexInvalidDate) Usage() string { return "" } +func (e errLexInlineTableNL) Error() string { return "newlines not allowed within inline tables" } +func (e errLexInlineTableNL) Usage() string { return usageInlineNewline } +func (e errLexStringNL) Error() string { return "strings cannot contain newlines" } +func (e errLexStringNL) Usage() string { return usageStringNewline } +func (e errParseRange) Error() string { return fmt.Sprintf("%v is out of range for %s", e.i, e.size) } +func (e errParseRange) Usage() string { return usageIntOverflow } +func (e errParseDuration) Error() string { return fmt.Sprintf("invalid duration: %q", e.d) } +func (e errParseDuration) Usage() string { return usageDuration } + +const usageEscape = ` +A '\' inside a "-delimited string is interpreted as an escape character. + +The following escape sequences are supported: +\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX + +To prevent a '\' from being recognized as an escape character, use either: + +- a ' or '''-delimited string; escape characters aren't processed in them; or +- write two backslashes to get a single backslash: '\\'. + +If you're trying to add a Windows path (e.g. "C:\Users\martin") then using '/' +instead of '\' will usually also work: "C:/Users/martin". +` + +const usageInlineNewline = ` +Inline tables must always be on a single line: + + table = {key = 42, second = 43} + +It is invalid to split them over multiple lines like so: + + # INVALID + table = { + key = 42, + second = 43 + } + +Use regular for this: + + [table] + key = 42 + second = 43 +` + +const usageStringNewline = ` +Strings must always be on a single line, and cannot span more than one line: + + # INVALID + string = "Hello, + world!" + +Instead use """ or ''' to split strings over multiple lines: + + string = """Hello, + world!""" +` + +const usageIntOverflow = ` +This number is too large; this may be an error in the TOML, but it can also be a +bug in the program that uses too small of an integer. + +The maximum and minimum values are: + + size │ lowest │ highest + ───────┼────────────────┼────────── + int8 │ -128 │ 127 + int16 │ -32,768 │ 32,767 + int32 │ -2,147,483,648 │ 2,147,483,647 + int64 │ -9.2 × 10¹⁷ │ 9.2 × 10¹⁷ + uint8 │ 0 │ 255 + uint16 │ 0 │ 65535 + uint32 │ 0 │ 4294967295 + uint64 │ 0 │ 1.8 × 10¹⁸ + +int refers to int32 on 32-bit systems and int64 on 64-bit systems. +` + +const usageDuration = ` +A duration must be as "number", without any spaces. Valid units are: + + ns nanoseconds (billionth of a second) + us, µs microseconds (millionth of a second) + ms milliseconds (thousands of a second) + s seconds + m minutes + h hours + +You can combine multiple units; for example "5m10s" for 5 minutes and 10 +seconds. +` diff --git a/vendor/github.com/BurntSushi/toml/internal/tz.go b/vendor/github.com/BurntSushi/toml/internal/tz.go new file mode 100644 index 000000000..022f15bc2 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/internal/tz.go @@ -0,0 +1,36 @@ +package internal + +import "time" + +// Timezones used for local datetime, date, and time TOML types. +// +// The exact way times and dates without a timezone should be interpreted is not +// well-defined in the TOML specification and left to the implementation. These +// defaults to current local timezone offset of the computer, but this can be +// changed by changing these variables before decoding. +// +// TODO: +// Ideally we'd like to offer people the ability to configure the used timezone +// by setting Decoder.Timezone and Encoder.Timezone; however, this is a bit +// tricky: the reason we use three different variables for this is to support +// round-tripping – without these specific TZ names we wouldn't know which +// format to use. +// +// There isn't a good way to encode this right now though, and passing this sort +// of information also ties in to various related issues such as string format +// encoding, encoding of comments, etc. +// +// So, for the time being, just put this in internal until we can write a good +// comprehensive API for doing all of this. +// +// The reason they're exported is because they're referred from in e.g. +// internal/tag. +// +// Note that this behaviour is valid according to the TOML spec as the exact +// behaviour is left up to implementations. +var ( + localOffset = func() int { _, o := time.Now().Zone(); return o }() + LocalDatetime = time.FixedZone("datetime-local", localOffset) + LocalDate = time.FixedZone("date-local", localOffset) + LocalTime = time.FixedZone("time-local", localOffset) +) diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go index e0a742a88..3545a6ad6 100644 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ b/vendor/github.com/BurntSushi/toml/lex.go @@ -2,6 +2,8 @@ package toml import ( "fmt" + "reflect" + "runtime" "strings" "unicode" "unicode/utf8" @@ -29,61 +31,49 @@ const ( itemArrayTableStart itemArrayTableEnd itemKeyStart + itemKeyEnd itemCommentStart itemInlineTableStart itemInlineTableEnd ) -const ( - eof = 0 - comma = ',' - tableStart = '[' - tableEnd = ']' - arrayTableStart = '[' - arrayTableEnd = ']' - tableSep = '.' - keySep = '=' - arrayStart = '[' - arrayEnd = ']' - commentStart = '#' - stringStart = '"' - stringEnd = '"' - rawStringStart = '\'' - rawStringEnd = '\'' - inlineTableStart = '{' - inlineTableEnd = '}' -) +const eof = 0 type stateFn func(lx *lexer) stateFn +func (p Position) String() string { + return fmt.Sprintf("at line %d; start %d; length %d", p.Line, p.Start, p.Len) +} + type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item - - // Allow for backing up up to three runes. - // This is necessary because TOML contains 3-rune tokens (""" and '''). - prevWidths [3]int - nprev int // how many of prevWidths are in use - // If we emit an eof, we can still back up, but it is not OK to call - // next again. - atEOF bool + input string + start int + pos int + line int + state stateFn + items chan item + tomlNext bool + + // Allow for backing up up to 4 runes. This is necessary because TOML + // contains 3-rune tokens (""" and '''). + prevWidths [4]int + nprev int // how many of prevWidths are in use + atEOF bool // If we emit an eof, we can still back up, but it is not OK to call next again. // A stack of state functions used to maintain context. - // The idea is to reuse parts of the state machine in various places. - // For example, values can appear at the top level or within arbitrarily - // nested arrays. The last state on the stack is used after a value has - // been lexed. Similarly for comments. + // + // The idea is to reuse parts of the state machine in various places. For + // example, values can appear at the top level or within arbitrarily nested + // arrays. The last state on the stack is used after a value has been lexed. + // Similarly for comments. stack []stateFn } type item struct { - typ itemType - val string - line int + typ itemType + val string + err error + pos Position } func (lx *lexer) nextItem() item { @@ -93,17 +83,19 @@ func (lx *lexer) nextItem() item { return item default: lx.state = lx.state(lx) + //fmt.Printf(" STATE %-24s current: %-10s stack: %s\n", lx.state, lx.current(), lx.stack) } } } -func lex(input string) *lexer { +func lex(input string, tomlNext bool) *lexer { lx := &lexer{ - input: input, - state: lexTop, - line: 1, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), + input: input, + state: lexTop, + items: make(chan item, 10), + stack: make([]stateFn, 0, 10), + line: 1, + tomlNext: tomlNext, } return lx } @@ -125,19 +117,36 @@ func (lx *lexer) current() string { return lx.input[lx.start:lx.pos] } +func (lx lexer) getPos() Position { + p := Position{ + Line: lx.line, + Start: lx.start, + Len: lx.pos - lx.start, + } + if p.Len <= 0 { + p.Len = 1 + } + return p +} + func (lx *lexer) emit(typ itemType) { - lx.items <- item{typ, lx.current(), lx.line} + // Needed for multiline strings ending with an incomplete UTF-8 sequence. + if lx.start > lx.pos { + lx.error(errLexUTF8{lx.input[lx.pos]}) + return + } + lx.items <- item{typ: typ, pos: lx.getPos(), val: lx.current()} lx.start = lx.pos } func (lx *lexer) emitTrim(typ itemType) { - lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} + lx.items <- item{typ: typ, pos: lx.getPos(), val: strings.TrimSpace(lx.current())} lx.start = lx.pos } func (lx *lexer) next() (r rune) { if lx.atEOF { - panic("next called after EOF") + panic("BUG in lexer: next called after EOF") } if lx.pos >= len(lx.input) { lx.atEOF = true @@ -147,12 +156,25 @@ func (lx *lexer) next() (r rune) { if lx.input[lx.pos] == '\n' { lx.line++ } + lx.prevWidths[3] = lx.prevWidths[2] lx.prevWidths[2] = lx.prevWidths[1] lx.prevWidths[1] = lx.prevWidths[0] - if lx.nprev < 3 { + if lx.nprev < 4 { lx.nprev++ } + r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) + if r == utf8.RuneError { + lx.error(errLexUTF8{lx.input[lx.pos]}) + return utf8.RuneError + } + + // Note: don't use peek() here, as this calls next(). + if isControl(r) || (r == '\r' && (len(lx.input)-1 == lx.pos || lx.input[lx.pos+1] != '\n')) { + lx.errorControlChar(r) + return utf8.RuneError + } + lx.prevWidths[0] = w lx.pos += w return r @@ -163,19 +185,21 @@ func (lx *lexer) ignore() { lx.start = lx.pos } -// backup steps back one rune. Can be called only twice between calls to next. +// backup steps back one rune. Can be called 4 times between calls to next. func (lx *lexer) backup() { if lx.atEOF { lx.atEOF = false return } if lx.nprev < 1 { - panic("backed up too far") + panic("BUG in lexer: backed up too far") } w := lx.prevWidths[0] lx.prevWidths[0] = lx.prevWidths[1] lx.prevWidths[1] = lx.prevWidths[2] + lx.prevWidths[2] = lx.prevWidths[3] lx.nprev-- + lx.pos -= w if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { lx.line-- @@ -211,18 +235,58 @@ func (lx *lexer) skip(pred func(rune) bool) { } } -// errorf stops all lexing by emitting an error and returning `nil`. +// error stops all lexing by emitting an error and returning `nil`. +// // Note that any value that is a character is escaped if it's a special // character (newlines, tabs, etc.). +func (lx *lexer) error(err error) stateFn { + if lx.atEOF { + return lx.errorPrevLine(err) + } + lx.items <- item{typ: itemError, pos: lx.getPos(), err: err} + return nil +} + +// errorfPrevline is like error(), but sets the position to the last column of +// the previous line. +// +// This is so that unexpected EOF or NL errors don't show on a new blank line. +func (lx *lexer) errorPrevLine(err error) stateFn { + pos := lx.getPos() + pos.Line-- + pos.Len = 1 + pos.Start = lx.pos - 1 + lx.items <- item{typ: itemError, pos: pos, err: err} + return nil +} + +// errorPos is like error(), but allows explicitly setting the position. +func (lx *lexer) errorPos(start, length int, err error) stateFn { + pos := lx.getPos() + pos.Start = start + pos.Len = length + lx.items <- item{typ: itemError, pos: pos, err: err} + return nil +} + +// errorf is like error, and creates a new error. func (lx *lexer) errorf(format string, values ...interface{}) stateFn { - lx.items <- item{ - itemError, - fmt.Sprintf(format, values...), - lx.line, + if lx.atEOF { + pos := lx.getPos() + pos.Line-- + pos.Len = 1 + pos.Start = lx.pos - 1 + lx.items <- item{typ: itemError, pos: pos, err: fmt.Errorf(format, values...)} + return nil } + lx.items <- item{typ: itemError, pos: lx.getPos(), err: fmt.Errorf(format, values...)} return nil } +func (lx *lexer) errorControlChar(cc rune) stateFn { + return lx.errorPos(lx.pos-1, 1, errLexControl{cc}) +} + // lexTop consumes elements at the top level of TOML data. func lexTop(lx *lexer) stateFn { r := lx.next() @@ -230,10 +294,10 @@ func lexTop(lx *lexer) stateFn { return lexSkip(lx, lexTop) } switch r { - case commentStart: + case '#': lx.push(lexTop) return lexCommentStart - case tableStart: + case '[': return lexTableStart case eof: if lx.pos > lx.start { @@ -256,7 +320,7 @@ func lexTop(lx *lexer) stateFn { func lexTopEnd(lx *lexer) stateFn { r := lx.next() switch { - case r == commentStart: + case r == '#': // a comment will read to a newline for us. lx.push(lexTop) return lexCommentStart @@ -269,8 +333,9 @@ func lexTopEnd(lx *lexer) stateFn { lx.emit(itemEOF) return nil } - return lx.errorf("expected a top-level item to end with a newline, "+ - "comment, or EOF, but got %q instead", r) + return lx.errorf( + "expected a top-level item to end with a newline, comment, or EOF, but got %q instead", + r) } // lexTable lexes the beginning of a table. Namely, it makes sure that @@ -279,7 +344,7 @@ func lexTopEnd(lx *lexer) stateFn { // It also handles the case that this is an item in an array of tables. // e.g., '[[name]]'. func lexTableStart(lx *lexer) stateFn { - if lx.peek() == arrayTableStart { + if lx.peek() == '[' { lx.next() lx.emit(itemArrayTableStart) lx.push(lexArrayTableEnd) @@ -296,9 +361,8 @@ func lexTableEnd(lx *lexer) stateFn { } func lexArrayTableEnd(lx *lexer) stateFn { - if r := lx.next(); r != arrayTableEnd { - return lx.errorf("expected end of table array name delimiter %q, "+ - "but got %q instead", arrayTableEnd, r) + if r := lx.next(); r != ']' { + return lx.errorf("expected end of table array name delimiter ']', but got %q instead", r) } lx.emit(itemArrayTableEnd) return lexTopEnd @@ -307,31 +371,18 @@ func lexArrayTableEnd(lx *lexer) stateFn { func lexTableNameStart(lx *lexer) stateFn { lx.skip(isWhitespace) switch r := lx.peek(); { - case r == tableEnd || r == eof: - return lx.errorf("unexpected end of table name " + - "(table names cannot be empty)") - case r == tableSep: - return lx.errorf("unexpected table separator " + - "(table names cannot be empty)") - case r == stringStart || r == rawStringStart: + case r == ']' || r == eof: + return lx.errorf("unexpected end of table name (table names cannot be empty)") + case r == '.': + return lx.errorf("unexpected table separator (table names cannot be empty)") + case r == '"' || r == '\'': lx.ignore() lx.push(lexTableNameEnd) - return lexValue // reuse string lexing + return lexQuotedName default: - return lexBareTableName - } -} - -// lexBareTableName lexes the name of a table. It assumes that at least one -// valid character for the table has already been read. -func lexBareTableName(lx *lexer) stateFn { - r := lx.next() - if isBareKeyChar(r) { - return lexBareTableName + lx.push(lexTableNameEnd) + return lexBareName } - lx.backup() - lx.emit(itemText) - return lexTableNameEnd } // lexTableNameEnd reads the end of a piece of a table name, optionally @@ -341,69 +392,107 @@ func lexTableNameEnd(lx *lexer) stateFn { switch r := lx.next(); { case isWhitespace(r): return lexTableNameEnd - case r == tableSep: + case r == '.': lx.ignore() return lexTableNameStart - case r == tableEnd: + case r == ']': return lx.pop() default: - return lx.errorf("expected '.' or ']' to end table name, "+ - "but got %q instead", r) + return lx.errorf("expected '.' or ']' to end table name, but got %q instead", r) } } -// lexKeyStart consumes a key name up until the first non-whitespace character. -// lexKeyStart will ignore whitespace. -func lexKeyStart(lx *lexer) stateFn { - r := lx.peek() +// lexBareName lexes one part of a key or table. +// +// It assumes that at least one valid character for the table has already been +// read. +// +// Lexes only one part, e.g. only 'a' inside 'a.b'. +func lexBareName(lx *lexer) stateFn { + r := lx.next() + if isBareKeyChar(r, lx.tomlNext) { + return lexBareName + } + lx.backup() + lx.emit(itemText) + return lx.pop() +} + +// lexBareName lexes one part of a key or table. +// +// It assumes that at least one valid character for the table has already been +// read. +// +// Lexes only one part, e.g. only '"a"' inside '"a".b'. +func lexQuotedName(lx *lexer) stateFn { + r := lx.next() switch { - case r == keySep: - return lx.errorf("unexpected key separator %q", keySep) - case isWhitespace(r) || isNL(r): - lx.next() - return lexSkip(lx, lexKeyStart) - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.emit(itemKeyStart) - lx.push(lexKeyEnd) - return lexValue // reuse string lexing + case isWhitespace(r): + return lexSkip(lx, lexValue) + case r == '"': + lx.ignore() // ignore the '"' + return lexString + case r == '\'': + lx.ignore() // ignore the "'" + return lexRawString + case r == eof: + return lx.errorf("unexpected EOF; expected value") default: + return lx.errorf("expected value but found %q instead", r) + } +} + +// lexKeyStart consumes all key parts until a '='. +func lexKeyStart(lx *lexer) stateFn { + lx.skip(isWhitespace) + switch r := lx.peek(); { + case r == '=' || r == eof: + return lx.errorf("unexpected '=': key name appears blank") + case r == '.': + return lx.errorf("unexpected '.': keys cannot start with a '.'") + case r == '"' || r == '\'': lx.ignore() + fallthrough + default: // Bare key lx.emit(itemKeyStart) - return lexBareKey + return lexKeyNameStart } } -// lexBareKey consumes the text of a bare key. Assumes that the first character -// (which is not whitespace) has not yet been consumed. -func lexBareKey(lx *lexer) stateFn { - switch r := lx.next(); { - case isBareKeyChar(r): - return lexBareKey - case isWhitespace(r): - lx.backup() - lx.emit(itemText) - return lexKeyEnd - case r == keySep: - lx.backup() - lx.emit(itemText) - return lexKeyEnd +func lexKeyNameStart(lx *lexer) stateFn { + lx.skip(isWhitespace) + switch r := lx.peek(); { + case r == '=' || r == eof: + return lx.errorf("unexpected '='") + case r == '.': + return lx.errorf("unexpected '.'") + case r == '"' || r == '\'': + lx.ignore() + lx.push(lexKeyEnd) + return lexQuotedName default: - return lx.errorf("bare keys cannot contain %q", r) + lx.push(lexKeyEnd) + return lexBareName } } // lexKeyEnd consumes the end of a key and trims whitespace (up to the key // separator). func lexKeyEnd(lx *lexer) stateFn { + lx.skip(isWhitespace) switch r := lx.next(); { - case r == keySep: - return lexSkip(lx, lexValue) case isWhitespace(r): return lexSkip(lx, lexKeyEnd) + case r == eof: + return lx.errorf("unexpected EOF; expected key separator '='") + case r == '.': + lx.ignore() + return lexKeyNameStart + case r == '=': + lx.emit(itemKeyEnd) + return lexSkip(lx, lexValue) default: - return lx.errorf("expected key separator %q, but got %q instead", - keySep, r) + return lx.errorf("expected '.' or '=', but got %q instead", r) } } @@ -422,17 +511,17 @@ func lexValue(lx *lexer) stateFn { return lexNumberOrDateStart } switch r { - case arrayStart: + case '[': lx.ignore() lx.emit(itemArray) return lexArrayValue - case inlineTableStart: + case '{': lx.ignore() lx.emit(itemInlineTableStart) return lexInlineTableValue - case stringStart: - if lx.accept(stringStart) { - if lx.accept(stringStart) { + case '"': + if lx.accept('"') { + if lx.accept('"') { lx.ignore() // Ignore """ return lexMultilineString } @@ -440,9 +529,9 @@ func lexValue(lx *lexer) stateFn { } lx.ignore() // ignore the '"' return lexString - case rawStringStart: - if lx.accept(rawStringStart) { - if lx.accept(rawStringStart) { + case '\'': + if lx.accept('\'') { + if lx.accept('\'') { lx.ignore() // Ignore """ return lexMultilineRawString } @@ -450,10 +539,15 @@ func lexValue(lx *lexer) stateFn { } lx.ignore() // ignore the "'" return lexRawString - case '+', '-': - return lexNumberStart case '.': // special error case, be kind to users return lx.errorf("floats must start with a digit, not '.'") + case 'i', 'n': + if (lx.accept('n') && lx.accept('f')) || (lx.accept('a') && lx.accept('n')) { + lx.emit(itemFloat) + return lx.pop() + } + case '-', '+': + return lexDecimalNumberStart } if unicode.IsLetter(r) { // Be permissive here; lexBool will give a nice error if the @@ -463,6 +557,9 @@ func lexValue(lx *lexer) stateFn { lx.backup() return lexBool } + if r == eof { + return lx.errorf("unexpected EOF; expected value") + } return lx.errorf("expected value but found %q instead", r) } @@ -473,14 +570,12 @@ func lexArrayValue(lx *lexer) stateFn { switch { case isWhitespace(r) || isNL(r): return lexSkip(lx, lexArrayValue) - case r == commentStart: + case r == '#': lx.push(lexArrayValue) return lexCommentStart - case r == comma: + case r == ',': return lx.errorf("unexpected comma") - case r == arrayEnd: - // NOTE(caleb): The spec isn't clear about whether you can have - // a trailing comma or not, so we'll allow it. + case r == ']': return lexArrayEnd } @@ -493,23 +588,20 @@ func lexArrayValue(lx *lexer) stateFn { // the next value (or the end of the array): it ignores whitespace and newlines // and expects either a ',' or a ']'. func lexArrayValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { + switch r := lx.next(); { case isWhitespace(r) || isNL(r): return lexSkip(lx, lexArrayValueEnd) - case r == commentStart: + case r == '#': lx.push(lexArrayValueEnd) return lexCommentStart - case r == comma: + case r == ',': lx.ignore() return lexArrayValue // move on to the next value - case r == arrayEnd: + case r == ']': return lexArrayEnd + default: + return lx.errorf("expected a comma (',') or array terminator (']'), but got %s", runeOrEOF(r)) } - return lx.errorf( - "expected a comma or array terminator %q, but got %q instead", - arrayEnd, r, - ) } // lexArrayEnd finishes the lexing of an array. @@ -528,13 +620,16 @@ func lexInlineTableValue(lx *lexer) stateFn { case isWhitespace(r): return lexSkip(lx, lexInlineTableValue) case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: + if lx.tomlNext { + return lexSkip(lx, lexInlineTableValue) + } + return lx.errorPrevLine(errLexInlineTableNL{}) + case r == '#': lx.push(lexInlineTableValue) return lexCommentStart - case r == comma: + case r == ',': return lx.errorf("unexpected comma") - case r == inlineTableEnd: + case r == '}': return lexInlineTableEnd } lx.backup() @@ -546,23 +641,39 @@ func lexInlineTableValue(lx *lexer) stateFn { // key/value pair and the next pair (or the end of the table): // it ignores whitespace and expects either a ',' or a '}'. func lexInlineTableValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { + switch r := lx.next(); { case isWhitespace(r): return lexSkip(lx, lexInlineTableValueEnd) case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: + if lx.tomlNext { + return lexSkip(lx, lexInlineTableValueEnd) + } + return lx.errorPrevLine(errLexInlineTableNL{}) + case r == '#': lx.push(lexInlineTableValueEnd) return lexCommentStart - case r == comma: + case r == ',': lx.ignore() + lx.skip(isWhitespace) + if lx.peek() == '}' { + if lx.tomlNext { + return lexInlineTableValueEnd + } + return lx.errorf("trailing comma not allowed in inline tables") + } return lexInlineTableValue - case r == inlineTableEnd: + case r == '}': return lexInlineTableEnd + default: + return lx.errorf("expected a comma or an inline table terminator '}', but got %s instead", runeOrEOF(r)) } - return lx.errorf("expected a comma or an inline table terminator %q, "+ - "but got %q instead", inlineTableEnd, r) +} + +func runeOrEOF(r rune) string { + if r == eof { + return "end of file" + } + return "'" + string(r) + "'" } // lexInlineTableEnd finishes the lexing of an inline table. @@ -579,13 +690,13 @@ func lexString(lx *lexer) stateFn { r := lx.next() switch { case r == eof: - return lx.errorf("unexpected EOF") + return lx.errorf(`unexpected EOF; expected '"'`) case isNL(r): - return lx.errorf("strings cannot contain newlines") + return lx.errorPrevLine(errLexStringNL{}) case r == '\\': lx.push(lexString) return lexStringEscape - case r == stringEnd: + case r == '"': lx.backup() lx.emit(itemString) lx.next() @@ -598,19 +709,47 @@ func lexString(lx *lexer) stateFn { // lexMultilineString consumes the inner contents of a string. It assumes that // the beginning '"""' has already been consumed and ignored. func lexMultilineString(lx *lexer) stateFn { - switch lx.next() { + r := lx.next() + switch r { + default: + return lexMultilineString case eof: - return lx.errorf("unexpected EOF") + return lx.errorf(`unexpected EOF; expected '"""'`) case '\\': return lexMultilineStringEscape - case stringEnd: - if lx.accept(stringEnd) { - if lx.accept(stringEnd) { - lx.backup() + case '"': + /// Found " → try to read two more "". + if lx.accept('"') { + if lx.accept('"') { + /// Peek ahead: the string can contain " and "", including at the + /// end: """str""""" + /// 6 or more at the end, however, is an error. + if lx.peek() == '"' { + /// Check if we already lexed 5 's; if so we have 6 now, and + /// that's just too many man! + /// + /// Second check is for the edge case: + /// + /// two quotes allowed. + /// vv + /// """lol \"""""" + /// ^^ ^^^---- closing three + /// escaped + /// + /// But ugly, but it works + if strings.HasSuffix(lx.current(), `"""""`) && !strings.HasSuffix(lx.current(), `\"""""`) { + return lx.errorf(`unexpected '""""""'`) + } + lx.backup() + lx.backup() + return lexMultilineString + } + + lx.backup() /// backup: don't include the """ in the item. lx.backup() lx.backup() lx.emit(itemMultilineString) - lx.next() + lx.next() /// Read over ''' again and discard it. lx.next() lx.next() lx.ignore() @@ -618,8 +757,8 @@ func lexMultilineString(lx *lexer) stateFn { } lx.backup() } + return lexMultilineString } - return lexMultilineString } // lexRawString consumes a raw string. Nothing can be escaped in such a string. @@ -627,35 +766,54 @@ func lexMultilineString(lx *lexer) stateFn { func lexRawString(lx *lexer) stateFn { r := lx.next() switch { + default: + return lexRawString case r == eof: - return lx.errorf("unexpected EOF") + return lx.errorf(`unexpected EOF; expected "'"`) case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == rawStringEnd: + return lx.errorPrevLine(errLexStringNL{}) + case r == '\'': lx.backup() lx.emit(itemRawString) lx.next() lx.ignore() return lx.pop() } - return lexRawString } -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning "'''" has already been consumed and +// lexMultilineRawString consumes a raw string. Nothing can be escaped in such a +// string. It assumes that the beginning triple-' has already been consumed and // ignored. func lexMultilineRawString(lx *lexer) stateFn { - switch lx.next() { + r := lx.next() + switch r { + default: + return lexMultilineRawString case eof: - return lx.errorf("unexpected EOF") - case rawStringEnd: - if lx.accept(rawStringEnd) { - if lx.accept(rawStringEnd) { - lx.backup() + return lx.errorf(`unexpected EOF; expected "'''"`) + case '\'': + /// Found ' → try to read two more ''. + if lx.accept('\'') { + if lx.accept('\'') { + /// Peek ahead: the string can contain ' and '', including at the + /// end: '''str''''' + /// 6 or more at the end, however, is an error. + if lx.peek() == '\'' { + /// Check if we already lexed 5 's; if so we have 6 now, and + /// that's just too many man! + if strings.HasSuffix(lx.current(), "'''''") { + return lx.errorf(`unexpected "''''''"`) + } + lx.backup() + lx.backup() + return lexMultilineRawString + } + + lx.backup() /// backup: don't include the ''' in the item. lx.backup() lx.backup() lx.emit(itemRawMultilineString) - lx.next() + lx.next() /// Read over ''' again and discard it. lx.next() lx.next() lx.ignore() @@ -663,15 +821,14 @@ func lexMultilineRawString(lx *lexer) stateFn { } lx.backup() } + return lexMultilineRawString } - return lexMultilineRawString } // lexMultilineStringEscape consumes an escaped character. It assumes that the // preceding '\\' has already been consumed. func lexMultilineStringEscape(lx *lexer) stateFn { - // Handle the special case first: - if isNL(lx.next()) { + if isNL(lx.next()) { /// \ escaping newline. return lexMultilineString } lx.backup() @@ -682,6 +839,11 @@ func lexMultilineStringEscape(lx *lexer) stateFn { func lexStringEscape(lx *lexer) stateFn { r := lx.next() switch r { + case 'e': + if !lx.tomlNext { + return lx.error(errLexEscape{r}) + } + fallthrough case 'b': fallthrough case 't': @@ -694,16 +856,36 @@ func lexStringEscape(lx *lexer) stateFn { fallthrough case '"': fallthrough + case ' ', '\t': + // Inside """ .. """ strings you can use \ to escape newlines, and any + // amount of whitespace can be between the \ and \n. + fallthrough case '\\': return lx.pop() + case 'x': + if !lx.tomlNext { + return lx.error(errLexEscape{r}) + } + return lexHexEscape case 'u': return lexShortUnicodeEscape case 'U': return lexLongUnicodeEscape } - return lx.errorf("invalid escape character %q; only the following "+ - "escape characters are allowed: "+ - `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) + return lx.error(errLexEscape{r}) +} + +func lexHexEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 2; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf( + `expected two hexadecimal digits after '\x', but got %q instead`, + lx.current()) + } + } + return lx.pop() } func lexShortUnicodeEscape(lx *lexer) stateFn { @@ -711,8 +893,9 @@ func lexShortUnicodeEscape(lx *lexer) stateFn { for i := 0; i < 4; i++ { r = lx.next() if !isHexadecimal(r) { - return lx.errorf(`expected four hexadecimal digits after '\u', `+ - "but got %q instead", lx.current()) + return lx.errorf( + `expected four hexadecimal digits after '\u', but got %q instead`, + lx.current()) } } return lx.pop() @@ -723,28 +906,33 @@ func lexLongUnicodeEscape(lx *lexer) stateFn { for i := 0; i < 8; i++ { r = lx.next() if !isHexadecimal(r) { - return lx.errorf(`expected eight hexadecimal digits after '\U', `+ - "but got %q instead", lx.current()) + return lx.errorf( + `expected eight hexadecimal digits after '\U', but got %q instead`, + lx.current()) } } return lx.pop() } -// lexNumberOrDateStart consumes either an integer, a float, or datetime. +// lexNumberOrDateStart processes the first character of a value which begins +// with a digit. It exists to catch values starting with '0', so that +// lexBaseNumberOrDate can differentiate base prefixed integers from other +// types. func lexNumberOrDateStart(lx *lexer) stateFn { r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } switch r { - case '_': - return lexNumber - case 'e', 'E': - return lexFloat - case '.': - return lx.errorf("floats must start with a digit, not '.'") + case '0': + return lexBaseNumberOrDate } - return lx.errorf("expected a digit but got %q", r) + + if !isDigit(r) { + // The only way to reach this state is if the value starts + // with a digit, so specifically treat anything else as an + // error. + return lx.errorf("expected a digit but got %q", r) + } + + return lexNumberOrDate } // lexNumberOrDate consumes either an integer, float or datetime. @@ -754,10 +942,10 @@ func lexNumberOrDate(lx *lexer) stateFn { return lexNumberOrDate } switch r { - case '-': + case '-', ':': return lexDatetime case '_': - return lexNumber + return lexDecimalNumber case '.', 'e', 'E': return lexFloat } @@ -775,41 +963,156 @@ func lexDatetime(lx *lexer) stateFn { return lexDatetime } switch r { - case '-', 'T', ':', '.', 'Z', '+': + case '-', ':', 'T', 't', ' ', '.', 'Z', 'z', '+': return lexDatetime } lx.backup() - lx.emit(itemDatetime) + lx.emitTrim(itemDatetime) return lx.pop() } -// lexNumberStart consumes either an integer or a float. It assumes that a sign -// has already been read, but that *no* digits have been consumed. -// lexNumberStart will move to the appropriate integer or float states. -func lexNumberStart(lx *lexer) stateFn { - // We MUST see a digit. Even floats have to start with a digit. +// lexHexInteger consumes a hexadecimal integer after seeing the '0x' prefix. +func lexHexInteger(lx *lexer) stateFn { r := lx.next() - if !isDigit(r) { - if r == '.' { - return lx.errorf("floats must start with a digit, not '.'") + if isHexadecimal(r) { + return lexHexInteger + } + switch r { + case '_': + return lexHexInteger + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexOctalInteger consumes an octal integer after seeing the '0o' prefix. +func lexOctalInteger(lx *lexer) stateFn { + r := lx.next() + if isOctal(r) { + return lexOctalInteger + } + switch r { + case '_': + return lexOctalInteger + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexBinaryInteger consumes a binary integer after seeing the '0b' prefix. +func lexBinaryInteger(lx *lexer) stateFn { + r := lx.next() + if isBinary(r) { + return lexBinaryInteger + } + switch r { + case '_': + return lexBinaryInteger + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexDecimalNumber consumes a decimal float or integer. +func lexDecimalNumber(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexDecimalNumber + } + switch r { + case '.', 'e', 'E': + return lexFloat + case '_': + return lexDecimalNumber + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexDecimalNumber consumes the first digit of a number beginning with a sign. +// It assumes the sign has already been consumed. Values which start with a sign +// are only allowed to be decimal integers or floats. +// +// The special "nan" and "inf" values are also recognized. +func lexDecimalNumberStart(lx *lexer) stateFn { + r := lx.next() + + // Special error cases to give users better error messages + switch r { + case 'i': + if !lx.accept('n') || !lx.accept('f') { + return lx.errorf("invalid float: '%s'", lx.current()) } - return lx.errorf("expected a digit but got %q", r) + lx.emit(itemFloat) + return lx.pop() + case 'n': + if !lx.accept('a') || !lx.accept('n') { + return lx.errorf("invalid float: '%s'", lx.current()) + } + lx.emit(itemFloat) + return lx.pop() + case '0': + p := lx.peek() + switch p { + case 'b', 'o', 'x': + return lx.errorf("cannot use sign with non-decimal numbers: '%s%c'", lx.current(), p) + } + case '.': + return lx.errorf("floats must start with a digit, not '.'") } - return lexNumber + + if isDigit(r) { + return lexDecimalNumber + } + + return lx.errorf("expected a digit but got %q", r) } -// lexNumber consumes an integer or a float after seeing the first digit. -func lexNumber(lx *lexer) stateFn { +// lexBaseNumberOrDate differentiates between the possible values which +// start with '0'. It assumes that before reaching this state, the initial '0' +// has been consumed. +func lexBaseNumberOrDate(lx *lexer) stateFn { r := lx.next() + // Note: All datetimes start with at least two digits, so we don't + // handle date characters (':', '-', etc.) here. if isDigit(r) { - return lexNumber + return lexNumberOrDate } switch r { case '_': - return lexNumber + // Can only be decimal, because there can't be an underscore + // between the '0' and the base designator, and dates can't + // contain underscores. + return lexDecimalNumber case '.', 'e', 'E': return lexFloat + case 'b': + r = lx.peek() + if !isBinary(r) { + lx.errorf("not a binary number: '%s%c'", lx.current(), r) + } + return lexBinaryInteger + case 'o': + r = lx.peek() + if !isOctal(r) { + lx.errorf("not an octal number: '%s%c'", lx.current(), r) + } + return lexOctalInteger + case 'x': + r = lx.peek() + if !isHexadecimal(r) { + lx.errorf("not a hexidecimal number: '%s%c'", lx.current(), r) + } + return lexHexInteger } lx.backup() @@ -867,49 +1170,31 @@ func lexCommentStart(lx *lexer) stateFn { // It will consume *up to* the first newline character, and pass control // back to the last state on the stack. func lexComment(lx *lexer) stateFn { - r := lx.peek() - if isNL(r) || r == eof { + switch r := lx.next(); { + case isNL(r) || r == eof: + lx.backup() lx.emit(itemText) return lx.pop() + default: + return lexComment } - lx.next() - return lexComment } // lexSkip ignores all slurped input and moves on to the next state. func lexSkip(lx *lexer, nextState stateFn) stateFn { - return func(lx *lexer) stateFn { - lx.ignore() - return nextState - } -} - -// isWhitespace returns true if `r` is a whitespace character according -// to the spec. -func isWhitespace(r rune) bool { - return r == '\t' || r == ' ' -} - -func isNL(r rune) bool { - return r == '\n' || r == '\r' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -func isHexadecimal(r rune) bool { - return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') + lx.ignore() + return nextState } -func isBareKeyChar(r rune) bool { - return (r >= 'A' && r <= 'Z') || - (r >= 'a' && r <= 'z') || - (r >= '0' && r <= '9') || - r == '_' || - r == '-' +func (s stateFn) String() string { + name := runtime.FuncForPC(reflect.ValueOf(s).Pointer()).Name() + if i := strings.LastIndexByte(name, '.'); i > -1 { + name = name[i+1:] + } + if s == nil { + name = "" + } + return name + "()" } func (itype itemType) String() string { @@ -938,12 +1223,18 @@ func (itype itemType) String() string { return "TableEnd" case itemKeyStart: return "KeyStart" + case itemKeyEnd: + return "KeyEnd" case itemArray: return "Array" case itemArrayEnd: return "ArrayEnd" case itemCommentStart: return "CommentStart" + case itemInlineTableStart: + return "InlineTableStart" + case itemInlineTableEnd: + return "InlineTableEnd" } panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) } @@ -951,3 +1242,42 @@ func (itype itemType) String() string { func (item item) String() string { return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) } + +func isWhitespace(r rune) bool { return r == '\t' || r == ' ' } +func isNL(r rune) bool { return r == '\n' || r == '\r' } +func isControl(r rune) bool { // Control characters except \t, \r, \n + switch r { + case '\t', '\r', '\n': + return false + default: + return (r >= 0x00 && r <= 0x1f) || r == 0x7f + } +} +func isDigit(r rune) bool { return r >= '0' && r <= '9' } +func isBinary(r rune) bool { return r == '0' || r == '1' } +func isOctal(r rune) bool { return r >= '0' && r <= '7' } +func isHexadecimal(r rune) bool { + return (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F') +} + +func isBareKeyChar(r rune, tomlNext bool) bool { + if tomlNext { + return (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z') || + (r >= '0' && r <= '9') || + r == '_' || r == '-' || + r == 0xb2 || r == 0xb3 || r == 0xb9 || (r >= 0xbc && r <= 0xbe) || + (r >= 0xc0 && r <= 0xd6) || (r >= 0xd8 && r <= 0xf6) || (r >= 0xf8 && r <= 0x037d) || + (r >= 0x037f && r <= 0x1fff) || + (r >= 0x200c && r <= 0x200d) || (r >= 0x203f && r <= 0x2040) || + (r >= 0x2070 && r <= 0x218f) || (r >= 0x2460 && r <= 0x24ff) || + (r >= 0x2c00 && r <= 0x2fef) || (r >= 0x3001 && r <= 0xd7ff) || + (r >= 0xf900 && r <= 0xfdcf) || (r >= 0xfdf0 && r <= 0xfffd) || + (r >= 0x10000 && r <= 0xeffff) + } + + return (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z') || + (r >= '0' && r <= '9') || + r == '_' || r == '-' +} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/meta.go similarity index 59% rename from vendor/github.com/BurntSushi/toml/decode_meta.go rename to vendor/github.com/BurntSushi/toml/meta.go index b9914a679..2e78b24e9 100644 --- a/vendor/github.com/BurntSushi/toml/decode_meta.go +++ b/vendor/github.com/BurntSushi/toml/meta.go @@ -1,33 +1,40 @@ package toml -import "strings" +import ( + "strings" +) -// MetaData allows access to meta information about TOML data that may not -// be inferrable via reflection. In particular, whether a key has been defined -// and the TOML type of a key. +// MetaData allows access to meta information about TOML data that's not +// accessible otherwise. +// +// It allows checking if a key is defined in the TOML data, whether any keys +// were undecoded, and the TOML type of a key. type MetaData struct { + context Key // Used only during decoding. + + keyInfo map[string]keyInfo mapping map[string]interface{} - types map[string]tomlType keys []Key - decoded map[string]bool - context Key // Used only during decoding. + decoded map[string]struct{} + data []byte // Input file; for errors. } -// IsDefined returns true if the key given exists in the TOML data. The key -// should be specified hierarchially. e.g., +// IsDefined reports if the key exists in the TOML data. // -// // access the TOML key 'a.b.c' -// IsDefined("a", "b", "c") +// The key should be specified hierarchically, for example to access the TOML +// key "a.b.c" you would use IsDefined("a", "b", "c"). Keys are case sensitive. // -// IsDefined will return false if an empty key given. Keys are case sensitive. +// Returns false for an empty key. func (md *MetaData) IsDefined(key ...string) bool { if len(key) == 0 { return false } - var hash map[string]interface{} - var ok bool - var hashOrVal interface{} = md.mapping + var ( + hash map[string]interface{} + ok bool + hashOrVal interface{} = md.mapping + ) for _, k := range key { if hash, ok = hashOrVal.(map[string]interface{}); !ok { return false @@ -41,58 +48,20 @@ func (md *MetaData) IsDefined(key ...string) bool { // Type returns a string representation of the type of the key specified. // -// Type will return the empty string if given an empty key or a key that -// does not exist. Keys are case sensitive. +// Type will return the empty string if given an empty key or a key that does +// not exist. Keys are case sensitive. func (md *MetaData) Type(key ...string) string { - fullkey := strings.Join(key, ".") - if typ, ok := md.types[fullkey]; ok { - return typ.typeString() + if ki, ok := md.keyInfo[Key(key).String()]; ok { + return ki.tomlType.typeString() } return "" } -// Key is the type of any TOML key, including key groups. Use (MetaData).Keys -// to get values of this type. -type Key []string - -func (k Key) String() string { - return strings.Join(k, ".") -} - -func (k Key) maybeQuotedAll() string { - var ss []string - for i := range k { - ss = append(ss, k.maybeQuoted(i)) - } - return strings.Join(ss, ".") -} - -func (k Key) maybeQuoted(i int) string { - quote := false - for _, c := range k[i] { - if !isBareKeyChar(c) { - quote = true - break - } - } - if quote { - return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" - } - return k[i] -} - -func (k Key) add(piece string) Key { - newKey := make(Key, len(k)+1) - copy(newKey, k) - newKey[len(k)] = piece - return newKey -} - // Keys returns a slice of every key in the TOML data, including key groups. -// Each key is itself a slice, where the first element is the top of the -// hierarchy and the last is the most specific. // -// The list will have the same order as the keys appeared in the TOML data. +// Each key is itself a slice, where the first element is the top of the +// hierarchy and the last is the most specific. The list will have the same +// order as the keys appeared in the TOML data. // // All keys returned are non-empty. func (md *MetaData) Keys() []Key { @@ -102,7 +71,7 @@ func (md *MetaData) Keys() []Key { // Undecoded returns all keys that have not been decoded in the order in which // they appear in the original TOML document. // -// This includes keys that haven't been decoded because of a Primitive value. +// This includes keys that haven't been decoded because of a [Primitive] value. // Once the Primitive value is decoded, the keys will be considered decoded. // // Also note that decoding into an empty interface will result in no decoding, @@ -113,9 +82,40 @@ func (md *MetaData) Keys() []Key { func (md *MetaData) Undecoded() []Key { undecoded := make([]Key, 0, len(md.keys)) for _, key := range md.keys { - if !md.decoded[key.String()] { + if _, ok := md.decoded[key.String()]; !ok { undecoded = append(undecoded, key) } } return undecoded } + +// Key represents any TOML key, including key groups. Use [MetaData.Keys] to get +// values of this type. +type Key []string + +func (k Key) String() string { + ss := make([]string, len(k)) + for i := range k { + ss[i] = k.maybeQuoted(i) + } + return strings.Join(ss, ".") +} + +func (k Key) maybeQuoted(i int) string { + if k[i] == "" { + return `""` + } + for _, c := range k[i] { + if !isBareKeyChar(c, false) { + return `"` + dblQuotedReplacer.Replace(k[i]) + `"` + } + } + return k[i] +} + +func (k Key) add(piece string) Key { + newKey := make(Key, len(k)+1) + copy(newKey, k) + newKey[len(k)] = piece + return newKey +} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go index 50869ef92..9c1915369 100644 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ b/vendor/github.com/BurntSushi/toml/parse.go @@ -2,57 +2,80 @@ package toml import ( "fmt" + "os" "strconv" "strings" "time" - "unicode" "unicode/utf8" + + "github.com/BurntSushi/toml/internal" ) type parser struct { - mapping map[string]interface{} - types map[string]tomlType - lx *lexer - - // A list of keys in the order that they appear in the TOML data. - ordered []Key - - // the full key for the current hash in scope - context Key + lx *lexer + context Key // Full key for the current hash in scope. + currentKey string // Base key name for everything except hashes. + pos Position // Current position in the TOML file. + tomlNext bool - // the base key name for everything except hashes - currentKey string + ordered []Key // List of keys in the order that they appear in the TOML data. - // rough approximation of line number - approxLine int - - // A map of 'key.group.names' to whether they were created implicitly. - implicits map[string]bool + keyInfo map[string]keyInfo // Map keyname → info about the TOML key. + mapping map[string]interface{} // Map keyname → key value. + implicits map[string]struct{} // Record implicit keys (e.g. "key.group.names"). } -type parseError string - -func (pe parseError) Error() string { - return string(pe) +type keyInfo struct { + pos Position + tomlType tomlType } func parse(data string) (p *parser, err error) { + _, tomlNext := os.LookupEnv("BURNTSUSHI_TOML_110") + defer func() { if r := recover(); r != nil { - var ok bool - if err, ok = r.(parseError); ok { + if pErr, ok := r.(ParseError); ok { + pErr.input = data + err = pErr return } panic(r) } }() + // Read over BOM; do this here as the lexer calls utf8.DecodeRuneInString() + // which mangles stuff. UTF-16 BOM isn't strictly valid, but some tools add + // it anyway. + if strings.HasPrefix(data, "\xff\xfe") || strings.HasPrefix(data, "\xfe\xff") { // UTF-16 + data = data[2:] + } else if strings.HasPrefix(data, "\xef\xbb\xbf") { // UTF-8 + data = data[3:] + } + + // Examine first few bytes for NULL bytes; this probably means it's a UTF-16 + // file (second byte in surrogate pair being NULL). Again, do this here to + // avoid having to deal with UTF-8/16 stuff in the lexer. + ex := 6 + if len(data) < 6 { + ex = len(data) + } + if i := strings.IndexRune(data[:ex], 0); i > -1 { + return nil, ParseError{ + Message: "files cannot contain NULL bytes; probably using UTF-16; TOML files must be UTF-8", + Position: Position{Line: 1, Start: i, Len: 1}, + Line: 1, + input: data, + } + } + p = &parser{ + keyInfo: make(map[string]keyInfo), mapping: make(map[string]interface{}), - types: make(map[string]tomlType), - lx: lex(data), + lx: lex(data, tomlNext), ordered: make([]Key, 0), - implicits: make(map[string]bool), + implicits: make(map[string]struct{}), + tomlNext: tomlNext, } for { item := p.next() @@ -65,20 +88,57 @@ func parse(data string) (p *parser, err error) { return p, nil } +func (p *parser) panicErr(it item, err error) { + panic(ParseError{ + err: err, + Position: it.pos, + Line: it.pos.Len, + LastKey: p.current(), + }) +} + +func (p *parser) panicItemf(it item, format string, v ...interface{}) { + panic(ParseError{ + Message: fmt.Sprintf(format, v...), + Position: it.pos, + Line: it.pos.Len, + LastKey: p.current(), + }) +} + func (p *parser) panicf(format string, v ...interface{}) { - msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", - p.approxLine, p.current(), fmt.Sprintf(format, v...)) - panic(parseError(msg)) + panic(ParseError{ + Message: fmt.Sprintf(format, v...), + Position: p.pos, + Line: p.pos.Line, + LastKey: p.current(), + }) } func (p *parser) next() item { it := p.lx.nextItem() + //fmt.Printf("ITEM %-18s line %-3d │ %q\n", it.typ, it.pos.Line, it.val) if it.typ == itemError { - p.panicf("%s", it.val) + if it.err != nil { + panic(ParseError{ + Position: it.pos, + Line: it.pos.Line, + LastKey: p.current(), + err: it.err, + }) + } + + p.panicItemf(it, "%s", it.val) } return it } +func (p *parser) nextPos() item { + it := p.next() + p.pos = it.pos + return it +} + func (p *parser) bug(format string, v ...interface{}) { panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) } @@ -97,44 +157,60 @@ func (p *parser) assertEqual(expected, got itemType) { func (p *parser) topLevel(item item) { switch item.typ { - case itemCommentStart: - p.approxLine = item.line + case itemCommentStart: // # .. p.expect(itemText) - case itemTableStart: - kg := p.next() - p.approxLine = kg.line + case itemTableStart: // [ .. ] + name := p.nextPos() var key Key - for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) + for ; name.typ != itemTableEnd && name.typ != itemEOF; name = p.next() { + key = append(key, p.keyString(name)) } - p.assertEqual(itemTableEnd, kg.typ) + p.assertEqual(itemTableEnd, name.typ) - p.establishContext(key, false) - p.setType("", tomlHash) + p.addContext(key, false) + p.setType("", tomlHash, item.pos) p.ordered = append(p.ordered, key) - case itemArrayTableStart: - kg := p.next() - p.approxLine = kg.line + case itemArrayTableStart: // [[ .. ]] + name := p.nextPos() var key Key - for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) + for ; name.typ != itemArrayTableEnd && name.typ != itemEOF; name = p.next() { + key = append(key, p.keyString(name)) } - p.assertEqual(itemArrayTableEnd, kg.typ) + p.assertEqual(itemArrayTableEnd, name.typ) - p.establishContext(key, true) - p.setType("", tomlArrayHash) + p.addContext(key, true) + p.setType("", tomlArrayHash, item.pos) p.ordered = append(p.ordered, key) - case itemKeyStart: - kname := p.next() - p.approxLine = kname.line - p.currentKey = p.keyString(kname) - - val, typ := p.value(p.next()) - p.setValue(p.currentKey, val) - p.setType(p.currentKey, typ) + case itemKeyStart: // key = .. + outerContext := p.context + /// Read all the key parts (e.g. 'a' and 'b' in 'a.b') + k := p.nextPos() + var key Key + for ; k.typ != itemKeyEnd && k.typ != itemEOF; k = p.next() { + key = append(key, p.keyString(k)) + } + p.assertEqual(itemKeyEnd, k.typ) + + /// The current key is the last part. + p.currentKey = key[len(key)-1] + + /// All the other parts (if any) are the context; need to set each part + /// as implicit. + context := key[:len(key)-1] + for i := range context { + p.addImplicitContext(append(p.context, context[i:i+1]...)) + } p.ordered = append(p.ordered, p.context.add(p.currentKey)) + + /// Set value. + vItem := p.next() + val, typ := p.value(vItem, false) + p.set(p.currentKey, val, typ, vItem.pos) + + /// Remove the context we added (preserving any context from [tbl] lines). + p.context = outerContext p.currentKey = "" default: p.bug("Unexpected type at top level: %s", item.typ) @@ -148,180 +224,271 @@ func (p *parser) keyString(it item) string { return it.val case itemString, itemMultilineString, itemRawString, itemRawMultilineString: - s, _ := p.value(it) + s, _ := p.value(it, false) return s.(string) default: p.bug("Unexpected key type: %s", it.typ) - panic("unreachable") } + panic("unreachable") } +var datetimeRepl = strings.NewReplacer( + "z", "Z", + "t", "T", + " ", "T") + // value translates an expected value from the lexer into a Go value wrapped // as an empty interface. -func (p *parser) value(it item) (interface{}, tomlType) { +func (p *parser) value(it item, parentIsArray bool) (interface{}, tomlType) { switch it.typ { case itemString: - return p.replaceEscapes(it.val), p.typeOfPrimitive(it) + return p.replaceEscapes(it, it.val), p.typeOfPrimitive(it) case itemMultilineString: - trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) - return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) + return p.replaceEscapes(it, p.stripEscapedNewlines(stripFirstNewline(it.val))), p.typeOfPrimitive(it) case itemRawString: return it.val, p.typeOfPrimitive(it) case itemRawMultilineString: return stripFirstNewline(it.val), p.typeOfPrimitive(it) + case itemInteger: + return p.valueInteger(it) + case itemFloat: + return p.valueFloat(it) case itemBool: switch it.val { case "true": return true, p.typeOfPrimitive(it) case "false": return false, p.typeOfPrimitive(it) + default: + p.bug("Expected boolean value, but got '%s'.", it.val) } - p.bug("Expected boolean value, but got '%s'.", it.val) - case itemInteger: - if !numUnderscoresOK(it.val) { - p.panicf("Invalid integer %q: underscores must be surrounded by digits", - it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseInt(val, 10, 64) - if err != nil { - // Distinguish integer values. Normally, it'd be a bug if the lexer - // provides an invalid integer, but it's possible that the number is - // out of range of valid values (which the lexer cannot determine). - // So mark the former as a bug but the latter as a legitimate user - // error. - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Integer '%s' is out of the range of 64-bit "+ - "signed integers.", it.val) - } else { - p.bug("Expected integer value, but got '%s'.", it.val) - } + case itemDatetime: + return p.valueDatetime(it) + case itemArray: + return p.valueArray(it) + case itemInlineTableStart: + return p.valueInlineTable(it, parentIsArray) + default: + p.bug("Unexpected value type: %s", it.typ) + } + panic("unreachable") +} + +func (p *parser) valueInteger(it item) (interface{}, tomlType) { + if !numUnderscoresOK(it.val) { + p.panicItemf(it, "Invalid integer %q: underscores must be surrounded by digits", it.val) + } + if numHasLeadingZero(it.val) { + p.panicItemf(it, "Invalid integer %q: cannot have leading zeroes", it.val) + } + + num, err := strconv.ParseInt(it.val, 0, 64) + if err != nil { + // Distinguish integer values. Normally, it'd be a bug if the lexer + // provides an invalid integer, but it's possible that the number is + // out of range of valid values (which the lexer cannot determine). + // So mark the former as a bug but the latter as a legitimate user + // error. + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + p.panicErr(it, errParseRange{i: it.val, size: "int64"}) + } else { + p.bug("Expected integer value, but got '%s'.", it.val) } - return num, p.typeOfPrimitive(it) - case itemFloat: - parts := strings.FieldsFunc(it.val, func(r rune) bool { - switch r { - case '.', 'e', 'E': - return true - } - return false - }) - for _, part := range parts { - if !numUnderscoresOK(part) { - p.panicf("Invalid float %q: underscores must be "+ - "surrounded by digits", it.val) - } + } + return num, p.typeOfPrimitive(it) +} + +func (p *parser) valueFloat(it item) (interface{}, tomlType) { + parts := strings.FieldsFunc(it.val, func(r rune) bool { + switch r { + case '.', 'e', 'E': + return true } - if !numPeriodsOK(it.val) { - // As a special case, numbers like '123.' or '1.e2', - // which are valid as far as Go/strconv are concerned, - // must be rejected because TOML says that a fractional - // part consists of '.' followed by 1+ digits. - p.panicf("Invalid float %q: '.' must be followed "+ - "by one or more digits", it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseFloat(val, 64) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Float '%s' is out of the range of 64-bit "+ - "IEEE-754 floating-point numbers.", it.val) - } else { - p.panicf("Invalid float value: %q", it.val) - } + return false + }) + for _, part := range parts { + if !numUnderscoresOK(part) { + p.panicItemf(it, "Invalid float %q: underscores must be surrounded by digits", it.val) } - return num, p.typeOfPrimitive(it) - case itemDatetime: - var t time.Time - var ok bool - var err error - for _, format := range []string{ - "2006-01-02T15:04:05Z07:00", - "2006-01-02T15:04:05", - "2006-01-02", - } { - t, err = time.ParseInLocation(format, it.val, time.Local) - if err == nil { - ok = true - break - } + } + if len(parts) > 0 && numHasLeadingZero(parts[0]) { + p.panicItemf(it, "Invalid float %q: cannot have leading zeroes", it.val) + } + if !numPeriodsOK(it.val) { + // As a special case, numbers like '123.' or '1.e2', + // which are valid as far as Go/strconv are concerned, + // must be rejected because TOML says that a fractional + // part consists of '.' followed by 1+ digits. + p.panicItemf(it, "Invalid float %q: '.' must be followed by one or more digits", it.val) + } + val := strings.Replace(it.val, "_", "", -1) + if val == "+nan" || val == "-nan" { // Go doesn't support this, but TOML spec does. + val = "nan" + } + num, err := strconv.ParseFloat(val, 64) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + p.panicErr(it, errParseRange{i: it.val, size: "float64"}) + } else { + p.panicItemf(it, "Invalid float value: %q", it.val) } - if !ok { - p.panicf("Invalid TOML Datetime: %q.", it.val) + } + return num, p.typeOfPrimitive(it) +} + +var dtTypes = []struct { + fmt string + zone *time.Location + next bool +}{ + {time.RFC3339Nano, time.Local, false}, + {"2006-01-02T15:04:05.999999999", internal.LocalDatetime, false}, + {"2006-01-02", internal.LocalDate, false}, + {"15:04:05.999999999", internal.LocalTime, false}, + + // tomlNext + {"2006-01-02T15:04Z07:00", time.Local, true}, + {"2006-01-02T15:04", internal.LocalDatetime, true}, + {"15:04", internal.LocalTime, true}, +} + +func (p *parser) valueDatetime(it item) (interface{}, tomlType) { + it.val = datetimeRepl.Replace(it.val) + var ( + t time.Time + ok bool + err error + ) + for _, dt := range dtTypes { + if dt.next && !p.tomlNext { + continue } - return t, p.typeOfPrimitive(it) - case itemArray: - array := make([]interface{}, 0) - types := make([]tomlType, 0) + t, err = time.ParseInLocation(dt.fmt, it.val, dt.zone) + if err == nil { + ok = true + break + } + } + if !ok { + p.panicItemf(it, "Invalid TOML Datetime: %q.", it.val) + } + return t, p.typeOfPrimitive(it) +} - for it = p.next(); it.typ != itemArrayEnd; it = p.next() { - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } +func (p *parser) valueArray(it item) (interface{}, tomlType) { + p.setType(p.currentKey, tomlArray, it.pos) + + var ( + types []tomlType - val, typ := p.value(it) - array = append(array, val) - types = append(types, typ) + // Initialize to a non-nil empty slice. This makes it consistent with + // how S = [] decodes into a non-nil slice inside something like struct + // { S []string }. See #338 + array = []interface{}{} + ) + for it = p.next(); it.typ != itemArrayEnd; it = p.next() { + if it.typ == itemCommentStart { + p.expect(itemText) + continue } - return array, p.typeOfArray(types) - case itemInlineTableStart: - var ( - hash = make(map[string]interface{}) - outerContext = p.context - outerKey = p.currentKey - ) - p.context = append(p.context, p.currentKey) - p.currentKey = "" - for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { - if it.typ != itemKeyStart { - p.bug("Expected key start but instead found %q, around line %d", - it.val, p.approxLine) - } - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } + val, typ := p.value(it, true) + array = append(array, val) + types = append(types, typ) + + // XXX: types isn't used here, we need it to record the accurate type + // information. + // + // Not entirely sure how to best store this; could use "key[0]", + // "key[1]" notation, or maybe store it on the Array type? + _ = types + } + return array, tomlArray +} + +func (p *parser) valueInlineTable(it item, parentIsArray bool) (interface{}, tomlType) { + var ( + hash = make(map[string]interface{}) + outerContext = p.context + outerKey = p.currentKey + ) + + p.context = append(p.context, p.currentKey) + prevContext := p.context + p.currentKey = "" - // retrieve key - k := p.next() - p.approxLine = k.line - kname := p.keyString(k) + p.addImplicit(p.context) + p.addContext(p.context, parentIsArray) - // retrieve value - p.currentKey = kname - val, typ := p.value(p.next()) - // make sure we keep metadata up to date - p.setType(kname, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - hash[kname] = val + /// Loop over all table key/value pairs. + for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { + if it.typ == itemCommentStart { + p.expect(itemText) + continue } - p.context = outerContext - p.currentKey = outerKey - return hash, tomlHash + + /// Read all key parts. + k := p.nextPos() + var key Key + for ; k.typ != itemKeyEnd && k.typ != itemEOF; k = p.next() { + key = append(key, p.keyString(k)) + } + p.assertEqual(itemKeyEnd, k.typ) + + /// The current key is the last part. + p.currentKey = key[len(key)-1] + + /// All the other parts (if any) are the context; need to set each part + /// as implicit. + context := key[:len(key)-1] + for i := range context { + p.addImplicitContext(append(p.context, context[i:i+1]...)) + } + p.ordered = append(p.ordered, p.context.add(p.currentKey)) + + /// Set the value. + val, typ := p.value(p.next(), false) + p.set(p.currentKey, val, typ, it.pos) + hash[p.currentKey] = val + + /// Restore context. + p.context = prevContext } - p.bug("Unexpected value type: %s", it.typ) - panic("unreachable") + p.context = outerContext + p.currentKey = outerKey + return hash, tomlHash +} + +// numHasLeadingZero checks if this number has leading zeroes, allowing for '0', +// +/- signs, and base prefixes. +func numHasLeadingZero(s string) bool { + if len(s) > 1 && s[0] == '0' && !(s[1] == 'b' || s[1] == 'o' || s[1] == 'x') { // Allow 0b, 0o, 0x + return true + } + if len(s) > 2 && (s[0] == '-' || s[0] == '+') && s[1] == '0' { + return true + } + return false } // numUnderscoresOK checks whether each underscore in s is surrounded by // characters that are not underscores. func numUnderscoresOK(s string) bool { + switch s { + case "nan", "+nan", "-nan", "inf", "-inf", "+inf": + return true + } accept := false for _, r := range s { if r == '_' { if !accept { return false } - accept = false - continue } - accept = true + + // isHexadecimal is a superset of all the permissable characters + // surrounding an underscore. + accept = isHexadecimal(r) } return accept } @@ -338,13 +505,12 @@ func numPeriodsOK(s string) bool { return !period } -// establishContext sets the current context of the parser, -// where the context is either a hash or an array of hashes. Which one is -// set depends on the value of the `array` parameter. +// Set the current context of the parser, where the context is either a hash or +// an array of hashes, depending on the value of the `array` parameter. // // Establishing the context also makes sure that the key isn't a duplicate, and // will create implicit hashes automatically. -func (p *parser) establishContext(key Key, array bool) { +func (p *parser) addContext(key Key, array bool) { var ok bool // Always start at the top level and drill down for our context. @@ -383,7 +549,7 @@ func (p *parser) establishContext(key Key, array bool) { // list of tables for it. k := key[len(key)-1] if _, ok := hashContext[k]; !ok { - hashContext[k] = make([]map[string]interface{}, 0, 5) + hashContext[k] = make([]map[string]interface{}, 0, 4) } // Add a new table. But make sure the key hasn't already been used @@ -391,8 +557,7 @@ func (p *parser) establishContext(key Key, array bool) { if hash, ok := hashContext[k].([]map[string]interface{}); ok { hashContext[k] = append(hash, make(map[string]interface{})) } else { - p.panicf("Key '%s' was already created and cannot be used as "+ - "an array.", keyContext) + p.panicf("Key '%s' was already created and cannot be used as an array.", key) } } else { p.setValue(key[len(key)-1], make(map[string]interface{})) @@ -400,15 +565,22 @@ func (p *parser) establishContext(key Key, array bool) { p.context = append(p.context, key[len(key)-1]) } +// set calls setValue and setType. +func (p *parser) set(key string, val interface{}, typ tomlType, pos Position) { + p.setValue(key, val) + p.setType(key, typ, pos) +} + // setValue sets the given key to the given value in the current context. // It will make sure that the key hasn't already been defined, account for // implicit key groups. func (p *parser) setValue(key string, value interface{}) { - var tmpHash interface{} - var ok bool - - hash := p.mapping - keyContext := make(Key, 0) + var ( + tmpHash interface{} + ok bool + hash = p.mapping + keyContext Key + ) for _, k := range p.context { keyContext = append(keyContext, k) if tmpHash, ok = hash[k]; !ok { @@ -422,24 +594,26 @@ func (p *parser) setValue(key string, value interface{}) { case map[string]interface{}: hash = t default: - p.bug("Expected hash to have type 'map[string]interface{}', but "+ - "it has '%T' instead.", tmpHash) + p.panicf("Key '%s' has already been defined.", keyContext) } } keyContext = append(keyContext, key) if _, ok := hash[key]; ok { - // Typically, if the given key has already been set, then we have - // to raise an error since duplicate keys are disallowed. However, - // it's possible that a key was previously defined implicitly. In this - // case, it is allowed to be redefined concretely. (See the - // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) + // Normally redefining keys isn't allowed, but the key could have been + // defined implicitly and it's allowed to be redefined concretely. (See + // the `valid/implicit-and-explicit-after.toml` in toml-test) // // But we have to make sure to stop marking it as an implicit. (So that // another redefinition provokes an error.) // // Note that since it has already been defined (as a hash), we don't // want to overwrite it. So our business is done. + if p.isArray(keyContext) { + p.removeImplicit(keyContext) + hash[key] = value + return + } if p.isImplicit(keyContext) { p.removeImplicit(keyContext) return @@ -449,41 +623,37 @@ func (p *parser) setValue(key string, value interface{}) { // key, which is *always* wrong. p.panicf("Key '%s' has already been defined.", keyContext) } + hash[key] = value } -// setType sets the type of a particular value at a given key. -// It should be called immediately AFTER setValue. +// setType sets the type of a particular value at a given key. It should be +// called immediately AFTER setValue. // // Note that if `key` is empty, then the type given will be applied to the // current context (which is either a table or an array of tables). -func (p *parser) setType(key string, typ tomlType) { +func (p *parser) setType(key string, typ tomlType, pos Position) { keyContext := make(Key, 0, len(p.context)+1) - for _, k := range p.context { - keyContext = append(keyContext, k) - } + keyContext = append(keyContext, p.context...) if len(key) > 0 { // allow type setting for hashes keyContext = append(keyContext, key) } - p.types[keyContext.String()] = typ -} - -// addImplicit sets the given Key as having been created implicitly. -func (p *parser) addImplicit(key Key) { - p.implicits[key.String()] = true -} - -// removeImplicit stops tagging the given key as having been implicitly -// created. -func (p *parser) removeImplicit(key Key) { - p.implicits[key.String()] = false + // Special case to make empty keys ("" = 1) work. + // Without it it will set "" rather than `""`. + // TODO: why is this needed? And why is this only needed here? + if len(keyContext) == 0 { + keyContext = Key{""} + } + p.keyInfo[keyContext.String()] = keyInfo{tomlType: typ, pos: pos} } -// isImplicit returns true if the key group pointed to by the key was created -// implicitly. -func (p *parser) isImplicit(key Key) bool { - return p.implicits[key.String()] -} +// Implicit keys need to be created when tables are implied in "a.b.c.d = 1" and +// "[a.b.c]" (the "a", "b", and "c" hashes are never created explicitly). +func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = struct{}{} } +func (p *parser) removeImplicit(key Key) { delete(p.implicits, key.String()) } +func (p *parser) isImplicit(key Key) bool { _, ok := p.implicits[key.String()]; return ok } +func (p *parser) isArray(key Key) bool { return p.keyInfo[key.String()].tomlType == tomlArray } +func (p *parser) addImplicitContext(key Key) { p.addImplicit(key); p.addContext(key, false) } // current returns the full key name of the current context. func (p *parser) current() string { @@ -497,24 +667,67 @@ func (p *parser) current() string { } func stripFirstNewline(s string) string { - if len(s) == 0 || s[0] != '\n' { - return s + if len(s) > 0 && s[0] == '\n' { + return s[1:] + } + if len(s) > 1 && s[0] == '\r' && s[1] == '\n' { + return s[2:] } - return s[1:] + return s } -func stripEscapedWhitespace(s string) string { - esc := strings.Split(s, "\\\n") - if len(esc) > 1 { - for i := 1; i < len(esc); i++ { - esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) +// stripEscapedNewlines removes whitespace after line-ending backslashes in +// multiline strings. +// +// A line-ending backslash is an unescaped \ followed only by whitespace until +// the next newline. After a line-ending backslash, all whitespace is removed +// until the next non-whitespace character. +func (p *parser) stripEscapedNewlines(s string) string { + var b strings.Builder + var i int + for { + ix := strings.Index(s[i:], `\`) + if ix < 0 { + b.WriteString(s) + return b.String() + } + i += ix + + if len(s) > i+1 && s[i+1] == '\\' { + // Escaped backslash. + i += 2 + continue + } + // Scan until the next non-whitespace. + j := i + 1 + whitespaceLoop: + for ; j < len(s); j++ { + switch s[j] { + case ' ', '\t', '\r', '\n': + default: + break whitespaceLoop + } } + if j == i+1 { + // Not a whitespace escape. + i++ + continue + } + if !strings.Contains(s[i:j], "\n") { + // This is not a line-ending backslash. + // (It's a bad escape sequence, but we can let + // replaceEscapes catch it.) + i++ + continue + } + b.WriteString(s[:i]) + s = s[j:] + i = 0 } - return strings.Join(esc, "") } -func (p *parser) replaceEscapes(str string) string { - var replaced []rune +func (p *parser) replaceEscapes(it item, str string) string { + replaced := make([]rune, 0, len(str)) s := []byte(str) r := 0 for r < len(s) { @@ -532,7 +745,8 @@ func (p *parser) replaceEscapes(str string) string { switch s[r] { default: p.bug("Expected valid escape code after \\, but got %q.", s[r]) - return "" + case ' ', '\t': + p.panicItemf(it, "invalid escape: '\\%c'", s[r]) case 'b': replaced = append(replaced, rune(0x0008)) r += 1 @@ -548,24 +762,35 @@ func (p *parser) replaceEscapes(str string) string { case 'r': replaced = append(replaced, rune(0x000D)) r += 1 + case 'e': + if p.tomlNext { + replaced = append(replaced, rune(0x001B)) + r += 1 + } case '"': replaced = append(replaced, rune(0x0022)) r += 1 case '\\': replaced = append(replaced, rune(0x005C)) r += 1 + case 'x': + if p.tomlNext { + escaped := p.asciiEscapeToUnicode(it, s[r+1:r+3]) + replaced = append(replaced, escaped) + r += 3 + } case 'u': // At this point, we know we have a Unicode escape of the form // `uXXXX` at [r, r+5). (Because the lexer guarantees this // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) + escaped := p.asciiEscapeToUnicode(it, s[r+1:r+5]) replaced = append(replaced, escaped) r += 5 case 'U': // At this point, we know we have a Unicode escape of the form // `uXXXX` at [r, r+9). (Because the lexer guarantees this // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) + escaped := p.asciiEscapeToUnicode(it, s[r+1:r+9]) replaced = append(replaced, escaped) r += 9 } @@ -573,20 +798,14 @@ func (p *parser) replaceEscapes(str string) string { return string(replaced) } -func (p *parser) asciiEscapeToUnicode(bs []byte) rune { +func (p *parser) asciiEscapeToUnicode(it item, bs []byte) rune { s := string(bs) hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) if err != nil { - p.bug("Could not parse '%s' as a hexadecimal number, but the "+ - "lexer claims it's OK: %s", s, err) + p.bug("Could not parse '%s' as a hexadecimal number, but the lexer claims it's OK: %s", s, err) } if !utf8.ValidRune(rune(hex)) { - p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) + p.panicItemf(it, "Escaped character '\\u%s' is not valid UTF-8.", s) } return rune(hex) } - -func isStringType(ty itemType) bool { - return ty == itemString || ty == itemMultilineString || - ty == itemRawString || ty == itemRawMultilineString -} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim deleted file mode 100644 index 562164be0..000000000 --- a/vendor/github.com/BurntSushi/toml/session.vim +++ /dev/null @@ -1 +0,0 @@ -au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go index 608997c22..254ca82e5 100644 --- a/vendor/github.com/BurntSushi/toml/type_fields.go +++ b/vendor/github.com/BurntSushi/toml/type_fields.go @@ -70,8 +70,8 @@ func typeFields(t reflect.Type) []field { next := []field{{typ: t}} // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} + var count map[reflect.Type]int + var nextCount map[reflect.Type]int // Types already visited at an earlier level. visited := map[reflect.Type]bool{} diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_toml.go similarity index 75% rename from vendor/github.com/BurntSushi/toml/type_check.go rename to vendor/github.com/BurntSushi/toml/type_toml.go index c73f8afc1..4e90d7737 100644 --- a/vendor/github.com/BurntSushi/toml/type_check.go +++ b/vendor/github.com/BurntSushi/toml/type_toml.go @@ -16,7 +16,7 @@ func typeEqual(t1, t2 tomlType) bool { return t1.typeString() == t2.typeString() } -func typeIsHash(t tomlType) bool { +func typeIsTable(t tomlType) bool { return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) } @@ -68,24 +68,3 @@ func (p *parser) typeOfPrimitive(lexItem item) tomlType { p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) panic("unreachable") } - -// typeOfArray returns a tomlType for an array given a list of types of its -// values. -// -// In the current spec, if an array is homogeneous, then its type is always -// "Array". If the array is not homogeneous, an error is generated. -func (p *parser) typeOfArray(types []tomlType) tomlType { - // Empty arrays are cool. - if len(types) == 0 { - return tomlArray - } - - theType := types[0] - for _, t := range types[1:] { - if !typeEqual(theType, t) { - p.panicf("Array contains values of type '%s' and '%s', but "+ - "arrays must be homogeneous.", theType, t) - } - } - return tomlArray -} diff --git a/vendor/github.com/agl/ed25519/extra25519/extra25519.go b/vendor/github.com/agl/ed25519/extra25519/extra25519.go deleted file mode 100644 index b897ba538..000000000 --- a/vendor/github.com/agl/ed25519/extra25519/extra25519.go +++ /dev/null @@ -1,340 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package extra25519 - -import ( - "crypto/sha512" - - "github.com/agl/ed25519/edwards25519" -) - -// PrivateKeyToCurve25519 converts an ed25519 private key into a corresponding -// curve25519 private key such that the resulting curve25519 public key will -// equal the result from PublicKeyToCurve25519. -func PrivateKeyToCurve25519(curve25519Private *[32]byte, privateKey *[64]byte) { - h := sha512.New() - h.Write(privateKey[:32]) - digest := h.Sum(nil) - - digest[0] &= 248 - digest[31] &= 127 - digest[31] |= 64 - - copy(curve25519Private[:], digest) -} - -func edwardsToMontgomeryX(outX, y *edwards25519.FieldElement) { - // We only need the x-coordinate of the curve25519 point, which I'll - // call u. The isomorphism is u=(y+1)/(1-y), since y=Y/Z, this gives - // u=(Y+Z)/(Z-Y). We know that Z=1, thus u=(Y+1)/(1-Y). - var oneMinusY edwards25519.FieldElement - edwards25519.FeOne(&oneMinusY) - edwards25519.FeSub(&oneMinusY, &oneMinusY, y) - edwards25519.FeInvert(&oneMinusY, &oneMinusY) - - edwards25519.FeOne(outX) - edwards25519.FeAdd(outX, outX, y) - - edwards25519.FeMul(outX, outX, &oneMinusY) -} - -// PublicKeyToCurve25519 converts an Ed25519 public key into the curve25519 -// public key that would be generated from the same private key. -func PublicKeyToCurve25519(curve25519Public *[32]byte, publicKey *[32]byte) bool { - var A edwards25519.ExtendedGroupElement - if !A.FromBytes(publicKey) { - return false - } - - // A.Z = 1 as a postcondition of FromBytes. - var x edwards25519.FieldElement - edwardsToMontgomeryX(&x, &A.Y) - edwards25519.FeToBytes(curve25519Public, &x) - return true -} - -// sqrtMinusAPlus2 is sqrt(-(486662+2)) -var sqrtMinusAPlus2 = edwards25519.FieldElement{ - -12222970, -8312128, -11511410, 9067497, -15300785, -241793, 25456130, 14121551, -12187136, 3972024, -} - -// sqrtMinusHalf is sqrt(-1/2) -var sqrtMinusHalf = edwards25519.FieldElement{ - -17256545, 3971863, 28865457, -1750208, 27359696, -16640980, 12573105, 1002827, -163343, 11073975, -} - -// halfQMinus1Bytes is (2^255-20)/2 expressed in little endian form. -var halfQMinus1Bytes = [32]byte{ - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, -} - -// feBytesLess returns one if a <= b and zero otherwise. -func feBytesLE(a, b *[32]byte) int32 { - equalSoFar := int32(-1) - greater := int32(0) - - for i := uint(31); i < 32; i-- { - x := int32(a[i]) - y := int32(b[i]) - - greater = (^equalSoFar & greater) | (equalSoFar & ((x - y) >> 31)) - equalSoFar = equalSoFar & (((x ^ y) - 1) >> 31) - } - - return int32(^equalSoFar & 1 & greater) -} - -// ScalarBaseMult computes a curve25519 public key from a private key and also -// a uniform representative for that public key. Note that this function will -// fail and return false for about half of private keys. -// See http://elligator.cr.yp.to/elligator-20130828.pdf. -func ScalarBaseMult(publicKey, representative, privateKey *[32]byte) bool { - var maskedPrivateKey [32]byte - copy(maskedPrivateKey[:], privateKey[:]) - - maskedPrivateKey[0] &= 248 - maskedPrivateKey[31] &= 127 - maskedPrivateKey[31] |= 64 - - var A edwards25519.ExtendedGroupElement - edwards25519.GeScalarMultBase(&A, &maskedPrivateKey) - - var inv1 edwards25519.FieldElement - edwards25519.FeSub(&inv1, &A.Z, &A.Y) - edwards25519.FeMul(&inv1, &inv1, &A.X) - edwards25519.FeInvert(&inv1, &inv1) - - var t0, u edwards25519.FieldElement - edwards25519.FeMul(&u, &inv1, &A.X) - edwards25519.FeAdd(&t0, &A.Y, &A.Z) - edwards25519.FeMul(&u, &u, &t0) - - var v edwards25519.FieldElement - edwards25519.FeMul(&v, &t0, &inv1) - edwards25519.FeMul(&v, &v, &A.Z) - edwards25519.FeMul(&v, &v, &sqrtMinusAPlus2) - - var b edwards25519.FieldElement - edwards25519.FeAdd(&b, &u, &edwards25519.A) - - var c, b3, b7, b8 edwards25519.FieldElement - edwards25519.FeSquare(&b3, &b) // 2 - edwards25519.FeMul(&b3, &b3, &b) // 3 - edwards25519.FeSquare(&c, &b3) // 6 - edwards25519.FeMul(&b7, &c, &b) // 7 - edwards25519.FeMul(&b8, &b7, &b) // 8 - edwards25519.FeMul(&c, &b7, &u) - q58(&c, &c) - - var chi edwards25519.FieldElement - edwards25519.FeSquare(&chi, &c) - edwards25519.FeSquare(&chi, &chi) - - edwards25519.FeSquare(&t0, &u) - edwards25519.FeMul(&chi, &chi, &t0) - - edwards25519.FeSquare(&t0, &b7) // 14 - edwards25519.FeMul(&chi, &chi, &t0) - edwards25519.FeNeg(&chi, &chi) - - var chiBytes [32]byte - edwards25519.FeToBytes(&chiBytes, &chi) - // chi[1] is either 0 or 0xff - if chiBytes[1] == 0xff { - return false - } - - // Calculate r1 = sqrt(-u/(2*(u+A))) - var r1 edwards25519.FieldElement - edwards25519.FeMul(&r1, &c, &u) - edwards25519.FeMul(&r1, &r1, &b3) - edwards25519.FeMul(&r1, &r1, &sqrtMinusHalf) - - var maybeSqrtM1 edwards25519.FieldElement - edwards25519.FeSquare(&t0, &r1) - edwards25519.FeMul(&t0, &t0, &b) - edwards25519.FeAdd(&t0, &t0, &t0) - edwards25519.FeAdd(&t0, &t0, &u) - - edwards25519.FeOne(&maybeSqrtM1) - edwards25519.FeCMove(&maybeSqrtM1, &edwards25519.SqrtM1, edwards25519.FeIsNonZero(&t0)) - edwards25519.FeMul(&r1, &r1, &maybeSqrtM1) - - // Calculate r = sqrt(-(u+A)/(2u)) - var r edwards25519.FieldElement - edwards25519.FeSquare(&t0, &c) // 2 - edwards25519.FeMul(&t0, &t0, &c) // 3 - edwards25519.FeSquare(&t0, &t0) // 6 - edwards25519.FeMul(&r, &t0, &c) // 7 - - edwards25519.FeSquare(&t0, &u) // 2 - edwards25519.FeMul(&t0, &t0, &u) // 3 - edwards25519.FeMul(&r, &r, &t0) - - edwards25519.FeSquare(&t0, &b8) // 16 - edwards25519.FeMul(&t0, &t0, &b8) // 24 - edwards25519.FeMul(&t0, &t0, &b) // 25 - edwards25519.FeMul(&r, &r, &t0) - edwards25519.FeMul(&r, &r, &sqrtMinusHalf) - - edwards25519.FeSquare(&t0, &r) - edwards25519.FeMul(&t0, &t0, &u) - edwards25519.FeAdd(&t0, &t0, &t0) - edwards25519.FeAdd(&t0, &t0, &b) - edwards25519.FeOne(&maybeSqrtM1) - edwards25519.FeCMove(&maybeSqrtM1, &edwards25519.SqrtM1, edwards25519.FeIsNonZero(&t0)) - edwards25519.FeMul(&r, &r, &maybeSqrtM1) - - var vBytes [32]byte - edwards25519.FeToBytes(&vBytes, &v) - vInSquareRootImage := feBytesLE(&vBytes, &halfQMinus1Bytes) - edwards25519.FeCMove(&r, &r1, vInSquareRootImage) - - edwards25519.FeToBytes(publicKey, &u) - edwards25519.FeToBytes(representative, &r) - return true -} - -// q58 calculates out = z^((p-5)/8). -func q58(out, z *edwards25519.FieldElement) { - var t1, t2, t3 edwards25519.FieldElement - var i int - - edwards25519.FeSquare(&t1, z) // 2^1 - edwards25519.FeMul(&t1, &t1, z) // 2^1 + 2^0 - edwards25519.FeSquare(&t1, &t1) // 2^2 + 2^1 - edwards25519.FeSquare(&t2, &t1) // 2^3 + 2^2 - edwards25519.FeSquare(&t2, &t2) // 2^4 + 2^3 - edwards25519.FeMul(&t2, &t2, &t1) // 4,3,2,1 - edwards25519.FeMul(&t1, &t2, z) // 4..0 - edwards25519.FeSquare(&t2, &t1) // 5..1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - edwards25519.FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t2, &t2, &t1) // 19..0 - edwards25519.FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - edwards25519.FeSquare(&t3, &t3) - } - edwards25519.FeMul(&t2, &t3, &t2) // 39..0 - edwards25519.FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 49..0 - edwards25519.FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t2, &t2, &t1) // 99..0 - edwards25519.FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - edwards25519.FeSquare(&t3, &t3) - } - edwards25519.FeMul(&t2, &t3, &t2) // 199..0 - edwards25519.FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 249..0 - edwards25519.FeSquare(&t1, &t1) // 250..1 - edwards25519.FeSquare(&t1, &t1) // 251..2 - edwards25519.FeMul(out, &t1, z) // 251..2,0 -} - -// chi calculates out = z^((p-1)/2). The result is either 1, 0, or -1 depending -// on whether z is a non-zero square, zero, or a non-square. -func chi(out, z *edwards25519.FieldElement) { - var t0, t1, t2, t3 edwards25519.FieldElement - var i int - - edwards25519.FeSquare(&t0, z) // 2^1 - edwards25519.FeMul(&t1, &t0, z) // 2^1 + 2^0 - edwards25519.FeSquare(&t0, &t1) // 2^2 + 2^1 - edwards25519.FeSquare(&t2, &t0) // 2^3 + 2^2 - edwards25519.FeSquare(&t2, &t2) // 4,3 - edwards25519.FeMul(&t2, &t2, &t0) // 4,3,2,1 - edwards25519.FeMul(&t1, &t2, z) // 4..0 - edwards25519.FeSquare(&t2, &t1) // 5..1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - edwards25519.FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t2, &t2, &t1) // 19..0 - edwards25519.FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - edwards25519.FeSquare(&t3, &t3) - } - edwards25519.FeMul(&t2, &t3, &t2) // 39..0 - edwards25519.FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 49..0 - edwards25519.FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t2, &t2, &t1) // 99..0 - edwards25519.FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - edwards25519.FeSquare(&t3, &t3) - } - edwards25519.FeMul(&t2, &t3, &t2) // 199..0 - edwards25519.FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - edwards25519.FeSquare(&t2, &t2) - } - edwards25519.FeMul(&t1, &t2, &t1) // 249..0 - edwards25519.FeSquare(&t1, &t1) // 250..1 - for i = 1; i < 4; i++ { // 253..4 - edwards25519.FeSquare(&t1, &t1) - } - edwards25519.FeMul(out, &t1, &t0) // 253..4,2,1 -} - -// RepresentativeToPublicKey converts a uniform representative value for a -// curve25519 public key, as produced by ScalarBaseMult, to a curve25519 public -// key. -func RepresentativeToPublicKey(publicKey, representative *[32]byte) { - var rr2, v, e edwards25519.FieldElement - edwards25519.FeFromBytes(&rr2, representative) - - edwards25519.FeSquare2(&rr2, &rr2) - rr2[0]++ - edwards25519.FeInvert(&rr2, &rr2) - edwards25519.FeMul(&v, &edwards25519.A, &rr2) - edwards25519.FeNeg(&v, &v) - - var v2, v3 edwards25519.FieldElement - edwards25519.FeSquare(&v2, &v) - edwards25519.FeMul(&v3, &v, &v2) - edwards25519.FeAdd(&e, &v3, &v) - edwards25519.FeMul(&v2, &v2, &edwards25519.A) - edwards25519.FeAdd(&e, &v2, &e) - chi(&e, &e) - var eBytes [32]byte - edwards25519.FeToBytes(&eBytes, &e) - // eBytes[1] is either 0 (for e = 1) or 0xff (for e = -1) - eIsMinus1 := int32(eBytes[1]) & 1 - var negV edwards25519.FieldElement - edwards25519.FeNeg(&negV, &v) - edwards25519.FeCMove(&v, &negV, eIsMinus1) - - edwards25519.FeZero(&v2) - edwards25519.FeCMove(&v2, &edwards25519.A, eIsMinus1) - edwards25519.FeSub(&v, &v, &v2) - - edwards25519.FeToBytes(publicKey, &v) -} diff --git a/vendor/github.com/dchest/siphash/.travis.yml b/vendor/github.com/dchest/siphash/.travis.yml deleted file mode 100644 index 707addd77..000000000 --- a/vendor/github.com/dchest/siphash/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go - -go: - - 1.4 - - 1.5 - - 1.7 - - 1.8 - - 1.9 - - 1.10 - - tip diff --git a/vendor/github.com/dchest/siphash/README.md b/vendor/github.com/dchest/siphash/README.md index a3645e191..5745ded28 100644 --- a/vendor/github.com/dchest/siphash/README.md +++ b/vendor/github.com/dchest/siphash/README.md @@ -1,8 +1,6 @@ SipHash (Go) ============ -[![Build Status](https://travis-ci.org/dchest/siphash.svg)](https://travis-ci.org/dchest/siphash) - Go implementation of SipHash-2-4, a fast short-input PRF created by Jean-Philippe Aumasson and Daniel J. Bernstein (http://131002.net/siphash/). diff --git a/vendor/github.com/dchest/siphash/blocks.go b/vendor/github.com/dchest/siphash/blocks.go index 817b215e3..14e763c41 100644 --- a/vendor/github.com/dchest/siphash/blocks.go +++ b/vendor/github.com/dchest/siphash/blocks.go @@ -1,3 +1,4 @@ +//go:build (!arm && !amd64) || appengine || gccgo // +build !arm,!amd64 appengine gccgo package siphash diff --git a/vendor/github.com/dchest/siphash/blocks_amd64.s b/vendor/github.com/dchest/siphash/blocks_amd64.s index 2d4816f39..2327866d3 100644 --- a/vendor/github.com/dchest/siphash/blocks_amd64.s +++ b/vendor/github.com/dchest/siphash/blocks_amd64.s @@ -1,3 +1,4 @@ +//go:build amd64 && !appengine && !gccgo // +build amd64,!appengine,!gccgo #define ROUND(v0, v1, v2, v3) \ diff --git a/vendor/github.com/dchest/siphash/blocks_asm.go b/vendor/github.com/dchest/siphash/blocks_asm.go index a2383942a..c14b35dc4 100644 --- a/vendor/github.com/dchest/siphash/blocks_asm.go +++ b/vendor/github.com/dchest/siphash/blocks_asm.go @@ -1,3 +1,4 @@ +//go:build arm || (amd64 && !appengine && !gccgo) // +build arm amd64,!appengine,!gccgo // Written in 2012 by Dmitry Chestnykh. diff --git a/vendor/github.com/dchest/siphash/hash.go b/vendor/github.com/dchest/siphash/hash.go index 0de28d0db..875441657 100644 --- a/vendor/github.com/dchest/siphash/hash.go +++ b/vendor/github.com/dchest/siphash/hash.go @@ -1,3 +1,4 @@ +//go:build (!arm && !amd64) || appengine || gccgo // +build !arm,!amd64 appengine gccgo // Written in 2012 by Dmitry Chestnykh. diff --git a/vendor/github.com/dchest/siphash/hash128.go b/vendor/github.com/dchest/siphash/hash128.go index 634ce57cb..f92f77320 100644 --- a/vendor/github.com/dchest/siphash/hash128.go +++ b/vendor/github.com/dchest/siphash/hash128.go @@ -1,4 +1,6 @@ +//go:build (!arm && !amd64) || appengine || gccgo // +build !arm,!amd64 appengine gccgo + // Written in 2012 by Dmitry Chestnykh. // Modifications 2014 for 128-bit hash function by Damian Gryski. // diff --git a/vendor/github.com/dchest/siphash/hash128_amd64.s b/vendor/github.com/dchest/siphash/hash128_amd64.s index 86605ccf9..230cdf2bb 100644 --- a/vendor/github.com/dchest/siphash/hash128_amd64.s +++ b/vendor/github.com/dchest/siphash/hash128_amd64.s @@ -1,3 +1,4 @@ +//go:build amd64 && !appengine && !gccgo // +build amd64,!appengine,!gccgo // This is a translation of the gcc output of FloodyBerry's pure-C public @@ -68,10 +69,8 @@ loopBody: CMPQ R10,DI JA loopBody afterLoop: - SUBQ R10,DX - - CMPQ DX,$0x7 - JA afterSwitch + ANDL $7, DX + JZ afterSwitch // no support for jump tables @@ -93,10 +92,7 @@ afterLoop: CMPQ DX,$0x2 JE sw2 - CMPQ DX,$0x1 - JE sw1 - - JMP afterSwitch + JMP sw1 sw7: MOVBQZX 6(SI)(DI*1),DX SHLQ $0x30,DX diff --git a/vendor/github.com/dchest/siphash/hash_amd64.s b/vendor/github.com/dchest/siphash/hash_amd64.s index 0ca1631ab..b3b87ee67 100644 --- a/vendor/github.com/dchest/siphash/hash_amd64.s +++ b/vendor/github.com/dchest/siphash/hash_amd64.s @@ -1,3 +1,4 @@ +//go:build amd64 && !appengine && !gccgo // +build amd64,!appengine,!gccgo // This is a translation of the gcc output of FloodyBerry's pure-C public @@ -59,10 +60,8 @@ loopBody: CMPQ R10,DI JA loopBody afterLoop: - SUBQ R10,DX - - CMPQ DX,$0x7 - JA afterSwitch + ANDL $7, DX + JZ afterSwitch // no support for jump tables @@ -84,10 +83,7 @@ afterLoop: CMPQ DX,$0x2 JE sw2 - CMPQ DX,$0x1 - JE sw1 - - JMP afterSwitch + JMP sw1 sw7: MOVBQZX 6(SI)(DI*1),DX SHLQ $0x30,DX diff --git a/vendor/github.com/dchest/siphash/hash_arm.go b/vendor/github.com/dchest/siphash/hash_arm.go index 428dd9680..e52f86cd2 100644 --- a/vendor/github.com/dchest/siphash/hash_arm.go +++ b/vendor/github.com/dchest/siphash/hash_arm.go @@ -1,3 +1,4 @@ +//go:build arm // +build arm package siphash diff --git a/vendor/github.com/dchest/siphash/hash_asm.go b/vendor/github.com/dchest/siphash/hash_asm.go index 1437a2a34..c29fb493c 100644 --- a/vendor/github.com/dchest/siphash/hash_asm.go +++ b/vendor/github.com/dchest/siphash/hash_asm.go @@ -1,3 +1,4 @@ +//go:build amd64 && !appengine && !gccgo // +build amd64,!appengine,!gccgo // Written in 2012 by Dmitry Chestnykh. diff --git a/vendor/github.com/flynn/noise/CONTRIBUTING.md b/vendor/github.com/flynn/noise/CONTRIBUTING.md new file mode 100644 index 000000000..71b39ce26 --- /dev/null +++ b/vendor/github.com/flynn/noise/CONTRIBUTING.md @@ -0,0 +1 @@ +See the [Flynn contributing guide](https://flynn.io/docs/contributing). diff --git a/vendor/github.com/refraction-networking/gotapdance/ed25519/LICENSE b/vendor/github.com/flynn/noise/LICENSE similarity index 88% rename from vendor/github.com/refraction-networking/gotapdance/ed25519/LICENSE rename to vendor/github.com/flynn/noise/LICENSE index 744875676..c1398eb3e 100644 --- a/vendor/github.com/refraction-networking/gotapdance/ed25519/LICENSE +++ b/vendor/github.com/flynn/noise/LICENSE @@ -1,4 +1,6 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. +Flynn® is a trademark of Prime Directive, Inc. + +Copyright (c) 2015 Prime Directive, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +12,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Prime Directive, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/github.com/flynn/noise/README.md b/vendor/github.com/flynn/noise/README.md new file mode 100644 index 000000000..018fa7894 --- /dev/null +++ b/vendor/github.com/flynn/noise/README.md @@ -0,0 +1,5 @@ +# noise [![Go Reference](https://pkg.go.dev/badge/github.com/flynn/noise.svg)](https://pkg.go.dev/github.com/flynn/noise) [![CI Status](https://github.com/flynn/noise/actions/workflows/ci.yml/badge.svg)](https://github.com/flynn/noise/actions) + +This is a Go package that implements the [Noise Protocol +Framework](https://noiseprotocol.org). See [the +documentation](https://pkg.go.dev/github.com/flynn/noise) for usage information. diff --git a/vendor/github.com/flynn/noise/cipher_suite.go b/vendor/github.com/flynn/noise/cipher_suite.go new file mode 100644 index 000000000..753e011f6 --- /dev/null +++ b/vendor/github.com/flynn/noise/cipher_suite.go @@ -0,0 +1,224 @@ +package noise + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha256" + "crypto/sha512" + "encoding/binary" + "hash" + "io" + + "golang.org/x/crypto/blake2b" + "golang.org/x/crypto/blake2s" + "golang.org/x/crypto/chacha20poly1305" + "golang.org/x/crypto/curve25519" +) + +// A DHKey is a keypair used for Diffie-Hellman key agreement. +type DHKey struct { + Private []byte + Public []byte +} + +// A DHFunc implements Diffie-Hellman key agreement. +type DHFunc interface { + // GenerateKeypair generates a new keypair using random as a source of + // entropy. + GenerateKeypair(random io.Reader) (DHKey, error) + + // DH performs a Diffie-Hellman calculation between the provided private and + // public keys and returns the result. + DH(privkey, pubkey []byte) ([]byte, error) + + // DHLen is the number of bytes returned by DH. + DHLen() int + + // DHName is the name of the DH function. + DHName() string +} + +// A HashFunc implements a cryptographic hash function. +type HashFunc interface { + // Hash returns a hash state. + Hash() hash.Hash + + // HashName is the name of the hash function. + HashName() string +} + +// A CipherFunc implements an AEAD symmetric cipher. +type CipherFunc interface { + // Cipher initializes the algorithm with the provided key and returns a Cipher. + Cipher(k [32]byte) Cipher + + // CipherName is the name of the cipher. + CipherName() string +} + +// A Cipher is a AEAD cipher that has been initialized with a key. +type Cipher interface { + // Encrypt encrypts the provided plaintext with a nonce and then appends the + // ciphertext to out along with an authentication tag over the ciphertext + // and optional authenticated data. + Encrypt(out []byte, n uint64, ad, plaintext []byte) []byte + + // Decrypt authenticates the ciphertext and optional authenticated data and + // then decrypts the provided ciphertext using the provided nonce and + // appends it to out. + Decrypt(out []byte, n uint64, ad, ciphertext []byte) ([]byte, error) +} + +// A CipherSuite is a set of cryptographic primitives used in a Noise protocol. +// It should be constructed with NewCipherSuite. +type CipherSuite interface { + DHFunc + CipherFunc + HashFunc + Name() []byte +} + +// NewCipherSuite returns a CipherSuite constructed from the specified +// primitives. +func NewCipherSuite(dh DHFunc, c CipherFunc, h HashFunc) CipherSuite { + return ciphersuite{ + DHFunc: dh, + CipherFunc: c, + HashFunc: h, + name: []byte(dh.DHName() + "_" + c.CipherName() + "_" + h.HashName()), + } +} + +type ciphersuite struct { + DHFunc + CipherFunc + HashFunc + name []byte +} + +func (s ciphersuite) Name() []byte { return s.name } + +// DH25519 is the Curve25519 ECDH function. +var DH25519 DHFunc = dh25519{} + +type dh25519 struct{} + +func (dh25519) GenerateKeypair(rng io.Reader) (DHKey, error) { + privkey := make([]byte, 32) + if rng == nil { + rng = rand.Reader + } + if _, err := io.ReadFull(rng, privkey); err != nil { + return DHKey{}, err + } + pubkey, err := curve25519.X25519(privkey, curve25519.Basepoint) + if err != nil { + return DHKey{}, err + } + return DHKey{Private: privkey, Public: pubkey}, nil +} + +func (dh25519) DH(privkey, pubkey []byte) ([]byte, error) { + return curve25519.X25519(privkey, pubkey) +} + +func (dh25519) DHLen() int { return 32 } +func (dh25519) DHName() string { return "25519" } + +type cipherFn struct { + fn func([32]byte) Cipher + name string +} + +func (c cipherFn) Cipher(k [32]byte) Cipher { return c.fn(k) } +func (c cipherFn) CipherName() string { return c.name } + +// CipherAESGCM is the AES256-GCM AEAD cipher. +var CipherAESGCM CipherFunc = cipherFn{cipherAESGCM, "AESGCM"} + +func cipherAESGCM(k [32]byte) Cipher { + c, err := aes.NewCipher(k[:]) + if err != nil { + panic(err) + } + gcm, err := cipher.NewGCM(c) + if err != nil { + panic(err) + } + return aeadCipher{ + gcm, + func(n uint64) []byte { + var nonce [12]byte + binary.BigEndian.PutUint64(nonce[4:], n) + return nonce[:] + }, + } +} + +// CipherChaChaPoly is the ChaCha20-Poly1305 AEAD cipher construction. +var CipherChaChaPoly CipherFunc = cipherFn{cipherChaChaPoly, "ChaChaPoly"} + +func cipherChaChaPoly(k [32]byte) Cipher { + c, err := chacha20poly1305.New(k[:]) + if err != nil { + panic(err) + } + return aeadCipher{ + c, + func(n uint64) []byte { + var nonce [12]byte + binary.LittleEndian.PutUint64(nonce[4:], n) + return nonce[:] + }, + } +} + +type aeadCipher struct { + cipher.AEAD + nonce func(uint64) []byte +} + +func (c aeadCipher) Encrypt(out []byte, n uint64, ad, plaintext []byte) []byte { + return c.Seal(out, c.nonce(n), plaintext, ad) +} + +func (c aeadCipher) Decrypt(out []byte, n uint64, ad, ciphertext []byte) ([]byte, error) { + return c.Open(out, c.nonce(n), ciphertext, ad) +} + +type hashFn struct { + fn func() hash.Hash + name string +} + +func (h hashFn) Hash() hash.Hash { return h.fn() } +func (h hashFn) HashName() string { return h.name } + +// HashSHA256 is the SHA-256 hash function. +var HashSHA256 HashFunc = hashFn{sha256.New, "SHA256"} + +// HashSHA512 is the SHA-512 hash function. +var HashSHA512 HashFunc = hashFn{sha512.New, "SHA512"} + +func blake2bNew() hash.Hash { + h, err := blake2b.New512(nil) + if err != nil { + panic(err) + } + return h +} + +// HashBLAKE2b is the BLAKE2b hash function. +var HashBLAKE2b HashFunc = hashFn{blake2bNew, "BLAKE2b"} + +func blake2sNew() hash.Hash { + h, err := blake2s.New256(nil) + if err != nil { + panic(err) + } + return h +} + +// HashBLAKE2s is the BLAKE2s hash function. +var HashBLAKE2s HashFunc = hashFn{blake2sNew, "BLAKE2s"} diff --git a/vendor/github.com/flynn/noise/hkdf.go b/vendor/github.com/flynn/noise/hkdf.go new file mode 100644 index 000000000..2ea494f5f --- /dev/null +++ b/vendor/github.com/flynn/noise/hkdf.go @@ -0,0 +1,49 @@ +package noise + +import ( + "crypto/hmac" + "hash" +) + +func hkdf(h func() hash.Hash, outputs int, out1, out2, out3, chainingKey, inputKeyMaterial []byte) ([]byte, []byte, []byte) { + if len(out1) > 0 { + panic("len(out1) > 0") + } + if len(out2) > 0 { + panic("len(out2) > 0") + } + if len(out3) > 0 { + panic("len(out3) > 0") + } + if outputs > 3 { + panic("outputs > 3") + } + + tempMAC := hmac.New(h, chainingKey) + tempMAC.Write(inputKeyMaterial) + tempKey := tempMAC.Sum(out2) + + out1MAC := hmac.New(h, tempKey) + out1MAC.Write([]byte{0x01}) + out1 = out1MAC.Sum(out1) + + if outputs == 1 { + return out1, nil, nil + } + + out2MAC := hmac.New(h, tempKey) + out2MAC.Write(out1) + out2MAC.Write([]byte{0x02}) + out2 = out2MAC.Sum(out2) + + if outputs == 2 { + return out1, out2, nil + } + + out3MAC := hmac.New(h, tempKey) + out3MAC.Write(out2) + out3MAC.Write([]byte{0x03}) + out3 = out3MAC.Sum(out3) + + return out1, out2, out3 +} diff --git a/vendor/github.com/flynn/noise/patterns.go b/vendor/github.com/flynn/noise/patterns.go new file mode 100644 index 000000000..7d29d5ba7 --- /dev/null +++ b/vendor/github.com/flynn/noise/patterns.go @@ -0,0 +1,141 @@ +package noise + +var HandshakeNN = HandshakePattern{ + Name: "NN", + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE}, + }, +} + +var HandshakeKN = HandshakePattern{ + Name: "KN", + InitiatorPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE}, + }, +} + +var HandshakeNK = HandshakePattern{ + Name: "NK", + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES}, + {MessagePatternE, MessagePatternDHEE}, + }, +} + +var HandshakeKK = HandshakePattern{ + Name: "KK", + InitiatorPreMessages: []MessagePattern{MessagePatternS}, + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES, MessagePatternDHSS}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE}, + }, +} + +var HandshakeNX = HandshakePattern{ + Name: "NX", + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE, MessagePatternS, MessagePatternDHES}, + }, +} + +var HandshakeKX = HandshakePattern{ + Name: "KX", + InitiatorPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE, MessagePatternS, MessagePatternDHES}, + }, +} + +var HandshakeXN = HandshakePattern{ + Name: "XN", + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE}, + {MessagePatternS, MessagePatternDHSE}, + }, +} + +var HandshakeIN = HandshakePattern{ + Name: "IN", + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternS}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE}, + }, +} + +var HandshakeXK = HandshakePattern{ + Name: "XK", + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES}, + {MessagePatternE, MessagePatternDHEE}, + {MessagePatternS, MessagePatternDHSE}, + }, +} + +var HandshakeIK = HandshakePattern{ + Name: "IK", + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES, MessagePatternS, MessagePatternDHSS}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE}, + }, +} + +var HandshakeXX = HandshakePattern{ + Name: "XX", + Messages: [][]MessagePattern{ + {MessagePatternE}, + {MessagePatternE, MessagePatternDHEE, MessagePatternS, MessagePatternDHES}, + {MessagePatternS, MessagePatternDHSE}, + }, +} + +var HandshakeXXfallback = HandshakePattern{ + Name: "XXfallback", + ResponderPreMessages: []MessagePattern{MessagePatternE}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHEE, MessagePatternS, MessagePatternDHSE}, + {MessagePatternS, MessagePatternDHES}, + }, +} + +var HandshakeIX = HandshakePattern{ + Name: "IX", + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternS}, + {MessagePatternE, MessagePatternDHEE, MessagePatternDHSE, MessagePatternS, MessagePatternDHES}, + }, +} + +var HandshakeN = HandshakePattern{ + Name: "N", + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES}, + }, +} + +var HandshakeK = HandshakePattern{ + Name: "K", + InitiatorPreMessages: []MessagePattern{MessagePatternS}, + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES, MessagePatternDHSS}, + }, +} + +var HandshakeX = HandshakePattern{ + Name: "X", + ResponderPreMessages: []MessagePattern{MessagePatternS}, + Messages: [][]MessagePattern{ + {MessagePatternE, MessagePatternDHES, MessagePatternS, MessagePatternDHSS}, + }, +} diff --git a/vendor/github.com/flynn/noise/state.go b/vendor/github.com/flynn/noise/state.go new file mode 100644 index 000000000..6e9577fa9 --- /dev/null +++ b/vendor/github.com/flynn/noise/state.go @@ -0,0 +1,600 @@ +// Package noise implements the Noise Protocol Framework. +// +// Noise is a low-level framework for building crypto protocols. Noise protocols +// support mutual and optional authentication, identity hiding, forward secrecy, +// zero round-trip encryption, and other advanced features. For more details, +// visit https://noiseprotocol.org. +package noise + +import ( + "crypto/rand" + "errors" + "fmt" + "io" + "math" +) + +// A CipherState provides symmetric encryption and decryption after a successful +// handshake. +type CipherState struct { + cs CipherSuite + c Cipher + k [32]byte + n uint64 + + invalid bool +} + +// MaxNonce is the maximum value of n that is allowed. ErrMaxNonce is returned +// by Encrypt and Decrypt after this has been reached. 2^64-1 is reserved for rekeys. +const MaxNonce = uint64(math.MaxUint64) - 1 + +var ErrMaxNonce = errors.New("noise: cipherstate has reached maximum n, a new handshake must be performed") +var ErrCipherSuiteCopied = errors.New("noise: CipherSuite has been copied, state is invalid") + +// Encrypt encrypts the plaintext and then appends the ciphertext and an +// authentication tag across the ciphertext and optional authenticated data to +// out. This method automatically increments the nonce after every call, so +// messages must be decrypted in the same order. ErrMaxNonce is returned after +// the maximum nonce of 2^64-2 is reached. +func (s *CipherState) Encrypt(out, ad, plaintext []byte) ([]byte, error) { + if s.invalid { + return nil, ErrCipherSuiteCopied + } + if s.n > MaxNonce { + return nil, ErrMaxNonce + } + out = s.c.Encrypt(out, s.n, ad, plaintext) + s.n++ + return out, nil +} + +// Decrypt checks the authenticity of the ciphertext and authenticated data and +// then decrypts and appends the plaintext to out. This method automatically +// increments the nonce after every call, messages must be provided in the same +// order that they were encrypted with no missing messages. ErrMaxNonce is +// returned after the maximum nonce of 2^64-2 is reached. +func (s *CipherState) Decrypt(out, ad, ciphertext []byte) ([]byte, error) { + if s.invalid { + return nil, ErrCipherSuiteCopied + } + if s.n > MaxNonce { + return nil, ErrMaxNonce + } + out, err := s.c.Decrypt(out, s.n, ad, ciphertext) + if err != nil { + return nil, err + } + s.n++ + return out, nil +} + +// Cipher returns the low-level symmetric encryption primitive. It should only +// be used if nonces need to be managed manually, for example with a network +// protocol that can deliver out-of-order messages. This is dangerous, users +// must ensure that they are incrementing a nonce after every encrypt operation. +// After calling this method, it is an error to call Encrypt/Decrypt on the +// CipherState. +func (s *CipherState) Cipher() Cipher { + s.invalid = true + return s.c +} + +// Nonce returns the current value of n. This can be used to determine if a +// new handshake should be performed due to approaching MaxNonce. +func (s *CipherState) Nonce() uint64 { + return s.n +} + +func (s *CipherState) Rekey() { + var zeros [32]byte + var out []byte + out = s.c.Encrypt(out, math.MaxUint64, []byte{}, zeros[:]) + copy(s.k[:], out[:32]) + s.c = s.cs.Cipher(s.k) +} + +type symmetricState struct { + CipherState + hasK bool + ck []byte + h []byte + + prevCK []byte + prevH []byte +} + +func (s *symmetricState) InitializeSymmetric(handshakeName []byte) { + h := s.cs.Hash() + if len(handshakeName) <= h.Size() { + s.h = make([]byte, h.Size()) + copy(s.h, handshakeName) + } else { + h.Write(handshakeName) + s.h = h.Sum(nil) + } + s.ck = make([]byte, len(s.h)) + copy(s.ck, s.h) +} + +func (s *symmetricState) MixKey(dhOutput []byte) { + s.n = 0 + s.hasK = true + var hk []byte + s.ck, hk, _ = hkdf(s.cs.Hash, 2, s.ck[:0], s.k[:0], nil, s.ck, dhOutput) + copy(s.k[:], hk) + s.c = s.cs.Cipher(s.k) +} + +func (s *symmetricState) MixHash(data []byte) { + h := s.cs.Hash() + h.Write(s.h) + h.Write(data) + s.h = h.Sum(s.h[:0]) +} + +func (s *symmetricState) MixKeyAndHash(data []byte) { + var hk []byte + var temp []byte + s.ck, temp, hk = hkdf(s.cs.Hash, 3, s.ck[:0], temp, s.k[:0], s.ck, data) + s.MixHash(temp) + copy(s.k[:], hk) + s.c = s.cs.Cipher(s.k) + s.n = 0 + s.hasK = true +} + +func (s *symmetricState) EncryptAndHash(out, plaintext []byte) ([]byte, error) { + if !s.hasK { + s.MixHash(plaintext) + return append(out, plaintext...), nil + } + ciphertext, err := s.Encrypt(out, s.h, plaintext) + if err != nil { + return nil, err + } + s.MixHash(ciphertext[len(out):]) + return ciphertext, nil +} + +func (s *symmetricState) DecryptAndHash(out, data []byte) ([]byte, error) { + if !s.hasK { + s.MixHash(data) + return append(out, data...), nil + } + plaintext, err := s.Decrypt(out, s.h, data) + if err != nil { + return nil, err + } + s.MixHash(data) + return plaintext, nil +} + +func (s *symmetricState) Split() (*CipherState, *CipherState) { + s1, s2 := &CipherState{cs: s.cs}, &CipherState{cs: s.cs} + hk1, hk2, _ := hkdf(s.cs.Hash, 2, s1.k[:0], s2.k[:0], nil, s.ck, nil) + copy(s1.k[:], hk1) + copy(s2.k[:], hk2) + s1.c = s.cs.Cipher(s1.k) + s2.c = s.cs.Cipher(s2.k) + return s1, s2 +} + +func (s *symmetricState) Checkpoint() { + if len(s.ck) > cap(s.prevCK) { + s.prevCK = make([]byte, len(s.ck)) + } + s.prevCK = s.prevCK[:len(s.ck)] + copy(s.prevCK, s.ck) + + if len(s.h) > cap(s.prevH) { + s.prevH = make([]byte, len(s.h)) + } + s.prevH = s.prevH[:len(s.h)] + copy(s.prevH, s.h) +} + +func (s *symmetricState) Rollback() { + s.ck = s.ck[:len(s.prevCK)] + copy(s.ck, s.prevCK) + s.h = s.h[:len(s.prevH)] + copy(s.h, s.prevH) +} + +// A MessagePattern is a single message or operation used in a Noise handshake. +type MessagePattern int + +// A HandshakePattern is a list of messages and operations that are used to +// perform a specific Noise handshake. +type HandshakePattern struct { + Name string + InitiatorPreMessages []MessagePattern + ResponderPreMessages []MessagePattern + Messages [][]MessagePattern +} + +const ( + MessagePatternS MessagePattern = iota + MessagePatternE + MessagePatternDHEE + MessagePatternDHES + MessagePatternDHSE + MessagePatternDHSS + MessagePatternPSK +) + +// MaxMsgLen is the maximum number of bytes that can be sent in a single Noise +// message. +const MaxMsgLen = 65535 + +// A HandshakeState tracks the state of a Noise handshake. It may be discarded +// after the handshake is complete. +type HandshakeState struct { + ss symmetricState + s DHKey // local static keypair + e DHKey // local ephemeral keypair + rs []byte // remote party's static public key + re []byte // remote party's ephemeral public key + psk []byte // preshared key, maybe zero length + messagePatterns [][]MessagePattern + shouldWrite bool + initiator bool + msgIdx int + rng io.Reader +} + +// A Config provides the details necessary to process a Noise handshake. It is +// never modified by this package, and can be reused. +type Config struct { + // CipherSuite is the set of cryptographic primitives that will be used. + CipherSuite CipherSuite + + // Random is the source for cryptographically appropriate random bytes. If + // zero, it is automatically configured. + Random io.Reader + + // Pattern is the pattern for the handshake. + Pattern HandshakePattern + + // Initiator must be true if the first message in the handshake will be sent + // by this peer. + Initiator bool + + // Prologue is an optional message that has already be communicated and must + // be identical on both sides for the handshake to succeed. + Prologue []byte + + // PresharedKey is the optional preshared key for the handshake. + PresharedKey []byte + + // PresharedKeyPlacement specifies the placement position of the PSK token + // when PresharedKey is specified + PresharedKeyPlacement int + + // StaticKeypair is this peer's static keypair, required if part of the + // handshake. + StaticKeypair DHKey + + // EphemeralKeypair is this peer's ephemeral keypair that was provided as + // a pre-message in the handshake. + EphemeralKeypair DHKey + + // PeerStatic is the static public key of the remote peer that was provided + // as a pre-message in the handshake. + PeerStatic []byte + + // PeerEphemeral is the ephemeral public key of the remote peer that was + // provided as a pre-message in the handshake. + PeerEphemeral []byte +} + +// NewHandshakeState starts a new handshake using the provided configuration. +func NewHandshakeState(c Config) (*HandshakeState, error) { + hs := &HandshakeState{ + s: c.StaticKeypair, + e: c.EphemeralKeypair, + rs: c.PeerStatic, + psk: c.PresharedKey, + messagePatterns: c.Pattern.Messages, + shouldWrite: c.Initiator, + initiator: c.Initiator, + rng: c.Random, + } + if hs.rng == nil { + hs.rng = rand.Reader + } + if len(c.PeerEphemeral) > 0 { + hs.re = make([]byte, len(c.PeerEphemeral)) + copy(hs.re, c.PeerEphemeral) + } + hs.ss.cs = c.CipherSuite + pskModifier := "" + if len(hs.psk) > 0 { + if len(hs.psk) != 32 { + return nil, errors.New("noise: specification mandates 256-bit preshared keys") + } + pskModifier = fmt.Sprintf("psk%d", c.PresharedKeyPlacement) + hs.messagePatterns = append([][]MessagePattern(nil), hs.messagePatterns...) + if c.PresharedKeyPlacement == 0 { + hs.messagePatterns[0] = append([]MessagePattern{MessagePatternPSK}, hs.messagePatterns[0]...) + } else { + hs.messagePatterns[c.PresharedKeyPlacement-1] = append(hs.messagePatterns[c.PresharedKeyPlacement-1], MessagePatternPSK) + } + } + hs.ss.InitializeSymmetric([]byte("Noise_" + c.Pattern.Name + pskModifier + "_" + string(hs.ss.cs.Name()))) + hs.ss.MixHash(c.Prologue) + for _, m := range c.Pattern.InitiatorPreMessages { + switch { + case c.Initiator && m == MessagePatternS: + hs.ss.MixHash(hs.s.Public) + case c.Initiator && m == MessagePatternE: + hs.ss.MixHash(hs.e.Public) + case !c.Initiator && m == MessagePatternS: + hs.ss.MixHash(hs.rs) + case !c.Initiator && m == MessagePatternE: + hs.ss.MixHash(hs.re) + } + } + for _, m := range c.Pattern.ResponderPreMessages { + switch { + case !c.Initiator && m == MessagePatternS: + hs.ss.MixHash(hs.s.Public) + case !c.Initiator && m == MessagePatternE: + hs.ss.MixHash(hs.e.Public) + case c.Initiator && m == MessagePatternS: + hs.ss.MixHash(hs.rs) + case c.Initiator && m == MessagePatternE: + hs.ss.MixHash(hs.re) + } + } + return hs, nil +} + +// WriteMessage appends a handshake message to out. The message will include the +// optional payload if provided. If the handshake is completed by the call, two +// CipherStates will be returned, one is used for encryption of messages to the +// remote peer, the other is used for decryption of messages from the remote +// peer. It is an error to call this method out of sync with the handshake +// pattern. +func (s *HandshakeState) WriteMessage(out, payload []byte) ([]byte, *CipherState, *CipherState, error) { + if !s.shouldWrite { + return nil, nil, nil, errors.New("noise: unexpected call to WriteMessage should be ReadMessage") + } + if s.msgIdx > len(s.messagePatterns)-1 { + return nil, nil, nil, errors.New("noise: no handshake messages left") + } + if len(payload) > MaxMsgLen { + return nil, nil, nil, errors.New("noise: message is too long") + } + + var err error + for _, msg := range s.messagePatterns[s.msgIdx] { + switch msg { + case MessagePatternE: + e, err := s.ss.cs.GenerateKeypair(s.rng) + if err != nil { + return nil, nil, nil, err + } + s.e = e + out = append(out, s.e.Public...) + s.ss.MixHash(s.e.Public) + if len(s.psk) > 0 { + s.ss.MixKey(s.e.Public) + } + case MessagePatternS: + if len(s.s.Public) == 0 { + return nil, nil, nil, errors.New("noise: invalid state, s.Public is nil") + } + out, err = s.ss.EncryptAndHash(out, s.s.Public) + if err != nil { + return nil, nil, nil, err + } + case MessagePatternDHEE: + dh, err := s.ss.cs.DH(s.e.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + case MessagePatternDHES: + if s.initiator { + dh, err := s.ss.cs.DH(s.e.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } else { + dh, err := s.ss.cs.DH(s.s.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } + case MessagePatternDHSE: + if s.initiator { + dh, err := s.ss.cs.DH(s.s.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } else { + dh, err := s.ss.cs.DH(s.e.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } + case MessagePatternDHSS: + dh, err := s.ss.cs.DH(s.s.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + case MessagePatternPSK: + s.ss.MixKeyAndHash(s.psk) + } + } + s.shouldWrite = false + s.msgIdx++ + out, err = s.ss.EncryptAndHash(out, payload) + if err != nil { + return nil, nil, nil, err + } + + if s.msgIdx >= len(s.messagePatterns) { + cs1, cs2 := s.ss.Split() + return out, cs1, cs2, nil + } + + return out, nil, nil, nil +} + +// ErrShortMessage is returned by ReadMessage if a message is not as long as it should be. +var ErrShortMessage = errors.New("noise: message is too short") + +// ReadMessage processes a received handshake message and appends the payload, +// if any to out. If the handshake is completed by the call, two CipherStates +// will be returned, one is used for encryption of messages to the remote peer, +// the other is used for decryption of messages from the remote peer. It is an +// error to call this method out of sync with the handshake pattern. +func (s *HandshakeState) ReadMessage(out, message []byte) ([]byte, *CipherState, *CipherState, error) { + if s.shouldWrite { + return nil, nil, nil, errors.New("noise: unexpected call to ReadMessage should be WriteMessage") + } + if s.msgIdx > len(s.messagePatterns)-1 { + return nil, nil, nil, errors.New("noise: no handshake messages left") + } + + rsSet := false + s.ss.Checkpoint() + + var err error + for _, msg := range s.messagePatterns[s.msgIdx] { + switch msg { + case MessagePatternE, MessagePatternS: + expected := s.ss.cs.DHLen() + if msg == MessagePatternS && s.ss.hasK { + expected += 16 + } + if len(message) < expected { + return nil, nil, nil, ErrShortMessage + } + switch msg { + case MessagePatternE: + if cap(s.re) < s.ss.cs.DHLen() { + s.re = make([]byte, s.ss.cs.DHLen()) + } + s.re = s.re[:s.ss.cs.DHLen()] + copy(s.re, message) + s.ss.MixHash(s.re) + if len(s.psk) > 0 { + s.ss.MixKey(s.re) + } + case MessagePatternS: + if len(s.rs) > 0 { + return nil, nil, nil, errors.New("noise: invalid state, rs is not nil") + } + s.rs, err = s.ss.DecryptAndHash(s.rs[:0], message[:expected]) + rsSet = true + } + if err != nil { + s.ss.Rollback() + if rsSet { + s.rs = nil + } + return nil, nil, nil, err + } + message = message[expected:] + case MessagePatternDHEE: + dh, err := s.ss.cs.DH(s.e.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + case MessagePatternDHES: + if s.initiator { + dh, err := s.ss.cs.DH(s.e.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } else { + dh, err := s.ss.cs.DH(s.s.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } + case MessagePatternDHSE: + if s.initiator { + dh, err := s.ss.cs.DH(s.s.Private, s.re) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } else { + dh, err := s.ss.cs.DH(s.e.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + } + case MessagePatternDHSS: + dh, err := s.ss.cs.DH(s.s.Private, s.rs) + if err != nil { + return nil, nil, nil, err + } + s.ss.MixKey(dh) + case MessagePatternPSK: + s.ss.MixKeyAndHash(s.psk) + } + } + out, err = s.ss.DecryptAndHash(out, message) + if err != nil { + s.ss.Rollback() + if rsSet { + s.rs = nil + } + return nil, nil, nil, err + } + s.shouldWrite = true + s.msgIdx++ + + if s.msgIdx >= len(s.messagePatterns) { + cs1, cs2 := s.ss.Split() + return out, cs1, cs2, nil + } + + return out, nil, nil, nil +} + +// ChannelBinding provides a value that uniquely identifies the session and can +// be used as a channel binding. It is an error to call this method before the +// handshake is complete. +func (s *HandshakeState) ChannelBinding() []byte { + return s.ss.h +} + +// PeerStatic returns the static key provided by the remote peer during +// a handshake. It is an error to call this method if a handshake message +// containing a static key has not been read. +func (s *HandshakeState) PeerStatic() []byte { + return s.rs +} + +// MessageIndex returns the current handshake message id +func (s *HandshakeState) MessageIndex() int { + return s.msgIdx +} + +// PeerEphemeral returns the ephemeral key provided by the remote peer during +// a handshake. It is an error to call this method if a handshake message +// containing a static key has not been read. +func (s *HandshakeState) PeerEphemeral() []byte { + return s.re +} + +// LocalEphemeral returns the local ephemeral key pair generated during +// a handshake. +func (s *HandshakeState) LocalEphemeral() DHKey { + return s.e +} diff --git a/vendor/github.com/flynn/noise/vectors.txt b/vendor/github.com/flynn/noise/vectors.txt new file mode 100644 index 000000000..344ab7558 --- /dev/null +++ b/vendor/github.com/flynn/noise/vectors.txt @@ -0,0 +1,28640 @@ +handshake=Noise_NN_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667cc0d7b4540fd183ba30ecbd3f464f16 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0193b62b90fb3497108ec8adcc340a49ebb0a07f1654d71f7e38361f57ba5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b2afdcb051e896fa5b6a23def5ee6bdd6032f1b39b2d22ef7da01857648389 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544833316e6c21d899aec6c5f0c6e85e13 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3ec4419885d86e6d7310fb1d2263afd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a7b199c69a64cc2ea3c556cf17489fd2ae452d3f3c2a0871cebd327fc31c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e58d43e0c69d8c15df523586b2c58ca40cb0472b5b3775f1cca807fee28a71 + +handshake=Noise_NNpsk1_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da8ea488f6163eeccb6d3836ec6ccefd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666f14491c4b69e43af265c51f3c3c09a7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84a7c955143ce45834b0acdef085054ab1a321668d7045dafc67b3e189f66d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44cb770629debcb89480285522a1fd693b666884f7758f6f864c09c538c119 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625407418737b0236214775b43573cb13a23 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6a7d8b64f54b20c5f93066303fb3170 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84c7ad0cff2af00d6c12896f0230233a99e1abeaef043747035d9a38c06f9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4bdd4800b3abd620ce9f4c519428acf7912af8b6507aa3befecce2444d2614 + +handshake=Noise_NN_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663d8d136c2fcf7ecd3c3d631843bc33819e3a01f9b58040751011 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0193b62b90fb3497108ec8adcc340a49ebb0a07f1654d71f7e38361f57ba5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b2afdcb051e896fa5b6a23def5ee6bdd6032f1b39b2d22ef7da01857648389 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d2f8054fcaf80f34700607e4422560b0626b1bc69e65290f6437 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e21a3177614fce09f014bde7e996fb8c8300777068e6fd2aa7c4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a7b199c69a64cc2ea3c556cf17489fd2ae452d3f3c2a0871cebd327fc31c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e58d43e0c69d8c15df523586b2c58ca40cb0472b5b3775f1cca807fee28a71 + +handshake=Noise_NNpsk1_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254422cb9f10bb05f92da10138bc8c286b5aa2f756e90b8edf48acb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d48f5698c6af1a7d6f1c5755e27285251fe4aa9074a3ba30c3ca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84a7c955143ce45834b0acdef085054ab1a321668d7045dafc67b3e189f66d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44cb770629debcb89480285522a1fd693b666884f7758f6f864c09c538c119 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bddd25c5d196f5110f02adbbd877b69e8a86f44e2aaa0ee24aa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad1970fd7307e7594135cfec5a24fac90fc08bc1b0f393ec250c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84c7ad0cff2af00d6c12896f0230233a99e1abeaef043747035d9a38c06f9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4bdd4800b3abd620ce9f4c519428acf7912af8b6507aa3befecce2444d2614 + +handshake=Noise_NN_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662529efae98611941ab23ad370919a7f5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0193b62b90fb3497108ec8adcc340a49ebb0a07f1654d71f7e38361f57ba5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b2afdcb051e896fa5b6a23def5ee6bdd6032f1b39b2d22ef7da01857648389 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625486959ba2f588031f633a6c0e54a14ae5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c8783e80be055a8f51e32418393af7cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a7b199c69a64cc2ea3c556cf17489fd2ae452d3f3c2a0871cebd327fc31c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e58d43e0c69d8c15df523586b2c58ca40cb0472b5b3775f1cca807fee28a71 + +handshake=Noise_NNpsk1_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a0328c29b33470d04740e97e9514cbcd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668badb8f25007a52eef9d16009be2c712 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84a7c955143ce45834b0acdef085054ab1a321668d7045dafc67b3e189f66d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44cb770629debcb89480285522a1fd693b666884f7758f6f864c09c538c119 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540dae00c4de099415fc994fe385a4c2e5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666a126d2d8d2dff1221cb69310cca148f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84c7ad0cff2af00d6c12896f0230233a99e1abeaef043747035d9a38c06f9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4bdd4800b3abd620ce9f4c519428acf7912af8b6507aa3befecce2444d2614 + +handshake=Noise_NN_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663d8d136c2fcf7ecd3c3d4c93591205092db481f2a901eb96f06c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0193b62b90fb3497108ec8adcc340a49ebb0a07f1654d71f7e38361f57ba5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b2afdcb051e896fa5b6a23def5ee6bdd6032f1b39b2d22ef7da01857648389 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d2f8054fcaf80f347006e0fc25590a31fd33c4626fe59283ea40 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e21a3177614fce09f014af55e853ed6b88b0e4628e071b23e905 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a7b199c69a64cc2ea3c556cf17489fd2ae452d3f3c2a0871cebd327fc31c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e58d43e0c69d8c15df523586b2c58ca40cb0472b5b3775f1cca807fee28a71 + +handshake=Noise_NNpsk1_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254422cb9f10bb05f92da1086ba7a3f7fdeede2360802fce2bab641 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d48f5698c6af1a7d6f1cce81b2d248ccdd0f13d7c85b6b61d30a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84a7c955143ce45834b0acdef085054ab1a321668d7045dafc67b3e189f66d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44cb770629debcb89480285522a1fd693b666884f7758f6f864c09c538c119 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bddd25c5d196f5110f0e47e04cd720aa46674d274f35cc9219a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad1970fd7307e7594135c3fbe2866e29c265002153e2342cf6a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84c7ad0cff2af00d6c12896f0230233a99e1abeaef043747035d9a38c06f9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4bdd4800b3abd620ce9f4c519428acf7912af8b6507aa3befecce2444d2614 + +handshake=Noise_KN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466827d5016baa63241017945dea7aeb9be +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d8eb7e92e6ffa800b669953e5a1b99fe268df1161d7293a1c1836f7dd2d55b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=009f1432e8414277b5ddf687ae0daf50f76e24c5ed30b0d1e4af53544c70ad + +handshake=Noise_KNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254169cf5ede5a37b6318901ccb41cfc0e6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846625bfff2e7a6576de4563a805d0cc79ad +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e3cfa09d18879571feb6c1b8656bd2c1768f636b70f269473f795eb26efe04 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a2f6c5b843b9306af62414b072ef527322ee7c77fcbdcf3774c85a0f62ee29 + +handshake=Noise_KNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542b4b5f5a0d01587d693384d5fa9b816d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e2b2821c8dd067005f3942c533057774 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2eba684f829bd3225ffd18163e51830268c3107086c6a5c6c8861324a84118 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00b6cddef82e1313dd1f4a5e2e63aff31c9a39160698ee7b81b00e72c20082 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543212e39efee8148627b3aeb4e1a997d2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1a5d67a8aa44d84bc1d1310365f02a5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17bb34185e6ca8171a04f52a87e4b372b2a0c871444050890b9e6d64775a30 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d607e4acbb0b137bb7956fe26d648088a9865b25376513351b0ed019e5c098 + +handshake=Noise_KN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc79472c53cf5dde06848020738862f3268987d895428bdd974b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d8eb7e92e6ffa800b669953e5a1b99fe268df1161d7293a1c1836f7dd2d55b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=009f1432e8414277b5ddf687ae0daf50f76e24c5ed30b0d1e4af53544c70ad + +handshake=Noise_KNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d65483c2c037a3715bfd2e8bceb4633a3758a492725e6cb94082 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466653bddb937e507c9febf96843ce9aedca6013fb23cd2c54fd3cf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e3cfa09d18879571feb6c1b8656bd2c1768f636b70f269473f795eb26efe04 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a2f6c5b843b9306af62414b072ef527322ee7c77fcbdcf3774c85a0f62ee29 + +handshake=Noise_KNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7207c975f3cc6901b9d650f4f768838f45cb1899c96808a8b7c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664685702a41068df357c8ba5150d0e340cde8073a959298579680 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2eba684f829bd3225ffd18163e51830268c3107086c6a5c6c8861324a84118 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00b6cddef82e1313dd1f4a5e2e63aff31c9a39160698ee7b81b00e72c20082 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d109459bac52bf108d0aeee64b8e84f04273f7423b0ae575df25 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665d5f1ae785b46ce05fded66b0c412e1d35aea492cdafed0410eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17bb34185e6ca8171a04f52a87e4b372b2a0c871444050890b9e6d64775a30 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d607e4acbb0b137bb7956fe26d648088a9865b25376513351b0ed019e5c098 + +handshake=Noise_KN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f4f7f9d6b31a498dbd6a5e3507e7dc97 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d8eb7e92e6ffa800b669953e5a1b99fe268df1161d7293a1c1836f7dd2d55b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=009f1432e8414277b5ddf687ae0daf50f76e24c5ed30b0d1e4af53544c70ad + +handshake=Noise_KNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625439382eef6b7cd99fa9cd2ff31146a7e7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fbb960fdc82cf9a7808990194e3c706b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e3cfa09d18879571feb6c1b8656bd2c1768f636b70f269473f795eb26efe04 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a2f6c5b843b9306af62414b072ef527322ee7c77fcbdcf3774c85a0f62ee29 + +handshake=Noise_KNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625404c68e7f550e27c9cc7b2c2edb4de4a7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669ac747a0a01f904299ac44304fb4c552 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2eba684f829bd3225ffd18163e51830268c3107086c6a5c6c8861324a84118 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00b6cddef82e1313dd1f4a5e2e63aff31c9a39160698ee7b81b00e72c20082 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254546bebfef90b0b870b4e9596efcc7447 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c8f298e9f683830ecef7654eac5efae +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17bb34185e6ca8171a04f52a87e4b372b2a0c871444050890b9e6d64775a30 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d607e4acbb0b137bb7956fe26d648088a9865b25376513351b0ed019e5c098 + +handshake=Noise_KN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc79472c53cf5dde06842c7bbaddce7a78d729b83d1579fee94c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d8eb7e92e6ffa800b669953e5a1b99fe268df1161d7293a1c1836f7dd2d55b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=009f1432e8414277b5ddf687ae0daf50f76e24c5ed30b0d1e4af53544c70ad + +handshake=Noise_KNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d65483c2c037a3715bfd42574061e8d814661165acbf6eedb5c6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466653bddb937e507c9febfa60df671aeed8ee66f0e986dfeaa0865 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e3cfa09d18879571feb6c1b8656bd2c1768f636b70f269473f795eb26efe04 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a2f6c5b843b9306af62414b072ef527322ee7c77fcbdcf3774c85a0f62ee29 + +handshake=Noise_KNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7207c975f3cc6901b9da3e1a6491825efcc2dd70646ab8cb898 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664685702a41068df357c8a9d8abd0235d963ad2dcf235a6f353f5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2eba684f829bd3225ffd18163e51830268c3107086c6a5c6c8861324a84118 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00b6cddef82e1313dd1f4a5e2e63aff31c9a39160698ee7b81b00e72c20082 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d109459bac52bf108d0a86488e517a3e603907489b5fc4a7311b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665d5f1ae785b46ce05fdea603c6ef38009c36fe4846c921c6326b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17bb34185e6ca8171a04f52a87e4b372b2a0c871444050890b9e6d64775a30 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d607e4acbb0b137bb7956fe26d648088a9865b25376513351b0ed019e5c098 + +handshake=Noise_NK_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625418e3e3b9a33b9d5f680ee08fbf20d03f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a2c11719e1aac7b6b2efc4871618f8bf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95922788fcef822a17b42f450fa14d05d8e6a4377ca0aea3b4804f03db74a2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0976cd4a786c253b37489b6bc3867b2df0dddf9f939b218da54092c6d3eca4 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f965755a00eab9d92efbcdfbcc9e3b63 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c07c73cd24ea666246bc2ce129914dd3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=093acd47149fadf3574dd440428181edf9c61cc4a1b5ef815e8b779f1bbf40 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2b8e170039917a61d4fe8acbd2147d50afafc32070458b51b666225614f364 + +handshake=Noise_NKpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625461500ecd7d2df0e7b6517f899a562cdd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660c7c4d7f118e1fe8345ffceee554dc1b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=51fd5d7489dae3d6a99766db0afe89c1d19ed91a80b1bb64f94e747360fd2c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=be24f94a04505c8ab51768a80b388f2758ddab3b2fa3eebfeaceeff0130d78 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625498189a3c42ac5c0817de56867c43b2e5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668f7ced987ac0a5d56835254fc6374a82 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d848f074d3d766c1a7770c51ceba699a16ad262790fc279e7dd2fcccfd4dca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=51f74c4a80c3768dd6476fbb9c599efe5491567af3d18c8415d9d017821004 + +handshake=Noise_NK_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546cfcd5c91dd95543a236cd276e885b5c7a1c3890ca630f06543e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3f3dd3e34414275ad733b2a5593f9b31485eecd7c12413912a9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95922788fcef822a17b42f450fa14d05d8e6a4377ca0aea3b4804f03db74a2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0976cd4a786c253b37489b6bc3867b2df0dddf9f939b218da54092c6d3eca4 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625485932c8c7615c8263798b4f9d548cb656be5a4eb30cd9a0485c9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cce9cb21a513f9de326cba676712ee32441eb2146407fba7b57e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=093acd47149fadf3574dd440428181edf9c61cc4a1b5ef815e8b779f1bbf40 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2b8e170039917a61d4fe8acbd2147d50afafc32070458b51b666225614f364 + +handshake=Noise_NKpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543f74b70b971271ffb3efb21dfeb1ea4ec9039c91a237de4027a5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669920e429a6643b44e75fa65798b735a87d8c1edbd6013455a404 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=51fd5d7489dae3d6a99766db0afe89c1d19ed91a80b1bb64f94e747360fd2c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=be24f94a04505c8ab51768a80b388f2758ddab3b2fa3eebfeaceeff0130d78 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254537ac869369393768b2148856b6ab4aa465dbf8b6ff26007937a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695f32217406ccaa2da8f4a639bd9b5656007964aeaf74c7c377d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d848f074d3d766c1a7770c51ceba699a16ad262790fc279e7dd2fcccfd4dca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=51f74c4a80c3768dd6476fbb9c599efe5491567af3d18c8415d9d017821004 + +handshake=Noise_NK_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f256569b87bb96d615490cfa4ca93b30 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664918946d495163ba4efd4dfea52402eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95922788fcef822a17b42f450fa14d05d8e6a4377ca0aea3b4804f03db74a2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0976cd4a786c253b37489b6bc3867b2df0dddf9f939b218da54092c6d3eca4 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6679a09e77ede865a31906c6f3c9537 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466833a2e7d79a0dbfc47f93bd7c4442646 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=093acd47149fadf3574dd440428181edf9c61cc4a1b5ef815e8b779f1bbf40 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2b8e170039917a61d4fe8acbd2147d50afafc32070458b51b666225614f364 + +handshake=Noise_NKpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625402b4cfd1e0bc207c3f2a5459c6993328 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466065a03c65cc319c55bde1813028060ce +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=51fd5d7489dae3d6a99766db0afe89c1d19ed91a80b1bb64f94e747360fd2c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=be24f94a04505c8ab51768a80b388f2758ddab3b2fa3eebfeaceeff0130d78 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546de0aeb2f4a18513ac55eea1fbbe4de8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626379fd9720128b0dbbaa6734fd5b9e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d848f074d3d766c1a7770c51ceba699a16ad262790fc279e7dd2fcccfd4dca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=51f74c4a80c3768dd6476fbb9c599efe5491567af3d18c8415d9d017821004 + +handshake=Noise_NK_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546cfcd5c91dd95543a2363b9bd07c092d8fff14687e5f48b43afc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3f3dd3e34414275ad73c9d7e1d03e86e1580404241350ed9ab1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95922788fcef822a17b42f450fa14d05d8e6a4377ca0aea3b4804f03db74a2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0976cd4a786c253b37489b6bc3867b2df0dddf9f939b218da54092c6d3eca4 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625485932c8c7615c82637987b6d1508724221d9ac49e27a147f5b20 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cce9cb21a513f9de326ccb24b4012111db3db7d41383ad139bf4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=093acd47149fadf3574dd440428181edf9c61cc4a1b5ef815e8b779f1bbf40 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2b8e170039917a61d4fe8acbd2147d50afafc32070458b51b666225614f364 + +handshake=Noise_NKpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543f74b70b971271ffb3ef260b21a3f29655bee689e501c2a16b89 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669920e429a6643b44e75f92aa79146466904a0217560ee27b49df +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=51fd5d7489dae3d6a99766db0afe89c1d19ed91a80b1bb64f94e747360fd2c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=be24f94a04505c8ab51768a80b388f2758ddab3b2fa3eebfeaceeff0130d78 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254537ac869369393768b21c12506b70b078d6cb28378d02e8d93af +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695f32217406ccaa2da8ffcd2908a04cb425c65daad407f91f131 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d848f074d3d766c1a7770c51ceba699a16ad262790fc279e7dd2fcccfd4dca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=51f74c4a80c3768dd6476fbb9c599efe5491567af3d18c8415d9d017821004 + +handshake=Noise_KK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543f53f25dc2eca97efae6a4a4b847de06 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f506ffcf6b2781821b24b70b8fad884 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0e79035855cdea04bc833d5ff63291042c6e12b0ac55ef2c4096deed1cbac2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c6dbcc2ac8f85338732b71a58f4c3be89bdfa7b2da8a8506ec4f1d2d9299a0 + +handshake=Noise_KKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f8ec97c143e2e9193574ea4989ebc3a2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668021ddcdb7eb8e89d8034de9248af340 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13f09ec7877b005731a876958cec004a7f9c2734e971828082db441ce001c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cf3a9cb9da7eb9bea19447b1f9bea60ac70124dfef886e9b82cd52f748c682 + +handshake=Noise_KKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542a366ea33985fc1669836b873058f89a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664aad05b9467f884f79f963ec5febb35f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96252868cb85131fc634b43f37c135da2b02902158369ec7a8e6b45b246732 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52822ad96c98c7ebcf68cafe91b6f18929aad75af5424a973cdb0f004b3832 + +handshake=Noise_KKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b7cf6c9cefd4f1fb33dddd9f27acdb20 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661fe30c2f7bbae74d87402b1cd73c4862 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d219ab65f4416d18e67f501afa99f43009c0a1c2c78427b1dcbdd6cf020928 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1c6b3e31392287e06fcc5a885ea8690e39a2d3d54e23f5aeca14fca3c2f053 + +handshake=Noise_KK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f076403f2e0cdd201c5aae9d1539c9ad90262eefea9c90a5397b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f12abbcda56565bf3fa3254fe35ad97f3e9d5e25aa296741ec3e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0e79035855cdea04bc833d5ff63291042c6e12b0ac55ef2c4096deed1cbac2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c6dbcc2ac8f85338732b71a58f4c3be89bdfa7b2da8a8506ec4f1d2d9299a0 + +handshake=Noise_KKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625413c6b4c495bbc7b95432907247ab38b5bb507bcf4f32abbd490e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466169cfd28ccd38213e17be5b967a6ff6de85f6949f26824243711 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13f09ec7877b005731a876958cec004a7f9c2734e971828082db441ce001c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cf3a9cb9da7eb9bea19447b1f9bea60ac70124dfef886e9b82cd52f748c682 + +handshake=Noise_KKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f45eb20acd443feff46beebe27c56ffdd58063a70d706f8640c6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d510ee9dd1b542ca5a0d0c5756779245766d964eef8f34867872 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96252868cb85131fc634b43f37c135da2b02902158369ec7a8e6b45b246732 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52822ad96c98c7ebcf68cafe91b6f18929aad75af5424a973cdb0f004b3832 + +handshake=Noise_KKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540590c32754712b9ce391e4773cd5b7c761ef65b6cb530ab10d8f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1bd851e93bfded9a6c7d56b6672e23bdc4a53bdc9e10961b1f0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d219ab65f4416d18e67f501afa99f43009c0a1c2c78427b1dcbdd6cf020928 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1c6b3e31392287e06fcc5a885ea8690e39a2d3d54e23f5aeca14fca3c2f053 + +handshake=Noise_KK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d05f754c90d580f21b243391fe987af4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f8f3babbd403b9665488570810b364dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0e79035855cdea04bc833d5ff63291042c6e12b0ac55ef2c4096deed1cbac2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c6dbcc2ac8f85338732b71a58f4c3be89bdfa7b2da8a8506ec4f1d2d9299a0 + +handshake=Noise_KKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625420f8e0f9c7579f754ce9b5e05f5cee81 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b05668d3dcd247a08e099cbeb58174df +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13f09ec7877b005731a876958cec004a7f9c2734e971828082db441ce001c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cf3a9cb9da7eb9bea19447b1f9bea60ac70124dfef886e9b82cd52f748c682 + +handshake=Noise_KKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546bfe451377763da7a318dbfc124530f9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f550d35da0ef73348c5f2a8be605444 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96252868cb85131fc634b43f37c135da2b02902158369ec7a8e6b45b246732 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52822ad96c98c7ebcf68cafe91b6f18929aad75af5424a973cdb0f004b3832 + +handshake=Noise_KKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625456ad94f8b8869d6b972be9a552537a3c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dfd7a0cc157b4afc52ff249d573f1358 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d219ab65f4416d18e67f501afa99f43009c0a1c2c78427b1dcbdd6cf020928 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1c6b3e31392287e06fcc5a885ea8690e39a2d3d54e23f5aeca14fca3c2f053 + +handshake=Noise_KK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f076403f2e0cdd201c5a743d4aab448e6e3b29d4aa05628a5cbd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f12abbcda56565bf3fa37b196488daf515b7434096aa1638346b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0e79035855cdea04bc833d5ff63291042c6e12b0ac55ef2c4096deed1cbac2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c6dbcc2ac8f85338732b71a58f4c3be89bdfa7b2da8a8506ec4f1d2d9299a0 + +handshake=Noise_KKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625413c6b4c495bbc7b95432535cc6716834442ddae5e177d5bfd397 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466169cfd28ccd38213e17b518f78c70703c52b0d8d51d4479b557a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13f09ec7877b005731a876958cec004a7f9c2734e971828082db441ce001c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cf3a9cb9da7eb9bea19447b1f9bea60ac70124dfef886e9b82cd52f748c682 + +handshake=Noise_KKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f45eb20acd443feff46b315ad0366d803b7da09e6b84e12c1064 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d510ee9dd1b542ca5a0dca75e69bc396eea2dadec726382e2030 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96252868cb85131fc634b43f37c135da2b02902158369ec7a8e6b45b246732 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52822ad96c98c7ebcf68cafe91b6f18929aad75af5424a973cdb0f004b3832 + +handshake=Noise_KKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540590c32754712b9ce391bf35caa325f1ed107ec12d5cb4fc49af +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1bd851e93bfded9a6c776e0614d573731a40e7f562f6f3c067f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d219ab65f4416d18e67f501afa99f43009c0a1c2c78427b1dcbdd6cf020928 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1c6b3e31392287e06fcc5a885ea8690e39a2d3d54e23f5aeca14fca3c2f053 + +handshake=Noise_NX_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba1de7566c661eeed804d8fba1bcf3071d59a4a7ee2095ae6e8d813b554ad81ee45f4a4b6c2e8cd75b923c050e1330749b0c56fbae778fd91060bca3512061cf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=947e1b1a2798ef97094d7dbccd7244c92baf5e4d8b0e7ed5da78fbe1fdac76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed42482e9b09e2f97dc931e1444f9d7a8b51241108b41cab53474327500596 + +handshake=Noise_NXpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254600c4a8eb4f41bafda4465f2e9e34bae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa7a9691509a04c46a6ce79f30fdbc377a2158ca3967df0ea4b1bb18532ca8737927e184c0605e9641bc3974b037282ceae988c87be4c68494c1d4f2b705cb2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=309e81a1ec83fd198e19b766e75f5e3a6ee55cd7b0119955211dcfcfdd0dae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=92ac33cb48df9677f9a6528346e17cd89855368535e8ee3c8252291d7820a4 + +handshake=Noise_NXpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b83011e8a447059f5a20533e49339a7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466afe68fdc6ad2df579fc8c4647c9daa9bccf146281b1fd8a0c4a193c206e89182236eb3f634d1c039759312597c6b3d48389b835f65abd51fd8e9a844fcfa9d89 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bd4ff6855a94bfd208d12eab8a615bd648d2e255bbca66ef2dcf95b6f64051 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=72f8827c79760073df771af24d5577a294e6c91391de79ad375277b91c899e + +handshake=Noise_NXpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c32f9f7340e786f655274b1d55dddeb1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466483412f9b4501d6e091c567f54851490683ba20583a2d46f9e46a34e1aef4d4f027e98fac3b55d80b833ac43e55d84d2597fbd6906b2ce5c0101b0c992bd7816 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4e6a4d111017cdfee460438955caf3234610c1971e06d1143ca16c7b407a96 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0f24650c4c6aa4a0ac25f0def8ac28890c64ad3bd787f101be1f6f3d868288 + +handshake=Noise_NX_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba1de7566c661eeed804d8fba1bcf3071d59a4a7ee2095ae6e8d813b554ad81e4ad1b2e3dc131f7decf35551aaa64803118efe076183e491cbc8dbfa9e20298f8603da282b6cbbf303c8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=947e1b1a2798ef97094d7dbccd7244c92baf5e4d8b0e7ed5da78fbe1fdac76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed42482e9b09e2f97dc931e1444f9d7a8b51241108b41cab53474327500596 + +handshake=Noise_NXpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dc8c612be768de5f7f3df631297f55b318248d15e3475c151d8d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa7a9691509a04c46a6ce79f30fdbc377a2158ca3967df0ea4b1bb18532ca87a13b25dfb83dac18a8cbac87c6bc6992ef497397067bba94fb3a96ca3a1020c00a2ae479f2e60e977d68 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=309e81a1ec83fd198e19b766e75f5e3a6ee55cd7b0119955211dcfcfdd0dae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=92ac33cb48df9677f9a6528346e17cd89855368535e8ee3c8252291d7820a4 + +handshake=Noise_NXpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bb202abc57006587591d4d467cc7bcbd58800e3d148ce4963e9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466afe68fdc6ad2df579fc8c4647c9daa9bccf146281b1fd8a0c4a193c206e89182e71c52c2ee8ffc027ee7460754ec704fb0f338043a3e469bd74c850e7f4502269fd8e69922b3ec7f014c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bd4ff6855a94bfd208d12eab8a615bd648d2e255bbca66ef2dcf95b6f64051 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=72f8827c79760073df771af24d5577a294e6c91391de79ad375277b91c899e + +handshake=Noise_NXpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cb0e968d6f6cf4ffa7b1a168a144a90d468d117045bcdac9ce2b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466483412f9b4501d6e091c567f54851490683ba20583a2d46f9e46a34e1aef4d4f2f0c8a081791c4ee0f5abb8697ffc0c99562af1f3e104d1bc04df1b1a17a2ead35a5b569377336e90470 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4e6a4d111017cdfee460438955caf3234610c1971e06d1143ca16c7b407a96 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0f24650c4c6aa4a0ac25f0def8ac28890c64ad3bd787f101be1f6f3d868288 + +handshake=Noise_NX_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba1de7566c661eeed804d8fba1bcf3071d59a4a7ee2095ae6e8d813b554ad81e607b7c6987c60ff865c745b0c6ef765be0580f5484546cf94bd3ecb0d2298226 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=947e1b1a2798ef97094d7dbccd7244c92baf5e4d8b0e7ed5da78fbe1fdac76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed42482e9b09e2f97dc931e1444f9d7a8b51241108b41cab53474327500596 + +handshake=Noise_NXpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625470fd0f29b580ff883963cdee7776787b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa7a9691509a04c46a6ce79f30fdbc377a2158ca3967df0ea4b1bb18532ca87d439f889f15a1819502b8356523b4d3a14b3906db2105a3a567cecce7699b721 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=309e81a1ec83fd198e19b766e75f5e3a6ee55cd7b0119955211dcfcfdd0dae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=92ac33cb48df9677f9a6528346e17cd89855368535e8ee3c8252291d7820a4 + +handshake=Noise_NXpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ead4aca71459776346063860fc9dacef +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466afe68fdc6ad2df579fc8c4647c9daa9bccf146281b1fd8a0c4a193c206e8918205f730787beb926375b224bdd8c3ffd2b485a3a2e44ac9e33de0e3160438b266 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bd4ff6855a94bfd208d12eab8a615bd648d2e255bbca66ef2dcf95b6f64051 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=72f8827c79760073df771af24d5577a294e6c91391de79ad375277b91c899e + +handshake=Noise_NXpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d596409946ef9c77e9c61aaeaaad31b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466483412f9b4501d6e091c567f54851490683ba20583a2d46f9e46a34e1aef4d4fd1622b6c789a6df165149281d1be9449a04338eb661d26528df109a269ed2a5d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4e6a4d111017cdfee460438955caf3234610c1971e06d1143ca16c7b407a96 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0f24650c4c6aa4a0ac25f0def8ac28890c64ad3bd787f101be1f6f3d868288 + +handshake=Noise_NX_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba1de7566c661eeed804d8fba1bcf3071d59a4a7ee2095ae6e8d813b554ad81eb15e8bfeea1d1766c1ca995bf2fc89f8118efe076183e491cbc8f2e50c3b6af6238ec0e37daffb0cc742 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=947e1b1a2798ef97094d7dbccd7244c92baf5e4d8b0e7ed5da78fbe1fdac76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed42482e9b09e2f97dc931e1444f9d7a8b51241108b41cab53474327500596 + +handshake=Noise_NXpsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dc8c612be768de5f7f3d2d79705307fcaf69908c306a29c5e2e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa7a9691509a04c46a6ce79f30fdbc377a2158ca3967df0ea4b1bb18532ca87cd254354d4669c66db55d59ea0db0c57ef497397067bba94fb3a75d3a3b3804d73a62887f06cd31b17dc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=309e81a1ec83fd198e19b766e75f5e3a6ee55cd7b0119955211dcfcfdd0dae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=92ac33cb48df9677f9a6528346e17cd89855368535e8ee3c8252291d7820a4 + +handshake=Noise_NXpsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bb202abc57006587591865999d0fba3fb1daa6f307a1c5a69b9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466afe68fdc6ad2df579fc8c4647c9daa9bccf146281b1fd8a0c4a193c206e89182883437826964719dfe774885fd82ed85b0f338043a3e469bd74c03833e4d31c6c4197118b2d0c23fe394 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bd4ff6855a94bfd208d12eab8a615bd648d2e255bbca66ef2dcf95b6f64051 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=72f8827c79760073df771af24d5577a294e6c91391de79ad375277b91c899e + +handshake=Noise_NXpsk2_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cb0e968d6f6cf4ffa7b18efe9bd452f1b893c8e960b8be69195b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466483412f9b4501d6e091c567f54851490683ba20583a2d46f9e46a34e1aef4d4fe228d02a04c8e97aca8ccf320bd8132d9562af1f3e104d1bc04dbc27c527aa4edf080cdd9962779f7718 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4e6a4d111017cdfee460438955caf3234610c1971e06d1143ca16c7b407a96 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0f24650c4c6aa4a0ac25f0def8ac28890c64ad3bd787f101be1f6f3d868288 + +handshake=Noise_KX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651b9d60eb501f5efa797765be5facecd1b54777890c04bcbd4c363392ec8020c6574a4c4d6b72b0eb5e4f7ddfa581d58df144e59de159afb7c8c8c882873e8f6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cef18cc9c074b7b65b0876c13b23ac88a40d8f0508e88ce059511c69cafe8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2cb3ee4126b92633a230fa828a5d01e20577ad6957dbab9f547a0d321da1aa + +handshake=Noise_KXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fd769263bccd79587c7f736e1359352c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668140b6d6d8f57a44ea44a8faf051f109ab23fa8a11571923ab169aa41f1c145acaa50a4110b116973a047dc46fda6e45e79872d9a133db8635d3ef5f62c67f8c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=741d43d667af84da98ce714d05b47f025f58390989a6017c317d906d89cef3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=03cd0d03692885e37a8b0b6163e094c9a8d5a62383c15a0d43af0505985d69 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625494e6dc9266f412da8940e5f1ed2928a1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a0bfaa51f5148f03b052ef9bcbe0a78ff41c171a105e9928b8eca5683674c22961d70956f724006d7c2c5f64c58fcc8b9e6d7c434b2bc8dfe67a122758b866ed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=57271ed33c4dc921dde89c5e7920df0ab2a58361b19e4d6383e650da99e7fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4719d03ef8bd3d51202cb10d97d8ed9a449b928b50944e20fc749fdd36882a + +handshake=Noise_KXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9c7f6571bb640878ca69055b410af39 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664eb43ac79c1a09d29d9ee9abd60d01f24e07f95c9b57e6b228513d3b911a6bc5ad29b67154c895c55dca9525049a9c88bb1d43a542bd18b0ad443deb912abfdd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=97fb83aaf881a57aef8a2ee5c92067bfb12be1ca9ff96ec05801a17ab59dc1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5980f6c58e2c33192316ff9db9684a41f98cff4c921dd99d10a147888cab96 + +handshake=Noise_KX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651b9d60eb501f5efa797765be5facecd1b54777890c04bcbd4c363392ec8020cffea7b7816cc8d3cbba422da8c5039188ad2715f430663cbef349f687f0f01cc0840853c3dd4a03ce7bc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cef18cc9c074b7b65b0876c13b23ac88a40d8f0508e88ce059511c69cafe8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2cb3ee4126b92633a230fa828a5d01e20577ad6957dbab9f547a0d321da1aa + +handshake=Noise_KXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625479403368521b32d522b60c39847630ecef1bd89c190bd2cb44fb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668140b6d6d8f57a44ea44a8faf051f109ab23fa8a11571923ab169aa41f1c145a32241706d4690b505402baf8a06ac03dc72401f783edd06f26aaa98ca33150b3f574651a160baec40c13 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=741d43d667af84da98ce714d05b47f025f58390989a6017c317d906d89cef3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=03cd0d03692885e37a8b0b6163e094c9a8d5a62383c15a0d43af0505985d69 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625456816aec771748a363fa2a63e3ea0a5168ce09326a42f6efc8b8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a0bfaa51f5148f03b052ef9bcbe0a78ff41c171a105e9928b8eca5683674c229549745c7795addacbbf9c25b7cc5137f185ab372ec13f203d0fe6467406ad4cc76392bb4aee1f7c753b8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=57271ed33c4dc921dde89c5e7920df0ab2a58361b19e4d6383e650da99e7fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4719d03ef8bd3d51202cb10d97d8ed9a449b928b50944e20fc749fdd36882a + +handshake=Noise_KXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625403f860c4b0e5d136c74ff866a7ebba59b63ddf4984282f9a193c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664eb43ac79c1a09d29d9ee9abd60d01f24e07f95c9b57e6b228513d3b911a6bc58b6457503d60ae02750d4fddc6a3866ed9e2b7b665ba695e83536460bf805b4ed26df8efe3af02fd4d67 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=97fb83aaf881a57aef8a2ee5c92067bfb12be1ca9ff96ec05801a17ab59dc1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5980f6c58e2c33192316ff9db9684a41f98cff4c921dd99d10a147888cab96 + +handshake=Noise_KX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651b9d60eb501f5efa797765be5facecd1b54777890c04bcbd4c363392ec8020c59dd8e8bebc235878d857c6d84f0a5338eb5d49142fed0d622590da2f9ea200d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cef18cc9c074b7b65b0876c13b23ac88a40d8f0508e88ce059511c69cafe8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2cb3ee4126b92633a230fa828a5d01e20577ad6957dbab9f547a0d321da1aa + +handshake=Noise_KXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540fbdb18c265d797f42d7536d571f3473 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668140b6d6d8f57a44ea44a8faf051f109ab23fa8a11571923ab169aa41f1c145ad1708830ccf11c7e12c15ae550ba6b9ce92e7a01beb8af9f1ce00af37806dd10 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=741d43d667af84da98ce714d05b47f025f58390989a6017c317d906d89cef3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=03cd0d03692885e37a8b0b6163e094c9a8d5a62383c15a0d43af0505985d69 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546046313eb7d85b39691f62081c58167c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a0bfaa51f5148f03b052ef9bcbe0a78ff41c171a105e9928b8eca5683674c229fc6c0e0e58ca821feb64676b38238320161795720ff76f68a12f005fcb10d883 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=57271ed33c4dc921dde89c5e7920df0ab2a58361b19e4d6383e650da99e7fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4719d03ef8bd3d51202cb10d97d8ed9a449b928b50944e20fc749fdd36882a + +handshake=Noise_KXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b60f0d634971bb203b652ba1967b61a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664eb43ac79c1a09d29d9ee9abd60d01f24e07f95c9b57e6b228513d3b911a6bc5e426a250b6d1851e0988cc7e1e3d719f9b071823a8e301e71894a3e769e1e9fa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=97fb83aaf881a57aef8a2ee5c92067bfb12be1ca9ff96ec05801a17ab59dc1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5980f6c58e2c33192316ff9db9684a41f98cff4c921dd99d10a147888cab96 + +handshake=Noise_KX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651b9d60eb501f5efa797765be5facecd1b54777890c04bcbd4c363392ec8020c7c436998be9c91ef0b5bf378deb15d158ad2715f430663cbef34c07c8fffbbe6e1d06b86643854167c10 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cef18cc9c074b7b65b0876c13b23ac88a40d8f0508e88ce059511c69cafe8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2cb3ee4126b92633a230fa828a5d01e20577ad6957dbab9f547a0d321da1aa + +handshake=Noise_KXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625479403368521b32d522b66108a91f0ee0630b01d5e9d75894e97b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668140b6d6d8f57a44ea44a8faf051f109ab23fa8a11571923ab169aa41f1c145a15a68caffb32e07426fb150508d5a8edc72401f783edd06f26aa8076fe78659e21041dd0d33c189cefe9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=741d43d667af84da98ce714d05b47f025f58390989a6017c317d906d89cef3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=03cd0d03692885e37a8b0b6163e094c9a8d5a62383c15a0d43af0505985d69 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625456816aec771748a363fa549a17755a6b8c1bd2ba5e506be3c0ad +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a0bfaa51f5148f03b052ef9bcbe0a78ff41c171a105e9928b8eca5683674c22927af6ddc7a690cdb4d5a2980f751f89a185ab372ec13f203d0fea95291c45a6bd1ecd8d7646b9d8232d1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=57271ed33c4dc921dde89c5e7920df0ab2a58361b19e4d6383e650da99e7fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4719d03ef8bd3d51202cb10d97d8ed9a449b928b50944e20fc749fdd36882a + +handshake=Noise_KXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625403f860c4b0e5d136c74f34c13ce247013edb3c379e4a24ac14df +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664eb43ac79c1a09d29d9ee9abd60d01f24e07f95c9b57e6b228513d3b911a6bc5668549e52bbb134d9ff2d80daea26b9dd9e2b7b665ba695e83538dfe52c654f53bcdc88eea727bffe4ce +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=97fb83aaf881a57aef8a2ee5c92067bfb12be1ca9ff96ec05801a17ab59dc1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5980f6c58e2c33192316ff9db9684a41f98cff4c921dd99d10a147888cab96 + +handshake=Noise_XN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b40ea2c38a51f959025c4dccfa89109 +msg_2_payload= +msg_2_ciphertext=503a8b472892ad3f5b51559452113c16ed3e184c13f944444437a34e31f439ff6700164dde01a283d026e511c871c6f0e8020d7872c914f667606b55934e2e99 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6233ac2185ec7af41983156d39699d8449548f0b481d6d0749496ffa362e5e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=085d31a2a8dfa0451b2080d1b516bf21503bd2abba540af2b97baad8ac7d60 + +handshake=Noise_XNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254be60dc15acd4d448e54a81c36031b2bd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f001d2d0138680be35a3b247be41ddf9 +msg_2_payload= +msg_2_ciphertext=644acc467adf3b0fcf528112daa6473b5f7eccfda6f35e43c8ceacc5b36fdbe783cb198473d625c010ec9b15dbc16f4f484ee5e9afd0030c14ad672c27888cc5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=89cbd646aeb2f177e721951f251ba49fa3301858d90e126b2624f075d4f129 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20943736018249bb86246c5e6abc05a43318177fd1acf9f17fdbe66f0c8786 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b7a6a865a363291e581c34bc35c8365 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b37f01c70f05506d6dac3d469cf12970 +msg_2_payload= +msg_2_ciphertext=b6247d8e9b00e51c28e179223285ba39a6d8a8cf6e9d30da6d45046a5bcc46ead5bd76c082595e3fa851fa68b226fed2f0e36857ce2b2c1bb6db5d1def71c553 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8823a52a7820f4427e8bd2d71aee13f17e979b1095e2602f212c1a0fde7f8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed15c9431df4f8e30c7d69d8fcc1f3cba62eff9b8f0dca8439b1e63185873e + +handshake=Noise_XNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542d0c7264b68d5dc48dec2efebac21eb5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666ccb5e6f7f8a43fcc7c08ceb60ebd6dd +msg_2_payload= +msg_2_ciphertext=87cb6974ecc3d5ae746b5ad5a13889eeb64930c8b2d75ab050cea76ff88b0daf2cdaeaedd0347d1e3ea45daae0d82d651f6e5570c6f9ffb03740c5029abbd1d9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=da8087eb4a0c87e6500c27c335fa688af01ce4ab4293ae99bd8457b38d33c2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7e8a728afbddb6786dcead1803d0a8cefb780f66989efcc00512c0c0b84e86 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a3b49c63b28e53c4ca60d9665141307f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663354690faf83da25e878325a2005f1c9 +msg_2_payload= +msg_2_ciphertext=f63edbeb454c2df86a311f7f3d7491fe197f6d6afa7a23b1c875ba31c93d2941a13e8327f351cec361b5967dab1ea7ce283091fe45f7139d7632d9a3d927737a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=54db3e36bce2d3a19395309650bd3014b7e71eb3f2708a2b13adee825d2577 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb8ea9164c2c727cbdab7ad21c485b2fd73d7dbe30d39482241ab93994aea2 + +handshake=Noise_XN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846612f372d7f26b78d4c7c9c9f08c104df736cc02ea331c83c6498d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=503a8b472892ad3f5b51559452113c16ed3e184c13f944444437a34e31f439ff87991616ec896946bdfd5a2ff7ecab30b1d5d90b0180e4020e32b2905fa1fdf1abf0e17903d0fa11bd8d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6233ac2185ec7af41983156d39699d8449548f0b481d6d0749496ffa362e5e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=085d31a2a8dfa0451b2080d1b516bf21503bd2abba540af2b97baad8ac7d60 + +handshake=Noise_XNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405e10984cac2c8b9431e3e5025938df4e39c942478bcc2722a54 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664981c8d4906f552b923dffdde5a30fb4fd30cceb9091ef913503 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=644acc467adf3b0fcf528112daa6473b5f7eccfda6f35e43c8ceacc5b36fdbe77f7303d2484e680d0dcf1703bd006df162029804a05248513696b861f3a2d2627f36c2cb683bbbf99ddd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=89cbd646aeb2f177e721951f251ba49fa3301858d90e126b2624f075d4f129 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20943736018249bb86246c5e6abc05a43318177fd1acf9f17fdbe66f0c8786 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c524c8eec1e25e136d78dc60a45cf7fb50893415f65319efb637 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466428012d547892abee56b6fc69ba0315682828117b88eb1fdab61 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b6247d8e9b00e51c28e179223285ba39a6d8a8cf6e9d30da6d45046a5bcc46eabecda5d2c25c7b10b66f093bf41749a97a849041926ab49c36be5cadaf10f95a92bd053872927102b2d5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8823a52a7820f4427e8bd2d71aee13f17e979b1095e2602f212c1a0fde7f8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed15c9431df4f8e30c7d69d8fcc1f3cba62eff9b8f0dca8439b1e63185873e + +handshake=Noise_XNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254785623d13d7d90f0389866c83a7a233d82456b10229518acb15b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d20b83210dbf4e12a39779088407fd878b5cee5e2b6f76a833ac +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=87cb6974ecc3d5ae746b5ad5a13889eeb64930c8b2d75ab050cea76ff88b0daf4fcff82bc91dec08d2fdc0da7c49231e2861bb4a561c81a29395619f3a27ba934977dc7d0a1334dbf516 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=da8087eb4a0c87e6500c27c335fa688af01ce4ab4293ae99bd8457b38d33c2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7e8a728afbddb6786dcead1803d0a8cefb780f66989efcc00512c0c0b84e86 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e23359ef5f50e0c7c53b5611a0d5eba739ae40af2b928c454691 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c23b78afaf9c3b0446d9fa54f1e1f8f7d2f79e8c53500e85fcc +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f63edbeb454c2df86a311f7f3d7491fe197f6d6afa7a23b1c875ba31c93d294145cee44b4f3577448b2097fb2e75b732499943c385cd7d2e878c8b49fb5e7ccbb54cc89cd47e5e0b68c9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=54db3e36bce2d3a19395309650bd3014b7e71eb3f2708a2b13adee825d2577 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb8ea9164c2c727cbdab7ad21c485b2fd73d7dbe30d39482241ab93994aea2 + +handshake=Noise_XN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e7d5bc062725904d0e112526293811b9 +msg_2_payload= +msg_2_ciphertext=503a8b472892ad3f5b51559452113c16ed3e184c13f944444437a34e31f439ff302f7d08f2b456cefb4b1898b3d59dc7b2c227d1b5776db819a910a3ada6f410 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6233ac2185ec7af41983156d39699d8449548f0b481d6d0749496ffa362e5e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=085d31a2a8dfa0451b2080d1b516bf21503bd2abba540af2b97baad8ac7d60 + +handshake=Noise_XNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f1aa09b43530ef5ef8da92a470629df9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665e93ce32ae9ed58913085363e1d5a366 +msg_2_payload= +msg_2_ciphertext=644acc467adf3b0fcf528112daa6473b5f7eccfda6f35e43c8ceacc5b36fdbe7e560c143da89678734b80155a6ffa08c02183ae0fa0cfb2ee8a2bd6576b2c8e7 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=89cbd646aeb2f177e721951f251ba49fa3301858d90e126b2624f075d4f129 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20943736018249bb86246c5e6abc05a43318177fd1acf9f17fdbe66f0c8786 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dbdd21afbcb5201f3293e6b9b0b21741 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846619cb4d03a0688af431c043c964cc5d0c +msg_2_payload= +msg_2_ciphertext=b6247d8e9b00e51c28e179223285ba39a6d8a8cf6e9d30da6d45046a5bcc46ea39962cc6c99fbf9cb381353ee8374245874d4c279a323370bbb6373a8a000e16 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8823a52a7820f4427e8bd2d71aee13f17e979b1095e2602f212c1a0fde7f8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed15c9431df4f8e30c7d69d8fcc1f3cba62eff9b8f0dca8439b1e63185873e + +handshake=Noise_XNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b1bd021ed3e3e5d4807ada02f9645d74 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692b94bc6537d2fed9a3c770b66591637 +msg_2_payload= +msg_2_ciphertext=87cb6974ecc3d5ae746b5ad5a13889eeb64930c8b2d75ab050cea76ff88b0daf415213045fc25050c65d660b1e1b6a8589a8c628892a21e02b5c3f0ea78c5e9f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=da8087eb4a0c87e6500c27c335fa688af01ce4ab4293ae99bd8457b38d33c2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7e8a728afbddb6786dcead1803d0a8cefb780f66989efcc00512c0c0b84e86 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c583a80c1b9c72ff4fcab5c6642a61b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d97987c73974b0eaf6f990ab6e715b69 +msg_2_payload= +msg_2_ciphertext=f63edbeb454c2df86a311f7f3d7491fe197f6d6afa7a23b1c875ba31c93d294125e1b2c36a4607e8a34670736750fee5ac7d0a002482b07d7cc4a69115c88d30 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=54db3e36bce2d3a19395309650bd3014b7e71eb3f2708a2b13adee825d2577 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb8ea9164c2c727cbdab7ad21c485b2fd73d7dbe30d39482241ab93994aea2 + +handshake=Noise_XN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846612f372d7f26b78d4c7c93deca890b478737fefc1db77d4a70c7d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=503a8b472892ad3f5b51559452113c16ed3e184c13f944444437a34e31f439ffb3cda7ae4d197b2eba686c6de1039e57b1d5d90b0180e4020e325aade631cb7d75d78cb7a4be982b0e4a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6233ac2185ec7af41983156d39699d8449548f0b481d6d0749496ffa362e5e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=085d31a2a8dfa0451b2080d1b516bf21503bd2abba540af2b97baad8ac7d60 + +handshake=Noise_XNpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405e10984cac2c8b9431ef429d0a9e1e987fa9ab72ed768d453d2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664981c8d4906f552b923d648b1adfd98463b7de620c3809e54270 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=644acc467adf3b0fcf528112daa6473b5f7eccfda6f35e43c8ceacc5b36fdbe7befd4b86277538e5733008c9b549f39962029804a0524851369631704b259e55bf9c511ac01893651c08 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=89cbd646aeb2f177e721951f251ba49fa3301858d90e126b2624f075d4f129 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20943736018249bb86246c5e6abc05a43318177fd1acf9f17fdbe66f0c8786 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c524c8eec1e25e136d780cd029d91adbe0f2524363dd016b477d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466428012d547892abee56b0265f0c9fe99b596e2291d0a3d9d0d3e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b6247d8e9b00e51c28e179223285ba39a6d8a8cf6e9d30da6d45046a5bcc46ea33c71af82b774d8fb8295a28eef160217a849041926ab49c36be63429a9c3a37f6fe3914421b8a79e348 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8823a52a7820f4427e8bd2d71aee13f17e979b1095e2602f212c1a0fde7f8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed15c9431df4f8e30c7d69d8fcc1f3cba62eff9b8f0dca8439b1e63185873e + +handshake=Noise_XNpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254785623d13d7d90f03898f7fee58afe50dae23444110a6e7e9cd0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d20b83210dbf4e12a3972ece13ca75b4160abaac01fb0cbdbcbd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=87cb6974ecc3d5ae746b5ad5a13889eeb64930c8b2d75ab050cea76ff88b0dafb71f25d3022bce2ac10652c064ebf0d32861bb4a561c81a29395a72e17a57f370259c04f0d0cb3899d80 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=da8087eb4a0c87e6500c27c335fa688af01ce4ab4293ae99bd8457b38d33c2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7e8a728afbddb6786dcead1803d0a8cefb780f66989efcc00512c0c0b84e86 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e23359ef5f50e0c7c53b7d4820e2923b0f9f60feec7466841622 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c23b78afaf9c3b0446d2b9018a12da1972a41e5aca5b0374147 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f63edbeb454c2df86a311f7f3d7491fe197f6d6afa7a23b1c875ba31c93d2941b0f3595d303a638fc757eb81d7841a4a499943c385cd7d2e878c8d0d9ef63936a3804cdc64aabd99e829 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=54db3e36bce2d3a19395309650bd3014b7e71eb3f2708a2b13adee825d2577 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb8ea9164c2c727cbdab7ad21c485b2fd73d7dbe30d39482241ab93994aea2 + +handshake=Noise_IN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cdeb70e577c726fba1c682d0cc9d58dc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=942a03a9fbd149d80f827d68acb020b98a2988435155931aa6e87780e1ae0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6c22a69895e4c940bed283b9a10ce57d83f09683827a283fda77d75d086c6e + +handshake=Noise_INpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c265cb3ca07c422159c05da5508b509330a9d97d67a3a8fea09e53fe4965fa404a45a7a007c03ec5b18911e3e5a11d686325db0c406eac3d84e1e705cd7e1c0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846669eeb99c25d0285113c571b33c777dc2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=702284b311f0bab378528420b7a5a4e829737ee3e6daf41517fda5fdfeadfb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52c5ed9e8e2fe3bb2a870b47b1380ef94a8578d3a895f4e799720902699fca + +handshake=Noise_INpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d56bb0c1876cf3c43d9e4704c3695912692be106f89aefc5f9a82faa4b8ed6d21fd0416e483d32cc8774dfcfdd0d384b277fc77f8a612755a568224a86f48e6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846610fab43afb44de3edfc9d3039020a09b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=594ecdb1619d52ce6094d23485ce71d1ba806bb3297be3e2aa8031b51f3fb9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=703336a1f5ae2eff07442bbbe4797fb864c8038a890332e943234fe11e92e7 + +handshake=Noise_INpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9b90bf88a0b8849c338ddcba137cc03b951bd2dc177071ee618d38f18d8171576e80df2eb20134ea61ecca66d604826193d3940232859387a7e6ab57d74bb41 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665f13b26b4e47f377f079cba555e2c2e7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c8cda123eca519ddae68fd5de69ae61696a8147e06b1b057478de9ca4dd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=477468334e5fe3fd833bedbdaa22c7030e03eb531402dd48df9ce98182ef08 + +handshake=Noise_IN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e081945b5d5301fe42dadb6da0f788260c6252af7f41e986c5c2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=942a03a9fbd149d80f827d68acb020b98a2988435155931aa6e87780e1ae0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6c22a69895e4c940bed283b9a10ce57d83f09683827a283fda77d75d086c6e + +handshake=Noise_INpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c265cb3ca07c422159c05da5508b509330a9d97d67a3a8fea09e53fe4965fa404a45a7a007c03ec5b18911e3e5a11d609022778b13fa7b2d13986844231dd445a7fdf2deced73ed7dc6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466245acc39d32cd111269cd3b4981cd32d0fc1dd3dbcd10c2ccd00 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=702284b311f0bab378528420b7a5a4e829737ee3e6daf41517fda5fdfeadfb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52c5ed9e8e2fe3bb2a870b47b1380ef94a8578d3a895f4e799720902699fca + +handshake=Noise_INpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d56bb0c1876cf3c43d9e4704c3695912692be106f89aefc5f9a82faa4b8ed6d21fd0416e483d32cc8774dfcfdd0d3849494d756adea0eee2f87617f98ac7dedd0342f13f2437853cac6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb85a80b70fd80c7647ad87182859bce0d29d69890b8fddcad49 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=594ecdb1619d52ce6094d23485ce71d1ba806bb3297be3e2aa8031b51f3fb9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=703336a1f5ae2eff07442bbbe4797fb864c8038a890332e943234fe11e92e7 + +handshake=Noise_INpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9b90bf88a0b8849c338ddcba137cc03b951bd2dc177071ee618d38f18d8171576e80df2eb20134ea61ecca66d60482696650307415ef3e84d9de5db5ddbb0c6edb37e0652d8f8a58b7b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bda119e70ff1a807b1f5c259b407bd4480b60a637c4e94aed69b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c8cda123eca519ddae68fd5de69ae61696a8147e06b1b057478de9ca4dd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=477468334e5fe3fd833bedbdaa22c7030e03eb531402dd48df9ce98182ef08 + +handshake=Noise_IN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b8070f1a05f109f179e7d3cb6327b9ff +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=942a03a9fbd149d80f827d68acb020b98a2988435155931aa6e87780e1ae0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6c22a69895e4c940bed283b9a10ce57d83f09683827a283fda77d75d086c6e + +handshake=Noise_INpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c265cb3ca07c422159c05da5508b509330a9d97d67a3a8fea09e53fe4965fa459403c6046385d6af1f458771895e2fab6c321b290160c5bd68c6a7c621388ad +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661e03dc287297fc7ff86bc8c7810284ea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=702284b311f0bab378528420b7a5a4e829737ee3e6daf41517fda5fdfeadfb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52c5ed9e8e2fe3bb2a870b47b1380ef94a8578d3a895f4e799720902699fca + +handshake=Noise_INpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d56bb0c1876cf3c43d9e4704c3695912692be106f89aefc5f9a82faa4b8ed6d83c17fa055704307c8811d1b0e0ad295f02971305459fdd7f965b0feb5b7ab6b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628f89ed04b07e0e9e94742792dc39554 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=594ecdb1619d52ce6094d23485ce71d1ba806bb3297be3e2aa8031b51f3fb9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=703336a1f5ae2eff07442bbbe4797fb864c8038a890332e943234fe11e92e7 + +handshake=Noise_INpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9b90bf88a0b8849c338ddcba137cc03b951bd2dc177071ee618d38f18d8171506626ab4985988f259d4b3030f1cecd90c4c6d1aa93d4213ad6adf172946bd3e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663096c40b47d26caec9bce34e223bc3db +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c8cda123eca519ddae68fd5de69ae61696a8147e06b1b057478de9ca4dd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=477468334e5fe3fd833bedbdaa22c7030e03eb531402dd48df9ce98182ef08 + +handshake=Noise_IN_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e081945b5d5301fe42dabcc010cb04cf66f06d25106d39cc52c8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=942a03a9fbd149d80f827d68acb020b98a2988435155931aa6e87780e1ae0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6c22a69895e4c940bed283b9a10ce57d83f09683827a283fda77d75d086c6e + +handshake=Noise_INpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c265cb3ca07c422159c05da5508b509330a9d97d67a3a8fea09e53fe4965fa459403c6046385d6af1f458771895e2fa09022778b13fa7b2d1391f421b1293b7d5da70d030b158d7cc98 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466245acc39d32cd111269c53d0795705caaf644f5bd95501f560b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=702284b311f0bab378528420b7a5a4e829737ee3e6daf41517fda5fdfeadfb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=52c5ed9e8e2fe3bb2a870b47b1380ef94a8578d3a895f4e799720902699fca + +handshake=Noise_INpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d56bb0c1876cf3c43d9e4704c3695912692be106f89aefc5f9a82faa4b8ed6d83c17fa055704307c8811d1b0e0ad2959494d756adea0eee2f8785d82292d8f8ed078e246a2fb78d65e1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb85a80b70fd80c7647ae5822e9159b0bef8a8d773460386dc8b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=594ecdb1619d52ce6094d23485ce71d1ba806bb3297be3e2aa8031b51f3fb9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=703336a1f5ae2eff07442bbbe4797fb864c8038a890332e943234fe11e92e7 + +handshake=Noise_INpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9b90bf88a0b8849c338ddcba137cc03b951bd2dc177071ee618d38f18d8171506626ab4985988f259d4b3030f1cecd996650307415ef3e84d9d01a03ce746f46e4a8128825ca5788c4a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bda119e70ff1a807b1f540d5adbfebb77d74f37e87a47d4df9a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c8cda123eca519ddae68fd5de69ae61696a8147e06b1b057478de9ca4dd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=477468334e5fe3fd833bedbdaa22c7030e03eb531402dd48df9ce98182ef08 + +handshake=Noise_XK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c050317e287f01c5a4a9f6f37a94856a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea8cc87b9a11903d7f303d57269ff01c +msg_2_payload= +msg_2_ciphertext=065a23c2f62fb1bed15cb6ecbd9267c0dc7524d31ee9367258f443517df4b46717fa1a7d40a1fe3f74d4072a798f56f68670975962e5e284bdbc195ce67b8083 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7043c98fbdd02d209268778851ae3117aa9cb3b29737867eb75e0718e8acfa +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=21069488a4bddda5c5211d9c5b80c1c5e42c4e65e5cd3040c613272ac05c07 + +handshake=Noise_XKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f2190213b518df1b9dc5abd926f7f12e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664beb6a04f3934e2aa1ce0eecdac1fda7 +msg_2_payload= +msg_2_ciphertext=f2fccf5e2aa6632808766b744399eb8a442020fcc5d2a516b5faa1a6b3561ca556b896b594f7c06e6228c1e05d4a3d1cc6c648d7bafbf389b519577c9a89945d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c18790dcb28ed5ebef55be13986db9dd2b9ed2133da67d370de3f1334ac9fc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=808fe9194364bc33125f5a83c2cece78bbc1e85d7eabbc015dbd9b661e8a75 + +handshake=Noise_XKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625486461e79ac43ef4a2cfea92f000ded06 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846602646e9b0c0f3a8cdf4bb57b005e9237 +msg_2_payload= +msg_2_ciphertext=f67e4c95336d43f8f72939e99f678331124ae5f5d9bd5e40a41ddded5a0a1b12ede3d82b8736b89315c15e0f4afeef04516b890c51b8302bb5a325bec3ecfba9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5b12ab52b1ee79a1114c3407e153f320863dfc86a0d98764f62651c50e2ede +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c5f2aed3a22d04a2107aca55f25a31366bc246ed6b52d3e71a413409d3e1ce + +handshake=Noise_XKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d5b4ca0da34839493aa0ac72dd63d23b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466805f13e0cb0646004ef00f7da87a5766 +msg_2_payload= +msg_2_ciphertext=0bb72e926efbf321955a792b7ccb45a295c6d5f031f59648c9662b709a8df50723987232b9f4da9ca839b69be56589a440adc771cc7e3c6f62aefb962d0ca355 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=974c226eca2032beaa7dc8e9ee1ac58e566cb305fbc79cca8ffa77eb6a02d0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94e1425470776282f7e9751698cc7ba2ae5dc0cb3c8d9b189021f6b94e65ec + +handshake=Noise_XKpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fe849be95b0f77879a684979c7af0544 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846682d5e55e0f9af1439418f4fbd8f974e2 +msg_2_payload= +msg_2_ciphertext=c1a1778bfba62342d38b2dc7c5042d7e809efc74a6d780d2d7589673e27a3a1a31e539e0855f6ea1b0ff3d61a12da8e10959cb26e02e0815e3ec5a58808352ae +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f4b75252b4249d95ebbc815bee87953b2bc4d6bc1ca89237d9196ab363b7fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f0a47d13ace24e87f0b5319eea0bc141a410d4d1ae2705e4a0dc5fd168c867 + +handshake=Noise_XK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254496dd4fd65bcb73030e1a50f16936b093497a8bde429c662e917 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea95f04183becb2895dabdafa5b7d048a62812a4cdc993d14f40 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=065a23c2f62fb1bed15cb6ecbd9267c0dc7524d31ee9367258f443517df4b467b299f23b7566cb23e20882c3ec1a0f6aad26e0baa7ec90d7741c99f08177caf8918d56c694da03de81bd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7043c98fbdd02d209268778851ae3117aa9cb3b29737867eb75e0718e8acfa +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=21069488a4bddda5c5211d9c5b80c1c5e42c4e65e5cd3040c613272ac05c07 + +handshake=Noise_XKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542423e50f21aff9ad1af4d952df961bc129edc38ab98728a8e058 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846654da6d875f5739c5ad31fb962eb44d8e77fb94b5bf87722578a6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f2fccf5e2aa6632808766b744399eb8a442020fcc5d2a516b5faa1a6b3561ca5b56f60bb281bd60c6cb5312f4584d043b1d0c753b4af23154da6f47b34d3b8e7aca54c7dfbf9f8f14796 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c18790dcb28ed5ebef55be13986db9dd2b9ed2133da67d370de3f1334ac9fc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=808fe9194364bc33125f5a83c2cece78bbc1e85d7eabbc015dbd9b661e8a75 + +handshake=Noise_XKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545e026b56dc562c44666a4b04568f0485cef1c5067b4484d10d7c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466020430cef83f07cba7618e4b4de18d8f43a09e70021b8d5c701d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f67e4c95336d43f8f72939e99f678331124ae5f5d9bd5e40a41ddded5a0a1b12a73c4e9ad20e003306bf0682e5c662c2eadb761ca33e775aea82e39bce172ef4fdf75a28142fc4375066 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5b12ab52b1ee79a1114c3407e153f320863dfc86a0d98764f62651c50e2ede +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c5f2aed3a22d04a2107aca55f25a31366bc246ed6b52d3e71a413409d3e1ce + +handshake=Noise_XKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429519d9da85dd8bb5090f154872c67bb1a86e0ecd5dc14d0dd77 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f4d74c505f803c540657f2f648cf45b3ec7222c71c4d9b8574e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0bb72e926efbf321955a792b7ccb45a295c6d5f031f59648c9662b709a8df5075091175fc7e05098a89b8eb66fcbcc153ceb21a2f48b1ad5b7f41c741e6ebde723a3f28fa1cdca225fdd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=974c226eca2032beaa7dc8e9ee1ac58e566cb305fbc79cca8ffa77eb6a02d0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94e1425470776282f7e9751698cc7ba2ae5dc0cb3c8d9b189021f6b94e65ec + +handshake=Noise_XKpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a6f963df7b04718a9a3aecf6f1900be93d1d923389bd9009f140 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a13bb0d71fd337f74bd5d2c13987667845b0ac7dc84cdbc516c1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c1a1778bfba62342d38b2dc7c5042d7e809efc74a6d780d2d7589673e27a3a1a27c2812e02c1c55e91c5143c3dc09ec208eab30f236b34955872b84b93506853f91d7e0a0fa565b63612 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f4b75252b4249d95ebbc815bee87953b2bc4d6bc1ca89237d9196ab363b7fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f0a47d13ace24e87f0b5319eea0bc141a410d4d1ae2705e4a0dc5fd168c867 + +handshake=Noise_XK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254adeaa7a4d551515273fda940aa4a5c8a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ef86a45510611db0c587343c9bc1598a +msg_2_payload= +msg_2_ciphertext=065a23c2f62fb1bed15cb6ecbd9267c0dc7524d31ee9367258f443517df4b467af8e83092060a7ae3419acc16ff01de79bd94e38a1517cc2bec944e49148c8fb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7043c98fbdd02d209268778851ae3117aa9cb3b29737867eb75e0718e8acfa +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=21069488a4bddda5c5211d9c5b80c1c5e42c4e65e5cd3040c613272ac05c07 + +handshake=Noise_XKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254629272b173021b86c6bb347f567e0a6f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466173b83666da49fc7fd72ff392de6600b +msg_2_payload= +msg_2_ciphertext=f2fccf5e2aa6632808766b744399eb8a442020fcc5d2a516b5faa1a6b3561ca51e31645083c4afd11906f23987a4afbf39430cf3f5285787fa12bff00fd46615 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c18790dcb28ed5ebef55be13986db9dd2b9ed2133da67d370de3f1334ac9fc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=808fe9194364bc33125f5a83c2cece78bbc1e85d7eabbc015dbd9b661e8a75 + +handshake=Noise_XKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bf1c11388fc68b4c1d166db401a26682 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669560df6a9977cbf93d0a0cea6aa07b63 +msg_2_payload= +msg_2_ciphertext=f67e4c95336d43f8f72939e99f678331124ae5f5d9bd5e40a41ddded5a0a1b128dce5e889350cf0ab7bdddbb06a6751c2f2c12b5cf714cf4d2e18eece5562d83 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5b12ab52b1ee79a1114c3407e153f320863dfc86a0d98764f62651c50e2ede +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c5f2aed3a22d04a2107aca55f25a31366bc246ed6b52d3e71a413409d3e1ce + +handshake=Noise_XKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9fe5233a2995e81a524c16aad452566 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466071dd09d6ce273e11d8798d8b12d2ce9 +msg_2_payload= +msg_2_ciphertext=0bb72e926efbf321955a792b7ccb45a295c6d5f031f59648c9662b709a8df50744a858e35dc73078e6dddca9a9697eb0dfc90b9ed958f8f0655807591acea472 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=974c226eca2032beaa7dc8e9ee1ac58e566cb305fbc79cca8ffa77eb6a02d0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94e1425470776282f7e9751698cc7ba2ae5dc0cb3c8d9b189021f6b94e65ec + +handshake=Noise_XKpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9f5585baf18efad7e93d7dec1071901 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a99a71b8f92e54977d070f1f10271671 +msg_2_payload= +msg_2_ciphertext=c1a1778bfba62342d38b2dc7c5042d7e809efc74a6d780d2d7589673e27a3a1a730cd354af59adfbfa3e6ec4bd08bc99aff4955676fbde51360f35a9a510f72b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f4b75252b4249d95ebbc815bee87953b2bc4d6bc1ca89237d9196ab363b7fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f0a47d13ace24e87f0b5319eea0bc141a410d4d1ae2705e4a0dc5fd168c867 + +handshake=Noise_XK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254496dd4fd65bcb73030e122934282a79fa89a268ffff61fb58356 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea95f04183becb2895daa2e377fc2cb1b7500945abce23064a11 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=065a23c2f62fb1bed15cb6ecbd9267c0dc7524d31ee9367258f443517df4b46762a479a461f55eba0779622a07538dabad26e0baa7ec90d7741c5aa49162b67b7a86591ed7080b6b60f6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7043c98fbdd02d209268778851ae3117aa9cb3b29737867eb75e0718e8acfa +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=21069488a4bddda5c5211d9c5b80c1c5e42c4e65e5cd3040c613272ac05c07 + +handshake=Noise_XKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542423e50f21aff9ad1af4c5a676bf5dc0f8a46df2ed5acfecfae6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846654da6d875f5739c5ad31647583fd0cf33e43619573396b31e006 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f2fccf5e2aa6632808766b744399eb8a442020fcc5d2a516b5faa1a6b3561ca54e6e5e30d1fd0fa830ee2ce7be13e55ab1d0c753b4af23154da6432ba9b1bde756e4eba9c12bfb132acd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c18790dcb28ed5ebef55be13986db9dd2b9ed2133da67d370de3f1334ac9fc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=808fe9194364bc33125f5a83c2cece78bbc1e85d7eabbc015dbd9b661e8a75 + +handshake=Noise_XKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545e026b56dc562c44666a0b32c0f7ef20395ed050bf7ce26fe0dd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466020430cef83f07cba7613bcc24dd903e5ade856baf212f0f228c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f67e4c95336d43f8f72939e99f678331124ae5f5d9bd5e40a41ddded5a0a1b12a912e09376977a94197b3cc225e0e569eadb761ca33e775aea82d000ceefd76c3ff19449df3a1af2f503 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5b12ab52b1ee79a1114c3407e153f320863dfc86a0d98764f62651c50e2ede +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c5f2aed3a22d04a2107aca55f25a31366bc246ed6b52d3e71a413409d3e1ce + +handshake=Noise_XKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429519d9da85dd8bb5090f9c0bc4acb54b3ba8a24ec56fa5f4ba0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f4d74c505f803c54065e454d0a3bdf2ef4a40b24693c281ae2a +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0bb72e926efbf321955a792b7ccb45a295c6d5f031f59648c9662b709a8df5072540b38091cd1530656d7015185d682f3ceb21a2f48b1ad5b7f4094a2660dedd7fafa40dc6febe793f19 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=974c226eca2032beaa7dc8e9ee1ac58e566cb305fbc79cca8ffa77eb6a02d0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94e1425470776282f7e9751698cc7ba2ae5dc0cb3c8d9b189021f6b94e65ec + +handshake=Noise_XKpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a6f963df7b04718a9a3a3e16e953cef0de71cf553539d8859d24 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a13bb0d71fd337f74bd528c12f0b90fde211edca976ede0a3292 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c1a1778bfba62342d38b2dc7c5042d7e809efc74a6d780d2d7589673e27a3a1a5fdd43d30c8689a043ef99c917b9f36308eab30f236b34955872cb86d6b3e197c9e019fc833ba40868a2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f4b75252b4249d95ebbc815bee87953b2bc4d6bc1ca89237d9196ab363b7fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f0a47d13ace24e87f0b5319eea0bc141a410d4d1ae2705e4a0dc5fd168c867 + +handshake=Noise_IK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419d6fab175300a577115c701c41ed681373f0432f81d3bf8676bd05216cd1919ba2eaa418fdd8e09ae59d7cf57869de42789c3b9ca915c2cacf009f9d0e4436e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846623c019a124da3f096e964fe624cf65db +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=80a75e75c8e8d2e9c2a6c7bc6e550c4997d6d2b45429a530821c4aa5d36f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b8475410da62a98493d33a1e669f8f56dd8f61d449b53bd375299c3435424a + +handshake=Noise_IKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254694ead724bb690ad27ce3893ebd8394b455e44e362122cce141b66200c2ac5a3db8bb908bbf1254f7f74801e5058e5e819dd00881b21a04144c1824606c0c078 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dc8096770cbc501e31c8d2275ea75642 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2471b2688160616fc0bd108fde1be5848e763d448a018f8f9052697444a95a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e48f8d2d66ccb8f59321228086764d403dac49de50617604bd4e1399ec7714 + +handshake=Noise_IKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d090a76917ed86b1ca3f8af8ac5c0803d5b3b290ab95fa415d8bf2f9200a59fc34c54450e0a71f213dbb91f5a5843c28a1b1e94ea7a8c729788b074f894477f7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846635c80f45db0193be6c76fa63c43b2230 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=245e2f9694b825a856dc97709fcc450870d23dd07637b57d21268ad60016e4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=977eb8234bef8ece7a14c771fa5019aae42c0f4655d4e1ffbfdb4a96def193 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540322be5210eec7e84567f5b4ad376b908b7c38a587eb71776e0661a6ca9f3ef251962835db06e694781bcf163d3cb38dfe6ffdada1fcf40492123fd5eae6c0c9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f9d3c922ccf0a76efc90a08b4d23df61 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c033f4a3312af700a5a655f6992bcad095ceb5af11b02027cecd87ef65738c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3363987af8578ae96cb358858a859ef8060129a05d85700d8a9c4955c599c1 + +handshake=Noise_IK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419d6fab175300a577115c701c41ed681373f0432f81d3bf8676bd05216cd1919ba2eaa418fdd8e09ae59d7cf57869de4e6d8177aa9777fe9b843100e255aee76034f61b96b52af38660c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846658a7bb8caac509783390e5a04df4a3ca570b2bcdf65f8c1c40cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=80a75e75c8e8d2e9c2a6c7bc6e550c4997d6d2b45429a530821c4aa5d36f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b8475410da62a98493d33a1e669f8f56dd8f61d449b53bd375299c3435424a + +handshake=Noise_IKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254694ead724bb690ad27ce3893ebd8394b455e44e362122cce141b66200c2ac5a3db8bb908bbf1254f7f74801e5058e5e817106241219f60be8d1a7770f3def3c59038d187a53c0362f190 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6bef292d60d7dd4c6d157f33e863b7b6d53ba0113ae21d8deea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2471b2688160616fc0bd108fde1be5848e763d448a018f8f9052697444a95a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e48f8d2d66ccb8f59321228086764d403dac49de50617604bd4e1399ec7714 + +handshake=Noise_IKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d090a76917ed86b1ca3f8af8ac5c0803d5b3b290ab95fa415d8bf2f9200a59fc34c54450e0a71f213dbb91f5a5843c28720b9cbc2e1f0e39ae53c6fe9b31a70aa73d77909aafd3d3c36b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c92aa230bccd4126f41b8aa35f2c0e1b7d53e57df197dc13feb7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=245e2f9694b825a856dc97709fcc450870d23dd07637b57d21268ad60016e4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=977eb8234bef8ece7a14c771fa5019aae42c0f4655d4e1ffbfdb4a96def193 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540322be5210eec7e84567f5b4ad376b908b7c38a587eb71776e0661a6ca9f3ef251962835db06e694781bcf163d3cb38d2dbe7ee0a408573e5466e702c802dce4b432bd175dff1a5caae4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466574ad0a465f5fa10665727be848a181ffd21211d5aa7d5be8e28 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c033f4a3312af700a5a655f6992bcad095ceb5af11b02027cecd87ef65738c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3363987af8578ae96cb358858a859ef8060129a05d85700d8a9c4955c599c1 + +handshake=Noise_IK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419d6fab175300a577115c701c41ed681373f0432f81d3bf8676bd05216cd1919e61b75ccef0c0cf0b216fcdf371d0859ab50373f8c7b70a239f8cc8318e6075b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb50a12b50b0b1b43fc6725181315302 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=80a75e75c8e8d2e9c2a6c7bc6e550c4997d6d2b45429a530821c4aa5d36f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b8475410da62a98493d33a1e669f8f56dd8f61d449b53bd375299c3435424a + +handshake=Noise_IKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254694ead724bb690ad27ce3893ebd8394b455e44e362122cce141b66200c2ac5a340048ce6c8456ff4837c29fe67256f81c751b0c269239a167fbf0300dfb648a3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666d2b48b1cea39effcb0d05417086092 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2471b2688160616fc0bd108fde1be5848e763d448a018f8f9052697444a95a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e48f8d2d66ccb8f59321228086764d403dac49de50617604bd4e1399ec7714 + +handshake=Noise_IKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d090a76917ed86b1ca3f8af8ac5c0803d5b3b290ab95fa415d8bf2f9200a59fc0aef8b6d695b38b638d8a84ff6029bfa1389fc6a2c64763e1546d48733e7a69f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846681140ff7535a34e76cec240241c16675 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=245e2f9694b825a856dc97709fcc450870d23dd07637b57d21268ad60016e4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=977eb8234bef8ece7a14c771fa5019aae42c0f4655d4e1ffbfdb4a96def193 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540322be5210eec7e84567f5b4ad376b908b7c38a587eb71776e0661a6ca9f3ef2da7e079ebdd84739c3bce2764827999b754f95e803096d0591567119765f495e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466848adcd10e9bc9826df50f4b6bc66b29 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c033f4a3312af700a5a655f6992bcad095ceb5af11b02027cecd87ef65738c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3363987af8578ae96cb358858a859ef8060129a05d85700d8a9c4955c599c1 + +handshake=Noise_IK_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419d6fab175300a577115c701c41ed681373f0432f81d3bf8676bd05216cd1919e61b75ccef0c0cf0b216fcdf371d0859e6d8177aa9777fe9b8435bb6f8202c3acd9051a9aee0a63e76f6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846658a7bb8caac5097833909e90778571d34ce0e5b6ea4c3a76f102 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=80a75e75c8e8d2e9c2a6c7bc6e550c4997d6d2b45429a530821c4aa5d36f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b8475410da62a98493d33a1e669f8f56dd8f61d449b53bd375299c3435424a + +handshake=Noise_IKpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254694ead724bb690ad27ce3893ebd8394b455e44e362122cce141b66200c2ac5a340048ce6c8456ff4837c29fe67256f8117106241219f60be8d1ad5cce3624dd12b08c8095b0abfe558a2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6bef292d60d7dd4c6d103923a164717d1f2c43d4a0be832d29f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2471b2688160616fc0bd108fde1be5848e763d448a018f8f9052697444a95a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e48f8d2d66ccb8f59321228086764d403dac49de50617604bd4e1399ec7714 + +handshake=Noise_IKpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d090a76917ed86b1ca3f8af8ac5c0803d5b3b290ab95fa415d8bf2f9200a59fc0aef8b6d695b38b638d8a84ff6029bfa720b9cbc2e1f0e39ae53481de7823a9ec40e8e82d4e52bdbe833 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c92aa230bccd4126f41bba00c0183e8a92b2d41d3874e2d39c67 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=245e2f9694b825a856dc97709fcc450870d23dd07637b57d21268ad60016e4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=977eb8234bef8ece7a14c771fa5019aae42c0f4655d4e1ffbfdb4a96def193 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540322be5210eec7e84567f5b4ad376b908b7c38a587eb71776e0661a6ca9f3ef2da7e079ebdd84739c3bce2764827999b2dbe7ee0a408573e5466b25ab358115f0cafc7c888119dfb98cc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466574ad0a465f5fa106657b9f7927e737f39dbed9fe3bf511849f9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c033f4a3312af700a5a655f6992bcad095ceb5af11b02027cecd87ef65738c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3363987af8578ae96cb358858a859ef8060129a05d85700d8a9c4955c599c1 + +handshake=Noise_XX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665393019dbd6f438795da206db0886610b26108e424142c2e9b5fd1f7ea70cde8767ce62d7e3c0e9bcefe4ab872c0505b9e824df091b74ffe10a2b32809cab21f +msg_2_payload= +msg_2_ciphertext=e610eadc4b00c17708bf223f29a66f02342fbedf6c0044736544b9271821ae40e70144cecd9d265dffdc5bb8e051c3f83db32a425e04d8f510c58a43325fbc56 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9ea1da1ec3bfecfffab213e537ed1791bfa887dd9c631351b3f63d6315ab9a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=217c5111fad7afde33bd28abaff3def88a57ab50515115d23a10f28621f842 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f10774870f2c18bd60e3a1629fee0e9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466807dca8877a33959186ac0181ac963a7dd13a134ae4a2191da2bedd96911f7b1f2d8f840385aff491d71970b02691ec2ab2beffd1b374db8c8f15cabcb3fddf5 +msg_2_payload= +msg_2_ciphertext=099fd29f5cad05f9d2c9be076d04e80a092e181fa13a4e844386e360defdca4ea1c15be27443d30d40db0e319f9e614f40a41d90532d7a3684ebc440d9bb73eb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=99521768e8b75eae6d56db072601817fd0606206ca444b02f911562521e4fd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ab15274dff9f222379cd9feac0e4a82b7fb61fc0c79372dd9c07d283b1e765 + +handshake=Noise_XXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b6dcbceafe33638fea90c80dd1e8d203 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667017a62eaf03e7998188e6751f9fcac8bc79848fad62102c1936a2af6aef691c0d9fd04c9fe5018b678e0a6d7333ffaa5860ab1d5bc128e25eff7403eaa53864 +msg_2_payload= +msg_2_ciphertext=8f83154157fddfe88c38ce42a13b74127986fd61dc310450deb5ff6a181fa057639b6fba5e0842781640b7b7c5cf8bdf19ee4436359d40f4214c59aaa2971736 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=776c311a7a1a1a31a0fa9950b6435a8116fc986c30aefb84b1de1a1ea3e0cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c79820d7cd308ba3da226008598c022aeb8f084dde84fee307293a3634e331 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544cff7d0c96d894314bd03f327cbac98f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc9f39c99cf603e2db23dbe9ce2adec44a572047d4a1d3f8c0df894e11f5bd7fa2fdaa0856557bcc2c4276a81ce70f63fa33069acf2dc7b13f505aa0cfda1372 +msg_2_payload= +msg_2_ciphertext=b58fc4f341feab3fe253ee6489ad653afe49fcc6eea1f18a892b1a8febc146eed9bacb291dfc7a05015e8a9ff6c4aea6f5090a8fe040a0628bf348f670144762 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fc4829fa5f449a9aca1577156e58691997a90a5a55b7aa6401257535595eb9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b069da251403dba1f073a2fea640f5a8cc91d1f012a01c1fa87435a8492030 + +handshake=Noise_XXpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e3443cc5cde4af71a33c6b56cbc00ea8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb1259f77345353d70dcef1e97d161dd9c3324e72b46203ebe87dcb40159eb6683aae01b5e9a0d3b45f0cc22a1eba217aa52f541c089a733541cbace7919e264 +msg_2_payload= +msg_2_ciphertext=a702c30239110afbb8afacb639f961e5c2574c3fe59ee6069c0f5f5414ea249379e58f0d514bb0f277ffe5ae6e6aecf9f4c58681a8586ac9878e6b9a086f4e40 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=187cadad4158250d0af49c2aea3bedc34aee2cc962336fbe649527ca78e48c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=91de652b73884e25506003fe72969748b9092a4518be9c6e4911a52b60375f + +handshake=Noise_XX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665393019dbd6f438795da206db0886610b26108e424142c2e9b5fd1f7ea70cde8c9f29dcec8d3ab554f4a5330657867fe4917917195c8cf360e08d6dc5f71baf875ec6e3bfc7afda4c9c2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e610eadc4b00c17708bf223f29a66f02342fbedf6c0044736544b9271821ae40232c55cd96d1350af861f6a04978f7d5e070c07602c6b84d25a331242a71c50ae31dd4c164267fd48bd2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9ea1da1ec3bfecfffab213e537ed1791bfa887dd9c631351b3f63d6315ab9a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=217c5111fad7afde33bd28abaff3def88a57ab50515115d23a10f28621f842 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542dfece4dae76dc5ac85cb897862e0637e7403c75bb5761111b83 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466807dca8877a33959186ac0181ac963a7dd13a134ae4a2191da2bedd96911f7b1549721eaf8b8212a701886c355be87e686ae9e443b823f0d58eceab3e52ff4d365f9b6793b5a6e913e82 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=099fd29f5cad05f9d2c9be076d04e80a092e181fa13a4e844386e360defdca4e476fccf79130a33fd25244336598bf55637ea8dea2acb6fd2e6c98213519f6f2d25947620be6979e3858 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=99521768e8b75eae6d56db072601817fd0606206ca444b02f911562521e4fd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ab15274dff9f222379cd9feac0e4a82b7fb61fc0c79372dd9c07d283b1e765 + +handshake=Noise_XXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b1c5b18c538c8c63ca5d317942e39790c9a490ec0349924c9f1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667017a62eaf03e7998188e6751f9fcac8bc79848fad62102c1936a2af6aef691c0ad62dc8498b97040b8a96630d1c68a6f8fbe4180e999511b4e3bfa3e0ae626aa97e13adc6eeaa2d4310 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8f83154157fddfe88c38ce42a13b74127986fd61dc310450deb5ff6a181fa057acf4829f9429fc717589b9998148cf0580a72833458eaac993ba86ca4314f11ac370f7fb7a1d92360504 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=776c311a7a1a1a31a0fa9950b6435a8116fc986c30aefb84b1de1a1ea3e0cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c79820d7cd308ba3da226008598c022aeb8f084dde84fee307293a3634e331 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625444c72fdfcc26b692b2435ad02e6c7f0c07226d2edd62204fbe9c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc9f39c99cf603e2db23dbe9ce2adec44a572047d4a1d3f8c0df894e11f5bd7f45cdfbefb68a646406aebe4c1987a2686d93f50fbd193f60379e3691036e92cb41993381816ab66d1ea3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b58fc4f341feab3fe253ee6489ad653afe49fcc6eea1f18a892b1a8febc146ee526267e460783c68aefd8a71354f3919ae4d3c4c228a97bbbbef8021883cd1832050c4b17c7b02155569 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fc4829fa5f449a9aca1577156e58691997a90a5a55b7aa6401257535595eb9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b069da251403dba1f073a2fea640f5a8cc91d1f012a01c1fa87435a8492030 + +handshake=Noise_XXpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545d791aebd7b1ff3a73ba5c27944833f62facffa3b38f7ec45f9f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb1259f77345353d70dcef1e97d161dd9c3324e72b46203ebe87dcb40159eb66954fa813c5770391ff0e4006fa005462b1bfa8057f6e8f62584a272b0eec13b6cf6a75a736ddf5d0d3cd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a702c30239110afbb8afacb639f961e5c2574c3fe59ee6069c0f5f5414ea2493ab8dbfb3e1f6148b9c0d93e8d9ebf5183e3be30d1cb36cf2cd66eccebe0493ead2ba5f2bfae0d821ce21 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=187cadad4158250d0af49c2aea3bedc34aee2cc962336fbe649527ca78e48c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=91de652b73884e25506003fe72969748b9092a4518be9c6e4911a52b60375f + +handshake=Noise_XX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665393019dbd6f438795da206db0886610b26108e424142c2e9b5fd1f7ea70cde8545f22cc3b52e6cf83a9266ed4850a7a3460f29794110cc1e4c4b5241c939f90 +msg_2_payload= +msg_2_ciphertext=e610eadc4b00c17708bf223f29a66f02342fbedf6c0044736544b9271821ae406561124920ea641646ea97786397ad23ab2f0dbf49fc3e46328b481b0924438c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9ea1da1ec3bfecfffab213e537ed1791bfa887dd9c631351b3f63d6315ab9a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=217c5111fad7afde33bd28abaff3def88a57ab50515115d23a10f28621f842 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fbf84632d6f2ee3f0f542ed012795e4a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466807dca8877a33959186ac0181ac963a7dd13a134ae4a2191da2bedd96911f7b1aaf8f55fffe1c50fc9ee9c46feba7bf8b04117ac48bc436c3818f5ec5ee45db1 +msg_2_payload= +msg_2_ciphertext=099fd29f5cad05f9d2c9be076d04e80a092e181fa13a4e844386e360defdca4e9b9f67a4e8a1de4333f67defea7fd8f4e39466651c8681fea507cfa7f3bfe155 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=99521768e8b75eae6d56db072601817fd0606206ca444b02f911562521e4fd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ab15274dff9f222379cd9feac0e4a82b7fb61fc0c79372dd9c07d283b1e765 + +handshake=Noise_XXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254709a9d93b489223c7fa509f35c2c19af +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667017a62eaf03e7998188e6751f9fcac8bc79848fad62102c1936a2af6aef691c503cbdb4cdc7d576fc13f89c8322308ebed27aa285cc83ac65c8ba19224c22a7 +msg_2_payload= +msg_2_ciphertext=8f83154157fddfe88c38ce42a13b74127986fd61dc310450deb5ff6a181fa0574ab7d599dfa195ed182e163ebd919f8648105379593b3f75dc78fd0dd274bbec +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=776c311a7a1a1a31a0fa9950b6435a8116fc986c30aefb84b1de1a1ea3e0cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c79820d7cd308ba3da226008598c022aeb8f084dde84fee307293a3634e331 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bdfc6a80d9f928922f8dd436a4005e3c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc9f39c99cf603e2db23dbe9ce2adec44a572047d4a1d3f8c0df894e11f5bd7f29af04d33962ddd8a7c6a4c775f29008ef90fbab2ec1b7782668304fcd060294 +msg_2_payload= +msg_2_ciphertext=b58fc4f341feab3fe253ee6489ad653afe49fcc6eea1f18a892b1a8febc146ee0decb17e6bf529ac042e8ec4b2226614d28c6c9477b1f2d0bdbee3b53eaaac81 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fc4829fa5f449a9aca1577156e58691997a90a5a55b7aa6401257535595eb9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b069da251403dba1f073a2fea640f5a8cc91d1f012a01c1fa87435a8492030 + +handshake=Noise_XXpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b2f4adfa73e9ba5320d7dad00152ab9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb1259f77345353d70dcef1e97d161dd9c3324e72b46203ebe87dcb40159eb666198ef90bf6d0b1a0e76374ae604ac12c54156a8210758dea8c50d8720b4533f +msg_2_payload= +msg_2_ciphertext=a702c30239110afbb8afacb639f961e5c2574c3fe59ee6069c0f5f5414ea2493bf47ccd868daf2dc792d2a6493790f4a804d0508de91173260899064d056c042 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=187cadad4158250d0af49c2aea3bedc34aee2cc962336fbe649527ca78e48c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=91de652b73884e25506003fe72969748b9092a4518be9c6e4911a52b60375f + +handshake=Noise_XX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665393019dbd6f438795da206db0886610b26108e424142c2e9b5fd1f7ea70cde847f6866f15c3cd3f864f7ed682f1711a4917917195c8cf360e080035dfa88af5c6e9b820278e6016f7d7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e610eadc4b00c17708bf223f29a66f02342fbedf6c0044736544b9271821ae403bbe475185a4a265a50e1d43bdaeee7fe070c07602c6b84d25a3b4064af5be30115a052069038f5002a3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9ea1da1ec3bfecfffab213e537ed1791bfa887dd9c631351b3f63d6315ab9a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=217c5111fad7afde33bd28abaff3def88a57ab50515115d23a10f28621f842 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542dfece4dae76dc5ac85c1825d578f5381e8a6ca0ff8b782f9c86 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466807dca8877a33959186ac0181ac963a7dd13a134ae4a2191da2bedd96911f7b103f1588855356691eb8e399bd3cfd5f486ae9e443b823f0d58ec04fb2ea6275da3194a478e2d24af9a23 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=099fd29f5cad05f9d2c9be076d04e80a092e181fa13a4e844386e360defdca4e8223254ae6ec8e2f94404c1b2cfbf633637ea8dea2acb6fd2e6cf013d5bcd43885c658750a9d5af5c7ec +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=99521768e8b75eae6d56db072601817fd0606206ca444b02f911562521e4fd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ab15274dff9f222379cd9feac0e4a82b7fb61fc0c79372dd9c07d283b1e765 + +handshake=Noise_XXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b1c5b18c538c8c63ca5dd70a54c15168915bf5edbab2df12bf2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667017a62eaf03e7998188e6751f9fcac8bc79848fad62102c1936a2af6aef691c29dfd353ee7b2c1ac5031544aa7e2814f8fbe4180e999511b4e32e3fa0a009cdc7b9c20ce6b5787f9fcf +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8f83154157fddfe88c38ce42a13b74127986fd61dc310450deb5ff6a181fa057d96927eaac505ff481efa6f1c092dd1880a72833458eaac993ba5e19641750e4f2195fa3af7b5f369a1a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=776c311a7a1a1a31a0fa9950b6435a8116fc986c30aefb84b1de1a1ea3e0cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c79820d7cd308ba3da226008598c022aeb8f084dde84fee307293a3634e331 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625444c72fdfcc26b692b243fd1e0d69cd5735b9af404ae7ddc7f15e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc9f39c99cf603e2db23dbe9ce2adec44a572047d4a1d3f8c0df894e11f5bd7f9ed5a62a0d63ccfc5b60d1420eb1d4ac6d93f50fbd193f60379e2140cdb6860d1460b007be5c8064da95 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b58fc4f341feab3fe253ee6489ad653afe49fcc6eea1f18a892b1a8febc146ee309032b5b433c34b4982844c2cc0e449ae4d3c4c228a97bbbbef52a9e44f4a52de079ba231a6b68a45c9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fc4829fa5f449a9aca1577156e58691997a90a5a55b7aa6401257535595eb9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b069da251403dba1f073a2fea640f5a8cc91d1f012a01c1fa87435a8492030 + +handshake=Noise_XXpsk3_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545d791aebd7b1ff3a73ba67c693699d548895df3e86b1204b11fe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb1259f77345353d70dcef1e97d161dd9c3324e72b46203ebe87dcb40159eb6603c900a563c48b22719b49f31437cfe9b1bfa8057f6e8f62584a5a0257c9eede97ecbafd2890e6551923 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a702c30239110afbb8afacb639f961e5c2574c3fe59ee6069c0f5f5414ea2493462db30239ac36a9b70292f81f30fb9d3e3be30d1cb36cf2cd66b2c4bb6a84a19a1a06ab7ba66b78b51d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=187cadad4158250d0af49c2aea3bedc34aee2cc962336fbe649527ca78e48c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=91de652b73884e25506003fe72969748b9092a4518be9c6e4911a52b60375f + +handshake=Noise_IX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dafa2f50bec421c6e061a97013b8d9d582911be531e7e463f108e9389c74d589e2173945cfe456788f1608bdbf6a9c2b34c089108e662e613ac961e8dbc9973b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=40c12ccfdf59f44d7cfc8c7dfe8a1bf739107c31aebcfc9f4caee7dc9099c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c3beff2f2144bb23f7fae6fd03578c40f1ef01140d1721a9e895958d52d749 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a91f197ee337c37f7558ccd2074c61fa06784cb2e6325bde19d184ae68e6e2f7c5fbaa3a25628896bcd7c942ae437a7a87c84b7586565643e6ee0655cda423d7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b13bcef5c9664ec91e1fe0a4cc3e93850404c874f059b5f5b83d938d3f52f3e20d6a62ed81ee66161a8c14b2863f63ca88e762840a3c3700c6b382593438f14 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=55e01923ed15f82aaf69393cd6b0d110fd22ba39dcf8207e5c8fb4195a70b2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5f5e31e3d5052cfc8537d909b3a5fcc1ccb0cab5d18d251ebeef84a4b1291e + +handshake=Noise_IXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e878f7607084d4358e3208e796d5ee88ad8308f9923074721451e423633bc5d1e769a44d8f7165f9ea0fd7975979d4fdbeff3a05fc29dddb9a32a6f56f3a181 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e0bb8499ca20b384a845a39c290e882f1265f343e60402d87f7f0a692cef64aed150f315e4e68d26f4660e3466e88ee0495de1450357491205f38deb68cc300 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5d4fce475e4aecd6ab801c48e89b67c13944bfa41cfc1626fafdf6cec81ca3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed29ef74538577291ee8371eaca37b99b83075b1bb24f983424bb7a25c9c86 + +handshake=Noise_IXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459d797d678b29e8942571b69bc6342f0db2a1e4ec05bbfb2463649f5975c40086e1ad80e495a50a4f4542fe96b7616dce2a7cc1f2e96e85edceb2682deb0dac0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466745c5b31c6f91c0cc8c3ae7c831e8bb738ef935be56395d0873b630272c030e86d6c4411d18d8fbcf7778e8d4ca089246f78101a9d83e153aab291dfaca58c94 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d3ac1bd570b82aabc14ba11621d5fd435b751272ebe757406ff922de938d5c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a198c97f2c167512d40ab32fbb13c9e32ae975836561a5829ba67500cbb6da + +handshake=Noise_IX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dafa2f50bec421c6e061a97013b8d9d582911be531e7e463f108e9389c74d589194a720639279eaac9d876aa00c2ece2e8761a2ca307ad49797cd0cea8728f2de0b353ea74d3206276e7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=40c12ccfdf59f44d7cfc8c7dfe8a1bf739107c31aebcfc9f4caee7dc9099c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c3beff2f2144bb23f7fae6fd03578c40f1ef01140d1721a9e895958d52d749 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a91f197ee337c37f7558ccd2074c61fa06784cb2e6325bde19d184ae68e6e2f7c5fbaa3a25628896bcd7c942ae437a7aaf6d3b1fcdb3d8b4b960dfb37a0ba15ad240169da3792d74764f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b13bcef5c9664ec91e1fe0a4cc3e93850404c874f059b5f5b83d938d3f52f3ea6c0faf70b81e4686242650bcbb0c110a9cac6dcfc56cd3154b1e658fe0219a8b54d08d5d6e41d78d2b2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=55e01923ed15f82aaf69393cd6b0d110fd22ba39dcf8207e5c8fb4195a70b2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5f5e31e3d5052cfc8537d909b3a5fcc1ccb0cab5d18d251ebeef84a4b1291e + +handshake=Noise_IXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e878f7607084d4358e3208e796d5ee88ad8308f9923074721451e423633bc5d1e769a44d8f7165f9ea0fd7975979d4fc0e1d27b58cf97cb222256a1edd2ab44b910c8140d4e2b4690e0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e0bb8499ca20b384a845a39c290e882f1265f343e60402d87f7f0a692cef64a66496d0efa8152e6bfe8a2a2f01c2372ffce0d6e6c24e5933f5c8ef7a18d167e99f292e70e7d023e5d58 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5d4fce475e4aecd6ab801c48e89b67c13944bfa41cfc1626fafdf6cec81ca3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed29ef74538577291ee8371eaca37b99b83075b1bb24f983424bb7a25c9c86 + +handshake=Noise_IXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459d797d678b29e8942571b69bc6342f0db2a1e4ec05bbfb2463649f5975c40086e1ad80e495a50a4f4542fe96b7616dc9416d6c2f17c1f823e517767c4777936ee38c25aa7909362a631 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466745c5b31c6f91c0cc8c3ae7c831e8bb738ef935be56395d0873b630272c030e82a6e818375056d17651f621b08a6ca2f3a9706957d7bf986e2612cbb0ea0f3bcf6bc5f2120a9335a4c17 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d3ac1bd570b82aabc14ba11621d5fd435b751272ebe757406ff922de938d5c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a198c97f2c167512d40ab32fbb13c9e32ae975836561a5829ba67500cbb6da + +handshake=Noise_IX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dafa2f50bec421c6e061a97013b8d9d582911be531e7e463f108e9389c74d589086054f914b582ee1157d334cc2285b0040b4468e33e04ac80cb099169d516d8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=40c12ccfdf59f44d7cfc8c7dfe8a1bf739107c31aebcfc9f4caee7dc9099c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c3beff2f2144bb23f7fae6fd03578c40f1ef01140d1721a9e895958d52d749 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a91f197ee337c37f7558ccd2074c61fa06784cb2e6325bde19d184ae68e6e2f7127226d6423aee99c69f7fe7f1519f7bdef89bc28f30e4d31bd0144c659a67f8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b13bcef5c9664ec91e1fe0a4cc3e93850404c874f059b5f5b83d938d3f52f3e3d7958a73d23d96ff791d7a09dd76b4faf040e5aae642241824179c0d8283d12 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=55e01923ed15f82aaf69393cd6b0d110fd22ba39dcf8207e5c8fb4195a70b2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5f5e31e3d5052cfc8537d909b3a5fcc1ccb0cab5d18d251ebeef84a4b1291e + +handshake=Noise_IXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e878f7607084d4358e3208e796d5ee88ad8308f9923074721451e423633bc5d36dc199e0216a43e03de5bf3c64456a06356b5f1cccee247341e7139c92f79c6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e0bb8499ca20b384a845a39c290e882f1265f343e60402d87f7f0a692cef64af697b08e044030d3090eaaed4751659063846cc79067c9c33723a8becb43f6cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5d4fce475e4aecd6ab801c48e89b67c13944bfa41cfc1626fafdf6cec81ca3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed29ef74538577291ee8371eaca37b99b83075b1bb24f983424bb7a25c9c86 + +handshake=Noise_IXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459d797d678b29e8942571b69bc6342f0db2a1e4ec05bbfb2463649f5975c4008bca99e5fe64bd7f59f9c37a10403d8d14b1615d40596696d4e6c3b32a55fbf4b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466745c5b31c6f91c0cc8c3ae7c831e8bb738ef935be56395d0873b630272c030e85aa03f2d4d61e222a2ebdef29b4652d1dbabae33699f4f0aac9ad1000e5d5e58 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d3ac1bd570b82aabc14ba11621d5fd435b751272ebe757406ff922de938d5c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a198c97f2c167512d40ab32fbb13c9e32ae975836561a5829ba67500cbb6da + +handshake=Noise_IX_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dafa2f50bec421c6e061a97013b8d9d582911be531e7e463f108e9389c74d58943c11157db485d61bcaa6d51bcd3251fe8761a2ca307ad49797cecb71b657aee8eec2c351eb5368ef14f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=40c12ccfdf59f44d7cfc8c7dfe8a1bf739107c31aebcfc9f4caee7dc9099c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c3beff2f2144bb23f7fae6fd03578c40f1ef01140d1721a9e895958d52d749 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a91f197ee337c37f7558ccd2074c61fa06784cb2e6325bde19d184ae68e6e2f7127226d6423aee99c69f7fe7f1519f7baf6d3b1fcdb3d8b4b9600be4f2dfc45f94e73292417c3764424e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b13bcef5c9664ec91e1fe0a4cc3e93850404c874f059b5f5b83d938d3f52f3ea278af51752e31746b5e7a8e38fbfb4aa9cac6dcfc56cd3154b18cb5958a8adfbab8090a26084474ccc9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=55e01923ed15f82aaf69393cd6b0d110fd22ba39dcf8207e5c8fb4195a70b2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5f5e31e3d5052cfc8537d909b3a5fcc1ccb0cab5d18d251ebeef84a4b1291e + +handshake=Noise_IXpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e878f7607084d4358e3208e796d5ee88ad8308f9923074721451e423633bc5d36dc199e0216a43e03de5bf3c64456a0c0e1d27b58cf97cb2222ca38d777b3404140852ac27381a72b65 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e0bb8499ca20b384a845a39c290e882f1265f343e60402d87f7f0a692cef64aefb82f6c91194d02d31b7e243b5266deffce0d6e6c24e5933f5c1055c6cd239df4ac4a2b751ac57172a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5d4fce475e4aecd6ab801c48e89b67c13944bfa41cfc1626fafdf6cec81ca3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed29ef74538577291ee8371eaca37b99b83075b1bb24f983424bb7a25c9c86 + +handshake=Noise_IXpsk2_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459d797d678b29e8942571b69bc6342f0db2a1e4ec05bbfb2463649f5975c4008bca99e5fe64bd7f59f9c37a10403d8d19416d6c2f17c1f823e51ea085f223d835b5cdb3dbbc997748dd0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466745c5b31c6f91c0cc8c3ae7c831e8bb738ef935be56395d0873b630272c030e8112d7dfed0b36fbd90f66a4865905ff13a9706957d7bf986e2615ddc0e1023ec5831d8b1c3a6bca38ee6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d3ac1bd570b82aabc14ba11621d5fd435b751272ebe757406ff922de938d5c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a198c97f2c167512d40ab32fbb13c9e32ae975836561a5829ba67500cbb6da + +handshake=Noise_N_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471bcc2ec91fac5d2551b8a08e39ae5ab +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=374a734846ea8b76251255d17bae5b5313087ff42afa23ed42a5b5bf325804 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=922037b8012e37d18adb6827375085f06f034888ea3f625dfc91d424334290 + +handshake=Noise_Npsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254340a10ebcc2642dfbcf5af7f2bf975a9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e20e59bdd4cb2aa25691345a5b462b2cf85084b15643091c4fc173f16dc5d7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=68c7d8986c79c6f8b4589765ef1cc903024c6e8759bf05776335d9e065abe7 + +handshake=Noise_Npsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bd29db2d71093718be3c9068ae19b028 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=3caf03e7b531dd629d062fa119ea14d08939bf79327005f276b9a99c5400f0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4638116fe8341f36f69c2e646687fd4f6b5b5f10dec581a9ca8202f016f8f8 + +handshake=Noise_N_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df115f83f13b64589fecddf876dd30eb9ba694948e5169479513 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=374a734846ea8b76251255d17bae5b5313087ff42afa23ed42a5b5bf325804 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=922037b8012e37d18adb6827375085f06f034888ea3f625dfc91d424334290 + +handshake=Noise_Npsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406dd68c4f13f48b25468230d7cef980524e27eaabc8ba348da29 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e20e59bdd4cb2aa25691345a5b462b2cf85084b15643091c4fc173f16dc5d7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=68c7d8986c79c6f8b4589765ef1cc903024c6e8759bf05776335d9e065abe7 + +handshake=Noise_Npsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c13a66d1ae511893d991fdd6649d5aa540467596b854ff69e59e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=3caf03e7b531dd629d062fa119ea14d08939bf79327005f276b9a99c5400f0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4638116fe8341f36f69c2e646687fd4f6b5b5f10dec581a9ca8202f016f8f8 + +handshake=Noise_N_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ceb26e62698f0a9d16577f5fcb929fb3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=374a734846ea8b76251255d17bae5b5313087ff42afa23ed42a5b5bf325804 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=922037b8012e37d18adb6827375085f06f034888ea3f625dfc91d424334290 + +handshake=Noise_Npsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c84f374576798a9ac7c4e4f3d6fb1660 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e20e59bdd4cb2aa25691345a5b462b2cf85084b15643091c4fc173f16dc5d7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=68c7d8986c79c6f8b4589765ef1cc903024c6e8759bf05776335d9e065abe7 + +handshake=Noise_Npsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b20f16a10cf8aec5558e9615c798606 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=3caf03e7b531dd629d062fa119ea14d08939bf79327005f276b9a99c5400f0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4638116fe8341f36f69c2e646687fd4f6b5b5f10dec581a9ca8202f016f8f8 + +handshake=Noise_N_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df115f83f13b64589fec852ae179184185e9d29fed35f4d235dc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=374a734846ea8b76251255d17bae5b5313087ff42afa23ed42a5b5bf325804 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=922037b8012e37d18adb6827375085f06f034888ea3f625dfc91d424334290 + +handshake=Noise_Npsk0_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406dd68c4f13f48b25468727d65e4f2c438542b1a8181a53dcc73 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e20e59bdd4cb2aa25691345a5b462b2cf85084b15643091c4fc173f16dc5d7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=68c7d8986c79c6f8b4589765ef1cc903024c6e8759bf05776335d9e065abe7 + +handshake=Noise_Npsk1_25519_AESGCM_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c13a66d1ae511893d9916e916af9cabdd72bf1d4e58c91685c96 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=3caf03e7b531dd629d062fa119ea14d08939bf79327005f276b9a99c5400f0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4638116fe8341f36f69c2e646687fd4f6b5b5f10dec581a9ca8202f016f8f8 + +handshake=Noise_K_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cc4041bbf40e26aea2c61f36b29dfda1 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=aca1ae00ed718c11ae8f91c3c289db54dca4fba284098248984158f4afb15a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=334cde4d2b9e7189be333e05c4e8ca8cbe9a7e9e3170dc61abf51906f95f9b + +handshake=Noise_Kpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6463591c0d8b8fd209cf3c80579bfed +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7736979bc1fc8d5c7d42c92ea41ee59e97d59faafe791a2e3d58c8e8fb9929 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03236fadebc8f6a18ecb878d1ac2b78a3cf0e0024d0fb5d8b9d105ea194980 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254443d03b8955d57e4fcbdf961645c0db9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1429bc785fdc4adc51006b72f574c963bc97309e22feb0b54f8b944292af3b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c74d5a471091962d858c65542df842172e2e95a85bfe0eea2c6be86c8bfd89 + +handshake=Noise_K_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428f2b400a063dbdce02b182da650e11fdf8ee63bffbdb9263e2d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=aca1ae00ed718c11ae8f91c3c289db54dca4fba284098248984158f4afb15a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=334cde4d2b9e7189be333e05c4e8ca8cbe9a7e9e3170dc61abf51906f95f9b + +handshake=Noise_Kpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c2b61d59cbbc7e45c9743b816be7edfacba1a21c0b4ea6499687 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7736979bc1fc8d5c7d42c92ea41ee59e97d59faafe791a2e3d58c8e8fb9929 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03236fadebc8f6a18ecb878d1ac2b78a3cf0e0024d0fb5d8b9d105ea194980 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b08ff5e93b809df01a6974598eabce902b5dca3bef8fdd0ae9f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1429bc785fdc4adc51006b72f574c963bc97309e22feb0b54f8b944292af3b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c74d5a471091962d858c65542df842172e2e95a85bfe0eea2c6be86c8bfd89 + +handshake=Noise_K_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545452dfe8670e01ec6c7ddf716617ac9e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=aca1ae00ed718c11ae8f91c3c289db54dca4fba284098248984158f4afb15a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=334cde4d2b9e7189be333e05c4e8ca8cbe9a7e9e3170dc61abf51906f95f9b + +handshake=Noise_Kpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254091a3df37d8ffa0d9c758bac64d545e2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7736979bc1fc8d5c7d42c92ea41ee59e97d59faafe791a2e3d58c8e8fb9929 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03236fadebc8f6a18ecb878d1ac2b78a3cf0e0024d0fb5d8b9d105ea194980 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467fbf473495da6b5e23acf5bb6fe9b22 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1429bc785fdc4adc51006b72f574c963bc97309e22feb0b54f8b944292af3b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c74d5a471091962d858c65542df842172e2e95a85bfe0eea2c6be86c8bfd89 + +handshake=Noise_K_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428f2b400a063dbdce02b5c28836b6e5fda2325068eb862efefce +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=aca1ae00ed718c11ae8f91c3c289db54dca4fba284098248984158f4afb15a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=334cde4d2b9e7189be333e05c4e8ca8cbe9a7e9e3170dc61abf51906f95f9b + +handshake=Noise_Kpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c2b61d59cbbc7e45c974869c028f5d84ed2aef938dd851ef00bd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7736979bc1fc8d5c7d42c92ea41ee59e97d59faafe791a2e3d58c8e8fb9929 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03236fadebc8f6a18ecb878d1ac2b78a3cf0e0024d0fb5d8b9d105ea194980 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b08ff5e93b809df01a6287cee688e3c750260ad541a39378ee2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1429bc785fdc4adc51006b72f574c963bc97309e22feb0b54f8b944292af3b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c74d5a471091962d858c65542df842172e2e95a85bfe0eea2c6be86c8bfd89 + +handshake=Noise_X_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625427b9e233a46e236bc3b949c842a23bd75b3d6d717dbf3aa4a3cfaa59a42e6a50f3540c9b1fdc8ca68fb6b8f9081e9b28194a52a70998dd4ec3fc2088ad06f966 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=601398a290497a3ecf22851d05f53b34fa1fc4a47a0371df1f5c540a1ecf61 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=04edfc327b91e91bb67f5a069e5afbf154ebcf196baf843dce5d22f58f04e7 + +handshake=Noise_Xpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254806e8e97beb9d15190981ce5f4080aeb28c7e1c743a3d676a62c14f688c70a7c7ea2fe760f1224179cc5e79e1e6510512dda2314f768816ac53546834a0e3615 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d3fabb12ea23bcec3493f543912515d7ad5ed8e58e9a9998ae5044d2f27c32 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5b47a6a68e47e6c22c90a55fb3bff11a8a0bbb84813887d2d7ba0e96dfd36c + +handshake=Noise_Xpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546fa09d3ca0fdbbc71df8bb16ff941b7488f0c070e770859b7026d4058df16697a5eb1d97cf498e8a907dd916557c3564006c7097ab7bb6106508c504c44b9cbc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=48b987b047342448756adb8c63d3e45f96b4be90f221b0406ab00e95f7219c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=451d0097fdecb5f4a7e61ef341bdb66a8bbdaf5b1a650d05e7b0f5e29f26ac + +handshake=Noise_X_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625427b9e233a46e236bc3b949c842a23bd75b3d6d717dbf3aa4a3cfaa59a42e6a50f3540c9b1fdc8ca68fb6b8f9081e9b28ea4c05b652dbf8aff85830c628e63acd02c85425c685c650b07e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=601398a290497a3ecf22851d05f53b34fa1fc4a47a0371df1f5c540a1ecf61 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=04edfc327b91e91bb67f5a069e5afbf154ebcf196baf843dce5d22f58f04e7 + +handshake=Noise_Xpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254806e8e97beb9d15190981ce5f4080aeb28c7e1c743a3d676a62c14f688c70a7c7ea2fe760f1224179cc5e79e1e651051ab45b08deb5664fd49b358927839000e24fd90d598c3c57ee99d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d3fabb12ea23bcec3493f543912515d7ad5ed8e58e9a9998ae5044d2f27c32 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5b47a6a68e47e6c22c90a55fb3bff11a8a0bbb84813887d2d7ba0e96dfd36c + +handshake=Noise_Xpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546fa09d3ca0fdbbc71df8bb16ff941b7488f0c070e770859b7026d4058df16697a5eb1d97cf498e8a907dd916557c3564f54ded2eef286aa4c8f398f33f44b433c3e830e471f72ed3db02 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=48b987b047342448756adb8c63d3e45f96b4be90f221b0406ab00e95f7219c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=451d0097fdecb5f4a7e61ef341bdb66a8bbdaf5b1a650d05e7b0f5e29f26ac + +handshake=Noise_X_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625427b9e233a46e236bc3b949c842a23bd75b3d6d717dbf3aa4a3cfaa59a42e6a50e9a53f4b77ba9c212a5ca41f911c099159e23701989c18e59ba9ffc746d06b61 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=601398a290497a3ecf22851d05f53b34fa1fc4a47a0371df1f5c540a1ecf61 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=04edfc327b91e91bb67f5a069e5afbf154ebcf196baf843dce5d22f58f04e7 + +handshake=Noise_Xpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254806e8e97beb9d15190981ce5f4080aeb28c7e1c743a3d676a62c14f688c70a7c70240353a0960993446dad6546c6a59e0df5ae06d7bc29f93ccdcc03a66ed9e5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d3fabb12ea23bcec3493f543912515d7ad5ed8e58e9a9998ae5044d2f27c32 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5b47a6a68e47e6c22c90a55fb3bff11a8a0bbb84813887d2d7ba0e96dfd36c + +handshake=Noise_Xpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546fa09d3ca0fdbbc71df8bb16ff941b7488f0c070e770859b7026d4058df16697a6910630c6924a577f719acb8ee3181ca49a434aad229419e4f52a88ba17496e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=48b987b047342448756adb8c63d3e45f96b4be90f221b0406ab00e95f7219c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=451d0097fdecb5f4a7e61ef341bdb66a8bbdaf5b1a650d05e7b0f5e29f26ac + +handshake=Noise_X_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625427b9e233a46e236bc3b949c842a23bd75b3d6d717dbf3aa4a3cfaa59a42e6a50e9a53f4b77ba9c212a5ca41f911c0991ea4c05b652dbf8aff858319c0516c6e9079711b89e419c5825b1 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=601398a290497a3ecf22851d05f53b34fa1fc4a47a0371df1f5c540a1ecf61 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=04edfc327b91e91bb67f5a069e5afbf154ebcf196baf843dce5d22f58f04e7 + +handshake=Noise_Xpsk0_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254806e8e97beb9d15190981ce5f4080aeb28c7e1c743a3d676a62c14f688c70a7c70240353a0960993446dad6546c6a59eab45b08deb5664fd49b37733e0f59b46f6a5688e03dc408d5133 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d3fabb12ea23bcec3493f543912515d7ad5ed8e58e9a9998ae5044d2f27c32 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5b47a6a68e47e6c22c90a55fb3bff11a8a0bbb84813887d2d7ba0e96dfd36c + +handshake=Noise_Xpsk1_25519_AESGCM_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546fa09d3ca0fdbbc71df8bb16ff941b7488f0c070e770859b7026d4058df16697a6910630c6924a577f719acb8ee3181cf54ded2eef286aa4c8f37ef95f1e47c89dc3f7afa0b2effc7d5a +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=48b987b047342448756adb8c63d3e45f96b4be90f221b0406ab00e95f7219c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=451d0097fdecb5f4a7e61ef341bdb66a8bbdaf5b1a650d05e7b0f5e29f26ac + +handshake=Noise_NN_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466546c757b1dee39fe34639f8e59d36b90 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9a465eef7a497d636aacec6f177a46820045154c6dc21cc887158ff7178f5f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a889eab9dcbdd768c92201eb7092fb3e9e2d1c87321fe70f6bd261b21a9aa1 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544ee81f7b223bb25827a6c6c707001dd3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0e7e624ccf4642b46e401e8b574cfa1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2c2a25a39ec72b321405393e10c51caec56f8da5af863eb3d5875cbc99afe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=31d8991d2ddb026d6ea7e4a1b1bf6388d87fa21d793547514f645d4724523a + +handshake=Noise_NNpsk1_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e4ed6d14e51cbd37289127ac1c818458 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846604d0bbf97d4b0d35616ddd8e3293e340 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=293dbf6b4293997b1f3609daa237dcf09ec2a79911ef69d311075b231f83cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89ef11a27e48c5d96b7d4562a8ef782ede9b361e0efe9faacc97c90d361058 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da9fb0ab9e465a7ae90061d62fc67048 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa2036b0d82fc4c002454692a98cf138 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5375de65fffa56df1d6e3e66a913430fe313c3418fdeda2e43afb34efd29c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=979f3f045a786f9677281e84a4a5df198ec6a826f5969acc228ab6d1cda049 + +handshake=Noise_NN_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466295bdf92326b33d62ca816fc6e8d84b579611812fea2df8204c8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9a465eef7a497d636aacec6f177a46820045154c6dc21cc887158ff7178f5f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a889eab9dcbdd768c92201eb7092fb3e9e2d1c87321fe70f6bd261b21a9aa1 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437af6d133d63144ae694f990d6e209b9fc4b7cd0f5ca1307e06b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466823c7e1e048fa3767e86e0d471622865d0683936feec93cb113c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2c2a25a39ec72b321405393e10c51caec56f8da5af863eb3d5875cbc99afe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=31d8991d2ddb026d6ea7e4a1b1bf6388d87fa21d793547514f645d4724523a + +handshake=Noise_NNpsk1_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4d6af33ed485a97c7b78e7d1348afa4323f56148bcd00e812d4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664410c5cc3bcf499527e4b6a7df87d8b5007c28b75228d5a62a41 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=293dbf6b4293997b1f3609daa237dcf09ec2a79911ef69d311075b231f83cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89ef11a27e48c5d96b7d4562a8ef782ede9b361e0efe9faacc97c90d361058 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e1214c67afb95f49d730eb2108ee24b3d646e4aff196aafde03 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646e5b3a50b77fce5d9d013a0cc1d6bb43389bd89bfae89fdffc6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5375de65fffa56df1d6e3e66a913430fe313c3418fdeda2e43afb34efd29c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=979f3f045a786f9677281e84a4a5df198ec6a826f5969acc228ab6d1cda049 + +handshake=Noise_NN_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf2b3d8441501153c7ad77fff102d4ad +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9a465eef7a497d636aacec6f177a46820045154c6dc21cc887158ff7178f5f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a889eab9dcbdd768c92201eb7092fb3e9e2d1c87321fe70f6bd261b21a9aa1 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e1f68ba6e11a996f2eaf8e6cb3b13ffa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662175601186f38e8e4a7912983c06a531 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2c2a25a39ec72b321405393e10c51caec56f8da5af863eb3d5875cbc99afe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=31d8991d2ddb026d6ea7e4a1b1bf6388d87fa21d793547514f645d4724523a + +handshake=Noise_NNpsk1_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400265a786349e17fbf3e17b4741a0f71 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad5a7a0e7c3373008afa12e20e32f4bc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=293dbf6b4293997b1f3609daa237dcf09ec2a79911ef69d311075b231f83cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89ef11a27e48c5d96b7d4562a8ef782ede9b361e0efe9faacc97c90d361058 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d8253a4f31ebf4711fa4bad845bf9d0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ec4107be3f3458a3c348dfda74cb2480 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5375de65fffa56df1d6e3e66a913430fe313c3418fdeda2e43afb34efd29c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=979f3f045a786f9677281e84a4a5df198ec6a826f5969acc228ab6d1cda049 + +handshake=Noise_NN_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466295bdf92326b33d62ca8984f94b14878d51ba9ce00d1d3ff8a2d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9a465eef7a497d636aacec6f177a46820045154c6dc21cc887158ff7178f5f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a889eab9dcbdd768c92201eb7092fb3e9e2d1c87321fe70f6bd261b21a9aa1 + +handshake=Noise_NNpsk0_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437af6d133d63144ae6948b6affd3e6efdabe0650147eedb0be22 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466823c7e1e048fa3767e86d07cedbf0af0e30b9bf2390a8a6891c5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2c2a25a39ec72b321405393e10c51caec56f8da5af863eb3d5875cbc99afe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=31d8991d2ddb026d6ea7e4a1b1bf6388d87fa21d793547514f645d4724523a + +handshake=Noise_NNpsk1_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4d6af33ed485a97c7b76404c4af6bd734344a8deb859a576eb0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664410c5cc3bcf499527e474b5995606d95c03e01d927792b13f20 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=293dbf6b4293997b1f3609daa237dcf09ec2a79911ef69d311075b231f83cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89ef11a27e48c5d96b7d4562a8ef782ede9b361e0efe9faacc97c90d361058 + +handshake=Noise_NNpsk2_25519_AESGCM_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e1214c67afb95f49d731e6796c13bf0aff823ea8ff9d0a0c167 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646e5b3a50b77fce5d9d054b5a59fddb6f6f965ad8a102b98c3e7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5375de65fffa56df1d6e3e66a913430fe313c3418fdeda2e43afb34efd29c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=979f3f045a786f9677281e84a4a5df198ec6a826f5969acc228ab6d1cda049 + +handshake=Noise_KN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f72c1a277693fd38269f8a99291c5da2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f85b724b0d10b19b9f18ba74dc10bc28c187a1505e32a1b7ddb76fc381c60 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b27b15d8102e55eb6b5e7c02d5c1309289aa197b383424bb8d70268d1270f + +handshake=Noise_KNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544b68b11ecf5211c5fda412733efd29ca +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663cbd6e15bfac1b01f644ac427edfc442 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c41244c39a4dc4bbd816e4383b36aeb29b39b1a4cd3375c8ee7db0f744b131 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbcc5c8eedfe981223357f4d43f13be03b9c6ee905ad052bb319a97d31e22c + +handshake=Noise_KNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ed5eac382bc8e0e9fd781c2da8b87220 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466176a5de05f62ccb244d937a1aa4740e4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=90abc79cc783c1390801576ba8ef427a7cc56945b010efdd7b649ad1dbf654 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a414c63f43213f517dbe5b9ca2fe9013e406135d0b085f6718825d67d1b829 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0bb61207231b261590226d6bd0ae06f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c2392623d2b637e821625b49207eeb58 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aaaeaecd7573c689b8d4ccbc5770cb22d0af475f726df807fc07e57aca7fe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1ee45b0cdba6411256525be9e7e44e1042d2c5402d080fdd0de28944e38b2a + +handshake=Noise_KN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d680843f299d5b026581d284e8e375b8d3fb53a0e005ce9714f7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f85b724b0d10b19b9f18ba74dc10bc28c187a1505e32a1b7ddb76fc381c60 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b27b15d8102e55eb6b5e7c02d5c1309289aa197b383424bb8d70268d1270f + +handshake=Noise_KNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c078e4e4c58ada7cb779610e8a2238b1012f7082cb66c772cfc9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ab8d646d386089d58257871d3f64ce46e5a812c674583d1ccdf4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c41244c39a4dc4bbd816e4383b36aeb29b39b1a4cd3375c8ee7db0f744b131 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbcc5c8eedfe981223357f4d43f13be03b9c6ee905ad052bb319a97d31e22c + +handshake=Noise_KNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254484735eb56d9c231711a4a49f1b0e91368939fe01abaafeda157 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466955eb77ae3722bb9b8c14c019d2261382b06c17e895bfe86f3dc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=90abc79cc783c1390801576ba8ef427a7cc56945b010efdd7b649ad1dbf654 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a414c63f43213f517dbe5b9ca2fe9013e406135d0b085f6718825d67d1b829 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254222c68cd4874356be9500e89b00ff544ace940b5729f086c3219 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f47863d9cb0059460bd645d3cf5c91821534a353e6358b048322 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aaaeaecd7573c689b8d4ccbc5770cb22d0af475f726df807fc07e57aca7fe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1ee45b0cdba6411256525be9e7e44e1042d2c5402d080fdd0de28944e38b2a + +handshake=Noise_KN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466edfd9f5e801b157d7af36200f0962b2a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f85b724b0d10b19b9f18ba74dc10bc28c187a1505e32a1b7ddb76fc381c60 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b27b15d8102e55eb6b5e7c02d5c1309289aa197b383424bb8d70268d1270f + +handshake=Noise_KNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254017d026ae69e905da4fa3527befbe8a1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c903feabcdd078005d691951aa948363 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c41244c39a4dc4bbd816e4383b36aeb29b39b1a4cd3375c8ee7db0f744b131 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbcc5c8eedfe981223357f4d43f13be03b9c6ee905ad052bb319a97d31e22c + +handshake=Noise_KNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d1ff777c50a19ec441934658f96590fb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846654b54d2e6cdea2573e3a4b7e84607e8f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=90abc79cc783c1390801576ba8ef427a7cc56945b010efdd7b649ad1dbf654 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a414c63f43213f517dbe5b9ca2fe9013e406135d0b085f6718825d67d1b829 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d845f0d6e394c2c4577a7543e7e781c4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665445832471db03c2530f8279f43e913b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aaaeaecd7573c689b8d4ccbc5770cb22d0af475f726df807fc07e57aca7fe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1ee45b0cdba6411256525be9e7e44e1042d2c5402d080fdd0de28944e38b2a + +handshake=Noise_KN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d680843f299d5b0265815e4064f0df3ea5eeef9535edc1a29e1b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f85b724b0d10b19b9f18ba74dc10bc28c187a1505e32a1b7ddb76fc381c60 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b27b15d8102e55eb6b5e7c02d5c1309289aa197b383424bb8d70268d1270f + +handshake=Noise_KNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c078e4e4c58ada7cb779bd109ef1e5c961b7ffb99ec6d65744b0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ab8d646d386089d5825772141b5d91cba7a101d5ce077f7eec01 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c41244c39a4dc4bbd816e4383b36aeb29b39b1a4cd3375c8ee7db0f744b131 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbcc5c8eedfe981223357f4d43f13be03b9c6ee905ad052bb319a97d31e22c + +handshake=Noise_KNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254484735eb56d9c231711a830caaff9108765bb21ac3cfc49d99eb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466955eb77ae3722bb9b8c17991fc2b411ec54030c87e11b2f67cf1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=90abc79cc783c1390801576ba8ef427a7cc56945b010efdd7b649ad1dbf654 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a414c63f43213f517dbe5b9ca2fe9013e406135d0b085f6718825d67d1b829 + +handshake=Noise_KNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254222c68cd4874356be9509397dc032d89ade799a5a2591d9a6b32 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f47863d9cb0059460bd69e5cf4f459a34ce682b7e725dbbedae3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aaaeaecd7573c689b8d4ccbc5770cb22d0af475f726df807fc07e57aca7fe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1ee45b0cdba6411256525be9e7e44e1042d2c5402d080fdd0de28944e38b2a + +handshake=Noise_NK_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f4de59ddee9ea99d5e8aa53446f9bac9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846600c26d78fb1fda00ee777962da982403 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c3b3e1a1b22cdec195cb8c43f3d694269cd55421d0895cca7696e8c298c1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=13d838829d7fb57425535f1586944638fc6bbf339797c76dca3220ef1ac3c6 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442eba9e36fd2c74a614ad95028e3f5a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c4add52345e59d58759ba764f67ed9bc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=977b3bc4c37ed85bb2f14db182740fe80d5f46a53fdc0a94ab5c45c457524e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c2b02468bfcafd95de5eb7f367545a23c4569540a3ad7c8f586f9df3906ca + +handshake=Noise_NKpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545bea413ae247b1489d5d76dc47a98732 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680c1ccc3ceb11995d9a9c688519e916c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dafa613d0ecf78ca534bf648499e98d5d3b22807a64149f12b45f27b397b16 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=917876a5cd379ec833d3b8e3bae24aaba92e63c316d40872b543fb60f9ad16 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c4be6444813fede19be6aef74e85031c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846607ef2728f791c670472e5a41e1e6b31f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eaf9eace39e81e51a53ae9eabd917d2605ce13bdcf089338a62b554225f230 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d0c1580eea13c076581792052cc5ea1617c4093fd54657130b273ccb55f1b9 + +handshake=Noise_NK_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254479d6d76c8b559feebf4a71f42ce483ff0cf117f668906babd12 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846621612afe71fb7bc67dafcd0d83506c6becdad3daac83d5b90b24 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c3b3e1a1b22cdec195cb8c43f3d694269cd55421d0895cca7696e8c298c1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=13d838829d7fb57425535f1586944638fc6bbf339797c76dca3220ef1ac3c6 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625410bac85a9bf99c7fdd478913e038b7ccc97518c9cad9e1533646 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e2cc032cc4ae7da4eda9f47aa7c37ad99015588c190bac9a8387 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=977b3bc4c37ed85bb2f14db182740fe80d5f46a53fdc0a94ab5c45c457524e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c2b02468bfcafd95de5eb7f367545a23c4569540a3ad7c8f586f9df3906ca + +handshake=Noise_NKpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482751e4f02de3f742d89f17b30414fb1151dd7eb34dba83103cf +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664376773ce777a22ce76c89b02c0c992849ecf119f5ecddb511c6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dafa613d0ecf78ca534bf648499e98d5d3b22807a64149f12b45f27b397b16 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=917876a5cd379ec833d3b8e3bae24aaba92e63c316d40872b543fb60f9ad16 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542d0dcc1bd68cfc5ae3bd0b87c08f23c69ce1b3cccd83f5204db1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df4695624544314012baea976075677efc6eb4417112883ebd7c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eaf9eace39e81e51a53ae9eabd917d2605ce13bdcf089338a62b554225f230 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d0c1580eea13c076581792052cc5ea1617c4093fd54657130b273ccb55f1b9 + +handshake=Noise_NK_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bccd4635d2891ae46fa388fcb277b5bb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668479b6648e2a13c0900168a46748457f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c3b3e1a1b22cdec195cb8c43f3d694269cd55421d0895cca7696e8c298c1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=13d838829d7fb57425535f1586944638fc6bbf339797c76dca3220ef1ac3c6 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625446261dfdaaf4ca0a1e51254bbf6b3a71 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1fae0771c98fdec558518fc919cbd4f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=977b3bc4c37ed85bb2f14db182740fe80d5f46a53fdc0a94ab5c45c457524e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c2b02468bfcafd95de5eb7f367545a23c4569540a3ad7c8f586f9df3906ca + +handshake=Noise_NKpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ac3a9c9d8550f06f3de2b891e96395cb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bf809f989b8fbf9c10f6d31438caa613 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dafa613d0ecf78ca534bf648499e98d5d3b22807a64149f12b45f27b397b16 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=917876a5cd379ec833d3b8e3bae24aaba92e63c316d40872b543fb60f9ad16 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9b01234febc4f0392461ae38c5ee4a8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661ff269ec62bf942fe8d6c85a773b1d2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eaf9eace39e81e51a53ae9eabd917d2605ce13bdcf089338a62b554225f230 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d0c1580eea13c076581792052cc5ea1617c4093fd54657130b273ccb55f1b9 + +handshake=Noise_NK_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254479d6d76c8b559feebf467ad4b7003f368eb3929dca92e160bad +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846621612afe71fb7bc67daf8931a9010b74ab201a6ab9a6224cc78d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c3b3e1a1b22cdec195cb8c43f3d694269cd55421d0895cca7696e8c298c1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=13d838829d7fb57425535f1586944638fc6bbf339797c76dca3220ef1ac3c6 + +handshake=Noise_NKpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625410bac85a9bf99c7fdd476360ac387c559fc40fa57bc0de8f2b03 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e2cc032cc4ae7da4eda923f9aad27b1e981be207dc57be28e47c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=977b3bc4c37ed85bb2f14db182740fe80d5f46a53fdc0a94ab5c45c457524e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c2b02468bfcafd95de5eb7f367545a23c4569540a3ad7c8f586f9df3906ca + +handshake=Noise_NKpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482751e4f02de3f742d89bba6ef6aea9975aae58faccbb8541cf7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664376773ce777a22ce76c25463e4d298635ca65941beae4337859 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dafa613d0ecf78ca534bf648499e98d5d3b22807a64149f12b45f27b397b16 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=917876a5cd379ec833d3b8e3bae24aaba92e63c316d40872b543fb60f9ad16 + +handshake=Noise_NKpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542d0dcc1bd68cfc5ae3bd27ac7960aa606e9dec412a6c64323ea2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df4695624544314012ba66257a4a39bb5b6289e32409329b7bda +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eaf9eace39e81e51a53ae9eabd917d2605ce13bdcf089338a62b554225f230 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d0c1580eea13c076581792052cc5ea1617c4093fd54657130b273ccb55f1b9 + +handshake=Noise_KK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cbe8f77ad210ff754922c56591edaf17 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b9198d85a19fe670094c3f65b567f3b5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6b689fca5f9af8029b40d692f66dab834d9b1ad71ef02e12f0ec068a93ba55 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=126650ec27e76d0de04fc556ef662a4a0cd619b62daacd5110dc43bfe1c1ba + +handshake=Noise_KKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cfc494240128ca1a452dedf604a4aa1c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e88e00d5fc2996457fd334c4f011f7cc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d15b43ffc8c33b514f6b1d1cb5a9baac7bb9e8ab7fa60db501342d4369c737 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6bd6bdae40d6880a9cf6572e48db7cde278aa1dedd855791167a093d62b2dc + +handshake=Noise_KKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437534665c31a179f15fb392f7617e6b4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651a78581524074d4053423c2a7380160 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5ee8fab16de07e20d98cd7a3cfcd72d229520670746f1fcaaa1127c729994d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ee6791cd8c9a12ecd260c7efcf6d0b094f05828949743f7f1da36d2fead3bd + +handshake=Noise_KKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625493708ed5d90a001924c0e673e87cb122 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669f5abbd68865b250dfbf71912d44074b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0304f4a07a39789848204b1ac1fe2004f035cbb474b1e3f4f11b6f09aaff19 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=14bb951739a8ed231acc6348dcbe342ea124dd4d53a4a463ef415ebd15cb0d + +handshake=Noise_KK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254983397660911ddae03feba9474c170c3f303fd4d39625083903a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466beeba4b2e28bbb5d84eea1eb61d690d124b95b3c9f26a166fb5f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6b689fca5f9af8029b40d692f66dab834d9b1ad71ef02e12f0ec068a93ba55 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=126650ec27e76d0de04fc556ef662a4a0cd619b62daacd5110dc43bfe1c1ba + +handshake=Noise_KKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625432687ae9f41a125bbb260be5b0199fb6934a0986470429e21cc4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466678c53d1c8fb7d77e1c7ad887a31a56e2c7281c1bcb3bd549a7d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d15b43ffc8c33b514f6b1d1cb5a9baac7bb9e8ab7fa60db501342d4369c737 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6bd6bdae40d6880a9cf6572e48db7cde278aa1dedd855791167a093d62b2dc + +handshake=Noise_KKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b75e1a1de629bd7bac048614be9ce38bd0c0f0100160ff1dcd5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664bf2a2da8c86239618ed75c5a3a80f84f18e853c86a6c6137b98 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5ee8fab16de07e20d98cd7a3cfcd72d229520670746f1fcaaa1127c729994d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ee6791cd8c9a12ecd260c7efcf6d0b094f05828949743f7f1da36d2fead3bd + +handshake=Noise_KKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254797f85753395023883c29179f22e141c07c0d0940712f6c0224f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663fc5041accf40fbcf106a268de93fd43bd8ce67eec5bec522977 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0304f4a07a39789848204b1ac1fe2004f035cbb474b1e3f4f11b6f09aaff19 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=14bb951739a8ed231acc6348dcbe342ea124dd4d53a4a463ef415ebd15cb0d + +handshake=Noise_KK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481294976bf2915b8d25846e070a8faf3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846683c72d35f421d61ea833ffb5a5ececc1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6b689fca5f9af8029b40d692f66dab834d9b1ad71ef02e12f0ec068a93ba55 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=126650ec27e76d0de04fc556ef662a4a0cd619b62daacd5110dc43bfe1c1ba + +handshake=Noise_KKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545511775bf252b7b7798b5aa47a6d2bf4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6927b5da0967848b5cca6d9441ea950 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d15b43ffc8c33b514f6b1d1cb5a9baac7bb9e8ab7fa60db501342d4369c737 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6bd6bdae40d6880a9cf6572e48db7cde278aa1dedd855791167a093d62b2dc + +handshake=Noise_KKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254782f9ea5e938f3a83cd596e21dc38f26 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466108c204a27ee44abec42ab2e2155c7f1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5ee8fab16de07e20d98cd7a3cfcd72d229520670746f1fcaaa1127c729994d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ee6791cd8c9a12ecd260c7efcf6d0b094f05828949743f7f1da36d2fead3bd + +handshake=Noise_KKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546cfe8fea278b52605acdaed61a076cff +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aea6d52c5f57bdb87846f3b20633e01 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0304f4a07a39789848204b1ac1fe2004f035cbb474b1e3f4f11b6f09aaff19 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=14bb951739a8ed231acc6348dcbe342ea124dd4d53a4a463ef415ebd15cb0d + +handshake=Noise_KK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254983397660911ddae03fe246b376afbd5d094b0fa701a84bdcd3e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466beeba4b2e28bbb5d84ee8142c6b37c508edf518dbad16a09b062 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6b689fca5f9af8029b40d692f66dab834d9b1ad71ef02e12f0ec068a93ba55 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=126650ec27e76d0de04fc556ef662a4a0cd619b62daacd5110dc43bfe1c1ba + +handshake=Noise_KKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625432687ae9f41a125bbb266304cfeeda44b8ac9eb1338ef6f186a7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466678c53d1c8fb7d77e1c79d4704436e55e97648d81807db8a43ba +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d15b43ffc8c33b514f6b1d1cb5a9baac7bb9e8ab7fa60db501342d4369c737 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6bd6bdae40d6880a9cf6572e48db7cde278aa1dedd855791167a093d62b2dc + +handshake=Noise_KKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b75e1a1de629bd7bac046d9df733cd3c96d735b2b5338c09281 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664bf2a2da8c86239618ed437962b82a34484359e590b7252d01b7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5ee8fab16de07e20d98cd7a3cfcd72d229520670746f1fcaaa1127c729994d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ee6791cd8c9a12ecd260c7efcf6d0b094f05828949743f7f1da36d2fead3bd + +handshake=Noise_KKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254797f85753395023883c2c7495a1b13f1976fa9ebbf898a1054d0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663fc5041accf40fbcf106a311f7eaa3ab0eb5bef5f28fa9ef0055 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0304f4a07a39789848204b1ac1fe2004f035cbb474b1e3f4f11b6f09aaff19 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=14bb951739a8ed231acc6348dcbe342ea124dd4d53a4a463ef415ebd15cb0d + +handshake=Noise_NX_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac104e4413b3e6091ab98f8902f898f750341010fc28130905edcfa84df5b5ff78b8851e94c6c17bd270a7a37e6708c2d69210ebf8c5da2c7babd825d14ba61a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=50f23b250835f62aeee57429ea276cce9ce465b1fa5bd01cb8041bc9ae7722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=681c16d92b2ed840ea2096ee1445c6d699f71659c0aa98c115fd2be24a4e6a + +handshake=Noise_NXpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254128719fddfb85978a91462e8016a3b7c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c4fbd20d2daae06cfee3a4044de5f045844d2d23c127c77abb5006a1727e9b0d65cf665ef2c2cf4b9b6abc1b2eb38c3795451e327b76fb59eb66315301bc415 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8a9c8176161c87470eb1bbe4a5ffe8bd08cc293b80f57f244c10ddbbe368d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=38d5a75a6dd18e71d5f6555c7edeac938ed79a312ac10077fd8fc8d82ad81b + +handshake=Noise_NXpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f68a3d756a50740b15842b4246d40c9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d6f6e3ddf23875e0592cb924daf3d8126d3008e0d245a8ced1dbfb1286387dedccda427697bf1517a2ce36d5d4dfab9647ec2d26dee1cf6281f4b3217c2e7be +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0253fb688077f49bb12859d7f33c3988a23b855e14bb9963008bb5e8ada039 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d296bf8aac74a67761c7c5666f2922d68ab6e431aa6b4004b9fd8cd626cbee + +handshake=Noise_NXpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a3a8c0e25d9cbfd7880c6d3feacf6066 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc485d9c0d76abdbc722684433571ab05ce22a12c92fb1ef81296edd14429f57af4cb353cb580e67a53f1d03fc6c7bede73fcb3b753dc767dfc38016c3dc3102 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b285956fce83786691fb9e5a48f6571ee16435da742caa84e27606c8c0417 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=43a9eb08fe5a95969a4eb076b238e5eba3913319b0b74142bc47a35b1fcace + +handshake=Noise_NX_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac104e4413b3e6091ab98f8902f898f750341010fc28130905edcfa84df5b5ff50d0f6181f350f6b280c29e87598a257ff5df3365fc12cae7322ea77df156a499836d833f1c218000c9f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=50f23b250835f62aeee57429ea276cce9ce465b1fa5bd01cb8041bc9ae7722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=681c16d92b2ed840ea2096ee1445c6d699f71659c0aa98c115fd2be24a4e6a + +handshake=Noise_NXpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c087d6fe10c8862ed749092cff7288bbb82d14d6c00f86f0974 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c4fbd20d2daae06cfee3a4044de5f045844d2d23c127c77abb5006a1727e9b07e867dd2c4ea66642d27c3ae9feeaea47089b9aede3e5674a1829bd4a5d8b3b057de516d4bf5318a2fa9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8a9c8176161c87470eb1bbe4a5ffe8bd08cc293b80f57f244c10ddbbe368d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=38d5a75a6dd18e71d5f6555c7edeac938ed79a312ac10077fd8fc8d82ad81b + +handshake=Noise_NXpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b88c66c5db16c076955495c7289c3499a801ca5a1840f075d1e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d6f6e3ddf23875e0592cb924daf3d8126d3008e0d245a8ced1dbfb1286387de90ab182bc2fb03dd6955f7ae27b74c7077b45b9ff2a8c8130a47ece321f582f42765af8ce6cecc9dab7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0253fb688077f49bb12859d7f33c3988a23b855e14bb9963008bb5e8ada039 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d296bf8aac74a67761c7c5666f2922d68ab6e431aa6b4004b9fd8cd626cbee + +handshake=Noise_NXpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dad9df4c8fe65e76706807c4b6f3261a2ab9dd864826a4105018 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc485d9c0d76abdbc722684433571ab05ce22a12c92fb1ef81296edd14429f57352b4c17d9ec7183cafe3bed352923f60758d553d3fe9be0c2f52ed6cbe5bc8146067bee786a4921f2b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b285956fce83786691fb9e5a48f6571ee16435da742caa84e27606c8c0417 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=43a9eb08fe5a95969a4eb076b238e5eba3913319b0b74142bc47a35b1fcace + +handshake=Noise_NX_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac104e4413b3e6091ab98f8902f898f750341010fc28130905edcfa84df5b5fffd5c64064a663cc1f8f0e59775f3d93db4e7d95dd77b5928935227a3bbfef59a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=50f23b250835f62aeee57429ea276cce9ce465b1fa5bd01cb8041bc9ae7722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=681c16d92b2ed840ea2096ee1445c6d699f71659c0aa98c115fd2be24a4e6a + +handshake=Noise_NXpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545386451c97b61e92eddb55d435aa604f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c4fbd20d2daae06cfee3a4044de5f045844d2d23c127c77abb5006a1727e9b0fb77c4cfa310f7eb93a6b23b45f1c6dfc7b695808fdeb14bbcdf420040e859a3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8a9c8176161c87470eb1bbe4a5ffe8bd08cc293b80f57f244c10ddbbe368d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=38d5a75a6dd18e71d5f6555c7edeac938ed79a312ac10077fd8fc8d82ad81b + +handshake=Noise_NXpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6b06ac4ec214355f45fa8353f935109 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d6f6e3ddf23875e0592cb924daf3d8126d3008e0d245a8ced1dbfb1286387de45b77dee817b10ee56198c4aeb08eaf24446e360a7d53fff28c2d680bbfd97ae +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0253fb688077f49bb12859d7f33c3988a23b855e14bb9963008bb5e8ada039 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d296bf8aac74a67761c7c5666f2922d68ab6e431aa6b4004b9fd8cd626cbee + +handshake=Noise_NXpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254006ef9622a9fef1a70a559a801e0b3c5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc485d9c0d76abdbc722684433571ab05ce22a12c92fb1ef81296edd14429f571c5eeee49093a423c6b4acd63e27a510e1abef38197787ac2ec2d692f837e495 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b285956fce83786691fb9e5a48f6571ee16435da742caa84e27606c8c0417 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=43a9eb08fe5a95969a4eb076b238e5eba3913319b0b74142bc47a35b1fcace + +handshake=Noise_NX_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac104e4413b3e6091ab98f8902f898f750341010fc28130905edcfa84df5b5ff10abab009c4e0ae9e6fe931c4b3a2db2ff5df3365fc12cae7322c0d6356a6fd2ae2b72c9b68520749403 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=50f23b250835f62aeee57429ea276cce9ce465b1fa5bd01cb8041bc9ae7722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=681c16d92b2ed840ea2096ee1445c6d699f71659c0aa98c115fd2be24a4e6a + +handshake=Noise_NXpsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c087d6fe10c8862ed7448bb4f10327d492edf33de25e98a29f0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c4fbd20d2daae06cfee3a4044de5f045844d2d23c127c77abb5006a1727e9b0cb6829c168ec40755cb9791148c71e9b7089b9aede3e5674a182ddb40f356db56ba4f9af3bd611e9c363 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8a9c8176161c87470eb1bbe4a5ffe8bd08cc293b80f57f244c10ddbbe368d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=38d5a75a6dd18e71d5f6555c7edeac938ed79a312ac10077fd8fc8d82ad81b + +handshake=Noise_NXpsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b88c66c5db16c0769556dd7aaeacf1e9daf99473ed45b7449e5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d6f6e3ddf23875e0592cb924daf3d8126d3008e0d245a8ced1dbfb1286387de97e23ace6ec8210a1f5045c76214305477b45b9ff2a8c8130a47b7170d66956ae33fd7bcce1e8df4c94f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0253fb688077f49bb12859d7f33c3988a23b855e14bb9963008bb5e8ada039 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d296bf8aac74a67761c7c5666f2922d68ab6e431aa6b4004b9fd8cd626cbee + +handshake=Noise_NXpsk2_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dad9df4c8fe65e767068bdb6e296baddfa4c82b21bbcc228d06f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc485d9c0d76abdbc722684433571ab05ce22a12c92fb1ef81296edd14429f57ee712f3e89a116cf1ad6e3ad414d7a320758d553d3fe9be0c2f5b3bf317650ef3f796be8958b8619f595 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b285956fce83786691fb9e5a48f6571ee16435da742caa84e27606c8c0417 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=43a9eb08fe5a95969a4eb076b238e5eba3913319b0b74142bc47a35b1fcace + +handshake=Noise_KX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672f4561972c0066d2edb9ec3f6e06061d9efd85e8e09eea4f7b55e051881ed2d461f07a142019054861b74148fc944f2e8d3d02e24ba2ac639ffb67a06cf941c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b455e7160f810c5bc83b94c63932a10a218f6558daa7c9408d619d960d2796 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2afc54621ee01e366836724674abfef6e64777e77ec15067c04d59d9209a4 + +handshake=Noise_KXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548430ae3a453831ae8a72cf799518925e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846616cadc6a5849f99f04d636b30b52105083d64100bee3bb0069b4f03ee5528920b0e6c7d5cd255c95ce396140e6463b697b3fef9bb639280d1e8ef58e2cc57896 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95f4eba61bd217fca6eeac0a5a0a96f68e11a0d0c49dd2e288a8e4e2b17feb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7df0beb173488e9c5778a1af08cbff1aa3337839a0ece825a2a502a0b05bc0 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545c23b090b7eba082e987ffde36222281 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea2829785aa59d7e2f1df56d98f6239f2a267a4c2001acb54d556932c40595e08d08fa0a460ac311e155c1961457907cc0a4d7e1108630ca5899c30604b20475 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=db708006c85bb5c1cdb6fab482f0179cb466ef1ac02d2a5d897ab5e93cda4e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2c4b83b0a27cce3a7347e01d5d11e47a2979bc41d5b8c4b7419640ef6afd + +handshake=Noise_KXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625450e8db962a84fca6873e83064a5444db +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661d4c7b7bc2b1ee4596b72cc8f00e533cfe7c236f9b8deb95ad7fd92c14165e5a8d3903706ccda48ece8fff18fd25fcbc7742a1ecbd81dee525c0bc58eb20fe0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=41c1facc56421dd154d1435a4f33d5b5a243d389e0b460bdf6ea6362a8dcb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3aaefa2606543d87e25894c5eaed9eed40ceca80106c62822593046c03ae39 + +handshake=Noise_KX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672f4561972c0066d2edb9ec3f6e06061d9efd85e8e09eea4f7b55e051881ed2d3c473a344d1071574c284e14408c92b58539d798b2be574927e85b225447321ee1eca1a9e701c541dfc4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b455e7160f810c5bc83b94c63932a10a218f6558daa7c9408d619d960d2796 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2afc54621ee01e366836724674abfef6e64777e77ec15067c04d59d9209a4 + +handshake=Noise_KXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a278e53378151225fdc24a27a0350908629f692f9235d8b579a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846616cadc6a5849f99f04d636b30b52105083d64100bee3bb0069b4f03ee55289202bbe89689c2b31e623a1ff6083a686213eb28814fe4ae279902deca97b1bf6dd106c9b325fda721e8e45 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95f4eba61bd217fca6eeac0a5a0a96f68e11a0d0c49dd2e288a8e4e2b17feb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7df0beb173488e9c5778a1af08cbff1aa3337839a0ece825a2a502a0b05bc0 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541963a6cc03347872d41cd292b29b87d22c488ec89f15cadc0304 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea2829785aa59d7e2f1df56d98f6239f2a267a4c2001acb54d556932c40595e0ff2d81ce4e2b85ccd5b50e3d9385951e978f1e633d310614bfa6c9af1eb5389105299f943c88ef268de0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=db708006c85bb5c1cdb6fab482f0179cb466ef1ac02d2a5d897ab5e93cda4e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2c4b83b0a27cce3a7347e01d5d11e47a2979bc41d5b8c4b7419640ef6afd + +handshake=Noise_KXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b687a1a128f62ce6ad4869118737b15a42084f3c92aebc30d267 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661d4c7b7bc2b1ee4596b72cc8f00e533cfe7c236f9b8deb95ad7fd92c14165e50a8d064f224ac761b6d7c1c6c8eb50293f03deb388775b780f1a4d2ab7129b40773b857884e7fa3781ba +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=41c1facc56421dd154d1435a4f33d5b5a243d389e0b460bdf6ea6362a8dcb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3aaefa2606543d87e25894c5eaed9eed40ceca80106c62822593046c03ae39 + +handshake=Noise_KX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672f4561972c0066d2edb9ec3f6e06061d9efd85e8e09eea4f7b55e051881ed2d1d615544c66e1cb785f80a256fa65b2fa178f825837d657176e150e7ce6f245c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b455e7160f810c5bc83b94c63932a10a218f6558daa7c9408d619d960d2796 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2afc54621ee01e366836724674abfef6e64777e77ec15067c04d59d9209a4 + +handshake=Noise_KXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f158d8a926103237627624b7994e5cea +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846616cadc6a5849f99f04d636b30b52105083d64100bee3bb0069b4f03ee55289209cd64d6c3bbcf800f969aa8df01d86fe7072004c1b4554700eb5909209e0dab7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95f4eba61bd217fca6eeac0a5a0a96f68e11a0d0c49dd2e288a8e4e2b17feb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7df0beb173488e9c5778a1af08cbff1aa3337839a0ece825a2a502a0b05bc0 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d791c8f0b6f7c80957817be26d2892d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea2829785aa59d7e2f1df56d98f6239f2a267a4c2001acb54d556932c40595e00680a79b2539691fef9292119bcf76716a9952ab10be0f6024bf192f1769921a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=db708006c85bb5c1cdb6fab482f0179cb466ef1ac02d2a5d897ab5e93cda4e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2c4b83b0a27cce3a7347e01d5d11e47a2979bc41d5b8c4b7419640ef6afd + +handshake=Noise_KXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9a3396c47f801921ad02dbae48fc985 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661d4c7b7bc2b1ee4596b72cc8f00e533cfe7c236f9b8deb95ad7fd92c14165e594f70660f3cee9026c4f1dbad7e0f4ad0cbf817f2b3cb5e211e95723c228e6a8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=41c1facc56421dd154d1435a4f33d5b5a243d389e0b460bdf6ea6362a8dcb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3aaefa2606543d87e25894c5eaed9eed40ceca80106c62822593046c03ae39 + +handshake=Noise_KX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672f4561972c0066d2edb9ec3f6e06061d9efd85e8e09eea4f7b55e051881ed2dc41c3031529d4ad19d8b7d219ee949ba8539d798b2be574927e893bc2be2e90d5f23a332ce63e9b6af53 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b455e7160f810c5bc83b94c63932a10a218f6558daa7c9408d619d960d2796 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2afc54621ee01e366836724674abfef6e64777e77ec15067c04d59d9209a4 + +handshake=Noise_KXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a278e53378151225fdcdac5afdbdd2dc7dedc8295b2873efbe7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846616cadc6a5849f99f04d636b30b52105083d64100bee3bb0069b4f03ee55289203975f934fe65246ce4d017fc344204863eb28814fe4ae279902d812f17f5fdeec17d2be7cfe9c15fe371 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=95f4eba61bd217fca6eeac0a5a0a96f68e11a0d0c49dd2e288a8e4e2b17feb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7df0beb173488e9c5778a1af08cbff1aa3337839a0ece825a2a502a0b05bc0 + +handshake=Noise_KXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541963a6cc03347872d41c5e0ed0f6f3e8e1bb772a98ffc1f921a3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea2829785aa59d7e2f1df56d98f6239f2a267a4c2001acb54d556932c40595e0add7a52cc2a82263c610384ed971faaf978f1e633d310614bfa6c7981a371f1daaf7743d4b65531bfac4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=db708006c85bb5c1cdb6fab482f0179cb466ef1ac02d2a5d897ab5e93cda4e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2c4b83b0a27cce3a7347e01d5d11e47a2979bc41d5b8c4b7419640ef6afd + +handshake=Noise_KXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b687a1a128f62ce6ad483da6460c40931a96fa6bd046991ec6fa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661d4c7b7bc2b1ee4596b72cc8f00e533cfe7c236f9b8deb95ad7fd92c14165e5c17fef40ec942d9af58b9f2084f7d7343f03deb388775b780f1a06a1f31cd098cde068559214e75a9613 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=41c1facc56421dd154d1435a4f33d5b5a243d389e0b460bdf6ea6362a8dcb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3aaefa2606543d87e25894c5eaed9eed40ceca80106c62822593046c03ae39 + +handshake=Noise_XN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667ebc7d2d516cca269396ef67d295ec39 +msg_2_payload= +msg_2_ciphertext=1ab983aef2af5558802d787fec340c612a9332b5ad54d9d76bea87516becc239cae582f922483a710bdadf4d3d4104b83912d0022b4c80366819f93508567e42 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d195f8befc66baa201a18c4064909ebe8502e0f9b5e961314b61fd125d247d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86591937ccc7873fb61286c7d019e73daf8b40ec33dcc9d1fffe1c9a16dd4c + +handshake=Noise_XNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d6ce88b9c3416bd1b1fd48bd564b7d8b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662736201c798b5d138492b71ca9303c38 +msg_2_payload= +msg_2_ciphertext=b1fa0b5e1310eb981ee2e54af06f5f88b5a9d0140be4b3bc6b2946a937e40d7ffcc250ffbcda3b2f9620ebf6eac14a59a1210630e2445733f2e46646501b9357 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=553b9158015420d2b4692c4b30b0fb26ade7adfa1fcbcc182e90b7244054b3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2383835c704affed54b3525f4d7f63064538ce838cd706c9197aff8881fb31 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254967f2f01403b1579c67ebc37850a3984 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667d7227bc0115068aaaad4d8b7fc66cdb +msg_2_payload= +msg_2_ciphertext=8d7c08550caffdd7302901d1ef368326f22321a4511debccbbd532ccb7d96f286ec78fbd90058b6b4e4a015560082c19ca281643f095da37cf820411c2d087d0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=eb2dbb2a68310558e3a1ca71a2257cd6f28ddfd99fa854dc8011d812e90101 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=80c84ea17aa9f0d18602ab87eb20259a858074a95e5f076907e632667db5fb + +handshake=Noise_XNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546ca3cd19431029b33d5dca3bc873f8bb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e0071d3b01d6039361134ab45ac8b078 +msg_2_payload= +msg_2_ciphertext=57d0d36040aea7cc919054c726a651796718f907af000923de50022aac735ff60d17220a0c76cc92c0f6fbd59b2137d761b604bd4022323157834edcf5e479a9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=078228238d9d65d53d9910156e32b61af70cac329a27000c3968d942f325af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=eaa3e5c640ca8998164b6fa6e2c3546393076d09e3f87493d20b91f3fbadd2 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547cbc94fd1c4c0d0998ff4e6d7a365759 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a9868d34a16223d571df967ef2c2a815 +msg_2_payload= +msg_2_ciphertext=83cbff8b883cab6302654c8d6d6e50a3e7323d9024018c648cf98824f0e880ab5995de92829e6723630bac7f2f6ab19656155b0561d7998e25c283903c34fece +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=62620d455bce603e36d0e324deb5ae87a2a3ac98b56a0de4b3cd02e98e285e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=37668ce320aa3b29cd5dd49bfc5fd63474ff03fade3bf0dde6164fa0030b64 + +handshake=Noise_XN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669bc42f905f6cea8c6d21736310fecc3db8d9b6e67b39bdfeaf21 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1ab983aef2af5558802d787fec340c612a9332b5ad54d9d76bea87516becc239d9d0e972486a926167ac22ff38795bb8d5ff457d78cb9ee139f97cf0aa00153beac61936bd612bd689fe +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d195f8befc66baa201a18c4064909ebe8502e0f9b5e961314b61fd125d247d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86591937ccc7873fb61286c7d019e73daf8b40ec33dcc9d1fffe1c9a16dd4c + +handshake=Noise_XNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254383b83be44ec842dd3006898b7004b470de5cd728369d9d0bbb7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665933b46f951a73becfa372a5ae6db01ed6238a0edb6dbf4c6cd4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b1fa0b5e1310eb981ee2e54af06f5f88b5a9d0140be4b3bc6b2946a937e40d7faf234bc6d125f13bbc03b3123995036cb9e89a78f9efa643f1cdd386afe537a04caf8573a64da952a302 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=553b9158015420d2b4692c4b30b0fb26ade7adfa1fcbcc182e90b7244054b3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2383835c704affed54b3525f4d7f63064538ce838cd706c9197aff8881fb31 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447a625a9ed5dd10375d8ee2e1a8b6de55f4bb41c7afd0ba7530f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661977595c1b822311d2db73d33c2217e9e61c48015261e4bf2ccb +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8d7c08550caffdd7302901d1ef368326f22321a4511debccbbd532ccb7d96f28a88b4c55350214e5105354ff79021a3346fe0bfca84667d86819739dbee501a7a7ad383e6ac4fc93d3a4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=eb2dbb2a68310558e3a1ca71a2257cd6f28ddfd99fa854dc8011d812e90101 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=80c84ea17aa9f0d18602ab87eb20259a858074a95e5f076907e632667db5fb + +handshake=Noise_XNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540dc8226f2f99fa7085ced52daea87b8eba61c0a8bceba13e8296 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9fd0e03c736f0dbe83784fd835dbcccc6aa205422101c0b7562 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=57d0d36040aea7cc919054c726a651796718f907af000923de50022aac735ff6dc185e9cc4a822dc22082b1e9c705d953214f3e01388aa3cd4912e5cde0319b158974a4c910c12436a81 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=078228238d9d65d53d9910156e32b61af70cac329a27000c3968d942f325af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=eaa3e5c640ca8998164b6fa6e2c3546393076d09e3f87493d20b91f3fbadd2 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546c1aa61ab88ff9a43d1c80d505b1c6efb80ce50a5643b362d0df +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661588ca3f0797a06d1b63b044f56d827811dcbc1f646a8def6f2d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=83cbff8b883cab6302654c8d6d6e50a3e7323d9024018c648cf98824f0e880abe8fa324069e8d159ca0a8dc4b0cafdecd4d7fe0f1353b05c118a548b145e78bb26f3b9d520fe9b4d1514 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=62620d455bce603e36d0e324deb5ae87a2a3ac98b56a0de4b3cd02e98e285e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=37668ce320aa3b29cd5dd49bfc5fd63474ff03fade3bf0dde6164fa0030b64 + +handshake=Noise_XN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9e8710f7b46475111899a331cb6d0a7 +msg_2_payload= +msg_2_ciphertext=1ab983aef2af5558802d787fec340c612a9332b5ad54d9d76bea87516becc239067cd1d54113d19c1f71c83a1edf288d743f8a931b93cb162a125f6042ef548f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d195f8befc66baa201a18c4064909ebe8502e0f9b5e961314b61fd125d247d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86591937ccc7873fb61286c7d019e73daf8b40ec33dcc9d1fffe1c9a16dd4c + +handshake=Noise_XNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547a92e7a29e352f7a1fdbf917a7d408fb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c95d0a8a41a3cfbe098066ef8799cedc +msg_2_payload= +msg_2_ciphertext=b1fa0b5e1310eb981ee2e54af06f5f88b5a9d0140be4b3bc6b2946a937e40d7f7c035f20b8c89981b5d78bd802ffcbf57049af8a3bf01842bf9401424fbc2522 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=553b9158015420d2b4692c4b30b0fb26ade7adfa1fcbcc182e90b7244054b3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2383835c704affed54b3525f4d7f63064538ce838cd706c9197aff8881fb31 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e5174a2db0e02e89ce6700b7f724e98 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e3f9c5d3216d0bbc1c9732c02fb6d958 +msg_2_payload= +msg_2_ciphertext=8d7c08550caffdd7302901d1ef368326f22321a4511debccbbd532ccb7d96f2866581032bd9ef4ec605c89f9a9c11d3c934b44c76b19fb9e874055521d8c2126 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=eb2dbb2a68310558e3a1ca71a2257cd6f28ddfd99fa854dc8011d812e90101 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=80c84ea17aa9f0d18602ab87eb20259a858074a95e5f076907e632667db5fb + +handshake=Noise_XNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625463a521446358f262e7d5a60de7721239 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b360a6b915076e4a46f0df191ef44a2a +msg_2_payload= +msg_2_ciphertext=57d0d36040aea7cc919054c726a651796718f907af000923de50022aac735ff63edb6b8db36b3614c4a99a8f0439dd35a25669a26992d38212997d2e2b956544 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=078228238d9d65d53d9910156e32b61af70cac329a27000c3968d942f325af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=eaa3e5c640ca8998164b6fa6e2c3546393076d09e3f87493d20b91f3fbadd2 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a4e95d8a6ec9259c7fd75328ebf841c3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846667d638565845ccfec1044160484c0212 +msg_2_payload= +msg_2_ciphertext=83cbff8b883cab6302654c8d6d6e50a3e7323d9024018c648cf98824f0e880abb946e9e4e1a540c904ceae9d7fc3a3e23df2179a425d076051527f20bd5c157d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=62620d455bce603e36d0e324deb5ae87a2a3ac98b56a0de4b3cd02e98e285e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=37668ce320aa3b29cd5dd49bfc5fd63474ff03fade3bf0dde6164fa0030b64 + +handshake=Noise_XN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669bc42f905f6cea8c6d2152688b2db7a4a5e6bad2eb5e6bb6d67f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1ab983aef2af5558802d787fec340c612a9332b5ad54d9d76bea87516becc2394be6087d956d1e4a61de19f946b938e2d5ff457d78cb9ee139f9ce920104afac59a4bcdd664d58ab4463 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d195f8befc66baa201a18c4064909ebe8502e0f9b5e961314b61fd125d247d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86591937ccc7873fb61286c7d019e73daf8b40ec33dcc9d1fffe1c9a16dd4c + +handshake=Noise_XNpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254383b83be44ec842dd30040829f1859c3e6575f749244de0bf9df +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665933b46f951a73becfa39241e5fb3addacb4201d1c842fdc6574 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b1fa0b5e1310eb981ee2e54af06f5f88b5a9d0140be4b3bc6b2946a937e40d7fdafd771902eb11c326abd30b61887b86b9e89a78f9efa643f1cd8bf6e2fca221a8f95cd1b592d021fdb4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=553b9158015420d2b4692c4b30b0fb26ade7adfa1fcbcc182e90b7244054b3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2383835c704affed54b3525f4d7f63064538ce838cd706c9197aff8881fb31 + +handshake=Noise_XNpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447a625a9ed5dd10375d810bbf4dbff81da99b343d240f9c1992d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661977595c1b822311d2db413251d1961135b14cb2786f7a030b70 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8d7c08550caffdd7302901d1ef368326f22321a4511debccbbd532ccb7d96f28cd00b064a19fdb50dd2e68909f34604546fe0bfca84667d8681934aa1779b419c87ead0d4ef509d932ac +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=eb2dbb2a68310558e3a1ca71a2257cd6f28ddfd99fa854dc8011d812e90101 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=80c84ea17aa9f0d18602ab87eb20259a858074a95e5f076907e632667db5fb + +handshake=Noise_XNpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540dc8226f2f99fa7085cec3a3e87c17df7992d06de1d5c72dea3f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9fd0e03c736f0dbe8371d3f702aab8074e52ade0b150397a2cd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=57d0d36040aea7cc919054c726a651796718f907af000923de50022aac735ff670a9f1e667c41afe15ce41ee90c3a6d83214f3e01388aa3cd4913253f8982aa4c23b7af239ac6e88ce91 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=078228238d9d65d53d9910156e32b61af70cac329a27000c3968d942f325af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=eaa3e5c640ca8998164b6fa6e2c3546393076d09e3f87493d20b91f3fbadd2 + +handshake=Noise_XNpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546c1aa61ab88ff9a43d1ca8c9a354f488d3f1cd4c6f8efd232fd5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661588ca3f0797a06d1b636d50b498f7a84254af07424ed1b25094 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=83cbff8b883cab6302654c8d6d6e50a3e7323d9024018c648cf98824f0e880abf4c9c1c27f2965b5afe799f44cb4f89cd4d7fe0f1353b05c118a7017a7949d7f7851ece83e0bf5e9fb6f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=62620d455bce603e36d0e324deb5ae87a2a3ac98b56a0de4b3cd02e98e285e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=37668ce320aa3b29cd5dd49bfc5fd63474ff03fade3bf0dde6164fa0030b64 + +handshake=Noise_IN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9ab17086eb52ba02f54fe48b11cf7ae +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d4e08cc4a109b93413b9f2b93a90c3b52d328130346ae8a7a65693bbdfffb3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2bf0d845c35d0b63452e9477083d9c35feb7263cebf00828ce84fba88f94c0 + +handshake=Noise_INpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405262b1f9b84cdb310908a65b2d6408f13ec9efef6a1b52c2bf0daaffe1e42204de45bf028283b88c60ab5cc2745b8e8c6cf4e30f5e4d01f7a36153c4d2028b1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fcf90b48cc4034aefda82a6593ca634e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d8f33663563115c594ca28b2fe01e8dae1cf498b312ceb4c18fc55a005cc6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36f1d5c7339b870e822497f1a014c1032e3268d62ea5bc7f80264b2de3535d + +handshake=Noise_INpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c205846663809a031f5a191bd9323566dc3c824c7273fa31a5fc1d54a8e951aa4f4a2c01331090fe2dc47358b134f4983e57f6e050a654d43575149488e4d962 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f9cecdffa97451986964e6b181e2961 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=79d1215e41ae753d5c8dafc474355e4b7af8ec2d84f13444f3d1c7bea75e53 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=216ecf739142ee4ce72573b4e79f765df31be2022377fee7e9847f558a6187 + +handshake=Noise_INpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541906307774eb6ae1a18c731b2af6d9bcf09b69e5b9b66678a3b968edb6550e7dc123f2506c770de516702097583503973ef95ff80d31b363f0e2637b8df344c7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac222e4b2d2f6d105228f1f6eaab97ff +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f18b76b773ad92a0551eaaccac2822ef7c89e2e4141b493494a5671432e538 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b500b236900edd4ce3a74e0f021fc0b93bb677a8a0417996474ad1b3ad40f8 + +handshake=Noise_IN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466578e11ef9be6d820631037dc05abdcb236c57a2567ba93669ab0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d4e08cc4a109b93413b9f2b93a90c3b52d328130346ae8a7a65693bbdfffb3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2bf0d845c35d0b63452e9477083d9c35feb7263cebf00828ce84fba88f94c0 + +handshake=Noise_INpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405262b1f9b84cdb310908a65b2d6408f13ec9efef6a1b52c2bf0daaffe1e42204de45bf028283b88c60ab5cc2745b8e87016ea492791838b92f00800e636883dc626eb2f3895011a139e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466217778ef3116b94146df592ed848106664bcbfff47169058bda2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d8f33663563115c594ca28b2fe01e8dae1cf498b312ceb4c18fc55a005cc6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36f1d5c7339b870e822497f1a014c1032e3268d62ea5bc7f80264b2de3535d + +handshake=Noise_INpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c205846663809a031f5a191bd9323566dc3c824c7273fa31a5fc1d54a8e951aa4f4a2c01331090fe2dc47358b134f4985722e0d190fada548c133472917187cdb527644e700547c52b28 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466471b4496207cea9199841fc64e1bb1b5b788be9d1689e4540867 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=79d1215e41ae753d5c8dafc474355e4b7af8ec2d84f13444f3d1c7bea75e53 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=216ecf739142ee4ce72573b4e79f765df31be2022377fee7e9847f558a6187 + +handshake=Noise_INpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541906307774eb6ae1a18c731b2af6d9bcf09b69e5b9b66678a3b968edb6550e7dc123f2506c770de516702097583503971cf56370e4abe94a9f67eda71c22f885de116aa378e1cd96eced +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846643ad2c9a96755f8efbbcf40b385fe808da55ab103c66dd8c1542 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f18b76b773ad92a0551eaaccac2822ef7c89e2e4141b493494a5671432e538 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b500b236900edd4ce3a74e0f021fc0b93bb677a8a0417996474ad1b3ad40f8 + +handshake=Noise_IN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846648988f7cb5d85b5c5c03e276b86fe50f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d4e08cc4a109b93413b9f2b93a90c3b52d328130346ae8a7a65693bbdfffb3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2bf0d845c35d0b63452e9477083d9c35feb7263cebf00828ce84fba88f94c0 + +handshake=Noise_INpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405262b1f9b84cdb310908a65b2d6408f13ec9efef6a1b52c2bf0daaffe1e422032e60c283f594634358c6ade5821244600d8d2e6dea60137b4f10b074ba7193d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b1e5ecbcc832e6ac1a8414797bb920cb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d8f33663563115c594ca28b2fe01e8dae1cf498b312ceb4c18fc55a005cc6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36f1d5c7339b870e822497f1a014c1032e3268d62ea5bc7f80264b2de3535d + +handshake=Noise_INpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c205846663809a031f5a191bd9323566dc3c824c7273fa31a5fc1d54a8e951aa6ec025aad0d8f9cb26a27d5d1176d9a994077aab03b577f2e8039e4366bc6245 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d663e6ac3d33e23ad323622c476fe906 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=79d1215e41ae753d5c8dafc474355e4b7af8ec2d84f13444f3d1c7bea75e53 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=216ecf739142ee4ce72573b4e79f765df31be2022377fee7e9847f558a6187 + +handshake=Noise_INpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541906307774eb6ae1a18c731b2af6d9bcf09b69e5b9b66678a3b968edb6550e7dfee517c34ceeba54fee005b95e94e05103161169f40b807a26d7d3bf013b7f85 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664813a5e72f6b66ec89e411840f84ba80 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f18b76b773ad92a0551eaaccac2822ef7c89e2e4141b493494a5671432e538 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b500b236900edd4ce3a74e0f021fc0b93bb677a8a0417996474ad1b3ad40f8 + +handshake=Noise_IN_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466578e11ef9be6d82063107b23e9a7cdafd87a02d15059693b866a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d4e08cc4a109b93413b9f2b93a90c3b52d328130346ae8a7a65693bbdfffb3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2bf0d845c35d0b63452e9477083d9c35feb7263cebf00828ce84fba88f94c0 + +handshake=Noise_INpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405262b1f9b84cdb310908a65b2d6408f13ec9efef6a1b52c2bf0daaffe1e422032e60c283f594634358c6ade582124467016ea492791838b92f08ea1ce07ac1c29aaca2ba2e6be8aae6f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466217778ef3116b94146df5f06a4a59dfcbb765ff9ffaf65d3063d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d8f33663563115c594ca28b2fe01e8dae1cf498b312ceb4c18fc55a005cc6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36f1d5c7339b870e822497f1a014c1032e3268d62ea5bc7f80264b2de3535d + +handshake=Noise_INpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c205846663809a031f5a191bd9323566dc3c824c7273fa31a5fc1d54a8e951aa6ec025aad0d8f9cb26a27d5d1176d9a95722e0d190fada548c13cebafccf5db40ddec9c8ee4edbf85e68 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466471b4496207cea9199840fb7d1bf618aa15eb0b74b90a0a8f9b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=79d1215e41ae753d5c8dafc474355e4b7af8ec2d84f13444f3d1c7bea75e53 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=216ecf739142ee4ce72573b4e79f765df31be2022377fee7e9847f558a6187 + +handshake=Noise_INpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541906307774eb6ae1a18c731b2af6d9bcf09b69e5b9b66678a3b968edb6550e7dfee517c34ceeba54fee005b95e94e0511cf56370e4abe94a9f67f486bb56720c1832a61683a3ebde2eec +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846643ad2c9a96755f8efbbcab063bc3e701c9facb3668c1589ea2d6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f18b76b773ad92a0551eaaccac2822ef7c89e2e4141b493494a5671432e538 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b500b236900edd4ce3a74e0f021fc0b93bb677a8a0417996474ad1b3ad40f8 + +handshake=Noise_XK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543fba394be81d461ec599092e9a40c636 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a35be554752bb77f40ac980146ef9278 +msg_2_payload= +msg_2_ciphertext=5e88a8a22bc7df4d8b6c85eaa581a819ec04c6588a193d2af0de37da0e24a50f5b0d67595a3683f9866af793c510e046dc9c0208b821af4c16a9f2678739fc1e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e1b55532068a924fa7cd262612a53c9eb0b4925df7819a9afe61509d63a879 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94b7b8c259658fd03b54749fdd35464a286a6ba9cc9ff76833f20736f632db + +handshake=Noise_XKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254628f0972a8c6dffd9b1f6b0a9c692591 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846662111ca7ab008976bb43e298b4703b93 +msg_2_payload= +msg_2_ciphertext=b0582dab6c55505ee245bc3b96ea140a212c8fbc6d0c6a6dea3b66264af8080a9d84d415bacadb301ac578f87f03cc2a39d9f3a2d69b434c539916222b7571ba +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b21379d73f20b8effdf93a82f86a09520c92cd743a4323b1f048fad80e3ccf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=85a2892049d45dac297850412a71011489b13831bbc1eb3551361d1a81866b + +handshake=Noise_XKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254084e3679207acaf00c8676cf14887de0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c5452c9722f395c25e4f50ed320d648 +msg_2_payload= +msg_2_ciphertext=5270bd250e9904a246463d7d975d9724fa0c1fca24e20f8cc19143e7f37ae1b6fdf66ce9da187377f6eac6601c773cc7a6e523730abc032a0739dffa836a2833 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3e92cd13d2b9922ccfff54653579cb0e8153c3adbe0ef016ff62c30e5aec77 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9c7f77109e64326d3c01369a3542137cfec0e8bb550fe4f16211a7d0d5aa47 + +handshake=Noise_XKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625460572f2e213e1bab8056917df9f342a9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e2cfb743b4c24761d3e753548ffcf885 +msg_2_payload= +msg_2_ciphertext=742c8b64404bd353aed4f94bd8608eaf78dc3be24690bf93956dac0021c8d510c830e3307d1325cfc6fe40abea2205adbc648ae8591fa6beb570b50ebf18dc30 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55d51d54c345abe9038b8b5b1032052740bee5daacb8812810eed8e1086c4c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=52f5cf6aa3f6c12c3d8333f70bfde158d17af6c68ab496010b6ac61d404a5c + +handshake=Noise_XKpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3c24b47ca37d062ffa5a82d96a68807 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f7fa4fbea714e7bb8cde3e281568e80c +msg_2_payload= +msg_2_ciphertext=657cf68657783f22da2bc73c370cf967b4e5113479533ff00447e6e1e0d61c8ea86453b71ca934e88c911840807682451a674a5237f6a5c037d4500bdbbdf51b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5bb42f69e02b04f540695c05ec8af9ba7f8075e540d9a4721a72b900dda50 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57fe584b6806f892abc12e9876cb93f2dee7e798a2da2b40d18cedc51abde6 + +handshake=Noise_XK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a7b8f977e8c05a05432685828169a203a60e39b9f2ae22a38bc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466816d6c440357f5acf5b0689176d7379fc88d59144d34dcc9cc43 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5e88a8a22bc7df4d8b6c85eaa581a819ec04c6588a193d2af0de37da0e24a50fc2e1d713b3c03faace1207f0a7cbd91d23e7d0c62d67c1eea84bb3c94fe9c525d4f7b8eb287df3fa5000 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e1b55532068a924fa7cd262612a53c9eb0b4925df7819a9afe61509d63a879 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94b7b8c259658fd03b54749fdd35464a286a6ba9cc9ff76833f20736f632db + +handshake=Noise_XKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625484c6d0554a6f76969dc0d53cda23f1a6a755b9966554422ea3d1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad94991fe04bd330625d6e16d5591e3c47d0b024feb6e4faffe5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b0582dab6c55505ee245bc3b96ea140a212c8fbc6d0c6a6dea3b66264af8080ae490f4575fb9dfc85eb6a5a6bd873cb77d8ce8c82106d98c8f5218537ffbe88be703fccb23407f75eb97 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b21379d73f20b8effdf93a82f86a09520c92cd743a4323b1f048fad80e3ccf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=85a2892049d45dac297850412a71011489b13831bbc1eb3551361d1a81866b + +handshake=Noise_XKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c82ce3a8b803326d6ad5368ea48b1b880b3f85fb62587176c112 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466085d6eef93d49287bd6a6ae8bb1773d38bcd556e1cca019bfb56 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5270bd250e9904a246463d7d975d9724fa0c1fca24e20f8cc19143e7f37ae1b63f620a0e7bbaab400c6aff6549b4fe530636c9f422fd45b76bcfd99fa4fe05ad57bc2af01e4b1378342b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3e92cd13d2b9922ccfff54653579cb0e8153c3adbe0ef016ff62c30e5aec77 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9c7f77109e64326d3c01369a3542137cfec0e8bb550fe4f16211a7d0d5aa47 + +handshake=Noise_XKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f03a092dcf31be305b9897ffb1f6edf78c2308b7592e5ede5f8c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0c7547b9c1200bbf993ceaf07ee3e0ba1d21990c63c685bc2a6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=742c8b64404bd353aed4f94bd8608eaf78dc3be24690bf93956dac0021c8d510c2f90f4e9157a1fb23a07e4ab218fbd2c0a6193184866cc4aa968cc9423ef3ed3cc4d3ee747f6db3d699 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55d51d54c345abe9038b8b5b1032052740bee5daacb8812810eed8e1086c4c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=52f5cf6aa3f6c12c3d8333f70bfde158d17af6c68ab496010b6ac61d404a5c + +handshake=Noise_XKpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549275659638adc4f810a217d9688cebda3ee76c41146fa6168000 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fad2e1206a13940ab0a339bb718fb50563add7e0f42ad5af3df2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=657cf68657783f22da2bc73c370cf967b4e5113479533ff00447e6e1e0d61c8eac532982ce7784fe5b9fae18ee9f925bfc243ca41c6ddf6483a9126ea991130f96ead988170ae534d021 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5bb42f69e02b04f540695c05ec8af9ba7f8075e540d9a4721a72b900dda50 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57fe584b6806f892abc12e9876cb93f2dee7e798a2da2b40d18cedc51abde6 + +handshake=Noise_XK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625494382079878f98f580c3b1cbb5aa1b3e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669d6a740fa022b801a82f6d8f736a9221 +msg_2_payload= +msg_2_ciphertext=5e88a8a22bc7df4d8b6c85eaa581a819ec04c6588a193d2af0de37da0e24a50f3e9d35ee86621e9543a33614ab4c3cc9290c2266378883ed491d6b583fe98670 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e1b55532068a924fa7cd262612a53c9eb0b4925df7819a9afe61509d63a879 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94b7b8c259658fd03b54749fdd35464a286a6ba9cc9ff76833f20736f632db + +handshake=Noise_XKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254eac55cae26f24fb5d8f6d6ecd3030fe6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466071d80399439d99784391a3f08e6077c +msg_2_payload= +msg_2_ciphertext=b0582dab6c55505ee245bc3b96ea140a212c8fbc6d0c6a6dea3b66264af8080a7d55b3c0d87324d18eb0ee39b4ea01f13b6ad45ac612e2620433447bd81a2eaf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b21379d73f20b8effdf93a82f86a09520c92cd743a4323b1f048fad80e3ccf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=85a2892049d45dac297850412a71011489b13831bbc1eb3551361d1a81866b + +handshake=Noise_XKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d0ac9cf6374b5c793b64b5a9ffc7804 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466085a04d90bcc1a7539025325baf625d7 +msg_2_payload= +msg_2_ciphertext=5270bd250e9904a246463d7d975d9724fa0c1fca24e20f8cc19143e7f37ae1b64eb9bef8ea1419bcd7af3d017cc79d9f05407aeb86089e683f4a54a6eedee93f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3e92cd13d2b9922ccfff54653579cb0e8153c3adbe0ef016ff62c30e5aec77 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9c7f77109e64326d3c01369a3542137cfec0e8bb550fe4f16211a7d0d5aa47 + +handshake=Noise_XKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f5919b8e1ea6d8c820f3b1c6caf4b63f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f99ad158af497a66373342a7d9d6a334 +msg_2_payload= +msg_2_ciphertext=742c8b64404bd353aed4f94bd8608eaf78dc3be24690bf93956dac0021c8d510e1cba1d6ecb7d9b857bd55d75bf1dc283feda9825d97b4676885a73def70af6c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55d51d54c345abe9038b8b5b1032052740bee5daacb8812810eed8e1086c4c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=52f5cf6aa3f6c12c3d8333f70bfde158d17af6c68ab496010b6ac61d404a5c + +handshake=Noise_XKpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542519fd1f858e3a27f27f361b9dd33448 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1fee192dcc5bf08085d8b1630667a75 +msg_2_payload= +msg_2_ciphertext=657cf68657783f22da2bc73c370cf967b4e5113479533ff00447e6e1e0d61c8e90638cf47a9917c2d26d5e142f43e865b9923804b74a9431395b925c3692cb24 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5bb42f69e02b04f540695c05ec8af9ba7f8075e540d9a4721a72b900dda50 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57fe584b6806f892abc12e9876cb93f2dee7e798a2da2b40d18cedc51abde6 + +handshake=Noise_XK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a7b8f977e8c05a05432384387977b5f322fefd1d838f7dbfb34 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466816d6c440357f5acf5b028b67758e280315cf45f994e4fe6554c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5e88a8a22bc7df4d8b6c85eaa581a819ec04c6588a193d2af0de37da0e24a50f8511d619d0aa5bddb2055dcab48f6b9023e7d0c62d67c1eea84b026b254bb79a8146b32f2f46c52b1e77 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e1b55532068a924fa7cd262612a53c9eb0b4925df7819a9afe61509d63a879 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94b7b8c259658fd03b54749fdd35464a286a6ba9cc9ff76833f20736f632db + +handshake=Noise_XKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625484c6d0554a6f76969dc069ea2dc2c034193fde8cac677ff7ae34 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad94991fe04bd330625dff6616b01f49f3ed5e0a2473ead205e3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b0582dab6c55505ee245bc3b96ea140a212c8fbc6d0c6a6dea3b66264af8080ac968116f28605c3eacb50d76624af7d07d8ce8c82106d98c8f52ba9db10cdb3d6865cd0b1c0e8eddec9d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b21379d73f20b8effdf93a82f86a09520c92cd743a4323b1f048fad80e3ccf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=85a2892049d45dac297850412a71011489b13831bbc1eb3551361d1a81866b + +handshake=Noise_XKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c82ce3a8b803326d6ad594b0b2bf72cd7c4995188e472049026b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466085d6eef93d49287bd6a7c369b1904dcfdc7c6e7d9357d9cfb86 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5270bd250e9904a246463d7d975d9724fa0c1fca24e20f8cc19143e7f37ae1b6362e57e3ca4cdc1a1dffa9673c33c5540636c9f422fd45b76bcf9d68cf255ebeb4a0dfdea896da2507aa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3e92cd13d2b9922ccfff54653579cb0e8153c3adbe0ef016ff62c30e5aec77 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9c7f77109e64326d3c01369a3542137cfec0e8bb550fe4f16211a7d0d5aa47 + +handshake=Noise_XKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f03a092dcf31be305b98d6673fc3049849936cf71b2ba8ecd768 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0c7547b9c1200bbf9930021049e741e2109d9d17b27430a657f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=742c8b64404bd353aed4f94bd8608eaf78dc3be24690bf93956dac0021c8d51068f966046fa835ceffab9f61156a0cb3c0a6193184866cc4aa96ee286092d40b1c200cb6a721ab5d5239 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55d51d54c345abe9038b8b5b1032052740bee5daacb8812810eed8e1086c4c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=52f5cf6aa3f6c12c3d8333f70bfde158d17af6c68ab496010b6ac61d404a5c + +handshake=Noise_XKpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549275659638adc4f810a22ecfa8d82eb64d6ba6dafa2ec5b48a85 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fad2e1206a13940ab0a3de71ac02f268e91fecdff42dc0f28930 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=657cf68657783f22da2bc73c370cf967b4e5113479533ff00447e6e1e0d61c8e5b2baf8950ce6c43c591dc1fc413e067fc243ca41c6ddf6483a965a1e55a1e106bac94c5f89d82405bed +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5bb42f69e02b04f540695c05ec8af9ba7f8075e540d9a4721a72b900dda50 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57fe584b6806f892abc12e9876cb93f2dee7e798a2da2b40d18cedc51abde6 + +handshake=Noise_IK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e4c987aee1def7f4451e94e52f2edcf3f88abd36f9a83613afec5cfba3d156ca3241a67c80714c7daf3a9695237fa6a4516a56c98ff0cb2136a1ecfa5987db0c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666e25d3e0f17564403749cb3472eec222 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=410d4ee9df61c268dddeee01e9035a81d099b7560f1d565624cddb19ccdea7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=29c70c4ff6224a7472bb3ef9a786470ec1982e798ba7f5b5c201e705652893 + +handshake=Noise_IKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b6d56750cabed6b4793bbd0a78c250ac5e2c53aa8df8fe0dbf15189011623c31add3ba342c9a3fb5240aa60aed3fd2994802c34a962c15dcd90edcb5102cf74 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669342a3df6cec558ad000387398eccccc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76071f1a7fb9d854f0e0395d7ad43deedbfbaa09b6ea187f565f6c009021ba +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49bde06081a37ef1bdf6670df3b2a2c3879505befdf77187d44f8f125f2d2e + +handshake=Noise_IKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442c6abbd4f501864a318f49084d6edc465d6025bf9bfa58f08855e3924c965535125a8f083041204dad6d4fdbdf4c0a23088b534967aea9b6b9ec67ff60dee46 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a536a2718f2256fb71d2b3e3e5ba163 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b723cbfbb75b3039c733be62919a5dc997419469b0a4efd0d12cb1937fb5df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=91532e9187412d8c91f8bf3064080b68d73bd677ed63ddfb60d7ac0ed6cc04 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254575510fd1ee7b381c333b77018908687c0a9aea3af69511201e97caa4a743e105d069f494432d8859fc610b81fed1f5e249dac1a2217ff72505457f145fda872 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cdbfa3b6cd68bdbc191a6441920da40d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c0a06e03b33924f95bede35f78563a6ec56fa623cc46cf09f55fc08ed8011d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d1f5f192af4b598d2e29afd9105617216708839d508f2073784a18a6a6fa6a + +handshake=Noise_IK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e4c987aee1def7f4451e94e52f2edcf3f88abd36f9a83613afec5cfba3d156ca3241a67c80714c7daf3a9695237fa6a466154654a805c143d8a92a12ba607ce52fa4921f215ec4b41789 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b54fb4d11ab95fa5013849718dfcbfb57b0aa6d423cc6b1e5c74 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=410d4ee9df61c268dddeee01e9035a81d099b7560f1d565624cddb19ccdea7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=29c70c4ff6224a7472bb3ef9a786470ec1982e798ba7f5b5c201e705652893 + +handshake=Noise_IKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b6d56750cabed6b4793bbd0a78c250ac5e2c53aa8df8fe0dbf15189011623c31add3ba342c9a3fb5240aa60aed3fd29aab66f9942bb0346812f1f380a6216514fc7f1ee5c4e064bbd26 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672547a8e33283d797b8c1a6219c6904161528f9da68ac5ab35db +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76071f1a7fb9d854f0e0395d7ad43deedbfbaa09b6ea187f565f6c009021ba +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49bde06081a37ef1bdf6670df3b2a2c3879505befdf77187d44f8f125f2d2e + +handshake=Noise_IKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442c6abbd4f501864a318f49084d6edc465d6025bf9bfa58f08855e3924c965535125a8f083041204dad6d4fdbdf4c0a27282a568a006a2474d8305595ab4f5cf185f555b3369608e9f39 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846650bf4a2aba8abe046d9ddb3d73ca2c8754fea6c5fc5af7f07538 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b723cbfbb75b3039c733be62919a5dc997419469b0a4efd0d12cb1937fb5df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=91532e9187412d8c91f8bf3064080b68d73bd677ed63ddfb60d7ac0ed6cc04 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254575510fd1ee7b381c333b77018908687c0a9aea3af69511201e97caa4a743e105d069f494432d8859fc610b81fed1f5efc5c147038b683952ec2099209d2146ad862d95293ec3c38175d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d9312e9888b0b56ce23cb101090c86a3a7f5e0f4df15ee88b3ee +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c0a06e03b33924f95bede35f78563a6ec56fa623cc46cf09f55fc08ed8011d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d1f5f192af4b598d2e29afd9105617216708839d508f2073784a18a6a6fa6a + +handshake=Noise_IK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e4c987aee1def7f4451e94e52f2edcf3f88abd36f9a83613afec5cfba3d156ca23c0cff39fe89439ce3a8aa083ba16fb93ea47b2f5e9b5b64b91f53e6c3cdf12 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846604e05abd3e92d415e1b7c232d6e91964 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=410d4ee9df61c268dddeee01e9035a81d099b7560f1d565624cddb19ccdea7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=29c70c4ff6224a7472bb3ef9a786470ec1982e798ba7f5b5c201e705652893 + +handshake=Noise_IKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b6d56750cabed6b4793bbd0a78c250ac5e2c53aa8df8fe0dbf15189011623c31c03513c168584cbece10798ab45fc2ac41aacfc87f02840a8e1df005b094a9b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466642b389be08a294dcb65f508382fac63 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76071f1a7fb9d854f0e0395d7ad43deedbfbaa09b6ea187f565f6c009021ba +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49bde06081a37ef1bdf6670df3b2a2c3879505befdf77187d44f8f125f2d2e + +handshake=Noise_IKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442c6abbd4f501864a318f49084d6edc465d6025bf9bfa58f08855e3924c965531dcb0438a43fefd352e9e6a79b98bd1b2c476b239cbe1cbcbbb5ddfa78064e40 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692389a661fad3c014072134790eeeff6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b723cbfbb75b3039c733be62919a5dc997419469b0a4efd0d12cb1937fb5df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=91532e9187412d8c91f8bf3064080b68d73bd677ed63ddfb60d7ac0ed6cc04 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254575510fd1ee7b381c333b77018908687c0a9aea3af69511201e97caa4a743e103248ca4db0040cfd5fdc65d4dcf88051c39cb96747255580863f7a34c7bc56f7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ed376bd9b78fd69ba3b5a38d84c93fd1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c0a06e03b33924f95bede35f78563a6ec56fa623cc46cf09f55fc08ed8011d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d1f5f192af4b598d2e29afd9105617216708839d508f2073784a18a6a6fa6a + +handshake=Noise_IK_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e4c987aee1def7f4451e94e52f2edcf3f88abd36f9a83613afec5cfba3d156ca23c0cff39fe89439ce3a8aa083ba16fb66154654a805c143d8a926195b37d8d08a4fcdefff201de9f069 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b54fb4d11ab95fa50138358319a81593d62664ca0ad72f63c8d5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=410d4ee9df61c268dddeee01e9035a81d099b7560f1d565624cddb19ccdea7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=29c70c4ff6224a7472bb3ef9a786470ec1982e798ba7f5b5c201e705652893 + +handshake=Noise_IKpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b6d56750cabed6b4793bbd0a78c250ac5e2c53aa8df8fe0dbf15189011623c31c03513c168584cbece10798ab45fc2aaab66f9942bb0346812f14630b559db512874d6eca353bdb7135 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672547a8e33283d797b8c646ae93be9f51723c08fc117b388c36c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76071f1a7fb9d854f0e0395d7ad43deedbfbaa09b6ea187f565f6c009021ba +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49bde06081a37ef1bdf6670df3b2a2c3879505befdf77187d44f8f125f2d2e + +handshake=Noise_IKpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442c6abbd4f501864a318f49084d6edc465d6025bf9bfa58f08855e3924c965531dcb0438a43fefd352e9e6a79b98bd1b7282a568a006a2474d83f1e95944af542ae2a5c246afa7b1242a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846650bf4a2aba8abe046d9d847c49963b2b21211eb16f5bb7b42cf9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b723cbfbb75b3039c733be62919a5dc997419469b0a4efd0d12cb1937fb5df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=91532e9187412d8c91f8bf3064080b68d73bd677ed63ddfb60d7ac0ed6cc04 + +handshake=Noise_IKpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254575510fd1ee7b381c333b77018908687c0a9aea3af69511201e97caa4a743e103248ca4db0040cfd5fdc65d4dcf88051fc5c147038b683952ec2a1de96b1f5804dc4dd69ce7bbe8de7ab +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d9312e9888b0b56ce23cedf9537317b8b0121d90405c3e5e89df +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c0a06e03b33924f95bede35f78563a6ec56fa623cc46cf09f55fc08ed8011d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d1f5f192af4b598d2e29afd9105617216708839d508f2073784a18a6a6fa6a + +handshake=Noise_XX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466881a9849f98286c79700c48c40e6667ce14ce8baabdf27b51fb80d248c2d56a65be777dc2ad2438d794410a91e1542a138b33b73a5ff808ecff2e90952defca9 +msg_2_payload= +msg_2_ciphertext=a0c7c991f077df03c26762bb80c9dc4c830c71a012dc1a002363a684c659a3487c8a7c790075c7a5ac8de6fe1ccc7363d39bea6035a91323f511f662ee40d9de +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d52095f5c41973904a84746d988f0e424ec0832c3257cb4675eab76c4c197f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e1a5d80c71d13bde2e6b2559ecc953b97939de528e1ae166a64540265918 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625494973748946c53f4c3f0db3c62e50099 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466289a21b67ebcd303874b2b58d5ad4c6aa597823a9fdb77f2a5206bd199cefd0afa1402a0672f9df8bbbe4c6dc9e40fee220c5650cf918735768cbb4d0304bace +msg_2_payload= +msg_2_ciphertext=72e8d243ded18bf346c63e43042561f1f7eea7d61e499ba2e51f6819a5c556ce2a5e04c824b6c100e0a798bba881e39592214a04d798571575590d2490a76084 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c8c6894b90eb696c12292043bbb40f9a328aa548a3d0a3f71ef025a9b504f2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb30fc91a2a3fe04b50793a90835418f73173af49782a9655469ef389b0f8b + +handshake=Noise_XXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625477ffea436edf0c2502c18ab6c5ea925c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661bb41bc44a3c6bf571d96d127cc540711c9d29c6b5225a7ca69f1a8eba6ba143c76b96f3a32b34d0a54da910155fb59ca7e36e03928fb6b456c7a0a6d8cd6bcc +msg_2_payload= +msg_2_ciphertext=68bbb40ac1a9fa5f73a62c7619412ceeef08851e539edae876d22a77589b714b29fc73ebc63fd53703760dfb5b113f810304b5bb64f002f0b9c005f5109bf09b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b80aad9eee02c2105326ce8b8742f79c648df188075c60ce036070737da384 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a90ba8d19bd5fcac4dab5203f7ad6311a0b2ba489b05dbe7718d06a0fbc001 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b142f929c44494d1a0458dcce84eb647 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e309552812f7796950972a8683660efcd19841b13a0f8b4e73ff2283d4240da0f3bc5a07c22a22b596eff3de2e5f32ffd0a5573ecd32dddd5996bfa5dcf6cb5 +msg_2_payload= +msg_2_ciphertext=42f39db26ff8d341399e35badb4d01392349af4a4d9ccc8fa34dedf38bb22fa0dc88a7767b9a4fa2ed8c03164ddad3762f658cd9af264c06ba838caee5b5924c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5b7e08b5f8473fcfb9ea1d921aca681d220045c2c99c052067cab897f57a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=68f4d64bdc52e4db8618374df2693239e2abfb769adce30ba36709ce94b09d + +handshake=Noise_XXpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548eb7890b9ae7c832d44eb674f849b235 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a5c4a9bed2e487576db434ac38ce4e27e65e3aa233acd74dd5ff515a90ce1ed94189db4ce2e6ab986fa649ad0ce12cc986cba0a6f543f5781327884b9160eec +msg_2_payload= +msg_2_ciphertext=5c234f66a0c1f8603e407c1aa7d44a6121e170b15a28d903e58fbe52d03111690e20f382d3b0a221cadcb887ec014029a54bcf1904980c34b4a3b23194ca4860 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15d59f30f156bfa9065631ed3cb2342e82fb2cf850e0ed2a37b5d21caacce3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=252a53c772510b5322ed3ff20b30d1e3d2d370e6684bf640201ad04b613b02 + +handshake=Noise_XX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466881a9849f98286c79700c48c40e6667ce14ce8baabdf27b51fb80d248c2d56a6d35f521ebb5ab02d7db36ad16024c4f73cf130e8e1cb1b62a54aae4524ddefdb92d2eb92b80c99d9dff8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a0c7c991f077df03c26762bb80c9dc4c830c71a012dc1a002363a684c659a3483672cd61275f36c652ad0226320581534b172fee0f1c41b654c5884d78edc65fda9770c1ba6e96ffd7ff +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d52095f5c41973904a84746d988f0e424ec0832c3257cb4675eab76c4c197f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e1a5d80c71d13bde2e6b2559ecc953b97939de528e1ae166a64540265918 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548481c4600f085d1c599bb7c9826aa10f1b0d6ff4167bb1824989 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466289a21b67ebcd303874b2b58d5ad4c6aa597823a9fdb77f2a5206bd199cefd0ab2d2062f3146f66ddc482f2f08dcae5c42dbd90643a806d4efd3565e01a0441cd9d8711b2e53f6328308 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=72e8d243ded18bf346c63e43042561f1f7eea7d61e499ba2e51f6819a5c556ce815d16cb6e27ec20aedeedcba498f2be70fa8af7396bc363498528a37b435784f4802d9ffa89f8f4149a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c8c6894b90eb696c12292043bbb40f9a328aa548a3d0a3f71ef025a9b504f2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb30fc91a2a3fe04b50793a90835418f73173af49782a9655469ef389b0f8b + +handshake=Noise_XXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c0b0e441f5fa603216153e4aec070f29385fdeda4a5a812f1ba +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661bb41bc44a3c6bf571d96d127cc540711c9d29c6b5225a7ca69f1a8eba6ba1433eb446aea3823040decee92311318e59e89c2ba5f9c3bb8bae87f18ad6a2cbc3385f74e2908927bfa971 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=68bbb40ac1a9fa5f73a62c7619412ceeef08851e539edae876d22a77589b714b37b451c385c4004eeb865c67ea744f95bd6dddfc711abc8dd6d43636752808a6aa598904665ea8adc38c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b80aad9eee02c2105326ce8b8742f79c648df188075c60ce036070737da384 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a90ba8d19bd5fcac4dab5203f7ad6311a0b2ba489b05dbe7718d06a0fbc001 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aaf69bdfb1097bc7ef7434c8f6b361d3c56765dfc22ff727fda7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e309552812f7796950972a8683660efcd19841b13a0f8b4e73ff2283d4240da30a2370fbbb64cc5290c58f4b1384bfb236d208257a60fdea450b3fa9a436f78914a07c1556ed6ee1626 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=42f39db26ff8d341399e35badb4d01392349af4a4d9ccc8fa34dedf38bb22fa045dab2ec12ba7a2c3648f1f3b838659f7ff333033cc7d08e83621a3c06ba34a810cb6f196149579160b1 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5b7e08b5f8473fcfb9ea1d921aca681d220045c2c99c052067cab897f57a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=68f4d64bdc52e4db8618374df2693239e2abfb769adce30ba36709ce94b09d + +handshake=Noise_XXpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a7c911d94ce4484b53ba5071c24ac9bc5450ae8c596d0f81b28f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a5c4a9bed2e487576db434ac38ce4e27e65e3aa233acd74dd5ff515a90ce1ed7c9313a3a276333eec17fbd506ae3517e58f3e80b076f721352751eb6389ba9c629325042ede03308001 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5c234f66a0c1f8603e407c1aa7d44a6121e170b15a28d903e58fbe52d03111691892f24cc3ab41fc4cc57e270fc4dc61d449cc67794d27fa94cbafc9d3144cbda3f0099a09043f63a0df +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15d59f30f156bfa9065631ed3cb2342e82fb2cf850e0ed2a37b5d21caacce3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=252a53c772510b5322ed3ff20b30d1e3d2d370e6684bf640201ad04b613b02 + +handshake=Noise_XX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466881a9849f98286c79700c48c40e6667ce14ce8baabdf27b51fb80d248c2d56a603c1a5efe2c15f405d2aff0296f0dbcf6069f8aca95b8c7a930fb910d8032f87 +msg_2_payload= +msg_2_ciphertext=a0c7c991f077df03c26762bb80c9dc4c830c71a012dc1a002363a684c659a348ee08e3a592efd47624fd916ad05e0240000f553c46da776c0323202e72efebf2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d52095f5c41973904a84746d988f0e424ec0832c3257cb4675eab76c4c197f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e1a5d80c71d13bde2e6b2559ecc953b97939de528e1ae166a64540265918 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b618e6f51bc8446b0ddfcbec9b3734a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466289a21b67ebcd303874b2b58d5ad4c6aa597823a9fdb77f2a5206bd199cefd0ac4e0efeeeae405223369ce0be060b3aaf167673c34a317c406380ae734fe4b1f +msg_2_payload= +msg_2_ciphertext=72e8d243ded18bf346c63e43042561f1f7eea7d61e499ba2e51f6819a5c556ce6ffa24ddbaa0238ab82e992c850c29e8b51d12483c258a10b9bb026c8a801247 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c8c6894b90eb696c12292043bbb40f9a328aa548a3d0a3f71ef025a9b504f2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb30fc91a2a3fe04b50793a90835418f73173af49782a9655469ef389b0f8b + +handshake=Noise_XXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ab765d8d10260f702bba6591780b98dc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661bb41bc44a3c6bf571d96d127cc540711c9d29c6b5225a7ca69f1a8eba6ba143cd1aca7fb41b0ddd8031a718b144492ce2f62f7d6ef980460e65216c20f9c7e7 +msg_2_payload= +msg_2_ciphertext=68bbb40ac1a9fa5f73a62c7619412ceeef08851e539edae876d22a77589b714b82eccf7bc87129c069f11a8cc539a147bc1efeccfa736f370deef88a0acc8784 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b80aad9eee02c2105326ce8b8742f79c648df188075c60ce036070737da384 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a90ba8d19bd5fcac4dab5203f7ad6311a0b2ba489b05dbe7718d06a0fbc001 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ff7a4d153ade1ea6e96c452a20a8e3bc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e309552812f7796950972a8683660efcd19841b13a0f8b4e73ff2283d4240dac7bb45f67bb45b70fb4d2ebb27cc04b6ee40c5754c3a4f2692e05c045968574b +msg_2_payload= +msg_2_ciphertext=42f39db26ff8d341399e35badb4d01392349af4a4d9ccc8fa34dedf38bb22fa05e4d9f9a35ea24dccc479fbc9e2a65efcb4872b86cd77d8422fdfa7ee43a052e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5b7e08b5f8473fcfb9ea1d921aca681d220045c2c99c052067cab897f57a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=68f4d64bdc52e4db8618374df2693239e2abfb769adce30ba36709ce94b09d + +handshake=Noise_XXpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625453a789a04c5ca870fc4e845827e25976 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a5c4a9bed2e487576db434ac38ce4e27e65e3aa233acd74dd5ff515a90ce1ed33f7a9ba95b680aabfdcd6faf180864ccfa6e32cf5dd2015069240ad2bde63dc +msg_2_payload= +msg_2_ciphertext=5c234f66a0c1f8603e407c1aa7d44a6121e170b15a28d903e58fbe52d031116938bd08876647a8f9b53897ba3b993bc00824f3e9ad26f887175203ddd58e400e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15d59f30f156bfa9065631ed3cb2342e82fb2cf850e0ed2a37b5d21caacce3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=252a53c772510b5322ed3ff20b30d1e3d2d370e6684bf640201ad04b613b02 + +handshake=Noise_XX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466881a9849f98286c79700c48c40e6667ce14ce8baabdf27b51fb80d248c2d56a6760edec0b63677b285a157e0c68bd18f3cf130e8e1cb1b62a54aec0aa715200fa9e0095e353bd5cc6c99 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a0c7c991f077df03c26762bb80c9dc4c830c71a012dc1a002363a684c659a348806b2304b1b50e1273f35f0e9c1fb86b4b172fee0f1c41b654c5ea91e10467f8911bcd6ff4fd0df18794 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d52095f5c41973904a84746d988f0e424ec0832c3257cb4675eab76c4c197f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e1a5d80c71d13bde2e6b2559ecc953b97939de528e1ae166a64540265918 + +handshake=Noise_XXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548481c4600f085d1c599b05cb00d2513b8084b6169bfc5bb7c585 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466289a21b67ebcd303874b2b58d5ad4c6aa597823a9fdb77f2a5206bd199cefd0a6b7ae867af93fabe3076dd8e7e0eb2d342dbd90643a806d4efd3cd2e89fa996d73ad84120ea05d413ad7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=72e8d243ded18bf346c63e43042561f1f7eea7d61e499ba2e51f6819a5c556ced607e93b2dfaa12a116a8ed4abdfde1370fa8af7396bc36349858ddaaf9086bf4bbc1bbaf725de27b117 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c8c6894b90eb696c12292043bbb40f9a328aa548a3d0a3f71ef025a9b504f2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=fb30fc91a2a3fe04b50793a90835418f73173af49782a9655469ef389b0f8b + +handshake=Noise_XXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c0b0e441f5fa60321617cd5aaa5126df6112f9fd7d4a4060d0f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661bb41bc44a3c6bf571d96d127cc540711c9d29c6b5225a7ca69f1a8eba6ba143c81802b4196029f4dd49cda7a9667171e89c2ba5f9c3bb8bae87d62743fbd6c41b29b90e28abe5c53789 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=68bbb40ac1a9fa5f73a62c7619412ceeef08851e539edae876d22a77589b714b64215da6697d5de8b5859e3a18fa350cbd6dddfc711abc8dd6d44805dd2117144b1abdcbfa863f2724c6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b80aad9eee02c2105326ce8b8742f79c648df188075c60ce036070737da384 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a90ba8d19bd5fcac4dab5203f7ad6311a0b2ba489b05dbe7718d06a0fbc001 + +handshake=Noise_XXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aaf69bdfb1097bc7ef744544458a0e3b93b54da858c0219c4f9c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e309552812f7796950972a8683660efcd19841b13a0f8b4e73ff2283d4240da4aad79ffed55b9f1d7e9257f49e341c6236d208257a60fdea4509d21ea64a04dae01a87b8fc3c7c564aa +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=42f39db26ff8d341399e35badb4d01392349af4a4d9ccc8fa34dedf38bb22fa06e9d56dd6bee77cbb228ac33eac073e67ff333033cc7d08e836232bfc71b12fed59ee9c98d159775d03e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5b7e08b5f8473fcfb9ea1d921aca681d220045c2c99c052067cab897f57a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=68f4d64bdc52e4db8618374df2693239e2abfb769adce30ba36709ce94b09d + +handshake=Noise_XXpsk3_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a7c911d94ce4484b53ba1d3eb5d88b66cf8083a3af2f7cbe4ef7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a5c4a9bed2e487576db434ac38ce4e27e65e3aa233acd74dd5ff515a90ce1edb208e022f907532a068c7498e0aaea01e58f3e80b076f721352785c23cf88eb4fff0dce143e9eea6735b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5c234f66a0c1f8603e407c1aa7d44a6121e170b15a28d903e58fbe52d031116999fbc2a23fe6dd1a2e8347383b1add8bd449cc67794d27fa94cb501bb6b0dcf7e6704b3f454f28b7ca74 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15d59f30f156bfa9065631ed3cb2342e82fb2cf850e0ed2a37b5d21caacce3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=252a53c772510b5322ed3ff20b30d1e3d2d370e6684bf640201ad04b613b02 + +handshake=Noise_IX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1ce2a834dd79601d96e93cd87f9cb5ab910a94dc1c3aff65cc8a8bbfaa3f92d5f27af354133ca719324555c65ffd2c1d2e472871b0412ac82c4816c798656cc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9466b89d06e6480bd641be5427af829d10cb3587147334a8cb22d12be0a8c0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=988653bd8c786f07f5fd3978d4b4c2ef5fcc54e922bdc51a3bfebf88775773 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e17609d47e41aefd58600f2429a4079e30bc7c7a54960092f478e3a8b2ac897e5d02f331ca4f071810c4400747db69f287bb7bd2613b9bb9696f1d0332ffb49f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665b8c37f4b30ec0d0e7bd2c2df58f36c5c07cf55d88f33c1f25e4a7028d4ebf27e6499b388d97612d0d8e3d843613fcc10c85952bdb9f6ff4e6224a6673acf072 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d897592021d2ac4f4d5806105f48371c29282a6a72ec4f5774248ffa172dab +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=53c1f9f52e81ed46781adf8ea6bdd05c62b6e4f504cea15bacb669e4c41cde + +handshake=Noise_IXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e0e42ae7efaf198ba4628458bbd2824d836e24f1c558674ce8a6718178a8df958bff6c92b1f83c27b67e9c635956e1e37e2949990529f155b14bbd460b2c8207 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664ad11b977ffd27f6732871a81fdea7702e2867e4953a6268ef1ac334632de746ac9811a6548b94151edf998a1c6f8a42f28cc714bc91e0baf43948a61acaf54 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4933a12a52fcc1e5088e9cc6811d542e3a8bafd64b821795fed855c8c07d98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fb9d7a40d84a9f6e1cbf0a74b327d0ce75b191ad37cb6a333730e196a2b95d + +handshake=Noise_IXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ef2ddaa7167ce00a9dae6705805e8745f6dcbfc15a0fdb870a2a1d5a2248ccb625ad8a5a599f93caf0cb7c9108cb22aa3d483270bc7b0049b0a04a352df3999 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846642fbf7969708ccb5848f5e2c10ad358337b3581e939885f51562ea7973968931934c8bb5c7a2fe76a9afff12ef17bf773abfb17d03ba3f70b59672de1948cda8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7ccfa4fa03625064a116414a6ee0409c6d6c0f5398fb68aef65e271d8efad9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=571d9e1c4ff1f12c8cfbdfecb1d040d0dc86a41ab6efff8af515db514a2120 + +handshake=Noise_IX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1ce2a834dd79601d96e93cd87f9cb5ab910a94dc1c3aff65cc8a8bbfaa3f92d13220a1c98e2da8ff11520cdaf69c8edb270e4f47968b021af7801dd1a7ea41817d4107a6784b31d7a25 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9466b89d06e6480bd641be5427af829d10cb3587147334a8cb22d12be0a8c0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=988653bd8c786f07f5fd3978d4b4c2ef5fcc54e922bdc51a3bfebf88775773 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e17609d47e41aefd58600f2429a4079e30bc7c7a54960092f478e3a8b2ac897e5d02f331ca4f071810c4400747db69f2a960f5fe61a3d4eb096bda1618b89957324fa42142a4479e58d8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665b8c37f4b30ec0d0e7bd2c2df58f36c5c07cf55d88f33c1f25e4a7028d4ebf27d47ef437c44564d6b9824c813474b23c75ec7a42f32f740ddeb7cb029e46da19400b0548da6fa9d33040 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d897592021d2ac4f4d5806105f48371c29282a6a72ec4f5774248ffa172dab +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=53c1f9f52e81ed46781adf8ea6bdd05c62b6e4f504cea15bacb669e4c41cde + +handshake=Noise_IXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e0e42ae7efaf198ba4628458bbd2824d836e24f1c558674ce8a6718178a8df958bff6c92b1f83c27b67e9c635956e1e3ea0ae732463351778665fb6c549220bda51ca4dab499127b2e90 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664ad11b977ffd27f6732871a81fdea7702e2867e4953a6268ef1ac334632de742025999d290bfb83d5e00b52aeca7dcd506a082856b65911e0cc85a7d923d2285550161acb482e4ee0d1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4933a12a52fcc1e5088e9cc6811d542e3a8bafd64b821795fed855c8c07d98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fb9d7a40d84a9f6e1cbf0a74b327d0ce75b191ad37cb6a333730e196a2b95d + +handshake=Noise_IXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ef2ddaa7167ce00a9dae6705805e8745f6dcbfc15a0fdb870a2a1d5a2248ccb625ad8a5a599f93caf0cb7c9108cb22ac70f73b4d75fe9d0d019cab3ef8980a988842f9351e17a45d19b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846642fbf7969708ccb5848f5e2c10ad358337b3581e939885f51562ea797396893193f4a2cd2f7319f95f91545a426303b6f353dc9027ccba95e44993f61a51cf71b82a4af7d8f51471419f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7ccfa4fa03625064a116414a6ee0409c6d6c0f5398fb68aef65e271d8efad9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=571d9e1c4ff1f12c8cfbdfecb1d040d0dc86a41ab6efff8af515db514a2120 + +handshake=Noise_IX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1ce2a834dd79601d96e93cd87f9cb5ab910a94dc1c3aff65cc8a8bbfaa3f92d3ee79db4b8ef12dff465ece323fd782781b410bdbe128fac6ed4aafa2e5d1036 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9466b89d06e6480bd641be5427af829d10cb3587147334a8cb22d12be0a8c0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=988653bd8c786f07f5fd3978d4b4c2ef5fcc54e922bdc51a3bfebf88775773 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e17609d47e41aefd58600f2429a4079e30bc7c7a54960092f478e3a8b2ac897e0f793c7eca1b142371f5c7adcd39ef2d85d2cc45261b4c844d26a700b8080a71 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665b8c37f4b30ec0d0e7bd2c2df58f36c5c07cf55d88f33c1f25e4a7028d4ebf27f63b0c7c9fc405892f9a45dbb3136db02e186f41f5852fcb61148c13c2faaf05 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d897592021d2ac4f4d5806105f48371c29282a6a72ec4f5774248ffa172dab +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=53c1f9f52e81ed46781adf8ea6bdd05c62b6e4f504cea15bacb669e4c41cde + +handshake=Noise_IXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e0e42ae7efaf198ba4628458bbd2824d836e24f1c558674ce8a6718178a8df95a92bf930313b0c166e327b6df9e230fd99f3adef07e10e98d8a6cc5cfcdcefd2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664ad11b977ffd27f6732871a81fdea7702e2867e4953a6268ef1ac334632de74f47e0a7d1f82839c24edf89e23718f37aa90feb7e4b0172a8c7efff3c9950443 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4933a12a52fcc1e5088e9cc6811d542e3a8bafd64b821795fed855c8c07d98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fb9d7a40d84a9f6e1cbf0a74b327d0ce75b191ad37cb6a333730e196a2b95d + +handshake=Noise_IXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ef2ddaa7167ce00a9dae6705805e8745f6dcbfc15a0fdb870a2a1d5a2248ccb39325f84a4fef594c2b2505ed80a82f52d378b7ebd94fca5ed054c5d4b25e62f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846642fbf7969708ccb5848f5e2c10ad358337b3581e939885f51562ea7973968931420324746210e7aba862fcae3756f99d879260a2abc0e93d159e764c3945cf3b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7ccfa4fa03625064a116414a6ee0409c6d6c0f5398fb68aef65e271d8efad9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=571d9e1c4ff1f12c8cfbdfecb1d040d0dc86a41ab6efff8af515db514a2120 + +handshake=Noise_IX_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1ce2a834dd79601d96e93cd87f9cb5ab910a94dc1c3aff65cc8a8bbfaa3f92d75c33e2c9a58e7a754fa198b475f15a1b270e4f47968b021af78afd7c7783d1c26ef47324aa3e92a9b2a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9466b89d06e6480bd641be5427af829d10cb3587147334a8cb22d12be0a8c0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=988653bd8c786f07f5fd3978d4b4c2ef5fcc54e922bdc51a3bfebf88775773 + +handshake=Noise_IXpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e17609d47e41aefd58600f2429a4079e30bc7c7a54960092f478e3a8b2ac897e0f793c7eca1b142371f5c7adcd39ef2da960f5fe61a3d4eb096b2d9222aa6220a4baede9117fd8b82f70 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665b8c37f4b30ec0d0e7bd2c2df58f36c5c07cf55d88f33c1f25e4a7028d4ebf273fa04865b7cd6c2c521234163b0cf18975ec7a42f32f740ddeb7bcabc5810784ac068eaf9430c51a17f7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d897592021d2ac4f4d5806105f48371c29282a6a72ec4f5774248ffa172dab +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=53c1f9f52e81ed46781adf8ea6bdd05c62b6e4f504cea15bacb669e4c41cde + +handshake=Noise_IXpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e0e42ae7efaf198ba4628458bbd2824d836e24f1c558674ce8a6718178a8df95a92bf930313b0c166e327b6df9e230fdea0ae732463351778665999485bd22d3214b8adf6b4789850649 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664ad11b977ffd27f6732871a81fdea7702e2867e4953a6268ef1ac334632de74804554e9834e401fd69f2fe7a4a65824506a082856b65911e0cc771287e7443e22c12bc684a7d034728b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4933a12a52fcc1e5088e9cc6811d542e3a8bafd64b821795fed855c8c07d98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fb9d7a40d84a9f6e1cbf0a74b327d0ce75b191ad37cb6a333730e196a2b95d + +handshake=Noise_IXpsk2_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ef2ddaa7167ce00a9dae6705805e8745f6dcbfc15a0fdb870a2a1d5a2248ccb39325f84a4fef594c2b2505ed80a82f5c70f73b4d75fe9d0d0195324b867f091e0873e8ce23e989739f5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846642fbf7969708ccb5848f5e2c10ad358337b3581e939885f51562ea797396893112d7906e33b4b68026c9dd8783d6f307f353dc9027ccba95e449ab7b3308c2a2f866863cad318e811cb6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7ccfa4fa03625064a116414a6ee0409c6d6c0f5398fb68aef65e271d8efad9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=571d9e1c4ff1f12c8cfbdfecb1d040d0dc86a41ab6efff8af515db514a2120 + +handshake=Noise_N_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a69eac07dc78694d6a30a4c7f2120bc4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=53dc944be58d1292365d6a5096b1d990353d826dd51e0cfeef9820d480d814 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0ac777bf15a2f8e9ae4c0fd7d53aa4b6b61cbb33ea1e64f726aa51cb6c3b57 + +handshake=Noise_Npsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548ee4ea4ef70d80e3be3383136c01dba7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7b2521d4d92735ed21e8ef9b635353c6cbbe6ba708e234d8d30c593af6091c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5a66f48e7581384a50a8a6197a76a21fe6e109f3b3c9c89cd335845970a875 + +handshake=Noise_Npsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254341b1bfc14a6369937b021c81f3b19a0 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f2a1148bdbfaf3843292d3ad1d665cb11a83f1a412c3f9c04f6b876a91ff00 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=caa8b41e1b5d2289d4f8e91ee4587dbc6335873e1a9b1f9f4a220d3cbbdd2d + +handshake=Noise_N_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254059099a62768f40676c0696be1c8076e4620fb27faad0ae8abb2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=53dc944be58d1292365d6a5096b1d990353d826dd51e0cfeef9820d480d814 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0ac777bf15a2f8e9ae4c0fd7d53aa4b6b61cbb33ea1e64f726aa51cb6c3b57 + +handshake=Noise_Npsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cff66e55f9165514342e82b98a436b78c1172bd9a5d44538c499 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7b2521d4d92735ed21e8ef9b635353c6cbbe6ba708e234d8d30c593af6091c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5a66f48e7581384a50a8a6197a76a21fe6e109f3b3c9c89cd335845970a875 + +handshake=Noise_Npsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542bf8c34c79ce1dd4da49f8ed9dfdbbe608500f4aeb3610f2ebf5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f2a1148bdbfaf3843292d3ad1d665cb11a83f1a412c3f9c04f6b876a91ff00 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=caa8b41e1b5d2289d4f8e91ee4587dbc6335873e1a9b1f9f4a220d3cbbdd2d + +handshake=Noise_N_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c927ef8c933450ef29c8fe116405cad6 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=53dc944be58d1292365d6a5096b1d990353d826dd51e0cfeef9820d480d814 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0ac777bf15a2f8e9ae4c0fd7d53aa4b6b61cbb33ea1e64f726aa51cb6c3b57 + +handshake=Noise_Npsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fba424bfce5fb315d8c4452c719600d4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7b2521d4d92735ed21e8ef9b635353c6cbbe6ba708e234d8d30c593af6091c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5a66f48e7581384a50a8a6197a76a21fe6e109f3b3c9c89cd335845970a875 + +handshake=Noise_Npsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e88eae4b737047e2ebd9a57e4179dee4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f2a1148bdbfaf3843292d3ad1d665cb11a83f1a412c3f9c04f6b876a91ff00 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=caa8b41e1b5d2289d4f8e91ee4587dbc6335873e1a9b1f9f4a220d3cbbdd2d + +handshake=Noise_N_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254059099a62768f40676c0ad747e00bc4abdc4e547b5d64a203faa +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=53dc944be58d1292365d6a5096b1d990353d826dd51e0cfeef9820d480d814 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0ac777bf15a2f8e9ae4c0fd7d53aa4b6b61cbb33ea1e64f726aa51cb6c3b57 + +handshake=Noise_Npsk0_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cff66e55f9165514342e009262a3b2d4fb0efd940a5ae53f42f7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7b2521d4d92735ed21e8ef9b635353c6cbbe6ba708e234d8d30c593af6091c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5a66f48e7581384a50a8a6197a76a21fe6e109f3b3c9c89cd335845970a875 + +handshake=Noise_Npsk1_25519_AESGCM_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542bf8c34c79ce1dd4da4984d89bde8e3c00ff7204e7e3e7845bf3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f2a1148bdbfaf3843292d3ad1d665cb11a83f1a412c3f9c04f6b876a91ff00 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=caa8b41e1b5d2289d4f8e91ee4587dbc6335873e1a9b1f9f4a220d3cbbdd2d + +handshake=Noise_K_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d181b2326033180d1efb21521b324a92 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=344e43356f1c93c5c345ff96d7671dc700a99d4c1a1e74a1fa6658219a7297 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=93a8163f0e969702549d39bae62a6f15eee1416ad8c1cbd5b545d77145cb16 + +handshake=Noise_Kpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543f880385cbbd4e4627713122b83ca89e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b60ace60531354a67160d9606e0db5d1a2a5949c7cd4bad2ab72bded373f09 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8de8b083b7c4450eadd4d2303cdff7325a8bd5fc54cb13054148818922c255 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bbd32e924225d5cd2f1e57426c23b774 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=13d2fe35d850dd95b05d9368e3cb118febf832bbc8d80810838747b10cbefc +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=970e52003f0ec0f427e4221354eb9ed099864d15a59ae15ed0b732843eb7c8 + +handshake=Noise_K_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5672a9d770969769874994bbccf28d4db2f626566d3c3216351 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=344e43356f1c93c5c345ff96d7671dc700a99d4c1a1e74a1fa6658219a7297 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=93a8163f0e969702549d39bae62a6f15eee1416ad8c1cbd5b545d77145cb16 + +handshake=Noise_Kpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d8c11d84ff6ad4c09d4701841b7e57b976b0012be26f3a63234 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b60ace60531354a67160d9606e0db5d1a2a5949c7cd4bad2ab72bded373f09 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8de8b083b7c4450eadd4d2303cdff7325a8bd5fc54cb13054148818922c255 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6b065ba9cc0c626743f51ce46f94d811eb9452378e4517d832e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=13d2fe35d850dd95b05d9368e3cb118febf832bbc8d80810838747b10cbefc +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=970e52003f0ec0f427e4221354eb9ed099864d15a59ae15ed0b732843eb7c8 + +handshake=Noise_K_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254915e0cc0990344b65cbda0733b24186c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=344e43356f1c93c5c345ff96d7671dc700a99d4c1a1e74a1fa6658219a7297 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=93a8163f0e969702549d39bae62a6f15eee1416ad8c1cbd5b545d77145cb16 + +handshake=Noise_Kpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254beaf955b2e97b63a40e509e098e86d26 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b60ace60531354a67160d9606e0db5d1a2a5949c7cd4bad2ab72bded373f09 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8de8b083b7c4450eadd4d2303cdff7325a8bd5fc54cb13054148818922c255 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406637d84bb2b8bacf583b157b5e2db6e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=13d2fe35d850dd95b05d9368e3cb118febf832bbc8d80810838747b10cbefc +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=970e52003f0ec0f427e4221354eb9ed099864d15a59ae15ed0b732843eb7c8 + +handshake=Noise_K_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5672a9d7709697698742cd70ec0be61893c6605698abea0e701 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=344e43356f1c93c5c345ff96d7671dc700a99d4c1a1e74a1fa6658219a7297 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=93a8163f0e969702549d39bae62a6f15eee1416ad8c1cbd5b545d77145cb16 + +handshake=Noise_Kpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d8c11d84ff6ad4c09d4d1c82d14bc3fcc12126c67b2a0b7ed61 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b60ace60531354a67160d9606e0db5d1a2a5949c7cd4bad2ab72bded373f09 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8de8b083b7c4450eadd4d2303cdff7325a8bd5fc54cb13054148818922c255 + +handshake=Noise_Kpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6b065ba9cc0c626743f16dad8f22e8694edcec128ad0134b91f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=13d2fe35d850dd95b05d9368e3cb118febf832bbc8d80810838747b10cbefc +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=970e52003f0ec0f427e4221354eb9ed099864d15a59ae15ed0b732843eb7c8 + +handshake=Noise_X_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544bd123345f7c3f54a2b7c20f234b39aad2ea1bf7a9b83b82620158c18e0389f8faca2f68c69790e392e0e18c31f2b1e5db5eb720b8c88350be14c8c7f54b4e1c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1b4ae7e3fcfa6e15ab023def9162a31e3e34d0842a03269981ad4e7ec16542 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=51198ccfa5d72f8049fcfc80df71db7dcd5e35cda3f9f38684354627f9ee9d + +handshake=Noise_Xpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aea0c63d48d3b1d736b7c1aeae341160ba086d700161ae82ade3efff3235629ffd81d4a1b1e1fb50581c51d774c3293777a02a6bc95c753c273c08d942da964f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=36d0a83e220c3b0e9715e79ac127f50619a62397c7709f43121aa880b0242c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b132a81c4a9cbd2029363179f168112b8b245a15ac51be366f4cb2f09e8f60 + +handshake=Noise_Xpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625464d0a2b152420f100932269d5d383be29d5262c4287efbfc1a4689f88752b5e8e8564a7291e383dc088028b58775c5f40d61430c88439f36b3d04e1cfce91092 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5abf632a1e20300ec96b8849b1debe07702a0474191af8ec95d2120703ac0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0094ea104502c9337f6fdc742e949099f369f0f4c83a9327686b5fa3a39cb3 + +handshake=Noise_X_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544bd123345f7c3f54a2b7c20f234b39aad2ea1bf7a9b83b82620158c18e0389f8faca2f68c69790e392e0e18c31f2b1e5f22a97888834b9a0660e1fcdf45922e722d35e0d2441810979d3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1b4ae7e3fcfa6e15ab023def9162a31e3e34d0842a03269981ad4e7ec16542 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=51198ccfa5d72f8049fcfc80df71db7dcd5e35cda3f9f38684354627f9ee9d + +handshake=Noise_Xpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aea0c63d48d3b1d736b7c1aeae341160ba086d700161ae82ade3efff3235629ffd81d4a1b1e1fb50581c51d774c32937c1f988f1ae61819d1b63d42fa696048336ad771ced9bc5c747b1 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=36d0a83e220c3b0e9715e79ac127f50619a62397c7709f43121aa880b0242c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b132a81c4a9cbd2029363179f168112b8b245a15ac51be366f4cb2f09e8f60 + +handshake=Noise_Xpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625464d0a2b152420f100932269d5d383be29d5262c4287efbfc1a4689f88752b5e8e8564a7291e383dc088028b58775c5f4ef2c2f22b87d9c53accd687b92f198179e55ccc3ca701513b918 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5abf632a1e20300ec96b8849b1debe07702a0474191af8ec95d2120703ac0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0094ea104502c9337f6fdc742e949099f369f0f4c83a9327686b5fa3a39cb3 + +handshake=Noise_X_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544bd123345f7c3f54a2b7c20f234b39aad2ea1bf7a9b83b82620158c18e0389f897297750c1904bab4b5e0f28f2e027d71c9e88c0032221aa15011a8e4c78dffc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1b4ae7e3fcfa6e15ab023def9162a31e3e34d0842a03269981ad4e7ec16542 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=51198ccfa5d72f8049fcfc80df71db7dcd5e35cda3f9f38684354627f9ee9d + +handshake=Noise_Xpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aea0c63d48d3b1d736b7c1aeae341160ba086d700161ae82ade3efff3235629f35e7632c0bd24a52daa0b948ba567229614147a2f9fec0650804c14558e7a4e3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=36d0a83e220c3b0e9715e79ac127f50619a62397c7709f43121aa880b0242c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b132a81c4a9cbd2029363179f168112b8b245a15ac51be366f4cb2f09e8f60 + +handshake=Noise_Xpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625464d0a2b152420f100932269d5d383be29d5262c4287efbfc1a4689f88752b5e86e5ef46c6d25996ebdb230b7431be817301ae3797b93cccfc4ecdf5ca4689916 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5abf632a1e20300ec96b8849b1debe07702a0474191af8ec95d2120703ac0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0094ea104502c9337f6fdc742e949099f369f0f4c83a9327686b5fa3a39cb3 + +handshake=Noise_X_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544bd123345f7c3f54a2b7c20f234b39aad2ea1bf7a9b83b82620158c18e0389f897297750c1904bab4b5e0f28f2e027d7f22a97888834b9a0660ee508b5c4c7f95b0d4d162d91e1123466 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1b4ae7e3fcfa6e15ab023def9162a31e3e34d0842a03269981ad4e7ec16542 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=51198ccfa5d72f8049fcfc80df71db7dcd5e35cda3f9f38684354627f9ee9d + +handshake=Noise_Xpsk0_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aea0c63d48d3b1d736b7c1aeae341160ba086d700161ae82ade3efff3235629f35e7632c0bd24a52daa0b948ba567229c1f988f1ae61819d1b637fb839283a338b00f93f9a7808911c16 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=36d0a83e220c3b0e9715e79ac127f50619a62397c7709f43121aa880b0242c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b132a81c4a9cbd2029363179f168112b8b245a15ac51be366f4cb2f09e8f60 + +handshake=Noise_Xpsk1_25519_AESGCM_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625464d0a2b152420f100932269d5d383be29d5262c4287efbfc1a4689f88752b5e86e5ef46c6d25996ebdb230b7431be817ef2c2f22b87d9c53accd25f4ff987e5fab341d7f7fb4079e5c4b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5abf632a1e20300ec96b8849b1debe07702a0474191af8ec95d2120703ac0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0094ea104502c9337f6fdc742e949099f369f0f4c83a9327686b5fa3a39cb3 + +handshake=Noise_NN_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696b4bba7da775d1f343d26e248da47ba +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f2b3e233b31e5fb721769574df39f8da857cd538d2823ed04707c4f1efe2b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf606bbb94c9f27e8f8387140224a52189f3e5e131d5f9763f9ee83ffef688 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254317efadec3a319c5f4d92f4acde560c7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466755e7b455979bcf38ee9cf17a3b996b6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7fad8a5bf89774b591341ae6b5f9b53d55e70b6307fdb4fe2eee39c0e5bb79 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2da7ec97f80353b4fb9e44a0979a222e6cb7ec3d75b89ecca9a4d9aa7703b5 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ee343cd0b23aa39fd8cf07b1298ec783 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846651f5fc391bfbfd847e43586ac95db7e9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ad35e3ff791bbe3445b2bca0705f592f16908809ecc6d06940d6409849c628 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11feae6a0fb8493a4abbb530087f1d3835c4c62caecbe6f3f4dda89627825f + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625420a46675e8df604263bf11b7ac75590c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660bda10fa532c04667c79bda41d186c00 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bf2a56dc6366625ce68d4911f73aa10b2257c1b46ec516e590c5f94e10e9b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32d8849f8e77aaed40a8294d693acb51de2e22b290b24c779f5019595363f3 + +handshake=Noise_NN_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1385f964ae07e077013e92cfd34fa4d13aea47ab078af9d7bdc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f2b3e233b31e5fb721769574df39f8da857cd538d2823ed04707c4f1efe2b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf606bbb94c9f27e8f8387140224a52189f3e5e131d5f9763f9ee83ffef688 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254edb3ec0cb095fb513bfbb9898c1bdfb76968a05c706c7ccbbb3f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f83f60a9da988d4cc0930126af5a85bcd6e46e1706d1e757c81 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7fad8a5bf89774b591341ae6b5f9b53d55e70b6307fdb4fe2eee39c0e5bb79 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2da7ec97f80353b4fb9e44a0979a222e6cb7ec3d75b89ecca9a4d9aa7703b5 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e18839475af8ae23cf85a15b391081786c60fb05ff38ff3a8166 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466493e02eaf3d3ce6c53105380003732a243a3a3519b790373372a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ad35e3ff791bbe3445b2bca0705f592f16908809ecc6d06940d6409849c628 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11feae6a0fb8493a4abbb530087f1d3835c4c62caecbe6f3f4dda89627825f + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e1ff8dc8fdbd3f5808a80493765e14512c58fa7091d993fbb79b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662ac11941a34258aed21d24c8ad4afccf638c0549785ab2b0dfa7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bf2a56dc6366625ce68d4911f73aa10b2257c1b46ec516e590c5f94e10e9b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32d8849f8e77aaed40a8294d693acb51de2e22b290b24c779f5019595363f3 + +handshake=Noise_NN_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664614a00ba4ea44ad9bf92954701ac9e1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f2b3e233b31e5fb721769574df39f8da857cd538d2823ed04707c4f1efe2b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf606bbb94c9f27e8f8387140224a52189f3e5e131d5f9763f9ee83ffef688 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625449313df1e7a1c4ae4b9f1e8920d00062 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466968db1bd797c81f1b67b2592fb59a167 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7fad8a5bf89774b591341ae6b5f9b53d55e70b6307fdb4fe2eee39c0e5bb79 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2da7ec97f80353b4fb9e44a0979a222e6cb7ec3d75b89ecca9a4d9aa7703b5 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f4d9e059d99a30cba39936c52fa6083 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667292e76b7244b2db0c173bab2da777a9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ad35e3ff791bbe3445b2bca0705f592f16908809ecc6d06940d6409849c628 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11feae6a0fb8493a4abbb530087f1d3835c4c62caecbe6f3f4dda89627825f + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540206ed2f7e2e7b5ad6db890bceeb2c33 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bbbf52db7d5d3002630dbe3b9e02cd98 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bf2a56dc6366625ce68d4911f73aa10b2257c1b46ec516e590c5f94e10e9b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32d8849f8e77aaed40a8294d693acb51de2e22b290b24c779f5019595363f3 + +handshake=Noise_NN_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1385f964ae07e0770131cf56bbcd8d5bd8379757412d0040b43 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f2b3e233b31e5fb721769574df39f8da857cd538d2823ed04707c4f1efe2b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf606bbb94c9f27e8f8387140224a52189f3e5e131d5f9763f9ee83ffef688 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254edb3ec0cb095fb513bfbbcecd94c12bd9847fd51060c21c2911b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f83f60a9da988d4cc09b5792492a4e9b6409b7bc382d937669e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7fad8a5bf89774b591341ae6b5f9b53d55e70b6307fdb4fe2eee39c0e5bb79 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2da7ec97f80353b4fb9e44a0979a222e6cb7ec3d75b89ecca9a4d9aa7703b5 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e18839475af8ae23cf8593f99990833b96cecbed3efd278a3ccb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466493e02eaf3d3ce6c53103983ea03c55afa71148423e8f70f8361 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ad35e3ff791bbe3445b2bca0705f592f16908809ecc6d06940d6409849c628 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11feae6a0fb8493a4abbb530087f1d3835c4c62caecbe6f3f4dda89627825f + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e1ff8dc8fdbd3f5808a811debd72175c932bd7fa62ebdb9b2873 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662ac11941a34258aed21df1cd88b8c9f1a3c167e11a517c3e0152 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bf2a56dc6366625ce68d4911f73aa10b2257c1b46ec516e590c5f94e10e9b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32d8849f8e77aaed40a8294d693acb51de2e22b290b24c779f5019595363f3 + +handshake=Noise_KN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b231ab182aea5eb5058a6125ac8458a7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fa26e5cb486370ec737fd513a5cd5d0fe7d017427cab2b85eaf5047ace1c56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f7a9d96f5c7568769bdd7ce20df60b523b4b52280a088a5e2ab56711a80714 + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ec0b218b090f45287bb2306c93544b4c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0b9cffb44e4b2eeac1b962afcc87a27 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=52e8407c63693cd38f27a5315b73673dc02e994ef3f5c4713bf6638e95ce08 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f76678abb5d0cabbfa56bc6440c645fe8b1f05fc3e009b7414563e906ba769 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e8239d9793920e4c2d84ed8d8324b94b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666d84a1c9d27bc55b48b65cadb4a4d89c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d79d5ec5a8232269e46915e59d094941db2dcb0b171290dfed713b4446f6cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9c65816526946ffbdf3aac6904c4a12dcf5e447c7c30ecd25095493cea7790 + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254991b83d25a380fe7648c0dfcb9c155ab +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846652987ffb3b9f76e78d7121db589f4ac5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1a1745e5a72f77f23188f4ba70bf52e6129ad531108fdc545e5dee96bedbb4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05ced6b098b70097cf392ead659322b4f18485dc75bf8c6bf327debd0bf4cb + +handshake=Noise_KN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645fa9c2a20a197a1e0baa22bafe33ee7acaedae932270b7c48f2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fa26e5cb486370ec737fd513a5cd5d0fe7d017427cab2b85eaf5047ace1c56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f7a9d96f5c7568769bdd7ce20df60b523b4b52280a088a5e2ab56711a80714 + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452c9fd84d58429beb1142b609a4863e7041b426ebeb347907ae7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f2455d2b3e74bed0cd965ad0906fdd426f1f658e2e90003dcf9e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=52e8407c63693cd38f27a5315b73673dc02e994ef3f5c4713bf6638e95ce08 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f76678abb5d0cabbfa56bc6440c645fe8b1f05fc3e009b7414563e906ba769 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce64f2a88f1e649de9503e6795ef215a1267bfc8c90aff062f8b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846623473963f18489e7c72234cee6d9a25976d89cb354d713db977b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d79d5ec5a8232269e46915e59d094941db2dcb0b171290dfed713b4446f6cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9c65816526946ffbdf3aac6904c4a12dcf5e447c7c30ecd25095493cea7790 + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548934c4e0268ed95c36d59d1129ecca39a1fb209dcbdf02a852d9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d4c687fac239e7d047928455aebf3d2b12e36ac54e367376775c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1a1745e5a72f77f23188f4ba70bf52e6129ad531108fdc545e5dee96bedbb4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05ced6b098b70097cf392ead659322b4f18485dc75bf8c6bf327debd0bf4cb + +handshake=Noise_KN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665d5971fcd8cf63d49da6f97e147f93f8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fa26e5cb486370ec737fd513a5cd5d0fe7d017427cab2b85eaf5047ace1c56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f7a9d96f5c7568769bdd7ce20df60b523b4b52280a088a5e2ab56711a80714 + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b86660a966446b42c03bed0de0739ce2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669f66fc60ac521937d189e4c5d6833ff6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=52e8407c63693cd38f27a5315b73673dc02e994ef3f5c4713bf6638e95ce08 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f76678abb5d0cabbfa56bc6440c645fe8b1f05fc3e009b7414563e906ba769 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254af63f6d98ab7abc10e584fbb1dadf03b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b8886f47e72b4d191b73e37aea007e84 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d79d5ec5a8232269e46915e59d094941db2dcb0b171290dfed713b4446f6cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9c65816526946ffbdf3aac6904c4a12dcf5e447c7c30ecd25095493cea7790 + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e87f4eb6b35ffc2d7221c85e4fff91d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846607c20d3da79461e2b289a02a047412ce +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1a1745e5a72f77f23188f4ba70bf52e6129ad531108fdc545e5dee96bedbb4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05ced6b098b70097cf392ead659322b4f18485dc75bf8c6bf327debd0bf4cb + +handshake=Noise_KN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645fa9c2a20a197a1e0ba6bdff6753dbb6f06d4b3a58514071d26 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fa26e5cb486370ec737fd513a5cd5d0fe7d017427cab2b85eaf5047ace1c56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f7a9d96f5c7568769bdd7ce20df60b523b4b52280a088a5e2ab56711a80714 + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452c9fd84d58429beb11458dae7d43d88d2bbf86bb4a4fea48851 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f2455d2b3e74bed0cd9697e5ae9b35f12f75d6837474b5847bcf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=52e8407c63693cd38f27a5315b73673dc02e994ef3f5c4713bf6638e95ce08 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f76678abb5d0cabbfa56bc6440c645fe8b1f05fc3e009b7414563e906ba769 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce64f2a88f1e649de9500f9bb110a1d4ab30625d3d655b0102e9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846623473963f18489e7c722561310a8b8d53b0cf6bd13b75020efd0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d79d5ec5a8232269e46915e59d094941db2dcb0b171290dfed713b4446f6cb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9c65816526946ffbdf3aac6904c4a12dcf5e447c7c30ecd25095493cea7790 + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548934c4e0268ed95c36d512d38ce5801c5f03b18df72af6fbc19c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d4c687fac239e7d04792a57bdb3a881474ad1192de0356b25394 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1a1745e5a72f77f23188f4ba70bf52e6129ad531108fdc545e5dee96bedbb4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05ced6b098b70097cf392ead659322b4f18485dc75bf8c6bf327debd0bf4cb + +handshake=Noise_NK_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625492cd9880ad23415b7d45ccc2b211e37a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665f57bb37f938df25d18d7f89288ae666 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4863a837542483bc5c39fe8dfcbae600696475bfdab8ae04beaa8e18cd1145 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ad73bc7f009fbd5df1bb517bfa9d9d5e262d056e50804f8bddb283d58befc2 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254242e465816d0858d06f47e335a09badb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846671f0a338acc3bde7238080dbb9973db1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e64f0f84675e48b7a0058285affc1fab6b836ac80b34e164082d18412d8a73 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2b2c8eab1a9fa483ab8b572c934cc44f2d41aa9dc4c536a1ddddea478da58 + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254620e726e3d7f18b8f25aede17cdfcfc8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846694d057301ab3e2f829e2432060dba030 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6df2429f1df587b56005e87298149cba35aa88ee298469397ea2f4b942dd63 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c7c8dbbad29b112d7602b04c8e22edb7eb74db82f6f776ea077a5f6690fbc + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b074aab7776a1c52afe9b249fced5c0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696313d3b21b1f68940958623dcca1294 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a3082562d366ded0f178cf1d204e4e53db5736e66ec10eb0c866a37e654d15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60a2f051f6f113e03215df5a29be54632358fd03a7d3dc49e0771fe6c0d2b0 + +handshake=Noise_NK_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f0908050e933b7b9347e67893173878d10adab8cf0a44ce2a3f1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846618559bbbc6d87c6cb0347e9b2bbbf21fe5d8af2c7ce5ee0d82e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4863a837542483bc5c39fe8dfcbae600696475bfdab8ae04beaa8e18cd1145 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ad73bc7f009fbd5df1bb517bfa9d9d5e262d056e50804f8bddb283d58befc2 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e51a799a96f84a256118fdc303fec0ed8998042d5dd9556ae77c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687204b49e4a67b7b4ca7cd645ff191190a3ca23e92be635c8585 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e64f0f84675e48b7a0058285affc1fab6b836ac80b34e164082d18412d8a73 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2b2c8eab1a9fa483ab8b572c934cc44f2d41aa9dc4c536a1ddddea478da58 + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254de5deba8d0093296a30ef145e306b54d8bc4a3969c7afb2b0677 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d26056f711dacca0102501cb818f217ca8fb2563e79ad50daa19 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6df2429f1df587b56005e87298149cba35aa88ee298469397ea2f4b942dd63 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c7c8dbbad29b112d7602b04c8e22edb7eb74db82f6f776ea077a5f6690fbc + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254976601e4078212f0b67b7352b3d82247b7412614ac64b5b73e33 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d05dac14245dacbe1ce8860abf4e4e9c39a079a99de750d3cc0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a3082562d366ded0f178cf1d204e4e53db5736e66ec10eb0c866a37e654d15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60a2f051f6f113e03215df5a29be54632358fd03a7d3dc49e0771fe6c0d2b0 + +handshake=Noise_NK_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3a1fd96effa4a96c2d4d2ea49fa51b4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe5aaf6d285a1b2eb29a83b4041f8a9f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4863a837542483bc5c39fe8dfcbae600696475bfdab8ae04beaa8e18cd1145 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ad73bc7f009fbd5df1bb517bfa9d9d5e262d056e50804f8bddb283d58befc2 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f8d95af05ef4f548190140e105fcdd2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe1e5b2875f805c4c7afe1276551ac33 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e64f0f84675e48b7a0058285affc1fab6b836ac80b34e164082d18412d8a73 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2b2c8eab1a9fa483ab8b572c934cc44f2d41aa9dc4c536a1ddddea478da58 + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541cf92667ae758693dd2b7399cd15c401 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d345d580e11e4c26c7ebfbee575455e9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6df2429f1df587b56005e87298149cba35aa88ee298469397ea2f4b942dd63 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c7c8dbbad29b112d7602b04c8e22edb7eb74db82f6f776ea077a5f6690fbc + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254879ef3d63c164584553d294c6d91d571 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6f430402252f77e17be906eaf0b20eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a3082562d366ded0f178cf1d204e4e53db5736e66ec10eb0c866a37e654d15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60a2f051f6f113e03215df5a29be54632358fd03a7d3dc49e0771fe6c0d2b0 + +handshake=Noise_NK_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f0908050e933b7b9347e44301dc6d6ca7d4b0ce776f3a5d90c38 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846618559bbbc6d87c6cb03495d7531bcb04bb2c87bb444037256131 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4863a837542483bc5c39fe8dfcbae600696475bfdab8ae04beaa8e18cd1145 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ad73bc7f009fbd5df1bb517bfa9d9d5e262d056e50804f8bddb283d58befc2 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e51a799a96f84a25611826e1b4d3a08e33859de2e2edaa19276c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687204b49e4a67b7b4ca7e048fc2bd060f346d69f4fa196666869 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e64f0f84675e48b7a0058285affc1fab6b836ac80b34e164082d18412d8a73 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f2b2c8eab1a9fa483ab8b572c934cc44f2d41aa9dc4c536a1ddddea478da58 + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254de5deba8d0093296a30e16abbe1699580f3543369780626f053b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d26056f711dacca01025391e489dd6b23eb6f17f68551e051e17 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6df2429f1df587b56005e87298149cba35aa88ee298469397ea2f4b942dd63 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c7c8dbbad29b112d7602b04c8e22edb7eb74db82f6f776ea077a5f6690fbc + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254976601e4078212f0b67b3067d831eba76e2c57e6e4f5d0e5e2bb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661d05dac14245dacbe1ceb5b28b786b8224cdf48be55fc33b7f9e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a3082562d366ded0f178cf1d204e4e53db5736e66ec10eb0c866a37e654d15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60a2f051f6f113e03215df5a29be54632358fd03a7d3dc49e0771fe6c0d2b0 + +handshake=Noise_KK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254559236449548b149c86010ab38a7f593 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cb6a3f46c1a9e3740e073e00c1278116 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=12833dc9ced7ce2bd117611fb110e611bc98f046edd326de308589b085aec1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fc60d948d36347b0907c4ab7f180becf7427ef90bb45e71eb35503a2a77271 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b2feab58971b2b7754c4ce9c28c926e8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466570f0cf3fa53a65d939d10b1642c2b53 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bf212c1518bfc1bcb836c5fe6f669aff33ac43ef009c4a8ec7276ccd7fd1e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ff7971613fb38b2ceff9e02ab8bbef225ec3cf67b862f6edd347d64868d589 + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b254229e7b1620584147ca90cb8b10f5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663967c7ece58722039816225411448d25 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f0c4ac1a0669c88f81275a19747e2947aafe72519b9f9acf69a1853369b81 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cb84c8fb19d854105cdccfcf0d69f4b2022e872c1a8825fa459a8da32c574 + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471902189942423b5e706181d24bd3da6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466670e12b11fa0a2fc1efa881c5b3c5d60 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6a1cea393611538d818a6e0ad35dba2df91c82dc22142061d38de575a1be8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=850511dc2048fec84f31a5ddbbacc370f515c762a439bc4064953b3a60d1c3 + +handshake=Noise_KK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254142884550c3a5bbba542498fe2a2e3a42ae03427648d643f2ffa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf84137217e17d4ad6644f9f0c5a674e3acd0fa5cd6b82cf17a5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=12833dc9ced7ce2bd117611fb110e611bc98f046edd326de308589b085aec1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fc60d948d36347b0907c4ab7f180becf7427ef90bb45e71eb35503a2a77271 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625424595376448ec2517751f60303af508d12946b045ec39c9f603d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b72308d275634efa109e4144199e333ac5c65da8025b13ba4993 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bf212c1518bfc1bcb836c5fe6f669aff33ac43ef009c4a8ec7276ccd7fd1e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ff7971613fb38b2ceff9e02ab8bbef225ec3cf67b862f6edd347d64868d589 + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546ce1b92921238f610b81af38c19ef2fa4eb392fae936496df41d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2b19549f76d4caa90b4e495ba5af97e098cadfdd780d76d76f0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f0c4ac1a0669c88f81275a19747e2947aafe72519b9f9acf69a1853369b81 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cb84c8fb19d854105cdccfcf0d69f4b2022e872c1a8825fa459a8da32c574 + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543127c95b934bb1414f3123125be999be4d09da6b81e0cc56ae20 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846662111f0c62246c844c4f7d015feb0c15934e2b3b4a838f789485 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6a1cea393611538d818a6e0ad35dba2df91c82dc22142061d38de575a1be8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=850511dc2048fec84f31a5ddbbacc370f515c762a439bc4064953b3a60d1c3 + +handshake=Noise_KK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cafd0193d81be006185db284ec2d871 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0afb2bac37e2e2d9c68db47d4036c22 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=12833dc9ced7ce2bd117611fb110e611bc98f046edd326de308589b085aec1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fc60d948d36347b0907c4ab7f180becf7427ef90bb45e71eb35503a2a77271 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549235d028fae66b4f1e4dccfb170d03f8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0928131e420581b197828694275da40 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bf212c1518bfc1bcb836c5fe6f669aff33ac43ef009c4a8ec7276ccd7fd1e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ff7971613fb38b2ceff9e02ab8bbef225ec3cf67b862f6edd347d64868d589 + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542f62675567432d076a0e477c3cf14615 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662095be79364e992976531966ba961c94 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f0c4ac1a0669c88f81275a19747e2947aafe72519b9f9acf69a1853369b81 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cb84c8fb19d854105cdccfcf0d69f4b2022e872c1a8825fa459a8da32c574 + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540dc6b77672c010e87e1636b5d1da2360 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c86fc32118e4ace4d027a4522d94d9d0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6a1cea393611538d818a6e0ad35dba2df91c82dc22142061d38de575a1be8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=850511dc2048fec84f31a5ddbbacc370f515c762a439bc4064953b3a60d1c3 + +handshake=Noise_KK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254142884550c3a5bbba542d6529e3c81cc3f6ce831243b3346b035 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf84137217e17d4ad6640ddd193fa49edc3b9fb577a2c7a8296c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=12833dc9ced7ce2bd117611fb110e611bc98f046edd326de308589b085aec1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fc60d948d36347b0907c4ab7f180becf7427ef90bb45e71eb35503a2a77271 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625424595376448ec2517751fb29003363a17cb6d53130cc3125c606 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b72308d275634efa109eaf94f98070fefad6378fa12be3916c5d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bf212c1518bfc1bcb836c5fe6f669aff33ac43ef009c4a8ec7276ccd7fd1e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ff7971613fb38b2ceff9e02ab8bbef225ec3cf67b862f6edd347d64868d589 + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546ce1b92921238f610b819d25ee0e9a4161cfae2e38cb26b28809 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2b19549f76d4caa90b4f153ed8bf441a8a8ee9d18587bb6f6d0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0f0c4ac1a0669c88f81275a19747e2947aafe72519b9f9acf69a1853369b81 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cb84c8fb19d854105cdccfcf0d69f4b2022e872c1a8825fa459a8da32c574 + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543127c95b934bb1414f31387bd610396d2cc4f94ea7aa7135f8dc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846662111f0c62246c844c4f136c97d8afb760c73f285dcb7f366545 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6a1cea393611538d818a6e0ad35dba2df91c82dc22142061d38de575a1be8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=850511dc2048fec84f31a5ddbbacc370f515c762a439bc4064953b3a60d1c3 + +handshake=Noise_NX_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c97f89674eace3b56f9d5fb417a8ff75418944771131814c57a29365b15b48bca3f3ce4a7f4e53112bf6ef3bdf7f964a0cfd9784f9efcd4c52a446c50c555a7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2ea99baffa3692333bc13d7af3e454bf9acae4d796013d1ff35c0678ee84e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=789c1800de969242141310282d5b91629248bdf66631e3b45e7b8c2207ff89 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ab929c145cf0c1c676452b550524b5e8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846637d8b8996a822fcfe7e5b0d643443ffdc9ede527b1163f4b0dc6daf2322831ceefd299f1510d6504b291d8bcd98ff5cd96ce4ce180517d440d58c057749bee68 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=38a8c7da03d0c27bfe3051c07c463722d336ebac343c864773be3b5b559f72 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6e6cb9df11c3f09dd93c34bf894ab97f1a0375ffe48719f83e201d35a9ecfd + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482eadd90b062837066000cd5e2896e72 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663f756d65f4f5ee577e6b0d67d96f7aa2ff3ceb944f3abaf9587b4fa8511edd9ec6cf250413b660aa38b93a65f8e4acaf51406c51b75d4b6622e81c30e4bf5f7e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccfd7afc1ab48b43dc8768ee6912d7e72799002904654b41f797d7c3f88e09 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=743635953fe8aef503710cdc126dbe837a53d24ab0413f469f720689f7cbfe + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254407912b4ed86d5812b6b2d9d6c0c9e33 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628135288ad23fb032bc1ee5c922fbfe7fbb69668b9480571f36552e43984d6c7fbb160a0867a8e086fb093630e10460ccdf5e0b7f7135bb5871b31518976d993 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92eb54dd636d5ca48c96325fecb8b92b31a40cad65edca5c6602fbf71f4397 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d13070af6c2bac6cc30637e54b8fe2ed1a5030c624e4b691c9fdd2e4c42ae2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c97f89674eace3b56f9d5fb417a8ff75418944771131814c57a29365b15b48b2a593850eb6e640bdf72e859d3e6d378a72eb960dcbbb05601c67d08ca00bcf0d473e958a30b311e179a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2ea99baffa3692333bc13d7af3e454bf9acae4d796013d1ff35c0678ee84e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=789c1800de969242141310282d5b91629248bdf66631e3b45e7b8c2207ff89 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bc226ac1952daf37daccafd280d738f198a8829e1fcbd4be1c95 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846637d8b8996a822fcfe7e5b0d643443ffdc9ede527b1163f4b0dc6daf2322831ce525bf68b693695fba0cc6e523a646896093271a3cb9c1ed45414b7cf0f501cc694dd21e19994b7181d27 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=38a8c7da03d0c27bfe3051c07c463722d336ebac343c864773be3b5b559f72 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6e6cb9df11c3f09dd93c34bf894ab97f1a0375ffe48719f83e201d35a9ecfd + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254561fea27227285c680b595365022f8742ce5869972e379fa1b8a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663f756d65f4f5ee577e6b0d67d96f7aa2ff3ceb944f3abaf9587b4fa8511edd9e1a721a420612fbd0c23865f4bfbca2ec8930db64dacc0b33e0b529391699f00e32e8524ab9ac3e59e4f9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccfd7afc1ab48b43dc8768ee6912d7e72799002904654b41f797d7c3f88e09 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=743635953fe8aef503710cdc126dbe837a53d24ab0413f469f720689f7cbfe + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406509ecaf4beb0e75208c257af685179db7a99e146ed89d8e60a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628135288ad23fb032bc1ee5c922fbfe7fbb69668b9480571f36552e43984d6c7fd154ee04b21546f594953ca8d7753ace88e3c6d9dc176114056980d5c6ffe52778163ff1e4fe114605c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92eb54dd636d5ca48c96325fecb8b92b31a40cad65edca5c6602fbf71f4397 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d13070af6c2bac6cc30637e54b8fe2ed1a5030c624e4b691c9fdd2e4c42ae2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c97f89674eace3b56f9d5fb417a8ff75418944771131814c57a29365b15b48b79b4c07534af976280cbab579afc3f9cd0526a61d1adc06ef7359cf6e64ede9d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2ea99baffa3692333bc13d7af3e454bf9acae4d796013d1ff35c0678ee84e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=789c1800de969242141310282d5b91629248bdf66631e3b45e7b8c2207ff89 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e2cead811ebab45234d6015348300217 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846637d8b8996a822fcfe7e5b0d643443ffdc9ede527b1163f4b0dc6daf2322831ceb8bdffc1fb9e2f056f5924ddb7a079c5d7a0dd8ba258a660986cda0b0fb82865 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=38a8c7da03d0c27bfe3051c07c463722d336ebac343c864773be3b5b559f72 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6e6cb9df11c3f09dd93c34bf894ab97f1a0375ffe48719f83e201d35a9ecfd + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f39bc63b0a4dd6191e4289f80a68c16f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663f756d65f4f5ee577e6b0d67d96f7aa2ff3ceb944f3abaf9587b4fa8511edd9e719735f519b112f0f590ca884ba289f8b8977d3a36530e5d79baf821cace360a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccfd7afc1ab48b43dc8768ee6912d7e72799002904654b41f797d7c3f88e09 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=743635953fe8aef503710cdc126dbe837a53d24ab0413f469f720689f7cbfe + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c3f341235ad4e85cdfff4007e328673 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628135288ad23fb032bc1ee5c922fbfe7fbb69668b9480571f36552e43984d6c72b962f3774ebc05cb6d6810641c40c14ac72883a7bf88a59f7f771d54e9f978e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92eb54dd636d5ca48c96325fecb8b92b31a40cad65edca5c6602fbf71f4397 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d13070af6c2bac6cc30637e54b8fe2ed1a5030c624e4b691c9fdd2e4c42ae2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c97f89674eace3b56f9d5fb417a8ff75418944771131814c57a29365b15b48befea2db797f55a7ad5a71d072c64f323a72eb960dcbbb05601c6ca9847c52cb0cd36528e3c656343f4b6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2ea99baffa3692333bc13d7af3e454bf9acae4d796013d1ff35c0678ee84e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=789c1800de969242141310282d5b91629248bdf66631e3b45e7b8c2207ff89 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bc226ac1952daf37dacce78ea0cfd6b5afe05702919e81f51f7a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846637d8b8996a822fcfe7e5b0d643443ffdc9ede527b1163f4b0dc6daf2322831cecb38d9a801b214d126a66f637984d09c093271a3cb9c1ed4541471b1923c474467a450d3dc13d7be7bb4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=38a8c7da03d0c27bfe3051c07c463722d336ebac343c864773be3b5b559f72 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6e6cb9df11c3f09dd93c34bf894ab97f1a0375ffe48719f83e201d35a9ecfd + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254561fea27227285c680b5754de721d3c3568396f3d10ccc48ea7f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663f756d65f4f5ee577e6b0d67d96f7aa2ff3ceb944f3abaf9587b4fa8511edd9eb6b62b52923328c4a7cf9daf752282f58930db64dacc0b33e0b5eed6945d0bb7b4809f6caaeb6e5d03d4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccfd7afc1ab48b43dc8768ee6912d7e72799002904654b41f797d7c3f88e09 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=743635953fe8aef503710cdc126dbe837a53d24ab0413f469f720689f7cbfe + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406509ecaf4beb0e752085be87b067f55e9c0d7500f9b4e626a18 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628135288ad23fb032bc1ee5c922fbfe7fbb69668b9480571f36552e43984d6c749a43f9525b52730c1483dc2d4f707c9e88e3c6d9dc176114056694fa32638eda14593e6fefc5c276cda +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92eb54dd636d5ca48c96325fecb8b92b31a40cad65edca5c6602fbf71f4397 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d13070af6c2bac6cc30637e54b8fe2ed1a5030c624e4b691c9fdd2e4c42ae2 + +handshake=Noise_KX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645f7f537bba7b00980084360bc2a659d49462e51c7aac16f5974c5fcc3abd6f05f7ed6592d8f264aa7f21684cad38af385cfe03524ba2327236490bf28542d7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42b90acd27dcf671c7d1f62b4ecceb4825c5ce3bd8c44f5957ef56822bf50f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=45ddb566084ceec6fc0adc2e814ff0c6d07ae69e7248f0551c198b71a0d783 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548544e4275a97c99ec7854f30013ee77f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a61295b2a49e6bd40fc40e1a1f28ac34130cac3377f7343efb28e1b707a2299659cb923f1f226e2978fd4733e78a8223a7a694eaeac15deff1b257a8ffd29d2c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=422e6f132671f31c057aa12609a08e6b971f81cd27be000592cd40301af11e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=55484c7bd5558711b44c2a32e603b34964dc0e927db52282255636934440f0 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e9b221e00cdcbb650b72e970ff83babb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0f71c06a5716d87cbb5d97a45053222a6d60e07a582ce9dce1155d4fcaa192fb519550ab9024a779c2636ab49bf3ba56dab990ce321a23b1280c59bce5ce4dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a2c799c936e5eba4d7d21ac769ae2a887414f8f9b3d2220952f64ca948411d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4947d1bc4ccf44d845765ed79859094e2bf493b78c605ae3be52e5c4a03173 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b7d1ddd1aca55c78b5120a7f4cf4d092 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e441b3d7203d59162fdf03aecb1e9abc3fc65c102f49d381190d2ce7d9396fb02c53f0a687a80ff806d2c1953981b2023b75750f4a37944f1938b03cdf278b9b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd13dbc237f374adb0ecb695c24ad344784f57393b09efafe0aef543a510ff +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=76e66c4f498fccd441d67019c0e9274449c9c2711054daa2dc1ad1b2e302c9 + +handshake=Noise_KX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645f7f537bba7b00980084360bc2a659d49462e51c7aac16f5974c5fcc3abd6f0d0784ff6a1efe6404d97729b19faf7bf96e2147355ad9eae84ed96d9b0276e18f4c96d3a563f50dd6bc6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42b90acd27dcf671c7d1f62b4ecceb4825c5ce3bd8c44f5957ef56822bf50f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=45ddb566084ceec6fc0adc2e814ff0c6d07ae69e7248f0551c198b71a0d783 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b006bf285e1cc8449eefb4803696a072f96625e392032412ac7b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a61295b2a49e6bd40fc40e1a1f28ac34130cac3377f7343efb28e1b707a22996043e592d42da12d8eecdd160890c22ca8ee70aa30463a615c058d6e9c5a3740a312c13c8ee955dcdf6cc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=422e6f132671f31c057aa12609a08e6b971f81cd27be000592cd40301af11e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=55484c7bd5558711b44c2a32e603b34964dc0e927db52282255636934440f0 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540fe2a78085f7d670d1705b765c61bda640f638b04934aff5d2df +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0f71c06a5716d87cbb5d97a45053222a6d60e07a582ce9dce1155d4fcaa192ffd8284d74683b696a160b63590b75addda2fa2fffc3c20e6b1b1a6239f770840ffc3245f7e0bac0b134b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a2c799c936e5eba4d7d21ac769ae2a887414f8f9b3d2220952f64ca948411d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4947d1bc4ccf44d845765ed79859094e2bf493b78c605ae3be52e5c4a03173 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548908a58a36d8dc3bee25fb17d21656ca9d006c84e231e9391a54 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e441b3d7203d59162fdf03aecb1e9abc3fc65c102f49d381190d2ce7d9396fb09b82de351bf3309dcc311af9eaf338c126bfd57f36960aa25616ae53b38a2081e943aeed082c3d3a00a4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd13dbc237f374adb0ecb695c24ad344784f57393b09efafe0aef543a510ff +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=76e66c4f498fccd441d67019c0e9274449c9c2711054daa2dc1ad1b2e302c9 + +handshake=Noise_KX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645f7f537bba7b00980084360bc2a659d49462e51c7aac16f5974c5fcc3abd6f008d091837372254d9904e61d91b53baa4e6613a4a57cf930b2e4fc137a1f8a0f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42b90acd27dcf671c7d1f62b4ecceb4825c5ce3bd8c44f5957ef56822bf50f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=45ddb566084ceec6fc0adc2e814ff0c6d07ae69e7248f0551c198b71a0d783 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541e114d4616248178fa6a52bebfa79fb8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a61295b2a49e6bd40fc40e1a1f28ac34130cac3377f7343efb28e1b707a22996e0565a8630f96f31796cd72f87e78d69075097a2f17b4f37a7945a2bdea2ceef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=422e6f132671f31c057aa12609a08e6b971f81cd27be000592cd40301af11e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=55484c7bd5558711b44c2a32e603b34964dc0e927db52282255636934440f0 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d57e59a6963d53021f5bfcd757ae8b39 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0f71c06a5716d87cbb5d97a45053222a6d60e07a582ce9dce1155d4fcaa192fa0d104f5bc8e28c5f959f1a55333a948ba80cbdebd704e58e1f6b05d8eff2ba1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a2c799c936e5eba4d7d21ac769ae2a887414f8f9b3d2220952f64ca948411d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4947d1bc4ccf44d845765ed79859094e2bf493b78c605ae3be52e5c4a03173 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541326b4b1cbb8a627c7e589b8c8fdcc16 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e441b3d7203d59162fdf03aecb1e9abc3fc65c102f49d381190d2ce7d9396fb05b27cd488484ecb9437e1737a38fc727b7010d60deda8b391d9d0f72d20d5c75 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd13dbc237f374adb0ecb695c24ad344784f57393b09efafe0aef543a510ff +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=76e66c4f498fccd441d67019c0e9274449c9c2711054daa2dc1ad1b2e302c9 + +handshake=Noise_KX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645f7f537bba7b00980084360bc2a659d49462e51c7aac16f5974c5fcc3abd6f09af46abfbaeb6c9a0231e7469a859de896e2147355ad9eae84ed9a52883bed02d1ec49e1ae5ca88674a2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42b90acd27dcf671c7d1f62b4ecceb4825c5ce3bd8c44f5957ef56822bf50f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=45ddb566084ceec6fc0adc2e814ff0c6d07ae69e7248f0551c198b71a0d783 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b006bf285e1cc8449eef9d8fc5d2f9c711e1987b7781167bbce8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a61295b2a49e6bd40fc40e1a1f28ac34130cac3377f7343efb28e1b707a22996c8d1923fde7f66216702d15a384adb718ee70aa30463a615c058779d93896d68e450351480fe181da78d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=422e6f132671f31c057aa12609a08e6b971f81cd27be000592cd40301af11e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=55484c7bd5558711b44c2a32e603b34964dc0e927db52282255636934440f0 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540fe2a78085f7d670d1700d3c687f29c6956ddd271352b018d110 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0f71c06a5716d87cbb5d97a45053222a6d60e07a582ce9dce1155d4fcaa192fb691b582e5aad280c365586d54fb8d21da2fa2fffc3c20e6b1b1e333d00ab6b0bdd0ce17e547e8763bbc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a2c799c936e5eba4d7d21ac769ae2a887414f8f9b3d2220952f64ca948411d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4947d1bc4ccf44d845765ed79859094e2bf493b78c605ae3be52e5c4a03173 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548908a58a36d8dc3bee258dc3cc2bff1ebac4572450a310136fee +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e441b3d7203d59162fdf03aecb1e9abc3fc65c102f49d381190d2ce7d9396fb0e670c75a1572c5ed4b7c4e18d7163a1226bfd57f36960aa25616a6fb8b27806eb6782f97b72d49760bed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd13dbc237f374adb0ecb695c24ad344784f57393b09efafe0aef543a510ff +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=76e66c4f498fccd441d67019c0e9274449c9c2711054daa2dc1ad1b2e302c9 + +handshake=Noise_XN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b7d8187d170dc771df11b75334183868 +msg_2_payload= +msg_2_ciphertext=486ffb188e214980067c5ce19591b4f1b1497b971e30ec91d31bd5c18b2373eac8edba0652ee3830483af64f81eacbe644efedbbd6c6734d1aa3f9c1461a8576 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=226c1a7a3eb2ff97ae113d905d56489f5e91b56ad36d333552fdac29ff293b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5569f84032223b1fcb28d9def11fc807b8225089859bc49d3a44662b5bc6c5 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540b4e435539b8778fc984a53142ed1d34 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b4d4b525b6a1fe1a4464adbff47ccec3 +msg_2_payload= +msg_2_ciphertext=deb852db81c970c53f0a9a457e8b31cb53509a146199636fcd465c9eebac538ef5ec27d761da511083aae47bc8ec9960bf67814876f646456759f6eec5d88c6c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0b8b61050fed8c393461e28e7173106096d992680a0a8fca2c5bec37cf37cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9ad22402add33878374568727e1dba89ed39b3a7f35cd144b7caa45785aee7 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540e408809b80401244941dccac4134cce +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660b85c6e758641aea77c2ad7f6144cad0 +msg_2_payload= +msg_2_ciphertext=332d57a13424aceba27618d8fe8b6de96775b8398e39238994a737fe68fa680962032e627ce9923882a92f67c0200ea13206085252dcc1647aefb4ecbdedda58 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e7251e6b6625a32bf85fac6b5e34f833254989fc5aa63cf11fa032af49245 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f05530f84856a293384329c4ce0f0798bc4410a52046d7edfdd4d2ec05948f + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545477d3a3ba67a624953cebab6b281d08 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e071471a5398a3bd50445adca4df941e +msg_2_payload= +msg_2_ciphertext=027fe3c8ca06bd4f6e10c6388005c09ce6c0f4b298ab7f3a15c158c15337d93773846a9cd490ea54b678e1ffd60fe5012ddb586af2f165ae0cb7170dc06346c6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e9acbdf9ffd865c840598217601d320c40073cc16cd7ab5e106c4d37d26987 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3f7a01de8c7b17dc99849ff8fa6aa8c6b8c43f6ce86203d745ef09c6c010b2 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543f6a7217dc75ca41c3911066ee0c5906 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846681afbb042c41e679d53667fd78ea7e5d +msg_2_payload= +msg_2_ciphertext=e506abe8229dce20fb1e15484b101bff86d8d5431f6c63f434ee31d67021a62a943306cd45edf878bc45efc723919fa751dfae61f5b3180d8202fe6efaaddd63 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ce3255a6c24fb66e413c8543cb8f09d97f1750639337c5c322fbf37a2cd501 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d96d7282e64170d7fc4074bca3d778f7f165116cf28fe5e74fa7b330e7e400 + +handshake=Noise_XN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f377bb64185a9cf7ce1e379602e74ba38c07c1c2a026e64c5c0 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=486ffb188e214980067c5ce19591b4f1b1497b971e30ec91d31bd5c18b2373ea0643c46b29a4dde3164a69a808d90fc150d900caad0def5ed10015cb05452802c0bcfc5bfba885906427 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=226c1a7a3eb2ff97ae113d905d56489f5e91b56ad36d333552fdac29ff293b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5569f84032223b1fcb28d9def11fc807b8225089859bc49d3a44662b5bc6c5 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f57ad03ee30a67ff8595ba7dfaec76aff61a89df1685273c8f9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466335cb281f418f7ba439a5c4908155e68796ecca86a44354e6302 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=deb852db81c970c53f0a9a457e8b31cb53509a146199636fcd465c9eebac538ee70af9fc35a0bd839e0fbbceb2ceb941e19257a7b6f06c69994a69538ef20315caef2035d664312e94a8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0b8b61050fed8c393461e28e7173106096d992680a0a8fca2c5bec37cf37cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9ad22402add33878374568727e1dba89ed39b3a7f35cd144b7caa45785aee7 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c69b0ed12a80ca70a0fe657a10cb63cd99468f1acbd8224dd3a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466305a1f920e8c82b47fa496c53a37ca8b20b660ee4b0773293763 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=332d57a13424aceba27618d8fe8b6de96775b8398e39238994a737fe68fa6809a3f1b6876708addc7a53f4ebef97a9c3b6452c76d8dfe69b69b7e66522dbabb18e487eef49646e903148 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e7251e6b6625a32bf85fac6b5e34f833254989fc5aa63cf11fa032af49245 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f05530f84856a293384329c4ce0f0798bc4410a52046d7edfdd4d2ec05948f + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543247f4ea8236ed9947cc1415f9206c59465f532b848a94591cc9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c40676ef641ec2b2b6fa7e9334283fdd4229bed03af0d6e991ca +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=027fe3c8ca06bd4f6e10c6388005c09ce6c0f4b298ab7f3a15c158c15337d937872b1ede7375d1ad8ea688f5c5b9beadd1213591f5456e0c3dc7f839a6dade8a748b51a74090cb670467 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e9acbdf9ffd865c840598217601d320c40073cc16cd7ab5e106c4d37d26987 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3f7a01de8c7b17dc99849ff8fa6aa8c6b8c43f6ce86203d745ef09c6c010b2 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544892c27a1b4e4768d4e362aac34f05fdad78747fc1cce5c6e338 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466612e19645b49e373cff7e818c5721ae3c024a618d2d66b2e5d18 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e506abe8229dce20fb1e15484b101bff86d8d5431f6c63f434ee31d67021a62aeb922a2abac14eecd904de08848e215259172644930ac13ed24d67d1916560d540a7b1ca02a6b926819d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ce3255a6c24fb66e413c8543cb8f09d97f1750639337c5c322fbf37a2cd501 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d96d7282e64170d7fc4074bca3d778f7f165116cf28fe5e74fa7b330e7e400 + +handshake=Noise_XN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669d3c26f842cdf05230729fc44c7a617c +msg_2_payload= +msg_2_ciphertext=486ffb188e214980067c5ce19591b4f1b1497b971e30ec91d31bd5c18b2373eac5b11685a2f87b7ac31c1a4b49778680d8620b814c325c89cf286565822004aa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=226c1a7a3eb2ff97ae113d905d56489f5e91b56ad36d333552fdac29ff293b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5569f84032223b1fcb28d9def11fc807b8225089859bc49d3a44662b5bc6c5 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c44b17b7d0bf45d77e5f96b055ab6fe9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eadbd5bfbb94389829adc583de19d424 +msg_2_payload= +msg_2_ciphertext=deb852db81c970c53f0a9a457e8b31cb53509a146199636fcd465c9eebac538ee6bff14bc3846ad6f76e5e0a90bbc6dd7960a92ae9c64e42a2eb40900a6f4cd5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0b8b61050fed8c393461e28e7173106096d992680a0a8fca2c5bec37cf37cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9ad22402add33878374568727e1dba89ed39b3a7f35cd144b7caa45785aee7 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b2097565e2f0b03f343ad91768d3314e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669fc5e675e71a75698278b4300d53e87b +msg_2_payload= +msg_2_ciphertext=332d57a13424aceba27618d8fe8b6de96775b8398e39238994a737fe68fa6809311fb0f9264244e60cb48b4b6058629f30afa9f509bbd838d24ef120770e1cc8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e7251e6b6625a32bf85fac6b5e34f833254989fc5aa63cf11fa032af49245 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f05530f84856a293384329c4ce0f0798bc4410a52046d7edfdd4d2ec05948f + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ffc3fa91240b5932693ed3b9db99d7c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660acd02cb99ac2db8313b5182b3179b3b +msg_2_payload= +msg_2_ciphertext=027fe3c8ca06bd4f6e10c6388005c09ce6c0f4b298ab7f3a15c158c15337d93738742ee35f8cfbd59e125a8035b560c9f20867cc11dd0b27e4df6fa43326c234 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e9acbdf9ffd865c840598217601d320c40073cc16cd7ab5e106c4d37d26987 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3f7a01de8c7b17dc99849ff8fa6aa8c6b8c43f6ce86203d745ef09c6c010b2 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6146b34b323c78f9818412261244901 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f451ca4aecda85a294a53bce469d770d +msg_2_payload= +msg_2_ciphertext=e506abe8229dce20fb1e15484b101bff86d8d5431f6c63f434ee31d67021a62ac5c7fef3e518ee12feee90444548094aa9b60bfbc5d1e32de454077812a6e3c9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ce3255a6c24fb66e413c8543cb8f09d97f1750639337c5c322fbf37a2cd501 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d96d7282e64170d7fc4074bca3d778f7f165116cf28fe5e74fa7b330e7e400 + +handshake=Noise_XN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f377bb64185a9cf7ce16283bd3daf6d9c0ba6c497733575cc6c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=486ffb188e214980067c5ce19591b4f1b1497b971e30ec91d31bd5c18b2373ea663e0df03962627965e5fcaa901f5dff50d900caad0def5ed1006938800ab47acddce47a5db586f73fc5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=226c1a7a3eb2ff97ae113d905d56489f5e91b56ad36d333552fdac29ff293b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5569f84032223b1fcb28d9def11fc807b8225089859bc49d3a44662b5bc6c5 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f57ad03ee30a67ff85978adde877f716279533e0a2229a4aab7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466335cb281f418f7ba439abe510d34d9184008ae80207850403aa6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=deb852db81c970c53f0a9a457e8b31cb53509a146199636fcd465c9eebac538ec7e4e29b1af4f63c31a16d9f340a38b8e19257a7b6f06c69994a70c8c156b8ebcaab740791146667087c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0b8b61050fed8c393461e28e7173106096d992680a0a8fca2c5bec37cf37cf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9ad22402add33878374568727e1dba89ed39b3a7f35cd144b7caa45785aee7 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c69b0ed12a80ca70a0f8816914cd7fb3040fd3220ca32168832 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466305a1f920e8c82b47fa444a556e2e6905911b42f7d3f12eef8d1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=332d57a13424aceba27618d8fe8b6de96775b8398e39238994a737fe68fa6809906b387fbc92454cb8e3ce80aa3ce2d1b6452c76d8dfe69b69b752a7b14c6e906bb630d10bfb0708286e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e7251e6b6625a32bf85fac6b5e34f833254989fc5aa63cf11fa032af49245 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f05530f84856a293384329c4ce0f0798bc4410a52046d7edfdd4d2ec05948f + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543247f4ea8236ed9947cc4a8d0fece6a150beb0461a04c507ad2f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c40676ef641ec2b2b6faec1bf71f0b73312bd4d55c65fb531c84 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=027fe3c8ca06bd4f6e10c6388005c09ce6c0f4b298ab7f3a15c158c15337d93775dc62f002272f6904411b71bd08dbc6d1213591f5456e0c3dc79ac833bef0e945cd83a245502521d272 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e9acbdf9ffd865c840598217601d320c40073cc16cd7ab5e106c4d37d26987 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3f7a01de8c7b17dc99849ff8fa6aa8c6b8c43f6ce86203d745ef09c6c010b2 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544892c27a1b4e4768d4e3f54bce40707a191b272b69140d3400f9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466612e19645b49e373cff732ad5876325b056b774da6e2856fcc76 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e506abe8229dce20fb1e15484b101bff86d8d5431f6c63f434ee31d67021a62a5274f6f82b572bcc2ccc52af86d6615c59172644930ac13ed24d153f267d66d2b3dcb2236a3719f343bf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ce3255a6c24fb66e413c8543cb8f09d97f1750639337c5c322fbf37a2cd501 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d96d7282e64170d7fc4074bca3d778f7f165116cf28fe5e74fa7b330e7e400 + +handshake=Noise_IN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466659213d4ce7051561fa9c93bb500a945 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19a1c0a20452d8a44b7254cab212c1ff1098a0651a73ab58812290a0d9baee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01c7222fc0c22585ce1032e012d225e0fc53213dabde8f5dfc15ea2f5173ea + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625426df4f9c2999bafe403964ea11975f86af2d3f459ca54211b55e0b49a37beb70989b57c41d71288d7a645427e31f0cb2dcbb4db539c677da4af178d31053d13a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fc20123316e7891f44ad163404fe4a4c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84725e6c75c8c0b1b97c0e28ee7b19b576c6a60866bd79dd3131d5ee51c24b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8590802179dc26ea74bfc6a974cf1ff0e3b2873d1d35056fd1ff7864f9a644 + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481808305f9d7b92b5ea8b8862b86f62c20567a3bd4dc220e0ccf2fc62558f235f4678aaae2b806b4a90aae519295ec01a41b4407fe9d17f084c2ddda16124140 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846663791a12da21572632f46c02df0a7406 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84f2db9466d00f52a3fc9f0ee6c04d3424921a32d74e43ab7b257e2df0dcbe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7770c9796a35e3e0d64d35adc860ce54d86eebe105e3755636ae56b0e5fa08 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625441fcbd1030f49b2f467e42d08b039c8155bf36a93cf9933e2a8e39f0f0b5c49eaef35880826277e28a79b5eef2b86e0128f1343d8389fca6107a00d2091138bb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b53337b2ea8b7ee8ddf33c94e6759ac2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce2558df09ff72b190aeae3894c7a7c1151a9b52117ee855995f2695ce43ec +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8eb7770ec52590ee4f3803a3872fc02a6587d149f84deef14fb72ebd4d5316 + +handshake=Noise_IN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466711652c1b7ae42adf79af77d71534b43a53dcf922ba05ae2ac7b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19a1c0a20452d8a44b7254cab212c1ff1098a0651a73ab58812290a0d9baee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01c7222fc0c22585ce1032e012d225e0fc53213dabde8f5dfc15ea2f5173ea + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625426df4f9c2999bafe403964ea11975f86af2d3f459ca54211b55e0b49a37beb70989b57c41d71288d7a645427e31f0cb232047a7659ec1068a88fe5cb7ea21be467b78d47b7baaa05dd34 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667981f9efb8ad730403563a2f5370ba187c5246e8c27ada9bf8cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84725e6c75c8c0b1b97c0e28ee7b19b576c6a60866bd79dd3131d5ee51c24b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8590802179dc26ea74bfc6a974cf1ff0e3b2873d1d35056fd1ff7864f9a644 + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481808305f9d7b92b5ea8b8862b86f62c20567a3bd4dc220e0ccf2fc62558f235f4678aaae2b806b4a90aae519295ec01ba8237f6d9105d8c7474d97f153c5ecfabcef174ccba4e2a9bb3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a4757a7db35fc286d20a61dd38f374ceecfa44f66620f277856c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84f2db9466d00f52a3fc9f0ee6c04d3424921a32d74e43ab7b257e2df0dcbe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7770c9796a35e3e0d64d35adc860ce54d86eebe105e3755636ae56b0e5fa08 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625441fcbd1030f49b2f467e42d08b039c8155bf36a93cf9933e2a8e39f0f0b5c49eaef35880826277e28a79b5eef2b86e01c6a207bd5e919c675a0d17f7e14db1a8f0e8579e6b1d2e095981 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668a013bee4be51ef49d047f6d038c5a2b395957690fabaaf40d07 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce2558df09ff72b190aeae3894c7a7c1151a9b52117ee855995f2695ce43ec +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8eb7770ec52590ee4f3803a3872fc02a6587d149f84deef14fb72ebd4d5316 + +handshake=Noise_IN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e7150a9dca189b7510ad6a70e6729e8a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19a1c0a20452d8a44b7254cab212c1ff1098a0651a73ab58812290a0d9baee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01c7222fc0c22585ce1032e012d225e0fc53213dabde8f5dfc15ea2f5173ea + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625426df4f9c2999bafe403964ea11975f86af2d3f459ca54211b55e0b49a37beb70342f60d7e017a9e508697e93d78355b626535fa190a36dfeb02ac6a7fdbd31d4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466caf39580058278ca5b56e3e092908720 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84725e6c75c8c0b1b97c0e28ee7b19b576c6a60866bd79dd3131d5ee51c24b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8590802179dc26ea74bfc6a974cf1ff0e3b2873d1d35056fd1ff7864f9a644 + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481808305f9d7b92b5ea8b8862b86f62c20567a3bd4dc220e0ccf2fc62558f235ecc21fa53263c3bb8c5ea661ed2cf0737c66bc33295664c78a4aa3223be0f3fa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666a306aae194994874c7879ee8810f5a1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84f2db9466d00f52a3fc9f0ee6c04d3424921a32d74e43ab7b257e2df0dcbe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7770c9796a35e3e0d64d35adc860ce54d86eebe105e3755636ae56b0e5fa08 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625441fcbd1030f49b2f467e42d08b039c8155bf36a93cf9933e2a8e39f0f0b5c49e63b930768aafd11bace041ce31e6a2ec456951153dbc13db98f6e98ddeb32dbd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646c106fc6f2c865265abbb262b1bdbf6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce2558df09ff72b190aeae3894c7a7c1151a9b52117ee855995f2695ce43ec +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8eb7770ec52590ee4f3803a3872fc02a6587d149f84deef14fb72ebd4d5316 + +handshake=Noise_IN_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466711652c1b7ae42adf79ab3dc343dc9ace7a3bfccac12de3d193e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19a1c0a20452d8a44b7254cab212c1ff1098a0651a73ab58812290a0d9baee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01c7222fc0c22585ce1032e012d225e0fc53213dabde8f5dfc15ea2f5173ea + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625426df4f9c2999bafe403964ea11975f86af2d3f459ca54211b55e0b49a37beb70342f60d7e017a9e508697e93d78355b632047a7659ec1068a88ff75c4bc0591d93395bd4e06b6e8754e6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667981f9efb8ad730403567813ca21163470293e3c6fc41b4ff0b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84725e6c75c8c0b1b97c0e28ee7b19b576c6a60866bd79dd3131d5ee51c24b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8590802179dc26ea74bfc6a974cf1ff0e3b2873d1d35056fd1ff7864f9a644 + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481808305f9d7b92b5ea8b8862b86f62c20567a3bd4dc220e0ccf2fc62558f235ecc21fa53263c3bb8c5ea661ed2cf073ba8237f6d9105d8c74744d93349fc84b57b4fc980737d4759e01 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a4757a7db35fc286d20a1fcad775e56c67beb054c7f519c576d3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84f2db9466d00f52a3fc9f0ee6c04d3424921a32d74e43ab7b257e2df0dcbe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7770c9796a35e3e0d64d35adc860ce54d86eebe105e3755636ae56b0e5fa08 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625441fcbd1030f49b2f467e42d08b039c8155bf36a93cf9933e2a8e39f0f0b5c49e63b930768aafd11bace041ce31e6a2ecc6a207bd5e919c675a0d4c6555c46b7ad60a6449338078640754 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668a013bee4be51ef49d04e4373184dee4d8c2281669b66728d233 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce2558df09ff72b190aeae3894c7a7c1151a9b52117ee855995f2695ce43ec +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8eb7770ec52590ee4f3803a3872fc02a6587d149f84deef14fb72ebd4d5316 + +handshake=Noise_XK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d7fcb95d9da87e0af29cde0d6a5f287b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466800ac1687176d90bc6dbdf12863c0537 +msg_2_payload= +msg_2_ciphertext=92d38f089b41f951d834dddd45dbe5578c4021370d7e1a9478a94746309363a29763127dc08fe1cb8dc065082573ee096c7dc4e1c36837953f4916fc7b19dd03 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2415b54e0f4f9843d8ef7a77448791fbb4c3c1335e88c0fc9f0ca1a48996b4 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3653f1a64137245561ea386294c3c0954715d3e1f4b85effccbe2d1c43475f + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625445c2cc340ab6003689ddce8eada9ceae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466214e4e1d6596bc62ea7cd6275cddfc39 +msg_2_payload= +msg_2_ciphertext=969813a2bee54c8d740a7f931ccff98baa6416e7cb8508e45e71e9e3932508ace41c99953f1325ad580dcf7a989586edfa0b6ee8ef46e5463098f735198874ff +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=839b155ed75c4053ce6a815306226060349a013205fc9418aa2e5a05e37fa7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=40dba082e6da9293e21b496c9e74c7978542ba104874a6331fe12168b67099 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543421b40e4c4da5824f33d5ed970d4c72 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466878d6a9f1192586ed358e91ee5cc1649 +msg_2_payload= +msg_2_ciphertext=8c1add204692080de004b0a79d901205d9ffbdbf7c23f1514c5ef9b3df2d4f71a9c91cc9c8ed052dbe6b8094ea588ec5cc703fc8be9632d41756df774ff82907 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5700577bd6d3c9d2d1c0a2a5fed1c4de71869859a03099dfeb03bd981ace7d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2ec9ab876956dd0f236c33bca7c4b91ca0e3108a7c03f666bb04ef89e17d02 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b396f9a7b3a726986fab49e66bb7c0f4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2ee8fa782dfe01926052719a57dbdfa +msg_2_payload= +msg_2_ciphertext=7c6c099d0438335855eeaa6c87ab89415079528c4d87469b62959bc66189837a43b24f63b056b84462dabb2d4be549a20f11a5bd4bcce092df24f07d4d69e22a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3fd3d739b18b4fc970e126c41893b2739f3d30b49d67035184b72dd87a838f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=562d5785a73f04b43264dc1e800df65988cc7aeec98090a77f256c0dea1305 + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d4aa8d15cf148942f35d8bdf1c9f2c05 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc0625a4f8b32dc5a768fd83880c493e +msg_2_payload= +msg_2_ciphertext=3f8f3799dfea7cd0b81bb96415f330d3e3f48ad1fc352c0b153cbbb230e97ab018a17ec22c9f3c5545f201227668b6536d82c4e45e3adfa8d4161327b89ca439 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86042248607aea3d2a79be1388836b47969b9142baea780518c4c44e525d0a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7916c1051c9968838d6217df3ece55302168b2c76d4e69c7460e24535a50d9 + +handshake=Noise_XK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254776fe5c02a96e95f6fc556ee66374ae786b903528d1b295d7522 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846676130dd92e35bd3dfea9939c3c01914d86fca24d8f05612dd2d7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=92d38f089b41f951d834dddd45dbe5578c4021370d7e1a9478a94746309363a2485c5233cd0a9b22da8a2729920c6b3a9c61297320c75dc288dc9270fd8679c519e87538ecc20b18e9aa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2415b54e0f4f9843d8ef7a77448791fbb4c3c1335e88c0fc9f0ca1a48996b4 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3653f1a64137245561ea386294c3c0954715d3e1f4b85effccbe2d1c43475f + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254098b5c955eb34a1b4c11491a1f25da104f9c12a6560e4a3a0200 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3fa1fabeefa5b4f170db9a8eaa1888997cd3da3b60c71ba397c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=969813a2bee54c8d740a7f931ccff98baa6416e7cb8508e45e71e9e3932508acd7b63294dde8d5c5bbea7739f023f46211824e8ba66e2079622d5865f7db5720f0291f54435b44d00169 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=839b155ed75c4053ce6a815306226060349a013205fc9418aa2e5a05e37fa7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=40dba082e6da9293e21b496c9e74c7978542ba104874a6331fe12168b67099 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b5ab168f947be648453704b3b95edcfd75bec637735a93a2fb2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa93bf01cd6e3e7f949ca31898cfa6d2556c8377ac6193d5cfd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8c1add204692080de004b0a79d901205d9ffbdbf7c23f1514c5ef9b3df2d4f711dcebb94fb27d3f54b01284f85fd7ef6037e46e0de1b083d799cca20dd026b4bd3773a7a117e4f9c5692 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5700577bd6d3c9d2d1c0a2a5fed1c4de71869859a03099dfeb03bd981ace7d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2ec9ab876956dd0f236c33bca7c4b91ca0e3108a7c03f666bb04ef89e17d02 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545720b91a9dcab61c37b8814561cda01c19a5f7bfea89802537d1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c8a84bf5a002e9e393ff048a9a6b9cf1f09d44b4aaa089d2640e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7c6c099d0438335855eeaa6c87ab89415079528c4d87469b62959bc66189837a0ead89bdd77510a4f3e8fd591d591345386ce238a665fe32d93ed7c485fab009e51b239ebcacf940abbe +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3fd3d739b18b4fc970e126c41893b2739f3d30b49d67035184b72dd87a838f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=562d5785a73f04b43264dc1e800df65988cc7aeec98090a77f256c0dea1305 + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bf7b785a3e9cc3a60cfa3d1704700697f33e32e082282b754d78 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a867c4b84b57de8e777468abbf7194d6daedca28b6a2122b1249 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3f8f3799dfea7cd0b81bb96415f330d3e3f48ad1fc352c0b153cbbb230e97ab02b4a3292e06f079eeb610e5d7ac8438a1c93d192615dfb4da0b725cd90e7976e2f26faad75511b079923 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86042248607aea3d2a79be1388836b47969b9142baea780518c4c44e525d0a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7916c1051c9968838d6217df3ece55302168b2c76d4e69c7460e24535a50d9 + +handshake=Noise_XK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dc4410806334bcafc02c5f0288cba55f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ae416864308a4715413b37adefce89bb +msg_2_payload= +msg_2_ciphertext=92d38f089b41f951d834dddd45dbe5578c4021370d7e1a9478a94746309363a227f611ff53b50b0d3218258cf499c7fd9e8957ea5c45de361b798573cedf448c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2415b54e0f4f9843d8ef7a77448791fbb4c3c1335e88c0fc9f0ca1a48996b4 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3653f1a64137245561ea386294c3c0954715d3e1f4b85effccbe2d1c43475f + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f48adffda573b586253f36b35ae765f6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846609630930c7e2c7cde8bd1c87e650eba8 +msg_2_payload= +msg_2_ciphertext=969813a2bee54c8d740a7f931ccff98baa6416e7cb8508e45e71e9e3932508ac1fbd3cbb304e67b87c76c4e11c571046ba79b4fd1fc6b3d4ba4a5fc9b2077171 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=839b155ed75c4053ce6a815306226060349a013205fc9418aa2e5a05e37fa7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=40dba082e6da9293e21b496c9e74c7978542ba104874a6331fe12168b67099 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ad3cb547b0f1ba018228d6d48b1302d6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466363e99dcad427a100c62c4fca6743d44 +msg_2_payload= +msg_2_ciphertext=8c1add204692080de004b0a79d901205d9ffbdbf7c23f1514c5ef9b3df2d4f712c00e0a7262263bc0fa2f498110f3023d6d614065bd937c3dcc68aa42afb9f53 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5700577bd6d3c9d2d1c0a2a5fed1c4de71869859a03099dfeb03bd981ace7d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2ec9ab876956dd0f236c33bca7c4b91ca0e3108a7c03f666bb04ef89e17d02 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d1b0d8db64424f07a17edfe37cd6ecbb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662600630bebba156d21b4352295cf1587 +msg_2_payload= +msg_2_ciphertext=7c6c099d0438335855eeaa6c87ab89415079528c4d87469b62959bc66189837a5300ba1f27066ab0f8ac8ff29be25d7e9e38b5a86438cc7efc8a58302284255a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3fd3d739b18b4fc970e126c41893b2739f3d30b49d67035184b72dd87a838f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=562d5785a73f04b43264dc1e800df65988cc7aeec98090a77f256c0dea1305 + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c6abbd65f6352017e41b0526f935d4fa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f7e5ebfdda054bed9fe6a6234d6a7c2a +msg_2_payload= +msg_2_ciphertext=3f8f3799dfea7cd0b81bb96415f330d3e3f48ad1fc352c0b153cbbb230e97ab0d6f8f274d7ee267767e3e543ad1fbc4ec3ce0f6dd3939eb8a98e87dabbf62d75 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86042248607aea3d2a79be1388836b47969b9142baea780518c4c44e525d0a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7916c1051c9968838d6217df3ece55302168b2c76d4e69c7460e24535a50d9 + +handshake=Noise_XK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254776fe5c02a96e95f6fc57a9232ae7515f60452f85bcbe3e6f292 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846676130dd92e35bd3dfea9dcd8a750ba80f0fd88e6996bcee6f1c1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=92d38f089b41f951d834dddd45dbe5578c4021370d7e1a9478a94746309363a278d070e8c58bf3524d8f197ab037fdcb9c61297320c75dc288dc39f19360875d6111c307664b3a0bf0ac +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2415b54e0f4f9843d8ef7a77448791fbb4c3c1335e88c0fc9f0ca1a48996b4 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3653f1a64137245561ea386294c3c0954715d3e1f4b85effccbe2d1c43475f + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254098b5c955eb34a1b4c110d747d4a36bf21cb8bc8c804f71c68f0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3fa1fabeefa5b4f170d48ee6e86ab0f45624d5a3a909b3a9b11 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=969813a2bee54c8d740a7f931ccff98baa6416e7cb8508e45e71e9e3932508acc694f7a253f0ce275ea72ee17d008b7f11824e8ba66e2079622d9ef5fb46dc9543ea8892f8f24d34aaba +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=839b155ed75c4053ce6a815306226060349a013205fc9418aa2e5a05e37fa7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=40dba082e6da9293e21b496c9e74c7978542ba104874a6331fe12168b67099 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b5ab168f947be648453c179b7a5f141728783b58a14c7856fbe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661aa93bf01cd6e3e7f949145e514380905712cb7cb7c81fdcc1b4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8c1add204692080de004b0a79d901205d9ffbdbf7c23f1514c5ef9b3df2d4f71a2ed70c8feada07998dbcdd38ca4a29a037e46e0de1b083d799cf6ab0c35ba161be8e6beb6a93c5e4dbc +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5700577bd6d3c9d2d1c0a2a5fed1c4de71869859a03099dfeb03bd981ace7d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2ec9ab876956dd0f236c33bca7c4b91ca0e3108a7c03f666bb04ef89e17d02 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545720b91a9dcab61c37b8fdab24849c2062acdd29252d4b53b370 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c8a84bf5a002e9e393ffda17842e6b4e3cb0f50b0225f5fc489f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7c6c099d0438335855eeaa6c87ab89415079528c4d87469b62959bc66189837ae6e466d4af2f9686cb8df36fc22fd85f386ce238a665fe32d93e355fda6cff6b81c94b84931e25c047a9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3fd3d739b18b4fc970e126c41893b2739f3d30b49d67035184b72dd87a838f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=562d5785a73f04b43264dc1e800df65988cc7aeec98090a77f256c0dea1305 + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bf7b785a3e9cc3a60cfa1fae5337fa8886d55a06d82e213d5459 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a867c4b84b57de8e7774f3198fd17a166131b3ecfd7ae59d1406 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3f8f3799dfea7cd0b81bb96415f330d3e3f48ad1fc352c0b153cbbb230e97ab0608a59baf1cd8cbf237675a276c86abc1c93d192615dfb4da0b736a363083920a7853b3732d4aa37de18 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86042248607aea3d2a79be1388836b47969b9142baea780518c4c44e525d0a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=7916c1051c9968838d6217df3ece55302168b2c76d4e69c7460e24535a50d9 + +handshake=Noise_IK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a38fd17d3ecfc034b8662c49ba22d8558729800e0313b725febfb2ec77bd84a2bf740c07e5cfd9d0a2d377198bb3e525fa18b100686908255ea1150d9a8001ca +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669f9a4611a8a2078190bdb54616a8918f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c69889e3504ff2c2199e28029aea578cd758b4214a3c8b83f92b5ee66670ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36198b611040f132bd465de67099a9ddf9dfe3f23bd1f2d30c943b26c3fb5a + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9d7e098f29f8d60de3d6535f46b2d89cb9366382ef8243cbf9c650eab2dc27f01d46a576445054a4d2e2df4b1f220cce5e9325db888b8d29e5d8f4fd9a77fe0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ebddc558f82c368423bc3e5e00700f2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=116b1de8e063d67a8d8c5be83a7f444168b60447df326749434d22cf39ffb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=035f0315fdae44c8c718fa8509fc00c55ea3f4e322a500888874b90593f113 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540b5b9c6666fe0610f8de010548ef7b2c1ff9cfdcd2a35d7257c0f14cf6b65792b0e9536d43e2b8d36cf8ac0d1e756d4757cb9f9f3bdd55b5cfdb5954d3063844 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660da82bcd895d1b8199ddcb12ab5ddfca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cce3a32168d9494773586dbc7599e2c94e401f0936e3696e91b8a00209601 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2f113c945e331cd45962508eee9d01907800a7b4f611d2d5264fdeb96a81ff + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540193347cd7c4197ad710ce0f36a4c24fc4da2c0b271e51f178b900abb6361298e62d4d75c6fe9a49584fe9ca40f5cd5e60c071e7738477042185ec854f83b76e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466af3fef0028d1964b618ae069d56fb155 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1f941586981ee8e35546c4c825ae5b59f085ec1ac261c913667246bc609496 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c7df30218d05a737fb405b7067cfd591d593d111fe1847d086ae37e806dda8 + +handshake=Noise_IK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a38fd17d3ecfc034b8662c49ba22d8558729800e0313b725febfb2ec77bd84a2bf740c07e5cfd9d0a2d377198bb3e525e9cee2fc198c757f297517fc5be735549e54d9d557fc96f7c5ff +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb139fe5e49c4d60a6ecd193505e01bdb218399d78150c11ce8d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c69889e3504ff2c2199e28029aea578cd758b4214a3c8b83f92b5ee66670ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36198b611040f132bd465de67099a9ddf9dfe3f23bd1f2d30c943b26c3fb5a + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9d7e098f29f8d60de3d6535f46b2d89cb9366382ef8243cbf9c650eab2dc27f01d46a576445054a4d2e2df4b1f220ccbcbfc9a0cec566f4a3969cbd5264c8e59adf9c11031617ce7d24 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f0e11f5f201496d65ded674476b0378052ce43ff98321c35654d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=116b1de8e063d67a8d8c5be83a7f444168b60447df326749434d22cf39ffb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=035f0315fdae44c8c718fa8509fc00c55ea3f4e322a500888874b90593f113 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540b5b9c6666fe0610f8de010548ef7b2c1ff9cfdcd2a35d7257c0f14cf6b65792b0e9536d43e2b8d36cf8ac0d1e756d47c6cf8ace27084be59885bf4844fadfd9dfc1592f3179058ea7bc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e207c946b72c6e772588dbd81244e6e87253cf9703c4156ed65 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cce3a32168d9494773586dbc7599e2c94e401f0936e3696e91b8a00209601 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2f113c945e331cd45962508eee9d01907800a7b4f611d2d5264fdeb96a81ff + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540193347cd7c4197ad710ce0f36a4c24fc4da2c0b271e51f178b900abb6361298e62d4d75c6fe9a49584fe9ca40f5cd5ea873d705aef61f8a6af29492c9e58fa7bc5094ff240e4edb4aa4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ee3ad6bce0a3efbf171d998ea2f0255498e25d9bce8287eb8da8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1f941586981ee8e35546c4c825ae5b59f085ec1ac261c913667246bc609496 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c7df30218d05a737fb405b7067cfd591d593d111fe1847d086ae37e806dda8 + +handshake=Noise_IK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a38fd17d3ecfc034b8662c49ba22d8558729800e0313b725febfb2ec77bd84a2108f69d924cca3b15ef92569d7ec2cdd6548391e29b99f96e7b5a5091b8a9f93 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846657c9117c74762c3957ec726fa608e616 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c69889e3504ff2c2199e28029aea578cd758b4214a3c8b83f92b5ee66670ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36198b611040f132bd465de67099a9ddf9dfe3f23bd1f2d30c943b26c3fb5a + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9d7e098f29f8d60de3d6535f46b2d89cb9366382ef8243cbf9c650eab2dc27fbad3ba213848dbb944b7105fdd6ab12b7fe76265452d31ddd7f0f01fe0eec744 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f44a254be52605ed2a0053cc0650c99 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=116b1de8e063d67a8d8c5be83a7f444168b60447df326749434d22cf39ffb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=035f0315fdae44c8c718fa8509fc00c55ea3f4e322a500888874b90593f113 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540b5b9c6666fe0610f8de010548ef7b2c1ff9cfdcd2a35d7257c0f14cf6b6579241f7b7d690f1bded3fca5448cc406d3e1005ef58c3ccd169ec72b2f7c4caa8b6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846605b9566b5b0f3deb72a002560de9d6bc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cce3a32168d9494773586dbc7599e2c94e401f0936e3696e91b8a00209601 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2f113c945e331cd45962508eee9d01907800a7b4f611d2d5264fdeb96a81ff + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540193347cd7c4197ad710ce0f36a4c24fc4da2c0b271e51f178b900abb636129853d2066d323ef55180074e4e958c318e1bd8c9457e081991c320902e9eca0b16 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466934c3609b2ea20856de72db441812028 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1f941586981ee8e35546c4c825ae5b59f085ec1ac261c913667246bc609496 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c7df30218d05a737fb405b7067cfd591d593d111fe1847d086ae37e806dda8 + +handshake=Noise_IK_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a38fd17d3ecfc034b8662c49ba22d8558729800e0313b725febfb2ec77bd84a2108f69d924cca3b15ef92569d7ec2cdde9cee2fc198c757f2975da3efa4e0d0fe13a9991b9411ba4c0e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb139fe5e49c4d60a6ec8c83fb024bc79e49670113142aa6c652 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c69889e3504ff2c2199e28029aea578cd758b4214a3c8b83f92b5ee66670ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=36198b611040f132bd465de67099a9ddf9dfe3f23bd1f2d30c943b26c3fb5a + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9d7e098f29f8d60de3d6535f46b2d89cb9366382ef8243cbf9c650eab2dc27fbad3ba213848dbb944b7105fdd6ab12bbcbfc9a0cec566f4a39606ee8a4f74c5bab0347ec3820d2283e5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f0e11f5f201496d65ded4b10d20841f311688cda5dc987c59676 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=116b1de8e063d67a8d8c5be83a7f444168b60447df326749434d22cf39ffb1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=035f0315fdae44c8c718fa8509fc00c55ea3f4e322a500888874b90593f113 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540b5b9c6666fe0610f8de010548ef7b2c1ff9cfdcd2a35d7257c0f14cf6b6579241f7b7d690f1bded3fca5448cc406d3ec6cf8ace27084be59885e4091c5bc209109dda7507f4d707739b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e207c946b72c6e77258c2aadc838c8dc6ef181eec060394556c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cce3a32168d9494773586dbc7599e2c94e401f0936e3696e91b8a00209601 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2f113c945e331cd45962508eee9d01907800a7b4f611d2d5264fdeb96a81ff + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540193347cd7c4197ad710ce0f36a4c24fc4da2c0b271e51f178b900abb636129853d2066d323ef55180074e4e958c318ea873d705aef61f8a6af212d4915462886947dcbffa4ffeb7444d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ee3ad6bce0a3efbf171dc4555c0b4c715a52ac5e3c7f2e249d3e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1f941586981ee8e35546c4c825ae5b59f085ec1ac261c913667246bc609496 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c7df30218d05a737fb405b7067cfd591d593d111fe1847d086ae37e806dda8 + +handshake=Noise_XX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aaf8bd6d4f4015e5465aea27ce9bfe2f9cfeb1b38ee28d45032fe0b31e0ed19185e606afae8d39560d71c245a09c231c58f90ea85bc24bfda03e505c65b792c3 +msg_2_payload= +msg_2_ciphertext=d91be69fde3995104e4827d77d5162d8757250d035b74525efccce98e892ed62d34f840a4785fe4cc548a096f803652e4fbe69376911d114fd5e11c994720434 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55ac89364861faed9538fe931a2bf90878fa10072b3c5e520b733728948e1c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4a9308221816fe917b617d45c8a1f8bdb8adafec2bb9ab2f8bd6b1627bf9e1 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625402675bce88ab5a820c99ea9fddb39f02 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466581a3db6c8617d78b487458dfc00147b77d9a8f9d55d33fa54e9a099348118f922577a9a42ebe899869e0a3c8c9311d4232fd9b2bb0fdc2c004994d87467c928 +msg_2_payload= +msg_2_ciphertext=4f14513ce6f321d3e3cb4585286a18c666e6b3777ae346a7480f09dca7af5575e88a84a7d6f8a2e72183e95e71bc8d3f22b1d51f739ea46e9429f03e4491eb26 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=53f77a183580b9f1fbcef4857976951cff9f90e21cca7a4fe7cddd5303b23f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25166ac4cc0f48a5e9a1af15f86c0a4b065a0c587aaadbcfb76ca98540431 + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625485c5ada7d6d53105c13610ffcf41d7a4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c5c243ed69e6c32a5c5016b1b66676d6076aede0fd2df3c89b58f2df5a3ed2cf603ab6a12b364a8b0f64fec5081f97aeaeb9a99414e7b0eb091667e33c7d8f6c +msg_2_payload= +msg_2_ciphertext=77f77a124d513addd8faed07d38add6dc885d466a1f3f259847430780d121ac5272da5fda9f0a5f69039d94ebe69d0b526e42143bd74f784fc79fd2210c0d5a3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd96a733132ce4bf0bb7f1fbffffd0e2cc805e2b2bc5b4c14684d1370e93fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73803758314e6aa57533c404442d54e9f3c6f94157c41d2d82cf608158473e + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625479170a96b76ee24ab783821e5383da8a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665239caf37bac645326193f36abf47c49b4568ab9ea3933a8dab0a835393c23e3a4a9a936fef8c1d46b9a591a9684ffec5b876aecad0fcdeaa22a6d7b6bc8bbdf +msg_2_payload= +msg_2_ciphertext=561aa523426011b76cd099db2c038f6405739eee844f4f59da33c6c315bebf276d70e2ea113233792b32d752c6d4a256fad013cfee5f910ee4922b5a7720b2e0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c188211012160a32e31359391f5d3bd9ebe2af466c2c3759d36d7f1b723a53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=330f1b1616e11def88c53fefeede6e62e5c89414516dc4f3eb55cc0a6dd244 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b448543164c221df43ad2e76d7dce619 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eb1b0ba3208b9285c46d88de673268c0a9c11d1372df5c12348027d7b20d33e3678bcacb6dc7ecffae94384891ee38abeccb20a835ddbf929d0a313fb26d4ee4 +msg_2_payload= +msg_2_ciphertext=6008678f2ef024bf48e09a421bfa274e0e134657e952b07b9628b88938f8489ae1bd41cf9f2af850d9e4186aef156e71671537a7673853392bddc33c073f660d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f0fdc970b0edc1b34eff18de0753b76a4c407c63c75dfa31b7718a25bd9852 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=058345e46ccb2548fdff3835a49a67f7470b5e1d7c58b338e64ca4350b3bca + +handshake=Noise_XX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aaf8bd6d4f4015e5465aea27ce9bfe2f9cfeb1b38ee28d45032fe0b31e0ed191f5384372c5963ff9a47437d7781bbfa1ede85376a07ee6cffe47f4274e311338859dfb4dd4f0d9c1e87e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d91be69fde3995104e4827d77d5162d8757250d035b74525efccce98e892ed6200f9ea261e7e296827a6c5ad76d3b0686ca99d40ed5aa6600279a77e9a5c80b22f889c3fd74d83cba873 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55ac89364861faed9538fe931a2bf90878fa10072b3c5e520b733728948e1c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4a9308221816fe917b617d45c8a1f8bdb8adafec2bb9ab2f8bd6b1627bf9e1 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487982e3421ad43f420890fc6fa445fbebaa29d42f83357832fb2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466581a3db6c8617d78b487458dfc00147b77d9a8f9d55d33fa54e9a099348118f9392dc0274cf7b028ba762c5bbe82c31d42ee5e297273ad7654acf25c798d67773c0bc7b485759cba4f41 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4f14513ce6f321d3e3cb4585286a18c666e6b3777ae346a7480f09dca7af55753d6822524406cfeee550f231c0b3a3b01127f4f272356b921ee0e01d4ae239d3eb7d8c357eee3630d1ac +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=53f77a183580b9f1fbcef4857976951cff9f90e21cca7a4fe7cddd5303b23f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25166ac4cc0f48a5e9a1af15f86c0a4b065a0c587aaadbcfb76ca98540431 + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c13c5b571263574d9b570c55e7e151b9425c1fe13510b467e0de +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c5c243ed69e6c32a5c5016b1b66676d6076aede0fd2df3c89b58f2df5a3ed2cf028f9a03a230cf08755d11147bd6ff8cfb9620d663d5ed048229b50d9724a4c96edcde2b208246ff5fad +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=77f77a124d513addd8faed07d38add6dc885d466a1f3f259847430780d121ac5b9097846c12a911d82fcc7a70dd5ae5901e3130a6fb48336ebc6f4d4504624ec357f34d47b896400dadb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd96a733132ce4bf0bb7f1fbffffd0e2cc805e2b2bc5b4c14684d1370e93fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73803758314e6aa57533c404442d54e9f3c6f94157c41d2d82cf608158473e + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547101213fa5a9485d131330b0dad493c48c4ae6e125226c1171f6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665239caf37bac645326193f36abf47c49b4568ab9ea3933a8dab0a835393c23e35235d08e2daad3a980adadad2fe14cc641a92e52f86d0316b33e490ee1569451313789c5c25b4bed70be +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=561aa523426011b76cd099db2c038f6405739eee844f4f59da33c6c315bebf27a86ff32a01f76e4dcfbe1cff50fa777dc99480af6b625530f264c850117ba858360c0d519c4a1ca747fa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c188211012160a32e31359391f5d3bd9ebe2af466c2c3759d36d7f1b723a53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=330f1b1616e11def88c53fefeede6e62e5c89414516dc4f3eb55cc0a6dd244 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce80c6f31a908077340a4584cf6faa69c9d1076e89096c43a500 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eb1b0ba3208b9285c46d88de673268c0a9c11d1372df5c12348027d7b20d33e3f1dc618f2ee5f89bf2d6693b74596bf6ffa8d86d9c0976834a4b87c0a380495a89999ec6de2c885e64d4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=6008678f2ef024bf48e09a421bfa274e0e134657e952b07b9628b88938f8489a42d6827d04601ecd23c946828baed03cb9ce7cabcf4646be4769f43bbf0e7bc04e369a6800d2b22856f9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f0fdc970b0edc1b34eff18de0753b76a4c407c63c75dfa31b7718a25bd9852 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=058345e46ccb2548fdff3835a49a67f7470b5e1d7c58b338e64ca4350b3bca + +handshake=Noise_XX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aaf8bd6d4f4015e5465aea27ce9bfe2f9cfeb1b38ee28d45032fe0b31e0ed19188c15754675bdf966090bf821a49f1578a512a2abb9c0aab546dbe471a5eafa8 +msg_2_payload= +msg_2_ciphertext=d91be69fde3995104e4827d77d5162d8757250d035b74525efccce98e892ed6266fdf087797c505e45b50a46d6c0bccc9fc689102189cf5dc55ddd007ae7ae95 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55ac89364861faed9538fe931a2bf90878fa10072b3c5e520b733728948e1c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4a9308221816fe917b617d45c8a1f8bdb8adafec2bb9ab2f8bd6b1627bf9e1 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c61a84f1a6f875a80930f90f6f24c98e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466581a3db6c8617d78b487458dfc00147b77d9a8f9d55d33fa54e9a099348118f95fdf6b5e53f9941c830ed2b01b858b1cae8d9a2026d27b784b650536adc06b0a +msg_2_payload= +msg_2_ciphertext=4f14513ce6f321d3e3cb4585286a18c666e6b3777ae346a7480f09dca7af55757f81040aaf7fa96ac14f973829c5f53b5c315baabb32d581cffff9457e8b9660 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=53f77a183580b9f1fbcef4857976951cff9f90e21cca7a4fe7cddd5303b23f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25166ac4cc0f48a5e9a1af15f86c0a4b065a0c587aaadbcfb76ca98540431 + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547d0b7163177636e07746a0985baa1bde +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c5c243ed69e6c32a5c5016b1b66676d6076aede0fd2df3c89b58f2df5a3ed2cf106bc5908bfbab97630dda6e089b6aabac42302aaa36328231a8f5ce210973f3 +msg_2_payload= +msg_2_ciphertext=77f77a124d513addd8faed07d38add6dc885d466a1f3f259847430780d121ac59d643454a8e9f7309150a019ecbd2c5eb6fd18674276f048feb2e80e0b428dd0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd96a733132ce4bf0bb7f1fbffffd0e2cc805e2b2bc5b4c14684d1370e93fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73803758314e6aa57533c404442d54e9f3c6f94157c41d2d82cf608158473e + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d3009e8a46eae769bf4bc5725b082568 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665239caf37bac645326193f36abf47c49b4568ab9ea3933a8dab0a835393c23e3a19c252ee839914581c912acd79e8b9d3e045cc120fa53182cd22a4b3ec551b4 +msg_2_payload= +msg_2_ciphertext=561aa523426011b76cd099db2c038f6405739eee844f4f59da33c6c315bebf2742413b1948478b5bf0a2331b765d1f5d93006650dec2aa4e51d16b0a4f9ed84f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c188211012160a32e31359391f5d3bd9ebe2af466c2c3759d36d7f1b723a53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=330f1b1616e11def88c53fefeede6e62e5c89414516dc4f3eb55cc0a6dd244 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7995d341b626e9de9e7b8f09441a8a7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eb1b0ba3208b9285c46d88de673268c0a9c11d1372df5c12348027d7b20d33e3b04a922618a0b8b1b247a4746b7b3d100cdb2fe21f40d48dbba03ef0fdeaee2b +msg_2_payload= +msg_2_ciphertext=6008678f2ef024bf48e09a421bfa274e0e134657e952b07b9628b88938f8489a810f13458ca37c4cf1ab45090357408af6d8938f5c1d45d9bc7b5c07665a6b4b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f0fdc970b0edc1b34eff18de0753b76a4c407c63c75dfa31b7718a25bd9852 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=058345e46ccb2548fdff3835a49a67f7470b5e1d7c58b338e64ca4350b3bca + +handshake=Noise_XX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aaf8bd6d4f4015e5465aea27ce9bfe2f9cfeb1b38ee28d45032fe0b31e0ed191ffc04dfc10ecd2efabbf30685693bcdcede85376a07ee6cffe47f51e2ae72a25058bc75b4b1293b32811 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d91be69fde3995104e4827d77d5162d8757250d035b74525efccce98e892ed62c58bfde86a5512485175dec124b4c4ed6ca99d40ed5aa6600279bfbec5148741711eb6ad6fad14206c21 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=55ac89364861faed9538fe931a2bf90878fa10072b3c5e520b733728948e1c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4a9308221816fe917b617d45c8a1f8bdb8adafec2bb9ab2f8bd6b1627bf9e1 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487982e3421ad43f420896f297a503188b235e25f5b56dcfd99ab +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466581a3db6c8617d78b487458dfc00147b77d9a8f9d55d33fa54e9a099348118f9521624cfc2d1ee318b7bce45260d590542ee5e297273ad7654ac556ccc7b6279a69733d6803d5b982594 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4f14513ce6f321d3e3cb4585286a18c666e6b3777ae346a7480f09dca7af5575a5f197a33764d3271cca1b3c345f51c31127f4f272356b921ee0a462f08c85c527b4e4935625e3fc88ff +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=53f77a183580b9f1fbcef4857976951cff9f90e21cca7a4fe7cddd5303b23f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25166ac4cc0f48a5e9a1af15f86c0a4b065a0c587aaadbcfb76ca98540431 + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c13c5b571263574d9b5726f56ea9aea8cc317511bfa8cf5e2e1f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c5c243ed69e6c32a5c5016b1b66676d6076aede0fd2df3c89b58f2df5a3ed2cfc938f3dab94aee2e67ff7d9e578192a2fb9620d663d5ed0482297f2455ba11c3289db6b3286384edc470 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=77f77a124d513addd8faed07d38add6dc885d466a1f3f259847430780d121ac51abfc6c6a39ce2c55a3b56fd63456b5901e3130a6fb48336ebc671ee2c5dde5da9dd4211c69d2a7c0347 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd96a733132ce4bf0bb7f1fbffffd0e2cc805e2b2bc5b4c14684d1370e93fe +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73803758314e6aa57533c404442d54e9f3c6f94157c41d2d82cf608158473e + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547101213fa5a9485d131331cc470c9c3a47b65d4dd9bfe832ccb8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665239caf37bac645326193f36abf47c49b4568ab9ea3933a8dab0a835393c23e3313ca4fa5c74e7a3f687a0d725e5db2641a92e52f86d0316b33e286176bad79badc46cb1e846e93a94f5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=561aa523426011b76cd099db2c038f6405739eee844f4f59da33c6c315bebf27e342e9ce2aa8d9d9b87f72a0cfa70c2ac99480af6b625530f264be548caae99ab6f8c4f6e199fb0faf40 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c188211012160a32e31359391f5d3bd9ebe2af466c2c3759d36d7f1b723a53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=330f1b1616e11def88c53fefeede6e62e5c89414516dc4f3eb55cc0a6dd244 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce80c6f31a908077340a967f7f3c97956cdff82835c308ff284f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eb1b0ba3208b9285c46d88de673268c0a9c11d1372df5c12348027d7b20d33e33ac38234778daf6c29e41aa50404fd91ffa8d86d9c0976834a4b8710815760185846df07e7ce9d95fa50 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=6008678f2ef024bf48e09a421bfa274e0e134657e952b07b9628b88938f8489ae12fc5cc1631fe08b8526b92f6348454b9ce7cabcf4646be47698ec1a10e0324a73b83e15a85d15ea053 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f0fdc970b0edc1b34eff18de0753b76a4c407c63c75dfa31b7718a25bd9852 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=058345e46ccb2548fdff3835a49a67f7470b5e1d7c58b338e64ca4350b3bca + +handshake=Noise_IX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466622476f6dc13fa05c82e29cf98e37d7c1e7aa9ea2ab7f341ba1db3e536ab9af93cc8bb3b47ed05ed3f678780e0294be50c0ed95f97a0ef014d45ef36ad2a6c5c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ee8c647ae002695d09b4ff7719085f820510f5a00c52e8b45b44a4a84d3689 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a1fd2b44a73bc70a207f970b6a6843e7247110f3be8d14a41507a506f03d63 + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431e791109f10371f8305b72a88065b517025301ef523d9962d49201d5de6e03c8bc1c4d453575f9090a9070b8d2e27260315853452593e9bc82684a3f764a93b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c3a98ae9b8944c2e04b14098f75624c9649bc20d92b4fb9feb450c5adea13242b5e9e5187d7abe391fbc3a654f9042eeeaf3495b08b3450da47f9d5bded12a25 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96e8b979ac204a4c22fdb58e70f10a889d0ceb52a777e75376846e3e403903 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0d019e644bbdcc10bdc2443d0d12fd11a3d2122140ee3a01ef7c938726df92 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254074d28976125a685694f6e4d9f29f2dad768122fac65114c256e3280ff7fac212c40d51848089066523ed4026ecbf4e5ed14ca5590c1ed214fbfd90f0356ed13 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc1b623297e2182c3fc0e0c16f6799309650dd06e4b3e6004d30842f8fd46a1115a937ef532eecd9383d07a136a4177ef2ce37c2ed1d9f0ab601b1401b958217 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=16b0e85f7d29c70b5b3c6e087496d10c8b6f491eaf1d1a29d1988ab2d9a963 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=006069daef25a0d1b668145368fdd76e61a0aed53c7109f45bb6632b6155c7 + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254707384f2d1b60403d6983f48cdd2d54ef6d6201bd7b042556a09f4f21189e79550dec3d76dd8bb9657244ebc557e0fd1bff35cb50b8b64c9658a686404899b85 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b980bf81bae21ec3c711890b8af89330c505cb0a91b17caf3fd343fd318cb6010831177fec17f21da68af33d1d8c9909cd8236240afcd56f5f9d70f090b812f2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=387c61a76a79957e3f99d5dba4d89b098652201ea26220e961953955512f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81c3b9c80cd9d312e0208e596ffb917cc56971bab803eb6cfab729ddb91e01 + +handshake=Noise_IX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466622476f6dc13fa05c82e29cf98e37d7c1e7aa9ea2ab7f341ba1db3e536ab9af9d587c9ce59c0b5c278f67832116b7cc3863bdda85e4ea48d3401af232d6f738e3d27d3971c464ae019da +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ee8c647ae002695d09b4ff7719085f820510f5a00c52e8b45b44a4a84d3689 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a1fd2b44a73bc70a207f970b6a6843e7247110f3be8d14a41507a506f03d63 + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431e791109f10371f8305b72a88065b517025301ef523d9962d49201d5de6e03c8bc1c4d453575f9090a9070b8d2e2726db0b7bef43ed75985760735cdb3ccf94f6799816a1bd407543c3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c3a98ae9b8944c2e04b14098f75624c9649bc20d92b4fb9feb450c5adea13242eef1dcae8547d04ec9cf15988accc82d4bee7c7f595716a7855c9e8e0dbd78e2baefbaa4ee1de38bf3a9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96e8b979ac204a4c22fdb58e70f10a889d0ceb52a777e75376846e3e403903 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0d019e644bbdcc10bdc2443d0d12fd11a3d2122140ee3a01ef7c938726df92 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254074d28976125a685694f6e4d9f29f2dad768122fac65114c256e3280ff7fac212c40d51848089066523ed4026ecbf4e5311f872ca6e591f4b57ca869841735ab09d7cff59de84efbcbfe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc1b623297e2182c3fc0e0c16f6799309650dd06e4b3e6004d30842f8fd46a1118b39882825db18d1a6f1e11c33189f75096fc90d3eb24eed3204a21588804fbf5bc658546c38809ebf2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=16b0e85f7d29c70b5b3c6e087496d10c8b6f491eaf1d1a29d1988ab2d9a963 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=006069daef25a0d1b668145368fdd76e61a0aed53c7109f45bb6632b6155c7 + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254707384f2d1b60403d6983f48cdd2d54ef6d6201bd7b042556a09f4f21189e79550dec3d76dd8bb9657244ebc557e0fd1abf9112523840039f52508eb47ad4896afc7ec7b61f0946286aa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b980bf81bae21ec3c711890b8af89330c505cb0a91b17caf3fd343fd318cb6019e547161afe678cea50333bd13f79208b80461c0e0c3d43a8780339640a33c5894699b57245fcab80c22 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=387c61a76a79957e3f99d5dba4d89b098652201ea26220e961953955512f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81c3b9c80cd9d312e0208e596ffb917cc56971bab803eb6cfab729ddb91e01 + +handshake=Noise_IX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466622476f6dc13fa05c82e29cf98e37d7c1e7aa9ea2ab7f341ba1db3e536ab9af930a67ac8e3f12fd042fcd87fedac96d10e9b513fce9dfa7034fa01b91e268d3b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ee8c647ae002695d09b4ff7719085f820510f5a00c52e8b45b44a4a84d3689 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a1fd2b44a73bc70a207f970b6a6843e7247110f3be8d14a41507a506f03d63 + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431e791109f10371f8305b72a88065b517025301ef523d9962d49201d5de6e03c87375bdd6fe082a2538efee6d0aca07cf6da198785e60eb9eda10515d4de2c05 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c3a98ae9b8944c2e04b14098f75624c9649bc20d92b4fb9feb450c5adea13242cefd4fe51aee2d3e8a57497962d253f52fda8e4799e79cabd5b97126107f51ef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96e8b979ac204a4c22fdb58e70f10a889d0ceb52a777e75376846e3e403903 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0d019e644bbdcc10bdc2443d0d12fd11a3d2122140ee3a01ef7c938726df92 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254074d28976125a685694f6e4d9f29f2dad768122fac65114c256e3280ff7fac212288a529637006c9cdf63983295b55d008a5b13d51883b6d510ce07db1e0ab29 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc1b623297e2182c3fc0e0c16f6799309650dd06e4b3e6004d30842f8fd46a11ac55526f15c640cf8454ba6f133edbefea975b2d2a2cf13d43c07b29046905a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=16b0e85f7d29c70b5b3c6e087496d10c8b6f491eaf1d1a29d1988ab2d9a963 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=006069daef25a0d1b668145368fdd76e61a0aed53c7109f45bb6632b6155c7 + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254707384f2d1b60403d6983f48cdd2d54ef6d6201bd7b042556a09f4f21189e795a4d70b030812e4f3c7df3faff6cf7997ce1cf5b41dc8f39c10f7a6c8160325ba +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b980bf81bae21ec3c711890b8af89330c505cb0a91b17caf3fd343fd318cb601ce71053a753dc4a395c38bee2f9c65d9371aac75c9b11cd59c3d9c8040cc8c1a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=387c61a76a79957e3f99d5dba4d89b098652201ea26220e961953955512f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81c3b9c80cd9d312e0208e596ffb917cc56971bab803eb6cfab729ddb91e01 + +handshake=Noise_IX_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466622476f6dc13fa05c82e29cf98e37d7c1e7aa9ea2ab7f341ba1db3e536ab9af9cf8d0caf69ea6d6d9fe863f135d765dc863bdda85e4ea48d340128833ce0029b5e80c4902e07ca963cc6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ee8c647ae002695d09b4ff7719085f820510f5a00c52e8b45b44a4a84d3689 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a1fd2b44a73bc70a207f970b6a6843e7247110f3be8d14a41507a506f03d63 + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431e791109f10371f8305b72a88065b517025301ef523d9962d49201d5de6e03c87375bdd6fe082a2538efee6d0aca07cdb0b7bef43ed759857605b1c8a4434514ba7ff980a94999f767b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c3a98ae9b8944c2e04b14098f75624c9649bc20d92b4fb9feb450c5adea132421dff6426674f95b9cca665bf38c8a2664bee7c7f595716a7855ce3a01c256df89227a7f03ae351c54d1c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96e8b979ac204a4c22fdb58e70f10a889d0ceb52a777e75376846e3e403903 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0d019e644bbdcc10bdc2443d0d12fd11a3d2122140ee3a01ef7c938726df92 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254074d28976125a685694f6e4d9f29f2dad768122fac65114c256e3280ff7fac212288a529637006c9cdf63983295b55d0311f872ca6e591f4b57cc52c513c2541cad183c73557e8de3884 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc1b623297e2182c3fc0e0c16f6799309650dd06e4b3e6004d30842f8fd46a1165270d8bc779d74b6158d1ad0382aeab5096fc90d3eb24eed320925d70db3a28b6913b2184f99d534c83 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=16b0e85f7d29c70b5b3c6e087496d10c8b6f491eaf1d1a29d1988ab2d9a963 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=006069daef25a0d1b668145368fdd76e61a0aed53c7109f45bb6632b6155c7 + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254707384f2d1b60403d6983f48cdd2d54ef6d6201bd7b042556a09f4f21189e795a4d70b030812e4f3c7df3faff6cf7997abf9112523840039f525ad5950e38bc095c149086d5a40ae31ef +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b980bf81bae21ec3c711890b8af89330c505cb0a91b17caf3fd343fd318cb60191ee54eae17fa342a351b1b09dce4265b80461c0e0c3d43a87803fd715ab4c27017bb4cf345588a80109 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=387c61a76a79957e3f99d5dba4d89b098652201ea26220e961953955512f27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81c3b9c80cd9d312e0208e596ffb917cc56971bab803eb6cfab729ddb91e01 + +handshake=Noise_N_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6359a5d6c7a1d170a912f5fe2c9edca +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f5bf9f4283f184acb247e55708b728b70ec83427200de1900a41e685e7f2c2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ebe3aeca2bc09cd4f4168e8a33186aace3fca9d05ec0380c258e4124a8ae01 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438817726d5cb633f2f7039e327d8d659 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bb3c765be9629a576747028e7a7916e1a4b30ebf768c5417e431bfd32aceb7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4f792448e97c8c5cbc0ddbc2f6df569f02a6de080d72d9e766c2cae2706e45 + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6e56e8d7384aa396e1e8a0517e02a6c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=91363a8183aa963e9d8e2ffbb446e41caf9a089628b68726b35ec8a9ea65f5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a72d808b3ec5344cabf496ba6c02af8caff4b518b8d7c37a03dd69e560baf0 + +handshake=Noise_N_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa097823bab1ebd1506811991b670155aa82a4cd8b4bbe761b5c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f5bf9f4283f184acb247e55708b728b70ec83427200de1900a41e685e7f2c2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ebe3aeca2bc09cd4f4168e8a33186aace3fca9d05ec0380c258e4124a8ae01 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625484649fcef92dec96507574eb9cec727f5f7da8ff6886fd70ac2c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bb3c765be9629a576747028e7a7916e1a4b30ebf768c5417e431bfd32aceb7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4f792448e97c8c5cbc0ddbc2f6df569f02a6de080d72d9e766c2cae2706e45 + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254be7a2d6947cc9358be204acc063aea95100411f5fd0cc3985b3d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=91363a8183aa963e9d8e2ffbb446e41caf9a089628b68726b35ec8a9ea65f5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a72d808b3ec5344cabf496ba6c02af8caff4b518b8d7c37a03dd69e560baf0 + +handshake=Noise_N_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549430a045cd2d4d6811150b99292daae4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f5bf9f4283f184acb247e55708b728b70ec83427200de1900a41e685e7f2c2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ebe3aeca2bc09cd4f4168e8a33186aace3fca9d05ec0380c258e4124a8ae01 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540ac0e3d45b1948f681e1682ebee5dd45 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bb3c765be9629a576747028e7a7916e1a4b30ebf768c5417e431bfd32aceb7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4f792448e97c8c5cbc0ddbc2f6df569f02a6de080d72d9e766c2cae2706e45 + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ec9db97d69c252fc8f8742e0f4a7e1e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=91363a8183aa963e9d8e2ffbb446e41caf9a089628b68726b35ec8a9ea65f5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a72d808b3ec5344cabf496ba6c02af8caff4b518b8d7c37a03dd69e560baf0 + +handshake=Noise_N_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa097823bab1ebd15068f4572f11b906f0509166173a6e4a6273 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=f5bf9f4283f184acb247e55708b728b70ec83427200de1900a41e685e7f2c2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ebe3aeca2bc09cd4f4168e8a33186aace3fca9d05ec0380c258e4124a8ae01 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625484649fcef92dec965075fe2be8f7e95575f16fc60eda06edfe27 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bb3c765be9629a576747028e7a7916e1a4b30ebf768c5417e431bfd32aceb7 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4f792448e97c8c5cbc0ddbc2f6df569f02a6de080d72d9e766c2cae2706e45 + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254be7a2d6947cc9358be205a810af7eb9e663eea8ecfec02cb8641 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=91363a8183aa963e9d8e2ffbb446e41caf9a089628b68726b35ec8a9ea65f5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a72d808b3ec5344cabf496ba6c02af8caff4b518b8d7c37a03dd69e560baf0 + +handshake=Noise_K_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f6065d2dbb9baa86605ebf7b6c743a9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=46685f7f48e63d44f5cd878e8344a49e8cb366489ceaf4a3665f7e50be6658 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=67b542a893449da5c0d811252a061e86d78e6f38e8dfd6ea91758c5efee3cb + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce3f329cc91477035bf61c0cdc30e80b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=606a2840cc2a7cc01e93500ddd06b165aa23af8f31fb02968ea815ff4be3de +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9a68c42768a4e608ffc81120222f6b93950d5c7af8438e81fc6422c1f6de6a + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254063e3bccc72c13cd3469bb230e1384c2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c1c4aaf379d5ba311247236fd68665336ab954fefc742cc9151032b2a5639f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=d94fcde08550aa28096d526b2054a32f79a9232837b2a9596e8b1054f680b9 + +handshake=Noise_K_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bcc436a2edb74613f5e73ff0cbfda5cb0e6cc1eb2164829c4d34 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=46685f7f48e63d44f5cd878e8344a49e8cb366489ceaf4a3665f7e50be6658 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=67b542a893449da5c0d811252a061e86d78e6f38e8dfd6ea91758c5efee3cb + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254565f2ca67c2a0bd9e036531691ac9362bc81d923f9384405fd05 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=606a2840cc2a7cc01e93500ddd06b165aa23af8f31fb02968ea815ff4be3de +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9a68c42768a4e608ffc81120222f6b93950d5c7af8438e81fc6422c1f6de6a + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254eb8d7c30c00e0fae542623b3ed495873dcc8fc25596a3c04aa5c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c1c4aaf379d5ba311247236fd68665336ab954fefc742cc9151032b2a5639f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=d94fcde08550aa28096d526b2054a32f79a9232837b2a9596e8b1054f680b9 + +handshake=Noise_K_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d40e94b2d13927059aa1e609ffd168e3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=46685f7f48e63d44f5cd878e8344a49e8cb366489ceaf4a3665f7e50be6658 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=67b542a893449da5c0d811252a061e86d78e6f38e8dfd6ea91758c5efee3cb + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f091ca3d19682d9ec8aa47bae87c888 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=606a2840cc2a7cc01e93500ddd06b165aa23af8f31fb02968ea815ff4be3de +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9a68c42768a4e608ffc81120222f6b93950d5c7af8438e81fc6422c1f6de6a + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542cc66e189a62c266ec1d89ab60e6e640 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c1c4aaf379d5ba311247236fd68665336ab954fefc742cc9151032b2a5639f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=d94fcde08550aa28096d526b2054a32f79a9232837b2a9596e8b1054f680b9 + +handshake=Noise_K_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bcc436a2edb74613f5e745b38fa18699422bcccdcd0af79b7e35 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=46685f7f48e63d44f5cd878e8344a49e8cb366489ceaf4a3665f7e50be6658 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=67b542a893449da5c0d811252a061e86d78e6f38e8dfd6ea91758c5efee3cb + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254565f2ca67c2a0bd9e036467bf9073d8c7351ac13f4798b62a054 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=606a2840cc2a7cc01e93500ddd06b165aa23af8f31fb02968ea815ff4be3de +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9a68c42768a4e608ffc81120222f6b93950d5c7af8438e81fc6422c1f6de6a + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254eb8d7c30c00e0fae54265f2bff17b2e288bfccc3bb76c742beb0 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c1c4aaf379d5ba311247236fd68665336ab954fefc742cc9151032b2a5639f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=d94fcde08550aa28096d526b2054a32f79a9232837b2a9596e8b1054f680b9 + +handshake=Noise_X_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae50825004becfffe1a179be72c6e15ccc2c72727385ce02b8235b081e61aa049e281d25a75a66c83a48e736491cbb7044ddf558abb9fcaaf6157619f41dff9f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1948e447f76f5337534c280ebd220db961d6ebb9bd12db223de7528605c36f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=135cfc52de19616945aa2ad6c5cc04849608eafee2ff4222c013aa0b23dc33 + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7375b5a510999c4b39fda0567b848eb149f5699752369183239db664fa14e63e9a9b61dd5971684104852bf16a5d13947ea7f52a91ebb7e98b1462f76bbab87 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0f71c21b1edfb5eedb2f0bf2afc333854ad3b88d85bdb1dcbabc200c86adca +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=484530df1518ec3798f235162c2d8d98c40bb8896cf863debc51f1ea53b76b + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3b3c704067dc33efce5bd9217dddd65a82aee230acfd966320c92d40c5f1fe596e9b54f6f0847c5c9f5e06f542c0a8332ae17acafabae272de40b560072b9cc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7f8089c4143e918f5755a613565b3412da583f1d1e45d1eb0b0162ae75aed8 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=6f73460c11922e7f77b5661ddcc7bc4e6bd7d8749cd2181aa6c99d5b5e20fe + +handshake=Noise_X_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae50825004becfffe1a179be72c6e15ccc2c72727385ce02b8235b081e61aa049e281d25a75a66c83a48e736491cbb70d04b408e4e1b9f2f0dd80ae2871d7857bc4d057f3fb66808c320 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1948e447f76f5337534c280ebd220db961d6ebb9bd12db223de7528605c36f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=135cfc52de19616945aa2ad6c5cc04849608eafee2ff4222c013aa0b23dc33 + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7375b5a510999c4b39fda0567b848eb149f5699752369183239db664fa14e63e9a9b61dd5971684104852bf16a5d139025417449f82c85ee89977abd0d750fe80c47e9b228ed26e5c7c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0f71c21b1edfb5eedb2f0bf2afc333854ad3b88d85bdb1dcbabc200c86adca +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=484530df1518ec3798f235162c2d8d98c40bb8896cf863debc51f1ea53b76b + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3b3c704067dc33efce5bd9217dddd65a82aee230acfd966320c92d40c5f1fe596e9b54f6f0847c5c9f5e06f542c0a838469063891941b5b191c47ee925457eb3c054db3c14f48666732 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7f8089c4143e918f5755a613565b3412da583f1d1e45d1eb0b0162ae75aed8 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=6f73460c11922e7f77b5661ddcc7bc4e6bd7d8749cd2181aa6c99d5b5e20fe + +handshake=Noise_X_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae50825004becfffe1a179be72c6e15ccc2c72727385ce02b8235b081e61aa04279392a66a24958e4c789de27a5a0e99960ea42aafb2efaf1f6062a89b3ac3bd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1948e447f76f5337534c280ebd220db961d6ebb9bd12db223de7528605c36f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=135cfc52de19616945aa2ad6c5cc04849608eafee2ff4222c013aa0b23dc33 + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7375b5a510999c4b39fda0567b848eb149f5699752369183239db664fa14e63302f42f2022e000bdbfc75716f88b8221e6e2aefeffac88f8436a601947a28aa +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0f71c21b1edfb5eedb2f0bf2afc333854ad3b88d85bdb1dcbabc200c86adca +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=484530df1518ec3798f235162c2d8d98c40bb8896cf863debc51f1ea53b76b + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3b3c704067dc33efce5bd9217dddd65a82aee230acfd966320c92d40c5f1fe59c14457d6a0815656bce5597e12c212ddea7c3b7f9ad5802e672eff6e7aaf628 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7f8089c4143e918f5755a613565b3412da583f1d1e45d1eb0b0162ae75aed8 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=6f73460c11922e7f77b5661ddcc7bc4e6bd7d8749cd2181aa6c99d5b5e20fe + +handshake=Noise_X_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae50825004becfffe1a179be72c6e15ccc2c72727385ce02b8235b081e61aa04279392a66a24958e4c789de27a5a0e99d04b408e4e1b9f2f0dd8b324d4802cfb3c954c58df50ce19a54c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1948e447f76f5337534c280ebd220db961d6ebb9bd12db223de7528605c36f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=135cfc52de19616945aa2ad6c5cc04849608eafee2ff4222c013aa0b23dc33 + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7375b5a510999c4b39fda0567b848eb149f5699752369183239db664fa14e63302f42f2022e000bdbfc75716f88b822025417449f82c85ee8999a9d0502c5154f52f57239a43338ebd2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0f71c21b1edfb5eedb2f0bf2afc333854ad3b88d85bdb1dcbabc200c86adca +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=484530df1518ec3798f235162c2d8d98c40bb8896cf863debc51f1ea53b76b + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3b3c704067dc33efce5bd9217dddd65a82aee230acfd966320c92d40c5f1fe59c14457d6a0815656bce5597e12c212d8469063891941b5b191cfce15fda4e83fcf8fb9065f9c55e22fc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=7f8089c4143e918f5755a613565b3412da583f1d1e45d1eb0b0162ae75aed8 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=6f73460c11922e7f77b5661ddcc7bc4e6bd7d8749cd2181aa6c99d5b5e20fe + +handshake=Noise_NN_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846683a0dd518c7d9a09bc8500bc2e868187 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0909e697fc6dca9ffceffebee77c39187c353d4256d66f6d42ff5d6a8b5bcd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0770576631856631b449818953d4252baf1cf8d49d718ce220b9173567fc97 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541535fb045bd97504725efe47351fd5d8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e0bd9f3000f0f276e99bdc78a91a30ca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7bb01e54840881ef4911b030602c665e4799652c4260b32f67119716cf2dac +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=63c4c131b3c079eb101cf9cd03627e5d50e693513402efb26d5f46d62ba1e0 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254febbb98d9ec54939c9cd08f15df12c9d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a233b33fe34e7a3cf0d34cc475ced00d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8617a57d1a212d915a093ba691465321b3a5e83a2a09334bc17a66e07f340b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bbddd9a51a1fe99634ea09790bfab387047c0bee2b540cbaa009e4b33f547d + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542383ccc8749a96890523a8c5c90c3b3a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846620c5d7fc3e102d94a2bcab25721f32c4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a924b18a801dad51bf702aa50f87d8f3e2d3e54cb76c94493f5305768f5f64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c94546ec021695355755f7e82ce1a12679f8df2d5a5b6e533c4cdc645a5f9 + +handshake=Noise_NN_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626cb189266923cb8ce8e4c5203887255b709071d34ae3fb80274 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0909e697fc6dca9ffceffebee77c39187c353d4256d66f6d42ff5d6a8b5bcd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0770576631856631b449818953d4252baf1cf8d49d718ce220b9173567fc97 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499813d4f7cdbccb39053e17bb5fcb237d3308481578cdf766e14 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665a507bc4cb8222edadcbb119a863c7e86363718152651d0ce152 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7bb01e54840881ef4911b030602c665e4799652c4260b32f67119716cf2dac +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=63c4c131b3c079eb101cf9cd03627e5d50e693513402efb26d5f46d62ba1e0 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254294dfe9247d7b2223638cfbb18fa8d5f4fca0215e7d473ee39aa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846638d4e172b074863b2c8ec44bba6907b80112d0d2358b4abb6e55 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8617a57d1a212d915a093ba691465321b3a5e83a2a09334bc17a66e07f340b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bbddd9a51a1fe99634ea09790bfab387047c0bee2b540cbaa009e4b33f547d + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b462c2b118f585719b4c4853b82356500feb45573d40dfdd474 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f09893c38c139765e44808080e1dacdc75c32e596a79f72f0ee +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a924b18a801dad51bf702aa50f87d8f3e2d3e54cb76c94493f5305768f5f64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c94546ec021695355755f7e82ce1a12679f8df2d5a5b6e533c4cdc645a5f9 + +handshake=Noise_NN_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c70a91b5ce390b4d2002c46c6e2a3248 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0909e697fc6dca9ffceffebee77c39187c353d4256d66f6d42ff5d6a8b5bcd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0770576631856631b449818953d4252baf1cf8d49d718ce220b9173567fc97 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5fa9343b5a5a66947027412f3520c9b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ba0d0f5cf7fc7257567f2f27c2fd627 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7bb01e54840881ef4911b030602c665e4799652c4260b32f67119716cf2dac +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=63c4c131b3c079eb101cf9cd03627e5d50e693513402efb26d5f46d62ba1e0 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cedfcc8eac13a24e1e689e3cfc7baf62 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d387cd8664f5037d39aac8746ccd06b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8617a57d1a212d915a093ba691465321b3a5e83a2a09334bc17a66e07f340b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bbddd9a51a1fe99634ea09790bfab387047c0bee2b540cbaa009e4b33f547d + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540ec56f5161a8755374b1848c641eddc3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466478d9b9fb165b8eb3f4b6718e1f1e245 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a924b18a801dad51bf702aa50f87d8f3e2d3e54cb76c94493f5305768f5f64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c94546ec021695355755f7e82ce1a12679f8df2d5a5b6e533c4cdc645a5f9 + +handshake=Noise_NN_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626cb189266923cb8ce8e3fc80aa75d92678f6bfe13be7ff6aed1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0909e697fc6dca9ffceffebee77c39187c353d4256d66f6d42ff5d6a8b5bcd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0770576631856631b449818953d4252baf1cf8d49d718ce220b9173567fc97 + +handshake=Noise_NNpsk0_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499813d4f7cdbccb39053c90fa0232673ba28f11c1e925324c845 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665a507bc4cb8222edadcb8a3c7dd94841834ec807680c5446d280 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7bb01e54840881ef4911b030602c665e4799652c4260b32f67119716cf2dac +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=63c4c131b3c079eb101cf9cd03627e5d50e693513402efb26d5f46d62ba1e0 + +handshake=Noise_NNpsk1_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254294dfe9247d7b2223638957faf2dd1bd18941b394140015d37ed +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846638d4e172b074863b2c8e80ee9b319d2677512167577c8d105ecb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8617a57d1a212d915a093ba691465321b3a5e83a2a09334bc17a66e07f340b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bbddd9a51a1fe99634ea09790bfab387047c0bee2b540cbaa009e4b33f547d + +handshake=Noise_NNpsk2_25519_AESGCM_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b462c2b118f585719b4d2c84f08adfde3c8f24735ec8df3c5d7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f09893c38c139765e44f2d6a49210f05ada099fb05937f7aa5b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a924b18a801dad51bf702aa50f87d8f3e2d3e54cb76c94493f5305768f5f64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c94546ec021695355755f7e82ce1a12679f8df2d5a5b6e533c4cdc645a5f9 + +handshake=Noise_KN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664441190c10b03429a717dd68392cbc8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6e0b143fbe681fc040a0a32845a6766583a5b8b4615d43ef71a3345aa54e0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8dc5ed06a9e9017a62f1aa3a25421a3264272044251bd7ac02e849872891ae + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a3c3f95a1f27a264236e3ef44c8e4dde +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466facb3853ea6a08b4de16f555048fa04b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bc4c502252e5db42ab745807e689b501dddc0840bd276eb455d6ea1b6a9d8a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cdd0dea469b39b46374e168adb6948bc0ec1b132381214394dd3d98d4e7c3 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545926fa51ad53d91b7a4f033a897a8930 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661cb9f7cae8dc0045a8d861c5ddfa6aef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3af9773fcd5a612c186cf94c7b5e3d008c40d036be9227cf8f90a90bf59cdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60f7a4448202b3535ab559b4a2b28583bf8475c4858b16e4460733a3b44bef + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625401d487a4cde829a7e46047baadfa8d75 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ed06a23fee4f0d95820c4e1f3cbea303 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=415377cf4fe494b8bad397ec42f85401f9a11edfd752e6aaa30a5951e8c5b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9562176c1eb69374a4186d61cda01ec132b826ae9e1644869a1fd5c93fde04 + +handshake=Noise_KN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846678409b14b108da18bef6fbe76cd430200b471f2df5b968638a83 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6e0b143fbe681fc040a0a32845a6766583a5b8b4615d43ef71a3345aa54e0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8dc5ed06a9e9017a62f1aa3a25421a3264272044251bd7ac02e849872891ae + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ac9a08aee31a00906e2c62ee6d06c88657479d8e51978da1bf21 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d46bd6b98eb3ca668bacae3ee77e683c19ca06381ae1ac2f32ff +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bc4c502252e5db42ab745807e689b501dddc0840bd276eb455d6ea1b6a9d8a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cdd0dea469b39b46374e168adb6948bc0ec1b132381214394dd3d98d4e7c3 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f29b85c3ab64ada6747a6dab2e1e7a4cd26cdc28eb5a00cc1083 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661ea48045213d2c8ac201ebab565e2df47e1a3e5fa9c13c674bff +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3af9773fcd5a612c186cf94c7b5e3d008c40d036be9227cf8f90a90bf59cdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60f7a4448202b3535ab559b4a2b28583bf8475c4858b16e4460733a3b44bef + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5328cfba6436415d31dd4d5a50775cff355cb2d891dbbbf2af5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466325031532f718417152caa21e8709f94486d527f4c2b946ebacd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=415377cf4fe494b8bad397ec42f85401f9a11edfd752e6aaa30a5951e8c5b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9562176c1eb69374a4186d61cda01ec132b826ae9e1644869a1fd5c93fde04 + +handshake=Noise_KN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe09eb752d902e72e41d1b0daeb64844 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6e0b143fbe681fc040a0a32845a6766583a5b8b4615d43ef71a3345aa54e0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8dc5ed06a9e9017a62f1aa3a25421a3264272044251bd7ac02e849872891ae + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540776f384d8dcbb0929c9ee5b13e3f0bd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846689bd16f0e54d870dcbf293d64cb12ec5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bc4c502252e5db42ab745807e689b501dddc0840bd276eb455d6ea1b6a9d8a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cdd0dea469b39b46374e168adb6948bc0ec1b132381214394dd3d98d4e7c3 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625417510ed9f5b0c12079db76a8aa285424 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c716e009a9464a48d138b46f035805e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3af9773fcd5a612c186cf94c7b5e3d008c40d036be9227cf8f90a90bf59cdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60f7a4448202b3535ab559b4a2b28583bf8475c4858b16e4460733a3b44bef + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c32a9ede6e1cbd9b00610e80d2fdb2ea +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662d90cba0b594c0e4e0a7c96bb616f298 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=415377cf4fe494b8bad397ec42f85401f9a11edfd752e6aaa30a5951e8c5b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9562176c1eb69374a4186d61cda01ec132b826ae9e1644869a1fd5c93fde04 + +handshake=Noise_KN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846678409b14b108da18bef6fc2974baa4e86c3595efbe635b98b3e2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6e0b143fbe681fc040a0a32845a6766583a5b8b4615d43ef71a3345aa54e0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8dc5ed06a9e9017a62f1aa3a25421a3264272044251bd7ac02e849872891ae + +handshake=Noise_KNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ac9a08aee31a00906e2c8929167672a0faf33aacb6f2e727797f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d46bd6b98eb3ca668bacb80eebd706c1b753a568ab393636daef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bc4c502252e5db42ab745807e689b501dddc0840bd276eb455d6ea1b6a9d8a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cdd0dea469b39b46374e168adb6948bc0ec1b132381214394dd3d98d4e7c3 + +handshake=Noise_KNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f29b85c3ab64ada6747a071c3c7927ef1c434aa4b4269d189234 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661ea48045213d2c8ac201e6357b0a142b0804024efe755a596501 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3af9773fcd5a612c186cf94c7b5e3d008c40d036be9227cf8f90a90bf59cdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=60f7a4448202b3535ab559b4a2b28583bf8475c4858b16e4460733a3b44bef + +handshake=Noise_KNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5328cfba6436415d31d40a72370f1f0b6ac748bae773d61cf5f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466325031532f718417152cd4e5e44d98111867943972554a320228 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=415377cf4fe494b8bad397ec42f85401f9a11edfd752e6aaa30a5951e8c5b4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9562176c1eb69374a4186d61cda01ec132b826ae9e1644869a1fd5c93fde04 + +handshake=Noise_NK_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540aca6f817356230937ac107dff4a8f06 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ad767eba25b2c944082016459215cb2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6f4e53c8e82abdc1877317ee614b2cf1c36694a48536e932f5d5970709c23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d08651c70754decf41c8b79d1fe8e8da60cdf64cbb521ab1f5be171617988 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546e8a8ab143d0babd5bb2974dfd62d421 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa53f63f7b00b20da8a8a24a249b8d00 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e73eb987000909cc3ce02566091760e69f524f23372277fbd94d2b335ee020 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0e503113b6f99ce899fee344347bcc59165d827f4982c9a0af6f53c45608ce + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467403733097e5ba8c0684832b42d212b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c43292db7e2a865604940ab900ec307 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f3415ea0c9132c69c06f29873d9192a0910a6763addfc4e306b13c4e06c57c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c61e0bcc08bc9e2571eabbd48f192ecc3e846463f3b05c4cae6ffa956dce72 + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f00172caeafa67f00bcf4b6a286d653c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe2a80ce5f664bdeef527317284ef4b6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ed4dfff4fbbf57c63acf124128f12d3323706cd4212796f13ba3391f83e249 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8009206bac08e514df2c83e3238bf92c5dc209430cbecb936b1a93813de1dc + +handshake=Noise_NK_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bdf08b60ecbebcc2f5068183649b76c2cc2674fd4d580911729d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dacd38c1ad625caa0a4720445c6ac87f16e4b09d8a27489483fa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6f4e53c8e82abdc1877317ee614b2cf1c36694a48536e932f5d5970709c23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d08651c70754decf41c8b79d1fe8e8da60cdf64cbb521ab1f5be171617988 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548bf52c4caaaaacfe7a715566f9652044280280d56a5301e3d4f7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846694cf846b0941f8f8a46354a686838fa6efbeff8490cd3279ce6e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e73eb987000909cc3ce02566091760e69f524f23372277fbd94d2b335ee020 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0e503113b6f99ce899fee344347bcc59165d827f4982c9a0af6f53c45608ce + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437ad3a66b77c777309c59e3ffb70fdaaa1998f0ea6a7fea4aaf7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e4888b3081c3c5f198244d6a8245e8cbe0d843b4885374b5823 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f3415ea0c9132c69c06f29873d9192a0910a6763addfc4e306b13c4e06c57c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c61e0bcc08bc9e2571eabbd48f192ecc3e846463f3b05c4cae6ffa956dce72 + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f881ee2ccd20f3d6a748ee7bd31867d252abc83c3a2e810bc01 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cc2683e6a737d2a339a6de63b341afc6e6da4f2e6acc295ba0c5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ed4dfff4fbbf57c63acf124128f12d3323706cd4212796f13ba3391f83e249 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8009206bac08e514df2c83e3238bf92c5dc209430cbecb936b1a93813de1dc + +handshake=Noise_NK_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625418771dd05bb254570cd36afecdd1f06b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cc535116cff2a6e84875769de7d118fa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6f4e53c8e82abdc1877317ee614b2cf1c36694a48536e932f5d5970709c23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d08651c70754decf41c8b79d1fe8e8da60cdf64cbb521ab1f5be171617988 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254235c1295c64674e9d24b1ac8387ceff0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f95d8632a153e1ba48ba7c604ac95c2c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e73eb987000909cc3ce02566091760e69f524f23372277fbd94d2b335ee020 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0e503113b6f99ce899fee344347bcc59165d827f4982c9a0af6f53c45608ce + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bb352c4574bffe38b6f2fd437245349 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b4d595560f6d4bab34135d6d5f0e95b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f3415ea0c9132c69c06f29873d9192a0910a6763addfc4e306b13c4e06c57c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c61e0bcc08bc9e2571eabbd48f192ecc3e846463f3b05c4cae6ffa956dce72 + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412175e79501bbdb8f9c34f832d70faf5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660faec0e7d65e6e02e540a12f372524de +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ed4dfff4fbbf57c63acf124128f12d3323706cd4212796f13ba3391f83e249 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8009206bac08e514df2c83e3238bf92c5dc209430cbecb936b1a93813de1dc + +handshake=Noise_NK_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bdf08b60ecbebcc2f5066ba2dc101956c40473b8c6dfbc24f58b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dacd38c1ad625caa0a4702d85babf3841256b5660d3228dc121c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6f4e53c8e82abdc1877317ee614b2cf1c36694a48536e932f5d5970709c23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d08651c70754decf41c8b79d1fe8e8da60cdf64cbb521ab1f5be171617988 + +handshake=Noise_NKpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548bf52c4caaaaacfe7a71f5e1496c23adbee3020d4eb45211637a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846694cf846b0941f8f8a463cfc791d89367bcce3320c4f0460a91b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e73eb987000909cc3ce02566091760e69f524f23372277fbd94d2b335ee020 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0e503113b6f99ce899fee344347bcc59165d827f4982c9a0af6f53c45608ce + +handshake=Noise_NKpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437ad3a66b77c777309c5d7683c6082c82b5adb434c70325029cc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e4888b3081c3c5f1982d5856d4940dbdd17c07b285e331dce60 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f3415ea0c9132c69c06f29873d9192a0910a6763addfc4e306b13c4e06c57c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c61e0bcc08bc9e2571eabbd48f192ecc3e846463f3b05c4cae6ffa956dce72 + +handshake=Noise_NKpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f881ee2ccd20f3d6a74cad4c7694924e6494b10399373d97cd1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cc2683e6a737d2a339a62c5b55ccd5da93091e0295f94ae259b7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ed4dfff4fbbf57c63acf124128f12d3323706cd4212796f13ba3391f83e249 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8009206bac08e514df2c83e3238bf92c5dc209430cbecb936b1a93813de1dc + +handshake=Noise_KK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544cfcee5c7fcaf9d598c33703fd0c2776 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665e6949aaa57066895baf7ab83e004ae5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=31f8fb1587255c4b0dd700a9b6c8f43f8a784c2b182fd9c90e236708314b5d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e536a299bf11d6abe9d3a94183d029f1eb3e12e11b3dab41e21789869dcc93 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b23f41fd589eccd4f092f268f28d26b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846660c9d890cdde369d3d997ed453e687da +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=91e44c0d5d9cd28abf7c8b30bb2e3d0550239b9e17953d9f089ec3d930df27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2e741b2768bfd0bbfeda04cbd22add5afa67b677a3b01af28dbaf63159b9bc + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a0c920d6078d924f12ff949a21dc7538 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846682eb33bc6a6c88a84d4dc18a5d637337 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d95cc1c999c97bbeedd5c7ec4652084d4b62a16f82500d755aa618eb4a53e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=868d5fcee2fc24e0449b05781857718f8a52fa5c7e3e91e31835579480126c + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c378d98d2cbcf1bd35e56b9dc028451 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466222d4ef8c802a217923cc92c7d12ff70 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe234b7f281411b7c6b3d7b75466259f4e5f05c12ba78c04f44432f0fba361 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9e35422ab4388dd10073b1a0ef26ad00041372fdf968809e67f56f1b6ef723 + +handshake=Noise_KK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b607e12f23e87019e6edd5ff907e3244c4faabde9dd7f413268 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f550ee88c31bb77034f6b25459148fe70370546a6e427b27260 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=31f8fb1587255c4b0dd700a9b6c8f43f8a784c2b182fd9c90e236708314b5d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e536a299bf11d6abe9d3a94183d029f1eb3e12e11b3dab41e21789869dcc93 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aa72dba4eb5155d2465ab23ff1c5f93b23534b5f3e4af45250fd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846662d579964a47442efacbe7a4d3d39194eeb4b540be23480bad21 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=91e44c0d5d9cd28abf7c8b30bb2e3d0550239b9e17953d9f089ec3d930df27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2e741b2768bfd0bbfeda04cbd22add5afa67b677a3b01af28dbaf63159b9bc + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e185b6bf0ab96577514a994636c9f591469389a01313efd8bd2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466678170eb78b10bba2423cc2a8177294aae0ef03d0baaf925d9d7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d95cc1c999c97bbeedd5c7ec4652084d4b62a16f82500d755aa618eb4a53e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=868d5fcee2fc24e0449b05781857718f8a52fa5c7e3e91e31835579480126c + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254669c71c550b8a43b3435e62f9eb9a7e2b5b4ee7736ec81cd5b48 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466728e2a0d6eeceaee629ad6b31058960aaf8a1c97905808a811a4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe234b7f281411b7c6b3d7b75466259f4e5f05c12ba78c04f44432f0fba361 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9e35422ab4388dd10073b1a0ef26ad00041372fdf968809e67f56f1b6ef723 + +handshake=Noise_KK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254287c6242f3601fc5c1bb6fcb4624c2c7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466643b4a8d96d6ecdbe3237ac65f97c9d1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=31f8fb1587255c4b0dd700a9b6c8f43f8a784c2b182fd9c90e236708314b5d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e536a299bf11d6abe9d3a94183d029f1eb3e12e11b3dab41e21789869dcc93 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625418e6f83705c0ba5686b5e6c6fde73696 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb489365fc40d89e5eefae396f974201 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=91e44c0d5d9cd28abf7c8b30bb2e3d0550239b9e17953d9f089ec3d930df27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2e741b2768bfd0bbfeda04cbd22add5afa67b677a3b01af28dbaf63159b9bc + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544bf11255412b8f2aa4998140f01f99d1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe35b699e1018d03d289945c4b2e7f42 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d95cc1c999c97bbeedd5c7ec4652084d4b62a16f82500d755aa618eb4a53e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=868d5fcee2fc24e0449b05781857718f8a52fa5c7e3e91e31835579480126c + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b5821e0e9c8793543c024b5cd1f2db2d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ee55655094444f57d6b2e120a31c73e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe234b7f281411b7c6b3d7b75466259f4e5f05c12ba78c04f44432f0fba361 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9e35422ab4388dd10073b1a0ef26ad00041372fdf968809e67f56f1b6ef723 + +handshake=Noise_KK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b607e12f23e87019e6eb13b92b5c3d17ba0183cb1389dcef1a6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f550ee88c31bb77034f98d4889d5f34812eb534a2eca91ba158 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=31f8fb1587255c4b0dd700a9b6c8f43f8a784c2b182fd9c90e236708314b5d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e536a299bf11d6abe9d3a94183d029f1eb3e12e11b3dab41e21789869dcc93 + +handshake=Noise_KKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aa72dba4eb5155d2465a99e91f15ca6c1ffa47e49328ada51b0e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846662d579964a47442efacb52b05a270d3e7875aa8266a03076750c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=91e44c0d5d9cd28abf7c8b30bb2e3d0550239b9e17953d9f089ec3d930df27 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2e741b2768bfd0bbfeda04cbd22add5afa67b677a3b01af28dbaf63159b9bc + +handshake=Noise_KKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e185b6bf0ab965775140f26a11fb5f259000251c39c78189511 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466678170eb78b10bba2423c39edf7b3642c622754f7e6de1afc949 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d95cc1c999c97bbeedd5c7ec4652084d4b62a16f82500d755aa618eb4a53e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=868d5fcee2fc24e0449b05781857718f8a52fa5c7e3e91e31835579480126c + +handshake=Noise_KKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254669c71c550b8a43b34354d21b89675f5c3ab513ce0b34156462e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466728e2a0d6eeceaee629a7e4b94070395666bc89812f54a5e443b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe234b7f281411b7c6b3d7b75466259f4e5f05c12ba78c04f44432f0fba361 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9e35422ab4388dd10073b1a0ef26ad00041372fdf968809e67f56f1b6ef723 + +handshake=Noise_NX_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663cab12734ea8f3f71a191dc053eb280e1760e951ba66c23b2d5d090d325f2bd154f933398586078af56948c397a8e522e525a530c01555483befa16d03b0a992 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8436ee9176feeba72f40eaf8763e62578ad131ddaf3d0e4706f669b0746370 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cc209ffad0968216785972cf62f4288fee898e542b62dba05cf740beac6912 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625407406c210acab2efa5a752bfc7f60f6a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6de020041b1ed9cc0abc1ec10ffd7aab8841f05b32505bd9a4a111e3384642a8ae942b131e5cd1ffcf44770a663898c20a38eefe33480f356b9e87337056524 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a6eb79d6d2329043f6df6945f6b8dc1fad535c008f4393fb464323f179da8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=58ba0042ea02ac6e21a075a4249ac396af30b38fd6db7209070b5594313a5d + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e3b84ba49e616863bae44f4ccf12dea5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fe07338f262359efd7e66ec1129694e277c126937f27237c19af6dfb8fe373329bfbb3fbcca0bee5b4c9b396fc871dcecb0833e162796fde3b1a82e245eff47 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e614e802e27f6218560f56fc3ac90afefc38855e54605b1ab8477408c4289c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7799c71060564989f88dcde89adbc68df6298afc5816cf5ccb1a3810ddd471 + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d98d5b739c87988f54e7981441d55055 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466945048334654701f49de37c70d567af745ec79534fc7a5b274085e6c60e07f98190ba719c270cec77adeb7bf9def9aec80a7e9b7aab8bb527908ce5ed0cb1549 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=18369c84a08bfe295c0b04773443e42ed07f8361d2fdc2d0c59dcd21284f76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e02c82141ccd4004caf2e15e112a0660475627f19400491c41468abdf04fb2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663cab12734ea8f3f71a191dc053eb280e1760e951ba66c23b2d5d090d325f2bd11c587cf45dd929e588e534b20082a5d02cf02b2b4188e655d60b9cb741196cbcef63ecdd5afa9805fee5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8436ee9176feeba72f40eaf8763e62578ad131ddaf3d0e4706f669b0746370 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cc209ffad0968216785972cf62f4288fee898e542b62dba05cf740beac6912 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa0a83212633a12d6bccc46857f520db476dcaf663e969d2c865 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6de020041b1ed9cc0abc1ec10ffd7aab8841f05b32505bd9a4a111e3384642ad3b251d1a6eba26ecafaea916748c17a9c70de5e1fa6e0dd0b9954871761e1d485353b35615d6062a17a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a6eb79d6d2329043f6df6945f6b8dc1fad535c008f4393fb464323f179da8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=58ba0042ea02ac6e21a075a4249ac396af30b38fd6db7209070b5594313a5d + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6807e4adc8d6dbb87a05381de4d11f6c8f24c89895fffea5d44 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fe07338f262359efd7e66ec1129694e277c126937f27237c19af6dfb8fe3733bfde55feb1e178d339b71b6843e8ad41ac5976d65bcc430454e87115cb8ed1f8af531005196898fbdd0a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e614e802e27f6218560f56fc3ac90afefc38855e54605b1ab8477408c4289c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7799c71060564989f88dcde89adbc68df6298afc5816cf5ccb1a3810ddd471 + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458a2a3b6fdb1de5fbee4c4d1b909cc23178033a2176354938109 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466945048334654701f49de37c70d567af745ec79534fc7a5b274085e6c60e07f98137e010d13a87401d82cf9fa31debe616dfea637d445322350acc39cce7c5750354fae351fa25d85aedf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=18369c84a08bfe295c0b04773443e42ed07f8361d2fdc2d0c59dcd21284f76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e02c82141ccd4004caf2e15e112a0660475627f19400491c41468abdf04fb2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663cab12734ea8f3f71a191dc053eb280e1760e951ba66c23b2d5d090d325f2bd180a5ed192be8c4a710ac09ab86735c9d3242bc60c5111ea1e046d3d44a56357b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8436ee9176feeba72f40eaf8763e62578ad131ddaf3d0e4706f669b0746370 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cc209ffad0968216785972cf62f4288fee898e542b62dba05cf740beac6912 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f0bbfa57497b723e7b2df35f66e5b49 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6de020041b1ed9cc0abc1ec10ffd7aab8841f05b32505bd9a4a111e3384642a5689f8f05401600a5b6d74e118644166f25301de37703a013fdad04de6aaddf8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a6eb79d6d2329043f6df6945f6b8dc1fad535c008f4393fb464323f179da8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=58ba0042ea02ac6e21a075a4249ac396af30b38fd6db7209070b5594313a5d + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547e8ba6bebe1a900604e09647da4bea6b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fe07338f262359efd7e66ec1129694e277c126937f27237c19af6dfb8fe37332b83b975639a4c5476e4b308afe63b3d7e0502681de388787adaccb7912c594c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e614e802e27f6218560f56fc3ac90afefc38855e54605b1ab8477408c4289c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7799c71060564989f88dcde89adbc68df6298afc5816cf5ccb1a3810ddd471 + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254abd5c4dbcd9bec08f5785ceef88c8c2f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466945048334654701f49de37c70d567af745ec79534fc7a5b274085e6c60e07f987241469b3c8de0e1b02a94b215ead3207a8c188be0a5c7677e33d1d765308d42 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=18369c84a08bfe295c0b04773443e42ed07f8361d2fdc2d0c59dcd21284f76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e02c82141ccd4004caf2e15e112a0660475627f19400491c41468abdf04fb2 + +handshake=Noise_NX_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663cab12734ea8f3f71a191dc053eb280e1760e951ba66c23b2d5d090d325f2bd1819782ed84cf6815a49c0186e95910d22cf02b2b4188e655d60b3f1f5941cce7dec8fa01ce3c55c671c2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8436ee9176feeba72f40eaf8763e62578ad131ddaf3d0e4706f669b0746370 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cc209ffad0968216785972cf62f4288fee898e542b62dba05cf740beac6912 + +handshake=Noise_NXpsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa0a83212633a12d6bcc9a6171915f8250f6e22ee5eb9935005c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6de020041b1ed9cc0abc1ec10ffd7aab8841f05b32505bd9a4a111e3384642a7b72e559f79e16ba912e9e42d693318d9c70de5e1fa6e0dd0b99aee00aea4e091c9c78558b0dda450750 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6a6eb79d6d2329043f6df6945f6b8dc1fad535c008f4393fb464323f179da8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=58ba0042ea02ac6e21a075a4249ac396af30b38fd6db7209070b5594313a5d + +handshake=Noise_NXpsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6807e4adc8d6dbb87a0ae8cdebfa23da36d298070b955c319ab +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fe07338f262359efd7e66ec1129694e277c126937f27237c19af6dfb8fe37332302e237cbffd3e19f431a1cc57ea233ac5976d65bcc430454e825bf561eaaac606af413730ed8b93383 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e614e802e27f6218560f56fc3ac90afefc38855e54605b1ab8477408c4289c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7799c71060564989f88dcde89adbc68df6298afc5816cf5ccb1a3810ddd471 + +handshake=Noise_NXpsk2_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458a2a3b6fdb1de5fbee4e074465318c6eb7e520349b275865007 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466945048334654701f49de37c70d567af745ec79534fc7a5b274085e6c60e07f98412430a46f760ec9e1a6849c01302cda6dfea637d445322350acca1bb1953e282c6dca68169edb531404 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=18369c84a08bfe295c0b04773443e42ed07f8361d2fdc2d0c59dcd21284f76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e02c82141ccd4004caf2e15e112a0660475627f19400491c41468abdf04fb2 + +handshake=Noise_KX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d750365e947a92608f1c492f6d7a07b738ad37cd00e241497371929a94c4e6d02ec1185f23719493931cc5fa4ab2f7fb197acfe601403b4cdc967bd4cfbfaa89 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=120302ad872ca2e8e3b44a5b25ee43323ebf5abc3ac15cb6cb5a5b6367f06d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e276ab45beaadc196449e0137fc9c45531a4452153b1ef0f732caa7e9fe65 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625468f71c2faf195aa778d37d4cc2859372 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2a0c08410deab404ac28d06fd35af5d5a1f7b45db9be3842df0988cf20cc7f433847dca55766a1df984e2d6387336ee54acbd608d81d44911b68d22f18ca5af +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c406f3b52c73e6224bd731a3ff48b84c28ce5208cab54fd266e27003a925a3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05e22b85e52a23eabb16edc9afae206d59c234922e75f8385e65db5a56bfe8 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549dd6608dbfbdd3cf57c0f8169912c0ae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466106146b159cbf91766e59566ea4c89cadf4b72f33418c93919793fdf6c00642117d43f701bda94e37d0cac2bc4490ff97557188ed6165537241084fa6609d7dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8a3ddb48d59389bdac13a351f63d1f47e3aae4e56f849ca12f48195e751e15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=625c80ee8afe830d7944fc7c33bf51077d94cc75433369d849f42d63edb751 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419f548b86c9a3238c72eb37b232d8679 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a08a362949425a6abadf4e80b05db9449b0dbdbfbec6eb5220f535d9356f58a304f0c8066c9d955713b561b2925ee07af6f62f0a218a78ca75d68e0c84fb3350 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42f348cf45b8ad1afbc3001151fde2c70109ea3c5cfb69d3de99fb5ffae827 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f68b6f3d97446f0e6510305eca839209f57506f3a02cbf38280352ea0e1a1 + +handshake=Noise_KX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d750365e947a92608f1c492f6d7a07b738ad37cd00e241497371929a94c4e6d0c4391a81757745480b7942495aa1f6650aa5c2a82a32eef9e381e107cbdb021584921e8a54aca1ba1cd7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=120302ad872ca2e8e3b44a5b25ee43323ebf5abc3ac15cb6cb5a5b6367f06d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e276ab45beaadc196449e0137fc9c45531a4452153b1ef0f732caa7e9fe65 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625413c4eabc370d35e3b373f9fab0cc0bbee8b4f32d3409f7cb4ead +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2a0c08410deab404ac28d06fd35af5d5a1f7b45db9be3842df0988cf20cc7f4290baa0275f98fb151d5b19cdab8b58a59abc604fa23da55cb1bd4704b68e91f690a23973a314a9f5dca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c406f3b52c73e6224bd731a3ff48b84c28ce5208cab54fd266e27003a925a3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05e22b85e52a23eabb16edc9afae206d59c234922e75f8385e65db5a56bfe8 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b0f32759f1f61814826cbb693d34eb145f02a963fa85a6ab4009 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466106146b159cbf91766e59566ea4c89cadf4b72f33418c93919793fdf6c0064213f1f0f4c663b52091ac62d3acf442a74f5b738a71ccc543faf343b8dc949b31c79e37545eb8764d036de +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8a3ddb48d59389bdac13a351f63d1f47e3aae4e56f849ca12f48195e751e15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=625c80ee8afe830d7944fc7c33bf51077d94cc75433369d849f42d63edb751 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b501815e69557bb5cf7c66a8311d8e798bab5eb7f85ec9fa07c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a08a362949425a6abadf4e80b05db9449b0dbdbfbec6eb5220f535d9356f58a3588e06ea64363458b186ea7df3d01e7b69d1855ec9bd0fbf751bc2ef6243ff5bffd1225474d6bfef9e36 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42f348cf45b8ad1afbc3001151fde2c70109ea3c5cfb69d3de99fb5ffae827 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f68b6f3d97446f0e6510305eca839209f57506f3a02cbf38280352ea0e1a1 + +handshake=Noise_KX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d750365e947a92608f1c492f6d7a07b738ad37cd00e241497371929a94c4e6d0bc0e94d7a1cacca75268186bde15c7b68d93f6743aa9942f32dc4996837c5a4f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=120302ad872ca2e8e3b44a5b25ee43323ebf5abc3ac15cb6cb5a5b6367f06d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e276ab45beaadc196449e0137fc9c45531a4452153b1ef0f732caa7e9fe65 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5b967e598dfffe9edb3f022904f70e0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2a0c08410deab404ac28d06fd35af5d5a1f7b45db9be3842df0988cf20cc7f461dfc24838b85365bfdf871c46adb9b14154a3cf4d24f5da0de13d84b0661caf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c406f3b52c73e6224bd731a3ff48b84c28ce5208cab54fd266e27003a925a3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05e22b85e52a23eabb16edc9afae206d59c234922e75f8385e65db5a56bfe8 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544e148e82b52660be5c80f764a5d85cae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466106146b159cbf91766e59566ea4c89cadf4b72f33418c93919793fdf6c006421036d52401f286d5f4f2dbcf1abcca8b1e076366728cc163d434715979894289f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8a3ddb48d59389bdac13a351f63d1f47e3aae4e56f849ca12f48195e751e15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=625c80ee8afe830d7944fc7c33bf51077d94cc75433369d849f42d63edb751 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625435474615c969451fe17e73448a5e9cdf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a08a362949425a6abadf4e80b05db9449b0dbdbfbec6eb5220f535d9356f58a37944ba3ebea3c35d041afeb9fd2eb648073e2e9fb6f39243f7c010c41a3b0dd3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42f348cf45b8ad1afbc3001151fde2c70109ea3c5cfb69d3de99fb5ffae827 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f68b6f3d97446f0e6510305eca839209f57506f3a02cbf38280352ea0e1a1 + +handshake=Noise_KX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d750365e947a92608f1c492f6d7a07b738ad37cd00e241497371929a94c4e6d0f60083401ee9c6620039c34566f38f0b0aa5c2a82a32eef9e381ae8acf215c4525e92c68a6c3f7bbd537 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=120302ad872ca2e8e3b44a5b25ee43323ebf5abc3ac15cb6cb5a5b6367f06d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e276ab45beaadc196449e0137fc9c45531a4452153b1ef0f732caa7e9fe65 + +handshake=Noise_KXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625413c4eabc370d35e3b37348719e87dc9f4a12d1ac3b597b94a40d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d2a0c08410deab404ac28d06fd35af5d5a1f7b45db9be3842df0988cf20cc7f47e0091dd10704dd2b2f1e8b9eb51168459abc604fa23da55cb1b05a5dd2f586a0557c0e207704830f000 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c406f3b52c73e6224bd731a3ff48b84c28ce5208cab54fd266e27003a925a3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=05e22b85e52a23eabb16edc9afae206d59c234922e75f8385e65db5a56bfe8 + +handshake=Noise_KXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b0f32759f1f61814826c4976c6e28b0a7ea7abac5d434a636617 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466106146b159cbf91766e59566ea4c89cadf4b72f33418c93919793fdf6c006421188de02a0d30be64807108e8e1f6bbacf5b738a71ccc543faf34078d7e42f606594a2058747095b8657f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8a3ddb48d59389bdac13a351f63d1f47e3aae4e56f849ca12f48195e751e15 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=625c80ee8afe830d7944fc7c33bf51077d94cc75433369d849f42d63edb751 + +handshake=Noise_KXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b501815e69557bb5cf7dcdf6a40f62bd8c34a0dd2f667bb010a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a08a362949425a6abadf4e80b05db9449b0dbdbfbec6eb5220f535d9356f58a378ff6d119df2343b7960b727fe2ffaaf69d1855ec9bd0fbf751b71ac4833b739b3e246b9b5441cad9fd2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42f348cf45b8ad1afbc3001151fde2c70109ea3c5cfb69d3de99fb5ffae827 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f68b6f3d97446f0e6510305eca839209f57506f3a02cbf38280352ea0e1a1 + +handshake=Noise_XN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466988474c4bc814eac3a4eb6e448d4acd0 +msg_2_payload= +msg_2_ciphertext=b1a131ae945d7cccbc46e74eed3289875967c9b743dff16c2cc404ee27cbeb70af25ce82007ae6deba2a37e1085023fe89248b5245916d6450c4e4582068dcba +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5812ae8d9c624ecb85f39515859c1cccff15caf017bb91db106b46c6924ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20231a53dcc59ca97eeaa2a43394e5b4fc073716896e9a3ccac9387ea01243 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541878c2328b45e172f0dfbad0e3b3aa68 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663471c9d8776d5e49564cab43e9e79186 +msg_2_payload= +msg_2_ciphertext=a87b061dff06c9a56457e1d6a4c7c4df6b8769f343c1f1b33551f6bcc263c848e3be3328718b68bed193c51fb11ff996efc661808169b463ce1248ae676f50cd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5956d8aae09289cdb03185f9b63de52f1447a79e307c6e604ccf817253a5f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cda6e68ed4b4402b9ae56caf4d16db4f994a5ddcf65aa9f3a915307089859 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254139465c03bc36f484cfc79b470d666cd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466704ab2dc4aeb2a61d5782c0778070e8b +msg_2_payload= +msg_2_ciphertext=c816ad72c489e34b006988edc566f969ed71de0eb8f1254e5ec39eae02f27426058b160cd6bf1f495b6b0256fc2466f5471a45880c790198bdd1dbb448d53e4c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=913446cef1a493a0fd96acdd702f5d772a9842c8545a96a4ef91b068eaafeb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5cc60635e934808c5a577baf0287316c34364c95667ad380a0b8fc4c9a3ad4 + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254088fae778f2f23315be81b8c5bbf4199 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846691de153aa38c996296165b23e39e4ba5 +msg_2_payload= +msg_2_ciphertext=c44848a758d20c51f1207057a6b75b5c30742221577758d0dd6f4d2ec7265b6991ca389832770d6646645f078ebfacfb4ef98fb67b22ef093c90b2b2de7261f5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=454db968e85c0aa2018661c23973686005f5add451ae7bef0eba43ca978ebb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=660a63b91e195715c181bfc04c12d6141dd1f0a6f3b77be74dbbf4a0aae7e6 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625451e1b61a8dbb4cb8e33299a9f717cc7b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664ee2b9a6fb5aa8606f177824e9fed5bc +msg_2_payload= +msg_2_ciphertext=9f5dd4a9797066f984199e97e45af174bf8cd61adfdcd0fe178e495304bf52954113aaa5963a11be301b4034533fe0d142d11f4408aa61eb1be560849c3fdf1f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c40a299a4178ef3fc65641b39fab602d4d0112e4df25ef5ee667101280053f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=0d80b82f62dba76f15ae04b55da791d5e7e1ec6c2c0a66762188e3c7f69815 + +handshake=Noise_XN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668ebd9d2110458ed54d5d12597a6218330b3fcbdfb59963b6c0cd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b1a131ae945d7cccbc46e74eed3289875967c9b743dff16c2cc404ee27cbeb707987c7eb9fb15e7b3425014e33ee2bdedede11aff10daa4794db8599579ba04348824534044c310360ee +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5812ae8d9c624ecb85f39515859c1cccff15caf017bb91db106b46c6924ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20231a53dcc59ca97eeaa2a43394e5b4fc073716896e9a3ccac9387ea01243 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625453bcb5ed740103515a70dccc5027f82ea16645c2cf12a4d0418e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe5ae95f4d654f81ba88e2da3c9073cf753f83fcaa3392795c2b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a87b061dff06c9a56457e1d6a4c7c4df6b8769f343c1f1b33551f6bcc263c848ccd48e7a836de5a78f57ca660f9b0c0ae4019430d508e72e8b027a3dba64aa2421c14568bc5612ca39fe +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5956d8aae09289cdb03185f9b63de52f1447a79e307c6e604ccf817253a5f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cda6e68ed4b4402b9ae56caf4d16db4f994a5ddcf65aa9f3a915307089859 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254abe5c0277ce6547f2ef97887cb94162fc9ab8cf6ea2cb46f493b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667ba91997827a5f176569ff971962880e2b25094007ac03a8d95e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c816ad72c489e34b006988edc566f969ed71de0eb8f1254e5ec39eae02f274269138a3ae41d01e9d650a02787f12d35d15ec0e8394c3c28c4a208d01b35e9f6a29f2b30436827358e296 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=913446cef1a493a0fd96acdd702f5d772a9842c8545a96a4ef91b068eaafeb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5cc60635e934808c5a577baf0287316c34364c95667ad380a0b8fc4c9a3ad4 + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625430c66d8c51d826469cb0ed6da6f0e4a3b46262b84ecf63e0174f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846684ab0ec2868afa8fd41a339d9585c2be4aef7c24748d994e3ff8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c44848a758d20c51f1207057a6b75b5c30742221577758d0dd6f4d2ec7265b6901bdc2e6295cb723ece5a0204021b93950d7406e563d02635e25b6656e46e0d84ac375737476397453f2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=454db968e85c0aa2018661c23973686005f5add451ae7bef0eba43ca978ebb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=660a63b91e195715c181bfc04c12d6141dd1f0a6f3b77be74dbbf4a0aae7e6 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c47ebd8ffeb5672cb656bbfc0dec33c35496395a6db41a88417d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672c56c783089c040fd9a9a3a568f1b9e6a28bf847f3e0bc30c3d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=9f5dd4a9797066f984199e97e45af174bf8cd61adfdcd0fe178e495304bf5295104af70ebac3b9df92578c538c2392360020415ec8cf0ee4c2dbbe42223069e1c1deb42a2959eea770f8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c40a299a4178ef3fc65641b39fab602d4d0112e4df25ef5ee667101280053f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=0d80b82f62dba76f15ae04b55da791d5e7e1ec6c2c0a66762188e3c7f69815 + +handshake=Noise_XN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846673271030e0003fb2df82539007eca645 +msg_2_payload= +msg_2_ciphertext=b1a131ae945d7cccbc46e74eed3289875967c9b743dff16c2cc404ee27cbeb70e4c109520e2d30a41c95652cd08b77d4df4a342bd396735eab5e28b47620ab8a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5812ae8d9c624ecb85f39515859c1cccff15caf017bb91db106b46c6924ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20231a53dcc59ca97eeaa2a43394e5b4fc073716896e9a3ccac9387ea01243 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625436c9321ebf714c9519214b097526e929 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664745d67a61913ce52d624f8df114c9b0 +msg_2_payload= +msg_2_ciphertext=a87b061dff06c9a56457e1d6a4c7c4df6b8769f343c1f1b33551f6bcc263c8483b4480058a82d425f3e43396950abbc58cd5097f9b26a79b0074d50200d2aa9b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5956d8aae09289cdb03185f9b63de52f1447a79e307c6e604ccf817253a5f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cda6e68ed4b4402b9ae56caf4d16db4f994a5ddcf65aa9f3a915307089859 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544ad2c659c6e1ca08e814589f0b4ab8da +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d34fd899cd1663695b2898236c3e0b5f +msg_2_payload= +msg_2_ciphertext=c816ad72c489e34b006988edc566f969ed71de0eb8f1254e5ec39eae02f27426a7a4a69a02c7173a0ed58f36ef99bb7ed04b7ea534f8cfdc3df971fc5d83d612 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=913446cef1a493a0fd96acdd702f5d772a9842c8545a96a4ef91b068eaafeb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5cc60635e934808c5a577baf0287316c34364c95667ad380a0b8fc4c9a3ad4 + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b0d6eb79c92622a3a96d2cbde54d5ee1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846613d3b417279df8b6bf62ea4c898c1ccf +msg_2_payload= +msg_2_ciphertext=c44848a758d20c51f1207057a6b75b5c30742221577758d0dd6f4d2ec7265b692d513bf753446df5d0cdcb2ca7b812e2f2fe48a691a82468faac983edca29a53 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=454db968e85c0aa2018661c23973686005f5add451ae7bef0eba43ca978ebb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=660a63b91e195715c181bfc04c12d6141dd1f0a6f3b77be74dbbf4a0aae7e6 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c00554c4225bf63afcbbf37eaf0bb7c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846686ba345caf5f9a6c1af1d61c0ebebabb +msg_2_payload= +msg_2_ciphertext=9f5dd4a9797066f984199e97e45af174bf8cd61adfdcd0fe178e495304bf52954b0996fc15cbe197806147e53701f6b3449a291a4fa39281652e1089230529c1 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c40a299a4178ef3fc65641b39fab602d4d0112e4df25ef5ee667101280053f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=0d80b82f62dba76f15ae04b55da791d5e7e1ec6c2c0a66762188e3c7f69815 + +handshake=Noise_XN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668ebd9d2110458ed54d5ddccba5d5ecd3cbc9839829239a072d47 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b1a131ae945d7cccbc46e74eed3289875967c9b743dff16c2cc404ee27cbeb70087cae99cdb9325ed5d8e298eaa530a2dede11aff10daa4794db4e83b79ef22753e3dbe12caeb949dc6d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b5812ae8d9c624ecb85f39515859c1cccff15caf017bb91db106b46c6924ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=20231a53dcc59ca97eeaa2a43394e5b4fc073716896e9a3ccac9387ea01243 + +handshake=Noise_XNpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625453bcb5ed740103515a707998faf9a6f44cdee5b6d00344ad53e7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe5ae95f4d654f81ba8861439ac7a95d1f953ba67f3842a18432 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a87b061dff06c9a56457e1d6a4c7c4df6b8769f343c1f1b33551f6bcc263c8482aa326dc128555199a32b5d152079b5be4019430d508e72e8b028ee24bf4b647ecb32c58f90e9bbeed5c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a5956d8aae09289cdb03185f9b63de52f1447a79e307c6e604ccf817253a5f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cda6e68ed4b4402b9ae56caf4d16db4f994a5ddcf65aa9f3a915307089859 + +handshake=Noise_XNpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254abe5c0277ce6547f2ef907329e13b94de50d15352ae9d78508e3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667ba91997827a5f176569ed5acaf721d9134fae48f89e345f6656 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c816ad72c489e34b006988edc566f969ed71de0eb8f1254e5ec39eae02f27426df4e9fc31bfc969eb43577d1a4b8fe5b15ec0e8394c3c28c4a201364d8f1cc36146d4e71612d0ac7bb7a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=913446cef1a493a0fd96acdd702f5d772a9842c8545a96a4ef91b068eaafeb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5cc60635e934808c5a577baf0287316c34364c95667ad380a0b8fc4c9a3ad4 + +handshake=Noise_XNpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625430c66d8c51d826469cb091809304068a4c45b31d201e3d6984d9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846684ab0ec2868afa8fd41a8364284dcac1f6504dcbfb64f7fc2c89 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c44848a758d20c51f1207057a6b75b5c30742221577758d0dd6f4d2ec7265b6955b7fbb5a9569540fb2894de52721ca250d7406e563d02635e2538f99a17e3c60de4afdc7f6845d12ffb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=454db968e85c0aa2018661c23973686005f5add451ae7bef0eba43ca978ebb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=660a63b91e195715c181bfc04c12d6141dd1f0a6f3b77be74dbbf4a0aae7e6 + +handshake=Noise_XNpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c47ebd8ffeb5672cb6563d3b2e8a24f22064c2824778c9ee1e1d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846672c56c783089c040fd9aaf2198289d220313c7d715b060de7d11 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=9f5dd4a9797066f984199e97e45af174bf8cd61adfdcd0fe178e495304bf5295949f59aa6dcd20a9c8878b89303af7390020415ec8cf0ee4c2dbf425b90a723b4e45f296f6dd79243adf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c40a299a4178ef3fc65641b39fab602d4d0112e4df25ef5ee667101280053f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=0d80b82f62dba76f15ae04b55da791d5e7e1ec6c2c0a66762188e3c7f69815 + +handshake=Noise_IN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dc3a487d9accc35b9ae9b1c394217018 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a19d6a777dfbe1012232727ad0c04cb68d76b903dcc87dd505b85bab3e5433 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ce308865d60653f9e63cab1f039b63261ed5c37d1369020db0b2d8965a4b5a + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa66a1d13c5e040a571cb62797f389f0bdc93b9d6a3d2916377e9def67461897b1fc44f1e9763665e80e00027d1f18182163f1ddd3634dd27996f029a73bad65 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a15c2ffd0b6dde640803eab560d0a319 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=412466f3e30dbe8a0fcf5c7623ca89cf12aa18f0032261d8dbdb01ddfd9722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c261cf8d2744677ee33080e07dec1fae865dcd42ce44f0bd11deb0103d46f + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d0a33a5ca38ecd21362d671912fda8b15c33d39b4fd6a201ccaffd930371ec7ca83d762b357eb53be91392561c46d05fe177f9abe3298172695f49d07143787 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626f2dd6ee861f026bd4f332a4a7cf281 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0ca0780e8b14b25ac4c10c848700fcfe6eb3375a79646f0246140ce0a38f7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ba8833e1c68886ac6610c85f6577fa357a6342e9af3a631c0af908e8f1b4a6 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549261456b2aeb37966de232efa6cfc0d4d53fdcd7b9dc13c6f5969bf113c23f3b4a99c06df30d020a9918405444e90c798f56c43c2f6ee53a95f35c013df24cf1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669e0f90ae816bc5861579e1fc3dac31cf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5035ddbf91e81c481603d0a90e76a9afda117318298b758ff0be2645129d8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6cfd82e4b22fdd8a45c4c3778c385cda5e05538d7bf300b9dc6d11be818d71 + +handshake=Noise_IN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680415c34cf9cd2fcc5ff07ff0515d320986d75947d3e92887e33 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a19d6a777dfbe1012232727ad0c04cb68d76b903dcc87dd505b85bab3e5433 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ce308865d60653f9e63cab1f039b63261ed5c37d1369020db0b2d8965a4b5a + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa66a1d13c5e040a571cb62797f389f0bdc93b9d6a3d2916377e9def67461897b1fc44f1e9763665e80e00027d1f18184d5e8c562d7176a44745bc732b92f1f6a47b8fee4fc04ebb0d7b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e210d10ffdd00b89c314bd8e118bbcf655d41d25db568d805ada +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=412466f3e30dbe8a0fcf5c7623ca89cf12aa18f0032261d8dbdb01ddfd9722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c261cf8d2744677ee33080e07dec1fae865dcd42ce44f0bd11deb0103d46f + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d0a33a5ca38ecd21362d671912fda8b15c33d39b4fd6a201ccaffd930371ec7ca83d762b357eb53be91392561c46d05f58ed688af22ea17c28eae9ad84b58de5d775f4cb08d73316c88 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c6649a9c5a7cc255713f1e47aa65ea192f550a54ba3d420afe5f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0ca0780e8b14b25ac4c10c848700fcfe6eb3375a79646f0246140ce0a38f7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ba8833e1c68886ac6610c85f6577fa357a6342e9af3a631c0af908e8f1b4a6 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549261456b2aeb37966de232efa6cfc0d4d53fdcd7b9dc13c6f5969bf113c23f3b4a99c06df30d020a9918405444e90c797485540b3e84439995285bfd581df450b29769fc6b2de211a440 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669238932916977e5aa74ab7b5f3db22ac8b916a65a3c33075008f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5035ddbf91e81c481603d0a90e76a9afda117318298b758ff0be2645129d8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6cfd82e4b22fdd8a45c4c3778c385cda5e05538d7bf300b9dc6d11be818d71 + +handshake=Noise_IN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e1250b022b6dd38ae0ef98de771c551f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a19d6a777dfbe1012232727ad0c04cb68d76b903dcc87dd505b85bab3e5433 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ce308865d60653f9e63cab1f039b63261ed5c37d1369020db0b2d8965a4b5a + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa66a1d13c5e040a571cb62797f389f0bdc93b9d6a3d2916377e9def674618979df913c2e470e1e1533482ddd46d9009f84515ec8c05d6089bef6b0db4701428 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466de2ebdfc7517338ef3e808c6a357f034 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=412466f3e30dbe8a0fcf5c7623ca89cf12aa18f0032261d8dbdb01ddfd9722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c261cf8d2744677ee33080e07dec1fae865dcd42ce44f0bd11deb0103d46f + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d0a33a5ca38ecd21362d671912fda8b15c33d39b4fd6a201ccaffd930371ec7a7632ec505c484737048c2713e259053d774d5a366f33a64a9369065c6e07b67 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ef84513938c77cb34209e0d1d2bc52bc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0ca0780e8b14b25ac4c10c848700fcfe6eb3375a79646f0246140ce0a38f7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ba8833e1c68886ac6610c85f6577fa357a6342e9af3a631c0af908e8f1b4a6 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549261456b2aeb37966de232efa6cfc0d4d53fdcd7b9dc13c6f5969bf113c23f3b414349604be5302d44a87c1de3df2357e5ee5528292efb2e05ae15c414969849 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667915d63c972f647573c2255d86bd0916 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5035ddbf91e81c481603d0a90e76a9afda117318298b758ff0be2645129d8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6cfd82e4b22fdd8a45c4c3778c385cda5e05538d7bf300b9dc6d11be818d71 + +handshake=Noise_IN_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680415c34cf9cd2fcc5ff02c8f4f0e18740f9a54b24ff9f09a690 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a19d6a777dfbe1012232727ad0c04cb68d76b903dcc87dd505b85bab3e5433 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ce308865d60653f9e63cab1f039b63261ed5c37d1369020db0b2d8965a4b5a + +handshake=Noise_INpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa66a1d13c5e040a571cb62797f389f0bdc93b9d6a3d2916377e9def674618979df913c2e470e1e1533482ddd46d90094d5e8c562d7176a447450da75537282462cc96b900debc7e749d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e210d10ffdd00b89c3148aa8c3a69d47184af76d60acfec093c2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=412466f3e30dbe8a0fcf5c7623ca89cf12aa18f0032261d8dbdb01ddfd9722 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0c261cf8d2744677ee33080e07dec1fae865dcd42ce44f0bd11deb0103d46f + +handshake=Noise_INpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d0a33a5ca38ecd21362d671912fda8b15c33d39b4fd6a201ccaffd930371ec7a7632ec505c484737048c2713e259053f58ed688af22ea17c28e8271a57ef385d1c0c409eb563b360eeb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c6649a9c5a7cc255713fa8b7c1d04992e2c3b3af30d5daa82c25 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0ca0780e8b14b25ac4c10c848700fcfe6eb3375a79646f0246140ce0a38f7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ba8833e1c68886ac6610c85f6577fa357a6342e9af3a631c0af908e8f1b4a6 + +handshake=Noise_INpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549261456b2aeb37966de232efa6cfc0d4d53fdcd7b9dc13c6f5969bf113c23f3b414349604be5302d44a87c1de3df23577485540b3e844399952860995d9d1c90781fe677edc6d35867e7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669238932916977e5aa74aafe1d638562cec623b848e26b4df7a71 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=5035ddbf91e81c481603d0a90e76a9afda117318298b758ff0be2645129d8e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6cfd82e4b22fdd8a45c4c3778c385cda5e05538d7bf300b9dc6d11be818d71 + +handshake=Noise_XK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625490210797b3a07855f135b5bdbbddf165 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664733671042d65e0eb2ff0a9e7a9c7c9f +msg_2_payload= +msg_2_ciphertext=4324e614b0f53d138eaa88364af70c285c29f6f0a39a9205a67e60c4abe97668fd8020f0feee69a839100d5f262cb9314c619d97600d2e7acef6d5d39a7489fb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7a58f180a45f63401657a7a4817ac5c34dae211e1fbafcb8c42aaccb6c4fd5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e39cc5c38f30dd358deed825a045e77c96c856d9957b5eed88c6704cd113b3 + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548e209c79c8ea8a562a17a10307c60e87 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669498034db343934e058df83380897eab +msg_2_payload= +msg_2_ciphertext=e7ee54258e880e01a57de43cacc12c5799e34ed9beb0e3d0d64dfc3d0e1dd0bfc27656f27cc417501e9769a73d8143adba8e31493d7415a5c58cbebd6c35c278 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d85c66f45b68d04f1317197985ebbd021defdcec3bc7902c940754c7fe7175 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d6b2f036e6cac49e862ccbcbfd359ea858a7c8e3cff228506758633ec53276 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547ce9d900de63dd0b5e9b840ad3f12149 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466088ad43090816c338733ba917a3a1853 +msg_2_payload= +msg_2_ciphertext=5008b6f662503afac70502840b3520d72b641a06dbc77426475b0b83eac6aa18e595fca7739b5985df46c9dea693614d5e44c50f9c9541ce7b80be0547c94050 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=60abaa1cdd2f173576adcd2f93d5d5737c4ef63598ee3ff6c006a6eb3c9266 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=61261512d684c773a79724182988e8382cd571a3d6aa4703cf1a17a0550204 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f5ae1b7c7a2c2d21366d159eba7965a5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466381bc604f56a554d4660ed44ff9b67b0 +msg_2_payload= +msg_2_ciphertext=aa2b2e3078aa0054ca436df384c021f5bef28fbe3a9fb6608fc8f0e5a9a1faff3e12483b03fa8a28bf453b2ad69e18fb28624c08b45c1117694bfa6bd86a8d15 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=25ff84a3cb83d33bdf1559428a7d55ff15bdb042db3c85321346e2894a70f9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8be89bcd7bf5bc0326872bf15216c83b19df6d3f14b2744fa60138e364646c + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625474ef4fdbe6a15dbbd752aba5a6cba0b9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466229f6b33b965af8a156dfa1a75e674d3 +msg_2_payload= +msg_2_ciphertext=75ef1297edb57f0efa872372675293bc721ecb4f58ee1d87012ff7069f4ff38b2f4c335d892fc2d7dd639a86382703c9d3ef7e99a00f439f51c51e804b0ea502 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e2c8d3c21594d58f0d7da8d4d40cb0b47ca6b0831e5f8f4ae66966aea4c8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cba677284723c05166976ceb2146d2978e38f17e102780c71cf11416272c8 + +handshake=Noise_XK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254663eea19e1c296b8b49ff4f25ea226b3a7deb26fd267bf07d26c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b29eebb8f9cd52c9835ec61f24bce5cf57eeb626ad1f9f23b3ac +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4324e614b0f53d138eaa88364af70c285c29f6f0a39a9205a67e60c4abe97668ce4e19a9e6ffb5c7faee8b79e3abe64f8bc983cb75059b3f3901d2dad6001f5d28fa78aa8749effe3566 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7a58f180a45f63401657a7a4817ac5c34dae211e1fbafcb8c42aaccb6c4fd5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e39cc5c38f30dd358deed825a045e77c96c856d9957b5eed88c6704cd113b3 + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544063ca1a8f35a6c0d7fb694032a174907330e3a3c8c6c2ffe073 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bbd683767d4eabfb2908900e264d6e56078f380975020348fe3e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e7ee54258e880e01a57de43cacc12c5799e34ed9beb0e3d0d64dfc3d0e1dd0bf3dd4e97663863b3a0ed3e3db5ecdce7e9dceae07adfa85906cfdb8fb73388c85dbd34a6b2e80067d9a18 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d85c66f45b68d04f1317197985ebbd021defdcec3bc7902c940754c7fe7175 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d6b2f036e6cac49e862ccbcbfd359ea858a7c8e3cff228506758633ec53276 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0e58be3d117a08f563f1b81ddddf832cf92b0ef2ac7afaabead +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e4d7c7e528beab53894c8d0ff81686928997ec6472ed87c94a2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5008b6f662503afac70502840b3520d72b641a06dbc77426475b0b83eac6aa18447f5e5fbac32f7d1f206e82fc21319380bba5482b6c23826fbdb993b5aa8af89b038ed837de8a0c1c86 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=60abaa1cdd2f173576adcd2f93d5d5737c4ef63598ee3ff6c006a6eb3c9266 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=61261512d684c773a79724182988e8382cd571a3d6aa4703cf1a17a0550204 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0ff9243a441a9a38229d6b3a8cf3d920e7215c68d36e0d392bd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633ca26c2f74a980f4014d7fb2dcecb2bd4d68077063b0f28b1d3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=aa2b2e3078aa0054ca436df384c021f5bef28fbe3a9fb6608fc8f0e5a9a1faffe4c3fdf4acfdc9d13750e31c72452fa0df12674bfe6a8e2c907ef9cf91cc273f486ee62cb02ff54a4c50 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=25ff84a3cb83d33bdf1559428a7d55ff15bdb042db3c85321346e2894a70f9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8be89bcd7bf5bc0326872bf15216c83b19df6d3f14b2744fa60138e364646c + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545137f1f9a9ec7de03e77d735c92d8b4621ce96029727f4178386 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846610ae8c7cae2e22da73ff83374fcf9057e91f2f0cff1887955750 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=75ef1297edb57f0efa872372675293bc721ecb4f58ee1d87012ff7069f4ff38b4cf30e167d4b617817cda8df5a9762d97a7771f21e0af8ae4f3a7b85e1cf9d28d325c6eba8b7380c0c89 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e2c8d3c21594d58f0d7da8d4d40cb0b47ca6b0831e5f8f4ae66966aea4c8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cba677284723c05166976ceb2146d2978e38f17e102780c71cf11416272c8 + +handshake=Noise_XK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254541b04eabcea3087b9ca2dde2bb9278b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dba3bcbb6e7023a137e00ac858b48e1c +msg_2_payload= +msg_2_ciphertext=4324e614b0f53d138eaa88364af70c285c29f6f0a39a9205a67e60c4abe9766882cd224050fe4084445cdc1250c47ca5bd039aa3a101885f18e12a2504722fb2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7a58f180a45f63401657a7a4817ac5c34dae211e1fbafcb8c42aaccb6c4fd5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e39cc5c38f30dd358deed825a045e77c96c856d9957b5eed88c6704cd113b3 + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549fe2024079bf5448d04ff45c33883985 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666048bf15fae44ad97f00d62dc0ca8c3 +msg_2_payload= +msg_2_ciphertext=e7ee54258e880e01a57de43cacc12c5799e34ed9beb0e3d0d64dfc3d0e1dd0bf75984919ae5741b23644ff3d5379b7d2f08ebe5fb8a95356cfe7ac933b9e153e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d85c66f45b68d04f1317197985ebbd021defdcec3bc7902c940754c7fe7175 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d6b2f036e6cac49e862ccbcbfd359ea858a7c8e3cff228506758633ec53276 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254073ecb95033a08aac58e5d4222c1d762 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846600b9141e162440a021c65a0e1787cddd +msg_2_payload= +msg_2_ciphertext=5008b6f662503afac70502840b3520d72b641a06dbc77426475b0b83eac6aa18e6282572b9342ee071855fcad25c59582b9cad4e1fa63e8b977961b724790442 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=60abaa1cdd2f173576adcd2f93d5d5737c4ef63598ee3ff6c006a6eb3c9266 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=61261512d684c773a79724182988e8382cd571a3d6aa4703cf1a17a0550204 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625473f4564e2d12165fbde2a66c10c71dfc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669a8598e26a4635a2164c15ff96b58cd2 +msg_2_payload= +msg_2_ciphertext=aa2b2e3078aa0054ca436df384c021f5bef28fbe3a9fb6608fc8f0e5a9a1faffdadbbe77cdc53902d9c627a96d91e19e99c72e2e38997d762ac9d6a303edde2b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=25ff84a3cb83d33bdf1559428a7d55ff15bdb042db3c85321346e2894a70f9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8be89bcd7bf5bc0326872bf15216c83b19df6d3f14b2744fa60138e364646c + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b60e0abb01bd15d9cd344d3cdd15c2d5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662b0cf24cc6e33371991db9b3108b9d6b +msg_2_payload= +msg_2_ciphertext=75ef1297edb57f0efa872372675293bc721ecb4f58ee1d87012ff7069f4ff38bca915837e93948a9025a72c5121b0b2b7a1570e1385464d6abf1a2cbc4d84317 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e2c8d3c21594d58f0d7da8d4d40cb0b47ca6b0831e5f8f4ae66966aea4c8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cba677284723c05166976ceb2146d2978e38f17e102780c71cf11416272c8 + +handshake=Noise_XK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254663eea19e1c296b8b49fa9de083783ed78ff77354e0c74a80c28 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b29eebb8f9cd52c9835edda6bcf005b8af266497370cbfc77918 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4324e614b0f53d138eaa88364af70c285c29f6f0a39a9205a67e60c4abe97668cadfa01051a709bff5eae2aac59313848bc983cb75059b3f390193b7a441c87d8dd707dc80571891d57f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7a58f180a45f63401657a7a4817ac5c34dae211e1fbafcb8c42aaccb6c4fd5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e39cc5c38f30dd358deed825a045e77c96c856d9957b5eed88c6704cd113b3 + +handshake=Noise_XKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544063ca1a8f35a6c0d7fb9e4cc482e8a6fde1e919208d6269551a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bbd683767d4eabfb29083fa0b3dd013a95ba81ed9e86311a47b5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e7ee54258e880e01a57de43cacc12c5799e34ed9beb0e3d0d64dfc3d0e1dd0bfc7e980ef5998136bcd7bfbfcaf00cece9dceae07adfa85906cfd90b300640ce55073fea11e49d65b58a7 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d85c66f45b68d04f1317197985ebbd021defdcec3bc7902c940754c7fe7175 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d6b2f036e6cac49e862ccbcbfd359ea858a7c8e3cff228506758633ec53276 + +handshake=Noise_XKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0e58be3d117a08f563f53f3a5664587644826ada8ee48f341f8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e4d7c7e528beab538949b0a4dfa1f4e76cedf36a18562938ab5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=5008b6f662503afac70502840b3520d72b641a06dbc77426475b0b83eac6aa1864cb6767a84466710caabc06396c6f0c80bba5482b6c23826fbd1718760e473df19cb475db068c6f27a5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=60abaa1cdd2f173576adcd2f93d5d5737c4ef63598ee3ff6c006a6eb3c9266 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=61261512d684c773a79724182988e8382cd571a3d6aa4703cf1a17a0550204 + +handshake=Noise_XKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0ff9243a441a9a382292d3a1ef648bb687800b915d240d9ffc8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633ca26c2f74a980f401496b5665615f33b58499e2fdd6e8459cf +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=aa2b2e3078aa0054ca436df384c021f5bef28fbe3a9fb6608fc8f0e5a9a1faff11d841e395a8e26fd37d79d0bcff4df5df12674bfe6a8e2c907ed4286b8b168f2850b7637f300043bd4d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=25ff84a3cb83d33bdf1559428a7d55ff15bdb042db3c85321346e2894a70f9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8be89bcd7bf5bc0326872bf15216c83b19df6d3f14b2744fa60138e364646c + +handshake=Noise_XKpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545137f1f9a9ec7de03e77a2420c1f8a782a7bca8e52b1399c965a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846610ae8c7cae2e22da73ff72bcd1043396c62063feb4d2fe3d51b1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=75ef1297edb57f0efa872372675293bc721ecb4f58ee1d87012ff7069f4ff38b97ca82a1274c25acfe90da6b5786935e7a7771f21e0af8ae4f3aa4c970e4b172a655b63d8ad90e34e721 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8e2c8d3c21594d58f0d7da8d4d40cb0b47ca6b0831e5f8f4ae66966aea4c8d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6cba677284723c05166976ceb2146d2978e38f17e102780c71cf11416272c8 + +handshake=Noise_IK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bd4f4131b33d738f4a2a299ee097f618811345c8fa0eb3de9fe75154b23f79e215fc093d990c4fa35c77f418515fe85be7f82ea4475e5b11703a89b904e605aa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846616d4da51a337934aee3e82bab0b7b1f3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b57093f3d1261319399a1150d5a937f3ef1a27415d2f9581d3bc0143eedefe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe045568d1f521838b2eb348e07f26cd10332485732fb821ff8841ccc3b9d1 + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c073edcce60db134899fe51feb700d92514276978d84cd27efe39f2691af2d4a4e00cf64ca504a736cb3ff448a4d8c080ffacdaeaae20f3b1c45ea6126104349 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466977bbfed6c53f8859e41fab61954c171 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=323a0be447f4985589dea6ff8f3f4d27d810be1e96862868332a4ad903a060 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=109670cd7de301fe4d6c3621935bc2d935db08c60b76f7096015ebcb0f5679 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afb4846f0ab102f56af491cdd2855b8a556936a17ac486c0f6446da6cafb19712c35fb1e5423b76643bb22c685d832c2ebc7bf156bda45e70d222cf1662298cf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662331a84da0076216b8d52a48f33ca4c3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cb7c2b91b71ce817e0958bed36b5644996d8f2c63e4667627792127def75e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=56320be0ca19a8b310230dca8e09b0002288e86e297286ca5810e913102170 + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625496931a9f8e5df3b9bfb984905e85191f366b770652f2222b7fa15c23eb721eafa6062da36f9201533e196a95894eddf0bedf2a6a3e7d7bf100418c962dcde379 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846624f9e1f6148f690211e6ec55b0f3869c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4a5d72c8e755787497f85fc22c91244a26efe8edb79806caf15e0c128b5e01 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f31be3c70e06897a35d0167821f144b438b6a3fda809f20fca377895727730 + +handshake=Noise_IK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bd4f4131b33d738f4a2a299ee097f618811345c8fa0eb3de9fe75154b23f79e215fc093d990c4fa35c77f418515fe85b718a16e03b74978aee0e5fb0a382318c1438e588b4c6f5fb435e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bca07c8ea8d3db6803fa9cde7f2e8285562927a1503fe8922e8f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b57093f3d1261319399a1150d5a937f3ef1a27415d2f9581d3bc0143eedefe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe045568d1f521838b2eb348e07f26cd10332485732fb821ff8841ccc3b9d1 + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c073edcce60db134899fe51feb700d92514276978d84cd27efe39f2691af2d4a4e00cf64ca504a736cb3ff448a4d8c0867cea5eea88023df452cbd6b03ecc3e05a8fe9bf4255c6622fa4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fce1dc5223bdd289d0d5e218041462316be826c29ac6ad53228 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=323a0be447f4985589dea6ff8f3f4d27d810be1e96862868332a4ad903a060 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=109670cd7de301fe4d6c3621935bc2d935db08c60b76f7096015ebcb0f5679 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afb4846f0ab102f56af491cdd2855b8a556936a17ac486c0f6446da6cafb19712c35fb1e5423b76643bb22c685d832c29265090973e176e6ac4c49efeed0b41313413ba672358263aaf6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6edc0252eaef96ad7802d71e982070ec80e6f0a48142a405110 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cb7c2b91b71ce817e0958bed36b5644996d8f2c63e4667627792127def75e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=56320be0ca19a8b310230dca8e09b0002288e86e297286ca5810e913102170 + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625496931a9f8e5df3b9bfb984905e85191f366b770652f2222b7fa15c23eb721eafa6062da36f9201533e196a95894eddf0498cac29da3dc9ae306cf2959f1d510f60b60a555c52e5d4a1db +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf6f8562c58cda4461146db7e93a0dea4f1dc60792564dca6a0e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4a5d72c8e755787497f85fc22c91244a26efe8edb79806caf15e0c128b5e01 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f31be3c70e06897a35d0167821f144b438b6a3fda809f20fca377895727730 + +handshake=Noise_IK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bd4f4131b33d738f4a2a299ee097f618811345c8fa0eb3de9fe75154b23f79e25007dbe6b36cbdfdf4a9cce3f365862218ecd1fdae9317673e275392f9bb54c8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846657ca3004795589e226d50586a9c501ab +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b57093f3d1261319399a1150d5a937f3ef1a27415d2f9581d3bc0143eedefe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe045568d1f521838b2eb348e07f26cd10332485732fb821ff8841ccc3b9d1 + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c073edcce60db134899fe51feb700d92514276978d84cd27efe39f2691af2d4add525786f0b5486403c99532773cf71d38cc92838b0b5546b6ea89dd572bc610 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1a2385682ab40ed7eec1047d6311d6e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=323a0be447f4985589dea6ff8f3f4d27d810be1e96862868332a4ad903a060 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=109670cd7de301fe4d6c3621935bc2d935db08c60b76f7096015ebcb0f5679 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afb4846f0ab102f56af491cdd2855b8a556936a17ac486c0f6446da6cafb1971afe73d2065190e650c2770cc69910e9c2fb119cda3e97199c7b025201f5af03a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846676715a250c8d851c337934ea53c5cfba +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cb7c2b91b71ce817e0958bed36b5644996d8f2c63e4667627792127def75e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=56320be0ca19a8b310230dca8e09b0002288e86e297286ca5810e913102170 + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625496931a9f8e5df3b9bfb984905e85191f366b770652f2222b7fa15c23eb721eaf0e22fb53171332b0d6d9cbd79d3f14211b141792d05aec8bface5ab036a34ab2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661994f62b38af687a844bb6c574a61ee8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4a5d72c8e755787497f85fc22c91244a26efe8edb79806caf15e0c128b5e01 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f31be3c70e06897a35d0167821f144b438b6a3fda809f20fca377895727730 + +handshake=Noise_IK_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bd4f4131b33d738f4a2a299ee097f618811345c8fa0eb3de9fe75154b23f79e25007dbe6b36cbdfdf4a9cce3f3658622718a16e03b74978aee0e485864a129d991809e531504fe89590e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bca07c8ea8d3db6803fadea87e1a26dd748e73277a458ef6379a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b57093f3d1261319399a1150d5a937f3ef1a27415d2f9581d3bc0143eedefe +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe045568d1f521838b2eb348e07f26cd10332485732fb821ff8841ccc3b9d1 + +handshake=Noise_IKpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c073edcce60db134899fe51feb700d92514276978d84cd27efe39f2691af2d4add525786f0b5486403c99532773cf71d67cea5eea88023df452c1a2188b56660ad8a4a43693fff90497a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fce1dc5223bdd289d0d0b6dabc844dbacd0c7bc02535162cde6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=323a0be447f4985589dea6ff8f3f4d27d810be1e96862868332a4ad903a060 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=109670cd7de301fe4d6c3621935bc2d935db08c60b76f7096015ebcb0f5679 + +handshake=Noise_IKpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afb4846f0ab102f56af491cdd2855b8a556936a17ac486c0f6446da6cafb1971afe73d2065190e650c2770cc69910e9c9265090973e176e6ac4cf5cd4db3bf6527f987a742a2c83252d9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6edc0252eaef96ad780ac004ef914e91c2a81181764334ca856 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1cb7c2b91b71ce817e0958bed36b5644996d8f2c63e4667627792127def75e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=56320be0ca19a8b310230dca8e09b0002288e86e297286ca5810e913102170 + +handshake=Noise_IKpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625496931a9f8e5df3b9bfb984905e85191f366b770652f2222b7fa15c23eb721eaf0e22fb53171332b0d6d9cbd79d3f1421498cac29da3dc9ae306c19babad8b3a5f6d7be72eca9272f7667 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf6f8562c58cda446114b33c5291da3398dc9b9485610b524536 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4a5d72c8e755787497f85fc22c91244a26efe8edb79806caf15e0c128b5e01 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f31be3c70e06897a35d0167821f144b438b6a3fda809f20fca377895727730 + +handshake=Noise_XX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c558f251b38f5770b20bfe770709ec1aa6e0aa1a2d8b4485e51667a91055ceed52213b8314b06ae8c63d9c596e2cdcb332ca2b99b3a8a6e7f71d1b1e62340fb3 +msg_2_payload= +msg_2_ciphertext=c0eef7241004fcad6fb84daa25d9a8921a8da60da9b8b39f387667e98069e72fea2a13ea74822183fae1d17df8a490e5ea7ab72edd2bce950758a4482447f664 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bb9dd5494e382306a88f8f32a4bb268cad2632353dd13aad364dc7493c4561 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e5ac356a3234cee842c6f719fa0657d35b69bcfe51e2edf5534c4276b7131 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541eac09194c019139be771f49b620c91c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641342d97be7d620d656cff580ca58e8f11cc5001702990645cd09164242e8540a93a21344bede93c4d681e24a59314512bfcafee190ed63806ed3fa4b3aa541e +msg_2_payload= +msg_2_ciphertext=2e8196d00b701c2f09f141b1c4ccc47e9dca2922bd2491c34cd76b8c3d337e0841879b74366ade47342c3153e4c3dfef93cd1184d6ea2f44fbed3b705b9c569e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7d2b55d4b79d038d8398d42d75bbf870e77ab1d73ba429e188da7010317c89 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c6c2a7901abf013a515ab87928fb7e7d87207ae956668e0e9795fffc08b25c + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545126b622432ac37eabd44b8b671853ad +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c40d55b0bfa624fa6b23f02030ffaefe7925a9bd87194f8c4fe9d930dc959ec1d5f0b9d992fd41eb1eec03fe61d1b12fb4812e5f0b96645e5e4769146fa8671 +msg_2_payload= +msg_2_ciphertext=249a8e4d794c3c6df1b51eda2254f2653b19d99d124278a759abe483bb6d7906caadfe742ab3308406c369d18c95def0250afccdc7434602b5b38a1d49c710af +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f5a6516b19d933d6c0a5dc8c0145ce39e9dfac207ff6fa5c654d49bc6b1ab0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73464d1a429f4c20cbeb5d668e17cb5ec4158eea21db21bd2432f8b4733813 + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d08b0eb94fee5f11568817855354556 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662906b946c77f56bfe59790f6704d3506d892dec0ba85771b18f8d371e23e2970e2e534ad4921563e1560ea5696496cc68ca7fcca73011070e324a5d9505b9f6c +msg_2_payload= +msg_2_ciphertext=72cc9fc9a204b27abb198bdf41e73002d1b348de18ca66cd2574193a06fd9c64253f7755e1975ad268d0f0cc6adae8a43bd3dcf7d9246691c31cdf435c0a887d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1dcab75cb31e3e6d0e761090558ef90578435d3543a53ff7abca20ee152a82 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e26d4813675ea40de3cbbf14a4b80e6299422374ef84a3ee6d45b8f0e7b8 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c13ab819ea6ed3499570aef3a388eb8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668e7a60ef8fbfa562e6542a22ef5e4944d733237508bf157ed4492e233b46162085060ee627d35f17b178d9519d9e86802c82d79abc624b8e2a82fb6b5bc0223d +msg_2_payload= +msg_2_ciphertext=16fa408d9a67b448377f6a27288d735f09088bd0493bbab602a0b3608b648138f95c9f1d5651729782ce22578543f6c0e6deb733cdab22a589c91b92d0a79954 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c45aa274ed25812f1a749351bcc6f968d834f8e2bb7008119c58fbe7a9eedd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=53fd1fc7eecbbf238f3b67111f718da5d85381a0de6009a46e5a415e5f75ac + +handshake=Noise_XX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c558f251b38f5770b20bfe770709ec1aa6e0aa1a2d8b4485e51667a91055ceedff4f63d2d8eca379c401e83654b61786843c6dd463d2f588ba12d1d142fceeafa8131dab9e00214566b7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c0eef7241004fcad6fb84daa25d9a8921a8da60da9b8b39f387667e98069e72f2ac97f4079de25d8760541b7be628fd8427be5ec64387fbf2f983fa7989f88310b47d6d2577980a7d4b9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bb9dd5494e382306a88f8f32a4bb268cad2632353dd13aad364dc7493c4561 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e5ac356a3234cee842c6f719fa0657d35b69bcfe51e2edf5534c4276b7131 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625443dbdf007bb4875a4d95f427ceac82a818307571a82a9888f324 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641342d97be7d620d656cff580ca58e8f11cc5001702990645cd09164242e8540e4eb0518983a8996373abbfb7c83473780c6f834d01a5e023cf450299ef1a361f11092a75e7d11a1950e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2e8196d00b701c2f09f141b1c4ccc47e9dca2922bd2491c34cd76b8c3d337e0810775c9452ed0bc21fad36d99cd9b325a5a1e299a65623fcf08b62aba10a58909d5c7c1eaa45ed50cf6c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7d2b55d4b79d038d8398d42d75bbf870e77ab1d73ba429e188da7010317c89 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c6c2a7901abf013a515ab87928fb7e7d87207ae956668e0e9795fffc08b25c + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254909b4be38128fa1ee3821ec8256c9961c713bccb82aa844d7d6e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c40d55b0bfa624fa6b23f02030ffaefe7925a9bd87194f8c4fe9d930dc959ecbfa439481180c1fa2665a4dfc37855fdfae5baae64f2b1cb55fbec0507a6882974c58a4e9ed063d24a59 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=249a8e4d794c3c6df1b51eda2254f2653b19d99d124278a759abe483bb6d79067ded5abf82f76071cc900b5b99e49c2ce2e7127ee75d79d77d23cf7943689beae674993aca9ded6a0581 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f5a6516b19d933d6c0a5dc8c0145ce39e9dfac207ff6fa5c654d49bc6b1ab0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73464d1a429f4c20cbeb5d668e17cb5ec4158eea21db21bd2432f8b4733813 + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d46c611dff6b8421ca04cbf2dc1a71bd2f17e9aca5cb3d47f1e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662906b946c77f56bfe59790f6704d3506d892dec0ba85771b18f8d371e23e2970d9eca6cec4744d6c0d01c4588b8c47becfec6d91b61f265adeb8e7d237be6c4970cf47183143be50cce6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=72cc9fc9a204b27abb198bdf41e73002d1b348de18ca66cd2574193a06fd9c646ba5b239f740c3f5824d818974348687ed71162b3d3104ca4aa588973e50ce241ccbeb9494a17e72f74c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1dcab75cb31e3e6d0e761090558ef90578435d3543a53ff7abca20ee152a82 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e26d4813675ea40de3cbbf14a4b80e6299422374ef84a3ee6d45b8f0e7b8 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254425bfa36e76a8838d5d964c082e46b0fb8bbee7bb0d8efe882e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668e7a60ef8fbfa562e6542a22ef5e4944d733237508bf157ed4492e233b461620fcbd9a9234eacd67a25d0ad5a7818bcd53bc6adbd943656eceefd701de1c68ca75ad16693e0205b3f3e5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=16fa408d9a67b448377f6a27288d735f09088bd0493bbab602a0b3608b648138429bf29a9ffe33163d05345fec308712f7c3bb2fffecbdf00ca7d0ede3768f41d5774259f7fd971dc4d4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c45aa274ed25812f1a749351bcc6f968d834f8e2bb7008119c58fbe7a9eedd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=53fd1fc7eecbbf238f3b67111f718da5d85381a0de6009a46e5a415e5f75ac + +handshake=Noise_XX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c558f251b38f5770b20bfe770709ec1aa6e0aa1a2d8b4485e51667a91055ceeddce4ec65c8701bb8e394894acf42ee631f9e735b3cf68b830731abfe45e4c578 +msg_2_payload= +msg_2_ciphertext=c0eef7241004fcad6fb84daa25d9a8921a8da60da9b8b39f387667e98069e72f6e03e7676577b7c2e23edc932cb7269d60ab5a53084cd3cbf9d26bc420f65426 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bb9dd5494e382306a88f8f32a4bb268cad2632353dd13aad364dc7493c4561 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e5ac356a3234cee842c6f719fa0657d35b69bcfe51e2edf5534c4276b7131 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c3e79e8d77ebc7c8096364ee6641264 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641342d97be7d620d656cff580ca58e8f11cc5001702990645cd09164242e854007095bac0754ea0e3575efa81d8bd1dc73256f79cf94429ec4097a84cefb4ae2 +msg_2_payload= +msg_2_ciphertext=2e8196d00b701c2f09f141b1c4ccc47e9dca2922bd2491c34cd76b8c3d337e08ee24c6f9c32e75df9c0ffee981226a1917a55e32f4dffd80f8c6291883af6de5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7d2b55d4b79d038d8398d42d75bbf870e77ab1d73ba429e188da7010317c89 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c6c2a7901abf013a515ab87928fb7e7d87207ae956668e0e9795fffc08b25c + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d637e75932c13066f7d9ae8202e434e9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c40d55b0bfa624fa6b23f02030ffaefe7925a9bd87194f8c4fe9d930dc959ec7f0d1d6e6ef7fe8e9d099b7283e8e4c00793986c521afd21ced3bffc6ef3ec23 +msg_2_payload= +msg_2_ciphertext=249a8e4d794c3c6df1b51eda2254f2653b19d99d124278a759abe483bb6d7906bc6104737c7e8072b6b9c1b2742699495e478b0434d240b3989a1d4df21a7009 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f5a6516b19d933d6c0a5dc8c0145ce39e9dfac207ff6fa5c654d49bc6b1ab0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73464d1a429f4c20cbeb5d668e17cb5ec4158eea21db21bd2432f8b4733813 + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543c9c4f5f492c2bd6298624dbc89f8cec +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662906b946c77f56bfe59790f6704d3506d892dec0ba85771b18f8d371e23e297005331f9cf890ae50499c20de44cb81ec82cdda938bc9693f36ed9ea63fa36e44 +msg_2_payload= +msg_2_ciphertext=72cc9fc9a204b27abb198bdf41e73002d1b348de18ca66cd2574193a06fd9c64b71437f9cf75d18d4ee5a748568c35ed76c8a0a7e52917864f65947f8c6950b4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1dcab75cb31e3e6d0e761090558ef90578435d3543a53ff7abca20ee152a82 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e26d4813675ea40de3cbbf14a4b80e6299422374ef84a3ee6d45b8f0e7b8 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549891f0cad0f98f78af16e0c6bfc729d3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668e7a60ef8fbfa562e6542a22ef5e4944d733237508bf157ed4492e233b461620eea5a18ee7d4c6aebc3be1649b7c94aff64dcd3aac9bc1ca5e4419d281669075 +msg_2_payload= +msg_2_ciphertext=16fa408d9a67b448377f6a27288d735f09088bd0493bbab602a0b3608b64813893f6fdc1de28aa54d076a1cf4b3e86ef9c6348a34f8ecddb9c3797184ffb4d08 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c45aa274ed25812f1a749351bcc6f968d834f8e2bb7008119c58fbe7a9eedd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=53fd1fc7eecbbf238f3b67111f718da5d85381a0de6009a46e5a415e5f75ac + +handshake=Noise_XX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c558f251b38f5770b20bfe770709ec1aa6e0aa1a2d8b4485e51667a91055ceed9c32712c57e5aa04f65932b60b4c6064843c6dd463d2f588ba128cd76050bb6209711df3294879ad0e11 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c0eef7241004fcad6fb84daa25d9a8921a8da60da9b8b39f387667e98069e72f9bd63447f97b7741e373ebbf9015ddd9427be5ec64387fbf2f98ea4a70997c58ecb2fe807114cabb46ae +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bb9dd5494e382306a88f8f32a4bb268cad2632353dd13aad364dc7493c4561 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e5ac356a3234cee842c6f719fa0657d35b69bcfe51e2edf5534c4276b7131 + +handshake=Noise_XXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625443dbdf007bb4875a4d95a73282156c90715757356ed75e725b2b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641342d97be7d620d656cff580ca58e8f11cc5001702990645cd09164242e8540661edb60a6a8540e6c5e82f0bd95ab8b80c6f834d01a5e023cf46b51e3b2c9796244f4791c4f4c2ad9f7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2e8196d00b701c2f09f141b1c4ccc47e9dca2922bd2491c34cd76b8c3d337e08d7d5063ef629525d81a06e1ad0e8ce06a5a1e299a65623fcf08b6be25d3c554898997726450ccbb56652 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7d2b55d4b79d038d8398d42d75bbf870e77ab1d73ba429e188da7010317c89 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c6c2a7901abf013a515ab87928fb7e7d87207ae956668e0e9795fffc08b25c + +handshake=Noise_XXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254909b4be38128fa1ee382b46bfbe2630124202d4749ea2d06487d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c40d55b0bfa624fa6b23f02030ffaefe7925a9bd87194f8c4fe9d930dc959ec216aa6b7d41596b4f9e4905f412771befae5baae64f2b1cb55fbae113857fc75634d33125ef64c8515c5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=249a8e4d794c3c6df1b51eda2254f2653b19d99d124278a759abe483bb6d7906375331eb14a43a9eed6ab1c848203e14e2e7127ee75d79d77d23068fe13e799ae21be2a6521f159608b9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f5a6516b19d933d6c0a5dc8c0145ce39e9dfac207ff6fa5c654d49bc6b1ab0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=73464d1a429f4c20cbeb5d668e17cb5ec4158eea21db21bd2432f8b4733813 + +handshake=Noise_XXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d46c611dff6b8421ca09dc79567842ed38928256a9a35128c20 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662906b946c77f56bfe59790f6704d3506d892dec0ba85771b18f8d371e23e2970c8bc8b2a9fcbe96bcaf5dbb53d958841cfec6d91b61f265adeb8b93fde4f1c6d12a5a66fbd65265c67af +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=72cc9fc9a204b27abb198bdf41e73002d1b348de18ca66cd2574193a06fd9c64aa0e01924994fa145ddb10417d16aa53ed71162b3d3104ca4aa578762e51724a97e08b1762d715c7f9c0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1dcab75cb31e3e6d0e761090558ef90578435d3543a53ff7abca20ee152a82 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=86e26d4813675ea40de3cbbf14a4b80e6299422374ef84a3ee6d45b8f0e7b8 + +handshake=Noise_XXpsk3_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254425bfa36e76a8838d5d9f71f26594bce0a57407a4b1760b814ee +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668e7a60ef8fbfa562e6542a22ef5e4944d733237508bf157ed4492e233b461620be67b52b7bd6053e7767ac64fd91e8df53bc6adbd943656eceef1daadc583828bf9580dc9229e5f87205 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=16fa408d9a67b448377f6a27288d735f09088bd0493bbab602a0b3608b6481380c5cf5a0a5a5b91aa942222b90b489a8f7c3bb2fffecbdf00ca7642bb47f1258177d174797f4d9846494 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c45aa274ed25812f1a749351bcc6f968d834f8e2bb7008119c58fbe7a9eedd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=53fd1fc7eecbbf238f3b67111f718da5d85381a0de6009a46e5a415e5f75ac + +handshake=Noise_IX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466001a448f30a50045a3773283db2513353903f4e248a9b3e2b5c24afb272fe857d7489eb482f3634ac012c7f90637184f3c37d3bbb3cc1741696ea3e8780db3dc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=121b6531c524e613f3b3cfbb08e2c23c11c43ac1715e9f074f01a4fd038e1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1f24c3924ad3d79ceca2efb690500b560e43de2cbc367e1deeecfd983b270b + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d7ce1d656b5eb9151fba77523378e964f2a8ef91720a611902132d691741271c3d3307b904253d8254a28d98887e407b04239c1c15396fb45fcaa651bb12bf1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666133c831594ab52216dd0807616b26056d0e80f5f6d8fa91fe77e5060db7db9506ef4df925af2c7834a634db720a835ea0afd35264770fa0ce4a40ffc2f3a45b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=39b2227addce43c4691d21674f9695c6a09b112c8222b306075e9515e2c867 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6b01cb18b13f46a8816cdaeac1e8dd93f014affb39fa763aaeebf771b43de4 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625468f5566d63685e265e45046bc696c9c9f0bebd8cf1052c95805155d8c0ee4db5cba654e668d672097727bedb322262c15da304f0ff23ecd5e0bacfd141a2a1e7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c84ed22bb5a1c2a86915757631e35fb2eca787ddbcdc8ea4bc4e20a1f5887efd0a7b4ba3ca44e42bdd7c2ceacda3c85a5dce29603d296ae093a193bf17a4c46a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c49de16ee26037dfe6b9b489f9786a584f44b08821bb5dab44b0e371f6e26 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8771d4351bfa2cb24c5497b8c5a6f5a01a29bd27056c00a29617c7f625689f + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fb6c82215400d2057e6eaa9938cbc77e3fa904df7d3a80b104eff6484b5eb2f92c52ff4d51ef8590bf8b3c7e42ccaf36f5203e5b6cc1255385dd1f7edf0b20a1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aba779821e4e49f52ea4e5fb0ffb8788943f1e50d4fec498230f3d22f119831af4fd75ac2f666d09c5840305632216f6193fdc63d5648e114fa44662ae78d9a7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7af8e7b931417440cdea7240873bf94dd43a92641167a9f984560f56481ea4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=69a6c04db91b2a176d92b6c51b47f5b476e7ae15302e4782e0bc4c7e1b37ae + +handshake=Noise_IX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466001a448f30a50045a3773283db2513353903f4e248a9b3e2b5c24afb272fe8577b273d51b51d4b8ca49ad87e8e1b52025713f6ad6dc975e0f86b25a35b74fc3555e1c91994f94c043080 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=121b6531c524e613f3b3cfbb08e2c23c11c43ac1715e9f074f01a4fd038e1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1f24c3924ad3d79ceca2efb690500b560e43de2cbc367e1deeecfd983b270b + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d7ce1d656b5eb9151fba77523378e964f2a8ef91720a611902132d691741271c3d3307b904253d8254a28d98887e407a44b0c1e24a560d89e223072156a69a1fb99a798d1683d6e9674 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666133c831594ab52216dd0807616b26056d0e80f5f6d8fa91fe77e5060db7db959c490fe4c98dec54c73b93b3f3150aa522d0889bee5a6675b46a219b8c197bd38a409b0319cb18d13ae4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=39b2227addce43c4691d21674f9695c6a09b112c8222b306075e9515e2c867 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6b01cb18b13f46a8816cdaeac1e8dd93f014affb39fa763aaeebf771b43de4 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625468f5566d63685e265e45046bc696c9c9f0bebd8cf1052c95805155d8c0ee4db5cba654e668d672097727bedb322262c19b4d7142a128929d49c3b558f781c4bf9189d05b178cc7a04ca2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c84ed22bb5a1c2a86915757631e35fb2eca787ddbcdc8ea4bc4e20a1f5887efd9c442f3f6e1e52cf41e96a7b85d31a56bc3b2c8d31f40ca8ac16064518b495caba81820a1c73ba43f2d4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c49de16ee26037dfe6b9b489f9786a584f44b08821bb5dab44b0e371f6e26 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8771d4351bfa2cb24c5497b8c5a6f5a01a29bd27056c00a29617c7f625689f + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fb6c82215400d2057e6eaa9938cbc77e3fa904df7d3a80b104eff6484b5eb2f92c52ff4d51ef8590bf8b3c7e42ccaf367f8e9c43fadcbe94ec0166219dfa665bf065f286bf0d7684aed6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aba779821e4e49f52ea4e5fb0ffb8788943f1e50d4fec498230f3d22f119831a81a9001883959687765f997fcf2e6880f3da82537df7241288faa0075350c178c7a4651dd554b2aeb564 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7af8e7b931417440cdea7240873bf94dd43a92641167a9f984560f56481ea4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=69a6c04db91b2a176d92b6c51b47f5b476e7ae15302e4782e0bc4c7e1b37ae + +handshake=Noise_IX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466001a448f30a50045a3773283db2513353903f4e248a9b3e2b5c24afb272fe857972736c91937300c3a33d0f45f84967554fbd34e74a3ed2da8aa7b187755c58a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=121b6531c524e613f3b3cfbb08e2c23c11c43ac1715e9f074f01a4fd038e1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1f24c3924ad3d79ceca2efb690500b560e43de2cbc367e1deeecfd983b270b + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d7ce1d656b5eb9151fba77523378e964f2a8ef91720a611902132d691741271d228ca8491bbf257394442a722a705173bbe4efea8677818654b390540df1a18 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666133c831594ab52216dd0807616b26056d0e80f5f6d8fa91fe77e5060db7db959871017b10f8c4b3f1042d2d2932b77bfbb57f9756768ad417cd6f7b111a57e3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=39b2227addce43c4691d21674f9695c6a09b112c8222b306075e9515e2c867 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6b01cb18b13f46a8816cdaeac1e8dd93f014affb39fa763aaeebf771b43de4 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625468f5566d63685e265e45046bc696c9c9f0bebd8cf1052c95805155d8c0ee4db525fa6858eff76b69343b28ced0e7ba02e849f7f3fa7ff70d856f2b3a18a127cd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c84ed22bb5a1c2a86915757631e35fb2eca787ddbcdc8ea4bc4e20a1f5887efda53329c4f4b7540d09ad79bbc106dc0513cce4751ea0b78fef76ccd03cbbb3d8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c49de16ee26037dfe6b9b489f9786a584f44b08821bb5dab44b0e371f6e26 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8771d4351bfa2cb24c5497b8c5a6f5a01a29bd27056c00a29617c7f625689f + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fb6c82215400d2057e6eaa9938cbc77e3fa904df7d3a80b104eff6484b5eb2f925cc71907dbef4fd4df1218a622a5b54a6eeaa63623e51a50e9cc6b5a65f2230 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aba779821e4e49f52ea4e5fb0ffb8788943f1e50d4fec498230f3d22f119831aafd335e73319c4c1d0b67c713fed38346e88c2f18e65fdf3ac90a5a703d753ed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7af8e7b931417440cdea7240873bf94dd43a92641167a9f984560f56481ea4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=69a6c04db91b2a176d92b6c51b47f5b476e7ae15302e4782e0bc4c7e1b37ae + +handshake=Noise_IX_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466001a448f30a50045a3773283db2513353903f4e248a9b3e2b5c24afb272fe857fb091b2195012c08b0b140bc35cb12735713f6ad6dc975e0f86b731f028f7626e597b40d8649f718297c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=121b6531c524e613f3b3cfbb08e2c23c11c43ac1715e9f074f01a4fd038e1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1f24c3924ad3d79ceca2efb690500b560e43de2cbc367e1deeecfd983b270b + +handshake=Noise_IXpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d7ce1d656b5eb9151fba77523378e964f2a8ef91720a611902132d691741271d228ca8491bbf257394442a722a70517a44b0c1e24a560d89e225feaed436f2e1b4ebf905774414df4f8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666133c831594ab52216dd0807616b26056d0e80f5f6d8fa91fe77e5060db7db954fd203f0c9d25c3e926672269f2dbe4722d0889bee5a6675b46a801f7f1978b39a17e75bc3505313a9d6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=39b2227addce43c4691d21674f9695c6a09b112c8222b306075e9515e2c867 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6b01cb18b13f46a8816cdaeac1e8dd93f014affb39fa763aaeebf771b43de4 + +handshake=Noise_IXpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625468f5566d63685e265e45046bc696c9c9f0bebd8cf1052c95805155d8c0ee4db525fa6858eff76b69343b28ced0e7ba029b4d7142a128929d49c31c75b3d55df3ac834bd50fc48e781bc5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c84ed22bb5a1c2a86915757631e35fb2eca787ddbcdc8ea4bc4e20a1f5887efd81f8705b7fd1ac44e0db631f6498740ebc3b2c8d31f40ca8ac163346c04b5cc1dcbe242c18dfde5322eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3c49de16ee26037dfe6b9b489f9786a584f44b08821bb5dab44b0e371f6e26 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8771d4351bfa2cb24c5497b8c5a6f5a01a29bd27056c00a29617c7f625689f + +handshake=Noise_IXpsk2_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fb6c82215400d2057e6eaa9938cbc77e3fa904df7d3a80b104eff6484b5eb2f925cc71907dbef4fd4df1218a622a5b547f8e9c43fadcbe94ec013ac799c77b3b0a6a8dcd4a311473ee22 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aba779821e4e49f52ea4e5fb0ffb8788943f1e50d4fec498230f3d22f119831a48658943f9d91741e1a33103e775e920f3da82537df7241288fab18a128e3c84939f20abf92374bef607 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7af8e7b931417440cdea7240873bf94dd43a92641167a9f984560f56481ea4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=69a6c04db91b2a176d92b6c51b47f5b476e7ae15302e4782e0bc4c7e1b37ae + +handshake=Noise_N_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f79dccb3aa4d5b94432bafca11574ed +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6c123bcb14329bcb133fce1b378e7b3b46e2d98b58e3dae5bf6ef38f77d2a5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e1891da8d5c3333d5c4e85dc726a52356d2908013a234f353acb3922a9230 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254345e04d65d31b4503b548304455bbd46 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d634a8f886d4f0d9ed43ca28dae0b7dbe47f19dfd6fb51cd16e66be0213c8e +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=33775b15e461621ce9a5e20c50221231d8e230484d44e2c37438200771bfbb + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fe78ed820f4450ab1348aad583dda57e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=79568cdbca6a38933f2240f37ce995f44ec540f8a3ab1e31c66da6bfe8b0eb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ff319a896146cb627b7e9bcc087307ab7b5cd09b675fc762fefdb743eefef3 + +handshake=Noise_N_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442f641b74b61890f33bd3becef41f81f69923bf63c60b1cc6231 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6c123bcb14329bcb133fce1b378e7b3b46e2d98b58e3dae5bf6ef38f77d2a5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e1891da8d5c3333d5c4e85dc726a52356d2908013a234f353acb3922a9230 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3f4ecd437c593a22cfb64af15662f4bd7e6ef03a841d0260e66 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d634a8f886d4f0d9ed43ca28dae0b7dbe47f19dfd6fb51cd16e66be0213c8e +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=33775b15e461621ce9a5e20c50221231d8e230484d44e2c37438200771bfbb + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254619e5aa215267f135b43473fcae9566b9e67882d44789b29e9da +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=79568cdbca6a38933f2240f37ce995f44ec540f8a3ab1e31c66da6bfe8b0eb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ff319a896146cb627b7e9bcc087307ab7b5cd09b675fc762fefdb743eefef3 + +handshake=Noise_N_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c2d612458dea09c1056ae723f545f1f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6c123bcb14329bcb133fce1b378e7b3b46e2d98b58e3dae5bf6ef38f77d2a5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e1891da8d5c3333d5c4e85dc726a52356d2908013a234f353acb3922a9230 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a12e1251ccb886f1d3d363a48195a860 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d634a8f886d4f0d9ed43ca28dae0b7dbe47f19dfd6fb51cd16e66be0213c8e +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=33775b15e461621ce9a5e20c50221231d8e230484d44e2c37438200771bfbb + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b5f9c84b3c1c392a387aa90ed926280 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=79568cdbca6a38933f2240f37ce995f44ec540f8a3ab1e31c66da6bfe8b0eb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ff319a896146cb627b7e9bcc087307ab7b5cd09b675fc762fefdb743eefef3 + +handshake=Noise_N_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625442f641b74b61890f33bd4391759de0d03df2ad8026a68f4190b0 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6c123bcb14329bcb133fce1b378e7b3b46e2d98b58e3dae5bf6ef38f77d2a5 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e1891da8d5c3333d5c4e85dc726a52356d2908013a234f353acb3922a9230 + +handshake=Noise_Npsk0_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f3f4ecd437c593a22cfb0bac55293cc03f1617a481ede42ab62b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d634a8f886d4f0d9ed43ca28dae0b7dbe47f19dfd6fb51cd16e66be0213c8e +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=33775b15e461621ce9a5e20c50221231d8e230484d44e2c37438200771bfbb + +handshake=Noise_Npsk1_25519_AESGCM_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254619e5aa215267f135b435e993029733e9d969d29343938c1b1df +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=79568cdbca6a38933f2240f37ce995f44ec540f8a3ab1e31c66da6bfe8b0eb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ff319a896146cb627b7e9bcc087307ab7b5cd09b675fc762fefdb743eefef3 + +handshake=Noise_K_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438e26a348a6cfdbcb07102e8e5091989 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b9d11027b8d5c0684f197d3d013eb85af4156198273288daeef8221e3b9a4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=74c2881e55dcbee999ade00f6c433a35d60371a3cf651bc1c5617cc397cb87 + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bbc991897e496d88cc4713aa52d34443 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=11f82fb066f3635d85a8f9a98ea5b67c400485a089a4abb74834e2e5a57f4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=eb8febbc984e0c0b8d92d59025912cbed4c7a5986a0c1ee61dbc64565f3228 + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b9bdef6f6b2b03db5c430f4eea428fd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2ea39abe8e5e7dde6c727f9a970b1cc5f0db6c5825feb620dc4e40fefea543 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8018b274983cbc58f5036d2ce8c0d8833634c86b0d85bd6a038a8036e0621d + +handshake=Noise_K_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6608d0e457383df16f84fb3a03c9d986dfd2441f69eab6586e9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b9d11027b8d5c0684f197d3d013eb85af4156198273288daeef8221e3b9a4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=74c2881e55dcbee999ade00f6c433a35d60371a3cf651bc1c5617cc397cb87 + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625408d9b97427847c9e21cfa5fa926792c424bac2922df0b6719ca4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=11f82fb066f3635d85a8f9a98ea5b67c400485a089a4abb74834e2e5a57f4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=eb8febbc984e0c0b8d92d59025912cbed4c7a5986a0c1ee61dbc64565f3228 + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547fefbe317b025d36f640f51d6d0ab59af487b829a06968eda96c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2ea39abe8e5e7dde6c727f9a970b1cc5f0db6c5825feb620dc4e40fefea543 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8018b274983cbc58f5036d2ce8c0d8833634c86b0d85bd6a038a8036e0621d + +handshake=Noise_K_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254176d7116aaeb842d6dcf237932eccf03 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b9d11027b8d5c0684f197d3d013eb85af4156198273288daeef8221e3b9a4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=74c2881e55dcbee999ade00f6c433a35d60371a3cf651bc1c5617cc397cb87 + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c610aa4b7520958544adaf4375afc3de +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=11f82fb066f3635d85a8f9a98ea5b67c400485a089a4abb74834e2e5a57f4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=eb8febbc984e0c0b8d92d59025912cbed4c7a5986a0c1ee61dbc64565f3228 + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499a8f592f261e9b5339c8f477cc9c16c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2ea39abe8e5e7dde6c727f9a970b1cc5f0db6c5825feb620dc4e40fefea543 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8018b274983cbc58f5036d2ce8c0d8833634c86b0d85bd6a038a8036e0621d + +handshake=Noise_K_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6608d0e457383df16f88fad0f657acae9f22fe892786cb660b2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b9d11027b8d5c0684f197d3d013eb85af4156198273288daeef8221e3b9a4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=74c2881e55dcbee999ade00f6c433a35d60371a3cf651bc1c5617cc397cb87 + +handshake=Noise_Kpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625408d9b97427847c9e21cf912833fff74a652fa343036dfb1b41ea +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=11f82fb066f3635d85a8f9a98ea5b67c400485a089a4abb74834e2e5a57f4d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=eb8febbc984e0c0b8d92d59025912cbed4c7a5986a0c1ee61dbc64565f3228 + +handshake=Noise_Kpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547fefbe317b025d36f6408925984d138fde176f4a9733c7706df9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2ea39abe8e5e7dde6c727f9a970b1cc5f0db6c5825feb620dc4e40fefea543 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8018b274983cbc58f5036d2ce8c0d8833634c86b0d85bd6a038a8036e0621d + +handshake=Noise_X_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545730809282cfc06c3f895a7660f5bb7725583f11e5566e698a972505841076fd193070f26567584ddb9a11f44c37722efa4689cece4fd7b57371b7aa56233e27 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=458838a0dd2fb593e0264aa8f65ecf54a29227215742be16065db5a9e64ae0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ce36ae61d167896842a9117b31ed88845c34ea868ce4f99075df0eb388dbbe + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541401f93c17b8761a54f7a233e20fae86a9858038716057a8a1376d708c390e5c8395e377b11f0ebc06500cc47602c4c7a4f348296b28740fe8b5e84a8c02db6c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1085833cf5bcf7446d55ec7a8a07af2752b57b729e2dd6ca882b946d00b4fe +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bcbb6258caa407556855bf3236705c6f24003ebb2c79ba707afef937cfadcd + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447657edc39b8a745cd59d07d6e5a2c003c7f9b3e3643af88ca131edbc5578f4a636583b0b613417ec497846b87dfa005cc61f92786e7692362934a0eed2484c4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0843a331ef88666075f33de5baa1a3cb426f0d4b16de1ff591a6f2e467d07b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a6edf21b63c3d67b27e4235f7c6249153c182cb5fd0bab4e2113c4aecc4017 + +handshake=Noise_X_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545730809282cfc06c3f895a7660f5bb7725583f11e5566e698a972505841076fd193070f26567584ddb9a11f44c37722e155570cd162d7626fdd606a44acba5181f943a9576dc6c0787cb +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=458838a0dd2fb593e0264aa8f65ecf54a29227215742be16065db5a9e64ae0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ce36ae61d167896842a9117b31ed88845c34ea868ce4f99075df0eb388dbbe + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541401f93c17b8761a54f7a233e20fae86a9858038716057a8a1376d708c390e5c8395e377b11f0ebc06500cc47602c4c755841fd865669d89825061d5fca07ba66ed0abc4f4218f4d6899 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1085833cf5bcf7446d55ec7a8a07af2752b57b729e2dd6ca882b946d00b4fe +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bcbb6258caa407556855bf3236705c6f24003ebb2c79ba707afef937cfadcd + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447657edc39b8a745cd59d07d6e5a2c003c7f9b3e3643af88ca131edbc5578f4a636583b0b613417ec497846b87dfa00568b6e7db7a7e3dd0e5ab3dc13a2e726a95e9487330354b79556a +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0843a331ef88666075f33de5baa1a3cb426f0d4b16de1ff591a6f2e467d07b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a6edf21b63c3d67b27e4235f7c6249153c182cb5fd0bab4e2113c4aecc4017 + +handshake=Noise_X_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545730809282cfc06c3f895a7660f5bb7725583f11e5566e698a972505841076fd287c0bb778052148eed1a556d5a39611dac85f63cdb36c055a0b62f0488fb1eb +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=458838a0dd2fb593e0264aa8f65ecf54a29227215742be16065db5a9e64ae0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ce36ae61d167896842a9117b31ed88845c34ea868ce4f99075df0eb388dbbe + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541401f93c17b8761a54f7a233e20fae86a9858038716057a8a1376d708c390e5ca20d0296245bd7bde6f607b09dcb7b244553d8e657f7683cd076f4dda56f8300 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1085833cf5bcf7446d55ec7a8a07af2752b57b729e2dd6ca882b946d00b4fe +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bcbb6258caa407556855bf3236705c6f24003ebb2c79ba707afef937cfadcd + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447657edc39b8a745cd59d07d6e5a2c003c7f9b3e3643af88ca131edbc5578f4a3d88a7587a88291fced6580a9485994229bf2b68b22e0364494c2ce92e253ffa +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0843a331ef88666075f33de5baa1a3cb426f0d4b16de1ff591a6f2e467d07b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a6edf21b63c3d67b27e4235f7c6249153c182cb5fd0bab4e2113c4aecc4017 + +handshake=Noise_X_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545730809282cfc06c3f895a7660f5bb7725583f11e5566e698a972505841076fd287c0bb778052148eed1a556d5a39611155570cd162d7626fdd63547ad497b220e81b9ff2557f057f698 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=458838a0dd2fb593e0264aa8f65ecf54a29227215742be16065db5a9e64ae0 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=ce36ae61d167896842a9117b31ed88845c34ea868ce4f99075df0eb388dbbe + +handshake=Noise_Xpsk0_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541401f93c17b8761a54f7a233e20fae86a9858038716057a8a1376d708c390e5ca20d0296245bd7bde6f607b09dcb7b2455841fd865669d8982503fad6c369df182f624375e02b6537b80 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=1085833cf5bcf7446d55ec7a8a07af2752b57b729e2dd6ca882b946d00b4fe +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bcbb6258caa407556855bf3236705c6f24003ebb2c79ba707afef937cfadcd + +handshake=Noise_Xpsk1_25519_AESGCM_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447657edc39b8a745cd59d07d6e5a2c003c7f9b3e3643af88ca131edbc5578f4a3d88a7587a88291fced6580a9485994268b6e7db7a7e3dd0e5ab679b5d4402ec2c50e88cda1c46aa7811 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=0843a331ef88666075f33de5baa1a3cb426f0d4b16de1ff591a6f2e467d07b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a6edf21b63c3d67b27e4235f7c6249153c182cb5fd0bab4e2113c4aecc4017 + +handshake=Noise_NN_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b9a74f6724441623af038022288c2556 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96cd46be111804586a935795eeb4ce62bdec121048a10520b00266b22722eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe2bc534e31964c0bd56337223e921565e39dbc5f156aa04766ced4689a2a2 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e7136508cb8178281204abd62e9f2a3e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466922f3b7824001193c077abd8b7a73030 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b349a522c145762c7c737ac1d1425ce1fb25c7cca626177ee4ceed3cd6fb3d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b41e24399dc3f1ad2faf82868700e4bf31bb89f6616e1d6a92802bb8ad80d6 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ee9d033f6e676839de40170aca012002 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa780f5014acbab4d9e8a60099774b2f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c86e1615188d3feae514a908523ccbbce6f0b0fa368c0dbac6ddf01b6571 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3b27b0caca5899086a3ebfb80a0651a18f1af75c9f71f3b3818a0170c8e615 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254649f81a8f7cd2ee213caf437abedbbf5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f61e2ebde3648ba1353298a7b8f99454 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eb1a9999225c8a03f6c053d24da26df330c7b2ac6315c5aeff9a4c2893d9e3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=17aecb7454199636aa7e8a44b7e51b5dc6729b39faddd2739bc66d8cbf07be + +handshake=Noise_NN_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb598b7e636e9475d9a7d3111d7a7f3929f0f4c47293613c173f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96cd46be111804586a935795eeb4ce62bdec121048a10520b00266b22722eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe2bc534e31964c0bd56337223e921565e39dbc5f156aa04766ced4689a2a2 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c78f22f8cea986f934a675201c7f431a539e50c9be46986fa89 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666913ea64c74c2f63ee5e814fda25301b9508e4685ee02e9852fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b349a522c145762c7c737ac1d1425ce1fb25c7cca626177ee4ceed3cd6fb3d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b41e24399dc3f1ad2faf82868700e4bf31bb89f6616e1d6a92802bb8ad80d6 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d14f69b3b9d75ea1662d0ce4daecd3845bd11582aebf2fba3e99 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466961705fd812d19815374d102e749b09e623ad659a7a3afef8415 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c86e1615188d3feae514a908523ccbbce6f0b0fa368c0dbac6ddf01b6571 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3b27b0caca5899086a3ebfb80a0651a18f1af75c9f71f3b3818a0170c8e615 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba71add3db8e76dddcfecd52c7db8b92e7b993407c57d909b7f9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665aeaba3e8ae057890d222d19af245e23209100a4b501ca82f843 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eb1a9999225c8a03f6c053d24da26df330c7b2ac6315c5aeff9a4c2893d9e3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=17aecb7454199636aa7e8a44b7e51b5dc6729b39faddd2739bc66d8cbf07be + +handshake=Noise_NN_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665cda04f69d491f9bf509e632fc1a20dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96cd46be111804586a935795eeb4ce62bdec121048a10520b00266b22722eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe2bc534e31964c0bd56337223e921565e39dbc5f156aa04766ced4689a2a2 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546e96a20116b68fd776478e81d11779ca +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666f51bc44f88917daa53fb4529499b55 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b349a522c145762c7c737ac1d1425ce1fb25c7cca626177ee4ceed3cd6fb3d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b41e24399dc3f1ad2faf82868700e4bf31bb89f6616e1d6a92802bb8ad80d6 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545860fa411dfa26d26f2128f7e347eaf9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662d6b25a63eb7741de46ecfe91e243f6f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c86e1615188d3feae514a908523ccbbce6f0b0fa368c0dbac6ddf01b6571 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3b27b0caca5899086a3ebfb80a0651a18f1af75c9f71f3b3818a0170c8e615 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254358bf186163f6d621580cf909c191a7c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b382c809faae2b2874cd218c7b075c96 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eb1a9999225c8a03f6c053d24da26df330c7b2ac6315c5aeff9a4c2893d9e3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=17aecb7454199636aa7e8a44b7e51b5dc6729b39faddd2739bc66d8cbf07be + +handshake=Noise_NN_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb598b7e636e9475d9a74243a419c31324b40cc77cc7a7ea3b24 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96cd46be111804586a935795eeb4ce62bdec121048a10520b00266b22722eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fe2bc534e31964c0bd56337223e921565e39dbc5f156aa04766ced4689a2a2 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547c78f22f8cea986f934ab17c2484a24a990a6473d588a4f20e99 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666913ea64c74c2f63ee5e32a5358320d459322d624c9ccc975fa0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b349a522c145762c7c737ac1d1425ce1fb25c7cca626177ee4ceed3cd6fb3d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b41e24399dc3f1ad2faf82868700e4bf31bb89f6616e1d6a92802bb8ad80d6 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d14f69b3b9d75ea1662d338ce00a4c4454f04db11957c29b45ba +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466961705fd812d198153745358e4e1e28b5a350b1f7abd0f271620 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=75c86e1615188d3feae514a908523ccbbce6f0b0fa368c0dbac6ddf01b6571 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3b27b0caca5899086a3ebfb80a0651a18f1af75c9f71f3b3818a0170c8e615 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA256 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba71add3db8e76dddcfe83087861219e26e6f5b0b682e6758cdd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665aeaba3e8ae057890d221b12297799709eb36b11f4fd7366a4b2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=eb1a9999225c8a03f6c053d24da26df330c7b2ac6315c5aeff9a4c2893d9e3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=17aecb7454199636aa7e8a44b7e51b5dc6729b39faddd2739bc66d8cbf07be + +handshake=Noise_KN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f99627c2b9a34dc2e78efc21ea6d09e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=440ade028b567ce045b4a367bc7644ba49ff120f2e704abe4be8ce31a43c0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=644df69c08e6c5b832b7b34b54a7e616efc276686ea257ca570c7b0af25e03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549d36baa6dbd5bae534893a1691872bff +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eec752b6d790962a0adb9fa92948a16f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58d034db684b5b9548fa8a2596d5ef48bdc0827f3c936757f824f25190410c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5987d3cbe26bcf75946a86d0555108608e7ed18325dd60fe7d4fd200ee741d + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545c1042a1c7e8f74e1c96e053fc8ca7d4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466458d2cdf33b1fbee339147985abf0afa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7474619bc60a98042cc7bce09f4f631f20af421de18fc434457e2fb7f9e48e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00783db976d144d85fb4dbb341e908748eb0bc90123fcf4162b10cd34277ef + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c91264cfdb8fc6b8804d45a55b62a8b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696ab554cdc752c12efb617a2bbb548d0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d65a6ebbe3f38a2f2de8529b5203ed2668cbcefc48219fce3f2414bf3b2bdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cdef5b6bd32cdca6ebfe2a3b697caadc3099b9e820eb1c9d27d28b6ed99138 + +handshake=Noise_KN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c39ce1d8e1bc7d551d60e0f13021b569aaf063bbfbaeb5df1d48 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=440ade028b567ce045b4a367bc7644ba49ff120f2e704abe4be8ce31a43c0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=644df69c08e6c5b832b7b34b54a7e616efc276686ea257ca570c7b0af25e03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d9e492b73ab5e7b411ca24b530505ed9f9a7434b7fb9e3942543 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466faed543a83225ae87e5f7b9ed811dd5a5bea64334ddf210e18b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58d034db684b5b9548fa8a2596d5ef48bdc0827f3c936757f824f25190410c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5987d3cbe26bcf75946a86d0555108608e7ed18325dd60fe7d4fd200ee741d + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b78fe393615d3918bb58f0884d2d372e53e4851ce80e67fe922 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466273122b0e5f91c8b4a7ef2d5a964eb79bc00a41011e068557be1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7474619bc60a98042cc7bce09f4f631f20af421de18fc434457e2fb7f9e48e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00783db976d144d85fb4dbb341e908748eb0bc90123fcf4162b10cd34277ef + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d738849e4f8635b57bf99e438b655ab0cdd92b50c3eb8a38fa47 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466874006ee8e970d1140a893ddd52de47e27b95d0f17bd424122fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d65a6ebbe3f38a2f2de8529b5203ed2668cbcefc48219fce3f2414bf3b2bdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cdef5b6bd32cdca6ebfe2a3b697caadc3099b9e820eb1c9d27d28b6ed99138 + +handshake=Noise_KN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f658a41f0ba1afd9c3df2bc05eb14e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=440ade028b567ce045b4a367bc7644ba49ff120f2e704abe4be8ce31a43c0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=644df69c08e6c5b832b7b34b54a7e616efc276686ea257ca570c7b0af25e03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544914ec3c41b58c96b596001a8abe3938 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668f00eba16f40a2355d414ed7b0bab565 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58d034db684b5b9548fa8a2596d5ef48bdc0827f3c936757f824f25190410c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5987d3cbe26bcf75946a86d0555108608e7ed18325dd60fe7d4fd200ee741d + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a01257cd75ea9e8e2fe8a59205962271 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680d63539016c3cf1e09fe3440be095d6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7474619bc60a98042cc7bce09f4f631f20af421de18fc434457e2fb7f9e48e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00783db976d144d85fb4dbb341e908748eb0bc90123fcf4162b10cd34277ef + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254677a7c6247070ec793bfa8ea24a40134 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466931ff9b08ae6a9b92eab49565d39c990 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d65a6ebbe3f38a2f2de8529b5203ed2668cbcefc48219fce3f2414bf3b2bdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cdef5b6bd32cdca6ebfe2a3b697caadc3099b9e820eb1c9d27d28b6ed99138 + +handshake=Noise_KN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c39ce1d8e1bc7d551d6096fc00a1fb421a5a36483878f3112caa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=440ade028b567ce045b4a367bc7644ba49ff120f2e704abe4be8ce31a43c0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=644df69c08e6c5b832b7b34b54a7e616efc276686ea257ca570c7b0af25e03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d9e492b73ab5e7b411ca38a73ec25f1334931010f25867aa8dd2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466faed543a83225ae87e5f4fa930e2a1af4d46cb19721cc97cddd9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58d034db684b5b9548fa8a2596d5ef48bdc0827f3c936757f824f25190410c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5987d3cbe26bcf75946a86d0555108608e7ed18325dd60fe7d4fd200ee741d + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548b78fe393615d3918bb584c160d00bae8672e05bb010987c999f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466273122b0e5f91c8b4a7e9e8a59e9c89269df77d30fbeaec514c2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7474619bc60a98042cc7bce09f4f631f20af421de18fc434457e2fb7f9e48e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=00783db976d144d85fb4dbb341e908748eb0bc90123fcf4162b10cd34277ef + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d738849e4f8635b57bf9f7c2d1cce4db786552b21fc809e097b9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466874006ee8e970d1140a8eee4c4694467251fe8db35416cf00ff2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d65a6ebbe3f38a2f2de8529b5203ed2668cbcefc48219fce3f2414bf3b2bdb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cdef5b6bd32cdca6ebfe2a3b697caadc3099b9e820eb1c9d27d28b6ed99138 + +handshake=Noise_NK_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bb9e8fd1c92e99737291c111956e17ab +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d97cd906e611b305ce4c22ffd315b750 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9cfd3ddea89d9f445475098f834e572ec4a8c5e9be740dd92831ef6cf6fd9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5db2eb7c7b37b33cd42fd321e05d9048c9be3efa0ae3a8c76724307e7562ff + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254718a7d4c2e3c99dbf622a533aee2274f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c286f86f4a7cfd2b81fe3d1444add3f2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01d0ab0f394923f44c3abad69154757bbf902c64c5219bf8c624d69b11c959 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c2a431db9e64c43b6c0a520547bdd8e1368358c099345ab4969f1bb4a9299 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afc9110414941f0b3fa72bd395095718 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669c069692405e7802986d04a3d2430961 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d7766291245b52e9d504ca48bc3fb1118bdf46179c1b9bd32c925493533b3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11a8d0014a1f8b258deb81bed19ea97bec009031d6a7a374eba5528490926c + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f93a440c4497c8dc01d655826bc1e042 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680f0334cb21d5a78f12947bb80c7735b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6647abf5c995fb4b851bfd63c8e699286071c1fc2559764335c6329e2bea0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89e20c2dca7e4c2202aa731271c5d2081164c86e7b365ca98465961e7113a6 + +handshake=Noise_NK_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e44c6b6a0a9a28f5daf1796ae55886ff960a634ddc73b72e7b0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666e1a02e46e9053fa2a81f648b1fee43c438299bba0e77bc34d08 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9cfd3ddea89d9f445475098f834e572ec4a8c5e9be740dd92831ef6cf6fd9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5db2eb7c7b37b33cd42fd321e05d9048c9be3efa0ae3a8c76724307e7562ff + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ca3238dddb5256cd690a81f68c59b5d5216a7806cc1e63fcdceb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660aa92dceb01712153f8dbce8ba3752e32b0a055a3f56a4900e58 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01d0ab0f394923f44c3abad69154757bbf902c64c5219bf8c624d69b11c959 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c2a431db9e64c43b6c0a520547bdd8e1368358c099345ab4969f1bb4a9299 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b74e16d251935c4ba865774bfc2d3703bf09fe397d41b70e66b0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466668442074729cbc1afdd21edaed1bd0c2bfe8b0bbd4797e22a73 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d7766291245b52e9d504ca48bc3fb1118bdf46179c1b9bd32c925493533b3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11a8d0014a1f8b258deb81bed19ea97bec009031d6a7a374eba5528490926c + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b3af61cb5aa81f19c8ece0651d022203328454673d001ede6b8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bf9e6c127466353179c7c004f953f2584b10238b823e7cc5e97c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6647abf5c995fb4b851bfd63c8e699286071c1fc2559764335c6329e2bea0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89e20c2dca7e4c2202aa731271c5d2081164c86e7b365ca98465961e7113a6 + +handshake=Noise_NK_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254660f1a4e72e678e4b0bcacd08c2cc9f4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669b3dc8f07dd44673e4833fc90ce1164e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9cfd3ddea89d9f445475098f834e572ec4a8c5e9be740dd92831ef6cf6fd9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5db2eb7c7b37b33cd42fd321e05d9048c9be3efa0ae3a8c76724307e7562ff + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625460387695ddb6a97647f93847e8923922 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dd59aa9c3ee7803c98e3651db6b3e81b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01d0ab0f394923f44c3abad69154757bbf902c64c5219bf8c624d69b11c959 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c2a431db9e64c43b6c0a520547bdd8e1368358c099345ab4969f1bb4a9299 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544259ae3d24d8665ff7ce9256b701954c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c3d5626dcdd6dbd0ef679f92fa2f4518 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d7766291245b52e9d504ca48bc3fb1118bdf46179c1b9bd32c925493533b3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11a8d0014a1f8b258deb81bed19ea97bec009031d6a7a374eba5528490926c + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9cfbfa816d97f7a4c47a7a9f8ecc6ac +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661629749d9a9c1558d3a8027a81a7b97f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6647abf5c995fb4b851bfd63c8e699286071c1fc2559764335c6329e2bea0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89e20c2dca7e4c2202aa731271c5d2081164c86e7b365ca98465961e7113a6 + +handshake=Noise_NK_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e44c6b6a0a9a28f5dafb35dfe4f2cf52995fadd57f0a4006d1c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666e1a02e46e9053fa2a81414fd4a5bd34dbd73cb3a6e1b896bce6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9cfd3ddea89d9f445475098f834e572ec4a8c5e9be740dd92831ef6cf6fd9e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5db2eb7c7b37b33cd42fd321e05d9048c9be3efa0ae3a8c76724307e7562ff + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ca3238dddb5256cd690ae943692a4c055f22d3dd834ea90edfd8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660aa92dceb01712153f8d214f8f71c03c898cbd891e751f10d132 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01d0ab0f394923f44c3abad69154757bbf902c64c5219bf8c624d69b11c959 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c2a431db9e64c43b6c0a520547bdd8e1368358c099345ab4969f1bb4a9299 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b74e16d251935c4ba86516dfd74e045ff1c291281bcaa9362d00 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466668442074729cbc1afddf5f76f8ec753aa54926873c9096709c3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7d7766291245b52e9d504ca48bc3fb1118bdf46179c1b9bd32c925493533b3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=11a8d0014a1f8b258deb81bed19ea97bec009031d6a7a374eba5528490926c + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b3af61cb5aa81f19c8e33d34af062c6a72f793a6612ed12887f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bf9e6c127466353179c7c97611f0c4ac0ac3142512e76f650851 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6647abf5c995fb4b851bfd63c8e699286071c1fc2559764335c6329e2bea0f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=89e20c2dca7e4c2202aa731271c5d2081164c86e7b365ca98465961e7113a6 + +handshake=Noise_KK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254de3641cda8802b636ee7afe370f7e34e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e4c15cda24dee01c5c60ef6c4d6b92b3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab44bf778165ad086eaebbb994df826628b3fe26ad310642480a1b2af8fc23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=baacf816b83aaeb15954621113f8e0603cb79168fe6308b87413004beee4d2 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625498bf0afa6ad430bef2179595b80f00af +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660bc0a013b37277dafd0e2a2073ac3cc0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe6f6f749a1495883a1715674543c2ebe56c1cb674d4f4e47f9086553700ce +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7a88c03c458db5b49827d899535210ba453d7dfc0f76a661b8cad08cf967ef + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482f300522a0b96d0e03c3d41f98f6030 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846652279732a99893f3b89cf55f3784a3b5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=de7af56efebaae1c6a616b624b39a441d8b82e09a2f2a30531a7c30441e6eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=408aae72aaa26f98d436f4a64c34ea26baa1802548774b8f14cff3d1891895 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f76e9ef85e5bc141f0d2ac73c491af69 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466479ea79a1a541cbc7eb522078716e1d4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cdafd1b6afea01667934ed26de85e3a200927343f534ccee0bdab0fbbe5aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c4b0bdb11291ee7b67616af3c37e7a9f8c400c715e7f9142a620db4fd3e05 + +handshake=Noise_KK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254558809aaeff03abdf354a87685ef23c3191ad86ae0c81bbaafa8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f7c3b2f7cef28a2f21245150a4abd05d6404ab474c115c578ea5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab44bf778165ad086eaebbb994df826628b3fe26ad310642480a1b2af8fc23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=baacf816b83aaeb15954621113f8e0603cb79168fe6308b87413004beee4d2 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b999c716e2b5ebd7dddc18c68985cfb4351b19d5aa51e6b6a3d9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad07cf9d7d4c88039123d1fae114ca14da9754cad2103495e943 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe6f6f749a1495883a1715674543c2ebe56c1cb674d4f4e47f9086553700ce +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7a88c03c458db5b49827d899535210ba453d7dfc0f76a661b8cad08cf967ef + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a96b079a0d93c9c8a155898e5985630a9b1f023773114dabe32 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466677a31f9e25c3322951402efef0b854d68e456565be88e0d51a2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=de7af56efebaae1c6a616b624b39a441d8b82e09a2f2a30531a7c30441e6eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=408aae72aaa26f98d436f4a64c34ea26baa1802548774b8f14cff3d1891895 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d75d4599f7a207000b95e3ba21772976160bc0d0e9d849b969b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669ba2c1c12e0ae525b5442707aa5ea703c57d8aa875aa18ed909a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cdafd1b6afea01667934ed26de85e3a200927343f534ccee0bdab0fbbe5aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c4b0bdb11291ee7b67616af3c37e7a9f8c400c715e7f9142a620db4fd3e05 + +handshake=Noise_KK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c2b1750e0c698c0a6112819f9c76fc36 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846680da3b11f10f1a9b7790d0edd4dffbaf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab44bf778165ad086eaebbb994df826628b3fe26ad310642480a1b2af8fc23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=baacf816b83aaeb15954621113f8e0603cb79168fe6308b87413004beee4d2 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543dbdbd15ce16ebbd5cbe94c31693a31d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c6530671018ea8a0fc755a25fc2567ce +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe6f6f749a1495883a1715674543c2ebe56c1cb674d4f4e47f9086553700ce +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7a88c03c458db5b49827d899535210ba453d7dfc0f76a661b8cad08cf967ef + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254840a997d6af2ba012dd07b2df7798fee +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ca8bb47ff4a43848304c6d2edcf068dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=de7af56efebaae1c6a616b624b39a441d8b82e09a2f2a30531a7c30441e6eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=408aae72aaa26f98d436f4a64c34ea26baa1802548774b8f14cff3d1891895 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482752d661cd7555efeb06de81c9c7440 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466faf6abfeb8c57688af793a94b8b59903 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cdafd1b6afea01667934ed26de85e3a200927343f534ccee0bdab0fbbe5aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c4b0bdb11291ee7b67616af3c37e7a9f8c400c715e7f9142a620db4fd3e05 + +handshake=Noise_KK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254558809aaeff03abdf354ad47d26523f1b98b5ce386c3b066ff53 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f7c3b2f7cef28a2f212487967f4b709e22ff452dcb68821a10aa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab44bf778165ad086eaebbb994df826628b3fe26ad310642480a1b2af8fc23 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=baacf816b83aaeb15954621113f8e0603cb79168fe6308b87413004beee4d2 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b999c716e2b5ebd7dddc071a74c7c4c9cb80ac268b23a5284fc2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ad07cf9d7d4c88039123b962375716b252dc4ad12cfe6f5d4bb8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe6f6f749a1495883a1715674543c2ebe56c1cb674d4f4e47f9086553700ce +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7a88c03c458db5b49827d899535210ba453d7dfc0f76a661b8cad08cf967ef + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a96b079a0d93c9c8a154abc656a5b149ecbeb06e87583b65868 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466677a31f9e25c33229514bb8c7076d4faff8789a0e351738b86fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=de7af56efebaae1c6a616b624b39a441d8b82e09a2f2a30531a7c30441e6eb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=408aae72aaa26f98d436f4a64c34ea26baa1802548774b8f14cff3d1891895 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543d75d4599f7a207000b9c74a6e5fb64546dabaea326eae41e103 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669ba2c1c12e0ae525b54442c957df906bb8905ee7620374ebf0b2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cdafd1b6afea01667934ed26de85e3a200927343f534ccee0bdab0fbbe5aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2c4b0bdb11291ee7b67616af3c37e7a9f8c400c715e7f9142a620db4fd3e05 + +handshake=Noise_NX_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846686b5f4e8c51a605bcb276206a6df60ae938b905adaf29a2dae4a4951bbd9ac64830ab64f2329646560b930979ff52da8dda7c0677c502dba13c078b5afd1bf11 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92613cda6ccb2936449efb8ff870b5a4536f5734a4e31056d38101230762e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed89355072429afe6c3442ba7af66f6647499291bab58d40f6a392e79ff80a + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a9ee73b4288fdbc31cb51797c65fbaa9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f6b8c9a95aeb764b26cf8c501bacc34e529749e4f6ae88920bd387fabb8637dcde2392baf3709659849325856ac9cf356aaefe992efcb4f9ab2a3970fbb99f5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=48a1263c75d2406120b1a37c67ea6dbfd419846d447bb9561f7b2e59e519fb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=73b72d691daf65626d78168e0ed56bea89856f26a9dafe3e9bfc9eb6e0f31d + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254630415173b9f1928701ff2289f37d561 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846605a586d5481fff45caeea1cd0655af37781458d66a4815875d47b78c96a3a12d093a0dc166d20f0c3214a4626b9e66336caf89021d364d65e4772bc8f1321040 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0939720a26cecdc36b1c4026bd90b3dbcf385f01e559ca5a0a0d3e873490e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d4d6c20c1864598f66f01fe45acc18f5bda9ffa8df1ef6ceb816767b89a58 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254162c9c2f5940535c6bfd1f890e60408d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466353ad209b6a362c223414b1d0a03e9e81e22fa4caeb6b362260fbfe5c128631598e58eba6e707e7d2222949ee232b54ebf61e33970b46cd4eeac807a2f0cf192 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a4e0c92d865ded40ef3c75ba54bdf98e66a5a0f2518d3b0a7f6f0282f2b20a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=295ed0f56eb5f31822f8d9555d259cad3287f00b0a190e11039c84931c3da5 + +handshake=Noise_NX_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846686b5f4e8c51a605bcb276206a6df60ae938b905adaf29a2dae4a4951bbd9ac64ab58309bc12c2c6833badcfdd3d7ff0761dbe60d6d29ade8507d29fb2bc4117057fc8179e6fbef5007ad +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92613cda6ccb2936449efb8ff870b5a4536f5734a4e31056d38101230762e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed89355072429afe6c3442ba7af66f6647499291bab58d40f6a392e79ff80a + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e9015cba2a23b0096a05011567485f6bf02291236c1a148210fc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f6b8c9a95aeb764b26cf8c501bacc34e529749e4f6ae88920bd387fabb8637dd40f5cfab465b3b2502a36bd5eb32fcfcd18d09a129a297e8b6ec14c40f49ddefba21635f51fb72aa086 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=48a1263c75d2406120b1a37c67ea6dbfd419846d447bb9561f7b2e59e519fb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=73b72d691daf65626d78168e0ed56bea89856f26a9dafe3e9bfc9eb6e0f31d + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f39612d4d40b9e9cfdc3a11c3356eeff3ebf41fbfaeeef9aa39 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846605a586d5481fff45caeea1cd0655af37781458d66a4815875d47b78c96a3a12d555e64b1d866a2cc146e4d71d56b0bacf2c3abdcf587228060f0a41bb179568b9c95191f7bdb9ab94e9d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0939720a26cecdc36b1c4026bd90b3dbcf385f01e559ca5a0a0d3e873490e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d4d6c20c1864598f66f01fe45acc18f5bda9ffa8df1ef6ceb816767b89a58 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438e8bbb2574005b8a72c7fc4a5455835244356622ed2cdbbd68d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466353ad209b6a362c223414b1d0a03e9e81e22fa4caeb6b362260fbfe5c1286315de9dafc57e6d45a3fbd49aced15f14ce967be96d154f36efe24015a68924e69b7c9135349ce6264f6c59 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a4e0c92d865ded40ef3c75ba54bdf98e66a5a0f2518d3b0a7f6f0282f2b20a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=295ed0f56eb5f31822f8d9555d259cad3287f00b0a190e11039c84931c3da5 + +handshake=Noise_NX_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846686b5f4e8c51a605bcb276206a6df60ae938b905adaf29a2dae4a4951bbd9ac64609b51f99bea30ec0bbedbd1007843d83c9763a959b00ab5cab5ba49eafb3e2e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92613cda6ccb2936449efb8ff870b5a4536f5734a4e31056d38101230762e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed89355072429afe6c3442ba7af66f6647499291bab58d40f6a392e79ff80a + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d93a8a6ccad06b8a39521b804712e760 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f6b8c9a95aeb764b26cf8c501bacc34e529749e4f6ae88920bd387fabb8637d74d1f7e7e208bab05d20d4b685ce7dbd7c3ac274d2fc417b9ea17fca299290ea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=48a1263c75d2406120b1a37c67ea6dbfd419846d447bb9561f7b2e59e519fb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=73b72d691daf65626d78168e0ed56bea89856f26a9dafe3e9bfc9eb6e0f31d + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254921fe5c4bb90760e53d6faf1a0740c79 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846605a586d5481fff45caeea1cd0655af37781458d66a4815875d47b78c96a3a12d92c26414634b717744bf686cda3a086e2a5f112e7b50193a0981c9052b26b95a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0939720a26cecdc36b1c4026bd90b3dbcf385f01e559ca5a0a0d3e873490e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d4d6c20c1864598f66f01fe45acc18f5bda9ffa8df1ef6ceb816767b89a58 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a816c865955730f32f7955893a0d7f2e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466353ad209b6a362c223414b1d0a03e9e81e22fa4caeb6b362260fbfe5c128631555051ef062c98db54b470d1e15b0050171b4b5a3b57703c66b018918176481dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a4e0c92d865ded40ef3c75ba54bdf98e66a5a0f2518d3b0a7f6f0282f2b20a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=295ed0f56eb5f31822f8d9555d259cad3287f00b0a190e11039c84931c3da5 + +handshake=Noise_NX_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846686b5f4e8c51a605bcb276206a6df60ae938b905adaf29a2dae4a4951bbd9ac640fc955b72cd7be36df1431bc363bf15b61dbe60d6d29ade8507d549c2b17ff58629ba542d5129adf100f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=92613cda6ccb2936449efb8ff870b5a4536f5734a4e31056d38101230762e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ed89355072429afe6c3442ba7af66f6647499291bab58d40f6a392e79ff80a + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e9015cba2a23b0096a053a030712430d2c4b67068f03021e228f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664f6b8c9a95aeb764b26cf8c501bacc34e529749e4f6ae88920bd387fabb8637da2ba3faccfe2faa68a3139e1c8447a55cd18d09a129a297e8b6eae2479c85097b112227d3a5f8c151535 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=48a1263c75d2406120b1a37c67ea6dbfd419846d447bb9561f7b2e59e519fb +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=73b72d691daf65626d78168e0ed56bea89856f26a9dafe3e9bfc9eb6e0f31d + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f39612d4d40b9e9cfdc571de866bca651aafdc036069e6287ee +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846605a586d5481fff45caeea1cd0655af37781458d66a4815875d47b78c96a3a12d10417dc13d71a4453495b69c0892beb5f2c3abdcf587228060f0258e113345473d901ace83f9bdbd0b41 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0939720a26cecdc36b1c4026bd90b3dbcf385f01e559ca5a0a0d3e873490e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d4d6c20c1864598f66f01fe45acc18f5bda9ffa8df1ef6ceb816767b89a58 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438e8bbb2574005b8a72cea9f0f940e1159de27b869b82e9779f0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466353ad209b6a362c223414b1d0a03e9e81e22fa4caeb6b362260fbfe5c1286315e1f3a591d5886270af814b41d8bacb7a967be96d154f36efe240b4f5bbe437a4669d354ec3f988467b16 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a4e0c92d865ded40ef3c75ba54bdf98e66a5a0f2518d3b0a7f6f0282f2b20a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=295ed0f56eb5f31822f8d9555d259cad3287f00b0a190e11039c84931c3da5 + +handshake=Noise_KX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622be88163c561546e4bed5f7edf59c4a66de1b08618f33e5795acaac602ccefed747d2332f470a6322d692464a05fcd67cba64be6a7e2398b84f0874a7d27c38 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0bdd14922642db2bd89e286bac9a93db23f5677f0c21a2504d12a30ba345c9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01d6ba6fa72b364f3595ecd4fcfd2163c6419dcaaf81400f2a2475841bf0d8 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d46828feccb106fce1347259efe3d560 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e10980f3530a4aaf3535bcd0434d86038c899f9f7eaa14ec3b953dfccd14f38eeceda506dac5ffaa99ff52fe7504945eb9b6072986d1e7120e06d3c1972f7180 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=10541bac3d4a63122a37a4f7b5dcfcc525e1181fc5dd8acc49d47583d318a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=863dcf756c35668a469a0b54d4e1dfe6c8eb5731fefa8fd1ea01ee193ca65a + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254239128e9c724ebca8616533a70d2437b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666502920f436afe0924fb9e2089dae0157d3aece8be75d5e40c6c32324963763a5208664eb984e338151d464d04f944b15fc0cf85a10bb0c55d8971abe75aa2b3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4df46901c83ffc83cb5a2b8e3f551f94413e760c545fe690c376fcc67d2c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6ae230f4066266b0d5acbd1f88e9a369008a22f37234bb29edccccd574835b + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254016d9bce67aca6fbde6cd635a26a793b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665707e22c0421b4143fb60cdb66d4abe8e9f9f96622ed7415a4bef49e881e6259ec92755a87cf9ae7807a98d2b99b2886a6afd2cf42f6ec465d945fceeaa6ca42 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccf1e63eb05b5935b3925d91e55cc46e95c883af0c86ceb81b44679d63b8df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bfb507e53620a99a87de6c5118a296da629e71582b4315d3f9d276cd6d8123 + +handshake=Noise_KX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622be88163c561546e4bed5f7edf59c4a66de1b08618f33e5795acaac602ccefea1671c0794e5e89f47225379b721d4ec0bff04812072f6475715344dbbf02f94c684290d67dbdbc8207d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0bdd14922642db2bd89e286bac9a93db23f5677f0c21a2504d12a30ba345c9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01d6ba6fa72b364f3595ecd4fcfd2163c6419dcaaf81400f2a2475841bf0d8 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3e81f3136465c96cebd9ede3119a58997cc9451cb028c655ffe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e10980f3530a4aaf3535bcd0434d86038c899f9f7eaa14ec3b953dfccd14f38e945d19af90678c770e7fa5b44cf2f028a97d8dcafbf2716d9afdcfbbcb54a91f9a244f39bdc24b915afe +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=10541bac3d4a63122a37a4f7b5dcfcc525e1181fc5dd8acc49d47583d318a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=863dcf756c35668a469a0b54d4e1dfe6c8eb5731fefa8fd1ea01ee193ca65a + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254326b26fa793456510d57c3fbdb793f6b4b818a362b84c1b66c8f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666502920f436afe0924fb9e2089dae0157d3aece8be75d5e40c6c32324963763a4a342ec239c8c23d581a3c32e692458a71115f8a46511990d9df9e566c592c7cd453946d482d1b0471ca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4df46901c83ffc83cb5a2b8e3f551f94413e760c545fe690c376fcc67d2c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6ae230f4066266b0d5acbd1f88e9a369008a22f37234bb29edccccd574835b + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548ae113e0354a922eba4fcd8f1779c9e2a7e299b5dd36d51a3a88 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665707e22c0421b4143fb60cdb66d4abe8e9f9f96622ed7415a4bef49e881e62592ad072445cec53458b1a2afe797bd4b04144407359790a257fcb9ab38935582670d3355072c7f3df624b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccf1e63eb05b5935b3925d91e55cc46e95c883af0c86ceb81b44679d63b8df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bfb507e53620a99a87de6c5118a296da629e71582b4315d3f9d276cd6d8123 + +handshake=Noise_KX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622be88163c561546e4bed5f7edf59c4a66de1b08618f33e5795acaac602ccefe8ac78598314baf570622d86009c726c36d35cf3d7a7d73b97b17feb38c3b39d8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0bdd14922642db2bd89e286bac9a93db23f5677f0c21a2504d12a30ba345c9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01d6ba6fa72b364f3595ecd4fcfd2163c6419dcaaf81400f2a2475841bf0d8 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254af3f8d444ba03713f5022a823e640a91 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e10980f3530a4aaf3535bcd0434d86038c899f9f7eaa14ec3b953dfccd14f38e10d88a49863b30c39deeac932734a107a7dcd046a5c72e44ffe7568799d921d8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=10541bac3d4a63122a37a4f7b5dcfcc525e1181fc5dd8acc49d47583d318a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=863dcf756c35668a469a0b54d4e1dfe6c8eb5731fefa8fd1ea01ee193ca65a + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400e84c01aaed5f725ab7f61e29eeb91b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666502920f436afe0924fb9e2089dae0157d3aece8be75d5e40c6c32324963763a9c046b9524fcbdb33f1659ae34847bf2b199c8870b646a54304818f51af06071 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4df46901c83ffc83cb5a2b8e3f551f94413e760c545fe690c376fcc67d2c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6ae230f4066266b0d5acbd1f88e9a369008a22f37234bb29edccccd574835b + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e705ff1f11873ffc5d577a6a5cf567e0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665707e22c0421b4143fb60cdb66d4abe8e9f9f96622ed7415a4bef49e881e62597f5a32f7d06d14b6f025a25d9c5c4d4757d58ed15d8db3099ad8e3eb486f924c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccf1e63eb05b5935b3925d91e55cc46e95c883af0c86ceb81b44679d63b8df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bfb507e53620a99a87de6c5118a296da629e71582b4315d3f9d276cd6d8123 + +handshake=Noise_KX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622be88163c561546e4bed5f7edf59c4a66de1b08618f33e5795acaac602ccefee3df782d6947d1c911aac6358c29ee3a0bff04812072f6475715256b60c70ed7efb0e39e3228d109cc28 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0bdd14922642db2bd89e286bac9a93db23f5677f0c21a2504d12a30ba345c9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=01d6ba6fa72b364f3595ecd4fcfd2163c6419dcaaf81400f2a2475841bf0d8 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3e81f3136465c96cebdfe53333e37d04b3ecfc1ce18c24d8655 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e10980f3530a4aaf3535bcd0434d86038c899f9f7eaa14ec3b953dfccd14f38e0d9282cf7902b2cf30bdc567ba9b58c2a97d8dcafbf2716d9afd88d956892efd1b1f7e4e9e43e5d33812 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=10541bac3d4a63122a37a4f7b5dcfcc525e1181fc5dd8acc49d47583d318a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=863dcf756c35668a469a0b54d4e1dfe6c8eb5731fefa8fd1ea01ee193ca65a + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254326b26fa793456510d5783814b7b0b910fa84f2e03549260a3ff +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666502920f436afe0924fb9e2089dae0157d3aece8be75d5e40c6c32324963763a9e52ca3691a9bb4da162c6b52f63a33d71115f8a46511990d9dfae8beae37024a6d8f9d64a13ed725a88 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4df46901c83ffc83cb5a2b8e3f551f94413e760c545fe690c376fcc67d2c6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6ae230f4066266b0d5acbd1f88e9a369008a22f37234bb29edccccd574835b + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548ae113e0354a922eba4f54c106d22ef8b5012baa9d3f6282043e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665707e22c0421b4143fb60cdb66d4abe8e9f9f96622ed7415a4bef49e881e62598c2243a2c57862be374df2bcf1dca08b4144407359790a257fcb737585008b71d92634ed2e0006947bf3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ccf1e63eb05b5935b3925d91e55cc46e95c883af0c86ceb81b44679d63b8df +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bfb507e53620a99a87de6c5118a296da629e71582b4315d3f9d276cd6d8123 + +handshake=Noise_XN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466421a842962910af6f41bae34e0432825 +msg_2_payload= +msg_2_ciphertext=90ec9aa1d942e2a4659f38aa2c3aaea30db7c881779be22b7a75216bfc85f5b9a89cc47f2214dfe6ef4dbfcde419e1b976d89bde05869c2d4f63411b62d9e1aa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a3a03ed5f7e2e7f28a52c981ec059601e1f159914f3f3cd9a2c6c4430dd720 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=014e0d10df4f445f70e49bd6c70f73559fb941fd476c2a024a3c41faa85fd5 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d18427cf1cf5b8d6efedc50e72f98d61 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a868b8ef62dddac660ccbd0ef5a2f638 +msg_2_payload= +msg_2_ciphertext=711758abed5d3a6ac8da8b44e5c5e8172fc2ac0d276c26869df19a6d7692bc215109dd8465dccae346b7c3244b8dec4bb0b920dd013a869726939ae290787a03 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e70cfd7879dcb0954e022417341a5610ffa95efe16d46fd0a009ec563ead28 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a3cf3d1c5147d0674557713d2bb5cee2dd14b19fb068191ccbae7f2eb37d15 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254adaac346cc6dc2d8445919ef7814b47e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dc9fdacd87762acf1ffc1fc0030efbdf +msg_2_payload= +msg_2_ciphertext=ed69ae5a01433c142b45a612ad047ea28ea5fb892aec8502d2301d25379af0062277dc4aa770beb5920c299388f21f64076253ef99811b89c4c4d095baa9b663 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0466462e068b7a45a52f923a3ff92045c003d75c0abfb5fef22e50930cdf0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1e2d80773770ecd305c15a6eb937794aacc757668d6a35c0b6b757c3661d9 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a0f3449ec3aefd8d282186f3cbf6d2c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c6de47296cd1a124ae1bede32568b2eb +msg_2_payload= +msg_2_ciphertext=8c4f737e9523fc333fd7790a0da924aa5e9102815e6e58470ebfcb225505442f17316a2cfa8a0e08d6e8c61612390b023ead1a6e918977666182bf060f6e1f32 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=36b805eb8ae644d22dcd34bded50eb1d9ef8492011dfa55686877643444bf7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a623e85f1faa8a611b90e0267b9849cd137835c068773781c6020f6c29760e + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b1edc47b836d1657bba9ae2905187f9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665288e35fd769417d86673fe39856df48 +msg_2_payload= +msg_2_ciphertext=f9de295774dd85031fbfc643d31a9b8d22ad1c59c8c692f8fc24131ca25245d54aaa337b7f7543c27e2e7cece2034a3db47e10ce55ddb3e0500fc0707275b6a2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=94d5355cbc643ba0617f5cb48d4dbc0bdd474526acea6a03788ffd875ed37c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d1ad326bfcc585060bd2b228a417401e532ebc5379b65d120a4c490131b02a + +handshake=Noise_XN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466922d0c0809fbcd211f3ea7a49bd48d7d21b00709e8be9a1224e8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=90ec9aa1d942e2a4659f38aa2c3aaea30db7c881779be22b7a75216bfc85f5b9ef116e53e5dd64ea8edb4fe0b9f020503103e387380039fd95ec75f82879c19b87bc1551964b8f019c8a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a3a03ed5f7e2e7f28a52c981ec059601e1f159914f3f3cd9a2c6c4430dd720 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=014e0d10df4f445f70e49bd6c70f73559fb941fd476c2a024a3c41faa85fd5 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c40f70b1887c5e34173b42f5026cd011744f344d83d07fef6cb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622f0479024f9448013d11ed7cb13158b680cbd558e5f3ddd79c3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=711758abed5d3a6ac8da8b44e5c5e8172fc2ac0d276c26869df19a6d7692bc21b951c8a293b10a8f53d3df938218ba8f669a67d1173c5f07ed10faebb25bf8d08eb5cf41230028d4f802 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e70cfd7879dcb0954e022417341a5610ffa95efe16d46fd0a009ec563ead28 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a3cf3d1c5147d0674557713d2bb5cee2dd14b19fb068191ccbae7f2eb37d15 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254379bde1d982cb2c03b9125fd7ec573360c0d9eec0f0edc62514e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846647abc11d0a30e8f48bee07a92bcc55f96d90613992ed2d1134d8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=ed69ae5a01433c142b45a612ad047ea28ea5fb892aec8502d2301d25379af00620ccb49ae6217d2b906749a1d0901aa8245792e450b5a4856e2163b939b2113c20dcc1f6f962a4553e9e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0466462e068b7a45a52f923a3ff92045c003d75c0abfb5fef22e50930cdf0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1e2d80773770ecd305c15a6eb937794aacc757668d6a35c0b6b757c3661d9 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ab4c7101ed3993f615d370a8828e83d1b95e936d6543b31cf738 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0aa4588158d1d69aacd89d72b0212efd61f553f5b46dced9288 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8c4f737e9523fc333fd7790a0da924aa5e9102815e6e58470ebfcb225505442fcb02ed71bba2e642e3c673513f3086f2eabc32362bb438fa2719088bbc8b17eb0ab94995f4ef2b2e8240 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=36b805eb8ae644d22dcd34bded50eb1d9ef8492011dfa55686877643444bf7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a623e85f1faa8a611b90e0267b9849cd137835c068773781c6020f6c29760e + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f9c15e88f3b35e1fb6ee32fc27e793d457328549cf440cf21bc8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dccf8bea81d7143217517e7f8889214aa825fde0c0f5f3730b04 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f9de295774dd85031fbfc643d31a9b8d22ad1c59c8c692f8fc24131ca25245d511898ead584b2dff13d737c764a1068c5d79d90ea348d9a29e201390c72628151e1ec8ae3064c1847ff8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=94d5355cbc643ba0617f5cb48d4dbc0bdd474526acea6a03788ffd875ed37c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d1ad326bfcc585060bd2b228a417401e532ebc5379b65d120a4c490131b02a + +handshake=Noise_XN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466afdc554dbb2a7201c412bb437be1c270 +msg_2_payload= +msg_2_ciphertext=90ec9aa1d942e2a4659f38aa2c3aaea30db7c881779be22b7a75216bfc85f5b9ea8fcff35f027e4a4d34061afc8f293f1cc2d2845ad0e6c60fb28cd6a97ee7c9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a3a03ed5f7e2e7f28a52c981ec059601e1f159914f3f3cd9a2c6c4430dd720 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=014e0d10df4f445f70e49bd6c70f73559fb941fd476c2a024a3c41faa85fd5 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547efeb1446d33829e9121e2dd88d5890e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663a379fc907edb2d482c7cfd079c9061e +msg_2_payload= +msg_2_ciphertext=711758abed5d3a6ac8da8b44e5c5e8172fc2ac0d276c26869df19a6d7692bc21b2dbb6994af1e68351ca08a13d7aaacc314eb77d44983a1b8c0e73c6452cdbdd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e70cfd7879dcb0954e022417341a5610ffa95efe16d46fd0a009ec563ead28 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a3cf3d1c5147d0674557713d2bb5cee2dd14b19fb068191ccbae7f2eb37d15 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625482b27dc5a03ff90f7101dc91e98e48d5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6c92addd63257386faff8abe78e38b0 +msg_2_payload= +msg_2_ciphertext=ed69ae5a01433c142b45a612ad047ea28ea5fb892aec8502d2301d25379af006b1f0245bcfdf0581add0bd95d520f601f53d08bc3407f230a562a42d9ffda18e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0466462e068b7a45a52f923a3ff92045c003d75c0abfb5fef22e50930cdf0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1e2d80773770ecd305c15a6eb937794aacc757668d6a35c0b6b757c3661d9 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625417f654a5baf18317e0cbe73b91ab38e4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846655bb48ca5581a0f31d217afbb880f4b2 +msg_2_payload= +msg_2_ciphertext=8c4f737e9523fc333fd7790a0da924aa5e9102815e6e58470ebfcb225505442fe7f943ccead5ea1eddbdafc92b73898d7b606fcfd0aef45e783d25f42f380a71 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=36b805eb8ae644d22dcd34bded50eb1d9ef8492011dfa55686877643444bf7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a623e85f1faa8a611b90e0267b9849cd137835c068773781c6020f6c29760e + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254edefc841a615045a125f9dca19e4587b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846640df4f3bd14e278b1fe26af20aec9e2d +msg_2_payload= +msg_2_ciphertext=f9de295774dd85031fbfc643d31a9b8d22ad1c59c8c692f8fc24131ca25245d55076475f2e0d77cf754774a9f1fbc7fc540731fe9a5acfbee5ec79b48fb9cef3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=94d5355cbc643ba0617f5cb48d4dbc0bdd474526acea6a03788ffd875ed37c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d1ad326bfcc585060bd2b228a417401e532ebc5379b65d120a4c490131b02a + +handshake=Noise_XN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466922d0c0809fbcd211f3e38dde4eba0b653d54097896cd7d5dbd0 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=90ec9aa1d942e2a4659f38aa2c3aaea30db7c881779be22b7a75216bfc85f5b90c44c7fe245a16301dd8dc8addcc5ca23103e387380039fd95ecb996d7be061eb5ff1fc53559cd9e193d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a3a03ed5f7e2e7f28a52c981ec059601e1f159914f3f3cd9a2c6c4430dd720 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=014e0d10df4f445f70e49bd6c70f73559fb941fd476c2a024a3c41faa85fd5 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c40f70b1887c5e3417316dcb4d39a81bfcdc6d54853afdc3136 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622f0479024f9448013d1c4dd5c46e912265bc7f262f8f9b87d4d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=711758abed5d3a6ac8da8b44e5c5e8172fc2ac0d276c26869df19a6d7692bc2143d3856c18125b39f327923b49af097a669a67d1173c5f07ed10aa46ec9fbe18ede3cfb2e7f69d677010 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e70cfd7879dcb0954e022417341a5610ffa95efe16d46fd0a009ec563ead28 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a3cf3d1c5147d0674557713d2bb5cee2dd14b19fb068191ccbae7f2eb37d15 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254379bde1d982cb2c03b91964cd0759fe82fed89182aeee56f18e6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846647abc11d0a30e8f48bee4cdda0ba985e7d4b29a633657c339893 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=ed69ae5a01433c142b45a612ad047ea28ea5fb892aec8502d2301d25379af0068a312038d318ec92ac5eb587e9d8f84c245792e450b5a4856e219aa62777c215570307456d87365a897c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0466462e068b7a45a52f923a3ff92045c003d75c0abfb5fef22e50930cdf0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1e2d80773770ecd305c15a6eb937794aacc757668d6a35c0b6b757c3661d9 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ab4c7101ed3993f615d302da475cd0a6b0e5c40bf650a8570877 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0aa4588158d1d69aacd8a86346e8a06ae02b5364f1564f3c056 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8c4f737e9523fc333fd7790a0da924aa5e9102815e6e58470ebfcb225505442f6da9381647d31eb43af101b61460abefeabc32362bb438fa2719426f5763a62850870e17dabdd9d6efa5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=36b805eb8ae644d22dcd34bded50eb1d9ef8492011dfa55686877643444bf7 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a623e85f1faa8a611b90e0267b9849cd137835c068773781c6020f6c29760e + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f9c15e88f3b35e1fb6eeb3f05c99e382cdc86df79a4fa2da66c4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dccf8bea81d714321751aafc0f0c02a7ba7ee4cca458c4ddd539 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f9de295774dd85031fbfc643d31a9b8d22ad1c59c8c692f8fc24131ca25245d5c8d46971e69149e03da88ddf49bee3175d79d90ea348d9a29e20f6290a1735c098a32f1be67db24cf40b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=94d5355cbc643ba0617f5cb48d4dbc0bdd474526acea6a03788ffd875ed37c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=d1ad326bfcc585060bd2b228a417401e532ebc5379b65d120a4c490131b02a + +handshake=Noise_IN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c841939357934ea06e78f5e8e698684d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2bd30250706a1499562e15fa575c2a5fa7a3c0629af62e55b05201f5ee9a88 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8d24c99e0e9d13c7a8ea87e782a85620a2d9cfffdb51fcbfbb9f47bedb1d7a + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6392475570fd5848881a9e38debf0e3ef40f0f089c76a43dadf1559adb12f96c20d7b69e8333944ccf04538f378771335ff7c6937772e71fee4cbdd504774cc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f612bd5240c0b09912b38443ae23b80a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8ee45a004c4c4dea075b1b53c6336c68b12499a8014ec4d159edb4d8d2d61b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c0ac2d8afe9d104aa19e725b419512b446d379380b524430ad69251033b740 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412d935cd6b08a35c8ac9d91c82849b1318050ce5ccaeb3ff03a74fc657a862f0e9e1fcc385f2dd4e16efd6f9122f15e8d094df35f7d9fa9bbae5bb7737a4537b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d973603676b783cc27f40ddc2248b573 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ebdd5b2ca6c67d29b7d2a99fc6f852211df419b41ac7aa73b6afed124aefe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=40560f67839ab4d6af1857af31b623678ff4247bfd4fe52c298519e4b37748 + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487f7d8fbdfe8f1b1391dda5c06ec57e068ee0de9e260a3b48444e0ec45ba243ba02332c9e0e6c9faa1c008ebffde52607c9d8d921ca2f9e8bef5846584dd0d27 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846656d415e8c837b3c9793297af04684d7d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aae275159d2a9c8f77e94377242515e9c6faa83a1479dbcb7881dbd29f0fb2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d567ed8546efc8c4efd024eb3ff7a80a2e7a3c2cb15be8d00269e7dfb0e6c + +handshake=Noise_IN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e06c1cbe16f8d6eb194e341725b655563795ebd72a92f673016a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2bd30250706a1499562e15fa575c2a5fa7a3c0629af62e55b05201f5ee9a88 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8d24c99e0e9d13c7a8ea87e782a85620a2d9cfffdb51fcbfbb9f47bedb1d7a + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6392475570fd5848881a9e38debf0e3ef40f0f089c76a43dadf1559adb12f96c20d7b69e8333944ccf04538f3787713a3f341409341bc2633a44d0d0cffc67cb924c5f817986201f89f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846697a1574e379eb22d4ed6c9bb37a249152f86f772c0b6b0405714 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8ee45a004c4c4dea075b1b53c6336c68b12499a8014ec4d159edb4d8d2d61b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c0ac2d8afe9d104aa19e725b419512b446d379380b524430ad69251033b740 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412d935cd6b08a35c8ac9d91c82849b1318050ce5ccaeb3ff03a74fc657a862f0e9e1fcc385f2dd4e16efd6f9122f15e8dc20bd3b6d2a59bacce24fe77d836c67f156db32f914abf48a6c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466480c53c0cd421691e09cf8c71845481d77f82da21ab4404e01cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ebdd5b2ca6c67d29b7d2a99fc6f852211df419b41ac7aa73b6afed124aefe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=40560f67839ab4d6af1857af31b623678ff4247bfd4fe52c298519e4b37748 + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487f7d8fbdfe8f1b1391dda5c06ec57e068ee0de9e260a3b48444e0ec45ba243ba02332c9e0e6c9faa1c008ebffde52601555b3462a986b29bd0d0aca61ce824686b5ee49ec4a48ca8e7f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661f6cfea732227f439b5149a4d581b9ecd78c6c61b944aad00f7b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aae275159d2a9c8f77e94377242515e9c6faa83a1479dbcb7881dbd29f0fb2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d567ed8546efc8c4efd024eb3ff7a80a2e7a3c2cb15be8d00269e7dfb0e6c + +handshake=Noise_IN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846699119bc615749ecd1e6e7d1ac6d1977c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2bd30250706a1499562e15fa575c2a5fa7a3c0629af62e55b05201f5ee9a88 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8d24c99e0e9d13c7a8ea87e782a85620a2d9cfffdb51fcbfbb9f47bedb1d7a + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6392475570fd5848881a9e38debf0e3ef40f0f089c76a43dadf1559adb12f963da30abf52e7bfc3b55a0209fcc0f7a175871e2e30e8450989365002aca269b2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662b230f643036ec899a5a4f68d9d7044e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8ee45a004c4c4dea075b1b53c6336c68b12499a8014ec4d159edb4d8d2d61b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c0ac2d8afe9d104aa19e725b419512b446d379380b524430ad69251033b740 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412d935cd6b08a35c8ac9d91c82849b1318050ce5ccaeb3ff03a74fc657a862f07ab83b4c64b03c9e2033777cbb1312bbcdfbbe5ff2fdaf57ef374eff49d47fc6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cfc8f480e99a7c4c2ca19519a93b555e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ebdd5b2ca6c67d29b7d2a99fc6f852211df419b41ac7aa73b6afed124aefe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=40560f67839ab4d6af1857af31b623678ff4247bfd4fe52c298519e4b37748 + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487f7d8fbdfe8f1b1391dda5c06ec57e068ee0de9e260a3b48444e0ec45ba243b5fca98a7970812685deaf53e7ffb1575eb3f3daecc6f33e17d11d5301ab96b7b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665e39de767762c2beb6d96b26e84dbac6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aae275159d2a9c8f77e94377242515e9c6faa83a1479dbcb7881dbd29f0fb2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d567ed8546efc8c4efd024eb3ff7a80a2e7a3c2cb15be8d00269e7dfb0e6c + +handshake=Noise_IN_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e06c1cbe16f8d6eb194ee5323d1b620bf0b6767e08d8027ee9e7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2bd30250706a1499562e15fa575c2a5fa7a3c0629af62e55b05201f5ee9a88 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8d24c99e0e9d13c7a8ea87e782a85620a2d9cfffdb51fcbfbb9f47bedb1d7a + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e6392475570fd5848881a9e38debf0e3ef40f0f089c76a43dadf1559adb12f963da30abf52e7bfc3b55a0209fcc0f7a1a3f341409341bc2633a483e8bf7bea8307e6dc21c16519a91cbd +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846697a1574e379eb22d4ed66f506c2ec0fe5994eea0f25cced08528 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8ee45a004c4c4dea075b1b53c6336c68b12499a8014ec4d159edb4d8d2d61b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c0ac2d8afe9d104aa19e725b419512b446d379380b524430ad69251033b740 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412d935cd6b08a35c8ac9d91c82849b1318050ce5ccaeb3ff03a74fc657a862f07ab83b4c64b03c9e2033777cbb1312bbdc20bd3b6d2a59bacce207c6e3a1f515317eb137612cb3d35409 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466480c53c0cd421691e09cc75414f28abdc13ecc8b13cc73692825 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ebdd5b2ca6c67d29b7d2a99fc6f852211df419b41ac7aa73b6afed124aefe8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=40560f67839ab4d6af1857af31b623678ff4247bfd4fe52c298519e4b37748 + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625487f7d8fbdfe8f1b1391dda5c06ec57e068ee0de9e260a3b48444e0ec45ba243b5fca98a7970812685deaf53e7ffb15751555b3462a986b29bd0d93839bd9528630f52982f870bfd48f38 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661f6cfea732227f439b51131d5eeb7da02a5d2293f0ecd9d4183a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=aae275159d2a9c8f77e94377242515e9c6faa83a1479dbcb7881dbd29f0fb2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4d567ed8546efc8c4efd024eb3ff7a80a2e7a3c2cb15be8d00269e7dfb0e6c + +handshake=Noise_XK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549963aa4003cb0f60f51f7f8b1c0e6a9c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846630166c893dafe95f71d102a8ac640a52 +msg_2_payload= +msg_2_ciphertext=24a819b832ab7a11dd1464c2baf72f2c49e0665757911662ab11495a5fd4437e0abe01f5c07176e776e02716c4cb98a005ec4c884c4dc7500d2d9b99e9670ab3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e8b0f2fc220f7edc287a91ba45c76f6da1327405789dc61e31a649f57d6d93 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed6901a7cd973e880242b047fc86da03b498e8ed8e9838d6f3d107420dfcd9 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542bd753046e7314ec3133494e382b7a24 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b2ea43a59356b0531b01cd1572eb7dda +msg_2_payload= +msg_2_ciphertext=2d53813722d086e90ea67567c62e7363b8ac9207c580da580ef863a83ff27bcc7ad8b275fc0893de2d6b29ac0abce0a944491d09b7da32b734090a98c2c6845d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=84ae2612b7e30a08826858696ffe58b04409582f7f61a9fd89b8da7436540d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1909701a9f7ef6101bd2399cbdb58ce6a2fe375265d1b31599480046a21c40 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b29b3029f6d95e9dd623a64fdf0ffaf0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662671dcf4fe27e8fd1c025e45e28d31c1 +msg_2_payload= +msg_2_ciphertext=b9cbb82dfbae55029e5f8fde96d8295f8e132adaf171665e7e1e2ae82598eeb3cf1a6d2a1e4f9b60273187384d328fe084441b93fdfff3c58e76947db2e3293b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=66909973ba7571691166adc1cba72feaf1870d0fe1a71372421114b227bafb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a6113e6302cfedcdc0439a2606a06d1a6f0053306d188a8d0aee1a630a5e15 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542720ac573d81470b7a09238c46ff7bb7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c760c8dd0d16469689650665b8a1f189 +msg_2_payload= +msg_2_ciphertext=efe0329519660a84a2a418b869683458a06342db2cd97684000854900aa0274f5529a3d47b81a76d31e483f431b8bffd2c592e06ee566085a6cca7b48a904e74 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b9bad622368e64fbacab57ce79a664941d75ff62778de9757ca00f96ac58af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5d8a8111907d497e9905d883cfca75175f6bc39d0ae332fd3bdd6031d569cd + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e29da5e10212297d03bea07586a8960e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660a6c9b67beafadf4560b3ef5e8024902 +msg_2_payload= +msg_2_ciphertext=7e44891d25df444c83119a57b2d12d38ba30c73ae1b3894959bde4a3beddeabd73ad111c22c79bf0b7f5bf854d220e6cae35a1fa0b46e3244bedec61067b3ea0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=784797cf5ced552a14a2bce97597b2b65d3508f7aeca0bf669b54ffd1b6d71 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e5d7034b907fdced33489bb43015d216dad917aea17d4c410e24e5e6c0f24f + +handshake=Noise_XK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540c4e6c2fa1de96ff5794a3f905720f0fa07aa85019d1138cfb87 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e3186922b93e29c4a8f4d1c4e448467cbed9a9a4dd2ec38c1ab4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=24a819b832ab7a11dd1464c2baf72f2c49e0665757911662ab11495a5fd4437e2a7ab6eac00781f1afcc98a4a72d60deed954c511b2929288a7115b740e75dd4c4eb940229b3abb9dae6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e8b0f2fc220f7edc287a91ba45c76f6da1327405789dc61e31a649f57d6d93 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed6901a7cd973e880242b047fc86da03b498e8ed8e9838d6f3d107420dfcd9 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f642fb7c3aae91f49563f6ac1b84370b1c71b22b294ab8fbc0e3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466744cd29d79ec8af7a4cfe521cfe0f2b373b489b428532ebc08f0 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2d53813722d086e90ea67567c62e7363b8ac9207c580da580ef863a83ff27bcc1af9bbcbafee583d2692f2dfe82545cd693b7e89832715ec64be608745e0e529c0d90c60e037991dddd4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=84ae2612b7e30a08826858696ffe58b04409582f7f61a9fd89b8da7436540d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1909701a9f7ef6101bd2399cbdb58ce6a2fe375265d1b31599480046a21c40 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541d470c86e081f6c44d8b73ba2be130caf21500fe997f61f5d5ad +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641d7543c89c33909dac24b427d715fc5b85633f07b6e1148b976 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b9cbb82dfbae55029e5f8fde96d8295f8e132adaf171665e7e1e2ae82598eeb32e9e7173605c5adb7581f57cfa5d89d24d2d7e8c228739a46f3fa0fe6261c0ee83b9d083fa913f88221a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=66909973ba7571691166adc1cba72feaf1870d0fe1a71372421114b227bafb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a6113e6302cfedcdc0439a2606a06d1a6f0053306d188a8d0aee1a630a5e15 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545be852e934eda94d7e61eaf39ea402c8db0c77433a9251cb654f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aa809bd7a0a842c28f35d10bc7cdfb061053952aaf8482c57e60 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=efe0329519660a84a2a418b869683458a06342db2cd97684000854900aa0274f907ff4a42648255711c7be088ad03d8c09f5ccd0fd217383120ea6a650101e5b09e4478d40bc614c6ad3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b9bad622368e64fbacab57ce79a664941d75ff62778de9757ca00f96ac58af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5d8a8111907d497e9905d883cfca75175f6bc39d0ae332fd3bdd6031d569cd + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254313d1c2a3e4aaebf8a13d13077b5d6aa7fd8cd93ada82e139ce9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c387e2bc40b834219ff11f5ff429d83c9e01741eaa4435fe3eb +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7e44891d25df444c83119a57b2d12d38ba30c73ae1b3894959bde4a3beddeabd12aad42cd41d78dae898b163db19600f28c4e2910f865045f0341124d69b9f5b0cd2d2518ef701ce559d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=784797cf5ced552a14a2bce97597b2b65d3508f7aeca0bf669b54ffd1b6d71 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e5d7034b907fdced33489bb43015d216dad917aea17d4c410e24e5e6c0f24f + +handshake=Noise_XK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548d6383ab07befc895d34bfab2c20bb25 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667607d670be43da5c6ecbd567171a0113 +msg_2_payload= +msg_2_ciphertext=24a819b832ab7a11dd1464c2baf72f2c49e0665757911662ab11495a5fd4437e79e34779a2989c930f3b98e0fbc5dc1f059efd8983ccf4319dcdc99374e5d193 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e8b0f2fc220f7edc287a91ba45c76f6da1327405789dc61e31a649f57d6d93 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed6901a7cd973e880242b047fc86da03b498e8ed8e9838d6f3d107420dfcd9 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b813fb56423cef52924214450ca79a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d81b686856f42a493326b1407010180e +msg_2_payload= +msg_2_ciphertext=2d53813722d086e90ea67567c62e7363b8ac9207c580da580ef863a83ff27bcc5a15b5094d3448614cf0e63d2dda3be9d3ba315f1f1a805c414db06ffe663fbd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=84ae2612b7e30a08826858696ffe58b04409582f7f61a9fd89b8da7436540d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1909701a9f7ef6101bd2399cbdb58ce6a2fe375265d1b31599480046a21c40 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b32bc1b6ebb0501ed71168bbdeeb9318 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c2e9c14cbb5200d147b6c8f489c05c42 +msg_2_payload= +msg_2_ciphertext=b9cbb82dfbae55029e5f8fde96d8295f8e132adaf171665e7e1e2ae82598eeb3c51ae537252a89cb6ceb1ecf331c89b3190c3517e90bff4ada05101678e8679d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=66909973ba7571691166adc1cba72feaf1870d0fe1a71372421114b227bafb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a6113e6302cfedcdc0439a2606a06d1a6f0053306d188a8d0aee1a630a5e15 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c75ef7d4eb006f9a21368b1260f350c9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466539edf21f03d684bfc564ebd12168bc1 +msg_2_payload= +msg_2_ciphertext=efe0329519660a84a2a418b869683458a06342db2cd97684000854900aa0274f593132dee4feea416b20df934a782f8de96321e62cc97693d5bf3521c64717a4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b9bad622368e64fbacab57ce79a664941d75ff62778de9757ca00f96ac58af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5d8a8111907d497e9905d883cfca75175f6bc39d0ae332fd3bdd6031d569cd + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254957d3b5c945018bb3bfe5ed1350eadcb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846664a86c797bdd9e60c061831340fa2afe +msg_2_payload= +msg_2_ciphertext=7e44891d25df444c83119a57b2d12d38ba30c73ae1b3894959bde4a3beddeabd0e05d74b64b68f9da9e4751f6eabac15bfc46a0e4909b3a90f6033848e316060 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=784797cf5ced552a14a2bce97597b2b65d3508f7aeca0bf669b54ffd1b6d71 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e5d7034b907fdced33489bb43015d216dad917aea17d4c410e24e5e6c0f24f + +handshake=Noise_XK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540c4e6c2fa1de96ff57949c01e13796236098242159a3226d7efc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e3186922b93e29c4a8f481bf540b7b9425152ed77d3ac32b6d5f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=24a819b832ab7a11dd1464c2baf72f2c49e0665757911662ab11495a5fd4437e0fe2fb0506b390ab1e1527e2765e53dbed954c511b2929288a71525a716ce72aa94bca5bb136a6e3f02a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e8b0f2fc220f7edc287a91ba45c76f6da1327405789dc61e31a649f57d6d93 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ed6901a7cd973e880242b047fc86da03b498e8ed8e9838d6f3d107420dfcd9 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f642fb7c3aae91f49563f25c1b81e11ff9e6d6baaa12f93db4e8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466744cd29d79ec8af7a4cf81de742a83ee52d471a819e16e3d4a6d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2d53813722d086e90ea67567c62e7363b8ac9207c580da580ef863a83ff27bcc4568150efc37962fd4465366a61ebe29693b7e89832715ec64be7037e15af89fa2d1a1b6b34ff222e70f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=84ae2612b7e30a08826858696ffe58b04409582f7f61a9fd89b8da7436540d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1909701a9f7ef6101bd2399cbdb58ce6a2fe375265d1b31599480046a21c40 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541d470c86e081f6c44d8b89b84f8d57dae2408286970cef550461 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641d7543c89c33909dac270471bfdfb14c212b05e9e1d89108c3c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b9cbb82dfbae55029e5f8fde96d8295f8e132adaf171665e7e1e2ae82598eeb3320cd9243495f571dc2b26a545c13efe4d2d7e8c228739a46f3fce27869ab41e1a1f674f9554ec4fc8be +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=66909973ba7571691166adc1cba72feaf1870d0fe1a71372421114b227bafb +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=a6113e6302cfedcdc0439a2606a06d1a6f0053306d188a8d0aee1a630a5e15 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545be852e934eda94d7e61afc8c49437cb522881b7b27897ae8443 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aa809bd7a0a842c28f350858fa12e20248091009ca7e2a5e1470 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=efe0329519660a84a2a418b869683458a06342db2cd97684000854900aa0274f701af0cafe1731d286886a8b99ef51ff09f5ccd0fd217383120e173a10693d93478e668e1f4db49fc09e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b9bad622368e64fbacab57ce79a664941d75ff62778de9757ca00f96ac58af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5d8a8111907d497e9905d883cfca75175f6bc39d0ae332fd3bdd6031d569cd + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254313d1c2a3e4aaebf8a13761a0eaa2344e96fa3cf99b0f43756f7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663c387e2bc40b834219ff7fd28443b5731f8122fee058af7270bd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7e44891d25df444c83119a57b2d12d38ba30c73ae1b3894959bde4a3beddeabd5d5617889062645c78eeb9ba04f1a58828c4e2910f865045f03473dcfec07ba5a485641d0cb0c8986388 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=784797cf5ced552a14a2bce97597b2b65d3508f7aeca0bf669b54ffd1b6d71 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e5d7034b907fdced33489bb43015d216dad917aea17d4c410e24e5e6c0f24f + +handshake=Noise_IK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544f8445e5dc2467b1e32653192d05dee85c4781bf0dd8d33ceebb5905a7a069f09e0d3f2cad1c842930a762eb75e52827f01d2c85189d527644b3221b4c3fc5cc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aabfe2e5b1650bbaa88e33679893fc77 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=226ca869f2777611f37350a7ab446f650c0cfe2855b7f020ce658bcf100f2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=90d84d69cd44829283b05d684879b53b8d714e51619b601438a1ae67caacd9 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542723c3e2684abdc13656c8196a8dbd704eae2b5029b57d6f1387e1cf81cf8d968b42ff98eb66e9325f8a9bdf8f16f340c2cdae84d473830429e7d3e4b6731149 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846665a7ee5c74f123200a6d63a482c11412 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd57c203d5a1b8ae62c297614b5d71668c52ab4e70c1cbbc52c0538a069ccd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4cca33eb83505243974e576cbd818c98d3b346ff5c3374fac028ff153a4e9b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4a9c4176c417784b1ee28a0f323750682da959b44f9d8e06a07f757567492fa9c485c377303672a2809b5a5bb0f90133dfe4b427300d7bb2519877180db9826 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bd7e6a1364b08460dccf8961a117a93a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4492510a2b642757ad4089fda1333476635f5e8d984d8de917325a480380c8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e263d17ead44ed55677c2a12b11a3c9b625d3aa9f128b279cd5e281d5a8d9 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545bdb2d5031ac09dcb167ccedf2898899c56e3e963e1e707a4df1bed7f3f9594b80af8aa87faa8e0f7b1b9c32a49360cd3dbf48c162520192f875fbe743e38cea +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662a35d5a9542bd4d8d2f2f4f1784e9ba5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abbc8826715c00752948d22874560b57dc102dbf6c3dd853037efdd9499ad0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f80bad7ea7c64490f8123d2728a176c3afb97a59f197c7b1be246b7cd3eb1d + +handshake=Noise_IK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544f8445e5dc2467b1e32653192d05dee85c4781bf0dd8d33ceebb5905a7a069f09e0d3f2cad1c842930a762eb75e528270337527f958f92050deefa1892482d74328fee90d08201bba3cc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cb4a35db52355821787bb891112ba10f4d3dfe08b27d634db8af +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=226ca869f2777611f37350a7ab446f650c0cfe2855b7f020ce658bcf100f2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=90d84d69cd44829283b05d684879b53b8d714e51619b601438a1ae67caacd9 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542723c3e2684abdc13656c8196a8dbd704eae2b5029b57d6f1387e1cf81cf8d968b42ff98eb66e9325f8a9bdf8f16f3406cad606d45c38082aaf0636e8e77d36ee0b14bbd18c11b0fc688 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3cacf615ab82f05d73a4699120208b2e421656f8dcba114854e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd57c203d5a1b8ae62c297614b5d71668c52ab4e70c1cbbc52c0538a069ccd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4cca33eb83505243974e576cbd818c98d3b346ff5c3374fac028ff153a4e9b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4a9c4176c417784b1ee28a0f323750682da959b44f9d8e06a07f757567492fa9c485c377303672a2809b5a5bb0f9013363eebbdb99964a60f81048f750a3e578d215067a83d2699d584 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e07ee913ea981e364239c3d829a9b1851d249f6fcd440f660431 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4492510a2b642757ad4089fda1333476635f5e8d984d8de917325a480380c8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e263d17ead44ed55677c2a12b11a3c9b625d3aa9f128b279cd5e281d5a8d9 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545bdb2d5031ac09dcb167ccedf2898899c56e3e963e1e707a4df1bed7f3f9594b80af8aa87faa8e0f7b1b9c32a49360cdd218fc428fc8457cdf1952ae4c8d5ba601f8bf9547bc4e3b5083 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b86d10d43f68d1d0667499f113d9a91c468559a52225e8f34d8c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abbc8826715c00752948d22874560b57dc102dbf6c3dd853037efdd9499ad0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f80bad7ea7c64490f8123d2728a176c3afb97a59f197c7b1be246b7cd3eb1d + +handshake=Noise_IK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544f8445e5dc2467b1e32653192d05dee85c4781bf0dd8d33ceebb5905a7a069f0d6bc97dbce6f8f0ee33d49311a72d0f8c4ef8ef3bc70ccb18fd61ad67dde7eda +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466787857f66c036e974ef9d6335d2ccc5f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=226ca869f2777611f37350a7ab446f650c0cfe2855b7f020ce658bcf100f2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=90d84d69cd44829283b05d684879b53b8d714e51619b601438a1ae67caacd9 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542723c3e2684abdc13656c8196a8dbd704eae2b5029b57d6f1387e1cf81cf8d96ae04ae107f5c4eac43b568cb7ee3bb0702cf064b9c887261c27b217dec189ba5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a5746ea5e335f63000f8f28190f79185 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd57c203d5a1b8ae62c297614b5d71668c52ab4e70c1cbbc52c0538a069ccd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4cca33eb83505243974e576cbd818c98d3b346ff5c3374fac028ff153a4e9b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4a9c4176c417784b1ee28a0f323750682da959b44f9d8e06a07f757567492fa875cb562717ab59a6cc44f6b90abbc692e57a72d368bbac4c15f2b26390fca38 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660a90cdf82790ca5709564a1a8ec6bd28 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4492510a2b642757ad4089fda1333476635f5e8d984d8de917325a480380c8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e263d17ead44ed55677c2a12b11a3c9b625d3aa9f128b279cd5e281d5a8d9 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545bdb2d5031ac09dcb167ccedf2898899c56e3e963e1e707a4df1bed7f3f9594b873a288972e606ec27a89d7805c31c4ce0ff7bf1ff67795d842e014a3c8ee6f7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb0445e37867bb67c516312c2a21c06f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abbc8826715c00752948d22874560b57dc102dbf6c3dd853037efdd9499ad0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f80bad7ea7c64490f8123d2728a176c3afb97a59f197c7b1be246b7cd3eb1d + +handshake=Noise_IK_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544f8445e5dc2467b1e32653192d05dee85c4781bf0dd8d33ceebb5905a7a069f0d6bc97dbce6f8f0ee33d49311a72d0f80337527f958f92050deee33c19777fa17306346367055751bb3f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cb4a35db52355821787bb67f33957e7809370c44d33538ad5a42 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=226ca869f2777611f37350a7ab446f650c0cfe2855b7f020ce658bcf100f2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=90d84d69cd44829283b05d684879b53b8d714e51619b601438a1ae67caacd9 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542723c3e2684abdc13656c8196a8dbd704eae2b5029b57d6f1387e1cf81cf8d96ae04ae107f5c4eac43b568cb7ee3bb076cad606d45c38082aaf08ff5dab57e5a624f16bf3630c2c5f104 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3cacf615ab82f05d73a50c3841ebf6bba91d1631bb4a33552e6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fd57c203d5a1b8ae62c297614b5d71668c52ab4e70c1cbbc52c0538a069ccd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4cca33eb83505243974e576cbd818c98d3b346ff5c3374fac028ff153a4e9b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4a9c4176c417784b1ee28a0f323750682da959b44f9d8e06a07f757567492fa875cb562717ab59a6cc44f6b90abbc69363eebbdb99964a60f81d1bdca6741998d3df66cc4c3f7a20991 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e07ee913ea981e364239b86129146a0dcf47f65877606625369d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4492510a2b642757ad4089fda1333476635f5e8d984d8de917325a480380c8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e263d17ead44ed55677c2a12b11a3c9b625d3aa9f128b279cd5e281d5a8d9 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545bdb2d5031ac09dcb167ccedf2898899c56e3e963e1e707a4df1bed7f3f9594b873a288972e606ec27a89d7805c31c4cd218fc428fc8457cdf1976bed363286c0e199a5df2a8dc631f33 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b86d10d43f68d1d06674b4ceee887769c53e3b7a239e76287e1f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abbc8826715c00752948d22874560b57dc102dbf6c3dd853037efdd9499ad0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f80bad7ea7c64490f8123d2728a176c3afb97a59f197c7b1be246b7cd3eb1d + +handshake=Noise_XX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663414af878d3e46a2f58911a816d6e8346d4ea17a6f2a0bb4ef4ed56c133cff4560a34e36ea82109f26cf2e5a5caf992b608d55c747f615e5a3425a7a19eefb8f +msg_2_payload= +msg_2_ciphertext=87f864c11ba449f46a0a4f4e2eacbb7b0457784f4fca1937f572c93603e9c4d97e5ea11b16f3968710b23a3be3202dc1b5e1ce3c963347491e74f5c0768a9b42 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a52ef02ba60e12696d1d6b9ef4245c88fca757b6134ad6e76b56e310a6adf6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2445aa438ebd649281c636cc7269ca82f1d9023d72520943aeabf909cdf521 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254555f63b2499511e3b299a5649351a5b7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622df46c0ac1e0fc71795a84e37cc0e963d131c8e84c02cd5cfcfe8def3fe128b324ab54fd3be59ac143dfdc68996211170078c960e051d6ed971da20bde0fcf1 +msg_2_payload= +msg_2_ciphertext=462127adbe047db3d1fce0581b5447d99b606c591545a7719132e0c91fe93d123be3fe89ffd8af56e02cefda863080ecee5651dcecddde76b8237c66740d7c8f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=75fff8afebd2f14da1cac9cc5b5201395cdf2ad65f3a97804e360c16f4e2ac +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=150cc85f79f9ca0f0730b8b4707805ed1969ff6b2770a5d466cd2754802805 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549f27cade2b6f2db14f582e49cfbfc068 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f0f30704cd806d42849595f4e39d8ace7b1f7ab9c62c9ccaf7284b3d8ce0d88286de6a5c75efd3ada339fd7ba335dee5fe0151a61f7decdabe8fab42d807358 +msg_2_payload= +msg_2_ciphertext=3709db3d2b87c711bdd3ef87e62edd8a2775482a4421a58fb5eeb106861e98d24c021634f68b6fa8a9c2f48161e190714c2a2d90a55d2dc32f33fcbaf5afc67c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=61eaa2290029bcde241e90efb965beeb7837ec5441928800275670fdb058de +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ee55ef942191e45cf5bcea014c4a0c71f0780ff6095ff93f467e7a746e264c + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625462f2d89ffb750657573d23edc7c79728 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9996f0e38eded0281a0f505a4f2473b114924724e374c408b3ba103abc7ffbf72bf9b5f5f37f1a8ee33e4708c1f35d54d93fc2a553004be11b9a6ad56d03f30 +msg_2_payload= +msg_2_ciphertext=4744625f46dfce9240a5b1927393fd862a2520366f4df66de4b75019d201de92f3bd1d11aef54b65374c268c0ec19d34ec1fff795f07ef7065932e5983ee2e84 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=70847317d915af289e3ff17e5d66e4b4b0020d1bd997b8bb17cfa15710db0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ad071b14d700e2789c1251f57e3b1e455e3f3be012d7ab6abce986b536ba21 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254648d756cb03de7ad06e87f9a577c00de +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696a7a5454cc70bb4eec2a2f7c616c143564ff1ae149458f9e70afb3498be7a88c9feda8ece3bb7d846bd57a37fc9cf362b7d090998d862bd82fcf9a19cf154e1 +msg_2_payload= +msg_2_ciphertext=f5b6224ea13577089dc14b20ca8e90d0cedede4faff50348d4d0a0f941182ad787d1e72132665f8402f660af90e07e671606bb5a4931d244dfa6590809fac237 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5e80fec73b32f6ff466aa5addbc2b16e2cf062f09c36796ecb2efcc35cac99 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=df3c8983cb9f286df65e57d0010dc65eeca3bca44b6b240da8ebf92be581cd + +handshake=Noise_XX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663414af878d3e46a2f58911a816d6e8346d4ea17a6f2a0bb4ef4ed56c133cff4572e7a2ba5123ac30618b3d205f5c2d17f50cbca216483ac56bcc78e33bf520303278db641e5e731b2e3a +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=87f864c11ba449f46a0a4f4e2eacbb7b0457784f4fca1937f572c93603e9c4d9f27e318e43ba630594c4d08eeb3b36d97c7377a2f4f9144b2f0c8095ad92140505b2ab53eff244b14138 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a52ef02ba60e12696d1d6b9ef4245c88fca757b6134ad6e76b56e310a6adf6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2445aa438ebd649281c636cc7269ca82f1d9023d72520943aeabf909cdf521 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f533cf20723ac4407c8e51516d7c7382d8aa777424dba78813d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622df46c0ac1e0fc71795a84e37cc0e963d131c8e84c02cd5cfcfe8def3fe128b1146c1820dc4d08bf16b5c682badf2ef2dc6c1642ae7e8ae8c8e1e38a06064341a604c21b70227181c04 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=462127adbe047db3d1fce0581b5447d99b606c591545a7719132e0c91fe93d122132c2cde2bc69209884f77756f265744111b0bfa4fdeb4704a42c7f8750279908327b545416cf81f828 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=75fff8afebd2f14da1cac9cc5b5201395cdf2ad65f3a97804e360c16f4e2ac +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=150cc85f79f9ca0f0730b8b4707805ed1969ff6b2770a5d466cd2754802805 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625409f815b8eb0dbb46e73f8ce514a7791c712e94ffe307fd7bdd4a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f0f30704cd806d42849595f4e39d8ace7b1f7ab9c62c9ccaf7284b3d8ce0d88a5374047a547b592a9391e74bfd6c960d6a978c9e0cba95a40c5c091ef030556a3b10bd4c6c77fd99d75 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3709db3d2b87c711bdd3ef87e62edd8a2775482a4421a58fb5eeb106861e98d238c8b1696e695be5da9242acf392b5f4bc587962ef21463d1a0691f4042790868d59492e1d9e75a7787e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=61eaa2290029bcde241e90efb965beeb7837ec5441928800275670fdb058de +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ee55ef942191e45cf5bcea014c4a0c71f0780ff6095ff93f467e7a746e264c + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544968e874077ca381c1f03927174d090dc0c513b1eae87abbd728 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9996f0e38eded0281a0f505a4f2473b114924724e374c408b3ba103abc7ffbf8b7a8d7dff4aabdae96b83924c164accf0e6d093aa11303cacf7f18b3898ffa9cf9491aa2cd3174edfca +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4744625f46dfce9240a5b1927393fd862a2520366f4df66de4b75019d201de92d10c61a7bd2f3d460924354137751a0dd24b1336d8119acacd578c7bd6c02cd1d839990b572e4fd78e8a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=70847317d915af289e3ff17e5d66e4b4b0020d1bd997b8bb17cfa15710db0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ad071b14d700e2789c1251f57e3b1e455e3f3be012d7ab6abce986b536ba21 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254653658a6a90feb6404ce396c157f0cbec50fbaf2015658068d1d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696a7a5454cc70bb4eec2a2f7c616c143564ff1ae149458f9e70afb3498be7a885650c9453eb8927a88bd3f8cac964759dde1bfec74551b1f083a60ac9c0c8a1d5e96dedbdc3c38ab235a +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f5b6224ea13577089dc14b20ca8e90d0cedede4faff50348d4d0a0f941182ad72fbb6b3609cbfa5bc7a578aa8c377e42734c20e3dd6c03cf438ae0fb6d287fa76ca661ba86195afa81c9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5e80fec73b32f6ff466aa5addbc2b16e2cf062f09c36796ecb2efcc35cac99 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=df3c8983cb9f286df65e57d0010dc65eeca3bca44b6b240da8ebf92be581cd + +handshake=Noise_XX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663414af878d3e46a2f58911a816d6e8346d4ea17a6f2a0bb4ef4ed56c133cff4588f043d1e49a3289b1beeab8f96b0551a48cddf9f38b1a12e46c6908644198f3 +msg_2_payload= +msg_2_ciphertext=87f864c11ba449f46a0a4f4e2eacbb7b0457784f4fca1937f572c93603e9c4d95a04fa1f1c41fb3f00d496f242c1e44ce5b749b3d54bf74cea2dad086d601fb6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a52ef02ba60e12696d1d6b9ef4245c88fca757b6134ad6e76b56e310a6adf6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2445aa438ebd649281c636cc7269ca82f1d9023d72520943aeabf909cdf521 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625454a218352d64c1f8c239416ccb542aec +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622df46c0ac1e0fc71795a84e37cc0e963d131c8e84c02cd5cfcfe8def3fe128b58733b0ab529b3f48ed3fbe90840f1a27404f52be696831ccb795d1bdee31d33 +msg_2_payload= +msg_2_ciphertext=462127adbe047db3d1fce0581b5447d99b606c591545a7719132e0c91fe93d12fb91ca67cf72f381bab072bd9e6efef157067416654408489b43ba2fb6173b66 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=75fff8afebd2f14da1cac9cc5b5201395cdf2ad65f3a97804e360c16f4e2ac +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=150cc85f79f9ca0f0730b8b4707805ed1969ff6b2770a5d466cd2754802805 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254441dc6d59be427b50c47033cb28b1c92 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f0f30704cd806d42849595f4e39d8ace7b1f7ab9c62c9ccaf7284b3d8ce0d88e1c910791fa4ba183633c2d95c5511f60fe2e339a2e21ec0a6a603fa905d0531 +msg_2_payload= +msg_2_ciphertext=3709db3d2b87c711bdd3ef87e62edd8a2775482a4421a58fb5eeb106861e98d28aff4797b2780ca5d92c6497403bc2b0f953fee8dc7394a793f853dd11a05bac +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=61eaa2290029bcde241e90efb965beeb7837ec5441928800275670fdb058de +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ee55ef942191e45cf5bcea014c4a0c71f0780ff6095ff93f467e7a746e264c + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e93da98d3dd0111950d413e23d3e1a83 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9996f0e38eded0281a0f505a4f2473b114924724e374c408b3ba103abc7ffbfe9dfce15c311b11d4afa7fe50516980d178eca6d8594391837b5aab867168be5 +msg_2_payload= +msg_2_ciphertext=4744625f46dfce9240a5b1927393fd862a2520366f4df66de4b75019d201de924ab1208d037ee21e2d2f9cfd17678f49bf474350e7da4ef109e569e66507b8b0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=70847317d915af289e3ff17e5d66e4b4b0020d1bd997b8bb17cfa15710db0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ad071b14d700e2789c1251f57e3b1e455e3f3be012d7ab6abce986b536ba21 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545e4d090b68903a328013b0fa37a209a1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696a7a5454cc70bb4eec2a2f7c616c143564ff1ae149458f9e70afb3498be7a886885719af8aa799a244c80558b556ef67ec5874230e5290454ca35afef8df8d3 +msg_2_payload= +msg_2_ciphertext=f5b6224ea13577089dc14b20ca8e90d0cedede4faff50348d4d0a0f941182ad72a09d91f8664f8edfd904cb24e0666f9f40168c1c94b381251b6ca43dad53170 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5e80fec73b32f6ff466aa5addbc2b16e2cf062f09c36796ecb2efcc35cac99 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=df3c8983cb9f286df65e57d0010dc65eeca3bca44b6b240da8ebf92be581cd + +handshake=Noise_XX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663414af878d3e46a2f58911a816d6e8346d4ea17a6f2a0bb4ef4ed56c133cff4545958c588d17d6373e0c1dcfa3755d37f50cbca216483ac56bcc98f5095870aa814ba40c08079c11f087 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=87f864c11ba449f46a0a4f4e2eacbb7b0457784f4fca1937f572c93603e9c4d9c1e9a1a313d02b78871cfd178a521a4c7c7377a2f4f9144b2f0ccedc84d379151b466741e4b266db6023 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=a52ef02ba60e12696d1d6b9ef4245c88fca757b6134ad6e76b56e310a6adf6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=2445aa438ebd649281c636cc7269ca82f1d9023d72520943aeabf909cdf521 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f533cf20723ac4407c87f43dc5dc6f6d1867a322a706af81adb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622df46c0ac1e0fc71795a84e37cc0e963d131c8e84c02cd5cfcfe8def3fe128b59d623ffc18ae67b1acba43eb87910b02dc6c1642ae7e8ae8c8e861ed15d8d6b65ff99f73d8286cc9819 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=462127adbe047db3d1fce0581b5447d99b606c591545a7719132e0c91fe93d1294b31017013e8ac0a697b42922a5fe204111b0bfa4fdeb4704a4b5492137b40088f810ee4d1a58882e25 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=75fff8afebd2f14da1cac9cc5b5201395cdf2ad65f3a97804e360c16f4e2ac +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=150cc85f79f9ca0f0730b8b4707805ed1969ff6b2770a5d466cd2754802805 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625409f815b8eb0dbb46e73ff10061ce4f668e7ad525d48d24612e49 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f0f30704cd806d42849595f4e39d8ace7b1f7ab9c62c9ccaf7284b3d8ce0d887fbc3e2f5ffd90a03e00af190dfee90ad6a978c9e0cba95a40c5af61409fd89acea9efe61cc3c5626453 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3709db3d2b87c711bdd3ef87e62edd8a2775482a4421a58fb5eeb106861e98d2840ca8244e6063975c878004aa7ee991bc587962ef21463d1a0615316bea7af1a6b102acfd9bc4e8b07e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=61eaa2290029bcde241e90efb965beeb7837ec5441928800275670fdb058de +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ee55ef942191e45cf5bcea014c4a0c71f0780ff6095ff93f467e7a746e264c + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544968e874077ca381c1f0127df29420b859cf36b5383c2d8d986b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9996f0e38eded0281a0f505a4f2473b114924724e374c408b3ba103abc7ffbf8bc919f41c651555a9d4d5809975e676f0e6d093aa11303cacf701682c1dadd3666c1e965a3158618a30 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4744625f46dfce9240a5b1927393fd862a2520366f4df66de4b75019d201de92891230ebf50cc2d52029ad960d7fa613d24b1336d8119acacd5745ce1ba24faa91d6cf7be217ff6799ad +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=70847317d915af289e3ff17e5d66e4b4b0020d1bd997b8bb17cfa15710db0b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ad071b14d700e2789c1251f57e3b1e455e3f3be012d7ab6abce986b536ba21 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254653658a6a90feb6404ce2902887f0faf388ff019393d23fd4976 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846696a7a5454cc70bb4eec2a2f7c616c143564ff1ae149458f9e70afb3498be7a886ed5d694d493c5867cb2c232205e46bddde1bfec74551b1f083a86e220331181777ca16a1bad616dff5f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f5b6224ea13577089dc14b20ca8e90d0cedede4faff50348d4d0a0f941182ad7e65025d045c6ff1f63a8b63ffe90710e734c20e3dd6c03cf438a6ce9aa9775b05dd5d3b729a9ac78d811 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=5e80fec73b32f6ff466aa5addbc2b16e2cf062f09c36796ecb2efcc35cac99 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=df3c8983cb9f286df65e57d0010dc65eeca3bca44b6b240da8ebf92be581cd + +handshake=Noise_IX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466baeb82eef5d1debeac9be97240e60145fdad9ac337e2baa15d6854385bd82377fcf6c76dd0c35c7f0584b41c85d1755ee1f64c58f0abf28c8fb79b1c0cd572a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ef23146b5edecd2339995fe7f8c597ffa673d06b2671a323d881b1c39f5cef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9fb1b190c31c93d2822df95c20f1117eb3f4c2999c51d704e855f30458bfb7 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5fcb82f22fdab798026f0ccb9a6b6ce96e3facfeae51b2908db5b849c0c78cc9bda6dc05a548079571ea4f597884520ecaf65860091dada12b09c4fd30ebb0c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466661e5bec7e323f7e6117cdeef3622006331b5aad001e33c600478db7b40375e92db6dd6a1dcc1e7e3e32d0d959f2ac8d568d7c482043bf965577f51ca516a3ed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=74de2cd580b07af1ec00ef46206cf8eabb9cd289c10eee2b37e25978fd7748 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db8795447bbc6d58b7b3d37814c8c351d8dcbeba8e201c2e5f5af7978d1e32 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545667d83bcfa7dbb6ee159dde3afffea915ce4084462fc02f7f7dc86c2d338a9877fda5a8ccdda8ad14afbfc2708af4a4b210164cc720e7ec1a915daafebc046a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f04c5f04c9ae8992c210cb0193a52ae8c081c44f33ab1490df3e3c344eb1457cdf92517e1a679b2db5c4b7c71e3f6ec7452bb6a2cd4d989ac3ca0f1ec97974f4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b2590aa4f81a2fbc961d60abede55cc6a4a64a40f7bcd1642f0a31daace3fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=82b96b24e3c63563ddab16453506322429609077c4182022c6b9ed126e172a + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a4ef04eabc08e997b45b56825904b887b21cd99b04ad3be0304d7f2f81aac60b41283ee452d1546934cac576e8955322e1252e893e3e959ff36ada8319d66a9c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3ea1d0b422826e11b94b492b338fd5ef4f90d1a91a637e37c10d0ff7df19c2bdd0ced026d6c2a81cd55b68e7ec63f0f8eff1e2c8cc593e2f36ad5b936a2114a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c6623366838f79936add41938a2f31cc6703b7e7cebc2ec958f116a45842ae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c84d7d2f82cc2bf54b06aef1e2bf49bec5305d72fb5fd19754a3dce298c74 + +handshake=Noise_IX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466baeb82eef5d1debeac9be97240e60145fdad9ac337e2baa15d6854385bd823772aaa75c6cb27ba27acecd7fc13321c5b9ddfb64a50666d8ca7cbdf3fba5ccc87407789e701a194fb7074 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ef23146b5edecd2339995fe7f8c597ffa673d06b2671a323d881b1c39f5cef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9fb1b190c31c93d2822df95c20f1117eb3f4c2999c51d704e855f30458bfb7 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5fcb82f22fdab798026f0ccb9a6b6ce96e3facfeae51b2908db5b849c0c78cc9bda6dc05a548079571ea4f597884520b4de8177eb0303296be6e30ab7d21fecf59931884498725a1dfa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466661e5bec7e323f7e6117cdeef3622006331b5aad001e33c600478db7b40375e9be6315eee09348312435e12a927633c97ee6317754ea54d27027f3a339474da27661a016ba09d64d389d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=74de2cd580b07af1ec00ef46206cf8eabb9cd289c10eee2b37e25978fd7748 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db8795447bbc6d58b7b3d37814c8c351d8dcbeba8e201c2e5f5af7978d1e32 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545667d83bcfa7dbb6ee159dde3afffea915ce4084462fc02f7f7dc86c2d338a9877fda5a8ccdda8ad14afbfc2708af4a4fad9d759fcfb82f875d04a0b6ef6b58b9b8e94892f6f41c64ad7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f04c5f04c9ae8992c210cb0193a52ae8c081c44f33ab1490df3e3c344eb1457c03cc143af8a7a996dfada325c42dfa443aabe1beb17534cca091197b65ea331e7cdb9846e2d55825db62 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b2590aa4f81a2fbc961d60abede55cc6a4a64a40f7bcd1642f0a31daace3fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=82b96b24e3c63563ddab16453506322429609077c4182022c6b9ed126e172a + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a4ef04eabc08e997b45b56825904b887b21cd99b04ad3be0304d7f2f81aac60b41283ee452d1546934cac576e895532296a873828dcafe77b1f902e978dd2aaca2da191591f1ed576d41 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3ea1d0b422826e11b94b492b338fd5ef4f90d1a91a637e37c10d0ff7df19c2bf798adb221973ad40ff6bce68049acc745ebeb84d712067b160edcf4970d12bda37dbeacc9b95197d871 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c6623366838f79936add41938a2f31cc6703b7e7cebc2ec958f116a45842ae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c84d7d2f82cc2bf54b06aef1e2bf49bec5305d72fb5fd19754a3dce298c74 + +handshake=Noise_IX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466baeb82eef5d1debeac9be97240e60145fdad9ac337e2baa15d6854385bd823773396a0eee6acf05ca7aa5378bf4288454fc680db8e956a38853e04e6014dce60 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ef23146b5edecd2339995fe7f8c597ffa673d06b2671a323d881b1c39f5cef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9fb1b190c31c93d2822df95c20f1117eb3f4c2999c51d704e855f30458bfb7 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5fcb82f22fdab798026f0ccb9a6b6ce96e3facfeae51b2908db5b849c0c78cc832059e6aa8a847f2d0f96394e935903a7b5bdc38dc307c36c560744dedf674c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466661e5bec7e323f7e6117cdeef3622006331b5aad001e33c600478db7b40375e9fd6d8b2f9574f9ea404a6ecbeb282f8f112e62e65ae0c5117a2409ffdd9c87bd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=74de2cd580b07af1ec00ef46206cf8eabb9cd289c10eee2b37e25978fd7748 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db8795447bbc6d58b7b3d37814c8c351d8dcbeba8e201c2e5f5af7978d1e32 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545667d83bcfa7dbb6ee159dde3afffea915ce4084462fc02f7f7dc86c2d338a98e01aeac3a330e93ed7024c2417abe12b8b941d28126267f9ec338fb268badb92 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f04c5f04c9ae8992c210cb0193a52ae8c081c44f33ab1490df3e3c344eb1457c60a8f15129cf89e14206666494b093758fbe507fcae17bee288b08f9c85ee4eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b2590aa4f81a2fbc961d60abede55cc6a4a64a40f7bcd1642f0a31daace3fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=82b96b24e3c63563ddab16453506322429609077c4182022c6b9ed126e172a + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a4ef04eabc08e997b45b56825904b887b21cd99b04ad3be0304d7f2f81aac60bee28a96afdcf5ddb9834f24b3adbca9ffb34820535b9ef395d9ec74be0b6c463 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3ea1d0b422826e11b94b492b338fd5ef4f90d1a91a637e37c10d0ff7df19c2bdf754927b06ad75f9854618fc90be5bfa7832aea81c319f6f370c0ea61c71610 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c6623366838f79936add41938a2f31cc6703b7e7cebc2ec958f116a45842ae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c84d7d2f82cc2bf54b06aef1e2bf49bec5305d72fb5fd19754a3dce298c74 + +handshake=Noise_IX_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466baeb82eef5d1debeac9be97240e60145fdad9ac337e2baa15d6854385bd823778a69f5de7c91c7049e8a7deb8f146a4f9ddfb64a50666d8ca7cb72de7c28b6e89745666dda39138f879b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ef23146b5edecd2339995fe7f8c597ffa673d06b2671a323d881b1c39f5cef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9fb1b190c31c93d2822df95c20f1117eb3f4c2999c51d704e855f30458bfb7 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a5fcb82f22fdab798026f0ccb9a6b6ce96e3facfeae51b2908db5b849c0c78cc832059e6aa8a847f2d0f96394e935903b4de8177eb0303296be67e9e3ad1409bd062f3aba1c7c477040b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466661e5bec7e323f7e6117cdeef3622006331b5aad001e33c600478db7b40375e9737c4d6dd044d38d9ffd2dd2dab050917ee6317754ea54d2702741888f20c82d956a7bb993de16de0d14 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=74de2cd580b07af1ec00ef46206cf8eabb9cd289c10eee2b37e25978fd7748 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db8795447bbc6d58b7b3d37814c8c351d8dcbeba8e201c2e5f5af7978d1e32 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545667d83bcfa7dbb6ee159dde3afffea915ce4084462fc02f7f7dc86c2d338a98e01aeac3a330e93ed7024c2417abe12bfad9d759fcfb82f875d0c8a2111c403741010bf0636ee681033a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f04c5f04c9ae8992c210cb0193a52ae8c081c44f33ab1490df3e3c344eb1457c5132a645f88ee1276193c0bcb3c09d433aabe1beb17534cca09105fea7ab6384f007948b20ea8639f0cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b2590aa4f81a2fbc961d60abede55cc6a4a64a40f7bcd1642f0a31daace3fd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=82b96b24e3c63563ddab16453506322429609077c4182022c6b9ed126e172a + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a4ef04eabc08e997b45b56825904b887b21cd99b04ad3be0304d7f2f81aac60bee28a96afdcf5ddb9834f24b3adbca9f96a873828dcafe77b1f9e3d5a83968ebd8ec79b57e9771a568f5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a3ea1d0b422826e11b94b492b338fd5ef4f90d1a91a637e37c10d0ff7df19c2b0099aaa3c996f372406528a3a794d3ff45ebeb84d712067b160e85632580c15161e5fa9cc27ac7e74016 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c6623366838f79936add41938a2f31cc6703b7e7cebc2ec958f116a45842ae +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4c84d7d2f82cc2bf54b06aef1e2bf49bec5305d72fb5fd19754a3dce298c74 + +handshake=Noise_N_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625466758477eb5e8e0b273460a89ef8d8bb +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e89db912502b14e9dbf21dc062b494ac2e25f2010ba86f246759fdb8bd990 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=505ffc87ec9cca139162b049416af8ca811e7044897d399912f9a139ac65ec + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625404ec6da801ab66f5e59f874f002af309 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bf4151a9d4b9f4250c91542ee802a0701692a141344edb1ef3e831a8210e1c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c1dc8651b5c1d3f4189f858a7972bfd62a4123530c64d4239457fa7e46c10a + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546d32a96bccf7b2b063e7745276a99f6e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6b24bc0b584f4ca451495cdddeed74727d03f88fc561227b4cf2486f3bb360 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=60f010c122da08e08781f409477350a6da336e03bf3eb266693b581dd61826 + +handshake=Noise_N_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a703e3bfcc38dbdb465b7d5ded3686008b3ff4c92f20e9fe4b44 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e89db912502b14e9dbf21dc062b494ac2e25f2010ba86f246759fdb8bd990 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=505ffc87ec9cca139162b049416af8ca811e7044897d399912f9a139ac65ec + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625457027708cda785ef784def1e032c2ffbbcbed3108edbbb565140 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bf4151a9d4b9f4250c91542ee802a0701692a141344edb1ef3e831a8210e1c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c1dc8651b5c1d3f4189f858a7972bfd62a4123530c64d4239457fa7e46c10a + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625407e786c1a8d1e6880cf0c8ce414c8d2dbf57be2fd7c3152586df +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6b24bc0b584f4ca451495cdddeed74727d03f88fc561227b4cf2486f3bb360 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=60f010c122da08e08781f409477350a6da336e03bf3eb266693b581dd61826 + +handshake=Noise_N_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625439e0d27ade0e68178eedc32a520154b9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e89db912502b14e9dbf21dc062b494ac2e25f2010ba86f246759fdb8bd990 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=505ffc87ec9cca139162b049416af8ca811e7044897d399912f9a139ac65ec + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c1180d93ec09b5da7a888f7b5b9e9d6e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bf4151a9d4b9f4250c91542ee802a0701692a141344edb1ef3e831a8210e1c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c1dc8651b5c1d3f4189f858a7972bfd62a4123530c64d4239457fa7e46c10a + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547d8ce635d32999d4ca2bb00175c04248 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6b24bc0b584f4ca451495cdddeed74727d03f88fc561227b4cf2486f3bb360 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=60f010c122da08e08781f409477350a6da336e03bf3eb266693b581dd61826 + +handshake=Noise_N_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a703e3bfcc38dbdb465bc83726dbcf8aa4764c684931d2985245 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e89db912502b14e9dbf21dc062b494ac2e25f2010ba86f246759fdb8bd990 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=505ffc87ec9cca139162b049416af8ca811e7044897d399912f9a139ac65ec + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625457027708cda785ef784de0eed7a36afc2fad22523e691cd155e5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=bf4151a9d4b9f4250c91542ee802a0701692a141344edb1ef3e831a8210e1c +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c1dc8651b5c1d3f4189f858a7972bfd62a4123530c64d4239457fa7e46c10a + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA256 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625407e786c1a8d1e6880cf049f2b82299602ae37ab12f077040a55a +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6b24bc0b584f4ca451495cdddeed74727d03f88fc561227b4cf2486f3bb360 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=60f010c122da08e08781f409477350a6da336e03bf3eb266693b581dd61826 + +handshake=Noise_K_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254af724161ce8037f690f587990caba741 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=af4b5c9ff0d0b31da602bb6e7153edd095bd37fa83b0a35768d6ac024bc746 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a5f0b377dfd3489f3f151959508a84f19530d5cb0ea8226f2481f7839d2be5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547a2e747346812f333b2884928033af07 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=548e6dc3b25bc8d0916603d1b74d6755aeb9664c5d890466d385e7dc918acb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b43de84e2dbaaa14fdec24a4f7cc2dad954be8427ffea5b736d623b75ac878 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543754db2fc9cc2ef2f59756219f19fdf4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8c47be8aaf7c41ae38280e5e38cd42f5c57e55f0bae05b5088c448ca737cac +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03fac31b503fe58810962b52ddd9ad9fb8ff709d88926115d593bb790be465 + +handshake=Noise_K_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b8cae311a5f3367e2170caf5c7ae0947b49ced8a3b7a99f10460 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=af4b5c9ff0d0b31da602bb6e7153edd095bd37fa83b0a35768d6ac024bc746 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a5f0b377dfd3489f3f151959508a84f19530d5cb0ea8226f2481f7839d2be5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a844cd1a19651421cc5f0a672d6629f1bcebe5fd2691c65df09 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=548e6dc3b25bc8d0916603d1b74d6755aeb9664c5d890466d385e7dc918acb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b43de84e2dbaaa14fdec24a4f7cc2dad954be8427ffea5b736d623b75ac878 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542e79d636b2cfc26e6d3b795a2db7f448dd03f4a5053d35f31b5e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8c47be8aaf7c41ae38280e5e38cd42f5c57e55f0bae05b5088c448ca737cac +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03fac31b503fe58810962b52ddd9ad9fb8ff709d88926115d593bb790be465 + +handshake=Noise_K_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254061ee6934752ad8113f86fbb135a5833 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=af4b5c9ff0d0b31da602bb6e7153edd095bd37fa83b0a35768d6ac024bc746 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a5f0b377dfd3489f3f151959508a84f19530d5cb0ea8226f2481f7839d2be5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548960d9a2b168215cea4307684febf3a7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=548e6dc3b25bc8d0916603d1b74d6755aeb9664c5d890466d385e7dc918acb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b43de84e2dbaaa14fdec24a4f7cc2dad954be8427ffea5b736d623b75ac878 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fffe9d4e3bde9e0560276f13d2c04674 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8c47be8aaf7c41ae38280e5e38cd42f5c57e55f0bae05b5088c448ca737cac +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03fac31b503fe58810962b52ddd9ad9fb8ff709d88926115d593bb790be465 + +handshake=Noise_K_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b8cae311a5f3367e21709e6be52d6fd8abf20e2708f50165f7ba +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=af4b5c9ff0d0b31da602bb6e7153edd095bd37fa83b0a35768d6ac024bc746 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=a5f0b377dfd3489f3f151959508a84f19530d5cb0ea8226f2481f7839d2be5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541a844cd1a19651421cc510d96aa4ac452dc98839e9311bb36fd9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=548e6dc3b25bc8d0916603d1b74d6755aeb9664c5d890466d385e7dc918acb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b43de84e2dbaaa14fdec24a4f7cc2dad954be8427ffea5b736d623b75ac878 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542e79d636b2cfc26e6d3b936366095e5a0447b667b6c1ae8d7887 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8c47be8aaf7c41ae38280e5e38cd42f5c57e55f0bae05b5088c448ca737cac +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=03fac31b503fe58810962b52ddd9ad9fb8ff709d88926115d593bb790be465 + +handshake=Noise_X_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cccfba3094925ef50f41bb45d6e69936ad15fcba0c3479a46afb577d3459497de729f4d8d615d5886e52f4f888dd49490ed46957206fa937490058feca88e4c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e04749040fde470ab93dda9ca2d7dc69896d0c564d0898755a09830735187 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=11ca4c30bd3b563c23f5a5ae83844d038b1ae8ac7ed4e7e788ad9cdfb56c39 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546a25d60fc3551b45b422660fc5330a9a9a211a4c015192a4cb45f9e2736c0e75bb78c9f2817412a0d0644ce590aa15f91ed91cc1bf4db059be00aaea12d8ee2e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6f84a4ede3160b3464efec0b87051e3555832871ffb6b3f3549461507068cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=83ac689c3ac344c2b7fbbaacc8d655c9ff0a1a89458b12ceb4510e80b5f9da + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625433e53e3ef1c689e4802f9453dd73c9402aa8072a810f934f7a466d2ede7d8ca7f8d22e80734349ab2e4fef536d0bc40c860a78498c16248c6d4121c7c68cd5e9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=131094feaa8cbacb6c348050711162cf8d44b13e8de882c98410e7d3981d51 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=15fcd4e117342b9e651d6ab5048fd549fb38093e21fd369e1c6e630fbe9d24 + +handshake=Noise_X_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cccfba3094925ef50f41bb45d6e69936ad15fcba0c3479a46afb577d3459497de729f4d8d615d5886e52f4f888dd49486d56a823c51b82cc9bbf955b0358da74bdd0b077ee1f02b887f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e04749040fde470ab93dda9ca2d7dc69896d0c564d0898755a09830735187 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=11ca4c30bd3b563c23f5a5ae83844d038b1ae8ac7ed4e7e788ad9cdfb56c39 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546a25d60fc3551b45b422660fc5330a9a9a211a4c015192a4cb45f9e2736c0e75bb78c9f2817412a0d0644ce590aa15f961bd13d0da02b4849bacd8ac61dcfa5bef1e7f6befb9ccdb30c1 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6f84a4ede3160b3464efec0b87051e3555832871ffb6b3f3549461507068cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=83ac689c3ac344c2b7fbbaacc8d655c9ff0a1a89458b12ceb4510e80b5f9da + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625433e53e3ef1c689e4802f9453dd73c9402aa8072a810f934f7a466d2ede7d8ca7f8d22e80734349ab2e4fef536d0bc40c425ca4e756799dee05a7ed4e89dfa0920c4a847773f25c044e12 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=131094feaa8cbacb6c348050711162cf8d44b13e8de882c98410e7d3981d51 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=15fcd4e117342b9e651d6ab5048fd549fb38093e21fd369e1c6e630fbe9d24 + +handshake=Noise_X_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cccfba3094925ef50f41bb45d6e69936ad15fcba0c3479a46afb577d3459497a2b1b0c7f3c1107df1feeb7d2e340fd8d5f49ce97438f6953faa0fd6fa333a9e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e04749040fde470ab93dda9ca2d7dc69896d0c564d0898755a09830735187 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=11ca4c30bd3b563c23f5a5ae83844d038b1ae8ac7ed4e7e788ad9cdfb56c39 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546a25d60fc3551b45b422660fc5330a9a9a211a4c015192a4cb45f9e2736c0e75f6af9abf7f31d35f75534eac6e1181ed73faa6a26a1c01055d98b0f42b3e70d6 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6f84a4ede3160b3464efec0b87051e3555832871ffb6b3f3549461507068cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=83ac689c3ac344c2b7fbbaacc8d655c9ff0a1a89458b12ceb4510e80b5f9da + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625433e53e3ef1c689e4802f9453dd73c9402aa8072a810f934f7a466d2ede7d8ca79f78c9011a748444af8a1d2ac4beffd3606f6e6109b0940a1b63b3f6d67e62d9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=131094feaa8cbacb6c348050711162cf8d44b13e8de882c98410e7d3981d51 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=15fcd4e117342b9e651d6ab5048fd549fb38093e21fd369e1c6e630fbe9d24 + +handshake=Noise_X_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cccfba3094925ef50f41bb45d6e69936ad15fcba0c3479a46afb577d3459497a2b1b0c7f3c1107df1feeb7d2e340fd886d56a823c51b82cc9bbef609fcb249aa5dc6bfae8b03f645e11 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=2e04749040fde470ab93dda9ca2d7dc69896d0c564d0898755a09830735187 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=11ca4c30bd3b563c23f5a5ae83844d038b1ae8ac7ed4e7e788ad9cdfb56c39 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546a25d60fc3551b45b422660fc5330a9a9a211a4c015192a4cb45f9e2736c0e75f6af9abf7f31d35f75534eac6e1181ed61bd13d0da02b4849bac05762a942acd1f8196a3e9abd1804c1a +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=6f84a4ede3160b3464efec0b87051e3555832871ffb6b3f3549461507068cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=83ac689c3ac344c2b7fbbaacc8d655c9ff0a1a89458b12ceb4510e80b5f9da + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA256 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625433e53e3ef1c689e4802f9453dd73c9402aa8072a810f934f7a466d2ede7d8ca79f78c9011a748444af8a1d2ac4beffd3425ca4e756799dee05a737edccc12925ee623b4305c3410a3753 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=131094feaa8cbacb6c348050711162cf8d44b13e8de882c98410e7d3981d51 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=15fcd4e117342b9e651d6ab5048fd549fb38093e21fd369e1c6e630fbe9d24 + +handshake=Noise_NN_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f8006a097c5b557f4464c7b27dbd8e35 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=984f97fa7c1125c40ac0c3bb124e9a60fe179997c677873ab695f7b19ac262 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6826eeac32a5efc75cb0fcbdc9833c4fdcbad4923c77064f83ee7dfbdc288f + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254974676d1695ef76c90de21fd792bcbbf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664295530903147b2ef9fa23131d315e89 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0613a33b46a7b58b27aee0341bb301c9ab995009b4cc5184fbb5a8cf7be53d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cab31d679356097d8d190df5c068dee6e2ba4e4c275fd81e25c019bf65f6d + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d74b5809b1cc7872a9b81f4042b3e795 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660541a69fa4c2c12112d7506b314c7c3f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abf9e02663066047949fc2b5618d5ac5e2c078cdb011b7ed7a8f97aa4436b0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d85667b02a4a35a2c701afbca632f1c94741b2fc3345220d6b74af80134ca9 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aaf57bcc7f1092854b42b9d236a4c004 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466159739894d9652a3509deb14b3a10299 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be2eff0ceb13ed28f46bd59b64b8acb937ada777ee557f6147111e9fbc5d25 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79c9684daee2cdbf5117ccd166e2da4ef6bfd9c7babc9ab75e5d3665518cbd + +handshake=Noise_NN_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466114578170ac333f0a403ad4d13e744e5040f7f860764f72ede92 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=984f97fa7c1125c40ac0c3bb124e9a60fe179997c677873ab695f7b19ac262 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6826eeac32a5efc75cb0fcbdc9833c4fdcbad4923c77064f83ee7dfbdc288f + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c2a9acfae038fa688b36a860ce3cab6de204e5286be35d42db1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633d99a5f182be11e1105b85168c151b4b5551d5ef3ade5e59ce2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0613a33b46a7b58b27aee0341bb301c9ab995009b4cc5184fbb5a8cf7be53d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cab31d679356097d8d190df5c068dee6e2ba4e4c275fd81e25c019bf65f6d + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541686d22f6e5298997dc0c473114ab1dc6e02dc2355872726df0e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466402b1ffabe29fc69e1daad0ecafe3a6282d4ad0aeb7ee6625e2c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abf9e02663066047949fc2b5618d5ac5e2c078cdb011b7ed7a8f97aa4436b0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d85667b02a4a35a2c701afbca632f1c94741b2fc3345220d6b74af80134ca9 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b3a376dcfce9e9147a0616a720fd3172ecb619f17eccdc9005ab +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846693b56fc7a048915c8251b5382ce54df64c1d362e477150d6a07b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be2eff0ceb13ed28f46bd59b64b8acb937ada777ee557f6147111e9fbc5d25 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79c9684daee2cdbf5117ccd166e2da4ef6bfd9c7babc9ab75e5d3665518cbd + +handshake=Noise_NN_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667cc7b2813fbd918f730af3e151d18ebc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=984f97fa7c1125c40ac0c3bb124e9a60fe179997c677873ab695f7b19ac262 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6826eeac32a5efc75cb0fcbdc9833c4fdcbad4923c77064f83ee7dfbdc288f + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c6e9ea5266f8fe353cd01f932b2a7804 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dbb235f1ab9dc24f035f317418338415 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0613a33b46a7b58b27aee0341bb301c9ab995009b4cc5184fbb5a8cf7be53d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cab31d679356097d8d190df5c068dee6e2ba4e4c275fd81e25c019bf65f6d + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ee047aa2f9f98eabb4e2e09bb1970c42 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466241ec162167033e63b0abca7874e3355 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abf9e02663066047949fc2b5618d5ac5e2c078cdb011b7ed7a8f97aa4436b0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d85667b02a4a35a2c701afbca632f1c94741b2fc3345220d6b74af80134ca9 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625451990afd47d5cff7607df29d7e08b05c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663bf1d1f0f5c435b3018b3c8ba0a625c1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be2eff0ceb13ed28f46bd59b64b8acb937ada777ee557f6147111e9fbc5d25 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79c9684daee2cdbf5117ccd166e2da4ef6bfd9c7babc9ab75e5d3665518cbd + +handshake=Noise_NN_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466114578170ac333f0a4036ded1f916a042a8b557f6b850f608d5f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=984f97fa7c1125c40ac0c3bb124e9a60fe179997c677873ab695f7b19ac262 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6826eeac32a5efc75cb0fcbdc9833c4fdcbad4923c77064f83ee7dfbdc288f + +handshake=Noise_NNpsk0_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c2a9acfae038fa688b361ef2dab5318ec6e764eeaeb60312d9b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633d99a5f182be11e11056d6f69deb26bfc780001cca9428c875d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0613a33b46a7b58b27aee0341bb301c9ab995009b4cc5184fbb5a8cf7be53d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5cab31d679356097d8d190df5c068dee6e2ba4e4c275fd81e25c019bf65f6d + +handshake=Noise_NNpsk1_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541686d22f6e5298997dc08d43269f7d5bae51225e05e672adaef1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466402b1ffabe29fc69e1da4133d3c9e013bc17c3e78f908ce4c654 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=abf9e02663066047949fc2b5618d5ac5e2c078cdb011b7ed7a8f97aa4436b0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d85667b02a4a35a2c701afbca632f1c94741b2fc3345220d6b74af80134ca9 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_SHA512 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b3a376dcfce9e9147a06727bb95b42b46c2791a6e07c1824a5af +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846693b56fc7a048915c8251fd399101582872eab051fbe3bc3ef39c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be2eff0ceb13ed28f46bd59b64b8acb937ada777ee557f6147111e9fbc5d25 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79c9684daee2cdbf5117ccd166e2da4ef6bfd9c7babc9ab75e5d3665518cbd + +handshake=Noise_KN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a05b47c8265d4ab0222de8450c1a67fc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f3c9fbbd304f284cbf067f089801a6cbdefa9ec68ce8a186b3ec6198eff1b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e4508095fd5fa73c415d881b7b7b5519a522c358eaee583f65379a82746c72 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a605358c47ddb81dd2a4c82b4c275e2d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ce6754e492246db11d29b0ebfd513bc4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=216cfab041942d740699e1d9b13b70be15efd1842776ae8bbbcff63e5ab6f3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f390f1ed96ab34cc1ad8e419f44afb39d6c152556d04fd8285e16480f4542 + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541786642ee04970b496f2d5463b0aabb0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846647a2b31a6688efaff36c8fa66ee16eac +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d71742981c22266f55a203db331274afe42f2fcbb53cd54743f0eb4b09112b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=896562cb84ade13be47e2cd28b0244f4006df84781d971b8ddd0383395adc0 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625490b21825eee9e45abc6ff262aca6e634 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846684e4d22747f1a8b988b94cb283b34885 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bfe4815658302d4f593705a806e1102e3a2a0a36dc847aa612586a035edaa3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=dc23a01b665cafc7c1baafeda8e705ee9e0f8a0f1f4c9b89814cb747274c08 + +handshake=Noise_KN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac57ebc5143d3134c5674a209111f914f49e33f0c29b6e232822 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f3c9fbbd304f284cbf067f089801a6cbdefa9ec68ce8a186b3ec6198eff1b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e4508095fd5fa73c415d881b7b7b5519a522c358eaee583f65379a82746c72 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543cd51e47fb9aa475e18e123b157d4e9ee222e358cc22e19916a3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846647dfb3375c1e7beabafacf5cd875d25dbfbe5d5fd5762503b6cc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=216cfab041942d740699e1d9b13b70be15efd1842776ae8bbbcff63e5ab6f3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f390f1ed96ab34cc1ad8e419f44afb39d6c152556d04fd8285e16480f4542 + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543fb5766cc4bc875a8c94708eed1c40bad1376f555482ee213c4c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eeb430d11573629ee9f48689ee97e44a23404b52878c01f8129d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d71742981c22266f55a203db331274afe42f2fcbb53cd54743f0eb4b09112b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=896562cb84ade13be47e2cd28b0244f4006df84781d971b8ddd0383395adc0 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254033b7a5813ca73b834666f8c07644ac14f8bccffe995d2ded587 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c95ee12179a4d001f6e0beb00425609cf2cd7a7f17766a623f53 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bfe4815658302d4f593705a806e1102e3a2a0a36dc847aa612586a035edaa3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=dc23a01b665cafc7c1baafeda8e705ee9e0f8a0f1f4c9b89814cb747274c08 + +handshake=Noise_KN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669d58ab3ea3c810e67a9e0bc3f8b31cad +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f3c9fbbd304f284cbf067f089801a6cbdefa9ec68ce8a186b3ec6198eff1b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e4508095fd5fa73c415d881b7b7b5519a522c358eaee583f65379a82746c72 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254028d29d14a56c53b7db28781e4b8e0ec +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669ce4da10e934ba7a166a6518c4d9fd18 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=216cfab041942d740699e1d9b13b70be15efd1842776ae8bbbcff63e5ab6f3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f390f1ed96ab34cc1ad8e419f44afb39d6c152556d04fd8285e16480f4542 + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625413e83f08edd08acd29015742d043f59b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cab3cb9abaebcd0b566d2d3fdc38039a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d71742981c22266f55a203db331274afe42f2fcbb53cd54743f0eb4b09112b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=896562cb84ade13be47e2cd28b0244f4006df84781d971b8ddd0383395adc0 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625493a48efb4ac89aafa2eba5be4722b098 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846639b3e3cb2a7a8813f232329758728863 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bfe4815658302d4f593705a806e1102e3a2a0a36dc847aa612586a035edaa3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=dc23a01b665cafc7c1baafeda8e705ee9e0f8a0f1f4c9b89814cb747274c08 + +handshake=Noise_KN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ac57ebc5143d3134c567adc45d5a0da7645b723d3653a951aa1a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7f3c9fbbd304f284cbf067f089801a6cbdefa9ec68ce8a186b3ec6198eff1b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e4508095fd5fa73c415d881b7b7b5519a522c358eaee583f65379a82746c72 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543cd51e47fb9aa475e18e4b5ca06c89b89d86120b3a6925871f0b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846647dfb3375c1e7beabafaaf3082b2bafc8456a2751912500c2a3a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=216cfab041942d740699e1d9b13b70be15efd1842776ae8bbbcff63e5ab6f3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f390f1ed96ab34cc1ad8e419f44afb39d6c152556d04fd8285e16480f4542 + +handshake=Noise_KNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543fb5766cc4bc875a8c94660ba2bf08b944693946e4d1842d6003 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466eeb430d11573629ee9f4be8a75aae8683f5d5e87a90e4581f68e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d71742981c22266f55a203db331274afe42f2fcbb53cd54743f0eb4b09112b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=896562cb84ade13be47e2cd28b0244f4006df84781d971b8ddd0383395adc0 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254033b7a5813ca73b83466231a71a631b5aaa173c4529f435385b7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c95ee12179a4d001f6e0b2073ec8b7c064daad044fdc8e3f9f2a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=bfe4815658302d4f593705a806e1102e3a2a0a36dc847aa612586a035edaa3 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=dc23a01b665cafc7c1baafeda8e705ee9e0f8a0f1f4c9b89814cb747274c08 + +handshake=Noise_NK_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ae9c9a6658068e796f1609d0738cf24 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666a553cbfe29b06c54b679290a63b357e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e81871e9c00f0153758cddbae509bd548b0f5a02eab4751107842ef6b6a93c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=16cbc8684ec246d78a72c6421aa737ed4441ac751cdd4510617decffe89dfd + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254098cdd7308257dd69233ab7d725ee8bc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668edb3682137234dad14a8b4c8866e03d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7cb6cbbbddfefdc4d030ab94ab2aab13422ef4d87e054a08bb10da446c6f36 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e3926ab002f3c5051150d49e11388040a8397644b461aed00fad63e8023241 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cbd6c6755faedda9da18ea3a14dbb128 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664c48eb806966bdd24e98fe421b3d4815 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1193e531aed0c1f9c475668bc5420beb3ee15f3520931d4a283185763289fa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d4b9ff958655454654452cfc613b0b9a7fd7dac8aae5f1f0382edba43b0d1a + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625486bf3bfeb6861b365528620b68992d7b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668acd99b4cbc7ce0c14ff2be16afc02bf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=65fd72393fd5065a54fa40313eaf8b7a052631aaf3f7368622f909aff8f4e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=28de903b3a3f50fd29d23549b726ddeb4c16f7db17c1757b4dd8d54ecfd8a2 + +handshake=Noise_NK_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625490f8f004794122bca779d9bedcc39b7bfb88883f6a56029320aa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e93b0314d9d7741d4e27466c0dd7656cf06185f352ffe422a67d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e81871e9c00f0153758cddbae509bd548b0f5a02eab4751107842ef6b6a93c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=16cbc8684ec246d78a72c6421aa737ed4441ac751cdd4510617decffe89dfd + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254686ba4c18195ad7d41e9992316453c355d139541985ab5a3966f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d153be7723be9f8b575546cf935485ad9ab67635c3570d782a7a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7cb6cbbbddfefdc4d030ab94ab2aab13422ef4d87e054a08bb10da446c6f36 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e3926ab002f3c5051150d49e11388040a8397644b461aed00fad63e8023241 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254210d5de7949ae573f825864efec44aec7e75233f354d162612d0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c58fd6fcb9ef1553a6b2f2800aeb72958e3cc8bbb74a7d21b9b2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1193e531aed0c1f9c475668bc5420beb3ee15f3520931d4a283185763289fa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d4b9ff958655454654452cfc613b0b9a7fd7dac8aae5f1f0382edba43b0d1a + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c009a07ab83cf19c6e7f8cdce6b7810b8fd94271ebe94286d91 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ef6e6049aca18b319ec85d018f1abc9f9b886f0291177f84af35 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=65fd72393fd5065a54fa40313eaf8b7a052631aaf3f7368622f909aff8f4e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=28de903b3a3f50fd29d23549b726ddeb4c16f7db17c1757b4dd8d54ecfd8a2 + +handshake=Noise_NK_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e84c76e8c7b65cb632b4b7e044462340 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665e44b83033cf4b6c0632338348ba3010 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e81871e9c00f0153758cddbae509bd548b0f5a02eab4751107842ef6b6a93c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=16cbc8684ec246d78a72c6421aa737ed4441ac751cdd4510617decffe89dfd + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254078dc0cb4f3e257498b0326b749ed738 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846611a2822f0742f8b8d78d49e4826d4768 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7cb6cbbbddfefdc4d030ab94ab2aab13422ef4d87e054a08bb10da446c6f36 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e3926ab002f3c5051150d49e11388040a8397644b461aed00fad63e8023241 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e2f9cfc860db48368e8e7b088ac14ac9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663518375638c3a6f8b52d108e2eca0c65 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1193e531aed0c1f9c475668bc5420beb3ee15f3520931d4a283185763289fa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d4b9ff958655454654452cfc613b0b9a7fd7dac8aae5f1f0382edba43b0d1a + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625492ab9d1af417323e2bc1b5d5ab5a9795 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626b056d1f03521f4218c4e423a14182b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=65fd72393fd5065a54fa40313eaf8b7a052631aaf3f7368622f909aff8f4e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=28de903b3a3f50fd29d23549b726ddeb4c16f7db17c1757b4dd8d54ecfd8a2 + +handshake=Noise_NK_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625490f8f004794122bca7798750ae0cdabd48361711c1194a3a80ac +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e93b0314d9d7741d4e27e87d0ce6e3fe0f2b2b1c073a577dde57 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e81871e9c00f0153758cddbae509bd548b0f5a02eab4751107842ef6b6a93c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=16cbc8684ec246d78a72c6421aa737ed4441ac751cdd4510617decffe89dfd + +handshake=Noise_NKpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254686ba4c18195ad7d41e9353c11fdf8f2db2246391ecb8dd0fdf1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d153be7723be9f8b575534d2a1f435076015a844d771ca0cf06b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7cb6cbbbddfefdc4d030ab94ab2aab13422ef4d87e054a08bb10da446c6f36 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e3926ab002f3c5051150d49e11388040a8397644b461aed00fad63e8023241 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254210d5de7949ae573f825ac5a5aebcfe6558f9de711f803dca24a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c58fd6fcb9ef1553a6b208182eca4927db5b6ebede70e11c926f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1193e531aed0c1f9c475668bc5420beb3ee15f3520931d4a283185763289fa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d4b9ff958655454654452cfc613b0b9a7fd7dac8aae5f1f0382edba43b0d1a + +handshake=Noise_NKpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c009a07ab83cf19c6e7468cbd4dd5693d61810307b3a1037ca2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ef6e6049aca18b319ec8175c93ded5a053ed7324261bb7944cee +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=65fd72393fd5065a54fa40313eaf8b7a052631aaf3f7368622f909aff8f4e8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=28de903b3a3f50fd29d23549b726ddeb4c16f7db17c1757b4dd8d54ecfd8a2 + +handshake=Noise_KK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625422ed6d5d012d0c7b8b7c91b303b2eeaa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667db7a98eb9c50939d9d424becba2cfe4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0dc5775f180ebbca24ba2dbedf7df763974789fffe201a7158f92c61c21e56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=94573c8b800345c65607ec7bd2244bcd871c8e73247b6835ad35334257460c + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625435c738ecdc74a3da8ba56685cbda15fb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e6f50e396f3bfa2a91db76cf3550b57a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cb7d802310849d2cbcb2bf628d5b5be8694cff1cd9d9fe4d88270315550664 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8c51f3b2a7bdef2910114236378b9d97d5b0a5054f3e6e0b93d9ba1439a314 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542aa38a5f7583c960333ffdb92f005d72 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3a625b74b537cdd5581ca17b2d20c91 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=14e6e930733e777341e6bb7ec522f24f7aff05b125bf49d45b5150d2c8eee8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39a6c784e7e5f91d33ba6200a4bfb333e9e5d5974e89b8c92f7cca58641e98 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ac287025515a5ec183f396ac7626bceb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466680cff1a53276ab7f03431d5fe2ddf49 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1ee2a40d2d547aa1ecff9085d876d61bef6d5faa010db3e983313e28a84176 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=022620f1e6e067f7af42f407df7b37bfe24da7a7d79d91f3d3278bee00809f + +handshake=Noise_KK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625439201e9eaf437b4be19b1452073cf37e9fad03973780eb051f13 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669d683ff6a052688a4bf54d599e036fb4cf5d8c4fe35628270a9a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0dc5775f180ebbca24ba2dbedf7df763974789fffe201a7158f92c61c21e56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=94573c8b800345c65607ec7bd2244bcd871c8e73247b6835ad35334257460c + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7d83c70d4f86e56a84f48e3f71d9451d09c606773101e89a3fa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662d99936cb48465009334c1afddb55f62072449be590183a496b7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cb7d802310849d2cbcb2bf628d5b5be8694cff1cd9d9fe4d88270315550664 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8c51f3b2a7bdef2910114236378b9d97d5b0a5054f3e6e0b93d9ba1439a314 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428bddcbf220404e1f3344e37fae6b2b658565e8322fde73aae4a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b6be75c4a8160a18b20eafa7a5919dbc8dab95aa27d4604038ec +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=14e6e930733e777341e6bb7ec522f24f7aff05b125bf49d45b5150d2c8eee8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39a6c784e7e5f91d33ba6200a4bfb333e9e5d5974e89b8c92f7cca58641e98 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dcbb401e89f43c8af94bbdf465fb33a6d47244a2b418f7946bf4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466766cf40c486fe6860ad473d82a2500671ef59ee6cd2096af1427 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1ee2a40d2d547aa1ecff9085d876d61bef6d5faa010db3e983313e28a84176 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=022620f1e6e067f7af42f407df7b37bfe24da7a7d79d91f3d3278bee00809f + +handshake=Noise_KK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546100613cdbb5fe7b350dc52dba01d51c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846613f7bc06352a6a111cf882cbb90fb733 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0dc5775f180ebbca24ba2dbedf7df763974789fffe201a7158f92c61c21e56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=94573c8b800345c65607ec7bd2244bcd871c8e73247b6835ad35334257460c + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254186a15c02343bc4dd83d048fa63f5304 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665e19c67762e245b10dd4f42441152693 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cb7d802310849d2cbcb2bf628d5b5be8694cff1cd9d9fe4d88270315550664 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8c51f3b2a7bdef2910114236378b9d97d5b0a5054f3e6e0b93d9ba1439a314 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aafd5f671a619fdf23e78fdde0739a99 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846608923bb663020fcbd98f46f96b19838e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=14e6e930733e777341e6bb7ec522f24f7aff05b125bf49d45b5150d2c8eee8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39a6c784e7e5f91d33ba6200a4bfb333e9e5d5974e89b8c92f7cca58641e98 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b612c908afa3994b259f7bbe6f61d48b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660200b1bebc05ec930091302b462ee495 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1ee2a40d2d547aa1ecff9085d876d61bef6d5faa010db3e983313e28a84176 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=022620f1e6e067f7af42f407df7b37bfe24da7a7d79d91f3d3278bee00809f + +handshake=Noise_KK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625439201e9eaf437b4be19be0e1fd46345e956541b7a79bedfc0a44 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669d683ff6a052688a4bf5d08f5e907b60839eaf900ab19faff7b3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0dc5775f180ebbca24ba2dbedf7df763974789fffe201a7158f92c61c21e56 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=94573c8b800345c65607ec7bd2244bcd871c8e73247b6835ad35334257460c + +handshake=Noise_KKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7d83c70d4f86e56a84f27bf60c3bd52c62f0ee0b8dd9fc54d94 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662d99936cb484650093346699bf1d8c0806c839532d2d8ab258d1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=cb7d802310849d2cbcb2bf628d5b5be8694cff1cd9d9fe4d88270315550664 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8c51f3b2a7bdef2910114236378b9d97d5b0a5054f3e6e0b93d9ba1439a314 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428bddcbf220404e1f3342045d5a40b989d199aea6a10b95443af +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b6be75c4a8160a18b20ed33cc111a2da1ba4ad020106b496a765 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=14e6e930733e777341e6bb7ec522f24f7aff05b125bf49d45b5150d2c8eee8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39a6c784e7e5f91d33ba6200a4bfb333e9e5d5974e89b8c92f7cca58641e98 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dcbb401e89f43c8af94bc27709f8e7ea9d2baeacbe96f51e4d92 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466766cf40c486fe6860ad4ed44c066c8102966ab34d3e295b04ebe +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1ee2a40d2d547aa1ecff9085d876d61bef6d5faa010db3e983313e28a84176 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=022620f1e6e067f7af42f407df7b37bfe24da7a7d79d91f3d3278bee00809f + +handshake=Noise_NX_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646b94b876aef590a75654b6ad3759d4a2b887f24780015b9f52dce3318747d1421273ee37fab11ec0e19b97e016019eba398fd0234f4f397c37869498760e015 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b5d17fa3d357b71df323fb36fe9468c8b8231d52687d3ab34e943d5176559f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9604b7d4aeb5d2d669004203e5ea36a496185d60aa484d843de5ce6504fcf2 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625486484f9dc39cfcb069ca0a6b4fb53898 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466073c7b8893efddc83a6550268f1f2b58b810514f8ceb8839db90f8bd9c2d88e8839bdfbf351f047acabb381fb6432cc1098d42a95e5226dd40e64b67fa0d021f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b29d746b8d07a50fb43cde476703b870b5d9ef75e760dbb38548ff5449b74b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=575261f1aece9f5960ed5e51ecafb480adef5c1b681509cc73270b63b0cc58 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9f6b397b7e8f8dc1bc7e73b0c61286f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df854f551297c8c948841769640157bb0a68e959679f8956f3f078956be2c39c8de3427a96c0db5628e54857e7e316efc2d4ea29d8ecd50c31bd439f99a75736 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d1dcb9b1e4dbba2386624a124bb1539e391e890c463a8940127ae765eb6aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6334f69a2c9bcf6c7c1aff16f653da4b241ce641ebb859f456923670bd0c35 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547bc9eeadef9d1cd0dbc4a06e004c06b6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e758b813c78910a7246ba02fa2bf78f1f91df195e41d33fd94c03e51aa35750983a79f279c5845431d6ec30e9122d07d1b1a2f219ef8ff8fe043ca9e6e8e0f2e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8e98a23dc6de8edee0529f80f7d14be0774f42c6d90fbc56d0d5d27b9c207 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9de92b1e88a0cb7794854160cae0f948c366287194e571c8e0922554cb78bb + +handshake=Noise_NX_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646b94b876aef590a75654b6ad3759d4a2b887f24780015b9f52dce3318747d14fe963b90ba2e278d62c50e22832a691765f20777ea751a010257b1616a6de3043e332e8e891e5d4afdeb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b5d17fa3d357b71df323fb36fe9468c8b8231d52687d3ab34e943d5176559f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9604b7d4aeb5d2d669004203e5ea36a496185d60aa484d843de5ce6504fcf2 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b57ff52600948c125f4a5c4d387d7cef809d8036fd40ed2e108 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466073c7b8893efddc83a6550268f1f2b58b810514f8ceb8839db90f8bd9c2d88e8b4a4972b01bd3a29057bd6f1e9e5b90570f6cb66d26bb6164e544dc248a26347b3c7f87d473ee01ba434 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b29d746b8d07a50fb43cde476703b870b5d9ef75e760dbb38548ff5449b74b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=575261f1aece9f5960ed5e51ecafb480adef5c1b681509cc73270b63b0cc58 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f512badfe5247731af42e55b1324f361c190926302ffdbc1eef7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df854f551297c8c948841769640157bb0a68e959679f8956f3f078956be2c39c940b3d894e4d2f72db33c47e6355d445f4b4456e5d2ea966b4bf8bcdb5dfe2c29aa68488b3f82d5526d7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d1dcb9b1e4dbba2386624a124bb1539e391e890c463a8940127ae765eb6aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6334f69a2c9bcf6c7c1aff16f653da4b241ce641ebb859f456923670bd0c35 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547664a776a6da240a65ab7b2c75ed4cd21f507d1d609e65f11a74 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e758b813c78910a7246ba02fa2bf78f1f91df195e41d33fd94c03e51aa357509868f2beb823e19c97840ee2171198d4c02d416c7ca47cee015daa374cc9074a2c53a48a516d5f467572b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8e98a23dc6de8edee0529f80f7d14be0774f42c6d90fbc56d0d5d27b9c207 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9de92b1e88a0cb7794854160cae0f948c366287194e571c8e0922554cb78bb + +handshake=Noise_NX_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646b94b876aef590a75654b6ad3759d4a2b887f24780015b9f52dce3318747d1480c897964b162ef9638256026c093979aa00d4334a90f1ec65206e5102364b7e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b5d17fa3d357b71df323fb36fe9468c8b8231d52687d3ab34e943d5176559f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9604b7d4aeb5d2d669004203e5ea36a496185d60aa484d843de5ce6504fcf2 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548cc277e07714f923bddfbe134b7cdcb7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466073c7b8893efddc83a6550268f1f2b58b810514f8ceb8839db90f8bd9c2d88e89d03c776cd7ec28d70e84e6c387ef70b0e46454c8b950550860815a2ee213171 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b29d746b8d07a50fb43cde476703b870b5d9ef75e760dbb38548ff5449b74b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=575261f1aece9f5960ed5e51ecafb480adef5c1b681509cc73270b63b0cc58 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aabe871c6705c33c5e6812e239569c08 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df854f551297c8c948841769640157bb0a68e959679f8956f3f078956be2c39cd24b6200d5fbe33debec8cbb3a4a266b69ef965c80b1a345caac03508e6a462f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d1dcb9b1e4dbba2386624a124bb1539e391e890c463a8940127ae765eb6aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6334f69a2c9bcf6c7c1aff16f653da4b241ce641ebb859f456923670bd0c35 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545fb3c95fcffb1e687a983bf52c73e46e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e758b813c78910a7246ba02fa2bf78f1f91df195e41d33fd94c03e51aa3575090102a531c19850c4c0a6e9e7831a97553a0c85ba8f73d9e895f7af081c5a2d20 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8e98a23dc6de8edee0529f80f7d14be0774f42c6d90fbc56d0d5d27b9c207 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9de92b1e88a0cb7794854160cae0f948c366287194e571c8e0922554cb78bb + +handshake=Noise_NX_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846646b94b876aef590a75654b6ad3759d4a2b887f24780015b9f52dce3318747d14a02d1af836b904cdc2331de53846c36b65f20777ea751a010257af5106dbf27395fbb55e705de1c21894 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b5d17fa3d357b71df323fb36fe9468c8b8231d52687d3ab34e943d5176559f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9604b7d4aeb5d2d669004203e5ea36a496185d60aa484d843de5ce6504fcf2 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b57ff52600948c125f44b02653596239ee0c152247266ab71ff +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466073c7b8893efddc83a6550268f1f2b58b810514f8ceb8839db90f8bd9c2d88e85de4226713c8a68e15e259379d0bf3c870f6cb66d26bb6164e54d4475c4f7b4f79f00db1d34e4897233a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b29d746b8d07a50fb43cde476703b870b5d9ef75e760dbb38548ff5449b74b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=575261f1aece9f5960ed5e51ecafb480adef5c1b681509cc73270b63b0cc58 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f512badfe5247731af4236af5558ff1540b60219e82ed4fee868 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466df854f551297c8c948841769640157bb0a68e959679f8956f3f078956be2c39c385c53c43c3ffc2b5bbea33db14dbec3f4b4456e5d2ea966b4bfb56f3cb874d5c7b23b76b52ec0f9ac32 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d1dcb9b1e4dbba2386624a124bb1539e391e890c463a8940127ae765eb6aee +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6334f69a2c9bcf6c7c1aff16f653da4b241ce641ebb859f456923670bd0c35 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547664a776a6da240a65aba904f90d1eaa5f44454c7cb850438789 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e758b813c78910a7246ba02fa2bf78f1f91df195e41d33fd94c03e51aa35750948e563125f88f23f662a24cab0ae857302d416c7ca47cee015dad0910b515661e0062e9f13e5bff3b05e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e8e98a23dc6de8edee0529f80f7d14be0774f42c6d90fbc56d0d5d27b9c207 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=9de92b1e88a0cb7794854160cae0f948c366287194e571c8e0922554cb78bb + +handshake=Noise_KX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846698119b787fffa4ac2c31f25455c130cf4de25f7384a93535288b79d7da78ad57dcedde22e3c3bfbdd4123468b03f56acebb709800aaf11ff0a383891f7e13e7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=645d87cb21d68205c5d1d5ace656933772726dc15677fa66ecbb0d9e7c4a76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f5021dc910cb1c6c6c1789bc0e1383e616b8a0706ce7e8c9de0038b94c7ae3 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625420c520dc8393601629a9a4b0442dde86 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff370f61dd7f82942851279f7749a086d1bf8d2975f632a8917f266aeb7a015ed99da110b6f09d00c39aad859dbca8df6235fbb88c5ef51a8e680b281421f61c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c7b22671faef802e2d77369ee735381ed398d69c460aaacf316284f3ef9aad +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=af44c5d5da5673e25de13a9f767e492ee14e50d7866252021d594b50de5482 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254171daeee62ba0080fa7246ee5640d14a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c234402484dec5e7c50aa677ecc860e1006ed5575482ccc537336b0c0810c9761e8591300938fc3dd8280a499b8effe7b0f575edc0525bb334884f1c5a7f8a5d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=522cff6137e48e907204736ed64baeff2a255653a1f54cfc85c1fcb89a38e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a0e5114517474c8aea753cd6286906b640d6504e446cc65840f91c2ae4ff2d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437cad4dcdeaad9e6c772f632ef0f0219 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fe9957e4a8cf74cd95f22436f4cf0e40492e620ecef46cd0927053bea29b9fc3a446d8a8476c205ad279277e78b42fa40ab44a17da0ea17c7bdc385c52156d3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a8c3c1697a1444f8aaf5c1f30f8f47fe5f2edc883495d0a5fa03b5be468105 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=272a63fdf5bc0dac82c112f669218e7c0f49708ce1c24fcc16eaec673c8ffb + +handshake=Noise_KX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846698119b787fffa4ac2c31f25455c130cf4de25f7384a93535288b79d7da78ad576c29eb2fc4fc0373ed8cf04ebe98c88763f453e22f5bf4fea56930d1b112a72635a554fb65faa2ac41b7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=645d87cb21d68205c5d1d5ace656933772726dc15677fa66ecbb0d9e7c4a76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f5021dc910cb1c6c6c1789bc0e1383e616b8a0706ce7e8c9de0038b94c7ae3 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548c42693ab9b2b64f32e396a1c5c1cf40666e2447991b4301219a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff370f61dd7f82942851279f7749a086d1bf8d2975f632a8917f266aeb7a015ed112c9698130c8f77715bb1606ee158a1bf0561b47f1fa3358fd7f873c8fb725b873f32a3a2b74818ad5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c7b22671faef802e2d77369ee735381ed398d69c460aaacf316284f3ef9aad +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=af44c5d5da5673e25de13a9f767e492ee14e50d7866252021d594b50de5482 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429641c04894b9a11f27d044ce0cd6700c86d74b6c6b2e0a36631 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c234402484dec5e7c50aa677ecc860e1006ed5575482ccc537336b0c0810c97614f780867dcfa660718c9445ddb0b18adb74ab7d4bb6da9bebc94b680fa2005464fb98609980ad19a71b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=522cff6137e48e907204736ed64baeff2a255653a1f54cfc85c1fcb89a38e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a0e5114517474c8aea753cd6286906b640d6504e446cc65840f91c2ae4ff2d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540a6409e4470fb6ff0e4814ec0d6311dcbdebc35784830d1fbed8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fe9957e4a8cf74cd95f22436f4cf0e40492e620ecef46cd0927053bea29b9fcfdc326f3f799fa284adde53c57a64e92a31ea878b11cc8a07a211d9d1a425caf0a49fb0a54759b386248 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a8c3c1697a1444f8aaf5c1f30f8f47fe5f2edc883495d0a5fa03b5be468105 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=272a63fdf5bc0dac82c112f669218e7c0f49708ce1c24fcc16eaec673c8ffb + +handshake=Noise_KX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846698119b787fffa4ac2c31f25455c130cf4de25f7384a93535288b79d7da78ad57be7743fad001edc79215121d52d586527894eb7516dbd70d353c8174849e3fb7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=645d87cb21d68205c5d1d5ace656933772726dc15677fa66ecbb0d9e7c4a76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f5021dc910cb1c6c6c1789bc0e1383e616b8a0706ce7e8c9de0038b94c7ae3 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447b7249372647d750def52e1c5e505de +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff370f61dd7f82942851279f7749a086d1bf8d2975f632a8917f266aeb7a015e37746122f2158189601b656f82a28272f471a98dd3e9cb92f15dcb31b2d61afe +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c7b22671faef802e2d77369ee735381ed398d69c460aaacf316284f3ef9aad +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=af44c5d5da5673e25de13a9f767e492ee14e50d7866252021d594b50de5482 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549a46b6cc19675c81a7c17e59ae2fbb77 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c234402484dec5e7c50aa677ecc860e1006ed5575482ccc537336b0c0810c976a3e88fa64138fea30ee9b5dfb5f7edf054d75d4cb3788e22dc531cf95b5e2f48 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=522cff6137e48e907204736ed64baeff2a255653a1f54cfc85c1fcb89a38e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a0e5114517474c8aea753cd6286906b640d6504e446cc65840f91c2ae4ff2d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419b10036434a604f7ad315181f250980 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fe9957e4a8cf74cd95f22436f4cf0e40492e620ecef46cd0927053bea29b9fc64f37ec0795f68ed37302d9790f1282a4e9570c27bc6fba150347584f533aa77 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a8c3c1697a1444f8aaf5c1f30f8f47fe5f2edc883495d0a5fa03b5be468105 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=272a63fdf5bc0dac82c112f669218e7c0f49708ce1c24fcc16eaec673c8ffb + +handshake=Noise_KX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846698119b787fffa4ac2c31f25455c130cf4de25f7384a93535288b79d7da78ad57d1ec426cdbfc40cc5b485727b8e8243463f453e22f5bf4fea56964b42c087e66e0d151039f27af53d4fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=645d87cb21d68205c5d1d5ace656933772726dc15677fa66ecbb0d9e7c4a76 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f5021dc910cb1c6c6c1789bc0e1383e616b8a0706ce7e8c9de0038b94c7ae3 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548c42693ab9b2b64f32e3c4cfe206c4b91682f9f8f6936fc9afbe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff370f61dd7f82942851279f7749a086d1bf8d2975f632a8917f266aeb7a015ee7c5ca712002095e484838ae25fd75461bf0561b47f1fa3358fdf8e83366ddb4923b44739185cea05565 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c7b22671faef802e2d77369ee735381ed398d69c460aaacf316284f3ef9aad +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=af44c5d5da5673e25de13a9f767e492ee14e50d7866252021d594b50de5482 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429641c04894b9a11f27da81cd77c9a037dcdb91e7d38713655de +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c234402484dec5e7c50aa677ecc860e1006ed5575482ccc537336b0c0810c9761e984ed70366c1429556ad81e7ffc621db74ab7d4bb6da9bebc94678f2c759019dd38f17f4672db5fe6b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=522cff6137e48e907204736ed64baeff2a255653a1f54cfc85c1fcb89a38e7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a0e5114517474c8aea753cd6286906b640d6504e446cc65840f91c2ae4ff2d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540a6409e4470fb6ff0e4867ac27fa94e39def5fb9cff692b08053 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fe9957e4a8cf74cd95f22436f4cf0e40492e620ecef46cd0927053bea29b9fc80694fe3959f5da3630331671ddae3d5a31ea878b11cc8a07a219cbdbb73011e081a82623aefd7500ebb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a8c3c1697a1444f8aaf5c1f30f8f47fe5f2edc883495d0a5fa03b5be468105 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=272a63fdf5bc0dac82c112f669218e7c0f49708ce1c24fcc16eaec673c8ffb + +handshake=Noise_XN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846629c447f1d9897b8983f6a3622b9c68fe +msg_2_payload= +msg_2_ciphertext=037099440bbf00ed48e8e128d88e1ef2306f1b6e68f27fa225aa4b712d77baf46f0739cd1a8302353862f0a47b0e0326ba6101e1defbff83190d7a9a5d6804ef +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c818555ad9a26b3635d18f4056dc23fbb91c3d3a7a0ec77b01ad01542bccc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e55862d8ebce08d0f83f774fc665146e3de69dd2642884d8613c7a93fd698 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cb40ef0aeb7dd7bc5077878685c5d5c2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466662ed487400777ba45d66cf3440a55f0 +msg_2_payload= +msg_2_ciphertext=8d8c26c8c2048e031c6315e24093d4ad18b7efff7595b086239c24068e3db491158bca797fa3d1cd50f571d9474b70a0e8f28e47668d42c7845f1f26ca01b513 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=899e34bc0ead03fba60e56cfd11cbb3790834e6d5c23a10dfa0b93acccc900 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6e85b7d7a6c44fb89e92477ec4caf02ef9abaede5a43eb303676eb7dc4f6e9 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cedb8e556eabaa5203ac7a28c0b4e4c5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665b07ffa8c845133bf13d3121173e1bcc +msg_2_payload= +msg_2_ciphertext=77d0e47e4dbb723e616b6f24738e459ea8e98a574f6e59732204f0363e69879fa204c34f701074ac88a7230eb5bb640377590cc82ec8b0809bd3725523fbaf57 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c651eedb26764976c359cd8f3b7e6c6cf61dec2a8e9e7cdabed1e0e5ae7cde +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=caf2c606303c4d12eddf43c5bb8330e86230cb2d8bab3dcf4eadd40776acc1 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aea85d73fe6523d3273aac24fa0e5d53 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ecbcd4c6ef7f7346437007c3c8806348 +msg_2_payload= +msg_2_ciphertext=2c5a5be592acde69362c483d714504e4fb32031199e3b8e7c9052ce199b3b045c12ba87c6a67e96f8de387e729f342425dbfadf39264e46ef3e5f25f4e1f74c0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd75543aed4fbaaa884e485c7f3f7847c2dd2c5dd6c669d81399bad151b357 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=aaf79ee8c46da36c2998983b081475ce0c55c22a2c03b6f5c36c6714ac589a + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254126f87830ce7792290f4bc27fe31e18f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466db3adfc1817b0e0bc47050f0819a7466 +msg_2_payload= +msg_2_ciphertext=b009c459289fb3451ce340c21aefbeab59707c472c0b532e3758a1fdb21962b2d0a81254c169e20fbd5bdb89cfa3f70a1d1ca9b11bcaac5f3834bdf2ad356f02 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=76ec40c6107efb6f7a22addff790390d82eef906568d70ee8ad03d8bc70fe5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4d4e7a4916c6202c5c7d4cfc502fc7d26f5ad42c9a93023a07dc09e47297e7 + +handshake=Noise_XN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a14dd9325bc6f396704c351c6d783fbecc244a54327404ddafd9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=037099440bbf00ed48e8e128d88e1ef2306f1b6e68f27fa225aa4b712d77baf4edf2cffd49eea54222e7ab2220acf3b59a894802e80e97ef1c968acf6dac24b595997fcfb560aca4ed67 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c818555ad9a26b3635d18f4056dc23fbb91c3d3a7a0ec77b01ad01542bccc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e55862d8ebce08d0f83f774fc665146e3de69dd2642884d8613c7a93fd698 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c66d55a16b9cb77895dc7098d55af8e40e8916d8d6a818367b4e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b78d0157146db12f98a9434b8402daab60240651f013edbeddbd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8d8c26c8c2048e031c6315e24093d4ad18b7efff7595b086239c24068e3db491f8dca2295ae4b6746a616e7b5ce038761ca387a1f28499c8efff252ccb4522e99e32ef4ef38e16d0a09e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=899e34bc0ead03fba60e56cfd11cbb3790834e6d5c23a10dfa0b93acccc900 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6e85b7d7a6c44fb89e92477ec4caf02ef9abaede5a43eb303676eb7dc4f6e9 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431ae431ebbf2fffee5c4f57d02c3f9bb6b86194e99431ccb2e78 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b5554432a018960a5dde37d862e2213837997c77d9bc99d4ae00 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=77d0e47e4dbb723e616b6f24738e459ea8e98a574f6e59732204f0363e69879fe9339af66e60b3bc4ad0d76a2b361e608ad399d3f9c470db77081b15a7e8cd34345207714fc9c00567be +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c651eedb26764976c359cd8f3b7e6c6cf61dec2a8e9e7cdabed1e0e5ae7cde +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=caf2c606303c4d12eddf43c5bb8330e86230cb2d8bab3dcf4eadd40776acc1 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d0fbe4d8c565b9a59d3664c055d51254e7a5c460f2b1d79b1512 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665489a70f5e1b78b65e0e6276106d69d27c1703e5143194ab570b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2c5a5be592acde69362c483d714504e4fb32031199e3b8e7c9052ce199b3b04525aa23a3f117933aeb082d5a6afac8943f9258c2910cd02a610abd7cbb58b5134d2648a1e871a937d77e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd75543aed4fbaaa884e485c7f3f7847c2dd2c5dd6c669d81399bad151b357 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=aaf79ee8c46da36c2998983b081475ce0c55c22a2c03b6f5c36c6714ac589a + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254736a9b818f8f6c3819ac393d6b7f7854db18caf10ce923e83f8e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b84cd00d3fb44ad35659ffa23a7536b54efc59aa2044b07586ad +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b009c459289fb3451ce340c21aefbeab59707c472c0b532e3758a1fdb21962b27523093bcb2a3dfce853b494d6ea805a5fc329d60b8aee3304bec99837f50477fe78a4b351f61883d824 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=76ec40c6107efb6f7a22addff790390d82eef906568d70ee8ad03d8bc70fe5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4d4e7a4916c6202c5c7d4cfc502fc7d26f5ad42c9a93023a07dc09e47297e7 + +handshake=Noise_XN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fdd2b7bd566405af7fc55d1ea22eb9a0 +msg_2_payload= +msg_2_ciphertext=037099440bbf00ed48e8e128d88e1ef2306f1b6e68f27fa225aa4b712d77baf42d2aeaa369a2453ca4fac292728eb176f185485e89192e67e6533e3be6e62fd6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c818555ad9a26b3635d18f4056dc23fbb91c3d3a7a0ec77b01ad01542bccc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e55862d8ebce08d0f83f774fc665146e3de69dd2642884d8613c7a93fd698 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254438d0cdbd30fa2a6212df592afa39463 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f70c2b60d3681c4ae1464b219d601939 +msg_2_payload= +msg_2_ciphertext=8d8c26c8c2048e031c6315e24093d4ad18b7efff7595b086239c24068e3db491bd66a891f64d386afd67ae979156a33405ea115b17b0bcbbbb410662d5000700 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=899e34bc0ead03fba60e56cfd11cbb3790834e6d5c23a10dfa0b93acccc900 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6e85b7d7a6c44fb89e92477ec4caf02ef9abaede5a43eb303676eb7dc4f6e9 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a5d22bc1f57918704666014d605651c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846640f652850ce7973035f8662ede800b3d +msg_2_payload= +msg_2_ciphertext=77d0e47e4dbb723e616b6f24738e459ea8e98a574f6e59732204f0363e69879fefe52aedafb1eb16cd73b9bf018195ac6115f19155faf159940e8934c48fc3d2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c651eedb26764976c359cd8f3b7e6c6cf61dec2a8e9e7cdabed1e0e5ae7cde +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=caf2c606303c4d12eddf43c5bb8330e86230cb2d8bab3dcf4eadd40776acc1 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625415541c87fdd7cc758cddf3d74585ddfd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f44198fd9ebd0ef63b19c0a319d954e +msg_2_payload= +msg_2_ciphertext=2c5a5be592acde69362c483d714504e4fb32031199e3b8e7c9052ce199b3b04520cbdc05aa35762b015bcbe72ee32c53f88973ca7a77023b599f7c12fc177a49 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd75543aed4fbaaa884e485c7f3f7847c2dd2c5dd6c669d81399bad151b357 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=aaf79ee8c46da36c2998983b081475ce0c55c22a2c03b6f5c36c6714ac589a + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543cd5f617b6935cd7c18512eb96cab112 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b64a7ac6d3a4f90d88f77ecee3edfc23 +msg_2_payload= +msg_2_ciphertext=b009c459289fb3451ce340c21aefbeab59707c472c0b532e3758a1fdb21962b2f228fcc2420f9dd59b93ab17cd64307b10077ab83231601f42d55bf8b11d5eaf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=76ec40c6107efb6f7a22addff790390d82eef906568d70ee8ad03d8bc70fe5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4d4e7a4916c6202c5c7d4cfc502fc7d26f5ad42c9a93023a07dc09e47297e7 + +handshake=Noise_XN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a14dd9325bc6f396704c83029bb8ee2c682ddefcc95ab27a5705 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=037099440bbf00ed48e8e128d88e1ef2306f1b6e68f27fa225aa4b712d77baf4f298f5dd39297c240ab2ea3bcf06a08d9a894802e80e97ef1c9692f95413dbbb7a274f5b3c8379785a73 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c818555ad9a26b3635d18f4056dc23fbb91c3d3a7a0ec77b01ad01542bccc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=5e55862d8ebce08d0f83f774fc665146e3de69dd2642884d8613c7a93fd698 + +handshake=Noise_XNpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c66d55a16b9cb77895dc547b0a9dacd026081933e9a2f5ba3316 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b78d0157146db12f98a92d0d04ad4f6bcf0eb10295eadb3ce68d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8d8c26c8c2048e031c6315e24093d4ad18b7efff7595b086239c24068e3db491ab26939a8b927dd8b6899c1ef8cd05681ca387a1f28499c8efffe90b8a20b0d0c5492cd30da15886983f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=899e34bc0ead03fba60e56cfd11cbb3790834e6d5c23a10dfa0b93acccc900 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6e85b7d7a6c44fb89e92477ec4caf02ef9abaede5a43eb303676eb7dc4f6e9 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625431ae431ebbf2fffee5c46dc4fe2e28e420faeb5d7d6fdcd9fd1e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b5554432a018960a5ddea9dc4722dafccb155ccec727f7e117db +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=77d0e47e4dbb723e616b6f24738e459ea8e98a574f6e59732204f0363e69879fb33359c30072d3d679a758fafa47b4a88ad399d3f9c470db7708825d5a32cede80e83b39da876ebd32ec +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c651eedb26764976c359cd8f3b7e6c6cf61dec2a8e9e7cdabed1e0e5ae7cde +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=caf2c606303c4d12eddf43c5bb8330e86230cb2d8bab3dcf4eadd40776acc1 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d0fbe4d8c565b9a59d36c37761f6baf2fadacb82f65cdcb0e7a0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665489a70f5e1b78b65e0ed210acf243c4cd719fe17329c873d089 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2c5a5be592acde69362c483d714504e4fb32031199e3b8e7c9052ce199b3b0457cc90677431269e0be999225605d0e473f9258c2910cd02a610afb1a9d02f62b1a42252cc3490723e384 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dd75543aed4fbaaa884e485c7f3f7847c2dd2c5dd6c669d81399bad151b357 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=aaf79ee8c46da36c2998983b081475ce0c55c22a2c03b6f5c36c6714ac589a + +handshake=Noise_XNpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254736a9b818f8f6c3819ac0ececbf4e29bd4ffb897c3d0f6ba0fb5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b84cd00d3fb44ad35659d39abc84ea30dc658b3e678aa780bd53 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b009c459289fb3451ce340c21aefbeab59707c472c0b532e3758a1fdb21962b297cbe2138dce7b9a8078056e25c2ea8f5fc329d60b8aee3304be7e07903593cb5c9efad256bf8e06381c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=76ec40c6107efb6f7a22addff790390d82eef906568d70ee8ad03d8bc70fe5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4d4e7a4916c6202c5c7d4cfc502fc7d26f5ad42c9a93023a07dc09e47297e7 + +handshake=Noise_IN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666e3f19dc99a2257db910145fa6e54aef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9ccb684459ec247c656f7a9c582a018aac429546bdee1199a1ed61ba49fc64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39614a2f4324d2407d903c372a779b30fd32fae1c5b6d69cdc0877cae101ff + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471caa66028f64280a10cdb259a0f0ee1c59b656bb9366bd2a76f8e42a9bebed7872be750256a0ce3dd0b8d85daee1094b8ed982f1c2a6657ff978086d16874d4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661c71ad2acb743655448c1b44eb19eb7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=524b10cf461ef1f535017e250c8fe51471fb22093f7aef578485f282f7af0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6d27cc209baae7deb036ff0c7c45a3c0c7b86d1949ff81570da6e319323c08 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ce4cd9b7ed42c5afaac1903aa6b83bf2665bf49b278784bed2a8d8ca87f34402fdb485d8cfde58838035a57e1ba4e8da2957ac4c7de5d2725b56092d25a7177 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e1884abae5c79aec17fe6ba6b321f1c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9afced7a00a7d235716c18a3cd21737541e0ce919babee1b4106da009fd889 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=65783176595aba309742bfdf98f1c699ee18b65e091571ff41ef7f3e658b4d + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549138f71daf8a8ccad5990ffd2d892da9fbcf2b41c95e11f1d48ed3ade358c32f7ea8eeaabc9629b368b2e98e0f3733be7225d72099f7df6538e48a8c60dce748 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f10361bb35702893ddbf2c2c632d849c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be487fd9db2f9d9dd8ecb6a2c071a8ebcf71e344d535ecb0376efc8890726d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e43bb8a33bdf3307795da4a4d99d691922794058217d4c4902cef80d1b94ed + +handshake=Noise_IN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466883df2067301b17472bc17c3aea78ff04f20412f5f100390fd79 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9ccb684459ec247c656f7a9c582a018aac429546bdee1199a1ed61ba49fc64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39614a2f4324d2407d903c372a779b30fd32fae1c5b6d69cdc0877cae101ff + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471caa66028f64280a10cdb259a0f0ee1c59b656bb9366bd2a76f8e42a9bebed7872be750256a0ce3dd0b8d85daee109442a2e41e0634afc367f0ce923a70cf9bd6c4db73bb0a0803f10d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663536123ea26b1bfcf393c34e3298477c533893ebfc51cbf9193b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=524b10cf461ef1f535017e250c8fe51471fb22093f7aef578485f282f7af0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6d27cc209baae7deb036ff0c7c45a3c0c7b86d1949ff81570da6e319323c08 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ce4cd9b7ed42c5afaac1903aa6b83bf2665bf49b278784bed2a8d8ca87f34402fdb485d8cfde58838035a57e1ba4e8d14e124433912c24fe0422740d71e57f17e357266751d7d99aba3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fd0bf78bd69757b645a2d07e6a5fe7582a47bdfba1bbcb3cacc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9afced7a00a7d235716c18a3cd21737541e0ce919babee1b4106da009fd889 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=65783176595aba309742bfdf98f1c699ee18b65e091571ff41ef7f3e658b4d + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549138f71daf8a8ccad5990ffd2d892da9fbcf2b41c95e11f1d48ed3ade358c32f7ea8eeaabc9629b368b2e98e0f3733bede18b3b48a6276edf76a81785394b60e6d181d0b55147e05997d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e3677d51882a717bfafeb6e28ceb9957567363ba37c8a809db0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be487fd9db2f9d9dd8ecb6a2c071a8ebcf71e344d535ecb0376efc8890726d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e43bb8a33bdf3307795da4a4d99d691922794058217d4c4902cef80d1b94ed + +handshake=Noise_IN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663030d12e83fc1c593b562909667508fb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9ccb684459ec247c656f7a9c582a018aac429546bdee1199a1ed61ba49fc64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39614a2f4324d2407d903c372a779b30fd32fae1c5b6d69cdc0877cae101ff + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471caa66028f64280a10cdb259a0f0ee1c59b656bb9366bd2a76f8e42a9bebed7305e7a3c409dd4ba92d3fc3f3f8d763c46d6344acf2941446c9812a1286cb04d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666d7c1191cd68a34ba4b64c5e58c972a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=524b10cf461ef1f535017e250c8fe51471fb22093f7aef578485f282f7af0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6d27cc209baae7deb036ff0c7c45a3c0c7b86d1949ff81570da6e319323c08 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ce4cd9b7ed42c5afaac1903aa6b83bf2665bf49b278784bed2a8d8ca87f3440ed8d78ab07ed6b569d0fc538be2a8220c6b583f1bffa1acc148370953f45cd11 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846621ddef7c2f3b01b8748714bdab2937fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9afced7a00a7d235716c18a3cd21737541e0ce919babee1b4106da009fd889 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=65783176595aba309742bfdf98f1c699ee18b65e091571ff41ef7f3e658b4d + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549138f71daf8a8ccad5990ffd2d892da9fbcf2b41c95e11f1d48ed3ade358c32fcd3bed0595f69641adbfdd57ab1dc085a124a2b362fb05d05f1e655d15fa290f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664a4abe3680fc325b700f59d5c46985d1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be487fd9db2f9d9dd8ecb6a2c071a8ebcf71e344d535ecb0376efc8890726d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e43bb8a33bdf3307795da4a4d99d691922794058217d4c4902cef80d1b94ed + +handshake=Noise_IN_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466883df2067301b17472bc62ad68cabba7bc80654d521b7a892865 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9ccb684459ec247c656f7a9c582a018aac429546bdee1199a1ed61ba49fc64 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=39614a2f4324d2407d903c372a779b30fd32fae1c5b6d69cdc0877cae101ff + +handshake=Noise_INpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471caa66028f64280a10cdb259a0f0ee1c59b656bb9366bd2a76f8e42a9bebed7305e7a3c409dd4ba92d3fc3f3f8d763c42a2e41e0634afc367f0dde3a61bd4a359193386bca6e46e72b1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663536123ea26b1bfcf393b8cca304c5aa1b4646aad82de257ebcf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=524b10cf461ef1f535017e250c8fe51471fb22093f7aef578485f282f7af0e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6d27cc209baae7deb036ff0c7c45a3c0c7b86d1949ff81570da6e319323c08 + +handshake=Noise_INpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ce4cd9b7ed42c5afaac1903aa6b83bf2665bf49b278784bed2a8d8ca87f3440ed8d78ab07ed6b569d0fc538be2a822014e124433912c24fe042705ce2c0d3705e137ee0734f70240170 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fd0bf78bd69757b645ad82bb4ce6c5bab13a549bfe52cdc2135 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9afced7a00a7d235716c18a3cd21737541e0ce919babee1b4106da009fd889 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=65783176595aba309742bfdf98f1c699ee18b65e091571ff41ef7f3e658b4d + +handshake=Noise_INpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549138f71daf8a8ccad5990ffd2d892da9fbcf2b41c95e11f1d48ed3ade358c32fcd3bed0595f69641adbfdd57ab1dc085de18b3b48a6276edf76ae73f5ad4478d00547bf6d0cf9f6a4121 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e3677d51882a717bfaf6fa3e9f062a27f45029aa7e50a76aa13 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=be487fd9db2f9d9dd8ecb6a2c071a8ebcf71e344d535ecb0376efc8890726d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e43bb8a33bdf3307795da4a4d99d691922794058217d4c4902cef80d1b94ed + +handshake=Noise_XK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254808088fc0cc85acaa69a883a6b10211a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466286fbb8efb3a91d14bf3df8a8558e549 +msg_2_payload= +msg_2_ciphertext=eb0b6ca5591599c72f921ad0ee2f37097eb0ff39f6d0b68a2db79458821fa52e94b656504f3b4b0b18ac3fb1621728400aff3211b974726a9a12b35dfc30d1fb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ee724c997ff942b0191c1e6f5dd0b63dd2dcdddbe740adc75cbe972e6e817f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1062ec47c7b6feeedcf8a18eca1349f029c9e101ce51063070050e22b42459 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549a21cfbb9f17fa94ba7f0772b63bfd04 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667497196f76f843d812307b6e089bd401 +msg_2_payload= +msg_2_ciphertext=917f0f36d76ff8028268bd926d6386e350b2f199ca77092c2426a264fb27e6de6720440ea0d07d2f6db823d03b00178e002b4eb9e68e18c6bf602ba2f95631ce +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ece23a617f504b3555121ff562b205ddc2f7f7bce45500f4c4754f3c13b37f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=523dc14e40b73b52c0383053ae49138119ed42714c9bb554f01090708218f5 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545fc5fd96bdd2ee25cbd02439e074689c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666e8ddad12bc56173163ea9ff4442e7d6 +msg_2_payload= +msg_2_ciphertext=da322a93e2ace2fb5424e6105985a4fb09cc20e95dea52a6871c20a5f0630e00b00d58799260c01562b7c62a16c5540facfad1e8a3876299cc921579b2525925 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3d0d4a2d2dc5e9718cf69433752c64f55741eb64656f0cadc04fd0c0e3dfb1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25107eb349768fddc230bcb47918d0dbef1e9dd0441a8b5fd47ee3db5be24 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546ebbf33e299ae9c4d3ecdadc5d8e81f1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466abbff32c51bb4b66b1ef2a158c4c9be1 +msg_2_payload= +msg_2_ciphertext=b0a26ddc196850030b2daea0618577de52cd4b1f96707c49a36c7eaf9bf1bc34f87fea270ff9864d9bd971fa4f5a703d5d0eb7bdb0335875617837d3b4c07c6a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6213b458869a66251d0fc561e406fe4053d82027e1178b7927f06911ec3a5c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3c70914788bc2c254e99114ae697f665d34346627857042c0594027ea4d0a6 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f1b593f13b4cd41cea65b28e468b0b3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466712b4787510ebbf87c665cb9e83ff555 +msg_2_payload= +msg_2_ciphertext=cb3ddcf291a8c6b1af42ad1562902f60b3e7e51aa0f6343391e32e745e1169e751ab42db60d7551e53009c4af681fce89c0305248e2b5de621e3d3540e18c992 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=88c083dea66b4e394e6eb1a2be53b312843d8ca646a33ccfbb3ed35b3daa53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6732c169f023972e0e83c494bdb771ab5ba60fe609610da42d8fd752cee3aa + +handshake=Noise_XK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254513029d2b4b8b9fe5f9f31b454bddd12afca1145e94ba04df016 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466952886df4d27c408e437cfe25cdf30274e59b83f527df211d907 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=eb0b6ca5591599c72f921ad0ee2f37097eb0ff39f6d0b68a2db79458821fa52e6ea3fc0ebc929c08541fa3d84ba852dec9476064b9a9203e8e3fe3834bc45201e24e6b1c19f0039bd0a3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ee724c997ff942b0191c1e6f5dd0b63dd2dcdddbe740adc75cbe972e6e817f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1062ec47c7b6feeedcf8a18eca1349f029c9e101ce51063070050e22b42459 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b59e69f28ee958ea6ec286d88a478df18c37c290409b2f305fc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846655be0dd1239ef6aacc00e2ce0033ef9570ae5b1cffdb3d9d3665 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=917f0f36d76ff8028268bd926d6386e350b2f199ca77092c2426a264fb27e6def31d422a36ba3e3b6347f914a24ebf9e92483ea0ae34710f38b31b7585040107da201115c7f61909ec55 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ece23a617f504b3555121ff562b205ddc2f7f7bce45500f4c4754f3c13b37f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=523dc14e40b73b52c0383053ae49138119ed42714c9bb554f01090708218f5 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625488a0b01ef66d73b2fb0a07321d83f1680059c05be6fc73edc288 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628eb3b4c42ce0e4b53d9eb540dbff9cff29fad9648742f88b0e1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=da322a93e2ace2fb5424e6105985a4fb09cc20e95dea52a6871c20a5f0630e000afa05043632f4e6947eb243c2f4cabe10ec74c7fc4899c810657c6bb56e2fecbe312e445a29caf8f322 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3d0d4a2d2dc5e9718cf69433752c64f55741eb64656f0cadc04fd0c0e3dfb1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25107eb349768fddc230bcb47918d0dbef1e9dd0441a8b5fd47ee3db5be24 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3c1632d409d0c434982a274e3c5fb542081635f8a21000e4c9d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf994581db893a145c65da8ae390d2ec36b8710553712ff8eec1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b0a26ddc196850030b2daea0618577de52cd4b1f96707c49a36c7eaf9bf1bc34b54b17adec69bae75235275b00362611dc862adcd710a1c7224b3f630b4b4c849e193738a6bdc24c4b5e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6213b458869a66251d0fc561e406fe4053d82027e1178b7927f06911ec3a5c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3c70914788bc2c254e99114ae697f665d34346627857042c0594027ea4d0a6 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254800450454355b9d11d4bdb67aaee48e1576aab47af4286a78e66 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0a4fd69aab20cdafe7c937b951e8590276356a5453e89e5da1d +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=cb3ddcf291a8c6b1af42ad1562902f60b3e7e51aa0f6343391e32e745e1169e78d6ae76bedbaa0e2ec33f27dd63397beba6045f20fae93dfb40afbbf27dc991c624bacb8d90acdf47b60 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=88c083dea66b4e394e6eb1a2be53b312843d8ca646a33ccfbb3ed35b3daa53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6732c169f023972e0e83c494bdb771ab5ba60fe609610da42d8fd752cee3aa + +handshake=Noise_XK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625412016aff62eaff30a75a5c0c2d0042a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa6d908607c010a4e27f592aa3e77db0 +msg_2_payload= +msg_2_ciphertext=eb0b6ca5591599c72f921ad0ee2f37097eb0ff39f6d0b68a2db79458821fa52e15a80d50e518ff27cdad772e19a43917bb69687b02856c53a828c04ed8ff57b4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ee724c997ff942b0191c1e6f5dd0b63dd2dcdddbe740adc75cbe972e6e817f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1062ec47c7b6feeedcf8a18eca1349f029c9e101ce51063070050e22b42459 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545024b4b7b169e3f9e56a785643af64db +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f8734d1674650e362c81c6c774638696 +msg_2_payload= +msg_2_ciphertext=917f0f36d76ff8028268bd926d6386e350b2f199ca77092c2426a264fb27e6de6d0830f27670e86e0517c7b7e3fefb0681306e548e88b9a1879970348fca1541 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ece23a617f504b3555121ff562b205ddc2f7f7bce45500f4c4754f3c13b37f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=523dc14e40b73b52c0383053ae49138119ed42714c9bb554f01090708218f5 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547667b794a46490293262417fee000006 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665ba9cdd7eab34372accb31399188da5b +msg_2_payload= +msg_2_ciphertext=da322a93e2ace2fb5424e6105985a4fb09cc20e95dea52a6871c20a5f0630e0042e34692374f7e53b893d8509eb32f7fd8b548fc1e3a5a90eebdb7ccf6bff0a5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3d0d4a2d2dc5e9718cf69433752c64f55741eb64656f0cadc04fd0c0e3dfb1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25107eb349768fddc230bcb47918d0dbef1e9dd0441a8b5fd47ee3db5be24 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544eca8fcfb3e6e255215ded2bcd48afbf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846603fddfe0f6ae65fa28cc181cd81faeee +msg_2_payload= +msg_2_ciphertext=b0a26ddc196850030b2daea0618577de52cd4b1f96707c49a36c7eaf9bf1bc34b1202b8bffd5ed08e5de027c5b84a7158fe52e8f576bb6882f758bacd60f3c83 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6213b458869a66251d0fc561e406fe4053d82027e1178b7927f06911ec3a5c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3c70914788bc2c254e99114ae697f665d34346627857042c0594027ea4d0a6 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625440285ac3362d63eb8ced07422fb6cf25 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846681421bc40d383c443bc45dd96b4ef485 +msg_2_payload= +msg_2_ciphertext=cb3ddcf291a8c6b1af42ad1562902f60b3e7e51aa0f6343391e32e745e1169e7ebdfbe67365243ee68f0efb0d5717e1b69daddf1284769341892aa3a4710b976 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=88c083dea66b4e394e6eb1a2be53b312843d8ca646a33ccfbb3ed35b3daa53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6732c169f023972e0e83c494bdb771ab5ba60fe609610da42d8fd752cee3aa + +handshake=Noise_XK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254513029d2b4b8b9fe5f9ff602b54bab72e3edd208f6f0abed927b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466952886df4d27c408e437397eab406b5d57694f8cae1bfa84a7dd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=eb0b6ca5591599c72f921ad0ee2f37097eb0ff39f6d0b68a2db79458821fa52e06b2be633d0635b9d56d487202e4204ac9476064b9a9203e8e3f70353e310a53186c458753fda9a9ea81 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ee724c997ff942b0191c1e6f5dd0b63dd2dcdddbe740adc75cbe972e6e817f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=1062ec47c7b6feeedcf8a18eca1349f029c9e101ce51063070050e22b42459 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b59e69f28ee958ea6ece01b095ca48313f07a8deb1640007c88 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846655be0dd1239ef6aacc00d4f1a20d1b426381eadad2ad8428dfe4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=917f0f36d76ff8028268bd926d6386e350b2f199ca77092c2426a264fb27e6de0d2bfdd01ecd6c54321b7e27497573ed92483ea0ae34710f38b335d4132f6bafcccfaf6c60009cba4ea3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ece23a617f504b3555121ff562b205ddc2f7f7bce45500f4c4754f3c13b37f +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=523dc14e40b73b52c0383053ae49138119ed42714c9bb554f01090708218f5 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625488a0b01ef66d73b2fb0a89359dbca1e95a546531ed9387f06e59 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846628eb3b4c42ce0e4b53d9622ca4eca51b9978eb0ae4617fe43b7b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=da322a93e2ace2fb5424e6105985a4fb09cc20e95dea52a6871c20a5f0630e00dd49f57036508780d776a79187d98f9d10ec74c7fc4899c8106536d6a7ec0636185ac76582c8fbef94a3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3d0d4a2d2dc5e9718cf69433752c64f55741eb64656f0cadc04fd0c0e3dfb1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f25107eb349768fddc230bcb47918d0dbef1e9dd0441a8b5fd47ee3db5be24 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3c1632d409d0c43498218e8e9e0d575ff260499ad54f0342435 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf994581db893a145c65a7c7d45d5a2b7d10e3ebaa4c84fef736 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b0a26ddc196850030b2daea0618577de52cd4b1f96707c49a36c7eaf9bf1bc3443eef8be3e6057a7169b08e1a0054fe2dc862adcd710a1c7224b58933c565f2d339fe7bb2b5d1e53d1cd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6213b458869a66251d0fc561e406fe4053d82027e1178b7927f06911ec3a5c +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3c70914788bc2c254e99114ae697f665d34346627857042c0594027ea4d0a6 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254800450454355b9d11d4b81a05f9e0cbfc6e5086837041b04d043 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0a4fd69aab20cdafe7cc5e114e8ebd132e1a2afca39d3c1729c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=cb3ddcf291a8c6b1af42ad1562902f60b3e7e51aa0f6343391e32e745e1169e76a3b6eadf256a4f2e5c0eff96d18d97aba6045f20fae93dfb40aa1374c50db5b917c4e6bab8c41f9b9ac +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=88c083dea66b4e394e6eb1a2be53b312843d8ca646a33ccfbb3ed35b3daa53 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6732c169f023972e0e83c494bdb771ab5ba60fe609610da42d8fd752cee3aa + +handshake=Noise_IK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e5f11977b6b44e9245c67330f3e51de6fc540b9b740f21673e7eb5dccadbfb1208a0530f27f8b630c81e3cf775e9d2b632ab3ac64125105a17a6a7173315506 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660cc75863504a0d3eef43e5ea39e1a698 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17185d8a376d58b3119840b99b784085186a622ba32b1ede9c99f2751509e9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db1d6ba1f8fad6b62e7d3f421a413389d609e5ec601b65e5bfa110c7f0c733 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba236852ef2b3162575105b0b33d4c6dd100842740d0c9be12622a57ee373e2cf63cca3e01b4a6ed0db101472ee9d420b0bbb911a0cc3bd5e7972ea44fecee8b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665322064e503c875ffec58103e63c3a86 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c01ee1d733b16ed26b81d16bcbdfefe0583f6bb7b917d205ea6590b6e34b1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbb884cb5c480ba6f73efa28c9c17633385e48355918a67989a5171e51e85b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458f289ffe3283f14bdf492ec8bdb979b13c98eb5d07a8f7eb9d121303d8d200f0a159e84f04aec162883d80f6ee185e80cdc9aa5d86d9bcc163cc0033b8d33e2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668c918bfc3507fd1385ab27e3a4dba0a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=64fd4d007240834917ec1660292c5605562acd3ce322544f477dd84c47aadc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49969eca3ef61dd7c049da3a2b2f4170475d452e81ee61cf637e5c2e17905d + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce891740b98a5f5c16f135436cb725e1fe702acd4c5a1d5cb4d2c528d4574b93b59172cabb2f8a6274486923c7d6693be2d801740a3b06edd5a0278816d3bfbd +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cc8e335580292058f46ced567b9ff86a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c53f53e2030e27fb57f8cda4c39ed1da26bf58966b52d7dc404876539062bd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f28b6a586437b0c6f7a3571b9267a65f6e3bab0fee53e71037355fa3a4008 + +handshake=Noise_IK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e5f11977b6b44e9245c67330f3e51de6fc540b9b740f21673e7eb5dccadbfb1208a0530f27f8b630c81e3cf775e9d2bb312954cec80357f078868c439a5fd9b464f38adf2f6e56a0f5a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b65172025a9545030cfab48a24e4de47e0f9574129c6458722cb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17185d8a376d58b3119840b99b784085186a622ba32b1ede9c99f2751509e9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db1d6ba1f8fad6b62e7d3f421a413389d609e5ec601b65e5bfa110c7f0c733 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba236852ef2b3162575105b0b33d4c6dd100842740d0c9be12622a57ee373e2cf63cca3e01b4a6ed0db101472ee9d420f3f538a30d6559cac7dd4a4f14a567547f6d6a98e2233bc08a3b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846690b49233385ad8dfcc23a7eaf53e993748e215d961aaa6aee8e6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c01ee1d733b16ed26b81d16bcbdfefe0583f6bb7b917d205ea6590b6e34b1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbb884cb5c480ba6f73efa28c9c17633385e48355918a67989a5171e51e85b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458f289ffe3283f14bdf492ec8bdb979b13c98eb5d07a8f7eb9d121303d8d200f0a159e84f04aec162883d80f6ee185e8cb7e0fa59d5f1b87833688fba8e81572e05bcc5347dc4754e004 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e7aec10cef4cebc40f678fd4b38db7f49b542d3ed6061e099ea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=64fd4d007240834917ec1660292c5605562acd3ce322544f477dd84c47aadc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49969eca3ef61dd7c049da3a2b2f4170475d452e81ee61cf637e5c2e17905d + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce891740b98a5f5c16f135436cb725e1fe702acd4c5a1d5cb4d2c528d4574b93b59172cabb2f8a6274486923c7d6693bee9fd1e8b3e88194ca3b46f2b2ed2549b5ca881c5ae0fcfa0b30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664065db2bb1884c3e44120d9374fa0fa4cc695182408697948940 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c53f53e2030e27fb57f8cda4c39ed1da26bf58966b52d7dc404876539062bd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f28b6a586437b0c6f7a3571b9267a65f6e3bab0fee53e71037355fa3a4008 + +handshake=Noise_IK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e5f11977b6b44e9245c67330f3e51de6fc540b9b740f21673e7eb5dccadbfb18620823a2dc5df3eef9552dbfa3eaef69c1c7e045b0905bce8961fb9dc3b9154 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846671319c9183c5b8207cbfd8af0063cdc7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17185d8a376d58b3119840b99b784085186a622ba32b1ede9c99f2751509e9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db1d6ba1f8fad6b62e7d3f421a413389d609e5ec601b65e5bfa110c7f0c733 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba236852ef2b3162575105b0b33d4c6dd100842740d0c9be12622a57ee373e2c9090737e80f23255017e7412f0e35b41d3bb273dcb080bb680e05542b200ddf0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668ea7124d61b15a2af4db1649c7f5c67f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c01ee1d733b16ed26b81d16bcbdfefe0583f6bb7b917d205ea6590b6e34b1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbb884cb5c480ba6f73efa28c9c17633385e48355918a67989a5171e51e85b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458f289ffe3283f14bdf492ec8bdb979b13c98eb5d07a8f7eb9d121303d8d200f16acadcde5e3e159322f07d637fb82466ffffcee8c135ff2d3468091ad1ac965 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660a9c9ba7901c8cc2095933f61539ebaf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=64fd4d007240834917ec1660292c5605562acd3ce322544f477dd84c47aadc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49969eca3ef61dd7c049da3a2b2f4170475d452e81ee61cf637e5c2e17905d + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce891740b98a5f5c16f135436cb725e1fe702acd4c5a1d5cb4d2c528d4574b9335f9e93f8bc1c9fe0bf9e671e91604472252ac533a0b7673a69e050fc6c555f9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846625ce0bc015e15cc05f95114e8615e107 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c53f53e2030e27fb57f8cda4c39ed1da26bf58966b52d7dc404876539062bd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f28b6a586437b0c6f7a3571b9267a65f6e3bab0fee53e71037355fa3a4008 + +handshake=Noise_IK_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549e5f11977b6b44e9245c67330f3e51de6fc540b9b740f21673e7eb5dccadbfb18620823a2dc5df3eef9552dbfa3eaef6b312954cec80357f07882a687c02e62bd6e56c8fe017f2463049 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b65172025a9545030cfaaa2d22caa6cc27ccf97a1e6b683f6b7c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=17185d8a376d58b3119840b99b784085186a622ba32b1ede9c99f2751509e9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=db1d6ba1f8fad6b62e7d3f421a413389d609e5ec601b65e5bfa110c7f0c733 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ba236852ef2b3162575105b0b33d4c6dd100842740d0c9be12622a57ee373e2c9090737e80f23255017e7412f0e35b41f3f538a30d6559cac7dd68f4009e9b60995b9c26ef2ad7b301d1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846690b49233385ad8dfcc23ec9268f5fbc7595e89a031ce59fa882f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c01ee1d733b16ed26b81d16bcbdfefe0583f6bb7b917d205ea6590b6e34b1c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cbb884cb5c480ba6f73efa28c9c17633385e48355918a67989a5171e51e85b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625458f289ffe3283f14bdf492ec8bdb979b13c98eb5d07a8f7eb9d121303d8d200f16acadcde5e3e159322f07d637fb8246cb7e0fa59d5f1b8783366849fcc7d25b2490e6ea2b7cce88d13e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662e7aec10cef4cebc40f61a8390b590d6bb5e55e5aa8f45bda184 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=64fd4d007240834917ec1660292c5605562acd3ce322544f477dd84c47aadc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=49969eca3ef61dd7c049da3a2b2f4170475d452e81ee61cf637e5c2e17905d + +handshake=Noise_IKpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce891740b98a5f5c16f135436cb725e1fe702acd4c5a1d5cb4d2c528d4574b9335f9e93f8bc1c9fe0bf9e671e9160447ee9fd1e8b3e88194ca3b7dd0c0f15d5ba12f1280b747e9755206 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664065db2bb1884c3e44120e547598980a2e5918807a5273b89cd7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c53f53e2030e27fb57f8cda4c39ed1da26bf58966b52d7dc404876539062bd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f28b6a586437b0c6f7a3571b9267a65f6e3bab0fee53e71037355fa3a4008 + +handshake=Noise_XX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e5b8dda95b4ec55e42c2cbded11735474b3612a895298bcb02e8469353fe827273e4a7aadfc1aa32578b46bce2006fe1482f062e2f27e43ad23e67a304c030 +msg_2_payload= +msg_2_ciphertext=ac3087e2342498dfa6606faf700dc5782b9612bdbc8bbb67a87181baac2d693d2f8df70600534bcbd389bbbf733550ae3e7e9a78f80aafa70d6211640223800d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2dcb8503b438910b2a2ffcf242ef705e6cce2d25bd30444402427981ee2064 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=56d2ce5c1e7e28b7406b99aff512114313b811e17c0af6497baa906165ba31 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f2f462471c5d60ba0088de4eff15e53c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466be325d2fad8902f6af1f3b2b5acc9eab588b638e7e6c2e488d433d28690843f2d911861dc176203f80dba4198ac1786a916a77181cb8c24178d9ec84f88f5d4e +msg_2_payload= +msg_2_ciphertext=1e65fa56a639797ffe77d0d2951c4e2b3ec3ff11878bc08d9d1907247b9b01ab58a8c21ea7a521466a81d82e0fc7b5a624bcbc25fd46682f7588ed21c5edb914 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d38f1c0a508dd95e6a8a567c8931a8637bad28b91d9564bd9c8fa23deaa220 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=895cf67ef6bc4e9116cff01e1891ecfc3413847ff1aa6c81ff9caf5d917a7b + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d54b25e517e5d9d9d1443c747c2b31d5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666dfab3251da0797a6fde63e3bfeca2f0f74fa7162dd3825426965c0f2a0fc90a5657879f6810cfc3709e05e9153b2ae7fdfe94a9d8b2da4c04e0500e8ea8b94a +msg_2_payload= +msg_2_ciphertext=4a7ae3d865ae62214d81c67bc6134402ddb479fabf4bbd95f70dcd744d48e91d8a9ab3aeff5a6a45eeb8476ece42c0e3c1023fb1af8e1670fba5eb5dbc1fb648 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d3ec65abb14824f326728eef1a0d957839c2a31fcf8f6a8444c3ad12e92565 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4bc899aa61919f501f103187883abc24ba96d80bb9152d4b04fd09763384f8 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625440589b2466ae4b8ae6b6656661608de6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ea4d8909862193d7f28ce230e8f8fdd52e2c7c32b59cc81b8c8b869025e7645ba40ad8ca10cfa1e971c4da023e7343d02a8c1c65b1d68eefae2f4714fc10f7b +msg_2_payload= +msg_2_ciphertext=e37f84e33bdb15ba63178cff0ea5946e4aa4f71e86ea0b3dd8e885baa63ead5591d0e50d96ad81a539e2ee63a5dec7710cc7e4dab085c993c022b961e3b500ce +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=337c476f38adead5eec91eb6e27edbedd33f5cf702e885c67b25e06fed6475 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f7f94c1464b63d63b099af6faec4a3bbbf861b5bd04314135a5bb666d2e57a + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a399eeb57fa150bf0903a5144931cfed +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466af613726ed79ba171d0ba959f0bafc5949f8e4279fa836af1dac74632da07426cfde6cd9c24984229cef63503e25d9720f21fcd6aeca15edc259b59d5dbde2be +msg_2_payload= +msg_2_ciphertext=435c3d4404fb904058992c956972c09b477b3d5465f8dfaf487205d7c8024e7a7fc6bb767df7acc8c6b2150a1a07c368f2dc33bea0ceb8c05fd775f32d85a0a5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ea30f606b3b7b47433ec08e91298daef7df94faae71de0c396f7a3b194ed78 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f2d28fa9662bd3bc6486d0e2fc2376eca51a747e66357baedf1e36d3b9b804 + +handshake=Noise_XX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e5b8dda95b4ec55e42c2cbded11735474b3612a895298bcb02e8469353fe8268dd0a1354f3b23c3da9b4f11e91e2f8d221c75462cbc2798cc0fa8e4cfe53cd1edc4717ec17d20245fd +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=ac3087e2342498dfa6606faf700dc5782b9612bdbc8bbb67a87181baac2d693d629aba6b7f84dd26889cc9605e02f2cb5a36853cf1f1ced5ddda5564922cc4ba1e5d7286a0b9794ef6f5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2dcb8503b438910b2a2ffcf242ef705e6cce2d25bd30444402427981ee2064 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=56d2ce5c1e7e28b7406b99aff512114313b811e17c0af6497baa906165ba31 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254866d809eebe6c3d84a3f1d85990e9a886d6b0aca260582337b30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466be325d2fad8902f6af1f3b2b5acc9eab588b638e7e6c2e488d433d28690843f28a0cc0e544065513f76cdf148c3e1b87938775bd82c3a86e2267643e455d0cd71cc1053717bcab764e28 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1e65fa56a639797ffe77d0d2951c4e2b3ec3ff11878bc08d9d1907247b9b01ab5c812d0fa094b7e823d8ad0c260f119d1350ee3e4725f68b581b3f2a51751ac34b9b9a8b8f6a7f811aab +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d38f1c0a508dd95e6a8a567c8931a8637bad28b91d9564bd9c8fa23deaa220 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=895cf67ef6bc4e9116cff01e1891ecfc3413847ff1aa6c81ff9caf5d917a7b + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254542b41136533a8304a77a255707e1a2d8a823ed6c045fee9e548 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666dfab3251da0797a6fde63e3bfeca2f0f74fa7162dd3825426965c0f2a0fc90ab99e5b81af6b8c0a448f4d1c2d79369223cac5251a120ab78a722e8f74107f28c718b5af7e4523d15d01 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4a7ae3d865ae62214d81c67bc6134402ddb479fabf4bbd95f70dcd744d48e91df4b7bbf5ef4c57a0b340788a746ab69d32f2011af09a5b12c1466af4789c7b7b084f8a56786af64de04d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d3ec65abb14824f326728eef1a0d957839c2a31fcf8f6a8444c3ad12e92565 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4bc899aa61919f501f103187883abc24ba96d80bb9152d4b04fd09763384f8 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da6c52ee1b045a9cfeb401e860c6f8dad9c4750c4a15b09958ef +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ea4d8909862193d7f28ce230e8f8fdd52e2c7c32b59cc81b8c8b869025e76457e2e64fcc610a96b70b4ef648b07d4437992e6627c6b6b97687f6315ae3f979f0b6ad6c4e8ce8ece2787 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e37f84e33bdb15ba63178cff0ea5946e4aa4f71e86ea0b3dd8e885baa63ead559885db6405390f86a481ce9e6793d889cf8779569d616597b16fb3efef2f3436535accde8af36f5cf983 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=337c476f38adead5eec91eb6e27edbedd33f5cf702e885c67b25e06fed6475 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f7f94c1464b63d63b099af6faec4a3bbbf861b5bd04314135a5bb666d2e57a + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cd5279aefbfc171ce82b4ca5c1044ed8a6734a0de58708aa79b6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466af613726ed79ba171d0ba959f0bafc5949f8e4279fa836af1dac74632da07426611a76229186c4cb7020d89b58290d9d5b5bc0b66a4c643d9ecf43a5bfe4bf1052483c506b154561e9c2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=435c3d4404fb904058992c956972c09b477b3d5465f8dfaf487205d7c8024e7a8e896e684314ab8e896610a945dedb8366ac8fc47095844e8da0305964ea0cc5b74114a419fa1facd127 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ea30f606b3b7b47433ec08e91298daef7df94faae71de0c396f7a3b194ed78 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f2d28fa9662bd3bc6486d0e2fc2376eca51a747e66357baedf1e36d3b9b804 + +handshake=Noise_XX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e5b8dda95b4ec55e42c2cbded11735474b3612a895298bcb02e8469353fe823d2f9b86e9a08534663b376f8eba4ce7bb56a4e82647d6c17a846c7ea69f9c70 +msg_2_payload= +msg_2_ciphertext=ac3087e2342498dfa6606faf700dc5782b9612bdbc8bbb67a87181baac2d693d73dccbe0d8c4858d1508ebdcb753a5e60f5622374a46e41efb00eba64f71113f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2dcb8503b438910b2a2ffcf242ef705e6cce2d25bd30444402427981ee2064 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=56d2ce5c1e7e28b7406b99aff512114313b811e17c0af6497baa906165ba31 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254afe230e0e90c70cbc586925eab0f8afa +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466be325d2fad8902f6af1f3b2b5acc9eab588b638e7e6c2e488d433d28690843f2318f800a32467ae4ab2051e240291a1bd6993f00169a8ea675e5bb5cba5a139d +msg_2_payload= +msg_2_ciphertext=1e65fa56a639797ffe77d0d2951c4e2b3ec3ff11878bc08d9d1907247b9b01ab03f64171d19600f941ad6056814141f00c5b5d6d041e3474254413ee1bfd117f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d38f1c0a508dd95e6a8a567c8931a8637bad28b91d9564bd9c8fa23deaa220 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=895cf67ef6bc4e9116cff01e1891ecfc3413847ff1aa6c81ff9caf5d917a7b + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625435f58b36487f42de4284c58ba543921c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666dfab3251da0797a6fde63e3bfeca2f0f74fa7162dd3825426965c0f2a0fc90aab54d72f4e993321086d6f6159502b24510534eaf9fa26e099f93814480a7c00 +msg_2_payload= +msg_2_ciphertext=4a7ae3d865ae62214d81c67bc6134402ddb479fabf4bbd95f70dcd744d48e91dc2f7c8ba426fc407af6fcbdbefc136f348937198e636b5dfbabbdfbb9e2bcc4a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d3ec65abb14824f326728eef1a0d957839c2a31fcf8f6a8444c3ad12e92565 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4bc899aa61919f501f103187883abc24ba96d80bb9152d4b04fd09763384f8 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625420e4dc62070a9aebab2b6572e2ae4b98 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ea4d8909862193d7f28ce230e8f8fdd52e2c7c32b59cc81b8c8b869025e7645ee5f681862f0dec10f9dc8d8e96c07b155da7f7b101977ae1d19f12b407a34fb +msg_2_payload= +msg_2_ciphertext=e37f84e33bdb15ba63178cff0ea5946e4aa4f71e86ea0b3dd8e885baa63ead55940ca69900d62a3186db3105276b15f56ef7fd1c850ac561e7363a523d92ed6e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=337c476f38adead5eec91eb6e27edbedd33f5cf702e885c67b25e06fed6475 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f7f94c1464b63d63b099af6faec4a3bbbf861b5bd04314135a5bb666d2e57a + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b7a040ac300959fe34bfe71e0d24f6a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466af613726ed79ba171d0ba959f0bafc5949f8e4279fa836af1dac74632da07426888d44c76f124e6bb39acc5176271a3e6319e1de8c126261dc7185d14cab1c5e +msg_2_payload= +msg_2_ciphertext=435c3d4404fb904058992c956972c09b477b3d5465f8dfaf487205d7c8024e7a91ab16e67d24b1fdef4dff4b9bf6c76fe01aa2da79da940839db82cf0c8dd98b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ea30f606b3b7b47433ec08e91298daef7df94faae71de0c396f7a3b194ed78 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f2d28fa9662bd3bc6486d0e2fc2376eca51a747e66357baedf1e36d3b9b804 + +handshake=Noise_XX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e5b8dda95b4ec55e42c2cbded11735474b3612a895298bcb02e8469353fe82b4cd9a14f8ead39d89dfbc1caa392541d221c75462cbc2798cc052f73a84342b5476620ae41849b8965c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=ac3087e2342498dfa6606faf700dc5782b9612bdbc8bbb67a87181baac2d693d79ea79b6110288f4e89aae84921c40605a36853cf1f1ced5ddda854ea5ce29deb956bd1c54de796b357f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=2dcb8503b438910b2a2ffcf242ef705e6cce2d25bd30444402427981ee2064 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=56d2ce5c1e7e28b7406b99aff512114313b811e17c0af6497baa906165ba31 + +handshake=Noise_XXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254866d809eebe6c3d84a3ff5b7f9842209a6bb025a5804dc0de2bb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466be325d2fad8902f6af1f3b2b5acc9eab588b638e7e6c2e488d433d28690843f206009fabe86c879f8d9e2738ee4ed4d2938775bd82c3a86e2267c5764cd7abd871e6263afcc404a5e0a1 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1e65fa56a639797ffe77d0d2951c4e2b3ec3ff11878bc08d9d1907247b9b01ab46af6720d3d054872b900594d8b526601350ee3e4725f68b581b62bcc4a3a13247dcbceb4e8a9650d90c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d38f1c0a508dd95e6a8a567c8931a8637bad28b91d9564bd9c8fa23deaa220 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=895cf67ef6bc4e9116cff01e1891ecfc3413847ff1aa6c81ff9caf5d917a7b + +handshake=Noise_XXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254542b41136533a8304a77b81b6dfdf040484761f3ccafe691e75d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666dfab3251da0797a6fde63e3bfeca2f0f74fa7162dd3825426965c0f2a0fc90a5dec9479f1ad2799fbd27fdb7fdc056523cac5251a120ab78a72461a4e9de89b862c7414fa11fd5bb881 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4a7ae3d865ae62214d81c67bc6134402ddb479fabf4bbd95f70dcd744d48e91d0583c25739292883c9333532c4da5f3032f2011af09a5b12c1468e7b1eab09321a31a1d2ff6796ac80d3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=d3ec65abb14824f326728eef1a0d957839c2a31fcf8f6a8444c3ad12e92565 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4bc899aa61919f501f103187883abc24ba96d80bb9152d4b04fd09763384f8 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da6c52ee1b045a9cfeb44ece894131cd8d2fb1213bbeca79f626 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663ea4d8909862193d7f28ce230e8f8fdd52e2c7c32b59cc81b8c8b869025e764501a2be4cd48b63a3c74802e86d9b8bd37992e6627c6b6b97687f53a407d8b6afdd43d633c2daebaafc14 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e37f84e33bdb15ba63178cff0ea5946e4aa4f71e86ea0b3dd8e885baa63ead5575db230303120a1dde9a88d5cbd4ff98cf8779569d616597b16f4a9f5ef1dd4f26463290e83402284a14 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=337c476f38adead5eec91eb6e27edbedd33f5cf702e885c67b25e06fed6475 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f7f94c1464b63d63b099af6faec4a3bbbf861b5bd04314135a5bb666d2e57a + +handshake=Noise_XXpsk3_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cd5279aefbfc171ce82b89a9045aed50568afa724bb8f9c0a540 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466af613726ed79ba171d0ba959f0bafc5949f8e4279fa836af1dac74632da07426822f55cfb4baec5d5626d45e9dec6fa85b5bc0b66a4c643d9ecfa433cca204d22000ae309809dbcd2507 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=435c3d4404fb904058992c956972c09b477b3d5465f8dfaf487205d7c8024e7ad29ffdd53f3a0921483a26ab29377e2e66ac8fc47095844e8da0f4e9b114d0ba5db5685ab45d76a7e03c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ea30f606b3b7b47433ec08e91298daef7df94faae71de0c396f7a3b194ed78 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=f2d28fa9662bd3bc6486d0e2fc2376eca51a747e66357baedf1e36d3b9b804 + +handshake=Noise_IX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466695d6599121fe2a7334d2c97732a3ffadbcfd7e6bdb2544697bb5f00916ee3fc5705ded2ea5e74dc4cccd271b3b170c018ece669ee8eb50c1183697979a87056 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=26615f8c05cfc06ba45d92c919ac3646b75c5b98ccc6bf7be435f660303233 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=246f084e1984bada028bdd5706659a090073f4e900983ae7f43938081d0e6c + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f23d888fc466096221d018369dbfd469e8982fe06d5f5403cf73cbae43506d4c019dc3f0ddbe6a8e4cedc9663bbc0666e2e8003f39416bd73417eeacb429f0d3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666dbaa36ddf907742a80f1551f8b7d380adbf8039ff57bf43ffe5f1c2315caca03d159b9f20ec197dade265afb859e24ed346fbf36ad4ac6f225c06a83bb5f7b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ba368d3ceaeb7b4ddea9fa0ec3f6af47bce36ec342a0be54a2bd08e7b57a31 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=003d182934bbbfb5ba808d6e335bf7d155504ae7a7d5f5288d2af34bb05e08 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254730f4c1d260b464346081cd7e638a961153cb165f87bd25c9b26c250e5bb880805b009cde612246770287ee104db35f1ec3dbb8330fb8854782bc70cf926c466 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466129a73114e12a289af04ec9af3e8a49cfc343ba36ce522267a3eedb9971791a6e3a11e74aec9f653fe66e3498ec3f0ba924cdd5b28c0b701b834909dfc1b440d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96efc6df0548c32e43ca4c59eeb2559626095079ecb0ba2be9c8fd6628d844 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f9e72631a890074a8b30f623968e914862330f34ec4e2aa36f6f7b987a3d6 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254336c06ececc68c95a721a5e1108b1d2c29397707cbf738e7a8849fd2ff08d62951cd48325d28bb67c3280fca55c91275b3ef8f17b7ca1768f171c2071903c43f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846691aaca91f9159a9bd67aa886e00a54088edc28c8d38e3a34870cc34fb1305b2a13bd55a7a8052b97ab1bc4ccdcabba822d611d461660deabf4584d1747a222d3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=44f1bd491d21b3e3fe06273ce11e6530122d7314ec4fa74994ee55481f5133 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf9875d0094449a70e60dd5577ed61d03ae2e86b775aca74bf2723ea6b969c + +handshake=Noise_IX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466695d6599121fe2a7334d2c97732a3ffadbcfd7e6bdb2544697bb5f00916ee3fce9879d0ed150af9f2be81aa51c039e9e7b5773f45de6318af93f86d0dc96b99df12aaa638be5a625ff49 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=26615f8c05cfc06ba45d92c919ac3646b75c5b98ccc6bf7be435f660303233 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=246f084e1984bada028bdd5706659a090073f4e900983ae7f43938081d0e6c + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f23d888fc466096221d018369dbfd469e8982fe06d5f5403cf73cbae43506d4c019dc3f0ddbe6a8e4cedc9663bbc06667559f6ca4f3be7e578e55edf0c66945d61065236620e451730ff +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666dbaa36ddf907742a80f1551f8b7d380adbf8039ff57bf43ffe5f1c2315caca5703a32de32a3a7099780894de955a6bf797d76ea657debdad89256c8b7f7c131759900ed8fd0c936cfc +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ba368d3ceaeb7b4ddea9fa0ec3f6af47bce36ec342a0be54a2bd08e7b57a31 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=003d182934bbbfb5ba808d6e335bf7d155504ae7a7d5f5288d2af34bb05e08 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254730f4c1d260b464346081cd7e638a961153cb165f87bd25c9b26c250e5bb880805b009cde612246770287ee104db35f1431211b554223603a05e313043e051745116e15077094aecb596 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466129a73114e12a289af04ec9af3e8a49cfc343ba36ce522267a3eedb9971791a6611fbcdf30357d8d3157a9926c75108d9f704ccf6c61778c12e3a158605089315ee6d9e1a254a26bb385 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96efc6df0548c32e43ca4c59eeb2559626095079ecb0ba2be9c8fd6628d844 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f9e72631a890074a8b30f623968e914862330f34ec4e2aa36f6f7b987a3d6 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254336c06ececc68c95a721a5e1108b1d2c29397707cbf738e7a8849fd2ff08d62951cd48325d28bb67c3280fca55c91275c719b81dc74cf8887220c7858051cacaba08461b443c9f1feafb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846691aaca91f9159a9bd67aa886e00a54088edc28c8d38e3a34870cc34fb1305b2a98c853dfa8e2b13ca3b2dc061fac3c4ca42326a5f8d40c491c9882c14928b0297a6fbd17ed86e3f78aeb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=44f1bd491d21b3e3fe06273ce11e6530122d7314ec4fa74994ee55481f5133 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf9875d0094449a70e60dd5577ed61d03ae2e86b775aca74bf2723ea6b969c + +handshake=Noise_IX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466695d6599121fe2a7334d2c97732a3ffadbcfd7e6bdb2544697bb5f00916ee3fc981a97e21a035372344bf5ebc58d4530952e0f70491280e937fb043e18e01fb8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=26615f8c05cfc06ba45d92c919ac3646b75c5b98ccc6bf7be435f660303233 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=246f084e1984bada028bdd5706659a090073f4e900983ae7f43938081d0e6c + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f23d888fc466096221d018369dbfd469e8982fe06d5f5403cf73cbae43506d4cb086b2a59e2bb0559d03edd7967de46e777870db5fccba82efee379f4f94d817 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666dbaa36ddf907742a80f1551f8b7d380adbf8039ff57bf43ffe5f1c2315cacaa000b86e59b363dacc8df47185202e71703a31598ae5f209900b544b0987af1b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ba368d3ceaeb7b4ddea9fa0ec3f6af47bce36ec342a0be54a2bd08e7b57a31 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=003d182934bbbfb5ba808d6e335bf7d155504ae7a7d5f5288d2af34bb05e08 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254730f4c1d260b464346081cd7e638a961153cb165f87bd25c9b26c250e5bb8808adf190271445d27f405095fbc3ca27432bdcd0313238417d7c0ce916683bfc8b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466129a73114e12a289af04ec9af3e8a49cfc343ba36ce522267a3eedb9971791a64831f0ac2613dc6820e61293eb7baff3ff9eba1ad801121c6ba483dc43bda464 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96efc6df0548c32e43ca4c59eeb2559626095079ecb0ba2be9c8fd6628d844 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f9e72631a890074a8b30f623968e914862330f34ec4e2aa36f6f7b987a3d6 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254336c06ececc68c95a721a5e1108b1d2c29397707cbf738e7a8849fd2ff08d6298b3f30233695772355e7b3ade8dbffbf41c5cc96f06413594b6659405f516a29 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846691aaca91f9159a9bd67aa886e00a54088edc28c8d38e3a34870cc34fb1305b2a1e81847f6b95142f0026a5496a0cb373b7224ba5692bc0abfa9eec46109c87a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=44f1bd491d21b3e3fe06273ce11e6530122d7314ec4fa74994ee55481f5133 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf9875d0094449a70e60dd5577ed61d03ae2e86b775aca74bf2723ea6b969c + +handshake=Noise_IX_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466695d6599121fe2a7334d2c97732a3ffadbcfd7e6bdb2544697bb5f00916ee3fcda75b86dcdcf6cc8b4e52dd9265dc2aa7b5773f45de6318af93ff0f4c52d30c8278d3298434c05beadb4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=26615f8c05cfc06ba45d92c919ac3646b75c5b98ccc6bf7be435f660303233 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=246f084e1984bada028bdd5706659a090073f4e900983ae7f43938081d0e6c + +handshake=Noise_IXpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f23d888fc466096221d018369dbfd469e8982fe06d5f5403cf73cbae43506d4cb086b2a59e2bb0559d03edd7967de46e7559f6ca4f3be7e578e57882e381692562156135cf8c334308f6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666dbaa36ddf907742a80f1551f8b7d380adbf8039ff57bf43ffe5f1c2315caca12ad93e06bd127bda9ad1020b877118ef797d76ea657debdad897fcbc0953710f13696878e2c1a2869a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ba368d3ceaeb7b4ddea9fa0ec3f6af47bce36ec342a0be54a2bd08e7b57a31 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=003d182934bbbfb5ba808d6e335bf7d155504ae7a7d5f5288d2af34bb05e08 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254730f4c1d260b464346081cd7e638a961153cb165f87bd25c9b26c250e5bb8808adf190271445d27f405095fbc3ca2743431211b554223603a05ef4b04acb4fe69dc9d150400ad9c28cfc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466129a73114e12a289af04ec9af3e8a49cfc343ba36ce522267a3eedb9971791a621701ef5f70366820249aa58206ec5179f704ccf6c61778c12e34b86cd99e8c7f6ec4cd08217427f2b2b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=96efc6df0548c32e43ca4c59eeb2559626095079ecb0ba2be9c8fd6628d844 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6f9e72631a890074a8b30f623968e914862330f34ec4e2aa36f6f7b987a3d6 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254336c06ececc68c95a721a5e1108b1d2c29397707cbf738e7a8849fd2ff08d6298b3f30233695772355e7b3ade8dbffbfc719b81dc74cf888722001f7c5dba307a6158a32b4636f5810dc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846691aaca91f9159a9bd67aa886e00a54088edc28c8d38e3a34870cc34fb1305b2a0e75e6be1bec100d6573dcea97d99441a42326a5f8d40c491c9835c2d1f6e87f227b143834e678763257 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=44f1bd491d21b3e3fe06273ce11e6530122d7314ec4fa74994ee55481f5133 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=bf9875d0094449a70e60dd5577ed61d03ae2e86b775aca74bf2723ea6b969c + +handshake=Noise_N_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625481e3638895f74c7f2fb79478a8b1ef0b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=94858a8929ec3029eee24ac3b9430a0ad960324b465ebf1e4a4e5b42d5578d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d950d3e8b3b1c1e92f0672fa29e408ff3051ceb7ab03a61419559a6772f08 + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625464629b177388333c8d175896ab297935 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=33da6aeec7478a08f7878c62fd7fcc88165cf1bf47953546ac1b64fb183258 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3376b3ceedfdeaf78df87cfaeabbe7a3b4cb1ffb9ee72b05a36aaa4fea99ee + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625450b0f423d7d637d7a460b86a48cc487b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e33fa900c0dcebe93bce0408696d13866c780766f0c670a3932b0d05c1c69b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c06aac8a526a8b995fafc59f9ffe856c8316d9fd97db9ba322bd4dbc940158 + +handshake=Noise_N_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548d5c068cc55c86ec3234b490d40afc4cf4d6263378881c946d7f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=94858a8929ec3029eee24ac3b9430a0ad960324b465ebf1e4a4e5b42d5578d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d950d3e8b3b1c1e92f0672fa29e408ff3051ceb7ab03a61419559a6772f08 + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f8dbb976f32d75fe4f1fdd32667b33832835533005266a53712b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=33da6aeec7478a08f7878c62fd7fcc88165cf1bf47953546ac1b64fb183258 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3376b3ceedfdeaf78df87cfaeabbe7a3b4cb1ffb9ee72b05a36aaa4fea99ee + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254354f2847f89991ee82660859ba99e38c0b65beffa762a956db43 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e33fa900c0dcebe93bce0408696d13866c780766f0c670a3932b0d05c1c69b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c06aac8a526a8b995fafc59f9ffe856c8316d9fd97db9ba322bd4dbc940158 + +handshake=Noise_N_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dc989d32c66a940d8f3bb092ec1cc39b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=94858a8929ec3029eee24ac3b9430a0ad960324b465ebf1e4a4e5b42d5578d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d950d3e8b3b1c1e92f0672fa29e408ff3051ceb7ab03a61419559a6772f08 + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254adb2ef9e38153b82ab826cf2c293d2e2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=33da6aeec7478a08f7878c62fd7fcc88165cf1bf47953546ac1b64fb183258 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3376b3ceedfdeaf78df87cfaeabbe7a3b4cb1ffb9ee72b05a36aaa4fea99ee + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d8a9ac9ddfea0fd3f61053e5cce9c468 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e33fa900c0dcebe93bce0408696d13866c780766f0c670a3932b0d05c1c69b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c06aac8a526a8b995fafc59f9ffe856c8316d9fd97db9ba322bd4dbc940158 + +handshake=Noise_N_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548d5c068cc55c86ec32343e3869720328a5659aa70ee82a7e2153 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=94858a8929ec3029eee24ac3b9430a0ad960324b465ebf1e4a4e5b42d5578d +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d950d3e8b3b1c1e92f0672fa29e408ff3051ceb7ab03a61419559a6772f08 + +handshake=Noise_Npsk0_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f8dbb976f32d75fe4f1fcbe700b9013b07745aafab8bf4e2fa7b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=33da6aeec7478a08f7878c62fd7fcc88165cf1bf47953546ac1b64fb183258 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3376b3ceedfdeaf78df87cfaeabbe7a3b4cb1ffb9ee72b05a36aaa4fea99ee + +handshake=Noise_Npsk1_25519_ChaChaPoly_SHA512 +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254354f2847f89991ee82666c5a1d2c330638acc769bec02338bfb4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e33fa900c0dcebe93bce0408696d13866c780766f0c670a3932b0d05c1c69b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=c06aac8a526a8b995fafc59f9ffe856c8316d9fd97db9ba322bd4dbc940158 + +handshake=Noise_K_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6c00a2c6c7b4e047404cd845438f31d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8f37d99ddd83fcfad851544fadbbd9f83a21cb504f79a040f0db0ef406a2cb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8b69be08bbd320ce82a65b1ac6013f3aada9a0e64e53b0f9de55a83e0fd4e2 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b743993c03a39ed2078fe83cacb0005 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5df379aa748528b394de3a483c10bfa9b2fd420d2d5a7247be18b9b71b1741 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=73a0c4086f45b89ac5ac48564363e3cce8449b2d2c7cf71adadb6258119771 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254af5df3705094e65fd6345071bdb48771 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c63f46ef1a4531b36b6d9d933fc6d97a929ba3fce60a9523228c4df6745d30 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=daa224045edb5559f94be878b2de124313b1e157fa49295925143dca42782b + +handshake=Noise_K_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f0499b194617954a3a80fecc4b0b687b2dcfaca93c170ec8133 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8f37d99ddd83fcfad851544fadbbd9f83a21cb504f79a040f0db0ef406a2cb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8b69be08bbd320ce82a65b1ac6013f3aada9a0e64e53b0f9de55a83e0fd4e2 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549832db195cc1e003857c7f520d021430e9ae20a35b9e906b8f7e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5df379aa748528b394de3a483c10bfa9b2fd420d2d5a7247be18b9b71b1741 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=73a0c4086f45b89ac5ac48564363e3cce8449b2d2c7cf71adadb6258119771 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549ad2b6a5f66290516660e12f3f66ba36a904982d33fe8ed8f15e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c63f46ef1a4531b36b6d9d933fc6d97a929ba3fce60a9523228c4df6745d30 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=daa224045edb5559f94be878b2de124313b1e157fa49295925143dca42782b + +handshake=Noise_K_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fef72b48f3aac25836d9eb5b379c8a5b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8f37d99ddd83fcfad851544fadbbd9f83a21cb504f79a040f0db0ef406a2cb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8b69be08bbd320ce82a65b1ac6013f3aada9a0e64e53b0f9de55a83e0fd4e2 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548ae6fc65d6fc0d280734065c183cc02b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5df379aa748528b394de3a483c10bfa9b2fd420d2d5a7247be18b9b71b1741 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=73a0c4086f45b89ac5ac48564363e3cce8449b2d2c7cf71adadb6258119771 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f13e539dc67cfd7c8bed15eb755b3e70 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c63f46ef1a4531b36b6d9d933fc6d97a929ba3fce60a9523228c4df6745d30 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=daa224045edb5559f94be878b2de124313b1e157fa49295925143dca42782b + +handshake=Noise_K_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f0499b194617954a3a8ba6d2ccb66ba883621b78eb1ccb78060 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=8f37d99ddd83fcfad851544fadbbd9f83a21cb504f79a040f0db0ef406a2cb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8b69be08bbd320ce82a65b1ac6013f3aada9a0e64e53b0f9de55a83e0fd4e2 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549832db195cc1e003857cf56e834a296df1104de185a7b9129a7e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5df379aa748528b394de3a483c10bfa9b2fd420d2d5a7247be18b9b71b1741 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=73a0c4086f45b89ac5ac48564363e3cce8449b2d2c7cf71adadb6258119771 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549ad2b6a5f66290516660fc7bf731ab1516ae6fe1723e6a8fbaeb +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c63f46ef1a4531b36b6d9d933fc6d97a929ba3fce60a9523228c4df6745d30 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=daa224045edb5559f94be878b2de124313b1e157fa49295925143dca42782b + +handshake=Noise_X_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254376c7107f9eb405171d2d1f3d248bce446063fa27b4685471cef3d72d2da8dea4a3e192003851247b8cd95003cccd0c58e96de55d37979fb46e5a502a7e8d6e7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=95cd22713f4dc63780f443ddf8c584322d1f2e280dae8418c8a526a594e842 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e0f68ed156a13caecfc626ac6ab7516853fd098bc61c56216c95b8d7fc398 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542be0098b3b9dab8f530c810961603ba2f6a822cc78ac7eee268859f4df844553d30e3740165e3ae647bc0b502ee8e56a192bd7a7e255d12c4856c0d56857b688 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c08a79e514742f8589a1ebe18591620d753a930a6f712a8e052fde4f0eee37 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b2515711f8ce760c177220035b0693e0402e8b243720c39c2fa5c63d8fe506 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da919bbbd48942dc8dbb313ccfdf9cbe55ada3842eecc44363f68c7f277f40b9cb22eab3c5e8a67218d9e1d23c7c3b468f6237c9a41c4b7e67549484fb3d2ebc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5c617be1a77e3328ced09ee748203bbb7afb29b2c84fb20cf3b3a6d638197 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0c7261852346c160ee7df5a37ac9f3bad96737b841a6d544b39f3052e0dddd + +handshake=Noise_X_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254376c7107f9eb405171d2d1f3d248bce446063fa27b4685471cef3d72d2da8dea4a3e192003851247b8cd95003cccd0c552a973c425d8f07f60648804b7601dca1fdf628e900475030723 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=95cd22713f4dc63780f443ddf8c584322d1f2e280dae8418c8a526a594e842 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e0f68ed156a13caecfc626ac6ab7516853fd098bc61c56216c95b8d7fc398 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542be0098b3b9dab8f530c810961603ba2f6a822cc78ac7eee268859f4df844553d30e3740165e3ae647bc0b502ee8e56a81596dfb309c93b19d1534841d06d77ec854aab3070121504346 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c08a79e514742f8589a1ebe18591620d753a930a6f712a8e052fde4f0eee37 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b2515711f8ce760c177220035b0693e0402e8b243720c39c2fa5c63d8fe506 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da919bbbd48942dc8dbb313ccfdf9cbe55ada3842eecc44363f68c7f277f40b9cb22eab3c5e8a67218d9e1d23c7c3b467b9fb8b2dd85bd90458553d745936beb7be4fbadae7aca179b16 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5c617be1a77e3328ced09ee748203bbb7afb29b2c84fb20cf3b3a6d638197 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0c7261852346c160ee7df5a37ac9f3bad96737b841a6d544b39f3052e0dddd + +handshake=Noise_X_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254376c7107f9eb405171d2d1f3d248bce446063fa27b4685471cef3d72d2da8deaa15d6a63c69270eccce4c01bcc449c6fcb8d33e0971f84f0bdd310d557ae81d8 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=95cd22713f4dc63780f443ddf8c584322d1f2e280dae8418c8a526a594e842 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e0f68ed156a13caecfc626ac6ab7516853fd098bc61c56216c95b8d7fc398 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542be0098b3b9dab8f530c810961603ba2f6a822cc78ac7eee268859f4df844553b33f9d2a4423e9a802ff89a058ed672f49301da562d43c4e84803ece0442d767 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c08a79e514742f8589a1ebe18591620d753a930a6f712a8e052fde4f0eee37 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b2515711f8ce760c177220035b0693e0402e8b243720c39c2fa5c63d8fe506 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da919bbbd48942dc8dbb313ccfdf9cbe55ada3842eecc44363f68c7f277f40b92bc84021a9f0cea4dcd51d10b9ddc776d8d7d0db81f5ed7985751fe2e2aea0ec +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5c617be1a77e3328ced09ee748203bbb7afb29b2c84fb20cf3b3a6d638197 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0c7261852346c160ee7df5a37ac9f3bad96737b841a6d544b39f3052e0dddd + +handshake=Noise_X_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254376c7107f9eb405171d2d1f3d248bce446063fa27b4685471cef3d72d2da8deaa15d6a63c69270eccce4c01bcc449c6f52a973c425d8f07f606498675011335ab87e026edc45c947accd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=95cd22713f4dc63780f443ddf8c584322d1f2e280dae8418c8a526a594e842 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=9e0f68ed156a13caecfc626ac6ab7516853fd098bc61c56216c95b8d7fc398 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542be0098b3b9dab8f530c810961603ba2f6a822cc78ac7eee268859f4df844553b33f9d2a4423e9a802ff89a058ed672f81596dfb309c93b19d158cb77e84c978a3dcb608c6ecac6c2c5d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c08a79e514742f8589a1ebe18591620d753a930a6f712a8e052fde4f0eee37 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=b2515711f8ce760c177220035b0693e0402e8b243720c39c2fa5c63d8fe506 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_SHA512 +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254da919bbbd48942dc8dbb313ccfdf9cbe55ada3842eecc44363f68c7f277f40b92bc84021a9f0cea4dcd51d10b9ddc7767b9fb8b2dd85bd904585a11cd434469ceca29de06fb9079d0a05 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5c617be1a77e3328ced09ee748203bbb7afb29b2c84fb20cf3b3a6d638197 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0c7261852346c160ee7df5a37ac9f3bad96737b841a6d544b39f3052e0dddd + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664630f67598da3b42143a952be366791b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13d25f218f99a206fea16ec00da9ffa85d826e945ff96cf5c809557d8ac3d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f59ee5daa0c96f469ccbd54f22f1dc6e414db878e9802d9a60bbf66b17c2fa + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545ca945ccbc84a56bec9c401b36132676 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f0eb7ac83b0774a9e2869b41e7740303 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7811d68572ef1cef95b8a84abaa2c04c52c65b6bc7717b20d7d0937fbdd792 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ccf5caaaee5fd10189d055e7c7e73eff5c50c424c5186ba83af5921864b95f + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254eaad96f18f5a9a198b4236625eb25933 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666b172d38e2412c0ae2590dfdbe5e0832 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=627eff0c6f895f05f005ae386f2e3bd0f04a2ce1b308c09a9a7efc24b593d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=57ebc9b6d2d2352741b60d2e221cc05b660997799e0589257dcbaa6ab8a453 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bcc2d28dc4fef41f14c5105e63af938f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846615dfc62d0cb9e27f1e7249fd3bd7a20a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=235d6e8d0ce1821b0a800f12b932240ca563d9246f535102faff2ce267bc2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=454fc5046d2d0b78b7b7bf94edd69a124fc244e9ddc61f8991051192723e34 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c86b9a678485762fc7a4f979bbd9953460114cd3b560182ebd35 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13d25f218f99a206fea16ec00da9ffa85d826e945ff96cf5c809557d8ac3d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f59ee5daa0c96f469ccbd54f22f1dc6e414db878e9802d9a60bbf66b17c2fa + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544291e8e0931ad8b16a789c6570707bcf7b224b7690859f627dfb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466871d4367360b3a22ef391c1824a2fc2ef48f53b399433fb6ef10 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7811d68572ef1cef95b8a84abaa2c04c52c65b6bc7717b20d7d0937fbdd792 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ccf5caaaee5fd10189d055e7c7e73eff5c50c424c5186ba83af5921864b95f + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f77e811ab35561749225514a9041dd60f0971cb6c16a595992a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0a44d4d21ef21ccaca66bf95c85c71b4176f2e082084e86f9c1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=627eff0c6f895f05f005ae386f2e3bd0f04a2ce1b308c09a9a7efc24b593d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=57ebc9b6d2d2352741b60d2e221cc05b660997799e0589257dcbaa6ab8a453 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254224ae179b2e475df7ec45848ad251c75c093fdcb0eccb715accb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661ce2f4a22491191e59e782267d686152bb0931d0d95282be7d62 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=235d6e8d0ce1821b0a800f12b932240ca563d9246f535102faff2ce267bc2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=454fc5046d2d0b78b7b7bf94edd69a124fc244e9ddc61f8991051192723e34 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a632ac4e20596b74a3ba081cade4076b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13d25f218f99a206fea16ec00da9ffa85d826e945ff96cf5c809557d8ac3d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f59ee5daa0c96f469ccbd54f22f1dc6e414db878e9802d9a60bbf66b17c2fa + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b06ef00a4d70a332e9d2d7ee208915d8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a69b59729468a7560df3f44a73e23793 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7811d68572ef1cef95b8a84abaa2c04c52c65b6bc7717b20d7d0937fbdd792 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ccf5caaaee5fd10189d055e7c7e73eff5c50c424c5186ba83af5921864b95f + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce1d92d2350fbee302be9be3ad3c64da +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa472236809ef20090d9cdcddcf53b3f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=627eff0c6f895f05f005ae386f2e3bd0f04a2ce1b308c09a9a7efc24b593d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=57ebc9b6d2d2352741b60d2e221cc05b660997799e0589257dcbaa6ab8a453 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545d25ad5a9ff63b9a03b1283e53ee3b47 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660d15867c6e1e33cb806e7213c2070fb2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=235d6e8d0ce1821b0a800f12b932240ca563d9246f535102faff2ce267bc2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=454fc5046d2d0b78b7b7bf94edd69a124fc244e9ddc61f8991051192723e34 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c86b9a678485762fc7a42265d67a1ab87c705687b414166c9df1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=13d25f218f99a206fea16ec00da9ffa85d826e945ff96cf5c809557d8ac3d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f59ee5daa0c96f469ccbd54f22f1dc6e414db878e9802d9a60bbf66b17c2fa + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544291e8e0931ad8b16a78a94b1c635dbd71a5ac125379e105b3de +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466871d4367360b3a22ef39d1de21e1ff59b1753271ca93e5511e28 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=7811d68572ef1cef95b8a84abaa2c04c52c65b6bc7717b20d7d0937fbdd792 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ccf5caaaee5fd10189d055e7c7e73eff5c50c424c5186ba83af5921864b95f + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546f77e811ab355617492204d2720b9e3cf1b1aec5da0fcaa6bf91 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0a44d4d21ef21ccaca686386a2bf51e7354e7af59917d9b6643 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=627eff0c6f895f05f005ae386f2e3bd0f04a2ce1b308c09a9a7efc24b593d5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=57ebc9b6d2d2352741b60d2e221cc05b660997799e0589257dcbaa6ab8a453 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2b +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254224ae179b2e475df7ec4a184c97251967b804a044fdfd2aea7d6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661ce2f4a22491191e59e7076f9aedbd9c6be1c26f94ef4491cd5a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=235d6e8d0ce1821b0a800f12b932240ca563d9246f535102faff2ce267bc2d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=454fc5046d2d0b78b7b7bf94edd69a124fc244e9ddc61f8991051192723e34 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a2f457bc3aff4cffba8148122b472e8d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c096947fe48821afe851ee5ab92bb0df988463d57ba4b283ec431ff8661cd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=75bc0377d0436cff22226d1136c0690df2727247cc08bcb1bacd5515bc0b03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625405d8c5acffb92564fbf7452d9342b1f2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846612a034b4785dad8a1de7e4ef2d8db776 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84e4d0e9a8d546be134bd8d93e6d4ef9fe83b7fc8503ed1d6a3495db3a35b6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae361ebb5e7ae9d1fdad4c00b920379f19fca1eb3997bcccda85a6308b47bd + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c1ea9f3ccd34beeeaa8e540bc7eb9f54 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466efd17f977051f84913f28c6129853611 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e5ccaaeb804ee27f31fb09b68d42fe6b940367fcb4f3591d2fd82b72024edc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afd726057fe1cb681ee905558ed76fbe22239fcbcf8f39970d6ad48ab4f51 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544d5cff5d8b30c51e9adc0b19105c1313 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687e6f622354e5f80d7cef534378f3090 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e33a92b005c91179ff2a9f0e179b0c972f9b388541bd5c62c379cc05d0ec80 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e73a4ead0be8bd5e1dac776d7d88f6bda655f69da442b99ba0742dc5905d57 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e0f0cadb3c591903a8bf99a59da7cf9db265b8ae6b75dc23da +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c096947fe48821afe851ee5ab92bb0df988463d57ba4b283ec431ff8661cd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=75bc0377d0436cff22226d1136c0690df2727247cc08bcb1bacd5515bc0b03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c50efd8dcd4dc214c8054a27dc861e4fd0b7593e07254b0ee129 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ccf4b6474627f408499a1bbe8979e087d3029557416e4804d234 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84e4d0e9a8d546be134bd8d93e6d4ef9fe83b7fc8503ed1d6a3495db3a35b6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae361ebb5e7ae9d1fdad4c00b920379f19fca1eb3997bcccda85a6308b47bd + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b869eb72ca64cc2d6827db97a739536c13cbabd38989507992b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663fe7d7cee5f0380f6c801eab927dd4639ffd11e2c2bcb2e9e4b1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e5ccaaeb804ee27f31fb09b68d42fe6b940367fcb4f3591d2fd82b72024edc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afd726057fe1cb681ee905558ed76fbe22239fcbcf8f39970d6ad48ab4f51 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625421ec5b7f100436755fcc7344c07f39d3b204fcb238e868e30f8f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645e9ac3e449c0f53b6793b6526cdfa0d8960b745aa88cb98b4c1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e33a92b005c91179ff2a9f0e179b0c972f9b388541bd5c62c379cc05d0ec80 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e73a4ead0be8bd5e1dac776d7d88f6bda655f69da442b99ba0742dc5905d57 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d1ac871da6795cd1bf42f6e4778eba0e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c096947fe48821afe851ee5ab92bb0df988463d57ba4b283ec431ff8661cd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=75bc0377d0436cff22226d1136c0690df2727247cc08bcb1bacd5515bc0b03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625476ee8d7f3a1828d84dcbf1fcc8a4a2af +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f8bb2f6eb8e944455239c3883d5baa9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84e4d0e9a8d546be134bd8d93e6d4ef9fe83b7fc8503ed1d6a3495db3a35b6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae361ebb5e7ae9d1fdad4c00b920379f19fca1eb3997bcccda85a6308b47bd + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254044d66fd5be6f6f903529a08c91ca7a8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b28a402e90013fb224a3cdc6885ab50e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e5ccaaeb804ee27f31fb09b68d42fe6b940367fcb4f3591d2fd82b72024edc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afd726057fe1cb681ee905558ed76fbe22239fcbcf8f39970d6ad48ab4f51 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f48976f8e36a771ae749f67142338313 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466110f04a5d3f770028208831ad8973e78 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e33a92b005c91179ff2a9f0e179b0c972f9b388541bd5c62c379cc05d0ec80 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e73a4ead0be8bd5e1dac776d7d88f6bda655f69da442b99ba0742dc5905d57 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846692e0f0cadb3c591903a8ddab209d656baadf356263026a58bd22 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c096947fe48821afe851ee5ab92bb0df988463d57ba4b283ec431ff8661cd0 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=75bc0377d0436cff22226d1136c0690df2727247cc08bcb1bacd5515bc0b03 + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c50efd8dcd4dc214c805058c30240a610132a8a3910453e655d5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ccf4b6474627f408499acbcf8ca41dedf91ee38353404982353a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=84e4d0e9a8d546be134bd8d93e6d4ef9fe83b7fc8503ed1d6a3495db3a35b6 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae361ebb5e7ae9d1fdad4c00b920379f19fca1eb3997bcccda85a6308b47bd + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545b869eb72ca64cc2d682cb6669a21f17801f9ae01c063e4ddc66 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663fe7d7cee5f0380f6c8054b28c1be92664a53099215dd224c2a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e5ccaaeb804ee27f31fb09b68d42fe6b940367fcb4f3591d2fd82b72024edc +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afd726057fe1cb681ee905558ed76fbe22239fcbcf8f39970d6ad48ab4f51 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625421ec5b7f100436755fcc5821bb3b0e9440da589fba503939929d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645e9ac3e449c0f53b6793ad3c38088fe2a9a1687817650d29825 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e33a92b005c91179ff2a9f0e179b0c972f9b388541bd5c62c379cc05d0ec80 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e73a4ead0be8bd5e1dac776d7d88f6bda655f69da442b99ba0742dc5905d57 + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c6e796fa47f064296ace520223eb1dd4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846676512fffc7284353c50e8f1e50b945fb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=02e58bb367d2215eee3ce2e3a92143cab6b06f86312014629c8eba7d0e38e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0ba20925776dbb39ccd4cdce82047b8d60db1ffc2f0acad621ef0d9009aca0 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547760d42a506aaa5170e068f630688a53 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664ff57dc460faf9957ccc215c82625f72 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=815fb4a13763ec1687575d026446fb266cc4559a2e093563cd567c1928f829 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef3d9cab1bedc9b8c09ecc5d236462d60fd9a9422e8784d32f31ab27ca422e + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542c3389c93d1cbbd6c6f019414066af3e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664893d38851f50347bf1ce3de9524655f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=110a8f74722cb3993b524fb420736083bf5289a21c683b579810d9109d5c9b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22b76dbeef407b045457a05be6485cc69046d41ddfc4cf527be814ff661dbd + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254faa23cff30269a31a11f5b42c9162604 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e9b51f8946c2ae367b2d20ce054ef95e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=09fe0a7fa8ec12cf6456d2d0a55b78880b6ee9334179cedf36b8216b0b179b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e79a394c1e746f3dae6a5f2cb32ca5a20604059585ebb6c339012c9de90641 + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c81819c82320a3cf8a849bd2e79390bde13b992be00ca8465386 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661a77bcc3ed425db85bd9597b6a0d34435d1010cb1b0a3d984f96 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=02e58bb367d2215eee3ce2e3a92143cab6b06f86312014629c8eba7d0e38e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0ba20925776dbb39ccd4cdce82047b8d60db1ffc2f0acad621ef0d9009aca0 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ef2398290ba5d346eb19be574fc6ccce0965514c9aa58262d397 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663b5e2c4787084bef7e3a09ee94b7c2173313452ed41413a3efa1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=815fb4a13763ec1687575d026446fb266cc4559a2e093563cd567c1928f829 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef3d9cab1bedc9b8c09ecc5d236462d60fd9a9422e8784d32f31ab27ca422e + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437705fd6001f9d8fcdd2add594d12af9de7abea9a566426838ca +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666af1d6140fb3e3cd79fa80d74125e9148a2fae4a01fa69759c41 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=110a8f74722cb3993b524fb420736083bf5289a21c683b579810d9109d5c9b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22b76dbeef407b045457a05be6485cc69046d41ddfc4cf527be814ff661dbd + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542990e960017d439237f507eb9a110ea1c15cd1961db0eee83129 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633b80c1088b1489016fc9f7b244968820f26c348bc378f826c69 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=09fe0a7fa8ec12cf6456d2d0a55b78880b6ee9334179cedf36b8216b0b179b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e79a394c1e746f3dae6a5f2cb32ca5a20604059585ebb6c339012c9de90641 + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459b23e6596ccfc1d861e44965c248bc3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f16a3ac5548d7e8b622e26baf3f256a1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=02e58bb367d2215eee3ce2e3a92143cab6b06f86312014629c8eba7d0e38e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0ba20925776dbb39ccd4cdce82047b8d60db1ffc2f0acad621ef0d9009aca0 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541bc20995406cf070cdbd007ba8de8fc3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666fff7b379bd0814d6ab0f7d1cdf32e59 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=815fb4a13763ec1687575d026446fb266cc4559a2e093563cd567c1928f829 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef3d9cab1bedc9b8c09ecc5d236462d60fd9a9422e8784d32f31ab27ca422e + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254526352a52eb702c0846d41e845f956e6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665d3bcbb1d75f8239e7dd48fd00e023ba +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=110a8f74722cb3993b524fb420736083bf5289a21c683b579810d9109d5c9b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22b76dbeef407b045457a05be6485cc69046d41ddfc4cf527be814ff661dbd + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540c54a88750132ccc7d2606ccd647e158 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b5570e4eb7f95e64466aa037c73e745e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=09fe0a7fa8ec12cf6456d2d0a55b78880b6ee9334179cedf36b8216b0b179b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e79a394c1e746f3dae6a5f2cb32ca5a20604059585ebb6c339012c9de90641 + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c81819c82320a3cf8a848138f5e224a7535afb46defe7d87553c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661a77bcc3ed425db85bd942db11c4661841c59bc54d0800472873 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=02e58bb367d2215eee3ce2e3a92143cab6b06f86312014629c8eba7d0e38e5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0ba20925776dbb39ccd4cdce82047b8d60db1ffc2f0acad621ef0d9009aca0 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ef2398290ba5d346eb19c7fc80387a124bee9c89251344667fc0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663b5e2c4787084bef7e3a6061d1819ecd024f00bf02c2e6acf677 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=815fb4a13763ec1687575d026446fb266cc4559a2e093563cd567c1928f829 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef3d9cab1bedc9b8c09ecc5d236462d60fd9a9422e8784d32f31ab27ca422e + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625437705fd6001f9d8fcdd2730a8aedfe5a4471d07b97371d534f57 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666af1d6140fb3e3cd79fa4642e8c5891b3c04a8128d5f3cd3a845 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=110a8f74722cb3993b524fb420736083bf5289a21c683b579810d9109d5c9b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22b76dbeef407b045457a05be6485cc69046d41ddfc4cf527be814ff661dbd + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542990e960017d439237f52c524921d226d4977c7c5f80fe55e3c7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633b80c1088b1489016fceccf88e99c39eb84390e2d6c09747f91 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=09fe0a7fa8ec12cf6456d2d0a55b78880b6ee9334179cedf36b8216b0b179b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=e79a394c1e746f3dae6a5f2cb32ca5a20604059585ebb6c339012c9de90641 + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540add9701c614f83639fc5b8469a824e1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466adae6f9cdefe2c94ee03225c37604b0a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3dc2f873e6658db54bb9c572f74b4c1cf45ad75c65239938a138836f952884 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e3bc17a298d558e3a06e40efb7b7fb5c96c4aa1d5e4d5f787d2515e14b998 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546610e2230ff1f3183d48afe4781ff0f6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466727d1d82190773d3282167eb6e957f08 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c270a853bd1c257e47c627efd4b79e3530ba09c1d52d5b17a2b3692c1f1c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae75589da7fee8dd69c1b09e67a2c1f7e6eacaee8014dd93276961df209a42 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fef2b62435793bda6a4c4aad05ae8b4a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667b3cb7dfdc05036e035075c3154d5f32 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe3643f10e3112865a008a1c5c10c54896ca6d88c8d90914f94dd6fac138cd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=403d08bf236b73390ed2923cd3c1ff651185bbe29b564d2cb40a4675b6cbfc + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546dec2771909ce9080044dd47d7e2ba76 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846619249b3f50f0f8542659ce99e21cb636 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=30f5556b007aaf32d4952968082ba5217423797071e81cdd569b73a8725017 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2dc14afd5ebf1485e853ba62a6180a64707caa20165712e8d495c8c603e97f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c28485b9d3a6a7ca1e70af530f049309a3b19da102d864d1599 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626c79bad0b5abe023979c227b9eb46738a33dbc12faa4ab64df0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3dc2f873e6658db54bb9c572f74b4c1cf45ad75c65239938a138836f952884 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e3bc17a298d558e3a06e40efb7b7fb5c96c4aa1d5e4d5f787d2515e14b998 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c643b3d339ed91764914480f545d04a1cdf9982ed7e7e1286a7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466418f1875550e6432799a2eb9a92fcb4fc53bad4bb8aa1dc3f3ca +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c270a853bd1c257e47c627efd4b79e3530ba09c1d52d5b17a2b3692c1f1c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae75589da7fee8dd69c1b09e67a2c1f7e6eacaee8014dd93276961df209a42 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545e50e3aef221429fa8e8134dcc000d3ce8f0a959f9b5cc273dbc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665a65999701c16a9ae50ffe150f59674b235dcf3a3d6ea1d5d91f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe3643f10e3112865a008a1c5c10c54896ca6d88c8d90914f94dd6fac138cd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=403d08bf236b73390ed2923cd3c1ff651185bbe29b564d2cb40a4675b6cbfc + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ea662b9896170d9582a6150ca6343873bc78f15cbd3060355e29 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c2eeab8af4a3f66ba3d1a3e4b4acc9f606878c661b2ba31a4ec +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=30f5556b007aaf32d4952968082ba5217423797071e81cdd569b73a8725017 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2dc14afd5ebf1485e853ba62a6180a64707caa20165712e8d495c8c603e97f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e047c5ed566988814daa1e9e4605341 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664938a09e1060496bb538cb5f75115a31 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3dc2f873e6658db54bb9c572f74b4c1cf45ad75c65239938a138836f952884 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e3bc17a298d558e3a06e40efb7b7fb5c96c4aa1d5e4d5f787d2515e14b998 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545df1c569503f51071bdf5cd13746f1f6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660fb79e8c546d18b5aedcec17dd1b7ae3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c270a853bd1c257e47c627efd4b79e3530ba09c1d52d5b17a2b3692c1f1c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae75589da7fee8dd69c1b09e67a2c1f7e6eacaee8014dd93276961df209a42 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254edd4fe26947e07493993cad56c107e29 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662480512f17f4dda812ba7e8c02b84333 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe3643f10e3112865a008a1c5c10c54896ca6d88c8d90914f94dd6fac138cd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=403d08bf236b73390ed2923cd3c1ff651185bbe29b564d2cb40a4675b6cbfc + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b2d96179cc834d3bf1192c8cd4e7c1f0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846624d094f7cde5f0b1561205f0a58cb4e1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=30f5556b007aaf32d4952968082ba5217423797071e81cdd569b73a8725017 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2dc14afd5ebf1485e853ba62a6180a64707caa20165712e8d495c8c603e97f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c28485b9d3a6a7ca1e7ae04c80a14d382f1e9a8b3932548ecfa +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846626c79bad0b5abe023979ebedf6784eaba92e4bbc6ade0a638027 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=3dc2f873e6658db54bb9c572f74b4c1cf45ad75c65239938a138836f952884 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8e3bc17a298d558e3a06e40efb7b7fb5c96c4aa1d5e4d5f787d2515e14b998 + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c643b3d339ed91764918cbf74d28fc8719e73556b95fb8700c3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466418f1875550e6432799a6d7ab709f63bdae8d6d2c952226eb8e2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c270a853bd1c257e47c627efd4b79e3530ba09c1d52d5b17a2b3692c1f1c7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ae75589da7fee8dd69c1b09e67a2c1f7e6eacaee8014dd93276961df209a42 + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545e50e3aef221429fa8e881b96f072d239b26dfd0155e0757eda9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665a65999701c16a9ae50fd52f26c48089f42e1c84202264bba4d3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=fe3643f10e3112865a008a1c5c10c54896ca6d88c8d90914f94dd6fac138cd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=403d08bf236b73390ed2923cd3c1ff651185bbe29b564d2cb40a4675b6cbfc + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ea662b9896170d9582a69f28efbf005006e6d922df48806ea391 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666c2eeab8af4a3f66ba3df608254030f07adb8a353054b309566a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=30f5556b007aaf32d4952968082ba5217423797071e81cdd569b73a8725017 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2dc14afd5ebf1485e853ba62a6180a64707caa20165712e8d495c8c603e97f + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661001bf5d654afd000b60a48982a7f8f16bad1946aefa20866c7c142a94c472233b64ed63dfc7555c854c43e68cd95f6d1475061fe795ea1e30f1cf6d8077235a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9e79f9d8263bcf07bbcc8e8729039c8cce829d3be34aa7f1414aef1312e2e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cb46d49add7c73f9a1bc9c2bb015e114ff3c23aaff62326cd077f3d54d3d8d + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d1cb2f10981522e83aae2312213c754f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665fd1624f32ed036ff7fc7f8c27ff605eba031dca8f50f0750e420763654f319c02737a43b9d5d56fd312fbd3e875bf695b546491b9a5d4f0a3866dd74079bdc1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9057ac2b936c434d8bd9a5f926136918b98c36c73d65ae6e092509dc0f7d1d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6434f211fcaa13b60694f51d53bd2d058231706b393d76016e6fb18500796a + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544f135b82ef3c887c3a1f13fa66bdd6ff +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6f1bac5db9338604250bf5aea410705dab380ac8d53e05070aa26bd4e8adba93f296cffaa1f2ed206645b81e91e706bbcfd9abe7465b3eed22b53984a1dac07 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2681c5a5a71b1a764618ffe8265b55b0262a8dc0e579ea417b506565587609 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b512c5f3481260755d59236bcf47d03b49096fbfb58f4f01d3e57e93aa8a80 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e5854b1e81cbb8cc49dc98173b9cefd0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466492d0eb95d7c0b7d7e02e0057dab75d823438caf0ca19e7b8f550466c9e5ec10c36f9e3ab39e90ce475d2ce2f81d912655d8d21d8ee3c26ca6111bb3bdc449e0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=87c279f5b3cab2d36d5d53adfef24f41f8f0ad59541d80cfeb3d32a9373ab4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=163c5ca8ea00dd3b81b2b494e038ad57c26277be9a54efbf0b491eb34621ea + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661001bf5d654afd000b60a48982a7f8f16bad1946aefa20866c7c142a94c47223b18e3f707c460fbaa28865ad9d668ea9abda0084c02e273674c44fe10712a87cf1f039a7c62b617178f0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9e79f9d8263bcf07bbcc8e8729039c8cce829d3be34aa7f1414aef1312e2e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cb46d49add7c73f9a1bc9c2bb015e114ff3c23aaff62326cd077f3d54d3d8d + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447633918cf073418422f340bfd1bc8db323c006435cbeb4e766f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665fd1624f32ed036ff7fc7f8c27ff605eba031dca8f50f0750e420763654f319c306334979630201ed10c494d6e98c7599c97ed31e367ab91ae6752af9d3e7f0f310b1a68839b57f3af4b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9057ac2b936c434d8bd9a5f926136918b98c36c73d65ae6e092509dc0f7d1d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6434f211fcaa13b60694f51d53bd2d058231706b393d76016e6fb18500796a + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254feeb1e12496f2e4e099574f80191ac09276f3f7e5e523e91eb01 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6f1bac5db9338604250bf5aea410705dab380ac8d53e05070aa26bd4e8adba9725f545c2be3115608bd82e9ecc664e335683343957a81560b3c30b947654f0cf1b4d8a7f75fe3b6766e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2681c5a5a71b1a764618ffe8265b55b0262a8dc0e579ea417b506565587609 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b512c5f3481260755d59236bcf47d03b49096fbfb58f4f01d3e57e93aa8a80 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548c01fe1c6c49957de78d150a12bc0a4299e0fce95818fcf28e50 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466492d0eb95d7c0b7d7e02e0057dab75d823438caf0ca19e7b8f550466c9e5ec1064d3270ff07b4c418f9960259ec303f31e374382eb37dddd0343063ec69b9f6a1cb2126f82a678d8b5fa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=87c279f5b3cab2d36d5d53adfef24f41f8f0ad59541d80cfeb3d32a9373ab4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=163c5ca8ea00dd3b81b2b494e038ad57c26277be9a54efbf0b491eb34621ea + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661001bf5d654afd000b60a48982a7f8f16bad1946aefa20866c7c142a94c47223332bc232984079635e54eb96a835e148dc8d60cae839375194f9c7b0ddc8c951 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9e79f9d8263bcf07bbcc8e8729039c8cce829d3be34aa7f1414aef1312e2e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cb46d49add7c73f9a1bc9c2bb015e114ff3c23aaff62326cd077f3d54d3d8d + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545276316a0ed49eab2fa9c4d911322382 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665fd1624f32ed036ff7fc7f8c27ff605eba031dca8f50f0750e420763654f319c3ca35ccf8d081dd3bc901f4a5d13c8f683208c9cd51ac4c469753652411a6a2b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9057ac2b936c434d8bd9a5f926136918b98c36c73d65ae6e092509dc0f7d1d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6434f211fcaa13b60694f51d53bd2d058231706b393d76016e6fb18500796a + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254043225c8bd9663ef3ef17c4f3a01688a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6f1bac5db9338604250bf5aea410705dab380ac8d53e05070aa26bd4e8adba90e3e28528791e262d6447fc135a62b6ef174eca6f83586e29efebf0d211d6c17 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2681c5a5a71b1a764618ffe8265b55b0262a8dc0e579ea417b506565587609 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b512c5f3481260755d59236bcf47d03b49096fbfb58f4f01d3e57e93aa8a80 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549f846d3cf079683dacbc4b63ad6c0a01 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466492d0eb95d7c0b7d7e02e0057dab75d823438caf0ca19e7b8f550466c9e5ec10dcff0ef61dd99720eed6968a3a5f9ebc124df4a7e622f4aaa27dbf6803ab23d4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=87c279f5b3cab2d36d5d53adfef24f41f8f0ad59541d80cfeb3d32a9373ab4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=163c5ca8ea00dd3b81b2b494e038ad57c26277be9a54efbf0b491eb34621ea + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661001bf5d654afd000b60a48982a7f8f16bad1946aefa20866c7c142a94c47223888ddf72adf7001627f8ed91dd333d25abda0084c02e273674c4f5a1c2f6bc0ba9c95969fa9346fbaf1f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9e79f9d8263bcf07bbcc8e8729039c8cce829d3be34aa7f1414aef1312e2e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cb46d49add7c73f9a1bc9c2bb015e114ff3c23aaff62326cd077f3d54d3d8d + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625447633918cf073418422f4e800c64262116b557756d3917dea3b0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665fd1624f32ed036ff7fc7f8c27ff605eba031dca8f50f0750e420763654f319c22fc74d15ca64b517e5b7d93d4786c339c97ed31e367ab91ae6763a0ae92a90d8db97f341fa0af4b2922 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=9057ac2b936c434d8bd9a5f926136918b98c36c73d65ae6e092509dc0f7d1d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=6434f211fcaa13b60694f51d53bd2d058231706b393d76016e6fb18500796a + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254feeb1e12496f2e4e0995be8115bad42c6477a3b1b28252a81fbe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6f1bac5db9338604250bf5aea410705dab380ac8d53e05070aa26bd4e8adba9259737628f54586b0c82e86c3d58105635683343957a81560b3c76df030794ccb6677d91b03c63198fed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2681c5a5a71b1a764618ffe8265b55b0262a8dc0e579ea417b506565587609 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b512c5f3481260755d59236bcf47d03b49096fbfb58f4f01d3e57e93aa8a80 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548c01fe1c6c49957de78d567452df11303abb4e72c68fd934013b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466492d0eb95d7c0b7d7e02e0057dab75d823438caf0ca19e7b8f550466c9e5ec1089cb6312ea00184d8e4823521c7542711e374382eb37dddd03434e498cfe49446d13a1f17641c62d74be +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=87c279f5b3cab2d36d5d53adfef24f41f8f0ad59541d80cfeb3d32a9373ab4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=163c5ca8ea00dd3b81b2b494e038ad57c26277be9a54efbf0b491eb34621ea + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466179eeb7aae5b20dec5995bc6a5d6e2bb9ba4230601424a00e6db617861aa71450288e5ec4f28f4623eb6bdb44b3157684d77cd66463f11069c7d976244bc728d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2bb1a0510ab355a2510ff3004b60eca89d1719792c5debfe35e8bacd3a22b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8b38dc71a41266bb63183e45bc3e44f8f57fe720828cbc1296dc6bfc7d2557 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254939dacc481851a259b90b407652ca87c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3c3067c9805256d1dc3e4270df2edf92b5490b88dfc45ad9d5a48b23d181af0dcad241275390b064c4b453d071f8e4ad6d2515685b25744b80f8e6f4a4abb7c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f7b885d922743399857f09ed19c19ca8a4e74cd85eda575b12444f1fed058f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2686fb37d67ed89179e0b5d0af77792ee6cf1a9b7e169af39512daeb1d20d3 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547062e9cf5576fc2b4c124d9ce66a28a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668632910f8bae8e626c3c3ee7de1bc07dc38d0186546649ae93933bdc7edb0a65a46196ceff28ba865581ec2563330a8ce8891f325f8a478efc4c955d2eb6a37d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=115fea697d7bcade2ef9a2d597bd4084a517fe809ecc0741ce9dd61c98fb90 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c85e6c4d4331ad8ed2db83a7e9406ac663299046ea7582b1f5e2cc4c7c935d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545d1f4bb51a8be81e03d55eddabf13fbb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669cd62d93703ab4f915f66c4c10b254212de4a53b3d95a63ea962f6d35da0d9542ccb4b9b10b069dfaaf134297079a71db28c4babf29d84b7d8f8227826600fc9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=409d4523fe0934586527baa3e12f1d4f5052096478e56e84c175fcc9b6625f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7d53fd728a2b440653f65a1facc49bcad6ca6e0a78972c4271b8518290c91 + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466179eeb7aae5b20dec5995bc6a5d6e2bb9ba4230601424a00e6db617861aa71457d13eafd308a55b40ab5f394b4a062f11647d7c3399446edcb98c15fd689f9a1130785bb45bb91377c1c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2bb1a0510ab355a2510ff3004b60eca89d1719792c5debfe35e8bacd3a22b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8b38dc71a41266bb63183e45bc3e44f8f57fe720828cbc1296dc6bfc7d2557 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542a49dcf4c8364f330f2c4096746db3b89b22d735da6a239394a2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3c3067c9805256d1dc3e4270df2edf92b5490b88dfc45ad9d5a48b23d181af0d2bb9743fc882ac69de65ea6a60888a59d4fff629fa819bbff1024925852f1686ee8cf6c72c230c97381 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f7b885d922743399857f09ed19c19ca8a4e74cd85eda575b12444f1fed058f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2686fb37d67ed89179e0b5d0af77792ee6cf1a9b7e169af39512daeb1d20d3 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543a9230768ed98f32a31dd2e8e4ebd76f2e0ca3824a4c211aeda0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668632910f8bae8e626c3c3ee7de1bc07dc38d0186546649ae93933bdc7edb0a651dbc7414ce613441d019292b1c34b8d0c3b6f6d04e36d77d8232f885f117d61218b74ceee4bb683247d0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=115fea697d7bcade2ef9a2d597bd4084a517fe809ecc0741ce9dd61c98fb90 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c85e6c4d4331ad8ed2db83a7e9406ac663299046ea7582b1f5e2cc4c7c935d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545c320f73198c23651d414b71ef96c3edcc0e4e02d78b3359ff30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669cd62d93703ab4f915f66c4c10b254212de4a53b3d95a63ea962f6d35da0d9544a9cb36f29d81bffa4d9168eea4b4d5391296c52ec0585c8deeef0425f8728304a8f10ad563280a2f1d4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=409d4523fe0934586527baa3e12f1d4f5052096478e56e84c175fcc9b6625f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7d53fd728a2b440653f65a1facc49bcad6ca6e0a78972c4271b8518290c91 + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466179eeb7aae5b20dec5995bc6a5d6e2bb9ba4230601424a00e6db617861aa71458e36527aef883c8c96b8f626909171994d85960ab8d14303beb35b5df7204a10 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2bb1a0510ab355a2510ff3004b60eca89d1719792c5debfe35e8bacd3a22b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8b38dc71a41266bb63183e45bc3e44f8f57fe720828cbc1296dc6bfc7d2557 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f39aef73df6fe3c5f28de40ce7f759a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3c3067c9805256d1dc3e4270df2edf92b5490b88dfc45ad9d5a48b23d181af05d9187615bf9c1d9b1e5d7779bcee0bdcbb351df0b5b450a6ffcb11a5287109c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f7b885d922743399857f09ed19c19ca8a4e74cd85eda575b12444f1fed058f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2686fb37d67ed89179e0b5d0af77792ee6cf1a9b7e169af39512daeb1d20d3 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f39c39bdeb9989b9352beb67fbb47db0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668632910f8bae8e626c3c3ee7de1bc07dc38d0186546649ae93933bdc7edb0a65c6f3b964c11299306556d0df66e428db049c2698e430f4f642b228c12e8b196d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=115fea697d7bcade2ef9a2d597bd4084a517fe809ecc0741ce9dd61c98fb90 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c85e6c4d4331ad8ed2db83a7e9406ac663299046ea7582b1f5e2cc4c7c935d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625492e67987c1b2adc0152f1442ae64a66d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669cd62d93703ab4f915f66c4c10b254212de4a53b3d95a63ea962f6d35da0d954f1d3d37785abc0bc28d3e37a0d3df4fbcea0bc3b6f47926decd3d4b98ea0990f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=409d4523fe0934586527baa3e12f1d4f5052096478e56e84c175fcc9b6625f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7d53fd728a2b440653f65a1facc49bcad6ca6e0a78972c4271b8518290c91 + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466179eeb7aae5b20dec5995bc6a5d6e2bb9ba4230601424a00e6db617861aa7145dda1510598297081009b0fc99622410c1647d7c3399446edcb98da03e57385e8faac62bdc41eadcecb8b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2bb1a0510ab355a2510ff3004b60eca89d1719792c5debfe35e8bacd3a22b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8b38dc71a41266bb63183e45bc3e44f8f57fe720828cbc1296dc6bfc7d2557 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542a49dcf4c8364f330f2c15d431db17f7b786d48c641fbe6400e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3c3067c9805256d1dc3e4270df2edf92b5490b88dfc45ad9d5a48b23d181af0d9b183f5fbd413da83c7c79e1bd427b09d4fff629fa819bbff108d80d0b71ab1d99b7c818456879b06b6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f7b885d922743399857f09ed19c19ca8a4e74cd85eda575b12444f1fed058f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2686fb37d67ed89179e0b5d0af77792ee6cf1a9b7e169af39512daeb1d20d3 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543a9230768ed98f32a31d857e0da9b9145a8da70a019517797d63 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668632910f8bae8e626c3c3ee7de1bc07dc38d0186546649ae93933bdc7edb0a6546e65dee7b9d77f189d5f5fa8ee92552c3b6f6d04e36d77d82327b7f5cb50529fd6b2174e66a7148312f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=115fea697d7bcade2ef9a2d597bd4084a517fe809ecc0741ce9dd61c98fb90 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=c85e6c4d4331ad8ed2db83a7e9406ac663299046ea7582b1f5e2cc4c7c935d + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545c320f73198c23651d417f6af622e2c553d933c8c67756f925b4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669cd62d93703ab4f915f66c4c10b254212de4a53b3d95a63ea962f6d35da0d954aa7c44244e9ce82031d2825a5dcd0c5c91296c52ec0585c8deee38dff35af0421f67c4a806b7f4f49d47 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=409d4523fe0934586527baa3e12f1d4f5052096478e56e84c175fcc9b6625f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7d53fd728a2b440653f65a1facc49bcad6ca6e0a78972c4271b8518290c91 + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660bee8aa990598c582bf25ff21b457e80 +msg_2_payload= +msg_2_ciphertext=291e0f5e79575df990b58e317022d3c6c864164d559dcb77ceb88a02eba2e0a422aa0bc47de0c7b744c10a26b0f4de12ca28ba39eb4266bbe53ef915a869eb69 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f9972897d0a22fd3ab4f7df758c17201e716d92495d7e798597ca633fcfa79 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=663a74b07d26987f1aaea566c63fed3ab905d0549d4cbbba95998087711e7b + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254157c844130c0ac1a8cd295ab5c2863f2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d0ccb8f5058ba0a1fe9e0d072bb75403 +msg_2_payload= +msg_2_ciphertext=dd296759956a201688e8438b5452e3224f22f3ce9a0c57b37a16b930b0dc6ce29ed8196b7ab499814a3cf0cd656a4959302475376a205bb9aee6b4d6d6af5210 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b8f919e1619e002fc009c8201390385e887e9cef040b20b93d6d92525060af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=813ffe58a1028b85472449f2e7612dce5751dcc2ad70d889e91018a148fc69 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625456e86321f5117e2826a5ad00441de277 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662634d4221d0ec8fdda4507d9dcf91e08 +msg_2_payload= +msg_2_ciphertext=3a7a393db716dc075d961ce4109c2af6f7e5dcd35c0b947bf30c01936a6b4b36f1129b52c3bd379d90a216a63b3675a482fb307672a7e95517889addfc1cc0c5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=97f376dd10bbfe09c7570b3514ff97a15fb7d7cefc2b25f5ce5a67dcd1cf67 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9669b636c25732803353c3c1e70508120e8b6896a2fb5edab54f831d162db6 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549b78be66b1f2e09771269003303a25c1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846606fea2bb9b9e69e297b06911a5d0d1c8 +msg_2_payload= +msg_2_ciphertext=f4364f3c48d2280a28b5a0cc4dbbdf75ae5efff3e129e5beff1ea88c7f501b9fd178457c94ad442beb3afa4f915c3ecb6a48f6a0ff1692761575a7903144b8f7 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e6c2fa29df53fe75a34bea7633a930df3aa8c62e20accf544277163022c037 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94ec62cb132c7c7ec8d99d702072fe1f9e1602bdca45023e8d3db9db63237d + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a723d539c7b582ffdf1a53288cadbb26 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669a62c45ef5d3c92b21360e796d4c197a +msg_2_payload= +msg_2_ciphertext=1e9a2da1ec0430295c3b8b7e1888bcb09293f61e62dfbdb29707348a95bdce2904ce827fd5330e814ba2346712de095e110c5aedd3543a74e86afa9d2cab6f83 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9307b428397906f7e529cf6dd1bdf53f782a88f89a250c18dc83d57c9992dd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8b1a7574e6cee466e01ba7f20e6cf372188b6294b43823ebc4c4c8a753b6e0 + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea98bff8eb4696d6d3c0e4f70aba310a675391aaf82e0804fa79 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=291e0f5e79575df990b58e317022d3c6c864164d559dcb77ceb88a02eba2e0a499f907c37ae8e0c3aaffe34553249753254343342ae4704d7c23cd8a77a1807441d2c7501369bb467126 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f9972897d0a22fd3ab4f7df758c17201e716d92495d7e798597ca633fcfa79 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=663a74b07d26987f1aaea566c63fed3ab905d0549d4cbbba95998087711e7b + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae18211db1dcdc553413922091f72d9ced221e2acda5a660f9b7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b660d1ecf94c4595dd57f654d3a0f19cccd9b63570f79de6c96e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=dd296759956a201688e8438b5452e3224f22f3ce9a0c57b37a16b930b0dc6ce2a537ae7c3f8105a2d3205317f8106e9257c07ceb5be90bcae241636ec9f1d1403c7d54fdb497a925991f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b8f919e1619e002fc009c8201390385e887e9cef040b20b93d6d92525060af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=813ffe58a1028b85472449f2e7612dce5751dcc2ad70d889e91018a148fc69 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467ec45c3d546c1618f39adc8f13e3f35a17f633a753012f9aa29 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a92e7cbd80b059556fffcbb169e97c1bde48cfcac32e1368920f +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3a7a393db716dc075d961ce4109c2af6f7e5dcd35c0b947bf30c01936a6b4b36982e61825971d574332da023645bb288e766c9dbe21f85a458860f34d47d5087b3e701cc52600fa760ce +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=97f376dd10bbfe09c7570b3514ff97a15fb7d7cefc2b25f5ce5a67dcd1cf67 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9669b636c25732803353c3c1e70508120e8b6896a2fb5edab54f831d162db6 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419c32a8d476aa90292e1d2946f42be7dd73161301ecdd5168423 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665c79e23e35136c510c909b68a7bf6508d04d169d772f42b5bc0e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f4364f3c48d2280a28b5a0cc4dbbdf75ae5efff3e129e5beff1ea88c7f501b9f1c3c70937fadc804f6b89718241ae97906d8bfebdb39bfd7b9fe0871270ae98eb13d651ecec51bc2d66e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e6c2fa29df53fe75a34bea7633a930df3aa8c62e20accf544277163022c037 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94ec62cb132c7c7ec8d99d702072fe1f9e1602bdca45023e8d3db9db63237d + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549974e0c1a1b524048c2bab05845477ddee545b9e24a00fa921d8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663070ecf7cc85144673b2911307e9d0e3ed49482c84a7a59d3334 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1e9a2da1ec0430295c3b8b7e1888bcb09293f61e62dfbdb29707348a95bdce2923776b5ee769a4928746f064091987a2d97a14c5bf5c035f4991be19871e8779eb5a753c6d99be0a20d1 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9307b428397906f7e529cf6dd1bdf53f782a88f89a250c18dc83d57c9992dd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8b1a7574e6cee466e01ba7f20e6cf372188b6294b43823ebc4c4c8a753b6e0 + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ffcf5f753467c7c2b694d4eb00d1baaf +msg_2_payload= +msg_2_ciphertext=291e0f5e79575df990b58e317022d3c6c864164d559dcb77ceb88a02eba2e0a42fb1e938d3fb06653176bc867442b318b3360a8f9ebdc1524fe34b0d01725fc8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f9972897d0a22fd3ab4f7df758c17201e716d92495d7e798597ca633fcfa79 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=663a74b07d26987f1aaea566c63fed3ab905d0549d4cbbba95998087711e7b + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fac3c8bd046a3e9d0b38ccd7698c7db6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665270ac63c46e1a1e26719e5752918e22 +msg_2_payload= +msg_2_ciphertext=dd296759956a201688e8438b5452e3224f22f3ce9a0c57b37a16b930b0dc6ce2d2a1fcad32691cfbd2db34ffb0eb021e5d7f48acb637ce70ed33921ee3ca689f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b8f919e1619e002fc009c8201390385e887e9cef040b20b93d6d92525060af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=813ffe58a1028b85472449f2e7612dce5751dcc2ad70d889e91018a148fc69 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625435b9059703f0f637c4ead9348dc36f16 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669a201926a025f16da73a7cdf456738ce +msg_2_payload= +msg_2_ciphertext=3a7a393db716dc075d961ce4109c2af6f7e5dcd35c0b947bf30c01936a6b4b36a1cd9d2d29d8df1cae8a102e26684ead172e71f633ff50d7d7c573c35152b6c7 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=97f376dd10bbfe09c7570b3514ff97a15fb7d7cefc2b25f5ce5a67dcd1cf67 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9669b636c25732803353c3c1e70508120e8b6896a2fb5edab54f831d162db6 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541da3f1038dde89dca976e36d13d38cb8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661f04fde9d6d3ca84c7f1c7167cb63357 +msg_2_payload= +msg_2_ciphertext=f4364f3c48d2280a28b5a0cc4dbbdf75ae5efff3e129e5beff1ea88c7f501b9fd634eda749f434e721ff28d808524bd37f20a0c93e065a591c9272510869a9e1 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e6c2fa29df53fe75a34bea7633a930df3aa8c62e20accf544277163022c037 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94ec62cb132c7c7ec8d99d702072fe1f9e1602bdca45023e8d3db9db63237d + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254991d7378909ba56f867c5a46cb280527 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b7d7d49c8cdbf29b0e5a7f486c7d774f +msg_2_payload= +msg_2_ciphertext=1e9a2da1ec0430295c3b8b7e1888bcb09293f61e62dfbdb29707348a95bdce29a4fd3c75a1f27bda13b92eeb81995531e73aaf41be201edd340e9decbcce9b42 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9307b428397906f7e529cf6dd1bdf53f782a88f89a250c18dc83d57c9992dd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8b1a7574e6cee466e01ba7f20e6cf372188b6294b43823ebc4c4c8a753b6e0 + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ea98bff8eb4696d6d3c004ce0d42550c2b03ee2612ca6e9eec18 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=291e0f5e79575df990b58e317022d3c6c864164d559dcb77ceb88a02eba2e0a4db2f87efd55abe5bb4ea2f0003a2497c254343342ae4704d7c233e1bd4602b35f158072774208aca6994 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=f9972897d0a22fd3ab4f7df758c17201e716d92495d7e798597ca633fcfa79 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=663a74b07d26987f1aaea566c63fed3ab905d0549d4cbbba95998087711e7b + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae18211db1dcdc55341394577371548dcdaddb6157b5753662ae +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b660d1ecf94c4595dd5712cccfbae9909b1ab004f4f12bff3a33 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=dd296759956a201688e8438b5452e3224f22f3ce9a0c57b37a16b930b0dc6ce298cc5dd18599c844fea755c57ed3c85257c07ceb5be90bcae241fee76d9fbcd17295f12f3fa2ec616528 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=b8f919e1619e002fc009c8201390385e887e9cef040b20b93d6d92525060af +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=813ffe58a1028b85472449f2e7612dce5751dcc2ad70d889e91018a148fc69 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467ec45c3d546c1618f393067aed902b79b0759bf968282a2c103 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a92e7cbd80b059556fff5b12b14c05770aff36bcc9ebc7ddeee2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3a7a393db716dc075d961ce4109c2af6f7e5dcd35c0b947bf30c01936a6b4b36dd253a46b8575151d8867881d28453aee766c9dbe21f85a4588624fa9b30ac191ca69a7bfffa584f28a4 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=97f376dd10bbfe09c7570b3514ff97a15fb7d7cefc2b25f5ce5a67dcd1cf67 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9669b636c25732803353c3c1e70508120e8b6896a2fb5edab54f831d162db6 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419c32a8d476aa90292e13801b5d6071e1336ffd6ea151b596406 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665c79e23e35136c510c9085f9ab38ad9a3ad5ef10537e6dc8d07c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f4364f3c48d2280a28b5a0cc4dbbdf75ae5efff3e129e5beff1ea88c7f501b9f3e33f6dfc8d3fe6635968a6600df1d6406d8bfebdb39bfd7b9fed61850abbf511f0095bcb77843c3d61b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e6c2fa29df53fe75a34bea7633a930df3aa8c62e20accf544277163022c037 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=94ec62cb132c7c7ec8d99d702072fe1f9e1602bdca45023e8d3db9db63237d + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549974e0c1a1b524048c2b37c669f275837a99381fa77f882cfbc2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663070ecf7cc85144673b207ee9a47874207daa4bf8a066372efbb +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=1e9a2da1ec0430295c3b8b7e1888bcb09293f61e62dfbdb29707348a95bdce292304418a554352333e6b377871f2d1e8d97a14c5bf5c035f4991b48c2c8ad26971d51de56abfc8ef0295 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9307b428397906f7e529cf6dd1bdf53f782a88f89a250c18dc83d57c9992dd +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8b1a7574e6cee466e01ba7f20e6cf372188b6294b43823ebc4c4c8a753b6e0 + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ceaaefa2a1d4a51bc7f72a564d71bc35 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=830ff5384b15750877d9469ab3b96e768a5e2fb618f00ca1e32da37d165221 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=832c1dca2a6b7c02b170c8d8cdec75e14983c8eae7ce6a07cc3392853455a9 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f70fa944b4bcd3d0d716f20a1eb95435666a15bb48ee700b648d33cef9f93019e0f8047ef1c51f2a5ff1cd3bcd30b6721663f533a5f40592962147438962718 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662ee035a51c82be8d63659f7a3dcb7efb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76707435fd3a637b4f9628bed8250d212f363d49580ee23c3edb82bc538cd2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afb8fe565768ec14254b79c64316cdd3895062d4533d37634fa8f3f273cb3 + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e8e12229cd4637c3412fe01f0b06cbbed1697731baf0add84a48598d80045cf16f2a56cf605314390dbffd940401319897aa7f01a4e35a1fe1e509be03f8d287 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660244d36287cc5719d495d63952e4bb9b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=781eb466f56d8404382803362e53dbfeab396f39e8614f70fd644325ce1803 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=86bfba9287f9d6663701546e14ccbad7b7e24be798aaf3f43a36a855d7ca62 + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541af3a1c3bc570ea6628903b6958854f3ccf77420136473d50d9ec58570d6ad5c4e176ab1a556abfa6141ec06d5ebe92ae95582f12402263635e5ddc2ab70d6d2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846620e5ec2a4f6ef544a3d54fa9185006e1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce130309e71e17105be8aa8b21f6f46258b99dae8d8818db759ea80677f64d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f2a1afcbfd92475f02b92eed96533323b3771c0c9833bbd87dd84373a89bc + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661df866ef53fc2daf09cd18e25f560f54e710d97f93f341248ad1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=830ff5384b15750877d9469ab3b96e768a5e2fb618f00ca1e32da37d165221 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=832c1dca2a6b7c02b170c8d8cdec75e14983c8eae7ce6a07cc3392853455a9 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f70fa944b4bcd3d0d716f20a1eb95435666a15bb48ee700b648d33cef9f93019e0f8047ef1c51f2a5ff1cd3bcd30b673d3b9677d899fc7f3d4b1258c0ff0ec33195ae6869722122a130 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466511d7d7f1904de2a67a43753ae73743bfca8e1aac9dfacb410ed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76707435fd3a637b4f9628bed8250d212f363d49580ee23c3edb82bc538cd2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afb8fe565768ec14254b79c64316cdd3895062d4533d37634fa8f3f273cb3 + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e8e12229cd4637c3412fe01f0b06cbbed1697731baf0add84a48598d80045cf16f2a56cf605314390dbffd9404013198a9436856dc49b27a0698cb3ff57e3a14cbb3a80397fc12b67135 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846694b4c5866a584c0a70d8bee74ef35f21d601f7d4b9699b0a2c67 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=781eb466f56d8404382803362e53dbfeab396f39e8614f70fd644325ce1803 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=86bfba9287f9d6663701546e14ccbad7b7e24be798aaf3f43a36a855d7ca62 + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541af3a1c3bc570ea6628903b6958854f3ccf77420136473d50d9ec58570d6ad5c4e176ab1a556abfa6141ec06d5ebe92ae3533b3481ea038673f4428b39a64a07fc333516e98346439cd0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846603fa37b0787d046e5b39334226f42b1c63b64cb45dd4a9b095eb +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce130309e71e17105be8aa8b21f6f46258b99dae8d8818db759ea80677f64d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f2a1afcbfd92475f02b92eed96533323b3771c0c9833bbd87dd84373a89bc + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666660569f7c7fcd07d8e9d1a7c3634f60 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=830ff5384b15750877d9469ab3b96e768a5e2fb618f00ca1e32da37d165221 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=832c1dca2a6b7c02b170c8d8cdec75e14983c8eae7ce6a07cc3392853455a9 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f70fa944b4bcd3d0d716f20a1eb95435666a15bb48ee700b648d33cef9f930187a4370f2d9e5767873b7171e38897f591b606a1131011cee4173a3db7e22891 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f48a955b0b5cd099e7df95661e2862ad +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76707435fd3a637b4f9628bed8250d212f363d49580ee23c3edb82bc538cd2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afb8fe565768ec14254b79c64316cdd3895062d4533d37634fa8f3f273cb3 + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e8e12229cd4637c3412fe01f0b06cbbed1697731baf0add84a48598d80045cf11aaf3ee7de388d106596fdd48f72dd649b6b876b67bb13aeba09c64daf11ecd1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466060c96c5c428dca80c960fe9dd5a6ca8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=781eb466f56d8404382803362e53dbfeab396f39e8614f70fd644325ce1803 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=86bfba9287f9d6663701546e14ccbad7b7e24be798aaf3f43a36a855d7ca62 + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541af3a1c3bc570ea6628903b6958854f3ccf77420136473d50d9ec58570d6ad5cc18eb20f16747975cab6ac45d73488d66cc7b0294a6220498d30ba8bcf4f3952 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846644c3cae20a10acfac961f89a75b787df +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce130309e71e17105be8aa8b21f6f46258b99dae8d8818db759ea80677f64d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f2a1afcbfd92475f02b92eed96533323b3771c0c9833bbd87dd84373a89bc + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661df866ef53fc2daf09cdb07952c281cdcc4480337d476e359f64 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=830ff5384b15750877d9469ab3b96e768a5e2fb618f00ca1e32da37d165221 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=832c1dca2a6b7c02b170c8d8cdec75e14983c8eae7ce6a07cc3392853455a9 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f70fa944b4bcd3d0d716f20a1eb95435666a15bb48ee700b648d33cef9f930187a4370f2d9e5767873b7171e38897f53d3b9677d899fc7f3d4b2a7f9618049af0a0133f690fec587926 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466511d7d7f1904de2a67a437e109b3089a6a3efa6d5fe753113a09 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=76707435fd3a637b4f9628bed8250d212f363d49580ee23c3edb82bc538cd2 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5afb8fe565768ec14254b79c64316cdd3895062d4533d37634fa8f3f273cb3 + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e8e12229cd4637c3412fe01f0b06cbbed1697731baf0add84a48598d80045cf11aaf3ee7de388d106596fdd48f72dd64a9436856dc49b27a0698e39b1a331575f7dbc783c4b27db56d56 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846694b4c5866a584c0a70d80f9608c9ab477dd6be32ca78b3452e7a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=781eb466f56d8404382803362e53dbfeab396f39e8614f70fd644325ce1803 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=86bfba9287f9d6663701546e14ccbad7b7e24be798aaf3f43a36a855d7ca62 + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541af3a1c3bc570ea6628903b6958854f3ccf77420136473d50d9ec58570d6ad5cc18eb20f16747975cab6ac45d73488d6e3533b3481ea038673f4bae24ae04bf0f379985ae3359e56cf1d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846603fa37b0787d046e5b39156540f78e37ab584d177787c7570713 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ce130309e71e17105be8aa8b21f6f46258b99dae8d8818db759ea80677f64d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4f2a1afcbfd92475f02b92eed96533323b3771c0c9833bbd87dd84373a89bc + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a8121f6d88933f372d3d8558ba96c6a0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660b117a47d5ea6ba03a4e8a00f4bc0e88 +msg_2_payload= +msg_2_ciphertext=2a607b984bb2614e9c6b84c0a735f9cd1e4bf3ff01edf33d6626f16ac1f12f0c5230239edb11e337d70427365bb94949ce7fda351e4f8ca43da1e91c0559d921 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=af719ddf29a7df759e00d10bf397d6e72d961dfa146e38a48e8856747db349 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=01cb205a382fe3800d1194755b30433dc1250c4e9ab65581919777e1e31862 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e5f2f445afe0d790bd2631a553574915 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846641ccb8f7db404e7089382d696e3f2043 +msg_2_payload= +msg_2_ciphertext=10fd75cdb4d7a71ef3d8713d7d3ee0fe77eefaac88a1cc0e8fb1c8598830a26ca429ae726b1c48e9af560b971005eccd788717c413004ef0a0fc54b26fc39d72 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6c00201f24d7406b7a41e346011509fc9726bf3cd3fcb0099f893241f292a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4385be501f1af8ec43aeb67163036606dba4b666f59e77f89ce03b86efaf3a + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543336582f35b4811afc0009c5bfe23fb6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f0b2cda351a7491a1a8d233f694a900f +msg_2_payload= +msg_2_ciphertext=d9ecc3d1ca57c998fe713d129c081b9b8ad9ce9a519179902a57600b30ce6f5cd976176cc09af329cc934132ef8e22b2ad160e39304ec60451a20c5d535db720 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd90a09b18aca3fb4322a97ba23a61973ef7a0617af12ac48a9a1ce3a59cdc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b139c0e387155e21af5751ced5df67d118e4ec857c5aad862bc90a024853bc + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545a532081892316ccc914c1f41b95fd32 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846620d7abc3c895614c290126a72d27e586 +msg_2_payload= +msg_2_ciphertext=d3a8c16bc7ec7a53b13ed69e7307bfedb166350efaafad356bbe13865f8305b4271fa9f8941fbb5227e2e99ca7272ad4cf688f2a831138f199cfd07f2048b360 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8b8306bca22f2ba97f257b5658a95c6c17aeb73208ac47adb53e6f34f32dda +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3ccc1f6d694e1f807baa7077c3917823fd3d5d0c1acb9a819dc2ecea0740d3 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467ece9526c5e98a95ef06540641ce080 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846669b9f0e8b083bd61a6ee3c2d1376b7ce +msg_2_payload= +msg_2_ciphertext=cb86a2b771eb68b697b00603224426b59b2e4cc522c385955fe80b89936fdc879d6ceedd6144d1f246e83474db6628e531eef9b73bece378cef0d0783c520c44 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9961ea7152c68324f433f74f14cf453872f922c078365f6eb72d1eaab869ed +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57c5a35b57323a4841a2535029c297d298028e10e798e0fbcca41110ff6bc1 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6cb6fe7e80444bb3154cc8c6ee7d1303de77495fc986b7ede43 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846671a438132a5b2eb4b6a07e26cde62f24cc303c50baebbc111c88 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2a607b984bb2614e9c6b84c0a735f9cd1e4bf3ff01edf33d6626f16ac1f12f0cbae76bfc135b5828a7ff27f023ea59cc8dc0802c5d9d369d77f4bcf1bdd8a6c3205c28db784528897fcc +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=af719ddf29a7df759e00d10bf397d6e72d961dfa146e38a48e8856747db349 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=01cb205a382fe3800d1194755b30433dc1250c4e9ab65581919777e1e31862 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b45ff089253cdcc224ba73eab621cc196ddf50935e457ea5640 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667d787668fb251e9de3b703c7a10f7f6541db12cfde30137eb731 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=10fd75cdb4d7a71ef3d8713d7d3ee0fe77eefaac88a1cc0e8fb1c8598830a26c3a7a94677b6f6971a918b1f6142f0f8add5ea9a3086edd1694264640113dafd9941831d9f8e59458af6c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6c00201f24d7406b7a41e346011509fc9726bf3cd3fcb0099f893241f292a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4385be501f1af8ec43aeb67163036606dba4b666f59e77f89ce03b86efaf3a + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f7aa65da5c5393de3c5535e15dbfb46a665260e9f00887efb923 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466578656f83336512ba12d91d1410dee12011adad4e28674496199 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d9ecc3d1ca57c998fe713d129c081b9b8ad9ce9a519179902a57600b30ce6f5c761b50e9f3ba0c4d57466b8b7f36c21246578936ef0f0cde78ec9962c6dc167becb1bb4943c865e84f44 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd90a09b18aca3fb4322a97ba23a61973ef7a0617af12ac48a9a1ce3a59cdc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b139c0e387155e21af5751ced5df67d118e4ec857c5aad862bc90a024853bc + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540e6f56acb931ce6a0d25e1f25351be198ed759a1ef122e6a47c5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc88a17b8b5854bac07fd6b2a163ca81ce377f77ed9a6565f2ff +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d3a8c16bc7ec7a53b13ed69e7307bfedb166350efaafad356bbe13865f8305b479ef186dc0bf7da9b3969fc460549a4f75ef7aedc759cb34d7baf24c96274d5de3ea057059bf346967bb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8b8306bca22f2ba97f257b5658a95c6c17aeb73208ac47adb53e6f34f32dda +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3ccc1f6d694e1f807baa7077c3917823fd3d5d0c1acb9a819dc2ecea0740d3 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ef3e6a97158d33a0e062f662ee40189264748f8f4669b195157a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e69d80c877ed191a57840a873d4d140ed15adb13fc5e0faceae5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=cb86a2b771eb68b697b00603224426b59b2e4cc522c385955fe80b89936fdc8768b3221f7eb3474b3a397b412566a083eae667065d5d8520f96dc500ef05901b2c97eb3e257b5b641688 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9961ea7152c68324f433f74f14cf453872f922c078365f6eb72d1eaab869ed +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57c5a35b57323a4841a2535029c297d298028e10e798e0fbcca41110ff6bc1 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254956f94f7a6fcc381776893a9419a1391 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662dcab0911950a5414c1739ef201b0d59 +msg_2_payload= +msg_2_ciphertext=2a607b984bb2614e9c6b84c0a735f9cd1e4bf3ff01edf33d6626f16ac1f12f0ce46707d4054136e38d139c40429a1c7bdfe2618fcd66e1d1c993a5d724149ad3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=af719ddf29a7df759e00d10bf397d6e72d961dfa146e38a48e8856747db349 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=01cb205a382fe3800d1194755b30433dc1250c4e9ab65581919777e1e31862 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625480f041b1faae93dc9ad4e24164074a72 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466049ae30e300696665182cd0c2c5a3333 +msg_2_payload= +msg_2_ciphertext=10fd75cdb4d7a71ef3d8713d7d3ee0fe77eefaac88a1cc0e8fb1c8598830a26c27529778073a3c1eca1366f61e1e6df01f4c362cabd86d507f717372d3b42cde +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6c00201f24d7406b7a41e346011509fc9726bf3cd3fcb0099f893241f292a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4385be501f1af8ec43aeb67163036606dba4b666f59e77f89ce03b86efaf3a + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625459b3fc3e146bee1bedd48d2e529619c9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d8091dc1177e44919beeef55f461c8f5 +msg_2_payload= +msg_2_ciphertext=d9ecc3d1ca57c998fe713d129c081b9b8ad9ce9a519179902a57600b30ce6f5c82a04833784ccfb5e9722ca5241a6755c3cbc5f3606b84da1baa6576e7b927d8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd90a09b18aca3fb4322a97ba23a61973ef7a0617af12ac48a9a1ce3a59cdc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b139c0e387155e21af5751ced5df67d118e4ec857c5aad862bc90a024853bc + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254de5fed603c0f5e7048cde4754accb939 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664a79bd841524585be070029e87cf5b17 +msg_2_payload= +msg_2_ciphertext=d3a8c16bc7ec7a53b13ed69e7307bfedb166350efaafad356bbe13865f8305b4c5551963da60c1367a4ddb92d1aeebab7f9e1068c5b07e44cd6de3b644761c55 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8b8306bca22f2ba97f257b5658a95c6c17aeb73208ac47adb53e6f34f32dda +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3ccc1f6d694e1f807baa7077c3917823fd3d5d0c1acb9a819dc2ecea0740d3 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a20106c4f0d2e1d15b488b9120d587a7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664cb1d6364acf843b72742c6e40fb7816 +msg_2_payload= +msg_2_ciphertext=cb86a2b771eb68b697b00603224426b59b2e4cc522c385955fe80b89936fdc876f2d10e9970e2e2a05abf249856727901c01817fcd79e7bb15ca824f74e20dbb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9961ea7152c68324f433f74f14cf453872f922c078365f6eb72d1eaab869ed +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57c5a35b57323a4841a2535029c297d298028e10e798e0fbcca41110ff6bc1 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f6cb6fe7e80444bb315499a7f5f08590af0d50a5359f99e54dbe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846671a438132a5b2eb4b6a09e2096243969b42b4b9a198dc894d2e9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2a607b984bb2614e9c6b84c0a735f9cd1e4bf3ff01edf33d6626f16ac1f12f0c0912c9cd375503ce9e805b172ad0d4698dc0802c5d9d369d77f4ade77f73640bd9d60f3899f36dfde35b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=af719ddf29a7df759e00d10bf397d6e72d961dfa146e38a48e8856747db349 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=01cb205a382fe3800d1194755b30433dc1250c4e9ab65581919777e1e31862 + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b45ff089253cdcc224b4eb91d5554d75cc6efe1975d9068377a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667d787668fb251e9de3b7940a90cd22958f5cbf27ca154b6b22de +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=10fd75cdb4d7a71ef3d8713d7d3ee0fe77eefaac88a1cc0e8fb1c8598830a26ceb2af92575fa2c196715cdff6e5a2bd2dd5ea9a3086edd169426bb9c6f9f3ef69ab1bca891788d793838 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6c00201f24d7406b7a41e346011509fc9726bf3cd3fcb0099f893241f292a5 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=4385be501f1af8ec43aeb67163036606dba4b666f59e77f89ce03b86efaf3a + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f7aa65da5c5393de3c5548df4e50beec4d5d686ea0a58b5d7c07 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466578656f83336512ba12ddb9299155eb66d8b8c563c46b2650045 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d9ecc3d1ca57c998fe713d129c081b9b8ad9ce9a519179902a57600b30ce6f5c7c893705678fdd420468b74e00732ced46578936ef0f0cde78ec005dc5d6cedeee43ee05dcddc151e174 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd90a09b18aca3fb4322a97ba23a61973ef7a0617af12ac48a9a1ce3a59cdc +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b139c0e387155e21af5751ced5df67d118e4ec857c5aad862bc90a024853bc + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540e6f56acb931ce6a0d25a7d58f03a624f2edffe6889a3cc1bdb4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bc88a17b8b5854bac07f57eb97d0e6556bd36bf0765632a4a0d9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=d3a8c16bc7ec7a53b13ed69e7307bfedb166350efaafad356bbe13865f8305b495169d8ddfd2ce2b08da7fb2185ad2f975ef7aedc759cb34d7ba5b6a6521406803adf71d8e3f467e6b5e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=8b8306bca22f2ba97f257b5658a95c6c17aeb73208ac47adb53e6f34f32dda +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3ccc1f6d694e1f807baa7077c3917823fd3d5d0c1acb9a819dc2ecea0740d3 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ef3e6a97158d33a0e062dfd67d4d95e6b70c838462a3c8f93c11 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e69d80c877ed191a5784108e0821d062d135c79ecd1e1d32e495 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=cb86a2b771eb68b697b00603224426b59b2e4cc522c385955fe80b89936fdc879e3d3e2544d69c1bfcb5c318fcadaf1beae667065d5d8520f96da952f2d9dd6784e56b3af33f9e2f6a7d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9961ea7152c68324f433f74f14cf453872f922c078365f6eb72d1eaab869ed +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=57c5a35b57323a4841a2535029c297d298028e10e798e0fbcca41110ff6bc1 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471316e70ec2670fe80a4529101864a5dac3d5f9c0924e8d38cecd60c54adbaa284b6111d7779c4ee7bb9c56da492e5a80972d99ccbf7d9068e6e90a7a73a01e9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666953a0bb0be9e3cb75769d93c5a16090 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dc52cf04c64e4b750c00444789e41cb1abe496381a2d1b42303b231e809437 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4e39fa2317aba599efd3f7a7ca1de12dfae13bc630cc8768ce6326894fb250 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a773d92dab8d730d4809faed6fbf25151dc4609a2020980934c02fa2026e50395c19e290fc2b0ebd1926e25516eaa74382fef41e27d86725aac235f5ec54486 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c6f4245d9e5b32e9e357b2b8858590d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=186910b9f7f96154beaaa85cd7bc247243468524c12329a05a42ca5a36c68f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cd2f07315236b6e428120a37bbfaab7b1c58f4d55a2242e02c6e7bb943500b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d9201affcf03e61b649d92ff393eb2ee186823f5369731162b2f772cfc6371bcbe8d7e19394282f1efe8a67e2b8322dbcac776930e9ed0a112705ef2f6f2fb6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846645235dc77860e6902834d55b53616e13 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c64fdb57aa336721d15fb7ab26fe477cda48a1bf9e0ad3bc4cd554b0740b7e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7601a7f5ac11f9241580f13b13d47a05b9e0ac4a31aa9229b455d6850f6f4 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b62f8e1b309574de35d98d9a4088e6919c1849b2c5254dcbca5494537cb4a72988a30055e89f105e4a2ec94ffe1e01b210d70746671e7bffca493129849aeff4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466aa41d4650249b9c0c26cbc1ce87e8c1f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4c177d26066f6951689eeb7dba6199b0a71514482d9fd58cab9c9da5ebe95 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=15e2992826a7c63bdc9c36c422f0625aa3cddb283aaf9aea44444d8ffdbe82 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471316e70ec2670fe80a4529101864a5dac3d5f9c0924e8d38cecd60c54adbaa284b6111d7779c4ee7bb9c56da492e5a86e5ed547305fd8e63d0c6f2932f3a5c642bda3b85699cfd4af02 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0981ce42d3aee24e400cc2d7c0851db983a76950d68ac02018e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dc52cf04c64e4b750c00444789e41cb1abe496381a2d1b42303b231e809437 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4e39fa2317aba599efd3f7a7ca1de12dfae13bc630cc8768ce6326894fb250 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a773d92dab8d730d4809faed6fbf25151dc4609a2020980934c02fa2026e50395c19e290fc2b0ebd1926e25516eaa74a8c2db362d37b8bd047718944128a324cc8464b8770aa0edb54d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa4432021f183c112445ce9dd4839730062f80545088527f6ab7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=186910b9f7f96154beaaa85cd7bc247243468524c12329a05a42ca5a36c68f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cd2f07315236b6e428120a37bbfaab7b1c58f4d55a2242e02c6e7bb943500b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d9201affcf03e61b649d92ff393eb2ee186823f5369731162b2f772cfc6371bcbe8d7e19394282f1efe8a67e2b8322d2307641fa5171d2e6a90b7327908bd3a4c0ba2647c9fbf326342 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6777d6ce0d20a6334912c2cce256a5baafbb4981cb3b57e2b7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c64fdb57aa336721d15fb7ab26fe477cda48a1bf9e0ad3bc4cd554b0740b7e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7601a7f5ac11f9241580f13b13d47a05b9e0ac4a31aa9229b455d6850f6f4 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b62f8e1b309574de35d98d9a4088e6919c1849b2c5254dcbca5494537cb4a72988a30055e89f105e4a2ec94ffe1e01b2e07148a37250771da813ab2d25f8ebfd885dbf1a2d381a28b36e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846655590e80a4cbf7b11a80ddd081ca9aca27a45d1ad37939362f98 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4c177d26066f6951689eeb7dba6199b0a71514482d9fd58cab9c9da5ebe95 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=15e2992826a7c63bdc9c36c422f0625aa3cddb283aaf9aea44444d8ffdbe82 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471316e70ec2670fe80a4529101864a5dac3d5f9c0924e8d38cecd60c54adbaa2f602a28ed62afc1421fb6217fa8bb34ec2ffe02e3cde39a920ebf369ebc4d7e2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662b2ab0ecf235887681b76ad519b29032 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dc52cf04c64e4b750c00444789e41cb1abe496381a2d1b42303b231e809437 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4e39fa2317aba599efd3f7a7ca1de12dfae13bc630cc8768ce6326894fb250 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a773d92dab8d730d4809faed6fbf25151dc4609a2020980934c02fa2026e5035a6b8c83d8d35b4be37728726934df7fa54ca976c7ac99763b5b503dedabf110 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c2bd068de83287251c4332dfaf109e3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=186910b9f7f96154beaaa85cd7bc247243468524c12329a05a42ca5a36c68f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cd2f07315236b6e428120a37bbfaab7b1c58f4d55a2242e02c6e7bb943500b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d9201affcf03e61b649d92ff393eb2ee186823f5369731162b2f772cfc6371b56d4c205efdaadafe7ad43991634897df8a65cce5462ff5edf7a3cb303d23cb5 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1bd3e2fdbb59170ea903582e5173315 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c64fdb57aa336721d15fb7ab26fe477cda48a1bf9e0ad3bc4cd554b0740b7e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7601a7f5ac11f9241580f13b13d47a05b9e0ac4a31aa9229b455d6850f6f4 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b62f8e1b309574de35d98d9a4088e6919c1849b2c5254dcbca5494537cb4a7295084dc6a278b90d5443be18249717177d5e8e7d7aa1d5047cac7e122ceb801eb +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667276e5a1b63d8f369009fcbf44acc6b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4c177d26066f6951689eeb7dba6199b0a71514482d9fd58cab9c9da5ebe95 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=15e2992826a7c63bdc9c36c422f0625aa3cddb283aaf9aea44444d8ffdbe82 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625471316e70ec2670fe80a4529101864a5dac3d5f9c0924e8d38cecd60c54adbaa2f602a28ed62afc1421fb6217fa8bb34e6e5ed547305fd8e63d0c7272edad8555d9482a258f9fcd94b9b2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0981ce42d3aee24e4004d6ea9acd8a847242a19f3f0f4cb0976 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=dc52cf04c64e4b750c00444789e41cb1abe496381a2d1b42303b231e809437 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4e39fa2317aba599efd3f7a7ca1de12dfae13bc630cc8768ce6326894fb250 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548a773d92dab8d730d4809faed6fbf25151dc4609a2020980934c02fa2026e5035a6b8c83d8d35b4be37728726934df7fa8c2db362d37b8bd047781dee28aded1f414d2c10d890fa2eba1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fa4432021f183c112445d6ff055cdbdc1b47a925e1550a0242a2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=186910b9f7f96154beaaa85cd7bc247243468524c12329a05a42ca5a36c68f +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=cd2f07315236b6e428120a37bbfaab7b1c58f4d55a2242e02c6e7bb943500b + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d9201affcf03e61b649d92ff393eb2ee186823f5369731162b2f772cfc6371b56d4c205efdaadafe7ad43991634897d2307641fa5171d2e6a90d2f10229135bee69c5e8987beeaff24e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6777d6ce0d20a633491e32380e0bba416095b23e6c06497fd0c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c64fdb57aa336721d15fb7ab26fe477cda48a1bf9e0ad3bc4cd554b0740b7e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7601a7f5ac11f9241580f13b13d47a05b9e0ac4a31aa9229b455d6850f6f4 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b62f8e1b309574de35d98d9a4088e6919c1849b2c5254dcbca5494537cb4a7295084dc6a278b90d5443be18249717177e07148a37250771da813c0db249d31475e830bbcc50ce9aeab43 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846655590e80a4cbf7b11a803755ea3f2276bcb10438d218a79e05cf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f4c177d26066f6951689eeb7dba6199b0a71514482d9fd58cab9c9da5ebe95 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=15e2992826a7c63bdc9c36c422f0625aa3cddb283aaf9aea44444d8ffdbe82 + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0b018e349141e1b16c68fe9a6cb1183c260c44bb83c93a140953ad45612b8c64bb3b17125ca3fb8cf0cd955affd684b70d7a73e49f11219837f16d3f7544832 +msg_2_payload= +msg_2_ciphertext=b4c5f23f127237b5a80ac12f3a3548fe46c39172f6b180eb1e023e6e19e283eeb2c9403c731010215a57c3149b0f7aaec1f10503228b36cd1662e940ecc38fd5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=adcafe99678efda6f3d8c84a8fd41a63bb2cfc85aa6eb8ff3dbf724496b03e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=51d5c55fb055dc171c4bf7618270e30b393601f44f3a0abd7c276b63093c1a + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e89ad728d1b3555e8affba774c455ecf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466def8302a4ce14b6d8679764f5605d198853b8968688d7432e591c0371dbd9c271e7509b3366c251d193c2b6173162f24bfb214c9912e36dbc2bebcd0c5a41310 +msg_2_payload= +msg_2_ciphertext=7ae518aa6a3882fac6b6d6fcd88954cccf404ea1aa2a075d533916de39720ebbd5a2fc7c5df275e6d9ac02a752f651f67f737345e8c1310db32861d8fb0233f9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd0638db68611323934a1dc1c26175ddc9abfbf887629ce59b4303156bcaa1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3d9c9f74481ef29d381234288ecb1d26afa997692fff8407cbf6da726a5725 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fa223f36e9139a40a9551700c5636675 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ce56429bffb894f3369b30a544d455d8f184f93f9c842bbe985dde8e576dd8eed8438aa1768e3aa2b4ad1bebf0a92b156771c02032ed9387687cca42cb786162 +msg_2_payload= +msg_2_ciphertext=4897d20141b9271678aeff91ee7005ca77d69a228f23d79eb6ac67cecef3224f6f88b8b1d486e5d50a397d526deb513cf18ed7a50ff9722cef519cfdd08f2ed8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=4c7e74911721ae8c0678065a0f6ad8fb1297a21f6754b38e266eee19d0ad2a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=475800d09b8bf0421df0e7679d3cd21b814fd6dff0fb9c46dbc5376c6122e4 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a0282a4879cb0deb654bdede7e9be90b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661e036fa970ffb21503a0108b83c0bd72003bb6d4a97179484514ff7ef45ec9eb9bdbfd37a4b660583fab7b211f1b3503b00b5e97afc5b32665b370e6478b524d +msg_2_payload= +msg_2_ciphertext=94ed14201939c7bb4572b20adf4082cd6bb82f70f3c8de3316bc33f5eae48cd9ddd25dc1383725178c8598f5fba81ebb96531a3239965542dbb5b6788e6c69ff +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86774279eb88fc06ae6805d0b449a143cdfe04a11fc7a429277b968cabe3bf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1f80227766841582344bc541607b227d94329c13eacc906aa8d505877ba86 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254813e50d4de1a8d4e0d61efe2041f7ca6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f05a4cb6e4cb79e094bd585a0b9fbc734db005568fc515c58c9fde6291e3e29220fbe03545fe15b4e8e1acca1559b4b2de52d9ae55517db0f969b67cfd1a046a +msg_2_payload= +msg_2_ciphertext=8651088810f5c175e542fa61507d8cfac7670c9c1f1e3eb7c8fcfa1e632b0d466be2a1a293e4da8f69787704224eafe4849020203ee23d283e335821b48f1adf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ff43d872c9028bdb9c54fa2c87bf427cd7fdf53b281d89649f183629b8f2e9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=50ca5d06223b9346bc628ee151bf174732e4afc56fe3fca4baff4173abe983 + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0b018e349141e1b16c68fe9a6cb1183c260c44bb83c93a140953ad45612b8c6c9a7ce6964ece59add85b2606ced1d6d19d85b03583048e0c2c9a492b15d90479c7b9af68fb1a47696d5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b4c5f23f127237b5a80ac12f3a3548fe46c39172f6b180eb1e023e6e19e283eec8b71c2ce9c0e29ca1766034c2c8feb14cb940f335a08c03246384d70b9a8ae83fd96cea468098f1f8d9 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=adcafe99678efda6f3d8c84a8fd41a63bb2cfc85aa6eb8ff3dbf724496b03e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=51d5c55fb055dc171c4bf7618270e30b393601f44f3a0abd7c276b63093c1a + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541fe2db7a97bbe9c0027b7090cb11725f0947318b6d1f1ad08ce7 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466def8302a4ce14b6d8679764f5605d198853b8968688d7432e591c0371dbd9c27e50840bb3f7e4c87ca8f5414ba3078aa5c032641bc1cdaccd5aa58bfd328b2972ff47f99ced9a6b7aef3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7ae518aa6a3882fac6b6d6fcd88954cccf404ea1aa2a075d533916de39720ebb186eba1bc5bdad09bcab5739864ca692519efda7f74013ae0602622d1accdeb04f261e1eb1ada91b5a00 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd0638db68611323934a1dc1c26175ddc9abfbf887629ce59b4303156bcaa1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3d9c9f74481ef29d381234288ecb1d26afa997692fff8407cbf6da726a5725 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625483cfed638fb3c56f6e445c3225fd44968f7a179313516eb5c1a9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ce56429bffb894f3369b30a544d455d8f184f93f9c842bbe985dde8e576dd8eef9072a865ec6acd45a95e6d5699cf88ab1adaf886733195012b10e6cd5389e4046ec7b8620170cceaf17 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4897d20141b9271678aeff91ee7005ca77d69a228f23d79eb6ac67cecef3224f04191a5af016de4910629179a06d26cadb2c8b23157b86216ebf371933ed5d042b8b69d9b202f343b7c2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=4c7e74911721ae8c0678065a0f6ad8fb1297a21f6754b38e266eee19d0ad2a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=475800d09b8bf0421df0e7679d3cd21b814fd6dff0fb9c46dbc5376c6122e4 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540f55bdaaa880fc12facbe60813c0db272c15e442ff0938e3533a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661e036fa970ffb21503a0108b83c0bd72003bb6d4a97179484514ff7ef45ec9eb2c798e8efacdd62b6bf5244df69c8c3aa2494f38471537cc5d6b6504593989137c09964cbdfe9eb3d3e9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=94ed14201939c7bb4572b20adf4082cd6bb82f70f3c8de3316bc33f5eae48cd99924bd9d5a06fe3a5583f3a383313d93e7a7158f06660cce13843fa445d1bf333858f033b9294adcacf0 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86774279eb88fc06ae6805d0b449a143cdfe04a11fc7a429277b968cabe3bf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1f80227766841582344bc541607b227d94329c13eacc906aa8d505877ba86 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541bb344a916e3fe400ded24cb3fa734c93f22004e92da97dbce1d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f05a4cb6e4cb79e094bd585a0b9fbc734db005568fc515c58c9fde6291e3e2928d5c8ea8af6ef701c52ab3e57ada1d472451c80484377ba18cd7418f721d9d21744f1ad65da0279a66fb +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8651088810f5c175e542fa61507d8cfac7670c9c1f1e3eb7c8fcfa1e632b0d4638dea852a90ce28331a393758df509cdfaeeeceaa062fd82e223c30f70e0e273f7d7dbf386acf966ddf8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ff43d872c9028bdb9c54fa2c87bf427cd7fdf53b281d89649f183629b8f2e9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=50ca5d06223b9346bc628ee151bf174732e4afc56fe3fca4baff4173abe983 + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0b018e349141e1b16c68fe9a6cb1183c260c44bb83c93a140953ad45612b8c67f6ad77fe0172d65f35620f8d6f0b8db7eaf545a402e665786d189c5c7e2bef0 +msg_2_payload= +msg_2_ciphertext=b4c5f23f127237b5a80ac12f3a3548fe46c39172f6b180eb1e023e6e19e283eed57a951543a0ab0645958f932e50a2743423286e6494f7c453bed71b63a1bb91 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=adcafe99678efda6f3d8c84a8fd41a63bb2cfc85aa6eb8ff3dbf724496b03e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=51d5c55fb055dc171c4bf7618270e30b393601f44f3a0abd7c276b63093c1a + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254daabd705d9da7c80c426df55902fb9cc +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466def8302a4ce14b6d8679764f5605d198853b8968688d7432e591c0371dbd9c27c142d82a45eca7997eeec4e81381209cd1cc75dc52230a6ad5dc90432748d6df +msg_2_payload= +msg_2_ciphertext=7ae518aa6a3882fac6b6d6fcd88954cccf404ea1aa2a075d533916de39720ebb5a679823352dc4b0bbbb47c9dc418fbf6185f09c57410138d19557733bdfd046 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd0638db68611323934a1dc1c26175ddc9abfbf887629ce59b4303156bcaa1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3d9c9f74481ef29d381234288ecb1d26afa997692fff8407cbf6da726a5725 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546693cc146b829f659b3a3a6f36062417 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ce56429bffb894f3369b30a544d455d8f184f93f9c842bbe985dde8e576dd8eee6e90c6418f739bec226dd5fa5dcd4cc0f4524e463ccf85bcef7c086833474b4 +msg_2_payload= +msg_2_ciphertext=4897d20141b9271678aeff91ee7005ca77d69a228f23d79eb6ac67cecef3224fce9e99b2d8ffbd7aec4d8c8df6c5a172de9a9714a6af6b1234f1620b8645e579 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=4c7e74911721ae8c0678065a0f6ad8fb1297a21f6754b38e266eee19d0ad2a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=475800d09b8bf0421df0e7679d3cd21b814fd6dff0fb9c46dbc5376c6122e4 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254774c69f7d11f794ed54a4bf91f16fd2d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661e036fa970ffb21503a0108b83c0bd72003bb6d4a97179484514ff7ef45ec9eb96af227896014838fc1945263ff54bd5375932b16efea120c62ed8a315420f6c +msg_2_payload= +msg_2_ciphertext=94ed14201939c7bb4572b20adf4082cd6bb82f70f3c8de3316bc33f5eae48cd9e6d85d2c7f133960dc1f8e448a65d585cea1481e2d35d543ea5429a592eabe47 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86774279eb88fc06ae6805d0b449a143cdfe04a11fc7a429277b968cabe3bf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1f80227766841582344bc541607b227d94329c13eacc906aa8d505877ba86 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c21324e86ac7d65b7dc06cf3b651e32 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f05a4cb6e4cb79e094bd585a0b9fbc734db005568fc515c58c9fde6291e3e292a276b6138dab236a57f9a781388562c174bef9f634ada92d349e837ac7ccd978 +msg_2_payload= +msg_2_ciphertext=8651088810f5c175e542fa61507d8cfac7670c9c1f1e3eb7c8fcfa1e632b0d46bb08fbcd509f32a5dfabbf43a22dbc5e5002092ca11ba0dddc4faedad0330f85 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ff43d872c9028bdb9c54fa2c87bf427cd7fdf53b281d89649f183629b8f2e9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=50ca5d06223b9346bc628ee151bf174732e4afc56fe3fca4baff4173abe983 + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b0b018e349141e1b16c68fe9a6cb1183c260c44bb83c93a140953ad45612b8c682f5a2957440f5f83a39a24e5cb2627919d85b03583048e0c2c936d254bb86813590fe0b415b3271c451 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=b4c5f23f127237b5a80ac12f3a3548fe46c39172f6b180eb1e023e6e19e283eee243c226bfded175cebcfe8ec14f27024cb940f335a08c032463eeca3f18039cd75586b07daff31c4dff +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=adcafe99678efda6f3d8c84a8fd41a63bb2cfc85aa6eb8ff3dbf724496b03e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=51d5c55fb055dc171c4bf7618270e30b393601f44f3a0abd7c276b63093c1a + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541fe2db7a97bbe9c0027b1f62071910cfd2266573bb14a7de4342 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466def8302a4ce14b6d8679764f5605d198853b8968688d7432e591c0371dbd9c27c0e397d4a328006c00af1dc428f95bc55c032641bc1cdaccd5aae41c3d70b1d39ac256cf6c07a7430831 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7ae518aa6a3882fac6b6d6fcd88954cccf404ea1aa2a075d533916de39720ebb1eaeb854d104e73a1406c7ff4ad6beed519efda7f74013ae060269ba43ed1a294c9c44cff50595ad1324 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=fd0638db68611323934a1dc1c26175ddc9abfbf887629ce59b4303156bcaa1 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=3d9c9f74481ef29d381234288ecb1d26afa997692fff8407cbf6da726a5725 + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625483cfed638fb3c56f6e443f8097c23fee7a3b76149d56e41918a5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ce56429bffb894f3369b30a544d455d8f184f93f9c842bbe985dde8e576dd8ee8ca69106df75e49f29eaae67fa71a409b1adaf886733195012b157ffd83ea7ae659b0902222ed9440be7 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=4897d20141b9271678aeff91ee7005ca77d69a228f23d79eb6ac67cecef3224fc3f318361519b4d6ffa8722b937eda33db2c8b23157b86216ebf80415aa89e935fb92101ea57f6ec5669 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=4c7e74911721ae8c0678065a0f6ad8fb1297a21f6754b38e266eee19d0ad2a +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=475800d09b8bf0421df0e7679d3cd21b814fd6dff0fb9c46dbc5376c6122e4 + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540f55bdaaa880fc12facb47d5793c5c9c2c879cfb8cb55945655f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661e036fa970ffb21503a0108b83c0bd72003bb6d4a97179484514ff7ef45ec9eb07357830807daf32b9a32297a1a9878da2494f38471537cc5d6bd4192f5f3078085f0533aa0e75686fba +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=94ed14201939c7bb4572b20adf4082cd6bb82f70f3c8de3316bc33f5eae48cd9b530622c64695f7e4ce8f79b3ef119fbe7a7158f06660cce138493700e351a7a22ae1bb11889ae401722 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=86774279eb88fc06ae6805d0b449a143cdfe04a11fc7a429277b968cabe3bf +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b1f80227766841582344bc541607b227d94329c13eacc906aa8d505877ba86 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541bb344a916e3fe400dedd2a7371c38b355300008ffe1f92c5321 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f05a4cb6e4cb79e094bd585a0b9fbc734db005568fc515c58c9fde6291e3e2920a77f6c331f2b9e51cb445ebaa762dd12451c80484377ba18cd74ca6e49295ef6417ad4b265ac043c90e +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8651088810f5c175e542fa61507d8cfac7670c9c1f1e3eb7c8fcfa1e632b0d46f22ae59817305950a50b328539a252ccfaeeeceaa062fd82e2237a114a9d10610aa66213ef7dbb4f0ebc +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=ff43d872c9028bdb9c54fa2c87bf427cd7fdf53b281d89649f183629b8f2e9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=50ca5d06223b9346bc628ee151bf174732e4afc56fe3fca4baff4173abe983 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660d08c6ebb96e008cec2c0c4667d8488bfa63fb9542b9543bf2f44452ddfca2d7b47846f7c23a61ba89e3005c17a3da874f0113c4bcaef064e33c7388076221f1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4ce1063a2c24a067d32c33bc634f9164349ff4d51e2f736aa8ddfe7d85dbde +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e8ec223c4616b42db4b40ac577af6937537a779ffc4517314c4c90e6c6bec + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b63d4823ec3c33b747175212d3fa59c7320419f05114fa56bc49c588ce3efae0f7a0096cf97cac10155a9af45a6fa4a568a065542312cfca94b12f8721a77ee9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663960d18951259c9250ca1804369d267c7a61ba56041491bbe42dac780957c6c53b4073645443610174b25add1f889f59292b4d5756ee87a43c557907cefe7ee3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9c8ed9bfe0b9016461bf4ab1d3f56b261cbd5f0c9a165184fcfbe28af3968 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81bfdb36c9b8d755d0ebe25f87edd262896108dfa2b073c0814093f7d2ebd8 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e48b3f70e18e77885fa9aacad3100d7678a827d00fb563dcd477899b1ee1d89e23ecb8f2999013a2043036cea9c6d610ab3d9d45672d615f56e14a907a6626ef +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba047e6e3ee18a0dcb8a530689f90df6155ccc5cb33a0b378c4885b36c315b433e6294711d4def132673d121030ade3f074c8ce7ac45822d01166f7efabff8a0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f98369e9445c5882aa703756b77e75713ba3004075fa24c018653a1b4d103b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d842e68c723ec899be6e97299547bfae1c1c2666c328a4cc939f33d2be6eb3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3be70df2112be564394441fab73a3d1ea8cffbf282cb7e2fba6d4bf93eb3d0e546334907b6a75b27e91ddf1f4bb8265c5dbe3134d556ccda881f6735a439202 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6538498df27580b5a8ce84806413a0bb3fef6548807b7675d415b295a36312997861b158cfe7287bc38d8d22edc615342716e16b46f10a0099c7c8d5984039a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bd6813d28352fec1b43d31a7c1f39f37c4800d82a6281fcfc81eae0b97d3b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b1ea910350e67ec24ed0f3c557ff265133851bdafd4c7aea32ba5a7624f13 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660d08c6ebb96e008cec2c0c4667d8488bfa63fb9542b9543bf2f44452ddfca2d7e4427f5970f26a10fd1072dbd7a0836bbd3886d3f59490443484ed8534285770555656ca00988f52612d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4ce1063a2c24a067d32c33bc634f9164349ff4d51e2f736aa8ddfe7d85dbde +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e8ec223c4616b42db4b40ac577af6937537a779ffc4517314c4c90e6c6bec + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b63d4823ec3c33b747175212d3fa59c7320419f05114fa56bc49c588ce3efae0f7a0096cf97cac10155a9af45a6fa4a522e8eb3d61d2bb8d5009943c3bf446f032c0b794ddc1c18d137e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663960d18951259c9250ca1804369d267c7a61ba56041491bbe42dac780957c6c521f538e34bfd357ad7040f461cb64b9987381dbd1f2b9a676c279d5af171ea9f30c5941cb2be937e43c9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9c8ed9bfe0b9016461bf4ab1d3f56b261cbd5f0c9a165184fcfbe28af3968 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81bfdb36c9b8d755d0ebe25f87edd262896108dfa2b073c0814093f7d2ebd8 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e48b3f70e18e77885fa9aacad3100d7678a827d00fb563dcd477899b1ee1d89e23ecb8f2999013a2043036cea9c6d61031e9c7b4162140f5829894388eee5bce7e93baee3ce0bf4190a0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba047e6e3ee18a0dcb8a530689f90df6155ccc5cb33a0b378c4885b36c315b435561f0ef42c5ba5a40979f0841216806b326e04a2da36a9011b2a694ff283f0fd98a630d79dbce95ab02 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f98369e9445c5882aa703756b77e75713ba3004075fa24c018653a1b4d103b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d842e68c723ec899be6e97299547bfae1c1c2666c328a4cc939f33d2be6eb3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3be70df2112be564394441fab73a3d1ea8cffbf282cb7e2fba6d4bf93eb3d0e546334907b6a75b27e91ddf1f4bb8265b68b7fea24bfbe6d185a29b30f2a103349aa2e37f6c2f1278168 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6538498df27580b5a8ce84806413a0bb3fef6548807b7675d415b295a3631293868d42d5504ab97a0d82a50cb83c2bf74206d4835e15686aa2abf992b7b0d27c5415c83cde596788278 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bd6813d28352fec1b43d31a7c1f39f37c4800d82a6281fcfc81eae0b97d3b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b1ea910350e67ec24ed0f3c557ff265133851bdafd4c7aea32ba5a7624f13 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660d08c6ebb96e008cec2c0c4667d8488bfa63fb9542b9543bf2f44452ddfca2d7f2ef33da3c18e4950b1cfe62f4c883d97c018436fa3d37069cb5911316e08700 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4ce1063a2c24a067d32c33bc634f9164349ff4d51e2f736aa8ddfe7d85dbde +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e8ec223c4616b42db4b40ac577af6937537a779ffc4517314c4c90e6c6bec + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b63d4823ec3c33b747175212d3fa59c7320419f05114fa56bc49c588ce3efae0bd8ff356da1943afb6db2e8cb9fd67d0125c3c87b9c83ee8cce6e92d25387b4e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663960d18951259c9250ca1804369d267c7a61ba56041491bbe42dac780957c6c55061e844b5ab6cd23a97fee163cfb3db7b4faa27b08a1ca24b0a681294fe9bb1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9c8ed9bfe0b9016461bf4ab1d3f56b261cbd5f0c9a165184fcfbe28af3968 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81bfdb36c9b8d755d0ebe25f87edd262896108dfa2b073c0814093f7d2ebd8 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e48b3f70e18e77885fa9aacad3100d7678a827d00fb563dcd477899b1ee1d89e980889cb7bf25f6f4be3551e27e1ea7d9f2719d05e33dada3b7b1a5721c6142a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba047e6e3ee18a0dcb8a530689f90df6155ccc5cb33a0b378c4885b36c315b43ee2d0ae05c3381ef19d6552e4c379c9e3455f5369feb06f5b823512a752550a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f98369e9445c5882aa703756b77e75713ba3004075fa24c018653a1b4d103b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d842e68c723ec899be6e97299547bfae1c1c2666c328a4cc939f33d2be6eb3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3be70df2112be564394441fab73a3d1ea8cffbf282cb7e2fba6d4bf93eb3d0e50d15abf5a511b499f4bb2364105d9762588d57b6b4cef7251a82d36e5a85394 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6538498df27580b5a8ce84806413a0bb3fef6548807b7675d415b295a3631299a0f8e43b9e338ca409665b3d31f4276ee5a9ba840a56170f1c28b57685cd310 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bd6813d28352fec1b43d31a7c1f39f37c4800d82a6281fcfc81eae0b97d3b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b1ea910350e67ec24ed0f3c557ff265133851bdafd4c7aea32ba5a7624f13 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660d08c6ebb96e008cec2c0c4667d8488bfa63fb9542b9543bf2f44452ddfca2d7e7b3d10d1bec4db060cc81ac11981c86bd3886d3f59490443484f9dff1092bbff7dcf06981d28b28afaf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4ce1063a2c24a067d32c33bc634f9164349ff4d51e2f736aa8ddfe7d85dbde +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=1e8ec223c4616b42db4b40ac577af6937537a779ffc4517314c4c90e6c6bec + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b63d4823ec3c33b747175212d3fa59c7320419f05114fa56bc49c588ce3efae0bd8ff356da1943afb6db2e8cb9fd67d022e8eb3d61d2bb8d5009413d916e50ebf18eaeb1c662609b9507 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663960d18951259c9250ca1804369d267c7a61ba56041491bbe42dac780957c6c5196c019b9d174ed3dcaa53099503522a87381dbd1f2b9a676c27b5ac5b1513fbc5623bdc039536108225 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=b9c8ed9bfe0b9016461bf4ab1d3f56b261cbd5f0c9a165184fcfbe28af3968 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=81bfdb36c9b8d755d0ebe25f87edd262896108dfa2b073c0814093f7d2ebd8 + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e48b3f70e18e77885fa9aacad3100d7678a827d00fb563dcd477899b1ee1d89e980889cb7bf25f6f4be3551e27e1ea7d31e9c7b4162140f582989fb19a400cb8e233d3c9e389e6178779 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ba047e6e3ee18a0dcb8a530689f90df6155ccc5cb33a0b378c4885b36c315b4322b0f462158e15814a1bde609953f95db326e04a2da36a9011b27061e58c38b18c508dc98a28a96bd47d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f98369e9445c5882aa703756b77e75713ba3004075fa24c018653a1b4d103b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d842e68c723ec899be6e97299547bfae1c1c2666c328a4cc939f33d2be6eb3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c3be70df2112be564394441fab73a3d1ea8cffbf282cb7e2fba6d4bf93eb3d0e50d15abf5a511b499f4bb2364105d976b68b7fea24bfbe6d185a5c40f1b38412d69a8edfb30ae69c37b2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f6538498df27580b5a8ce84806413a0bb3fef6548807b7675d415b295a36312906e14d4e13ee44c451ac33dd85c6494674206d4835e15686aa2a956b0924d35a221d4b7181d71a7acb72 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8bd6813d28352fec1b43d31a7c1f39f37c4800d82a6281fcfc81eae0b97d3b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7b1ea910350e67ec24ed0f3c557ff265133851bdafd4c7aea32ba5a7624f13 + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b62d68267d71003dd2ec89177e7a80e3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=073e37ccc3b3b5f301022426e60a9fe42344451b0c246c7c3c52e90200becd +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=13d07f95326d21c8df6cc06e039928135e3e0ce76c0ac29c1af3af17f9f209 + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c7ecad40ae43136bb00e644faf111fee +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e80199955235b10ef537be4e4ece03b89e395270f354863329a81623fe31c4 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4223b3fdafd3b6e8362de55b3af3e442fe88d22174d266b7098f6d1f3d54dd + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625484bee855d8aaadb550fd7368ce11dae9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=44098386e9c10ee7805cd6c24acfa0e883439cab2955227546351f2d0b98d2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bbba498b110eeed6a4a8db59b425539b45f08454356ec2e9c332d77880488c + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254609e1a34b71f412922516c43c0e318eacbab4c4d9944d7320797 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=073e37ccc3b3b5f301022426e60a9fe42344451b0c246c7c3c52e90200becd +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=13d07f95326d21c8df6cc06e039928135e3e0ce76c0ac29c1af3af17f9f209 + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254acceaed8b3a21db94a655c36c11a60a8bb89df76cff84a34015e +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e80199955235b10ef537be4e4ece03b89e395270f354863329a81623fe31c4 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4223b3fdafd3b6e8362de55b3af3e442fe88d22174d266b7098f6d1f3d54dd + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c8a0cbbea89e5ae2aabf7a0ff0cab75f79795fe12ca51560061 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=44098386e9c10ee7805cd6c24acfa0e883439cab2955227546351f2d0b98d2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bbba498b110eeed6a4a8db59b425539b45f08454356ec2e9c332d77880488c + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419e9c7e045efa93cdbf8951bde24f518 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=073e37ccc3b3b5f301022426e60a9fe42344451b0c246c7c3c52e90200becd +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=13d07f95326d21c8df6cc06e039928135e3e0ce76c0ac29c1af3af17f9f209 + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625423626274f79a73c1a08d4f8b3740dc65 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e80199955235b10ef537be4e4ece03b89e395270f354863329a81623fe31c4 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4223b3fdafd3b6e8362de55b3af3e442fe88d22174d266b7098f6d1f3d54dd + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d7f8985f5a07f3b6134b3eb461d07c79 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=44098386e9c10ee7805cd6c24acfa0e883439cab2955227546351f2d0b98d2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bbba498b110eeed6a4a8db59b425539b45f08454356ec2e9c332d77880488c + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254609e1a34b71f412922514c3e94964753215ede1067c59472f88c +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=073e37ccc3b3b5f301022426e60a9fe42344451b0c246c7c3c52e90200becd +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=13d07f95326d21c8df6cc06e039928135e3e0ce76c0ac29c1af3af17f9f209 + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254acceaed8b3a21db94a65700f1c5dab0d3b1eac91132e3ab6eebe +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e80199955235b10ef537be4e4ece03b89e395270f354863329a81623fe31c4 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=4223b3fdafd3b6e8362de55b3af3e442fe88d22174d266b7098f6d1f3d54dd + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2b +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544c8a0cbbea89e5ae2aab126c87f8777b9b68d5b545fb3b2f398f +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=44098386e9c10ee7805cd6c24acfa0e883439cab2955227546351f2d0b98d2 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bbba498b110eeed6a4a8db59b425539b45f08454356ec2e9c332d77880488c + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bbe42ea4bcf66d6f758a4c188bf4bc91 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=084290d5043c3b6948d4921b6077beb8b735be5abb710c15d603fbe6a8837a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3bc6edaa3068acffde7c0e48a284fcc85e5a53eed67eebfc269b39a61d4fab + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a213fa659c7a882c575df816336d8be4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=4c0b6eb320ffdd0fc360e131a2743b8da960103c65a8574894dab9baebddbb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d78bbe8c396fcee4ec8845d3212997c19c03686fedd94fe7ad7083f8fccb1 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f14e85fd8ba7aba75b5a1a46a90667e1 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=393b40808649ae3cfe543634928e71fcc0db659c41c8a5bfa0463f8d097617 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=768b4c83f5e7bdf3236786bcaf620e2f72c314ee77dca21ea045a5e8ded973 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549be6f2a5fceed9834cd66790fbc903926c448bc59b48b2154dd6 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=084290d5043c3b6948d4921b6077beb8b735be5abb710c15d603fbe6a8837a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3bc6edaa3068acffde7c0e48a284fcc85e5a53eed67eebfc269b39a61d4fab + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f6ab56ef38ff35798fe8f0f4d134086e57f446a2345b1191ea4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=4c0b6eb320ffdd0fc360e131a2743b8da960103c65a8574894dab9baebddbb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d78bbe8c396fcee4ec8845d3212997c19c03686fedd94fe7ad7083f8fccb1 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543bef9db972e2e6c71558809e51ae65d7420c45bdc240f8abd816 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=393b40808649ae3cfe543634928e71fcc0db659c41c8a5bfa0463f8d097617 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=768b4c83f5e7bdf3236786bcaf620e2f72c314ee77dca21ea045a5e8ded973 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542b78acccc816e4c2f5f9699184235c74 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=084290d5043c3b6948d4921b6077beb8b735be5abb710c15d603fbe6a8837a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3bc6edaa3068acffde7c0e48a284fcc85e5a53eed67eebfc269b39a61d4fab + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254036e6f1d1a3deae5b6a6a0082f91b971 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=4c0b6eb320ffdd0fc360e131a2743b8da960103c65a8574894dab9baebddbb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d78bbe8c396fcee4ec8845d3212997c19c03686fedd94fe7ad7083f8fccb1 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542fba2f565d1471d00632cf0be54aaf62 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=393b40808649ae3cfe543634928e71fcc0db659c41c8a5bfa0463f8d097617 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=768b4c83f5e7bdf3236786bcaf620e2f72c314ee77dca21ea045a5e8ded973 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549be6f2a5fceed9834cd62141f0bbf0f39ae2eac726587cc06702 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=084290d5043c3b6948d4921b6077beb8b735be5abb710c15d603fbe6a8837a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=3bc6edaa3068acffde7c0e48a284fcc85e5a53eed67eebfc269b39a61d4fab + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541f6ab56ef38ff35798feb9a0e6306cecfbf9d320ae214ca7ffa4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=4c0b6eb320ffdd0fc360e131a2743b8da960103c65a8574894dab9baebddbb +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0d78bbe8c396fcee4ec8845d3212997c19c03686fedd94fe7ad7083f8fccb1 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543bef9db972e2e6c71558a57e72719d6994322c7eba68ffb7ef1d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=393b40808649ae3cfe543634928e71fcc0db659c41c8a5bfa0463f8d097617 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=768b4c83f5e7bdf3236786bcaf620e2f72c314ee77dca21ea045a5e8ded973 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd54b64a44cca6205b19aa279c8056ac51f96cf3d758067d237f87128e15a4c4148bd36ab1729cacb085be81f3480b4354206c59a07e41330ad15f95124cafa +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5876a3382ed90f78c1b3e6fcc88722443a39185cf5e5cda8ab5801aaf69cab +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=7c0c69826778f7c46a4a344ae33d3c0ed24c6d3be7fd57c2dc63ef4f23655f + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bb88bc8f1d5b95ff9b457b11932e08c4bf7737b9597e5dc4ced87cd5c0887080e2fee14b04294b61597f5e910bad3abf548e5e3e756da213e59a1707ed1994c5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=27d554df29f82a035d188e8fac392e112e2155f4fb2d7efb097a7c4c92ae8b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=75d225f9a1c43f07a06f35ea7ad7ae7ca2e485fb080e7be7125995b7ca2263 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a613c9d0d0c7df0be15c578383f68146433aac97b59474cda1ba8aede82a04e58cd86fc4c305ad8471f0bfa4bc5cae2cd4cbf0bdcdcee3c1c7a411ede4b5cb19 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=38a911620b7d62cc36bdb2c5bd3f1f53c7b135ba945f890838208dd1ac3a60 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0687c7ac818efa9d4eb42085ac0531050094895a11ab5c62f4c49ff0f7da16 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd54b64a44cca6205b19aa279c8056ac51f96cf3d758067d237f87128e15a4c4148bd36ab1729cacb085be81f3480b4155fb51d817c41fe84d19fea4db898d03d6d178d62bb9d9673a0 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5876a3382ed90f78c1b3e6fcc88722443a39185cf5e5cda8ab5801aaf69cab +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=7c0c69826778f7c46a4a344ae33d3c0ed24c6d3be7fd57c2dc63ef4f23655f + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bb88bc8f1d5b95ff9b457b11932e08c4bf7737b9597e5dc4ced87cd5c0887080e2fee14b04294b61597f5e910bad3abf14a6559af2e96ddafc7e68c916704cffd7863bc38c69a17f28b6 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=27d554df29f82a035d188e8fac392e112e2155f4fb2d7efb097a7c4c92ae8b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=75d225f9a1c43f07a06f35ea7ad7ae7ca2e485fb080e7be7125995b7ca2263 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a613c9d0d0c7df0be15c578383f68146433aac97b59474cda1ba8aede82a04e58cd86fc4c305ad8471f0bfa4bc5cae2c4b81d112e3e7d0d726c849388581cc9b879a98224acb457c68b7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=38a911620b7d62cc36bdb2c5bd3f1f53c7b135ba945f890838208dd1ac3a60 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0687c7ac818efa9d4eb42085ac0531050094895a11ab5c62f4c49ff0f7da16 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd54b64a44cca6205b19aa279c8056ac51f96cf3d758067d237f87128e15a4c7166621c380455d9dbf411bd450cdb4b05c3f2a27cbec817ffe9647f2a18afd9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5876a3382ed90f78c1b3e6fcc88722443a39185cf5e5cda8ab5801aaf69cab +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=7c0c69826778f7c46a4a344ae33d3c0ed24c6d3be7fd57c2dc63ef4f23655f + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bb88bc8f1d5b95ff9b457b11932e08c4bf7737b9597e5dc4ced87cd5c08870808e9bdae01e07f17b6fa915c3d91ed7d3547d6d73c86caa69fb94fed060c14382 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=27d554df29f82a035d188e8fac392e112e2155f4fb2d7efb097a7c4c92ae8b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=75d225f9a1c43f07a06f35ea7ad7ae7ca2e485fb080e7be7125995b7ca2263 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a613c9d0d0c7df0be15c578383f68146433aac97b59474cda1ba8aede82a04e544d764e5f67a403d442e16be3807b5d5f5f2bdf9e39234ca23c3a2d94b6c46f3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=38a911620b7d62cc36bdb2c5bd3f1f53c7b135ba945f890838208dd1ac3a60 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0687c7ac818efa9d4eb42085ac0531050094895a11ab5c62f4c49ff0f7da16 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd54b64a44cca6205b19aa279c8056ac51f96cf3d758067d237f87128e15a4c7166621c380455d9dbf411bd450cdb4b155fb51d817c41fe84d1c532e9d9b1ae823f499ea722badc77e4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=5876a3382ed90f78c1b3e6fcc88722443a39185cf5e5cda8ab5801aaf69cab +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=7c0c69826778f7c46a4a344ae33d3c0ed24c6d3be7fd57c2dc63ef4f23655f + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bb88bc8f1d5b95ff9b457b11932e08c4bf7737b9597e5dc4ced87cd5c08870808e9bdae01e07f17b6fa915c3d91ed7d314a6559af2e96ddafc7ed897a4125cd575976d0cdd5e33aca3fc +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=27d554df29f82a035d188e8fac392e112e2155f4fb2d7efb097a7c4c92ae8b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=75d225f9a1c43f07a06f35ea7ad7ae7ca2e485fb080e7be7125995b7ca2263 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2b +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a613c9d0d0c7df0be15c578383f68146433aac97b59474cda1ba8aede82a04e544d764e5f67a403d442e16be3807b5d54b81d112e3e7d0d726c8af41b189b719d2efe35796a636de31d9 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=38a911620b7d62cc36bdb2c5bd3f1f53c7b135ba945f890838208dd1ac3a60 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0687c7ac818efa9d4eb42085ac0531050094895a11ab5c62f4c49ff0f7da16 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6b2af1b6bc7ab3bb3c96b892afbaf49 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e693375ca5a2a0ff37a4b36662433ecc789e8a04887751ac3b0bb070039726 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=821cbd91e90a763bc70ac3cdee3bd2fb4b9dcd0e7cc3a066b85811c0c55c10 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429e02e0aff3585ba34213b02ce0584b1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667e40f02cbf3aba406c8b3556958221ef +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=45229f0fb23ccd92b0554c5be976ab8ccecf5f1e7503af4c5a1e4e45d35dd5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fcf39b68313e893f9682801d60aee12337d52a64661af37a0366b7924d1657 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540d6ecb3df1991eeb786683cac2d3f982 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660a5dcf3414a6c779bd8881e8852bc849 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ff900c6284287621348a3f116e7d1cb4fa64dffb7904a8332b36377381eafd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d49b01235ee41b7bb4b32de0b258be2280dcf68262b690fef7f0511bdb52d1 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254296fa023d848fab1af54ab8d08d37448 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b6e42d67d8cea5e983a691e0658fac72 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=98fd5ab58a3ad920b59dd500179a238f715af6d3b0d6d4a1801fad5e3c8dc5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4deac6ad723c4459d22e13e42c68b1b87c98cea7c470d684acd1c238be8398 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669274a4f99ffbbcd930fb758f8ed76cc03fe9ad85a0fc5556f701 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e693375ca5a2a0ff37a4b36662433ecc789e8a04887751ac3b0bb070039726 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=821cbd91e90a763bc70ac3cdee3bd2fb4b9dcd0e7cc3a066b85811c0c55c10 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b8766d12729c594966e9e1234f04bdf152052d9085b3df49d3b9 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633188335572849c06f2196f49d512745d01ddf3748851abb18e5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=45229f0fb23ccd92b0554c5be976ab8ccecf5f1e7503af4c5a1e4e45d35dd5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fcf39b68313e893f9682801d60aee12337d52a64661af37a0366b7924d1657 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c65e819d0b4074ef005311ac1d8ddc01b50aec437a3e07b27f15 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466da135105806675a56c11b4d9eb8f1bf2f93503003b148160977b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ff900c6284287621348a3f116e7d1cb4fa64dffb7904a8332b36377381eafd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d49b01235ee41b7bb4b32de0b258be2280dcf68262b690fef7f0511bdb52d1 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c5cfd6799fc937000b5133e782ef3af066bce5532efe254878b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668a48263708b02a2508c92e6d37091d7805917886430d81cbf539 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=98fd5ab58a3ad920b59dd500179a238f715af6d3b0d6d4a1801fad5e3c8dc5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4deac6ad723c4459d22e13e42c68b1b87c98cea7c470d684acd1c238be8398 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663116eefd4bce9076d9dcae0406a1e895 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e693375ca5a2a0ff37a4b36662433ecc789e8a04887751ac3b0bb070039726 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=821cbd91e90a763bc70ac3cdee3bd2fb4b9dcd0e7cc3a066b85811c0c55c10 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df955d65e85408302701c443b9876628 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466073acc4aae4797305f3a5014902f0389 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=45229f0fb23ccd92b0554c5be976ab8ccecf5f1e7503af4c5a1e4e45d35dd5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fcf39b68313e893f9682801d60aee12337d52a64661af37a0366b7924d1657 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543bc1046f99db530d13c0e9d8c4b8972a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d259d8e58663d8fdc8ee8a76f38aedb4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ff900c6284287621348a3f116e7d1cb4fa64dffb7904a8332b36377381eafd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d49b01235ee41b7bb4b32de0b258be2280dcf68262b690fef7f0511bdb52d1 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547b5ec929ff746b2951ad02dcb8e1d328 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f1470d8024e4f3ed2f729669ad158aed +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=98fd5ab58a3ad920b59dd500179a238f715af6d3b0d6d4a1801fad5e3c8dc5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4deac6ad723c4459d22e13e42c68b1b87c98cea7c470d684acd1c238be8398 + +handshake=Noise_NN_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669274a4f99ffbbcd930fb9d5f607de66556bd116615a94643140d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e693375ca5a2a0ff37a4b36662433ecc789e8a04887751ac3b0bb070039726 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=821cbd91e90a763bc70ac3cdee3bd2fb4b9dcd0e7cc3a066b85811c0c55c10 + +handshake=Noise_NNpsk0_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b8766d12729c594966e9df5831055ca8c424d8ca8f3f2a6fbeac +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633188335572849c06f2123581c51160861c0049f3bb291bd9e3f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=45229f0fb23ccd92b0554c5be976ab8ccecf5f1e7503af4c5a1e4e45d35dd5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fcf39b68313e893f9682801d60aee12337d52a64661af37a0366b7924d1657 + +handshake=Noise_NNpsk1_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c65e819d0b4074ef00531acf9a294d769a2eae079b342632d219 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466da135105806675a56c116abd2f66bf544bd00009d1f973865921 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ff900c6284287621348a3f116e7d1cb4fa64dffb7904a8332b36377381eafd +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d49b01235ee41b7bb4b32de0b258be2280dcf68262b690fef7f0511bdb52d1 + +handshake=Noise_NNpsk2_25519_ChaChaPoly_BLAKE2s +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549c5cfd6799fc937000b54a31dc936d6b1bd4e8676cdcc42b1bf3 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668a48263708b02a2508c97593c7ffd766732eba2768eab8536d6f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=98fd5ab58a3ad920b59dd500179a238f715af6d3b0d6d4a1801fad5e3c8dc5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4deac6ad723c4459d22e13e42c68b1b87c98cea7c470d684acd1c238be8398 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662996b770a8beee5210ae2ee2d93339cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=53437efbfb1f92fe43ae72099eb65358797dd48886cb9671975797e3f579ca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44bd43feee10b6715272dcc8826de7e866dc27f7e3dfb7148b4824eb226aea + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625406f76c7e9f1f456d70bf867e2c44a6c2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466f0b70f196c5e9dbe5bc086b4be3e425a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b98df9fba3f2887f5616371dbfeee8ee63dcc2830f8cf7a58ebf593ccf728 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d9d130f122419ba52d847d0099b0155e7e4ea9fe0ff4b4b2bef3a0f9bb75a + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b00aef15e78c2222b23f921a2940819b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846656bc91e33dd792081f01fe00c118bf9f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8f8dac7f5d54982068e3293e629a3ecdb58d6780b15240f4f9dd7157b04c3c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3bcd3a3be774bdaf617db13ae419cd4542b1d1796f7c3ef01f6dd56f210fa1 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254066270b88eaeaa86e505970da02d2c2c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668b803871150207af0a9bbb9a7532ff88 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e0a9264ac293727a86412dcb3c3293a0abf9283468cc94a78c30b457ae6e97 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4886d3f446d6daba42fc5eea04ccc91ed077abd0db4925ef076daf5b0f3cd4 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661cd505ea2a9f4ba454a661b2979075e9c575359c8f2543677d42 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=53437efbfb1f92fe43ae72099eb65358797dd48886cb9671975797e3f579ca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44bd43feee10b6715272dcc8826de7e866dc27f7e3dfb7148b4824eb226aea + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fdc73e2c2e717296f86029e72318cac7f1ffc79284aa8bd938cf +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846604563dac6ba8bdec8a444aa53f3da950706868979722e1df493a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b98df9fba3f2887f5616371dbfeee8ee63dcc2830f8cf7a58ebf593ccf728 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d9d130f122419ba52d847d0099b0155e7e4ea9fe0ff4b4b2bef3a0f9bb75a + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aefbdd261500e340336114bd4696e9be890d9ff0fc44ea383c1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ae024a90f2448f1ee801f6cbe7b9b5999fcebe5c8c19366db677 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8f8dac7f5d54982068e3293e629a3ecdb58d6780b15240f4f9dd7157b04c3c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3bcd3a3be774bdaf617db13ae419cd4542b1d1796f7c3ef01f6dd56f210fa1 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541798c5f0ce19bfeeb8e18af1f7646b1f78b4e2fe25e9c4aa503f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b4179026203db247901b5b2ad69041a6c10a2c5c39b06f619c7e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e0a9264ac293727a86412dcb3c3293a0abf9283468cc94a78c30b457ae6e97 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4886d3f446d6daba42fc5eea04ccc91ed077abd0db4925ef076daf5b0f3cd4 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846667203848cd4c9ae0b133522056dba949 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=53437efbfb1f92fe43ae72099eb65358797dd48886cb9671975797e3f579ca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44bd43feee10b6715272dcc8826de7e866dc27f7e3dfb7148b4824eb226aea + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662540949d3d2cd0eaca6b6506a09b263fe4a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664404e85e9fb434e0d2218ff52fe95fd7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b98df9fba3f2887f5616371dbfeee8ee63dcc2830f8cf7a58ebf593ccf728 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d9d130f122419ba52d847d0099b0155e7e4ea9fe0ff4b4b2bef3a0f9bb75a + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f0f5d97c2da7cf61e0d3948154ba74e4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466099137f9449e7fa478c3ed1fdab515ea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8f8dac7f5d54982068e3293e629a3ecdb58d6780b15240f4f9dd7157b04c3c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3bcd3a3be774bdaf617db13ae419cd4542b1d1796f7c3ef01f6dd56f210fa1 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254098b9b5f3f97855bdbf6058d616bfe58 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ed1898e3f24678b9217c3c2ce1cfb437 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e0a9264ac293727a86412dcb3c3293a0abf9283468cc94a78c30b457ae6e97 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4886d3f446d6daba42fc5eea04ccc91ed077abd0db4925ef076daf5b0f3cd4 + +handshake=Noise_KN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661cd505ea2a9f4ba454a673b09a4a33ce505f13351254cce920a6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=53437efbfb1f92fe43ae72099eb65358797dd48886cb9671975797e3f579ca +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=44bd43feee10b6715272dcc8826de7e866dc27f7e3dfb7148b4824eb226aea + +handshake=Noise_KNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fdc73e2c2e717296f860f1ce209564649b4c8c5b08a054956d53 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846604563dac6ba8bdec8a44ca483cb93b9ae929ac1d197021cf2085 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8b98df9fba3f2887f5616371dbfeee8ee63dcc2830f8cf7a58ebf593ccf728 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d9d130f122419ba52d847d0099b0155e7e4ea9fe0ff4b4b2bef3a0f9bb75a + +handshake=Noise_KNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aefbdd261500e340336f649ecfec1f202ce87c63b9ebcf86561 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ae024a90f2448f1ee801ea786081533c8eb3243d2bf0d737ba6c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=8f8dac7f5d54982068e3293e629a3ecdb58d6780b15240f4f9dd7157b04c3c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=3bcd3a3be774bdaf617db13ae419cd4542b1d1796f7c3ef01f6dd56f210fa1 + +handshake=Noise_KNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541798c5f0ce19bfeeb8e177a3c5e381a60f5e06de14a6e67d0371 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b4179026203db247901b1e7fb2131d14bfa00e9a72203580ecee +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=e0a9264ac293727a86412dcb3c3293a0abf9283468cc94a78c30b457ae6e97 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=4886d3f446d6daba42fc5eea04ccc91ed077abd0db4925ef076daf5b0f3cd4 + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c796bf92e018434c9b2146fab78f30d0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cb3abc71944afc6463300a32ba99b33d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=56a475d3db0d0d5931542a93e3cd57c7dc51b29fc6d0a7cea41aea05d99fe5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c239eb65b5f0d0641f6c6c20aec65646626249f9194e4211a2f8e761c2d72 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c9047e5f60f5b21c65fa8ff35c46e4f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466cf1d49363de74d70a9f0cdbaa3310eda +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6593eb8dd060da72b612dd4128b4fef345d58c2e8cc2764dff574a3094fe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7ce16bfa101adc89a7773ffd08c545634f59d9035cabadef5f5ce941351d4 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625444240d38699667b5d6c608f41fdee5a6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661379efd5a3414a48873a1d9b88af74a7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2e97c7a30baa66eb2eef35ac21f0985cb7139c68c681119ac87dd8864ab50e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2d441a28146d89109afcebf7fb254715a4937c1b775ed048735c301b7c15ba + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f944f03a16bec0d4ede15bbf507f7e25 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846634632482a2c45167231236b170f1fbc1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=93bb4e3dd1995295277446d3010fc7299dd2d1f283d7ce9ee8934d1caa60ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d7ce2e01658cebe3086b25ae67c184cbb26e4855bc9c03a82c149948ea9a4e + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bc7e9bcabcd39b9278b329a24d91072a9948a6cab4205f4c2d25 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466060fcddff00afaa37fd10ae19782d5eda54dc6d0af0a1ae34816 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=56a475d3db0d0d5931542a93e3cd57c7dc51b29fc6d0a7cea41aea05d99fe5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c239eb65b5f0d0641f6c6c20aec65646626249f9194e4211a2f8e761c2d72 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544e94ec05dc68a1daa22d31bf607f134c66047ce9b78516559d77 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466281b734b3aba9427cddf7bb7d3165127146b88235d7d9f276e66 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6593eb8dd060da72b612dd4128b4fef345d58c2e8cc2764dff574a3094fe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7ce16bfa101adc89a7773ffd08c545634f59d9035cabadef5f5ce941351d4 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b844c29336d91edab89a73e74bb4a4964c09b0449b950f67ede8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e1784da1b96e7a4a7d7bee4668e1c37f9e61052c4553d7a1339 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2e97c7a30baa66eb2eef35ac21f0985cb7139c68c681119ac87dd8864ab50e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2d441a28146d89109afcebf7fb254715a4937c1b775ed048735c301b7c15ba + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c1384003bc26279ca3c0030d4aaf3b3dd795108bd34df2f6607 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663780ee06ece35bbfb120e4f2070358151d0642cb542d816754a5 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=93bb4e3dd1995295277446d3010fc7299dd2d1f283d7ce9ee8934d1caa60ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d7ce2e01658cebe3086b25ae67c184cbb26e4855bc9c03a82c149948ea9a4e + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c25868d2b2a31aa03b91b342e3a0f010 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d3bd657df804422777533bd275e14c99 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=56a475d3db0d0d5931542a93e3cd57c7dc51b29fc6d0a7cea41aea05d99fe5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c239eb65b5f0d0641f6c6c20aec65646626249f9194e4211a2f8e761c2d72 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544490043bc9ee1f9b37b487bd5c239c9f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846659153640b1bffc0da68baa51d62f821c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6593eb8dd060da72b612dd4128b4fef345d58c2e8cc2764dff574a3094fe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7ce16bfa101adc89a7773ffd08c545634f59d9035cabadef5f5ce941351d4 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d438f5822dfd27a43ada58efc5977708 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466117ef4bc881b704cfb87d2c0e95fa683 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2e97c7a30baa66eb2eef35ac21f0985cb7139c68c681119ac87dd8864ab50e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2d441a28146d89109afcebf7fb254715a4937c1b775ed048735c301b7c15ba + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae324e3db885a891345f300591c39991 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466158ae4d81ce5d413184b62ecbf1db7d6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=93bb4e3dd1995295277446d3010fc7299dd2d1f283d7ce9ee8934d1caa60ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d7ce2e01658cebe3086b25ae67c184cbb26e4855bc9c03a82c149948ea9a4e + +handshake=Noise_NK_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254bc7e9bcabcd39b9278b37f9892f7dec16e155389121da24e1fad +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466060fcddff00afaa37fd11c440d18031d7f9a735d2dd1ea6bfe24 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=56a475d3db0d0d5931542a93e3cd57c7dc51b29fc6d0a7cea41aea05d99fe5 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c239eb65b5f0d0641f6c6c20aec65646626249f9194e4211a2f8e761c2d72 + +handshake=Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544e94ec05dc68a1daa22de47ad3b7f3e2e17d0b302fa6890ea67f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466281b734b3aba9427cddf3c94b9f572f110a02b5e52acab758e34 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a6593eb8dd060da72b612dd4128b4fef345d58c2e8cc2764dff574a3094fe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b7ce16bfa101adc89a7773ffd08c545634f59d9035cabadef5f5ce941351d4 + +handshake=Noise_NKpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b844c29336d91edab89a43bfc3fe933ccd161c24839025e6c72d +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660e1784da1b96e7a4a7d743449335246823acd49e72750ccfa6fa +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=2e97c7a30baa66eb2eef35ac21f0985cb7139c68c681119ac87dd8864ab50e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=2d441a28146d89109afcebf7fb254715a4937c1b775ed048735c301b7c15ba + +handshake=Noise_NKpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c1384003bc26279ca3cb125ee90cc218132fdbf93455a891a92 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663780ee06ece35bbfb120dda59c0d7f0226547003e9db0016a4ab +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=93bb4e3dd1995295277446d3010fc7299dd2d1f283d7ce9ee8934d1caa60ef +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d7ce2e01658cebe3086b25ae67c184cbb26e4855bc9c03a82c149948ea9a4e + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d8021192b02d5946c7e1e789d60c9c06 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466388958d71fa742cfe4c44b889e03b468 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=674d3b19a02535626dfcb13bd383509b715566cf53e9f31ac161944d38b7c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=aefd829d861f03d0d8c4bfedbb520f7c1837a46e2e1b26896063783b1cba4b + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625402790d4c1ebce1325c633c1f1ea80ad4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe65d3f16b8c5ccf188f663b2183c2fd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42e238b4b6180654120bdb79734c6bbf8d47cc49f94689740b89443a5f809c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=556615110f73692755058a5f80d58f952a3eecccd14006edf6dcff48f44b5a + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a8a2e2a6065a7666ddee18705efd8639 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b3385c8f08a91f06deff7077b00932f4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19e26089ed5d9ec2cd5a9488c012880c76670e7b6ef405e518a658008f829c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32a0cd0ddbbe90796cde8048bc59f2c3544948b03e6675e4ae0437baf0df06 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254eace755c4d02a6492ec15bc6fb76ca61 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846637b28fc3206f049e0d7ee41b124c12dd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0136e8d63fc19792c4a64e752e7de2ee2b61eb0ae0298595363785c8f653d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fbb11e69ee5a33728ed2823c05a6fa19dc7d73d6af4467e990e87941bd582f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419aad3185cdd8cf655a1e5c3dd7a90657bf4c873bac45f7f8225 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668f22a41cfad6486600f09fe2698e50cc3657fc2261cd5b29f73c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=674d3b19a02535626dfcb13bd383509b715566cf53e9f31ac161944d38b7c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=aefd829d861f03d0d8c4bfedbb520f7c1837a46e2e1b26896063783b1cba4b + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c98a7a53fef3f35c47556529a7f0d50cb2a15c56501f76d59e09 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666d587d79056823bbadec39dee9aa9580e4f45bcf104f273ea3b1 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42e238b4b6180654120bdb79734c6bbf8d47cc49f94689740b89443a5f809c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=556615110f73692755058a5f80d58f952a3eecccd14006edf6dcff48f44b5a + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543deac12a288a3ffb2541fd331a5da4e660281d6803a335926020 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846639f393a7a74357488e1fbb252c4678b320a0f82ec35209798870 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19e26089ed5d9ec2cd5a9488c012880c76670e7b6ef405e518a658008f829c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32a0cd0ddbbe90796cde8048bc59f2c3544948b03e6675e4ae0437baf0df06 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254935aac7f2c79135a1ae9ad51b5ce8d469acc4b9630f97992db02 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b1b80dee04d5354522d814e28e9e074e1cd71345e2fe6c0e8725 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0136e8d63fc19792c4a64e752e7de2ee2b61eb0ae0298595363785c8f653d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fbb11e69ee5a33728ed2823c05a6fa19dc7d73d6af4467e990e87941bd582f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625494c0722b15726c73e42293762f1f231b +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668b06fbd531249a47de97b5d0a1d28204 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=674d3b19a02535626dfcb13bd383509b715566cf53e9f31ac161944d38b7c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=aefd829d861f03d0d8c4bfedbb520f7c1837a46e2e1b26896063783b1cba4b + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df63a84e581cf0ee95c5bee20b388692 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9172f26d7b9526845b62124cc08260e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42e238b4b6180654120bdb79734c6bbf8d47cc49f94689740b89443a5f809c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=556615110f73692755058a5f80d58f952a3eecccd14006edf6dcff48f44b5a + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546b84654df558648f7477ce7e3408ce12 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe1815dab93dffb8ae0b5f9134ddc4de +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19e26089ed5d9ec2cd5a9488c012880c76670e7b6ef405e518a658008f829c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32a0cd0ddbbe90796cde8048bc59f2c3544948b03e6675e4ae0437baf0df06 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545f1e8dfaa017156a4d6b5d8c99129763 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466902a71bf779743a6844bd76f6c8bf029 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0136e8d63fc19792c4a64e752e7de2ee2b61eb0ae0298595363785c8f653d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fbb11e69ee5a33728ed2823c05a6fa19dc7d73d6af4467e990e87941bd582f + +handshake=Noise_KK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625419aad3185cdd8cf655a139d31873c6117854954b8fd22d9e6489 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668f22a41cfad6486600f0fbb4ae670da71c5206d2817405a505d7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=674d3b19a02535626dfcb13bd383509b715566cf53e9f31ac161944d38b7c1 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=aefd829d861f03d0d8c4bfedbb520f7c1837a46e2e1b26896063783b1cba4b + +handshake=Noise_KKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c98a7a53fef3f35c4755296b675ec07df2f17c802c6264ef8d4a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666d587d79056823bbadec72c5647701d2468995235e0e2dfa6130 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=42e238b4b6180654120bdb79734c6bbf8d47cc49f94689740b89443a5f809c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=556615110f73692755058a5f80d58f952a3eecccd14006edf6dcff48f44b5a + +handshake=Noise_KKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543deac12a288a3ffb25418beeca17308cd9c7c9931d1ab774f12f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846639f393a7a74357488e1f1ba5d4c24b572488251c32b03de1ab63 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19e26089ed5d9ec2cd5a9488c012880c76670e7b6ef405e518a658008f829c +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=32a0cd0ddbbe90796cde8048bc59f2c3544948b03e6675e4ae0437baf0df06 + +handshake=Noise_KKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254935aac7f2c79135a1ae93f52e8f9b4b46fb2393b2bdacb48565c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b1b80dee04d5354522d85eed0973dca2d7cee4415256eac4724d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=a0136e8d63fc19792c4a64e752e7de2ee2b61eb0ae0298595363785c8f653d +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=fbb11e69ee5a33728ed2823c05a6fa19dc7d73d6af4467e990e87941bd582f + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fa9441324a92794acc0183591dd9d557e9d2251ff81cb8e7b6a34939ac4036f7d53a2007a3c8f072b93fd48bc802cb515be42a451820b25defc737ce7e3a02e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab1d23a9f710a0149ddbb596f968be2ed7afbdc065d8fed5168472f4e0c263 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=173b29d07b7e78108bab3bf145eba669861543b85910a5d60e101d1b57ca02 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254fbe8dfe276679b474bd9e513b64634df +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e15aaba5d9237372cd606332278a7fafe502bf5da959448b7aba91aa233b84269c46c3dc622e69a9460016f8e316da4ce33ff43f9a694008b6ea9c4733b37c5b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d669f1665b76c5081948c04c3f8fcdadbedb03fc0bf735bccead480c9d07d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f1bbc916980b6e57f5c73900c8c3a59e793ec656a08153f0907ddd48c32656 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f921f0b4cdcc7390e29c00352a70c592 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c275a8088f895e9da65446a1e0f546af2cb58f8ca255a901d607c04862c05d4e714660c2232771711e2f32a3d7d1fc99b177e7ea52743ae3aff0ac71c858c32d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6d6afdf7b42a9b89cb2d10db38215064e496f4a7b4a6ed07a6c3ca9079121b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22fa156f8584ac9649c136dc97aadc118b2228ead75adb7a613bad01296099 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625456287ced9403b4417a01582209846ee8 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1cd0d53bab3c8076ab5f5c8dc0b79628e1e24b179f2b9e83dd9a891c527a2381bfb9a4a59efab9610fe21a425f698732f6a98356e740fb037f721ba9858e9b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0ca7d068c7d39806366bbf7e93af4348300523ce01d7e96c89de8e4fbb9ca8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a7675930bc1cefe9a1f84f535b3b583cefcfac329838e7bb176f226570f7a6 + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fa9441324a92794acc0183591dd9d557e9d2251ff81cb8e7b6a34939ac4036f40ffb1456c9e640da7023f3fd1a4082eb2be7bcc73a2ab41fc9d67482e64e47f175e3ab4b97fda1ff7cf +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab1d23a9f710a0149ddbb596f968be2ed7afbdc065d8fed5168472f4e0c263 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=173b29d07b7e78108bab3bf145eba669861543b85910a5d60e101d1b57ca02 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549466b62462582414c580a5d26559f913770e8ff43e82d1d11c2a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e15aaba5d9237372cd606332278a7fafe502bf5da959448b7aba91aa233b8426256c0bce8d8a8a48e6749218b6bf4d1fbc50c9616d0018183df12bc6a32a5ae685e786e15ae420fdf1ea +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d669f1665b76c5081948c04c3f8fcdadbedb03fc0bf735bccead480c9d07d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f1bbc916980b6e57f5c73900c8c3a59e793ec656a08153f0907ddd48c32656 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dbd5e20809d301052b4953b63dab04cbb1bdca9ce948132bc6a1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c275a8088f895e9da65446a1e0f546af2cb58f8ca255a901d607c04862c05d4e24b1f1a06cbbd9ca58c102cf6df58054a0cc0aee27153e563b6628d04492ddabf898e9d3dc88cb05caf9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6d6afdf7b42a9b89cb2d10db38215064e496f4a7b4a6ed07a6c3ca9079121b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22fa156f8584ac9649c136dc97aadc118b2228ead75adb7a613bad01296099 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625414fde92796c7eb025037438eeacbdcb2c0c94f049ba861860b0e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1cd0d53bab3c8076ab5f5c8dc0b79628e1e24b179f2b9e83dd9a891c527a238ba5e4798d9a8c59fe6c7a32b28904c7c29b8a81fc40825e8f546253cd908c607f8a37a276f13e12db216 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0ca7d068c7d39806366bbf7e93af4348300523ce01d7e96c89de8e4fbb9ca8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a7675930bc1cefe9a1f84f535b3b583cefcfac329838e7bb176f226570f7a6 + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fa9441324a92794acc0183591dd9d557e9d2251ff81cb8e7b6a34939ac4036f8651a0e993975aeea53e4113ada3b7d80688689fa70e534841d31e505db9fc63 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab1d23a9f710a0149ddbb596f968be2ed7afbdc065d8fed5168472f4e0c263 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=173b29d07b7e78108bab3bf145eba669861543b85910a5d60e101d1b57ca02 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541c6e2b9c9a65d9194cb1f369e1afd5e4 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e15aaba5d9237372cd606332278a7fafe502bf5da959448b7aba91aa233b842681582921e2a265120960fdd7a5c4863d4c3ca740b0fdea11e84d42a79641712c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d669f1665b76c5081948c04c3f8fcdadbedb03fc0bf735bccead480c9d07d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f1bbc916980b6e57f5c73900c8c3a59e793ec656a08153f0907ddd48c32656 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254acd1745c885149a64ce7f3481dee508a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c275a8088f895e9da65446a1e0f546af2cb58f8ca255a901d607c04862c05d4e2bc44f07f0001ff465418b2180d8b01c70915587643ff6e707d27eb1203bebf0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6d6afdf7b42a9b89cb2d10db38215064e496f4a7b4a6ed07a6c3ca9079121b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22fa156f8584ac9649c136dc97aadc118b2228ead75adb7a613bad01296099 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254435325bcaf808e2b1a57d1e0cfadda3a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1cd0d53bab3c8076ab5f5c8dc0b79628e1e24b179f2b9e83dd9a891c527a238e295e298959aeaec8ba42bb0c2fccc99632cbcccec4341a272657bbb1e6589bd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0ca7d068c7d39806366bbf7e93af4348300523ce01d7e96c89de8e4fbb9ca8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a7675930bc1cefe9a1f84f535b3b583cefcfac329838e7bb176f226570f7a6 + +handshake=Noise_NX_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662fa9441324a92794acc0183591dd9d557e9d2251ff81cb8e7b6a34939ac4036fbd4d474a60b9243549e661a23fbe6818b2be7bcc73a2ab41fc9dc20c5b432f6d1d06b2f0d17c51070d3a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=ab1d23a9f710a0149ddbb596f968be2ed7afbdc065d8fed5168472f4e0c263 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=173b29d07b7e78108bab3bf145eba669861543b85910a5d60e101d1b57ca02 + +handshake=Noise_NXpsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549466b62462582414c580478ce9b85bd9aa77e54f67f4dd6c5d82 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e15aaba5d9237372cd606332278a7fafe502bf5da959448b7aba91aa233b84269fc00380622f9c2cbdcac0ed827cdd4cbc50c9616d0018183df16dc0cdbe1194bbeb74960015ce712022 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d669f1665b76c5081948c04c3f8fcdadbedb03fc0bf735bccead480c9d07d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=f1bbc916980b6e57f5c73900c8c3a59e793ec656a08153f0907ddd48c32656 + +handshake=Noise_NXpsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dbd5e20809d301052b493609a928ec2fe986655186f645a7791c +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c275a8088f895e9da65446a1e0f546af2cb58f8ca255a901d607c04862c05d4e7fbc9e638653a16fd2d3f653dc377ccca0cc0aee27153e563b668fcabf727f2fe6d5dd0dda9dd235599d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6d6afdf7b42a9b89cb2d10db38215064e496f4a7b4a6ed07a6c3ca9079121b +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=22fa156f8584ac9649c136dc97aadc118b2228ead75adb7a613bad01296099 + +handshake=Noise_NXpsk2_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625414fde92796c7eb025037e305fb9a4b18616d971a36b6852f7315 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a1cd0d53bab3c8076ab5f5c8dc0b79628e1e24b179f2b9e83dd9a891c527a238b0b828d5c244b4c3c239b1c7b2ddbab729b8a81fc40825e8f5466d7e958a84ff6b12e1af4fbba9a29b50 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=0ca7d068c7d39806366bbf7e93af4348300523ce01d7e96c89de8e4fbb9ca8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=a7675930bc1cefe9a1f84f535b3b583cefcfac329838e7bb176f226570f7a6 + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664da461bfc2d7e228776700246eecb12bc654b92fef771afb5c6c6645648e11d847f40b2d552be046c38b3882103e86fc283c15084a8b61fd16d83e556498ec48 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f2705e50e8767f26211b34d7fed7756365369d16d09beb7c2242bf73344bdf +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d5a714198d09c66a53b7430a506394c4fc09cf01ba87a63be5cc6a3950971 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a708d17c82987917466c1283e27a5243 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dade0aaee91efc2a450b6473fb57348ce567f479f3434272157f7a1c1e9c910c7561bf41b5d645b6ddc9fed8e78bee6123322e497d2a8304888aadfdf2827cac +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=37146cfbb188da3bfa49c5395f5efe6192d71715dad654f752818b62cd4cf8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c1087fdfc98033ebd073c253f5cd07c491e345b60eb2db754b6081bda1264 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541b2c9cd52bff4bc2f41a75e8e23b4eed +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633507ddc0579de7fbe76c684d63e57d543196a324296bc48cd1c7c4573daf945cf06ccbe204667df4aceffdeb4414bf94d1357942e5206de77985c5cdd40844e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1b7d27ab5b443523ae268ca3d793470450e01704618a971ca391b115ac6c98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=62ea5681b380e2a9c1a386ba08bca2ded5a8a6f596841dacce9d9f25c51ad1 + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e3680648d1d20449b7c0aea4203871b0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b217bad95312cabcc05c2faa1d4c06b0e11b9dcb71f1e37e6970a55e24352b61482a9701a39f039df362b5cbc297a1b5b5769b45d14697675b25c72ec6f41fb6 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c63441220a5aea59a924dc2f03c5f19d6dbf065d3f1fbeffb8c2a9443eba4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=12296e1c0a21fd13cbe935d4bff4855f097bfa6b56a5220b8bed38c222a82b + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664da461bfc2d7e228776700246eecb12bc654b92fef771afb5c6c6645648e11d85f7ae53e16f2f8b10e6f6f77e6b737d17e65818a7649a0dd819b8b79f1e8aadf3dab7f4ccfdb86dbd5b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f2705e50e8767f26211b34d7fed7756365369d16d09beb7c2242bf73344bdf +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d5a714198d09c66a53b7430a506394c4fc09cf01ba87a63be5cc6a3950971 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aa9944ef5862e98b59774e7c724731a7c9ad55bb23e759b6155e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dade0aaee91efc2a450b6473fb57348ce567f479f3434272157f7a1c1e9c910c26475971134b2de5ed2acfcc024a4126fa5a09cfc607150eab573e9d106f9c538e33d45efaa6f7bcb45e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=37146cfbb188da3bfa49c5395f5efe6192d71715dad654f752818b62cd4cf8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c1087fdfc98033ebd073c253f5cd07c491e345b60eb2db754b6081bda1264 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254852022ca0041d1875ce9c1e0a87166a72b54e2be548b4fb70b10 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633507ddc0579de7fbe76c684d63e57d543196a324296bc48cd1c7c4573daf945617479de0875fba178c5c9adf3280df5cfc231db12d274de858364a5245306776132c263d487322b63f8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1b7d27ab5b443523ae268ca3d793470450e01704618a971ca391b115ac6c98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=62ea5681b380e2a9c1a386ba08bca2ded5a8a6f596841dacce9d9f25c51ad1 + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254db02872b3c4193584b69762d97fb9f89abbdd582b7f8e5dc6e22 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b217bad95312cabcc05c2faa1d4c06b0e11b9dcb71f1e37e6970a55e24352b612c433e36f398b4e463e0d77434f8ad9e7ed2ee1f9beeed0a3e868ad2d0f36605870fbacd13fae104a316 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c63441220a5aea59a924dc2f03c5f19d6dbf065d3f1fbeffb8c2a9443eba4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=12296e1c0a21fd13cbe935d4bff4855f097bfa6b56a5220b8bed38c222a82b + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664da461bfc2d7e228776700246eecb12bc654b92fef771afb5c6c6645648e11d8b0cfe2f8e48e009af03e6420e5f0dfab42491c7c224bb630b73d159ef7ff18a8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f2705e50e8767f26211b34d7fed7756365369d16d09beb7c2242bf73344bdf +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d5a714198d09c66a53b7430a506394c4fc09cf01ba87a63be5cc6a3950971 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625467be4845bb485599879d5d2744ffc023 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dade0aaee91efc2a450b6473fb57348ce567f479f3434272157f7a1c1e9c910c8cd74cab21809c5bf9ae94a3e74d9bd17fafd70a1360983530c8574e62567f74 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=37146cfbb188da3bfa49c5395f5efe6192d71715dad654f752818b62cd4cf8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c1087fdfc98033ebd073c253f5cd07c491e345b60eb2db754b6081bda1264 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a32d10e5390ce2550ad276761ef7889f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633507ddc0579de7fbe76c684d63e57d543196a324296bc48cd1c7c4573daf945c1ee27fed069cbac9996f122e1180aabed9b592cbde022e46d84a11941ec1527 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1b7d27ab5b443523ae268ca3d793470450e01704618a971ca391b115ac6c98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=62ea5681b380e2a9c1a386ba08bca2ded5a8a6f596841dacce9d9f25c51ad1 + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a8e1f464d3fd4aca7a283f32c0d816e2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b217bad95312cabcc05c2faa1d4c06b0e11b9dcb71f1e37e6970a55e24352b61c7fe2e8c86a9322bb9d26850cf0727c55e3172f310413bb5addfba93df599150 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c63441220a5aea59a924dc2f03c5f19d6dbf065d3f1fbeffb8c2a9443eba4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=12296e1c0a21fd13cbe935d4bff4855f097bfa6b56a5220b8bed38c222a82b + +handshake=Noise_KX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664da461bfc2d7e228776700246eecb12bc654b92fef771afb5c6c6645648e11d8d792d9531d4982940eb0f25d701902557e65818a7649a0dd819b2669d91c8e90827d6252b0855edaee1c +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=f2705e50e8767f26211b34d7fed7756365369d16d09beb7c2242bf73344bdf +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5d5a714198d09c66a53b7430a506394c4fc09cf01ba87a63be5cc6a3950971 + +handshake=Noise_KXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254aa9944ef5862e98b5977fc452078277dd82650680c3709420ece +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466dade0aaee91efc2a450b6473fb57348ce567f479f3434272157f7a1c1e9c910cf73243ef2c5e6e04886629ee23126d86fa5a09cfc607150eab57ab0e1c47090e4d87caebb8180cc5dcde +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=37146cfbb188da3bfa49c5395f5efe6192d71715dad654f752818b62cd4cf8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=5c1087fdfc98033ebd073c253f5cd07c491e345b60eb2db754b6081bda1264 + +handshake=Noise_KXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254852022ca0041d1875ce967af157e5a16f3b94544b7e3f6559950 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846633507ddc0579de7fbe76c684d63e57d543196a324296bc48cd1c7c4573daf9450e09353924859de4e199926441bb4f4fcfc231db12d274de858332825a59715f48ae8b81da85503919df +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=1b7d27ab5b443523ae268ca3d793470450e01704618a971ca391b115ac6c98 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=62ea5681b380e2a9c1a386ba08bca2ded5a8a6f596841dacce9d9f25c51ad1 + +handshake=Noise_KXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254db02872b3c4193584b69e13c7bfd4702fbbf8be5dec60f1f1a2b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b217bad95312cabcc05c2faa1d4c06b0e11b9dcb71f1e37e6970a55e24352b617c6c0a311097ecff8bb1f324e9802f137ed2ee1f9beeed0a3e869b49f84fc648bc5733d5fe944589a4f0 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=4c63441220a5aea59a924dc2f03c5f19d6dbf065d3f1fbeffb8c2a9443eba4 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=12296e1c0a21fd13cbe935d4bff4855f097bfa6b56a5220b8bed38c222a82b + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667c3bcb8aa57d16c472e5884f7f10d713 +msg_2_payload= +msg_2_ciphertext=3fd53af07c2c674ca7cf182726641c4c02d7c8d3b0dfecdafecf43b741fac77b9cb60225da2079f22ff4bd57a995175986d65b89a24315d2300e04f08b1214c3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3907e2136f0103c819943689cceace3d4f5428bedab749d25ae8afdaf5ef74 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=99cce8f25e45b84ea11bb53afa95131a80faed0345ed3f328b830166eaed5a + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e536bf7659b705b260e11326d088608d +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466384980e3852095d08dd4418f4b9d766a +msg_2_payload= +msg_2_ciphertext=f336d406e1f75f3ffd3865c92ce137c55e37dc49e27210e05254c2ec3ad7ee4a1199e9838d05b8562d459f0be3ed09e900a3967b6ac1bf68178cbf4f4f521b9f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dee33db18e140806fbdc44c4f3b2d7860948d4cc1938dae2dd41e13146756d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=284090b027f87c4dd51fe38650b3703a08b06dd9022e6d2ffc7f2b04a28459 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d5bdd95205c45c1e7b522000e02ae624 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667ac2f4af89e151b584a2b7cedf3b98af +msg_2_payload= +msg_2_ciphertext=0d06059800951529977ab99abf46011735b52bc602ed118b505e013091719a081d41709ebae85b753a5e4a220c6de5a175240be1b0ff56d32ccd60374d607b55 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0d616739d9678ba60390dfb5a27c4f636820ea559fcd84a049ce5c785cbee3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6f68ab6c0bffe6cebc38e8351dbd50541a4e645e765db0b3582db6711216e2 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545ced8cfad93ee839f831bf40f350d394 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846636c9388f83f1d795eba433e3a85f6b71 +msg_2_payload= +msg_2_ciphertext=6ffc44aa06250c17e707f2496732412ed194ea271ed8d0db223b9db3cec1719c4ee79d0d034be157e33048185c964495b331be70f390d09d6d63b7d21b3bc0cf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1d203dde50bb9c29b43ea61990dc7f33af190af9c04ca8e2dde93314f17e83 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=78be8aa2d277eb4e3dfb5e3f8de1b46b8bf8a0369ed052fde5c5ddb35f3d1b + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662549ab9834e132b8bb4879a23b62843fcbf +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bb3e012f72892b7e941bce96ca2ea563 +msg_2_payload= +msg_2_ciphertext=c533dd475d8136b5aeaa4c5113f90ad850eb9f23b6b4c6101f361d28ae49237bdfd0f3ef74d4d4dba6327fde952c82d924aa3af517292ccf6a663aedafb523ae +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e2eac4b51925c4c1a6d132387b7e72cdb73d43a28e5a77d0792fa9741803ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=bd4e9d62222743b195d68b066ec04f67fdc2303d73abf6fbd9a2256d3a03aa + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846668e545d2dc0b6d33da9fd24ad31b9b33f8a2bd66c94ffc254f41 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3fd53af07c2c674ca7cf182726641c4c02d7c8d3b0dfecdafecf43b741fac77bcfa35e90e3132d80034ed9b23241a0efd3f7500318405c3518dba6b669ea10904eba266c29ab90fc722f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3907e2136f0103c819943689cceace3d4f5428bedab749d25ae8afdaf5ef74 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=99cce8f25e45b84ea11bb53afa95131a80faed0345ed3f328b830166eaed5a + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a9ea932312f389043a091fca6aea3f0dd2859c7c60729aa8c714 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466473a0058daa80d9c2e3d297344328bfcfa46eb6b8e4022a115b5 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f336d406e1f75f3ffd3865c92ce137c55e37dc49e27210e05254c2ec3ad7ee4a99bac244d3d9414db9516c6eaa31537bbf7fdff96934ac26427ec01d5f97303ba310f8b5d310f5590972 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dee33db18e140806fbdc44c4f3b2d7860948d4cc1938dae2dd41e13146756d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=284090b027f87c4dd51fe38650b3703a08b06dd9022e6d2ffc7f2b04a28459 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a47374f2616d600032043446710da74f47e21009109681b36f63 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622ec1deae64ffca2c0e9a4719b0ac129654a6acec3acfdf100a8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0d06059800951529977ab99abf46011735b52bc602ed118b505e013091719a0818a72afc1a92deb5ac2e19e428bc75ec462350558a18072bb0fb30156b1ea8a40a2c70af2e9bf20ad691 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0d616739d9678ba60390dfb5a27c4f636820ea559fcd84a049ce5c785cbee3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6f68ab6c0bffe6cebc38e8351dbd50541a4e645e765db0b3582db6711216e2 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400c129b407b0e1a7e81cd0856da2332b21089505096cb0f590c5 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e5d916dabcaa33741dd98e41128d5e0f20a6a45671f3d1848c2b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=6ffc44aa06250c17e707f2496732412ed194ea271ed8d0db223b9db3cec1719cc83c5ae88e63fc64b2dfff43b873a068b95e7190573128cae00b528948bb3b6e234c1e93e9612e96e781 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1d203dde50bb9c29b43ea61990dc7f33af190af9c04ca8e2dde93314f17e83 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=78be8aa2d277eb4e3dfb5e3f8de1b46b8bf8a0369ed052fde5c5ddb35f3d1b + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254abb638c9b7f9e37475bc13b640bcd2413ef6ac24ddfc1b375856 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b1d6ab5f61f9808b5ba36778c746d1dd4ef83c6344dab022aab +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c533dd475d8136b5aeaa4c5113f90ad850eb9f23b6b4c6101f361d28ae49237b5a205d18fc908864cac4b3687c9bab1160a25c00f34525741269fff47fe9804b1ea44f2af599eda0f6a3 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e2eac4b51925c4c1a6d132387b7e72cdb73d43a28e5a77d0792fa9741803ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=bd4e9d62222743b195d68b066ec04f67fdc2303d73abf6fbd9a2256d3a03aa + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466608b752c761dbdbff13c1cf118a78012 +msg_2_payload= +msg_2_ciphertext=3fd53af07c2c674ca7cf182726641c4c02d7c8d3b0dfecdafecf43b741fac77b5d6677b9332a441dfa111bc6567e02e3f00da36393accef162e17752f5678f96 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3907e2136f0103c819943689cceace3d4f5428bedab749d25ae8afdaf5ef74 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=99cce8f25e45b84ea11bb53afa95131a80faed0345ed3f328b830166eaed5a + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ec1ea27017f8e7707f18f51064fd2add +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466802a509fd08046ae49f47f74a4e0ccc6 +msg_2_payload= +msg_2_ciphertext=f336d406e1f75f3ffd3865c92ce137c55e37dc49e27210e05254c2ec3ad7ee4a1684c6ebf8ef1e82a68eb2b50a3099ed665dc1639b91800662be46495764ae43 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dee33db18e140806fbdc44c4f3b2d7860948d4cc1938dae2dd41e13146756d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=284090b027f87c4dd51fe38650b3703a08b06dd9022e6d2ffc7f2b04a28459 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547cab3a68cd70802365a6f31f3bd5404e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846661068b4ce2fe89e3b22be23143b20354 +msg_2_payload= +msg_2_ciphertext=0d06059800951529977ab99abf46011735b52bc602ed118b505e013091719a085ee2b4469aa934e1e0120d07cb930ba2333bdc2aebcb22fb4a1ce4237331866d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0d616739d9678ba60390dfb5a27c4f636820ea559fcd84a049ce5c785cbee3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6f68ab6c0bffe6cebc38e8351dbd50541a4e645e765db0b3582db6711216e2 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce578828a73922e9e4dffa89512bc9a2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466de48548f3293ba62560009b242fee319 +msg_2_payload= +msg_2_ciphertext=6ffc44aa06250c17e707f2496732412ed194ea271ed8d0db223b9db3cec1719c17ea0785e8debcf3099f7d5eedf069ed765e74a75a323ab224a3738a926ce4fa +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1d203dde50bb9c29b43ea61990dc7f33af190af9c04ca8e2dde93314f17e83 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=78be8aa2d277eb4e3dfb5e3f8de1b46b8bf8a0369ed052fde5c5ddb35f3d1b + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542242c47f31f968ccc897da360e62a083 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662f7cedc69bd3185e75f1b4d3809a6402 +msg_2_payload= +msg_2_ciphertext=c533dd475d8136b5aeaa4c5113f90ad850eb9f23b6b4c6101f361d28ae49237bb9f6442a7516ac401971a31b8079c7f66626d3685e14f06a107bec76b02d16a1 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e2eac4b51925c4c1a6d132387b7e72cdb73d43a28e5a77d0792fa9741803ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=bd4e9d62222743b195d68b066ec04f67fdc2303d73abf6fbd9a2256d3a03aa + +handshake=Noise_XN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846668e545d2dc0b6d33da9f921c05aa32b4aa4dd9d7b520452ff0d3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=3fd53af07c2c674ca7cf182726641c4c02d7c8d3b0dfecdafecf43b741fac77b589759479eeb6de299615797705822d6d3f7500318405c3518db94f99a9ee65a5cbdfc4901fe80c7d645 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=3907e2136f0103c819943689cceace3d4f5428bedab749d25ae8afdaf5ef74 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=99cce8f25e45b84ea11bb53afa95131a80faed0345ed3f328b830166eaed5a + +handshake=Noise_XNpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a9ea932312f389043a0905f635244ebed0c959d850a67d2bfcdb +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466473a0058daa80d9c2e3dcab025910801eed3e0cdb0fb880d3d6b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=f336d406e1f75f3ffd3865c92ce137c55e37dc49e27210e05254c2ec3ad7ee4a368bf01b9da36e4ce6b554e8b73dab13bf7fdff96934ac26427ebbb2701fc32e0ffccb9c3bb8b0aefb75 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=dee33db18e140806fbdc44c4f3b2d7860948d4cc1938dae2dd41e13146756d +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=284090b027f87c4dd51fe38650b3703a08b06dd9022e6d2ffc7f2b04a28459 + +handshake=Noise_XNpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a47374f2616d600032047892120a00630119ec5dc6a4442dda22 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622ec1deae64ffca2c0e9c34fa5a2bbf1968c6d2c1d80fc911a28 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0d06059800951529977ab99abf46011735b52bc602ed118b505e013091719a08f99960c571a1598776bac8555377f9d7462350558a18072bb0fbed68cd772ec5bc4899aeffa332303bfb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=0d616739d9678ba60390dfb5a27c4f636820ea559fcd84a049ce5c785cbee3 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=6f68ab6c0bffe6cebc38e8351dbd50541a4e645e765db0b3582db6711216e2 + +handshake=Noise_XNpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400c129b407b0e1a7e81ca404bfbae707682f2c14be89ae10c1d8 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466e5d916dabcaa33741dd926fadac6a68a33856977d6b9809f174b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=6ffc44aa06250c17e707f2496732412ed194ea271ed8d0db223b9db3cec1719ce8e013412dd540377d8d28be4b70dc54b95e7190573128cae00b52f12a95c947a65121d7b922ba35ef3d +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1d203dde50bb9c29b43ea61990dc7f33af190af9c04ca8e2dde93314f17e83 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=78be8aa2d277eb4e3dfb5e3f8de1b46b8bf8a0369ed052fde5c5ddb35f3d1b + +handshake=Noise_XNpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254abb638c9b7f9e37475bc49791331a682b67199936ecb513e38c6 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484661b1d6ab5f61f9808b5bac4d0141615d581366e86cf1c7c01310b +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=c533dd475d8136b5aeaa4c5113f90ad850eb9f23b6b4c6101f361d28ae49237b7fb184f15e468b37794ce697f1bc1ec960a25c00f34525741269d02c60c542110a1f17bd4fda90a7b3bf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=e2eac4b51925c4c1a6d132387b7e72cdb73d43a28e5a77d0792fa9741803ef +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=bd4e9d62222743b195d68b066ec04f67fdc2303d73abf6fbd9a2256d3a03aa + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bf81cc58fc81923794e9cb78b175e98f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19cc2591829276b739f9f5b1deb652104dc294700bfa4bff444556a1eb66a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79d57fd9146cc45d81a557ccb290399035dee037ad22c8371fb245eea2a937 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e53b95e290bf8014fe7d452af24a73fec879b75957a17db1f438bcc24f70495334d65fed40a1f58a9a10cebb1fad680bc94b53651dc947759b6c639ef74b6de +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666fcc7926e731cd7c4fd845094bb80e47 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2355e5c0f0d55bab43293892b2560f6d625596a578d4688a84723a0e97afa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=33747bd7e8cd49233efc2b656b41a9ef65fbd5435320b83260b3ab33d71b1e + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452bc63f42d0ef66c39248c5cfdc031cacb4c05da27eac1e2da9dc4e76a8c85c97398cb24c0e3770a64c92be982b477907c6ec27d84ab39aa5182d2a2c372cdae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846667dfafc165b8d7c12f5b3dfdb65a3e2d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=336f4092772f3176d10c7bc03010e9b478b4cac44381de9ebe043c1ef5a46e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=06926f4dab3ecdf3d21d9e823d767be93e539cdb751c196465d0b05721229c + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541905fbbca99a3dae4a0e7dfc37f07ea4a5e4482ed7639d9c957eac004eb91b1964d790510ea069614527929196d827e38e8026e56b9e9d4fecf24dc12ee4556c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666ef6fc0cfd40f5cc18f051ab1a038f20 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=435fd3ce23b58ba31718d8851ab789a904d59c6aad42259d48a9ce3966fde9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b1703823277c5285e8d3dbb9f6d5e87b77eb8a80f12ceea78de50f0a39a6c9 + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b7f5acb19587ea6253e2dd0e216a6edd1deb1c0e132cd18977f3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19cc2591829276b739f9f5b1deb652104dc294700bfa4bff444556a1eb66a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79d57fd9146cc45d81a557ccb290399035dee037ad22c8371fb245eea2a937 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e53b95e290bf8014fe7d452af24a73fec879b75957a17db1f438bcc24f70495334d65fed40a1f58a9a10cebb1fad68014380d2bea0381c1510e67e5d0b8776c202c821ae1403340c30a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664a001ad9502defe28afd10d518c7a7c7500451e748ac3a7af324 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2355e5c0f0d55bab43293892b2560f6d625596a578d4688a84723a0e97afa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=33747bd7e8cd49233efc2b656b41a9ef65fbd5435320b83260b3ab33d71b1e + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452bc63f42d0ef66c39248c5cfdc031cacb4c05da27eac1e2da9dc4e76a8c85c97398cb24c0e3770a64c92be982b47790eb1556d2552e1ad7246336cdd4e094fd89ddefeca031320b6331 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663554a6fc7e2cb03ff28cd7c1b199ee0b0e112ed1e01545886262 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=336f4092772f3176d10c7bc03010e9b478b4cac44381de9ebe043c1ef5a46e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=06926f4dab3ecdf3d21d9e823d767be93e539cdb751c196465d0b05721229c + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541905fbbca99a3dae4a0e7dfc37f07ea4a5e4482ed7639d9c957eac004eb91b1964d790510ea069614527929196d827e3359e9010a82b92594f4d8f37f110d89ddea2428fd23087113089 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff02318aba77b517f05b7b59fa9e11a4838e31504dfe99625976 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=435fd3ce23b58ba31718d8851ab789a904d59c6aad42259d48a9ce3966fde9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b1703823277c5285e8d3dbb9f6d5e87b77eb8a80f12ceea78de50f0a39a6c9 + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846632e0ebbe49f1eb985aae92e521edf80e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19cc2591829276b739f9f5b1deb652104dc294700bfa4bff444556a1eb66a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79d57fd9146cc45d81a557ccb290399035dee037ad22c8371fb245eea2a937 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e53b95e290bf8014fe7d452af24a73fec879b75957a17db1f438bcc24f70495155c30fea666bba0fc0ae69c4c3892c154dcfb7b599413a962eeb3d24ad9e8e2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466276df8c1ea699ceec119c8325ba3eac3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2355e5c0f0d55bab43293892b2560f6d625596a578d4688a84723a0e97afa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=33747bd7e8cd49233efc2b656b41a9ef65fbd5435320b83260b3ab33d71b1e + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452bc63f42d0ef66c39248c5cfdc031cacb4c05da27eac1e2da9dc4e76a8c85c90450ae312299b436e3950e316d28b5c0ad15e29ba03f6668dcde2109f6c74e97 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c12c9edb807ded3c07db4936d0c7e41e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=336f4092772f3176d10c7bc03010e9b478b4cac44381de9ebe043c1ef5a46e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=06926f4dab3ecdf3d21d9e823d767be93e539cdb751c196465d0b05721229c + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541905fbbca99a3dae4a0e7dfc37f07ea4a5e4482ed7639d9c957eac004eb91b195ce984c7b5582ba0dfcb498774dc44f5ab63c89ec6b9ac8067f9267dcc1a63f1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe750a4d7c95a9f0882b1a9c26a77542 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=435fd3ce23b58ba31718d8851ab789a904d59c6aad42259d48a9ce3966fde9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b1703823277c5285e8d3dbb9f6d5e87b77eb8a80f12ceea78de50f0a39a6c9 + +handshake=Noise_IN_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b7f5acb19587ea6253e2e4d6e53530bd10bc9560791f93b225c8 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=19cc2591829276b739f9f5b1deb652104dc294700bfa4bff444556a1eb66a8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=79d57fd9146cc45d81a557ccb290399035dee037ad22c8371fb245eea2a937 + +handshake=Noise_INpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543e53b95e290bf8014fe7d452af24a73fec879b75957a17db1f438bcc24f70495155c30fea666bba0fc0ae69c4c3892c114380d2bea0381c1510e3621bfe83997a122e8107ba562249f8f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664a001ad9502defe28afde0277a125ce29e71973a85532a8d4437 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c2355e5c0f0d55bab43293892b2560f6d625596a578d4688a84723a0e97afa +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=33747bd7e8cd49233efc2b656b41a9ef65fbd5435320b83260b3ab33d71b1e + +handshake=Noise_INpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625452bc63f42d0ef66c39248c5cfdc031cacb4c05da27eac1e2da9dc4e76a8c85c90450ae312299b436e3950e316d28b5c0eb1556d2552e1ad724636fb85f3717f9e7f063b35b54e8a07412 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663554a6fc7e2cb03ff28c38dbd0beb45568b0a1252e49dccd5410 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=336f4092772f3176d10c7bc03010e9b478b4cac44381de9ebe043c1ef5a46e +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=06926f4dab3ecdf3d21d9e823d767be93e539cdb751c196465d0b05721229c + +handshake=Noise_INpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541905fbbca99a3dae4a0e7dfc37f07ea4a5e4482ed7639d9c957eac004eb91b195ce984c7b5582ba0dfcb498774dc44f5359e9010a82b92594f4d9fa434710f0c79fda3a3b18a0c7a626f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ff02318aba77b517f05b2125921d4c162f0a05516ccd87df7a84 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=435fd3ce23b58ba31718d8851ab789a904d59c6aad42259d48a9ce3966fde9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=b1703823277c5285e8d3dbb9f6d5e87b77eb8a80f12ceea78de50f0a39a6c9 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254a653390edbd86ba1c020a9938137fa5f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484663f75cb8ff03cce740b876919370edaa2 +msg_2_payload= +msg_2_ciphertext=2fabfb16fc114fed3616c271dbf12733184f4d2e32201ffb233a4720d451cd31e29677f21209b0009b0b1751417adb13b14852eb831d09f8061228cdce3b8dea +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15b8fdb578ed7fadbd4f6fc87fd48cd3c786ca4ac3ce3a68708ec72147b8c9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9525d9e2805470da9ec648070a03e1a5e87f0c858565adbdcf7c38d3dca90e + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254cd9f6810800376a24aff6e6e1af0db21 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466a8a4486855810a350255ae76b501d6ff +msg_2_payload= +msg_2_ciphertext=7028e105675b2294d5887e5fece5ebcad0d304fc21046b7463b3bd763f84268c46023e2baf50dd6f9adac086bada593553f9324b2c733a4f06a3eeab0424f569 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=82acd07ad6c33e3e715daa31868d729a55825b1c88d55a46a9eab5984755d6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=03d80857afae5021107843912a238783a83fa86c35a2000fa1b58b3828dd98 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c10dc3cf777958d4979adbb06f3b9de3 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668bef5c4d7ee2b435fbf3ad3aac2162fa +msg_2_payload= +msg_2_ciphertext=a77384941d395fe334060bb6480ade2cbcf4787451f6d2e8cf2c258a33e91ffae12717b78c58f43727101d020a47768034b2c8893276d463971268f0d3cda130 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=815e08cd47c188260e00166f020b2a990a8a7c31f2f6e5e64362bba39e0d8b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e13c3fd28fef752772f6a9b8c56eb26866fc1004b98f3644bbbe85829d7b48 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547848a2c529eaf0a68b9583558097b0ba +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666f94344ffb9f6d96ce88e539b7f12aa7 +msg_2_payload= +msg_2_ciphertext=0c3c7a6dc99c66a026afd6caea5b4dd660846e936276107a6f114081a82408355d8e017c861668b5d83ded9d2fad8b003fb449e8a4abc3e752f974663c1b5a69 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bbf2d5f1ea82093b94e17ba2ebaa8bed2318ba50f2449b673b41b93458c247 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=afdff82cfe53ed8c4bab4d50c197b8e23c67889a2230289e6f6fb7db7a2d56 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662545489e9d87d5dbcedc653141983ec53ac +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846613383e82ec3683f2232ca1ad16f74418 +msg_2_payload= +msg_2_ciphertext=8b7820818afedd08897101cc1e914a29767619f3e142be2673ea7ddbe042c1fa3e9dcab07b0991c815e8158f679f13e7cdd71538cd3b1e69b2360994b768dcbb +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c5dd0584674d0fd555d3ba42a4c27756e954bc3aa6dc9fd0d237fbb6479c0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ea6edad32c0e8f948cd8b94072116377acff3cab42e2de8558f89b662dfa15 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dd159df0538d164882c09160a2ccd10fdba42242c074145b85da +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664cf8cecb0ff80106624fb53f0e47e10871a53d4fca0e13a87e57 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2fabfb16fc114fed3616c271dbf12733184f4d2e32201ffb233a4720d451cd3114f0f2256fce5a731ed038a1872211679d370b0a85ae6dbf66952ead8564d9f458001c1e8732de89a6c2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15b8fdb578ed7fadbd4f6fc87fd48cd3c786ca4ac3ce3a68708ec72147b8c9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9525d9e2805470da9ec648070a03e1a5e87f0c858565adbdcf7c38d3dca90e + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542f8e3453a219c2f379b8ba373dfe48bf5c3202ee7119c5d3c1c4 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669f1384f1028d68ed124f2f6e70a6f125ff5ed65a35ba6050e3c9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7028e105675b2294d5887e5fece5ebcad0d304fc21046b7463b3bd763f84268ca70070170e3cc469c667dbcab5091d33fd527b0687d9dbe7a2f97c52db0cac5fed733ce2236fe4adca5e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=82acd07ad6c33e3e715daa31868d729a55825b1c88d55a46a9eab5984755d6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=03d80857afae5021107843912a238783a83fa86c35a2000fa1b58b3828dd98 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dee2c560cb410ffe557c7183216c289cc5f28c4b9884a67e1607 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d19c8f7fd48e7049046c83cdc13c43a33efa46793e06ff39a406 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a77384941d395fe334060bb6480ade2cbcf4787451f6d2e8cf2c258a33e91ffa3f37dc25d204f2a58f13726a1188e2697d93f7f672b4b6c4d43b8031cba8f8cb8ba90020fac4807a0b5a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=815e08cd47c188260e00166f020b2a990a8a7c31f2f6e5e64362bba39e0d8b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e13c3fd28fef752772f6a9b8c56eb26866fc1004b98f3644bbbe85829d7b48 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542cfbefa92d7f5e6f4b3b0ec725ab9f2caa61217f018017366e84 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ded51642e5afbb65c7319672be181c2fe9d0e1679f09b04d0567 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0c3c7a6dc99c66a026afd6caea5b4dd660846e936276107a6f114081a8240835255ad05e56c29a0f610ad13af2654759af0102ceda60fd259afc75f6e45742b54c5f6a3fccfd7eb8780f +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bbf2d5f1ea82093b94e17ba2ebaa8bed2318ba50f2449b673b41b93458c247 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=afdff82cfe53ed8c4bab4d50c197b8e23c67889a2230289e6f6fb7db7a2d56 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d150e2ff1a6fa2da4dacf29dbeead64fd190af0015c8fb958ca2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666426ad661ac863b4d54d09062ee2be0fd87bf3025af79cae760 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8b7820818afedd08897101cc1e914a29767619f3e142be2673ea7ddbe042c1fa401508f2f0a1db803daf9b9dabc72da48d62b45f1d64ba4b228fd30c887432718cae875d3e1651cdb662 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c5dd0584674d0fd555d3ba42a4c27756e954bc3aa6dc9fd0d237fbb6479c0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ea6edad32c0e8f948cd8b94072116377acff3cab42e2de8558f89b662dfa15 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f38769232d1dfdd5d2687e83d2e0722e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466baeeae11a657b216c68c30892d7708ca +msg_2_payload= +msg_2_ciphertext=2fabfb16fc114fed3616c271dbf12733184f4d2e32201ffb233a4720d451cd317fa53017d00d6195b1d0d2797a44f7efccfdafd47eccfcf025779b8f44a7d231 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15b8fdb578ed7fadbd4f6fc87fd48cd3c786ca4ac3ce3a68708ec72147b8c9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9525d9e2805470da9ec648070a03e1a5e87f0c858565adbdcf7c38d3dca90e + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662547f46575b56bf06e0df4be5276bd1a0c7 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665065366a41253ccb091ecff34c0979bb +msg_2_payload= +msg_2_ciphertext=7028e105675b2294d5887e5fece5ebcad0d304fc21046b7463b3bd763f84268c719a26b97ebda8d8abe1262257c00c7ff6f6066751983529bd8749ca571c8fbf +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=82acd07ad6c33e3e715daa31868d729a55825b1c88d55a46a9eab5984755d6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=03d80857afae5021107843912a238783a83fa86c35a2000fa1b58b3828dd98 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625491a6d13954cfdca1f8554bb6699a070e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484662b9b293403bc2d22af87254356ae6354 +msg_2_payload= +msg_2_ciphertext=a77384941d395fe334060bb6480ade2cbcf4787451f6d2e8cf2c258a33e91ffaa3ebf5fc392cf84011e8f30ca986e88c71f87a8b6ee1cf45cf59350de8c6c2bc +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=815e08cd47c188260e00166f020b2a990a8a7c31f2f6e5e64362bba39e0d8b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e13c3fd28fef752772f6a9b8c56eb26866fc1004b98f3644bbbe85829d7b48 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ef901c59fd43f24720cea36c3a803354 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666dbb6ee57b791434d47ca6cacfc16de8 +msg_2_payload= +msg_2_ciphertext=0c3c7a6dc99c66a026afd6caea5b4dd660846e936276107a6f114081a8240835a162ae2b6521112c8c7e1ee5e0d21aabca690cbe1cf8983e08b5ac867a436a39 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bbf2d5f1ea82093b94e17ba2ebaa8bed2318ba50f2449b673b41b93458c247 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=afdff82cfe53ed8c4bab4d50c197b8e23c67889a2230289e6f6fb7db7a2d56 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d75595f126007d31a32e936c9f50a722 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484666ef153dd2970c7fb3131dd89abc724c5 +msg_2_payload= +msg_2_ciphertext=8b7820818afedd08897101cc1e914a29767619f3e142be2673ea7ddbe042c1fa00386746b5ce8ac0e980a01f2b343db441b92b41e67266483c04995455d216e2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c5dd0584674d0fd555d3ba42a4c27756e954bc3aa6dc9fd0d237fbb6479c0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ea6edad32c0e8f948cd8b94072116377acff3cab42e2de8558f89b662dfa15 + +handshake=Noise_XK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dd159df0538d164882c0fb3ac1bb4cc6ac4e27c464f5951e809e +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484664cf8cecb0ff80106624ffd90b3f32f5bb8299f54bf3028c19ce6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=2fabfb16fc114fed3616c271dbf12733184f4d2e32201ffb233a4720d451cd31ffd8366c726d4ef7dced16efc4444f469d370b0a85ae6dbf669562da562cd93a0b837b24b7e9570fd611 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=15b8fdb578ed7fadbd4f6fc87fd48cd3c786ca4ac3ce3a68708ec72147b8c9 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=9525d9e2805470da9ec648070a03e1a5e87f0c858565adbdcf7c38d3dca90e + +handshake=Noise_XKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542f8e3453a219c2f379b8845259d60e5064b9b764387f19e57a73 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484669f1384f1028d68ed124fee35586dd6c739118976ef139b637969 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=7028e105675b2294d5887e5fece5ebcad0d304fc21046b7463b3bd763f84268c6c24589c7b12bd43d47552ad5b599b2efd527b0687d9dbe7a2f966185b50ce95791245b2ae475cfd4e0e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=82acd07ad6c33e3e715daa31868d729a55825b1c88d55a46a9eab5984755d6 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=03d80857afae5021107843912a238783a83fa86c35a2000fa1b58b3828dd98 + +handshake=Noise_XKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254dee2c560cb410ffe557cc9abb419d3d4e715a2e71e00a177b6e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d19c8f7fd48e7049046c3725c324e1401dfb282d5cb6dd93c6b2 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=a77384941d395fe334060bb6480ade2cbcf4787451f6d2e8cf2c258a33e91ffaea6f9945a4ff4bcd5158727fa220f9487d93f7f672b4b6c4d43bd9fc3db8793f773ca7fd9200e25ace0e +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=815e08cd47c188260e00166f020b2a990a8a7c31f2f6e5e64362bba39e0d8b +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e13c3fd28fef752772f6a9b8c56eb26866fc1004b98f3644bbbe85829d7b48 + +handshake=Noise_XKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542cfbefa92d7f5e6f4b3be913e231b431c8f7c670ce206137b712 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466ded51642e5afbb65c731ed84a8d985f37bfd26a39083898cd550 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=0c3c7a6dc99c66a026afd6caea5b4dd660846e936276107a6f114081a82408355f93a02f1599bc3ff07b5da28c8ce4c7af0102ceda60fd259afcf6b6bda42e3270e8b1eb62f1706161af +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=bbf2d5f1ea82093b94e17ba2ebaa8bed2318ba50f2449b673b41b93458c247 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=afdff82cfe53ed8c4bab4d50c197b8e23c67889a2230289e6f6fb7db7a2d56 + +handshake=Noise_XKpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d150e2ff1a6fa2da4daccb89941440200125a36b9ce7441faa58 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846666426ad661ac863b4d54145127461138fe6018095b64e3f815e8 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=8b7820818afedd08897101cc1e914a29767619f3e142be2673ea7ddbe042c1fa6274c8474632d69fe1d7e8690676e85f8d62b45f1d64ba4b228f758259e5fa9b9082e4f6ff39682d48fc +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=9c5dd0584674d0fd555d3ba42a4c27756e954bc3aa6dc9fd0d237fbb6479c0 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=ea6edad32c0e8f948cd8b94072116377acff3cab42e2de8558f89b662dfa15 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9f0dff42c86abe5677abe74f6c87301577dbc1f3ffb2213827ca694a057fdbbff7f7350265fe61102c24d7d7a7e960ba8b90a679895087c7d28b1d6703f9727 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846622bf9c6171ddd4c8f682080b03504eee +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=595694f9be48f03790f699455c84578b31d14a7baedfd736d73c53f66a5657 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=621ae446b11fda3cf08e56102dac9324dee37a4e536cdc878e8b454d98bcf2 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df1f9b7f2814e2464394f35e13e46862cb009157dc0352d710c45376c6cd254409aebd0d5d8e544c64903917c911a5d9d4bb710801ef83ed8e190bd0a6090cae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1340c42411f7ad45a1c59bfd7d26c73 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58a23ba181962ac5c0fafdf3c45870d1d8ba060076a80550ced748c69e6cc7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef66353b5543937ee497369867d9559a0166a817be50780a7677583341cccf + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aac9b7e52346a4de47756a681e5a97c720eef8b7faf4d312878c47eca4a0a014ddfe09618c12aed20e55a9e01da8a86b945c4f772011cb87a1bf9cadbd0519c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b8a7518e223985d3fb21a297aaeeafb7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01b3d709f2acd4b0d95de75506da47ad980c471f2afd3a436cdc59f5605a4a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d2d77f0af04d0086e77a59b4d5a4428115f60ef95ee23a56683e35a29dcb00 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d06f15f78ad0914d9715147bb5a5004b27345a838bab4aa8bc5f144afc2cf4cca972105ba526e8c92b759e028200e766f827aa12a04ecbc0bdcd9e574e007945 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668c46d966ca4fe339f9e47fd25f68de8a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6013ea114b4c4884afb82bf029f72f924bd8a32c487a15a1cef4855ba234be +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2e7119635e41a35b7e64e0adac5483b66b1a9827895124ea07d58440b654 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9f0dff42c86abe5677abe74f6c87301577dbc1f3ffb2213827ca694a057fdbbff7f7350265fe61102c24d7d7a7e960b7316fcb3b0687be852fd2fba8969816fbfaa8b459d0b59e8a42f +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f1d8bd2b9b659695f9077e7062bb0b9e7c08fd627913be183c3 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=595694f9be48f03790f699455c84578b31d14a7baedfd736d73c53f66a5657 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=621ae446b11fda3cf08e56102dac9324dee37a4e536cdc878e8b454d98bcf2 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df1f9b7f2814e2464394f35e13e46862cb009157dc0352d710c45376c6cd254409aebd0d5d8e544c64903917c911a5d908eafc7023007a5f9bcba4a414770c8f280fedba65efe10044c1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466768fb8842b9bf487b26ed03ae92c46697145f7bd53a8fdb5b0f2 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58a23ba181962ac5c0fafdf3c45870d1d8ba060076a80550ced748c69e6cc7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef66353b5543937ee497369867d9559a0166a817be50780a7677583341cccf + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aac9b7e52346a4de47756a681e5a97c720eef8b7faf4d312878c47eca4a0a014ddfe09618c12aed20e55a9e01da8a86e47b72ebc70cede5e0b107af9e843b201edc40459ed5ddfc7632 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b5f98fed60b91df5d962379393574db5b001d76865569f45c20e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01b3d709f2acd4b0d95de75506da47ad980c471f2afd3a436cdc59f5605a4a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d2d77f0af04d0086e77a59b4d5a4428115f60ef95ee23a56683e35a29dcb00 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d06f15f78ad0914d9715147bb5a5004b27345a838bab4aa8bc5f144afc2cf4cca972105ba526e8c92b759e028200e7666a3d77b86f9aa87dcfe685e771e38b97d3c5996368c663051641 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466168e6913e78d7a2b04b2f3d5529e73e953bafe6c7ce2b1005367 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6013ea114b4c4884afb82bf029f72f924bd8a32c487a15a1cef4855ba234be +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2e7119635e41a35b7e64e0adac5483b66b1a9827895124ea07d58440b654 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9f0dff42c86abe5677abe74f6c87301577dbc1f3ffb2213827ca694a057fdbbacac81d639bfae65c7827558f90acd27f14e182372e5bee2fa04eca3d32f09a9 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466bbaba571a4d366dfe3958808b6a298f9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=595694f9be48f03790f699455c84578b31d14a7baedfd736d73c53f66a5657 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=621ae446b11fda3cf08e56102dac9324dee37a4e536cdc878e8b454d98bcf2 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df1f9b7f2814e2464394f35e13e46862cb009157dc0352d710c45376c6cd25444c70354abe531df791866bd75aa9b66d93bd99b148497ff8dd02a120c19d03d6 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484668e13033b701c665877ce0455cb6c0ac7 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58a23ba181962ac5c0fafdf3c45870d1d8ba060076a80550ced748c69e6cc7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef66353b5543937ee497369867d9559a0166a817be50780a7677583341cccf + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aac9b7e52346a4de47756a681e5a97c720eef8b7faf4d312878c47eca4a0a01eb23f043b5a6a476be780e530597c25629f0ce0f8d269e01315d8e15f7abab45 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846665ff976798fecbf095b0dd885e8ea88f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01b3d709f2acd4b0d95de75506da47ad980c471f2afd3a436cdc59f5605a4a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d2d77f0af04d0086e77a59b4d5a4428115f60ef95ee23a56683e35a29dcb00 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d06f15f78ad0914d9715147bb5a5004b27345a838bab4aa8bc5f144afc2cf4ccb88f9ea1ebd99e94b76e50af7eee0e59549f4f47de925ee65c9dee48f8990082 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484665db536cf97f15c6ece2431fc1c0057b4 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6013ea114b4c4884afb82bf029f72f924bd8a32c487a15a1cef4855ba234be +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2e7119635e41a35b7e64e0adac5483b66b1a9827895124ea07d58440b654 + +handshake=Noise_IK_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c9f0dff42c86abe5677abe74f6c87301577dbc1f3ffb2213827ca694a057fdbbacac81d639bfae65c7827558f90acd277316fcb3b0687be852fd7e392456bb6cbe070c749f1bd7c55fc2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484667f1d8bd2b9b659695f90e35beaf5a5f5f1e7c83aa3194a2430cd +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=595694f9be48f03790f699455c84578b31d14a7baedfd736d73c53f66a5657 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=621ae446b11fda3cf08e56102dac9324dee37a4e536cdc878e8b454d98bcf2 + +handshake=Noise_IKpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df1f9b7f2814e2464394f35e13e46862cb009157dc0352d710c45376c6cd25444c70354abe531df791866bd75aa9b66d08eafc7023007a5f9bcb8ee5cc55c0598e868acab1c02d9940cc +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466768fb8842b9bf487b26ebb07b2a3d6a12d28f27f2e833b2bf498 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=58a23ba181962ac5c0fafdf3c45870d1d8ba060076a80550ced748c69e6cc7 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=ef66353b5543937ee497369867d9559a0166a817be50780a7677583341cccf + +handshake=Noise_IKpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548aac9b7e52346a4de47756a681e5a97c720eef8b7faf4d312878c47eca4a0a01eb23f043b5a6a476be780e530597c256e47b72ebc70cede5e0b1d7616523787a70c730858ab01037164b +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466b5f98fed60b91df5d962e3be6a027433a7179f44c7a09ee68b93 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=01b3d709f2acd4b0d95de75506da47ad980c471f2afd3a436cdc59f5605a4a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=d2d77f0af04d0086e77a59b4d5a4428115f60ef95ee23a56683e35a29dcb00 + +handshake=Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d06f15f78ad0914d9715147bb5a5004b27345a838bab4aa8bc5f144afc2cf4ccb88f9ea1ebd99e94b76e50af7eee0e596a3d77b86f9aa87dcfe61d972bc6f34d0e93751d1260fa6bf0fe +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466168e6913e78d7a2b04b2b154c5149032d1c2584051bdcf04db1d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=6013ea114b4c4884afb82bf029f72f924bd8a32c487a15a1cef4855ba234be +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=8a2e7119635e41a35b7e64e0adac5483b66b1a9827895124ea07d58440b654 + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c7f9c130891d2fcc2454ad9808ce708c7fde0ef21e72e985c38a6ed8cdaadcd96586759f804d4fa61b89ea5b36cb9b3eb1eab4273f15b629e3508d6f11a78c6d +msg_2_payload= +msg_2_ciphertext=e42e3908de4cd096b8b86320dfe9d03127451fdbfc423fd9ef86b4659fae03c86a279a2a864a1429147865a5dba40deed136252f2229fc5c4bcd2d5ec2efbfc2 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7086fc0466ee7523680d09ff7c272e2a2817a6e2d6c4ec1c209506506e8957 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e3beadf28ea871a3be666f43eaf457d030e538eb371ba48076a7db36a9a1bf + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254637a307a63f9200c59b8a1a68ec0c19c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0b9b0b4eee99d0667e049946fdcf25326ac013cdc4b28db9729186ee6609fb9238d6aa51a6202bf8eb11457923ff8ffc6b10385eca5da0f31f1259829d93a5f +msg_2_payload= +msg_2_ciphertext=612715579e991a6981e74d1e0bfd18932aa28f66fe336867c6d3174d3c4bf4af869f42fe4ac7551684c587ac550cc4c68c3548b1ba0ca04c689acb7c8be3b7fe +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c7241ad514c2c32d238263e4d45ba84d20cbe01ff02dda02e5a77bcb058e23 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8faddc8172ce807cf234a378a2fd7524446ea3aad4864580d126a4c3852b9d + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254d34be1d87db84255cd585f5b08c19fae +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f7b3af6bee5a32d2cbc5fc98e2a038b06f0d7bd8f729fa5fc96261bd82d8e2000d07ca3e3d445871aa11fd2b6b30949fc1c8ed49bdacb1dba32a4e7390b605b +msg_2_payload= +msg_2_ciphertext=329e3f756fa718b350bc245530e8eaf1656bd2453e27eac247c6ef17a9786c2740ef1b2b23ad9b104d5dd69381c51e7cc345caf8910c716648d998cfecabd13a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7897e21dd79636f43041a385c40e411e9545fafcc7460390a0f5bca87f43d2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c10882fc0a0c8abab4d609fabccaef31ab4a243b98bd69e8da2f4f4198d12a + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548ea420fcf251ddf13312a5336a636df2 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1668235fca77e57f6b45e06441594cc4406092be47e85a4d0f04f5dd32d98f31452429b89d4d57066ff1dd64a90b41433e30ba4faf693d4eb8ae1a44176fe83 +msg_2_payload= +msg_2_ciphertext=30aea91ba89fda848b53828e1f7945fea8d996a165f077a5500c8418765d11c565611ced43dafc735dda9c270ef928e609050f44c8fbf4eae939a52a60a2a027 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1e7459e1dc3d1df643ad73799ce1d5594ca16f7cab5e7740b0b140828fd5be +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b394b3d1392c8477446a5f29188f626d8c994794ed94abe3fc552b5aa0ad11 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625410441c3e70cb5de58ffd0e9996504e13 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6a3135623749084e7af54bdb3cbefc74483b5a11791e66803483ca71b7a1cb944867eb451bbf862d7d9ca5fb44711f5945f302feafd0a9e67925eaa3c1f1199 +msg_2_payload= +msg_2_ciphertext=27f05826a4958e7232360fc6f2d5742baa781214efa55d1adfbbe6526577bfee007f1169498002cf0af19c559cb34ebb22fbf2c5136d87142b1474343bc3ea5b +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6964e5f2c89c4cc61086163641d1b0af9ecfb4c3596726e00ad65361db462e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=cf239ff75b592d7dcf14cb9d91cc682b9f216c8b98871a9e53461f0cd027de + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c7f9c130891d2fcc2454ad9808ce708c7fde0ef21e72e985c38a6ed8cdaadcd9c0e3ed9de7ec29f5c2988dab99fc75b461f5532ce998f718c56fe4ae560e9b71afacf18e82fbda729ee6 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e42e3908de4cd096b8b86320dfe9d03127451fdbfc423fd9ef86b4659fae03c8498dfa777a39cf59d06c8cf8230f924bf6cfb3372d0d7f9f5da0a2795066e1e7f5b7bc545578661f6731 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7086fc0466ee7523680d09ff7c272e2a2817a6e2d6c4ec1c209506506e8957 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e3beadf28ea871a3be666f43eaf457d030e538eb371ba48076a7db36a9a1bf + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f53528fc2e5e3678841da8d3020d1ec9c3cde9525f1fa034d263 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0b9b0b4eee99d0667e049946fdcf25326ac013cdc4b28db9729186ee6609fb9f1f42327774c03ebe566c0d4451875ca7a5cc2fc30fc4ce18187f6191c16b819f7b7e93a783733b2483c +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=612715579e991a6981e74d1e0bfd18932aa28f66fe336867c6d3174d3c4bf4af852f4aa53299efc837c5f348c327791c370a74a98c31960c68497294ff2fadbe88a06a2dc157a6e8f4b5 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c7241ad514c2c32d238263e4d45ba84d20cbe01ff02dda02e5a77bcb058e23 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8faddc8172ce807cf234a378a2fd7524446ea3aad4864580d126a4c3852b9d + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543c0d303a380071b3f64d12c29167c26ba0e640746a6b8ba79305 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f7b3af6bee5a32d2cbc5fc98e2a038b06f0d7bd8f729fa5fc96261bd82d8e208f25674cb6b70a200d2773ed5d26726ef327de53771ebf95f72dbe4eb60a939da4c801ae9b397a739be3 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=329e3f756fa718b350bc245530e8eaf1656bd2453e27eac247c6ef17a9786c276b61061945ebca80b7a12f5ea2ee8a618aca4353c7b301862fe3e98463e63541b5b37e6d60834f1ac93a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7897e21dd79636f43041a385c40e411e9545fafcc7460390a0f5bca87f43d2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c10882fc0a0c8abab4d609fabccaef31ab4a243b98bd69e8da2f4f4198d12a + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428c6a800c7db6b39e3450a615dd5ec514a71fef6e19fffb2ba77 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1668235fca77e57f6b45e06441594cc4406092be47e85a4d0f04f5dd32d98f38e968429f5c0735705cb897466c6a5927df7727229d5eb23876d72e07bede789d5cbe84c97f01e06e215 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=30aea91ba89fda848b53828e1f7945fea8d996a165f077a5500c8418765d11c5db9d493f47f3c1cb8eaef381dbd62541f3f1ef96eb7fe2c084eee4325981743b32763c37cad6f075a705 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1e7459e1dc3d1df643ad73799ce1d5594ca16f7cab5e7740b0b140828fd5be +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b394b3d1392c8477446a5f29188f626d8c994794ed94abe3fc552b5aa0ad11 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd0dcd87f6b5d78fedd77bad2dad7505040b02a60540121bef1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6a3135623749084e7af54bdb3cbefc74483b5a11791e66803483ca71b7a1cb9f3b1428ccdd741432a5ec46572ea0fa4fe7df0a60a03a8c732ae28e216c38bd7e79d1a1bfa105f955962 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=27f05826a4958e7232360fc6f2d5742baa781214efa55d1adfbbe6526577bfee490e79236f3622a63511108ce030215cc454a891d33df307ce816ea28bd4af41a015f265e9ff7386bfce +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6964e5f2c89c4cc61086163641d1b0af9ecfb4c3596726e00ad65361db462e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=cf239ff75b592d7dcf14cb9d91cc682b9f216c8b98871a9e53461f0cd027de + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c7f9c130891d2fcc2454ad9808ce708c7fde0ef21e72e985c38a6ed8cdaadcd95d49ccad379691a89b57368d70add1bd30d7757d21b91f1b9981ac3f6cc36f79 +msg_2_payload= +msg_2_ciphertext=e42e3908de4cd096b8b86320dfe9d03127451fdbfc423fd9ef86b4659fae03c8e7b0c7c5612fc71db82f4f8ab985fab34ef5d36e101b730d9ff6de037479f032 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7086fc0466ee7523680d09ff7c272e2a2817a6e2d6c4ec1c209506506e8957 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e3beadf28ea871a3be666f43eaf457d030e538eb371ba48076a7db36a9a1bf + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541835db57f7afd1d49daa50c8dc8ba362 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0b9b0b4eee99d0667e049946fdcf25326ac013cdc4b28db9729186ee6609fb99d6f9cabe4bd5995c2bd8f0dea901e842c96b0e0d0839dba70a8308aef5f58e9 +msg_2_payload= +msg_2_ciphertext=612715579e991a6981e74d1e0bfd18932aa28f66fe336867c6d3174d3c4bf4af12bedb42b816abea75e6374d29d1b39eaf86a9610e4634e7d910e01c816c6095 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c7241ad514c2c32d238263e4d45ba84d20cbe01ff02dda02e5a77bcb058e23 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8faddc8172ce807cf234a378a2fd7524446ea3aad4864580d126a4c3852b9d + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b83f0653b90ed8bb7584c0ff87006639 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f7b3af6bee5a32d2cbc5fc98e2a038b06f0d7bd8f729fa5fc96261bd82d8e20f4488fb816701391c8df57e872539cd159761d30a1d98f0bfa7867e955354fd5 +msg_2_payload= +msg_2_ciphertext=329e3f756fa718b350bc245530e8eaf1656bd2453e27eac247c6ef17a9786c27e6df7fa01c7b0ac1513c4082a90f5d44f970035277371c0148f6df35cec05a03 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7897e21dd79636f43041a385c40e411e9545fafcc7460390a0f5bca87f43d2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c10882fc0a0c8abab4d609fabccaef31ab4a243b98bd69e8da2f4f4198d12a + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625490eb6876e3e3d7653ca69b60a1be5d08 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1668235fca77e57f6b45e06441594cc4406092be47e85a4d0f04f5dd32d98f38b5a7e29c891e1ec1cde1853a90cdd71ca86e8c8aaa3fd5617885957703a416a +msg_2_payload= +msg_2_ciphertext=30aea91ba89fda848b53828e1f7945fea8d996a165f077a5500c8418765d11c59e79cee877ef08bef46befc971b96c29a19b56b05df43b6c83feca470821f6fd +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1e7459e1dc3d1df643ad73799ce1d5594ca16f7cab5e7740b0b140828fd5be +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b394b3d1392c8477446a5f29188f626d8c994794ed94abe3fc552b5aa0ad11 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543518fec3fe15f34315c2e73630b2c3f1 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6a3135623749084e7af54bdb3cbefc74483b5a11791e66803483ca71b7a1cb97aeeb7d0720410c02c8d66601baf98737746c6975b8e2024e175a8441ef186b2 +msg_2_payload= +msg_2_ciphertext=27f05826a4958e7232360fc6f2d5742baa781214efa55d1adfbbe6526577bfee4a8842024f9763c5020dbb90dac8e3a0fd3b44e4acf9e6e959c4f72a4549db0a +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6964e5f2c89c4cc61086163641d1b0af9ecfb4c3596726e00ad65361db462e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=cf239ff75b592d7dcf14cb9d91cc682b9f216c8b98871a9e53461f0cd027de + +handshake=Noise_XX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c7f9c130891d2fcc2454ad9808ce708c7fde0ef21e72e985c38a6ed8cdaadcd9e07ed4c7d77e83b721e41d9bb2a8b57761f5532ce998f718c56f18083ab9e2f47c3f7f545a5eabbc4ece +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=e42e3908de4cd096b8b86320dfe9d03127451fdbfc423fd9ef86b4659fae03c897f77a2af21f5ce18cde8740fe9e5912f6cfb3372d0d7f9f5da0d9be88017bb339b951c56929f77fe9d6 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7086fc0466ee7523680d09ff7c272e2a2817a6e2d6c4ec1c209506506e8957 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=e3beadf28ea871a3be666f43eaf457d030e538eb371ba48076a7db36a9a1bf + +handshake=Noise_XXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f53528fc2e5e3678841db24a2abbe656a347e2116aab72adcf37 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c0b9b0b4eee99d0667e049946fdcf25326ac013cdc4b28db9729186ee6609fb92e9751b1eacd771ac88dc4c7d4efb1c27a5cc2fc30fc4ce181878bc63aff8a4baf6b4ad054cbff26334a +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=612715579e991a6981e74d1e0bfd18932aa28f66fe336867c6d3174d3c4bf4afdf33b3790ad59aa73526df9169e40433370a74a98c31960c68493f3d69a2ca0c03be3bf415520e40ce31 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=c7241ad514c2c32d238263e4d45ba84d20cbe01ff02dda02e5a77bcb058e23 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=8faddc8172ce807cf234a378a2fd7524446ea3aad4864580d126a4c3852b9d + +handshake=Noise_XXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662543c0d303a380071b3f64db0a10b87a34e6e9a7dd07f38de42e2db +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d484660f7b3af6bee5a32d2cbc5fc98e2a038b06f0d7bd8f729fa5fc96261bd82d8e20f35ffcf131b4144444f8f4c1f2620cfaf327de53771ebf95f72dc1e5f96e3b88065ebc617fd26402c9b9 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=329e3f756fa718b350bc245530e8eaf1656bd2453e27eac247c6ef17a9786c276d69f49b2c4489657ca8d3bafa6d847b8aca4353c7b301862fe306a37fb7e182b5a52adbb6b9bb5e75f8 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=7897e21dd79636f43041a385c40e411e9545fafcc7460390a0f5bca87f43d2 +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=c10882fc0a0c8abab4d609fabccaef31ab4a243b98bd69e8da2f4f4198d12a + +handshake=Noise_XXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625428c6a800c7db6b39e3456d482f8c37e883c3ff240c77407256ac +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c1668235fca77e57f6b45e06441594cc4406092be47e85a4d0f04f5dd32d98f3093e9ada779e2aa06db725fb3f6bb18d7df7727229d5eb23876d530f89eb23a25a8e657c790f0c6a3128 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=30aea91ba89fda848b53828e1f7945fea8d996a165f077a5500c8418765d11c574f126a002bc70955d52879ea92abc5cf3f1ef96eb7fe2c084eebb273c797e0f31af83f23e200defd60c +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=1e7459e1dc3d1df643ad73799ce1d5594ca16f7cab5e7740b0b140828fd5be +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=b394b3d1392c8477446a5f29188f626d8c994794ed94abe3fc552b5aa0ad11 + +handshake=Noise_XXpsk3_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662544fd0dcd87f6b5d78feddd20bcb8ab9ed16ac202410f730729c74 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466d6a3135623749084e7af54bdb3cbefc74483b5a11791e66803483ca71b7a1cb9415f46d643edb50ac242a475f8c3b60dfe7df0a60a03a8c732ae2747ed5de74ce5ba4eca1461b96283f4 +msg_2_payload=746573745f6d73675f32 +msg_2_ciphertext=27f05826a4958e7232360fc6f2d5742baa781214efa55d1adfbbe6526577bfeec049bd84112dd940b7032911a753f227c454a891d33df307ce814db7b657f732eb230e8da83fea82aa08 +msg_3_payload=79656c6c6f777375626d6172696e65 +msg_3_ciphertext=6964e5f2c89c4cc61086163641d1b0af9ecfb4c3596726e00ad65361db462e +msg_4_payload=7375626d6172696e6579656c6c6f77 +msg_4_ciphertext=cf239ff75b592d7dcf14cb9d91cc682b9f216c8b98871a9e53461f0cd027de + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9a6ba5eae47a4d838d82ae3cd62251af0f1e6561062710eca57757b8ad283b372716c241fa1daee4dd462c761e0425e0ef756d1491dcb62a578fc7be19148b9 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d33ecf8cf6b6428cb123ddb57a17c81105eee893bed02870ba1fbe6a1fd6d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=768afdad2e41013ef4720530fcaa3d78e8ab569d26b0df12aaba81f7353512 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625445eb1ca694ab03673651916b0017d230de3ad7bec80178587a26cf011486e05c5f9d359fbc1f76fbf7ca2c8b84d9d1964814e298cb91ecd67f0240ea0b75796c +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687c4d59dec1d3e06688dc736d0cb9008a19970e60b830d3e57e452410646cf1be3362a206b49cc56fea54f9463949d52c84bfcc53b95c30bb748d62feca70b7f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c8b4e40dfbb834b84698bd810a695f53df3e2fd87cc00f58f139a90acd8721 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0182920f0cd37284f23171456739dd8a0fa6e38eebfae65def58ce6507fcec + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df0b149f68024ee0ecf15ad91c77430ce795c414352304ac1bb084a4c0f130ba06cc6c0158963bb90e57eac11fba5916dcc9df48f406180374090384031b625a +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe09a991daffe55c5da738860a7d81bd177afbd7afe306fd613ada65429cf6c08d457bb2eaff8385941e7bc7d790d6aa94b7fddf5a53f7945849e9d60dfb258b +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=00d2de63815b9ab20f34eceb6457673528ac7ab7335ae3dd19e1c64f02617a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7cb533f4e91d2b30dd83ffb04134da913889a87bb67f0fe7eacad3a1e9e3b3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4f026b6a4f4ff262e84c007e9ab72d1759dec524c7cc49daf31c9492c7aeb0ddb9f254bb6a8fc936e688df5bce734ebd80e1dd76f5e935bed228edfa3f57c5f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695096a7c980419c321b55005e4a475252a5d36b6ee249e905d52297d498190ce746238c4a665bac4b004d86dd8cea050e4b10fcceb9a533c7bdaa217b1b2506d +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=07cb1f697855511a505ef14bd8f64516c52a3d95c11e170f665f932f69dfe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=208dc9c1918b14a9bbcbd7ff8aac5ab2b1c0f93f6fc2067eef0f9a2226b8b9 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9a6ba5eae47a4d838d82ae3cd62251af0f1e6561062710eca57757b8ad283b353b8d7e41e40a97fd3c64c6d7ad830398411c2332b438406f5eed2edffdbb4095be726c191c27edd8b9e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d33ecf8cf6b6428cb123ddb57a17c81105eee893bed02870ba1fbe6a1fd6d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=768afdad2e41013ef4720530fcaa3d78e8ab569d26b0df12aaba81f7353512 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625445eb1ca694ab03673651916b0017d230de3ad7bec80178587a26cf011486e05c5f9d359fbc1f76fbf7ca2c8b84d9d1962bab2967e9e5759d88986ed70a527512da1d915f8c44240076a1 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687c4d59dec1d3e06688dc736d0cb9008a19970e60b830d3e57e452410646cf1b9b0d5180cde01a3d7c7091a2b67c0f5499a102f9755ed624fafb8acf4ddc5a604b8c4964d51b7df77e70 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c8b4e40dfbb834b84698bd810a695f53df3e2fd87cc00f58f139a90acd8721 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0182920f0cd37284f23171456739dd8a0fa6e38eebfae65def58ce6507fcec + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df0b149f68024ee0ecf15ad91c77430ce795c414352304ac1bb084a4c0f130ba06cc6c0158963bb90e57eac11fba59161bdcabdf6727d20f67112b770e7ace62894baf635ad65689a0ff +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe09a991daffe55c5da738860a7d81bd177afbd7afe306fd613ada65429cf6c0e9c1bf5439c447bfb9793fbfc2f70a8aa9d85baf1604ea68faf729344153cf0f8c58c344a669cae3415a +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=00d2de63815b9ab20f34eceb6457673528ac7ab7335ae3dd19e1c64f02617a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7cb533f4e91d2b30dd83ffb04134da913889a87bb67f0fe7eacad3a1e9e3b3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4f026b6a4f4ff262e84c007e9ab72d1759dec524c7cc49daf31c9492c7aeb0ddb9f254bb6a8fc936e688df5bce734ebf197e884f1d72ae2dc61ddb527bb6219b060996c76db675a7048 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695096a7c980419c321b55005e4a475252a5d36b6ee249e905d52297d498190ce798ec02880c5a544226355351584c7bdd8227543b8f716af2e70de5ef4426f1bf14ac4cccfcbb295d51e +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=07cb1f697855511a505ef14bd8f64516c52a3d95c11e170f665f932f69dfe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=208dc9c1918b14a9bbcbd7ff8aac5ab2b1c0f93f6fc2067eef0f9a2226b8b9 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9a6ba5eae47a4d838d82ae3cd62251af0f1e6561062710eca57757b8ad283b3939a848593731b3ab7151893c61d09b22dc69ee03508f3df6021d1f02a67f420 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d33ecf8cf6b6428cb123ddb57a17c81105eee893bed02870ba1fbe6a1fd6d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=768afdad2e41013ef4720530fcaa3d78e8ab569d26b0df12aaba81f7353512 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625445eb1ca694ab03673651916b0017d230de3ad7bec80178587a26cf011486e05c71f19b555215765ed472763000933b07049951734c1414b84c7ecdd163bdf8d0 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687c4d59dec1d3e06688dc736d0cb9008a19970e60b830d3e57e452410646cf1bcc1b178351d0bb46e8e1cfc2e2ec2c925a3007eed6f1d2e8a910ce5bc0dd8873 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c8b4e40dfbb834b84698bd810a695f53df3e2fd87cc00f58f139a90acd8721 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0182920f0cd37284f23171456739dd8a0fa6e38eebfae65def58ce6507fcec + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df0b149f68024ee0ecf15ad91c77430ce795c414352304ac1bb084a4c0f130ba29eef9ca8c4fccfbbf3959cf63da6a89e144ab2cb9c3dbbfcd37434f6d7a9e19 +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe09a991daffe55c5da738860a7d81bd177afbd7afe306fd613ada65429cf6c0e1e890e1a5ef0d9557ba19f1a7e1aea1e6a071fc644a03ff3f5e127da3f15098 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=00d2de63815b9ab20f34eceb6457673528ac7ab7335ae3dd19e1c64f02617a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7cb533f4e91d2b30dd83ffb04134da913889a87bb67f0fe7eacad3a1e9e3b3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4f026b6a4f4ff262e84c007e9ab72d1759dec524c7cc49daf31c9492c7aeb0da29c805edd125123f24ff0c3a68995581266147e7092a934d6386daad38bb46e +msg_1_payload= +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695096a7c980419c321b55005e4a475252a5d36b6ee249e905d52297d498190cea526a51e27a95def76e556a85518ad342fca05d39d1498205790f19f4a8cb060 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=07cb1f697855511a505ef14bd8f64516c52a3d95c11e170f665f932f69dfe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=208dc9c1918b14a9bbcbd7ff8aac5ab2b1c0f93f6fc2067eef0f9a2226b8b9 + +handshake=Noise_IX_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662548f40c5adb68f25624ae5b214ea767a6ec94d829d3d7b5e1ad1ba6f3e2138285f746573745f6d73675f30 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466c9a6ba5eae47a4d838d82ae3cd62251af0f1e6561062710eca57757b8ad283b30a21d13abc61b4563586358ef166f2248411c2332b438406f5ee901e916db484003c3f2fb91742430d01 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=d33ecf8cf6b6428cb123ddb57a17c81105eee893bed02870ba1fbe6a1fd6d8 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=768afdad2e41013ef4720530fcaa3d78e8ab569d26b0df12aaba81f7353512 + +handshake=Noise_IXpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625445eb1ca694ab03673651916b0017d230de3ad7bec80178587a26cf011486e05c71f19b555215765ed472763000933b072bab2967e9e5759d8898095fcf5303dd11e652a29718c9d539e2 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846687c4d59dec1d3e06688dc736d0cb9008a19970e60b830d3e57e452410646cf1b1fa414ef2cf021e372c6f36b5f22040d99a102f9755ed624fafbea2c3f10be616abb8ea5db833ee24747 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=c8b4e40dfbb834b84698bd810a695f53df3e2fd87cc00f58f139a90acd8721 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=0182920f0cd37284f23171456739dd8a0fa6e38eebfae65def58ce6507fcec + +handshake=Noise_IXpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254df0b149f68024ee0ecf15ad91c77430ce795c414352304ac1bb084a4c0f130ba29eef9ca8c4fccfbbf3959cf63da6a891bdcabdf6727d20f6711779ed5d37d6def025ef48873391e6ab0 +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d48466fe09a991daffe55c5da738860a7d81bd177afbd7afe306fd613ada65429cf6c0dd8aaade8f4a82c0b661cd30c8384de7a9d85baf1604ea68faf7a6f6436d208a84c38b3126e2aa27dc9f +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=00d2de63815b9ab20f34eceb6457673528ac7ab7335ae3dd19e1c64f02617a +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=7cb533f4e91d2b30dd83ffb04134da913889a87bb67f0fe7eacad3a1e9e3b3 + +handshake=Noise_IXpsk2_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b4f026b6a4f4ff262e84c007e9ab72d1759dec524c7cc49daf31c9492c7aeb0da29c805edd125123f24ff0c3a6899558f197e884f1d72ae2dc61acbfdea65978a80d9bc549cf41a3d82a +msg_1_payload=746573745f6d73675f31 +msg_1_ciphertext=64b101b1d0be5a8704bd078f9895001fc03e8e9f9522f188dd128d9846d4846695096a7c980419c321b55005e4a475252a5d36b6ee249e905d52297d498190cee847fe1489e3150d1a19187f638c4d11d8227543b8f716af2e7024523702533cfe92e40f47e8a0a69157 +msg_2_payload=79656c6c6f777375626d6172696e65 +msg_2_ciphertext=07cb1f697855511a505ef14bd8f64516c52a3d95c11e170f665f932f69dfe9 +msg_3_payload=7375626d6172696e6579656c6c6f77 +msg_3_ciphertext=208dc9c1918b14a9bbcbd7ff8aac5ab2b1c0f93f6fc2067eef0f9a2226b8b9 + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546ba6ae849a52fad21a8cef186539f029 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a003941c6d2ae21678d1cae7b5723e9a3ae85c4e29a451baa136ddac80778b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bf8afb4d3362b8931b247215132eed804ccad21b25f1441cfd9bc6d04c4f3d + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662542df7894ef4fa3e94ca5276eab168727b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=16d2415b0d883665ecf46e0ba404ee2044dc6b3df56b7df7c1304bcd623c0a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5df813ad71e1af04b9ec69398890d674cf813768405c26ca45e9cb5ec105c8 + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625426e4002dbe75546cc56a2909b47cdabf +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b786593ecbd2d7233981e3b00cf1bdc5b6660264160e2180126c6e8696866f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=96e589406d121007fc36dedd74e3df90bb6616475b3d4efe8590cd9f514555 + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae81c7528e1cf6662cf3c3b00e02f8bba0bdfdb1bd359c71d2a5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a003941c6d2ae21678d1cae7b5723e9a3ae85c4e29a451baa136ddac80778b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bf8afb4d3362b8931b247215132eed804ccad21b25f1441cfd9bc6d04c4f3d + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400b9c1c865b68c526bbb861fc8415527e725b3bbabf2f533a153 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=16d2415b0d883665ecf46e0ba404ee2044dc6b3df56b7df7c1304bcd623c0a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5df813ad71e1af04b9ec69398890d674cf813768405c26ca45e9cb5ec105c8 + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0410bca876435926147c6c772d2fd56a305cea24df5a92b0387 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b786593ecbd2d7233981e3b00cf1bdc5b6660264160e2180126c6e8696866f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=96e589406d121007fc36dedd74e3df90bb6616475b3d4efe8590cd9f514555 + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c597be68f3073fb654b56ecbf3206468 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a003941c6d2ae21678d1cae7b5723e9a3ae85c4e29a451baa136ddac80778b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bf8afb4d3362b8931b247215132eed804ccad21b25f1441cfd9bc6d04c4f3d + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254f73370fe6616ec4bbeb7ccbb4243848b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=16d2415b0d883665ecf46e0ba404ee2044dc6b3df56b7df7c1304bcd623c0a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5df813ad71e1af04b9ec69398890d674cf813768405c26ca45e9cb5ec105c8 + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ce659aaaf6e53b6e8a81af68308411bd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b786593ecbd2d7233981e3b00cf1bdc5b6660264160e2180126c6e8696866f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=96e589406d121007fc36dedd74e3df90bb6616475b3d4efe8590cd9f514555 + +handshake=Noise_N_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254ae81c7528e1cf6662cf390a71ae79e4927b62e8f1c66496d38c2 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a003941c6d2ae21678d1cae7b5723e9a3ae85c4e29a451baa136ddac80778b +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=bf8afb4d3362b8931b247215132eed804ccad21b25f1441cfd9bc6d04c4f3d + +handshake=Noise_Npsk0_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625400b9c1c865b68c526bbb514ef34c653a58e9eec7dc694ea16530 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=16d2415b0d883665ecf46e0ba404ee2044dc6b3df56b7df7c1304bcd623c0a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5df813ad71e1af04b9ec69398890d674cf813768405c26ca45e9cb5ec105c8 + +handshake=Noise_Npsk1_25519_ChaChaPoly_BLAKE2s +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c0410bca876435926147347ce6c3e96c11793463645346d91fe5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=b786593ecbd2d7233981e3b00cf1bdc5b6660264160e2180126c6e8696866f +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=96e589406d121007fc36dedd74e3df90bb6616475b3d4efe8590cd9f514555 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625429ab50aa4698f977eb619f20fa5db0c5 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a191382d64297aedea686db4812eb3415ac6a86b283fa7df9091fe8d985d11 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=006d0e38f3d94cad78e0bc2e7fc323764dd28e4e03fbbe4196bd641fa6faf5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254805170152d8a6f9ed4598a42bbfb3637 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5b53ff47dd6e5708f40d5172b280f8679e6a9147bd2ba4de1e9226079a711 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5053800ab937c3b66bf646bcc4424fd90246c6e0543d79496f4ae90c466077 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625483e428f0be402913dab92da7d61d36a0 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d94826f00577ca4eeb5b4e24221c558421b4041de30a0d9549d6d5aedd618a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0752d5018d967b25613a660c4181bc0eaae495d838bd82b7137b756ca80903 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9404e5db0f97c582cc85908ec714e1ab58dc4d2a93b13af4017 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a191382d64297aedea686db4812eb3415ac6a86b283fa7df9091fe8d985d11 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=006d0e38f3d94cad78e0bc2e7fc323764dd28e4e03fbbe4196bd641fa6faf5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438985084386baffdc03450537b149c888a450033abd5481a43a3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5b53ff47dd6e5708f40d5172b280f8679e6a9147bd2ba4de1e9226079a711 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5053800ab937c3b66bf646bcc4424fd90246c6e0543d79496f4ae90c466077 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5cbbe00c4ef8b94141683ed6b916bbc89ec939994431cb3b3b8 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d94826f00577ca4eeb5b4e24221c558421b4041de30a0d9549d6d5aedd618a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0752d5018d967b25613a660c4181bc0eaae495d838bd82b7137b756ca80903 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625403eb57d94fe18fcc9932deecd7afc348 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a191382d64297aedea686db4812eb3415ac6a86b283fa7df9091fe8d985d11 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=006d0e38f3d94cad78e0bc2e7fc323764dd28e4e03fbbe4196bd641fa6faf5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662546873f10aa744f5ec809baade7f9bb124 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5b53ff47dd6e5708f40d5172b280f8679e6a9147bd2ba4de1e9226079a711 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5053800ab937c3b66bf646bcc4424fd90246c6e0543d79496f4ae90c466077 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd1662541ce699524536e124a049f0ac3797dd8b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d94826f00577ca4eeb5b4e24221c558421b4041de30a0d9549d6d5aedd618a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0752d5018d967b25613a660c4181bc0eaae495d838bd82b7137b756ca80903 + +handshake=Noise_K_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254b9404e5db0f97c582cc8df110972e1eea4a2774b24609ba244af +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a191382d64297aedea686db4812eb3415ac6a86b283fa7df9091fe8d985d11 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=006d0e38f3d94cad78e0bc2e7fc323764dd28e4e03fbbe4196bd641fa6faf5 + +handshake=Noise_Kpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625438985084386baffdc034255c43ea3072077583dcfc973d58c3e3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=e5b53ff47dd6e5708f40d5172b280f8679e6a9147bd2ba4de1e9226079a711 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=5053800ab937c3b66bf646bcc4424fd90246c6e0543d79496f4ae90c466077 + +handshake=Noise_Kpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254c5cbbe00c4ef8b9414167a0c6551ed240bd41866f4fa78e24f01 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=d94826f00577ca4eeb5b4e24221c558421b4041de30a0d9549d6d5aedd618a +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=0752d5018d967b25613a660c4181bc0eaae495d838bd82b7137b756ca80903 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e933e249a2b9389d67db3718637dd177b70511492d1f0476ab4d5fd966c29305593cce12ffb7e757e59f61a6cf8b004cff5020d551732a789d5d654a38e1ba49 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=302ae88697158440e6875b65aa5c5b0d58c3f14ac706bdd3ed593df4ad69cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8da82f0086a25cb390515103ba49260c5d5471528042200d920979798ea8b8 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e740ec34d06c470dcef511761c3f5721297c428d33234ec9e185ac7e0273bbf47bb2b8db785e7662e22b409878754858abe462deb213910f24ad63e3bb1233c3 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a74dc1186c0173a331100c9e1a2640ea95ce9ad6d3c8579ff9275679595e23 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=adf0f9718742ec49f04cab59ff0370bb070358cbdf7973d05b688cdf050ad3 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499e50a484c198a8e9f4d6088d46c7657b70036d4e7177346ad1bbfc541b4635bae691e6043118519cd750217f4a278cb4ef463ad8be55fa547a17e495d8eb506 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c072a15ff3c5fe832398d8ea04c5a4657edb9ad855d857089bc4322d1f1b06 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=836be31bdf36237a7bdd3fd243d64403f7060dfd569abde5cc3b11e4273cd5 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e933e249a2b9389d67db3718637dd177b70511492d1f0476ab4d5fd966c29305593cce12ffb7e757e59f61a6cf8b004c77e13ebf8bab668da83118e92ef7ef36200c950d49677914286b +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=302ae88697158440e6875b65aa5c5b0d58c3f14ac706bdd3ed593df4ad69cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8da82f0086a25cb390515103ba49260c5d5471528042200d920979798ea8b8 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e740ec34d06c470dcef511761c3f5721297c428d33234ec9e185ac7e0273bbf47bb2b8db785e7662e22b409878754858a02d92d874953c00b104ac73405c5a4396415788611a588d4cea +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a74dc1186c0173a331100c9e1a2640ea95ce9ad6d3c8579ff9275679595e23 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=adf0f9718742ec49f04cab59ff0370bb070358cbdf7973d05b688cdf050ad3 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499e50a484c198a8e9f4d6088d46c7657b70036d4e7177346ad1bbfc541b4635bae691e6043118519cd750217f4a278cbf9fb2f5702b2af7923f51b0bdea86b1de41e1a92e49c8db1d0d7 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c072a15ff3c5fe832398d8ea04c5a4657edb9ad855d857089bc4322d1f1b06 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=836be31bdf36237a7bdd3fd243d64403f7060dfd569abde5cc3b11e4273cd5 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e933e249a2b9389d67db3718637dd177b70511492d1f0476ab4d5fd966c29305587cfc935e18d8203d1bf8063842077af6b082f7be8dcc45df8cc97a3c73aec6 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=302ae88697158440e6875b65aa5c5b0d58c3f14ac706bdd3ed593df4ad69cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8da82f0086a25cb390515103ba49260c5d5471528042200d920979798ea8b8 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e740ec34d06c470dcef511761c3f5721297c428d33234ec9e185ac7e0273bbf470d1b6e261225308b65bfbcae66da68d3ecdf4e7a3f747fe4916dd970ad935ef +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a74dc1186c0173a331100c9e1a2640ea95ce9ad6d3c8579ff9275679595e23 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=adf0f9718742ec49f04cab59ff0370bb070358cbdf7973d05b688cdf050ad3 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload= +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499e50a484c198a8e9f4d6088d46c7657b70036d4e7177346ad1bbfc541b4635b9f5b13ed3dbfa3e43f09d1c80e6cd2d65018ebc5f7b995fc2b92d89961216c4d +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c072a15ff3c5fe832398d8ea04c5a4657edb9ad855d857089bc4322d1f1b06 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=836be31bdf36237a7bdd3fd243d64403f7060dfd569abde5cc3b11e4273cd5 + +handshake=Noise_X_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e933e249a2b9389d67db3718637dd177b70511492d1f0476ab4d5fd966c29305587cfc935e18d8203d1bf8063842077a77e13ebf8bab668da831ddabbe4f889713498154527b51f921bd +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=302ae88697158440e6875b65aa5c5b0d58c3f14ac706bdd3ed593df4ad69cf +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=8da82f0086a25cb390515103ba49260c5d5471528042200d920979798ea8b8 + +handshake=Noise_Xpsk0_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd166254e740ec34d06c470dcef511761c3f5721297c428d33234ec9e185ac7e0273bbf470d1b6e261225308b65bfbcae66da68da02d92d874953c00b1048bea5c82f7f3d4e020e34f42b266ec8a +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=a74dc1186c0173a331100c9e1a2640ea95ce9ad6d3c8579ff9275679595e23 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=adf0f9718742ec49f04cab59ff0370bb070358cbdf7973d05b688cdf050ad3 + +handshake=Noise_Xpsk1_25519_ChaChaPoly_BLAKE2s +init_static=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +resp_static=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20 +gen_init_ephemeral=202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f +gen_resp_ephemeral=4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60 +prologue=6e6f74736563726574 +preshared_key=2176657279736563726574766572797365637265747665727973656372657421 +msg_0_payload=746573745f6d73675f30 +msg_0_ciphertext=358072d6365880d1aeea329adf9121383851ed21a28e3b75e965d0d2cd16625499e50a484c198a8e9f4d6088d46c7657b70036d4e7177346ad1bbfc541b4635b9f5b13ed3dbfa3e43f09d1c80e6cd2d6f9fb2f5702b2af7923f59ea23e8f1e61c7ca0bdc7ce430b3e2b4 +msg_1_payload=79656c6c6f777375626d6172696e65 +msg_1_ciphertext=c072a15ff3c5fe832398d8ea04c5a4657edb9ad855d857089bc4322d1f1b06 +msg_2_payload=7375626d6172696e6579656c6c6f77 +msg_2_ciphertext=836be31bdf36237a7bdd3fd243d64403f7060dfd569abde5cc3b11e4273cd5 + diff --git a/vendor/github.com/gaukas/godicttls/exttype_values.go b/vendor/github.com/gaukas/godicttls/exttype_values.go index 8422c401c..fc20a4872 100644 --- a/vendor/github.com/gaukas/godicttls/exttype_values.go +++ b/vendor/github.com/gaukas/godicttls/exttype_values.go @@ -38,7 +38,7 @@ const ( ExtType_password_salt uint16 = 31 ExtType_ticket_pinning uint16 = 32 ExtType_tls_cert_with_extern_psk uint16 = 33 - ExtType_delegated_credentials uint16 = 34 + ExtType_delegated_credentials uint16 = 34 // IANA name: delegated_credentials, IETF name: delegated_credential ExtType_session_ticket uint16 = 35 ExtType_TLMSP uint16 = 36 ExtType_TLMSP_proxying uint16 = 37 @@ -108,7 +108,7 @@ var DictExtTypeValueIndexed = map[uint16]string{ 31: "password_salt", 32: "ticket_pinning", 33: "tls_cert_with_extern_psk", - 34: "delegated_credentials", + 34: "delegated_credentials", // IANA name: delegated_credentials, IETF name: delegated_credential 35: "session_ticket", 36: "TLMSP", 37: "TLMSP_proxying", @@ -175,7 +175,8 @@ var DictExtTypeNameIndexed = map[string]uint16{ "password_salt": 31, "ticket_pinning": 32, "tls_cert_with_extern_psk": 33, - "delegated_credentials": 34, + "delegated_credentials": 34, // IANA name: delegated_credentials + "delegated_credential": 34, // IETF name: delegated_credential "session_ticket": 35, "TLMSP": 36, "TLMSP_proxying": 37, diff --git a/vendor/github.com/gaukas/godicttls/quic_frame_types.go b/vendor/github.com/gaukas/godicttls/quic_frame_types.go new file mode 100644 index 000000000..b8059d148 --- /dev/null +++ b/vendor/github.com/gaukas/godicttls/quic_frame_types.go @@ -0,0 +1,112 @@ +package godicttls + +// source: https://www.iana.org/assignments/quic/quic.xhtml#quic-frame-types +// last updated: July 2023 + +const ( + QUICFrameType_PADDING uint8 = 0x00 + QUICFrameType_PING uint8 = 0x01 + QUICFrameType_ACK uint8 = 0x02 + QUICFrameType_ACK_ecn uint8 = 0x03 + QUICFrameType_RESET_STREAM uint8 = 0x04 + QUICFrameType_STOP_SENDING uint8 = 0x05 + QUICFrameType_CRYPTO uint8 = 0x06 + QUICFrameType_NEW_TOKEN uint8 = 0x07 + QUICFrameType_STREAM uint8 = 0x08 + QUICFrameType_STREAM_fin uint8 = 0x09 + QUICFrameType_STREAM_len uint8 = 0x0a + QUICFrameType_STREAM_len_fin uint8 = 0x0b + QUICFrameType_STREAM_off uint8 = 0x0c + QUICFrameType_STREAM_off_fin uint8 = 0x0d + QUICFrameType_STREAM_off_len uint8 = 0x0e + QUICFrameType_STREAM_off_len_fin uint8 = 0x0f + QUICFrameType_MAX_DATA uint8 = 0x10 + QUICFrameType_MAX_STREAM_DATA uint8 = 0x11 + QUICFrameType_MAX_STREAMS_bidi uint8 = 0x12 + QUICFrameType_MAX_STREAMS_uni uint8 = 0x13 + QUICFrameType_DATA_BLOCKED uint8 = 0x14 + QUICFrameType_STREAM_DATA_BLOCKED uint8 = 0x15 + QUICFrameType_STREAMS_BLOCKED_bidi uint8 = 0x16 + QUICFrameType_STREAMS_BLOCKED_uni uint8 = 0x17 + QUICFrameType_NEW_CONNECTION_ID uint8 = 0x18 + QUICFrameType_RETIRE_CONNECTION_ID uint8 = 0x19 + QUICFrameType_PATH_CHALLENGE uint8 = 0x1a + QUICFrameType_PATH_RESPONSE uint8 = 0x1b + QUICFrameType_CONNECTION_CLOSE uint8 = 0x1c + QUICFrameType_CONNECTION_CLOSE_app uint8 = 0x1d + QUICFrameType_HANDSHAKE_DONE uint8 = 0x1e + QUICFrameType_DATAGRAM uint8 = 0x30 // RFC9221 + QUICFrameType_DATAGRAM_len uint8 = 0x31 // RFC9221 +) + +var DictQUICFrameTypeValueIndexed = map[uint8]string{ + 0x00: "PADDING", + 0x01: "PING", + 0x02: "ACK", + 0x03: "ACK_ecn", + 0x04: "RESET_STREAM", + 0x05: "STOP_SENDING", + 0x06: "CRYPTO", + 0x07: "NEW_TOKEN", + 0x08: "STREAM", + 0x09: "STREAM_fin", + 0x0a: "STREAM_len", + 0x0b: "STREAM_len_fin", + 0x0c: "STREAM_off", + 0x0d: "STREAM_off_fin", + 0x0e: "STREAM_off_len", + 0x0f: "STREAM_off_len_fin", + 0x10: "MAX_DATA", + 0x11: "MAX_STREAM_DATA", + 0x12: "MAX_STREAMS_bidi", + 0x13: "MAX_STREAMS_uni", + 0x14: "DATA_BLOCKED", + 0x15: "STREAM_DATA_BLOCKED", + 0x16: "STREAMS_BLOCKED_bidi", + 0x17: "STREAMS_BLOCKED_uni", + 0x18: "NEW_CONNECTION_ID", + 0x19: "RETIRE_CONNECTION_ID", + 0x1a: "PATH_CHALLENGE", + 0x1b: "PATH_RESPONSE", + 0x1c: "CONNECTION_CLOSE", + 0x1d: "CONNECTION_CLOSE_app", + 0x1e: "HANDSHAKE_DONE", + 0x30: "DATAGRAM", + 0x31: "DATAGRAM_len", +} + +var DictQUICFrameTypeNameIndexed = map[string]uint8{ + "PADDING": 0x00, + "PING": 0x01, + "ACK": 0x02, + "ACK_ecn": 0x03, + "RESET_STREAM": 0x04, + "STOP_SENDING": 0x05, + "CRYPTO": 0x06, + "NEW_TOKEN": 0x07, + "STREAM": 0x08, + "STREAM_fin": 0x09, + "STREAM_len": 0x0a, + "STREAM_len_fin": 0x0b, + "STREAM_off": 0x0c, + "STREAM_off_fin": 0x0d, + "STREAM_off_len": 0x0e, + "STREAM_off_len_fin": 0x0f, + "MAX_DATA": 0x10, + "MAX_STREAM_DATA": 0x11, + "MAX_STREAMS_bidi": 0x12, + "MAX_STREAMS_uni": 0x13, + "DATA_BLOCKED": 0x14, + "STREAM_DATA_BLOCKED": 0x15, + "STREAMS_BLOCKED_bidi": 0x16, + "STREAMS_BLOCKED_uni": 0x17, + "NEW_CONNECTION_ID": 0x18, + "RETIRE_CONNECTION_ID": 0x19, + "PATH_CHALLENGE": 0x1a, + "PATH_RESPONSE": 0x1b, + "CONNECTION_CLOSE": 0x1c, + "CONNECTION_CLOSE_app": 0x1d, + "HANDSHAKE_DONE": 0x1e, + "DATAGRAM": 0x30, + "DATAGRAM_len": 0x31, +} diff --git a/vendor/github.com/gaukas/godicttls/quic_transport_error_codes.go b/vendor/github.com/gaukas/godicttls/quic_transport_error_codes.go new file mode 100644 index 000000000..6824e8312 --- /dev/null +++ b/vendor/github.com/gaukas/godicttls/quic_transport_error_codes.go @@ -0,0 +1,70 @@ +package godicttls + +// source: https://www.iana.org/assignments/quic/quic.xhtml#quic-transport-error-codes +// last updated: July 2023 + +const ( + QUICTransportErrorCode_NO_ERROR uint16 = 0x0000 + QUICTransportErrorCode_INTERNAL_ERROR uint16 = 0x0001 + QUICTransportErrorCode_CONNECTION_REFUSED uint16 = 0x0002 + QUICTransportErrorCode_FLOW_CONTROL_ERROR uint16 = 0x0003 + QUICTransportErrorCode_STREAM_LIMIT_ERROR uint16 = 0x0004 + QUICTransportErrorCode_STREAM_STATE_ERROR uint16 = 0x0005 + QUICTransportErrorCode_FINAL_SIZE_ERROR uint16 = 0x0006 + QUICTransportErrorCode_FRAME_ENCODING_ERROR uint16 = 0x0007 + QUICTransportErrorCode_TRANSPORT_PARAMETER_ERROR uint16 = 0x0008 + QUICTransportErrorCode_CONNECTION_ID_LIMIT_ERROR uint16 = 0x0009 + QUICTransportErrorCode_PROTOCOL_VIOLATION uint16 = 0x000A + QUICTransportErrorCode_INVALID_TOKEN uint16 = 0x000B + QUICTransportErrorCode_APPLICATION_ERROR uint16 = 0x000C + QUICTransportErrorCode_CRYPTO_BUFFER_EXCEEDED uint16 = 0x000D + QUICTransportErrorCode_KEY_UPDATE_ERROR uint16 = 0x000E + QUICTransportErrorCode_AEAD_LIMIT_REACHED uint16 = 0x000F + QUICTransportErrorCode_NO_VIABLE_PATH uint16 = 0x0010 + QUICTransportErrorCode_VERSION_NEGOTIATION_ERROR uint16 = 0x0011 // RFC9368 + QUICTransportErrorCode_CRYPTO_ERROR uint16 = 0x0100 // 0x0100-0x01FF, use with bitwise operator +) + +var DictQUICTransportErrorCodeValueIndexed = map[uint16]string{ + 0x0000: "NO_ERROR", + 0x0001: "INTERNAL_ERROR", + 0x0002: "CONNECTION_REFUSED", + 0x0003: "FLOW_CONTROL_ERROR", + 0x0004: "STREAM_LIMIT_ERROR", + 0x0005: "STREAM_STATE_ERROR", + 0x0006: "FINAL_SIZE_ERROR", + 0x0007: "FRAME_ENCODING_ERROR", + 0x0008: "TRANSPORT_PARAMETER_ERROR", + 0x0009: "CONNECTION_ID_LIMIT_ERROR", + 0x000A: "PROTOCOL_VIOLATION", + 0x000B: "INVALID_TOKEN", + 0x000C: "APPLICATION_ERROR", + 0x000D: "CRYPTO_BUFFER_EXCEEDED", + 0x000E: "KEY_UPDATE_ERROR", + 0x000F: "AEAD_LIMIT_REACHED", + 0x0010: "NO_VIABLE_PATH", + 0x0011: "VERSION_NEGOTIATION_ERROR", + 0x0100: "CRYPTO_ERROR", +} + +var DictQUICTransportErrorCodeNameIndexed = map[string]uint16{ + "NO_ERROR": 0x0000, + "INTERNAL_ERROR": 0x0001, + "CONNECTION_REFUSED": 0x0002, + "FLOW_CONTROL_ERROR": 0x0003, + "STREAM_LIMIT_ERROR": 0x0004, + "STREAM_STATE_ERROR": 0x0005, + "FINAL_SIZE_ERROR": 0x0006, + "FRAME_ENCODING_ERROR": 0x0007, + "TRANSPORT_PARAMETER_ERROR": 0x0008, + "CONNECTION_ID_LIMIT_ERROR": 0x0009, + "PROTOCOL_VIOLATION": 0x000A, + "INVALID_TOKEN": 0x000B, + "APPLICATION_ERROR": 0x000C, + "CRYPTO_BUFFER_EXCEEDED": 0x000D, + "KEY_UPDATE_ERROR": 0x000E, + "AEAD_LIMIT_REACHED": 0x000F, + "NO_VIABLE_PATH": 0x0010, + "VERSION_NEGOTIATION_ERROR": 0x0011, + "CRYPTO_ERROR": 0x0100, +} diff --git a/vendor/github.com/gaukas/godicttls/quic_transport_parameters.go b/vendor/github.com/gaukas/godicttls/quic_transport_parameters.go new file mode 100644 index 000000000..1e2f3b9fe --- /dev/null +++ b/vendor/github.com/gaukas/godicttls/quic_transport_parameters.go @@ -0,0 +1,91 @@ +package godicttls + +// source: https://www.iana.org/assignments/quic/quic.xhtml#quic-transport +// last updated: July 2023 + +const ( + QUICTransportParameter_original_destination_connection_id uint64 = 0x00 + QUICTransportParameter_max_idle_timeout uint64 = 0x01 + QUICTransportParameter_stateless_reset_token uint64 = 0x02 + QUICTransportParameter_max_udp_payload_size uint64 = 0x03 + QUICTransportParameter_initial_max_data uint64 = 0x04 + QUICTransportParameter_initial_max_stream_data_bidi_local uint64 = 0x05 + QUICTransportParameter_initial_max_stream_data_bidi_remote uint64 = 0x06 + QUICTransportParameter_initial_max_stream_data_uni uint64 = 0x07 + QUICTransportParameter_initial_max_streams_bidi uint64 = 0x08 + QUICTransportParameter_initial_max_streams_uni uint64 = 0x09 + QUICTransportParameter_ack_delay_exponent uint64 = 0x0a + QUICTransportParameter_max_ack_delay uint64 = 0x0b + QUICTransportParameter_disable_active_migration uint64 = 0x0c + QUICTransportParameter_preferred_address uint64 = 0x0d + QUICTransportParameter_active_connection_id_limit uint64 = 0x0e + QUICTransportParameter_initial_source_connection_id uint64 = 0x0f + QUICTransportParameter_retry_source_connection_id uint64 = 0x10 + QUICTransportParameter_version_information uint64 = 0x11 // RFC9368 + QUICTransportParameter_max_datagram_frame_size uint64 = 0x20 // RFC9221 + QUICTransportParameter_discard uint64 = 0x173e // David_Schinazi: Receiver silently discards. https://github.com/quicwg/base-drafts/wiki/Quantum-Readiness-test + QUICTransportParameter_google_handshake_message uint64 = 0x26ab // Google: Used to carry Google internal handshake message + QUICTransportParameter_grease_quic_bit uint64 = 0x2ab2 // RFC9287 + QUICTransportParameter_initial_rtt uint64 = 0x3127 // Google: Initial RTT in microseconds + QUICTransportParameter_google_connection_options uint64 = 0x3128 // Google: Google connection options for experimentation + QUICTransportParameter_user_agent uint64 = 0x3129 // Google: User agent string (deprecated) + QUICTransportParameter_google_version uint64 = 0x4752 // Google: Google QUIC version downgrade prevention +) + +var DictQUICTransportParameterValueIndexed = map[uint64]string{ + 0x00: "original_destination_connection_id", + 0x01: "max_idle_timeout", + 0x02: "stateless_reset_token", + 0x03: "max_udp_payload_size", + 0x04: "initial_max_data", + 0x05: "initial_max_stream_data_bidi_local", + 0x06: "initial_max_stream_data_bidi_remote", + 0x07: "initial_max_stream_data_uni", + 0x08: "initial_max_streams_bidi", + 0x09: "initial_max_streams_uni", + 0x0a: "ack_delay_exponent", + 0x0b: "max_ack_delay", + 0x0c: "disable_active_migration", + 0x0d: "preferred_address", + 0x0e: "active_connection_id_limit", + 0x0f: "initial_source_connection_id", + 0x10: "retry_source_connection_id", + 0x11: "version_information", + 0x20: "max_datagram_frame_size", + 0x173e: "discard", + 0x26ab: "google handshake message", + 0x2ab2: "grease_quic_bit", + 0x3127: "initial_rtt", + 0x3128: "google_connection_options", + 0x3129: "user_agent", + 0x4752: "google_version", +} + +var DictQUICTransportParameterNameIndexed = map[string]uint64{ + "original_destination_connection_id": 0x00, + "max_idle_timeout": 0x01, + "stateless_reset_token": 0x02, + "max_udp_payload_size": 0x03, + "initial_max_data": 0x04, + "initial_max_stream_data_bidi_local": 0x05, + "initial_max_stream_data_bidi_remote": 0x06, + "initial_max_stream_data_uni": 0x07, + "initial_max_streams_bidi": 0x08, + "initial_max_streams_uni": 0x09, + "ack_delay_exponent": 0x0a, + "max_ack_delay": 0x0b, + "disable_active_migration": 0x0c, + "preferred_address": 0x0d, + "active_connection_id_limit": 0x0e, + "initial_source_connection_id": 0x0f, + "retry_source_connection_id": 0x10, + "version_information": 0x11, + "max_datagram_frame_size": 0x20, + "discard": 0x173e, + "google handshake message": 0x26ab, + "grease_quic_bit": 0x2ab2, + "initial_rtt": 0x3127, + "google_connection_options": 0x3128, + "user_agent": 0x3129, + "google_version": 0x4752, +} diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go index fd2b3a42b..087320da7 100644 --- a/vendor/github.com/google/go-cmp/cmp/compare.go +++ b/vendor/github.com/google/go-cmp/cmp/compare.go @@ -13,21 +13,21 @@ // // The primary features of cmp are: // -// • When the default behavior of equality does not suit the needs of the test, -// custom equality functions can override the equality operation. -// For example, an equality function may report floats as equal so long as they -// are within some tolerance of each other. +// - When the default behavior of equality does not suit the test's needs, +// custom equality functions can override the equality operation. +// For example, an equality function may report floats as equal so long as +// they are within some tolerance of each other. // -// • Types that have an Equal method may use that method to determine equality. -// This allows package authors to determine the equality operation for the types -// that they define. +// - Types with an Equal method may use that method to determine equality. +// This allows package authors to determine the equality operation +// for the types that they define. // -// • If no custom equality functions are used and no Equal method is defined, -// equality is determined by recursively comparing the primitive kinds on both -// values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported -// fields are not compared by default; they result in panics unless suppressed -// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly -// compared using the Exporter option. +// - If no custom equality functions are used and no Equal method is defined, +// equality is determined by recursively comparing the primitive kinds on +// both values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, +// unexported fields are not compared by default; they result in panics +// unless suppressed by using an Ignore option (see cmpopts.IgnoreUnexported) +// or explicitly compared using the Exporter option. package cmp import ( @@ -45,25 +45,25 @@ import ( // Equal reports whether x and y are equal by recursively applying the // following rules in the given order to x and y and all of their sub-values: // -// • Let S be the set of all Ignore, Transformer, and Comparer options that -// remain after applying all path filters, value filters, and type filters. -// If at least one Ignore exists in S, then the comparison is ignored. -// If the number of Transformer and Comparer options in S is greater than one, -// then Equal panics because it is ambiguous which option to use. -// If S contains a single Transformer, then use that to transform the current -// values and recursively call Equal on the output values. -// If S contains a single Comparer, then use that to compare the current values. -// Otherwise, evaluation proceeds to the next rule. +// - Let S be the set of all Ignore, Transformer, and Comparer options that +// remain after applying all path filters, value filters, and type filters. +// If at least one Ignore exists in S, then the comparison is ignored. +// If the number of Transformer and Comparer options in S is non-zero, +// then Equal panics because it is ambiguous which option to use. +// If S contains a single Transformer, then use that to transform +// the current values and recursively call Equal on the output values. +// If S contains a single Comparer, then use that to compare the current values. +// Otherwise, evaluation proceeds to the next rule. // -// • If the values have an Equal method of the form "(T) Equal(T) bool" or -// "(T) Equal(I) bool" where T is assignable to I, then use the result of -// x.Equal(y) even if x or y is nil. Otherwise, no such method exists and -// evaluation proceeds to the next rule. +// - If the values have an Equal method of the form "(T) Equal(T) bool" or +// "(T) Equal(I) bool" where T is assignable to I, then use the result of +// x.Equal(y) even if x or y is nil. Otherwise, no such method exists and +// evaluation proceeds to the next rule. // -// • Lastly, try to compare x and y based on their basic kinds. -// Simple kinds like booleans, integers, floats, complex numbers, strings, and -// channels are compared using the equivalent of the == operator in Go. -// Functions are only equal if they are both nil, otherwise they are unequal. +// - Lastly, try to compare x and y based on their basic kinds. +// Simple kinds like booleans, integers, floats, complex numbers, strings, +// and channels are compared using the equivalent of the == operator in Go. +// Functions are only equal if they are both nil, otherwise they are unequal. // // Structs are equal if recursively calling Equal on all fields report equal. // If a struct contains unexported fields, Equal panics unless an Ignore option @@ -144,7 +144,7 @@ func rootStep(x, y interface{}) PathStep { // so that they have the same parent type. var t reflect.Type if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { - t = reflect.TypeOf((*interface{})(nil)).Elem() + t = anyType if vx.IsValid() { vvx := reflect.New(t).Elem() vvx.Set(vx) @@ -639,7 +639,9 @@ type dynChecker struct{ curr, next int } // Next increments the state and reports whether a check should be performed. // // Checks occur every Nth function call, where N is a triangular number: +// // 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ... +// // See https://en.wikipedia.org/wiki/Triangular_number // // This sequence ensures that the cost of checks drops significantly as diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go index bc196b16c..a248e5436 100644 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go +++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -127,9 +127,9 @@ var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 // This function returns an edit-script, which is a sequence of operations // needed to convert one list into the other. The following invariants for // the edit-script are maintained: -// • eq == (es.Dist()==0) -// • nx == es.LenX() -// • ny == es.LenY() +// - eq == (es.Dist()==0) +// - nx == es.LenX() +// - ny == es.LenY() // // This algorithm is not guaranteed to be an optimal solution (i.e., one that // produces an edit-script with a minimal Levenshtein distance). This algorithm @@ -169,12 +169,13 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // A diagonal edge is equivalent to a matching symbol between both X and Y. // Invariants: - // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx - // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny + // - 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx + // - 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny // // In general: - // • fwdFrontier.X < revFrontier.X - // • fwdFrontier.Y < revFrontier.Y + // - fwdFrontier.X < revFrontier.X + // - fwdFrontier.Y < revFrontier.Y + // // Unless, it is time for the algorithm to terminate. fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)} revPath := path{-1, point{nx, ny}, make(EditScript, 0)} @@ -195,19 +196,21 @@ func Difference(nx, ny int, f EqualFunc) (es EditScript) { // computing sub-optimal edit-scripts between two lists. // // The algorithm is approximately as follows: - // • Searching for differences switches back-and-forth between - // a search that starts at the beginning (the top-left corner), and - // a search that starts at the end (the bottom-right corner). The goal of - // the search is connect with the search from the opposite corner. - // • As we search, we build a path in a greedy manner, where the first - // match seen is added to the path (this is sub-optimal, but provides a - // decent result in practice). When matches are found, we try the next pair - // of symbols in the lists and follow all matches as far as possible. - // • When searching for matches, we search along a diagonal going through - // through the "frontier" point. If no matches are found, we advance the - // frontier towards the opposite corner. - // • This algorithm terminates when either the X coordinates or the - // Y coordinates of the forward and reverse frontier points ever intersect. + // - Searching for differences switches back-and-forth between + // a search that starts at the beginning (the top-left corner), and + // a search that starts at the end (the bottom-right corner). + // The goal of the search is connect with the search + // from the opposite corner. + // - As we search, we build a path in a greedy manner, + // where the first match seen is added to the path (this is sub-optimal, + // but provides a decent result in practice). When matches are found, + // we try the next pair of symbols in the lists and follow all matches + // as far as possible. + // - When searching for matches, we search along a diagonal going through + // through the "frontier" point. If no matches are found, + // we advance the frontier towards the opposite corner. + // - This algorithm terminates when either the X coordinates or the + // Y coordinates of the forward and reverse frontier points ever intersect. // This algorithm is correct even if searching only in the forward direction // or in the reverse direction. We do both because it is commonly observed @@ -389,6 +392,7 @@ type point struct{ X, Y int } func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy } // zigzag maps a consecutive sequence of integers to a zig-zag sequence. +// // [0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...] func zigzag(x int) int { if x&1 != 0 { diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go deleted file mode 100644 index 9147a2997..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package value - -import ( - "math" - "reflect" -) - -// IsZero reports whether v is the zero value. -// This does not rely on Interface and so can be used on unexported fields. -func IsZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return v.Bool() == false - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return math.Float64bits(v.Float()) == 0 - case reflect.Complex64, reflect.Complex128: - return math.Float64bits(real(v.Complex())) == 0 && math.Float64bits(imag(v.Complex())) == 0 - case reflect.String: - return v.String() == "" - case reflect.UnsafePointer: - return v.Pointer() == 0 - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: - return v.IsNil() - case reflect.Array: - for i := 0; i < v.Len(); i++ { - if !IsZero(v.Index(i)) { - return false - } - } - return true - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - if !IsZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go index e57b9eb53..1f9ca9c48 100644 --- a/vendor/github.com/google/go-cmp/cmp/options.go +++ b/vendor/github.com/google/go-cmp/cmp/options.go @@ -33,6 +33,7 @@ type Option interface { } // applicableOption represents the following types: +// // Fundamental: ignore | validator | *comparer | *transformer // Grouping: Options type applicableOption interface { @@ -43,6 +44,7 @@ type applicableOption interface { } // coreOption represents the following types: +// // Fundamental: ignore | validator | *comparer | *transformer // Filters: *pathFilter | *valuesFilter type coreOption interface { @@ -336,9 +338,9 @@ func (tr transformer) String() string { // both implement T. // // The equality function must be: -// • Symmetric: equal(x, y) == equal(y, x) -// • Deterministic: equal(x, y) == equal(x, y) -// • Pure: equal(x, y) does not modify x or y +// - Symmetric: equal(x, y) == equal(y, x) +// - Deterministic: equal(x, y) == equal(x, y) +// - Pure: equal(x, y) does not modify x or y func Comparer(f interface{}) Option { v := reflect.ValueOf(f) if !function.IsType(v.Type(), function.Equal) || v.IsNil() { @@ -430,7 +432,7 @@ func AllowUnexported(types ...interface{}) Option { } // Result represents the comparison result for a single node and -// is provided by cmp when calling Result (see Reporter). +// is provided by cmp when calling Report (see Reporter). type Result struct { _ [0]func() // Make Result incomparable flags resultFlags diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go index c71003463..a0a588502 100644 --- a/vendor/github.com/google/go-cmp/cmp/path.go +++ b/vendor/github.com/google/go-cmp/cmp/path.go @@ -41,13 +41,13 @@ type PathStep interface { // The type of each valid value is guaranteed to be identical to Type. // // In some cases, one or both may be invalid or have restrictions: - // • For StructField, both are not interface-able if the current field - // is unexported and the struct type is not explicitly permitted by - // an Exporter to traverse unexported fields. - // • For SliceIndex, one may be invalid if an element is missing from - // either the x or y slice. - // • For MapIndex, one may be invalid if an entry is missing from - // either the x or y map. + // - For StructField, both are not interface-able if the current field + // is unexported and the struct type is not explicitly permitted by + // an Exporter to traverse unexported fields. + // - For SliceIndex, one may be invalid if an element is missing from + // either the x or y slice. + // - For MapIndex, one may be invalid if an entry is missing from + // either the x or y map. // // The provided values must not be mutated. Values() (vx, vy reflect.Value) @@ -94,6 +94,7 @@ func (pa Path) Index(i int) PathStep { // The simplified path only contains struct field accesses. // // For example: +// // MyMap.MySlices.MyField func (pa Path) String() string { var ss []string @@ -108,6 +109,7 @@ func (pa Path) String() string { // GoString returns the path to a specific node using Go syntax. // // For example: +// // (*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField func (pa Path) GoString() string { var ssPre, ssPost []string @@ -159,7 +161,7 @@ func (ps pathStep) String() string { if ps.typ == nil { return "" } - s := ps.typ.String() + s := value.TypeString(ps.typ, false) if s == "" || strings.ContainsAny(s, "{}\n") { return "root" // Type too simple or complex to print } @@ -282,7 +284,7 @@ type typeAssertion struct { func (ta TypeAssertion) Type() reflect.Type { return ta.typ } func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy } -func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", ta.typ) } +func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", value.TypeString(ta.typ, false)) } // Transform is a transformation from the parent type to the current type. type Transform struct{ *transform } diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go index 1ef65ac1d..2050bf6b4 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_compare.go +++ b/vendor/github.com/google/go-cmp/cmp/report_compare.go @@ -7,8 +7,6 @@ package cmp import ( "fmt" "reflect" - - "github.com/google/go-cmp/cmp/internal/value" ) // numContextRecords is the number of surrounding equal records to print. @@ -117,7 +115,7 @@ func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out // For leaf nodes, format the value based on the reflect.Values alone. // As a special case, treat equal []byte as a leaf nodes. - isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == reflect.TypeOf(byte(0)) + isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == byteType isEqualBytes := isBytes && v.NumDiff+v.NumIgnored+v.NumTransformed == 0 if v.MaxDepth == 0 || isEqualBytes { switch opts.DiffMode { @@ -248,11 +246,11 @@ func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind, pt var isZero bool switch opts.DiffMode { case diffIdentical: - isZero = value.IsZero(r.Value.ValueX) || value.IsZero(r.Value.ValueY) + isZero = r.Value.ValueX.IsZero() || r.Value.ValueY.IsZero() case diffRemoved: - isZero = value.IsZero(r.Value.ValueX) + isZero = r.Value.ValueX.IsZero() case diffInserted: - isZero = value.IsZero(r.Value.ValueY) + isZero = r.Value.ValueY.IsZero() } if isZero { continue diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go index 287b89358..2ab41fad3 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go @@ -16,6 +16,13 @@ import ( "github.com/google/go-cmp/cmp/internal/value" ) +var ( + anyType = reflect.TypeOf((*interface{})(nil)).Elem() + stringType = reflect.TypeOf((*string)(nil)).Elem() + bytesType = reflect.TypeOf((*[]byte)(nil)).Elem() + byteType = reflect.TypeOf((*byte)(nil)).Elem() +) + type formatValueOptions struct { // AvoidStringer controls whether to avoid calling custom stringer // methods like error.Error or fmt.Stringer.String. @@ -184,7 +191,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, } for i := 0; i < v.NumField(); i++ { vv := v.Field(i) - if value.IsZero(vv) { + if vv.IsZero() { continue // Elide fields with zero values } if len(list) == maxLen { @@ -205,7 +212,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, } // Check whether this is a []byte of text data. - if t.Elem() == reflect.TypeOf(byte(0)) { + if t.Elem() == byteType { b := v.Bytes() isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) || unicode.IsSpace(r) } if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 { diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go index 68b5c1ae1..23e444f62 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_slices.go +++ b/vendor/github.com/google/go-cmp/cmp/report_slices.go @@ -104,7 +104,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { case t.Kind() == reflect.String: sx, sy = vx.String(), vy.String() isString = true - case t.Kind() == reflect.Slice && t.Elem() == reflect.TypeOf(byte(0)): + case t.Kind() == reflect.Slice && t.Elem() == byteType: sx, sy = string(vx.Bytes()), string(vy.Bytes()) isString = true case t.Kind() == reflect.Array: @@ -147,7 +147,10 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { }) efficiencyLines := float64(esLines.Dist()) / float64(len(esLines)) efficiencyBytes := float64(esBytes.Dist()) / float64(len(esBytes)) - isPureLinedText = efficiencyLines < 4*efficiencyBytes + quotedLength := len(strconv.Quote(sx + sy)) + unquotedLength := len(sx) + len(sy) + escapeExpansionRatio := float64(quotedLength) / float64(unquotedLength) + isPureLinedText = efficiencyLines < 4*efficiencyBytes || escapeExpansionRatio > 1.1 } } @@ -171,12 +174,13 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { // differences in a string literal. This format is more readable, // but has edge-cases where differences are visually indistinguishable. // This format is avoided under the following conditions: - // • A line starts with `"""` - // • A line starts with "..." - // • A line contains non-printable characters - // • Adjacent different lines differ only by whitespace + // - A line starts with `"""` + // - A line starts with "..." + // - A line contains non-printable characters + // - Adjacent different lines differ only by whitespace // // For example: + // // """ // ... // 3 identical lines // foo @@ -231,7 +235,7 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { var out textNode = &textWrap{Prefix: "(", Value: list2, Suffix: ")"} switch t.Kind() { case reflect.String: - if t != reflect.TypeOf(string("")) { + if t != stringType { out = opts.FormatType(t, out) } case reflect.Slice: @@ -326,12 +330,12 @@ func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { switch t.Kind() { case reflect.String: out = &textWrap{Prefix: "strings.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} - if t != reflect.TypeOf(string("")) { + if t != stringType { out = opts.FormatType(t, out) } case reflect.Slice: out = &textWrap{Prefix: "bytes.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)} - if t != reflect.TypeOf([]byte(nil)) { + if t != bytesType { out = opts.FormatType(t, out) } } @@ -446,7 +450,6 @@ func (opts formatOptions) formatDiffSlice( // {NumIdentical: 3}, // {NumInserted: 1}, // ] -// func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) { var prevMode byte lastStats := func(mode byte) *diffStats { @@ -503,7 +506,6 @@ func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) // {NumIdentical: 8, NumRemoved: 12, NumInserted: 3}, // {NumIdentical: 63}, // ] -// func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats { groups, groupsOrig := groups[:0], groups for i, ds := range groupsOrig { @@ -548,7 +550,6 @@ func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStat // {NumRemoved: 9}, // {NumIdentical: 64}, // incremented by 10 // ] -// func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []diffStats { var ix, iy int // indexes into sequence x and y for i, ds := range groups { diff --git a/vendor/github.com/google/go-cmp/cmp/report_text.go b/vendor/github.com/google/go-cmp/cmp/report_text.go index 0fd46d7ff..388fcf571 100644 --- a/vendor/github.com/google/go-cmp/cmp/report_text.go +++ b/vendor/github.com/google/go-cmp/cmp/report_text.go @@ -393,6 +393,7 @@ func (s diffStats) Append(ds diffStats) diffStats { // String prints a humanly-readable summary of coalesced records. // // Example: +// // diffStats{Name: "Field", NumIgnored: 5}.String() => "5 ignored fields" func (s diffStats) String() string { var ss []string diff --git a/vendor/github.com/google/gopacket/layers/enums.go b/vendor/github.com/google/gopacket/layers/enums.go index 62cfcf965..8427bdaf4 100644 --- a/vendor/github.com/google/gopacket/layers/enums.go +++ b/vendor/github.com/google/gopacket/layers/enums.go @@ -47,6 +47,7 @@ const ( EthernetTypeMPLSUnicast EthernetType = 0x8847 EthernetTypeMPLSMulticast EthernetType = 0x8848 EthernetTypeEAPOL EthernetType = 0x888e + EthernetTypeERSPAN EthernetType = 0x88be EthernetTypeQinQ EthernetType = 0x88a8 EthernetTypeLinkLayerDiscovery EthernetType = 0x88cc EthernetTypeEthernetCTP EthernetType = 0x9000 @@ -317,6 +318,7 @@ func initActualTypeData() { EthernetTypeMetadata[EthernetTypeEAPOL] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEAPOL), Name: "EAPOL", LayerType: LayerTypeEAPOL} EthernetTypeMetadata[EthernetTypeQinQ] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeDot1Q), Name: "Dot1Q", LayerType: LayerTypeDot1Q} EthernetTypeMetadata[EthernetTypeTransparentEthernetBridging] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeEthernet), Name: "TransparentEthernetBridging", LayerType: LayerTypeEthernet} + EthernetTypeMetadata[EthernetTypeERSPAN] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeERSPANII), Name: "ERSPAN Type II", LayerType: LayerTypeERSPANII} IPProtocolMetadata[IPProtocolIPv4] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeIPv4), Name: "IPv4", LayerType: LayerTypeIPv4} IPProtocolMetadata[IPProtocolTCP] = EnumMetadata{DecodeWith: gopacket.DecodeFunc(decodeTCP), Name: "TCP", LayerType: LayerTypeTCP} diff --git a/vendor/github.com/google/gopacket/layers/erspan2.go b/vendor/github.com/google/gopacket/layers/erspan2.go new file mode 100644 index 000000000..154436205 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/erspan2.go @@ -0,0 +1,86 @@ +// Copyright 2018 Google, Inc. All rights reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. + +package layers + +import ( + "encoding/binary" + + "github.com/google/gopacket" +) + +const ( + //ERSPANIIVersionObsolete - The obsolete value for the version field + ERSPANIIVersionObsolete = 0x0 + // ERSPANIIVersion - The current value for the version field + ERSPANIIVersion = 0x1 +) + +// ERSPANII contains all of the fields found in an ERSPAN Type II header +// https://tools.ietf.org/html/draft-foschiano-erspan-03 +type ERSPANII struct { + BaseLayer + IsTruncated bool + Version, CoS, TrunkEncap uint8 + VLANIdentifier, SessionID, Reserved uint16 + Index uint32 +} + +func (erspan2 *ERSPANII) LayerType() gopacket.LayerType { return LayerTypeERSPANII } + +// DecodeFromBytes decodes the given bytes into this layer. +func (erspan2 *ERSPANII) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + erspan2Length := 8 + erspan2.Version = data[0] & 0xF0 >> 4 + erspan2.VLANIdentifier = binary.BigEndian.Uint16(data[:2]) & 0x0FFF + erspan2.CoS = data[2] & 0xE0 >> 5 + erspan2.TrunkEncap = data[2] & 0x18 >> 3 + erspan2.IsTruncated = data[2]&0x4>>2 != 0 + erspan2.SessionID = binary.BigEndian.Uint16(data[2:4]) & 0x03FF + erspan2.Reserved = binary.BigEndian.Uint16(data[4:6]) & 0xFFF0 >> 4 + erspan2.Index = binary.BigEndian.Uint32(data[4:8]) & 0x000FFFFF + erspan2.Contents = data[:erspan2Length] + erspan2.Payload = data[erspan2Length:] + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (erspan2 *ERSPANII) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + bytes, err := b.PrependBytes(8) + if err != nil { + return err + } + + twoByteInt := uint16(erspan2.Version&0xF)<<12 | erspan2.VLANIdentifier&0x0FFF + binary.BigEndian.PutUint16(bytes, twoByteInt) + + twoByteInt = uint16(erspan2.CoS&0x7)<<13 | uint16(erspan2.TrunkEncap&0x3)<<11 | erspan2.SessionID&0x03FF + if erspan2.IsTruncated { + twoByteInt |= 0x400 + } + binary.BigEndian.PutUint16(bytes[2:], twoByteInt) + + fourByteInt := uint32(erspan2.Reserved&0x0FFF)<<20 | erspan2.Index&0x000FFFFF + binary.BigEndian.PutUint32(bytes[4:], fourByteInt) + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (erspan2 *ERSPANII) CanDecode() gopacket.LayerClass { + return LayerTypeERSPANII +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (erspan2 *ERSPANII) NextLayerType() gopacket.LayerType { + return LayerTypeEthernet +} + +func decodeERSPANII(data []byte, p gopacket.PacketBuilder) error { + erspan2 := &ERSPANII{} + return decodingLayerDecoder(erspan2, data, p) +} diff --git a/vendor/github.com/google/gopacket/layers/layertypes.go b/vendor/github.com/google/gopacket/layers/layertypes.go index f66fd9b2c..69d25ae80 100644 --- a/vendor/github.com/google/gopacket/layers/layertypes.go +++ b/vendor/github.com/google/gopacket/layers/layertypes.go @@ -146,6 +146,8 @@ var ( LayerTypeRMCP = gopacket.RegisterLayerType(142, gopacket.LayerTypeMetadata{Name: "RMCP", Decoder: gopacket.DecodeFunc(decodeRMCP)}) LayerTypeASF = gopacket.RegisterLayerType(143, gopacket.LayerTypeMetadata{Name: "ASF", Decoder: gopacket.DecodeFunc(decodeASF)}) LayerTypeASFPresencePong = gopacket.RegisterLayerType(144, gopacket.LayerTypeMetadata{Name: "ASFPresencePong", Decoder: gopacket.DecodeFunc(decodeASFPresencePong)}) + LayerTypeERSPANII = gopacket.RegisterLayerType(145, gopacket.LayerTypeMetadata{Name: "ERSPAN Type II", Decoder: gopacket.DecodeFunc(decodeERSPANII)}) + LayerTypeRADIUS = gopacket.RegisterLayerType(146, gopacket.LayerTypeMetadata{Name: "RADIUS", Decoder: gopacket.DecodeFunc(decodeRADIUS)}) ) var ( diff --git a/vendor/github.com/google/gopacket/layers/lldp.go b/vendor/github.com/google/gopacket/layers/lldp.go index 2c9f8dff5..16a5bbada 100644 --- a/vendor/github.com/google/gopacket/layers/lldp.go +++ b/vendor/github.com/google/gopacket/layers/lldp.go @@ -779,6 +779,16 @@ func (c *LinkLayerDiscovery) SerializeTo(b gopacket.SerializeBuffer, opts gopack binary.BigEndian.PutUint16(vb[chassIDLen+portIDLen:], ttlIDLen) binary.BigEndian.PutUint16(vb[chassIDLen+portIDLen+2:], c.TTL) + for _, v := range c.Values { + vb, err := b.AppendBytes(int(v.Length) + 2) // +2 for TLV type and length; 1 byte for subtype is included in v.Value + if err != nil { + return err + } + idLen := ((uint16(v.Type) << 9) | v.Length) + binary.BigEndian.PutUint16(vb[0:2], idLen) + copy(vb[2:], v.Value) + } + vb, err = b.AppendBytes(2) // End Tlv, 2 bytes if err != nil { return err @@ -880,10 +890,10 @@ func decodeLinkLayerDiscovery(data []byte, p gopacket.PacketBuilder) error { info.MgmtAddress.InterfaceSubtype = LLDPInterfaceSubtype(v.Value[mlen+1]) info.MgmtAddress.InterfaceNumber = binary.BigEndian.Uint32(v.Value[mlen+2 : mlen+6]) olen := v.Value[mlen+6] - if err := checkLLDPTLVLen(v, int(mlen+6+olen)); err != nil { + if err := checkLLDPTLVLen(v, int(mlen+7+olen)); err != nil { return err } - info.MgmtAddress.OID = string(v.Value[mlen+9 : mlen+9+olen]) + info.MgmtAddress.OID = string(v.Value[mlen+7 : mlen+7+olen]) case LLDPTLVOrgSpecific: if err := checkLLDPTLVLen(v, 4); err != nil { return err diff --git a/vendor/github.com/google/gopacket/layers/ports.go b/vendor/github.com/google/gopacket/layers/ports.go index 7ea5adafa..1e3f42efc 100644 --- a/vendor/github.com/google/gopacket/layers/ports.go +++ b/vendor/github.com/google/gopacket/layers/ports.go @@ -116,6 +116,7 @@ var udpPortLayerType = [65536]gopacket.LayerType{ 3784: LayerTypeBFD, 2152: LayerTypeGTPv1U, 623: LayerTypeRMCP, + 1812: LayerTypeRADIUS, } // RegisterUDPPortLayerType creates a new mapping between a UDPPort diff --git a/vendor/github.com/google/gopacket/layers/radius.go b/vendor/github.com/google/gopacket/layers/radius.go new file mode 100644 index 000000000..c43ea2945 --- /dev/null +++ b/vendor/github.com/google/gopacket/layers/radius.go @@ -0,0 +1,560 @@ +// Copyright 2020 The GoPacket Authors. All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file in the root of the source tree. + +package layers + +import ( + "encoding/binary" + "fmt" + + "github.com/google/gopacket" +) + +const ( + // RFC 2865 3. Packet Format + // `The minimum length is 20 and maximum length is 4096.` + radiusMinimumRecordSizeInBytes int = 20 + radiusMaximumRecordSizeInBytes int = 4096 + + // RFC 2865 5. Attributes + // `The Length field is one octet, and indicates the length of this Attribute including the Type, Length and Value fields.` + // `The Value field is zero or more octets and contains information specific to the Attribute.` + radiusAttributesMinimumRecordSizeInBytes int = 2 +) + +// RADIUS represents a Remote Authentication Dial In User Service layer. +type RADIUS struct { + BaseLayer + + Code RADIUSCode + Identifier RADIUSIdentifier + Length RADIUSLength + Authenticator RADIUSAuthenticator + Attributes []RADIUSAttribute +} + +// RADIUSCode represents packet type. +type RADIUSCode uint8 + +// constants that define RADIUSCode. +const ( + RADIUSCodeAccessRequest RADIUSCode = 1 // RFC2865 3. Packet Format + RADIUSCodeAccessAccept RADIUSCode = 2 // RFC2865 3. Packet Format + RADIUSCodeAccessReject RADIUSCode = 3 // RFC2865 3. Packet Format + RADIUSCodeAccountingRequest RADIUSCode = 4 // RFC2865 3. Packet Format + RADIUSCodeAccountingResponse RADIUSCode = 5 // RFC2865 3. Packet Format + RADIUSCodeAccessChallenge RADIUSCode = 11 // RFC2865 3. Packet Format + RADIUSCodeStatusServer RADIUSCode = 12 // RFC2865 3. Packet Format (experimental) + RADIUSCodeStatusClient RADIUSCode = 13 // RFC2865 3. Packet Format (experimental) + RADIUSCodeReserved RADIUSCode = 255 // RFC2865 3. Packet Format +) + +// String returns a string version of a RADIUSCode. +func (t RADIUSCode) String() (s string) { + switch t { + case RADIUSCodeAccessRequest: + s = "Access-Request" + case RADIUSCodeAccessAccept: + s = "Access-Accept" + case RADIUSCodeAccessReject: + s = "Access-Reject" + case RADIUSCodeAccountingRequest: + s = "Accounting-Request" + case RADIUSCodeAccountingResponse: + s = "Accounting-Response" + case RADIUSCodeAccessChallenge: + s = "Access-Challenge" + case RADIUSCodeStatusServer: + s = "Status-Server" + case RADIUSCodeStatusClient: + s = "Status-Client" + case RADIUSCodeReserved: + s = "Reserved" + default: + s = fmt.Sprintf("Unknown(%d)", t) + } + return +} + +// RADIUSIdentifier represents packet identifier. +type RADIUSIdentifier uint8 + +// RADIUSLength represents packet length. +type RADIUSLength uint16 + +// RADIUSAuthenticator represents authenticator. +type RADIUSAuthenticator [16]byte + +// RADIUSAttribute represents attributes. +type RADIUSAttribute struct { + Type RADIUSAttributeType + Length RADIUSAttributeLength + Value RADIUSAttributeValue +} + +// RADIUSAttributeType represents attribute type. +type RADIUSAttributeType uint8 + +// constants that define RADIUSAttributeType. +const ( + RADIUSAttributeTypeUserName RADIUSAttributeType = 1 // RFC2865 5.1. User-Name + RADIUSAttributeTypeUserPassword RADIUSAttributeType = 2 // RFC2865 5.2. User-Password + RADIUSAttributeTypeCHAPPassword RADIUSAttributeType = 3 // RFC2865 5.3. CHAP-Password + RADIUSAttributeTypeNASIPAddress RADIUSAttributeType = 4 // RFC2865 5.4. NAS-IP-Address + RADIUSAttributeTypeNASPort RADIUSAttributeType = 5 // RFC2865 5.5. NAS-Port + RADIUSAttributeTypeServiceType RADIUSAttributeType = 6 // RFC2865 5.6. Service-Type + RADIUSAttributeTypeFramedProtocol RADIUSAttributeType = 7 // RFC2865 5.7. Framed-Protocol + RADIUSAttributeTypeFramedIPAddress RADIUSAttributeType = 8 // RFC2865 5.8. Framed-IP-Address + RADIUSAttributeTypeFramedIPNetmask RADIUSAttributeType = 9 // RFC2865 5.9. Framed-IP-Netmask + RADIUSAttributeTypeFramedRouting RADIUSAttributeType = 10 // RFC2865 5.10. Framed-Routing + RADIUSAttributeTypeFilterId RADIUSAttributeType = 11 // RFC2865 5.11. Filter-Id + RADIUSAttributeTypeFramedMTU RADIUSAttributeType = 12 // RFC2865 5.12. Framed-MTU + RADIUSAttributeTypeFramedCompression RADIUSAttributeType = 13 // RFC2865 5.13. Framed-Compression + RADIUSAttributeTypeLoginIPHost RADIUSAttributeType = 14 // RFC2865 5.14. Login-IP-Host + RADIUSAttributeTypeLoginService RADIUSAttributeType = 15 // RFC2865 5.15. Login-Service + RADIUSAttributeTypeLoginTCPPort RADIUSAttributeType = 16 // RFC2865 5.16. Login-TCP-Port + RADIUSAttributeTypeReplyMessage RADIUSAttributeType = 18 // RFC2865 5.18. Reply-Message + RADIUSAttributeTypeCallbackNumber RADIUSAttributeType = 19 // RFC2865 5.19. Callback-Number + RADIUSAttributeTypeCallbackId RADIUSAttributeType = 20 // RFC2865 5.20. Callback-Id + RADIUSAttributeTypeFramedRoute RADIUSAttributeType = 22 // RFC2865 5.22. Framed-Route + RADIUSAttributeTypeFramedIPXNetwork RADIUSAttributeType = 23 // RFC2865 5.23. Framed-IPX-Network + RADIUSAttributeTypeState RADIUSAttributeType = 24 // RFC2865 5.24. State + RADIUSAttributeTypeClass RADIUSAttributeType = 25 // RFC2865 5.25. Class + RADIUSAttributeTypeVendorSpecific RADIUSAttributeType = 26 // RFC2865 5.26. Vendor-Specific + RADIUSAttributeTypeSessionTimeout RADIUSAttributeType = 27 // RFC2865 5.27. Session-Timeout + RADIUSAttributeTypeIdleTimeout RADIUSAttributeType = 28 // RFC2865 5.28. Idle-Timeout + RADIUSAttributeTypeTerminationAction RADIUSAttributeType = 29 // RFC2865 5.29. Termination-Action + RADIUSAttributeTypeCalledStationId RADIUSAttributeType = 30 // RFC2865 5.30. Called-Station-Id + RADIUSAttributeTypeCallingStationId RADIUSAttributeType = 31 // RFC2865 5.31. Calling-Station-Id + RADIUSAttributeTypeNASIdentifier RADIUSAttributeType = 32 // RFC2865 5.32. NAS-Identifier + RADIUSAttributeTypeProxyState RADIUSAttributeType = 33 // RFC2865 5.33. Proxy-State + RADIUSAttributeTypeLoginLATService RADIUSAttributeType = 34 // RFC2865 5.34. Login-LAT-Service + RADIUSAttributeTypeLoginLATNode RADIUSAttributeType = 35 // RFC2865 5.35. Login-LAT-Node + RADIUSAttributeTypeLoginLATGroup RADIUSAttributeType = 36 // RFC2865 5.36. Login-LAT-Group + RADIUSAttributeTypeFramedAppleTalkLink RADIUSAttributeType = 37 // RFC2865 5.37. Framed-AppleTalk-Link + RADIUSAttributeTypeFramedAppleTalkNetwork RADIUSAttributeType = 38 // RFC2865 5.38. Framed-AppleTalk-Network + RADIUSAttributeTypeFramedAppleTalkZone RADIUSAttributeType = 39 // RFC2865 5.39. Framed-AppleTalk-Zone + RADIUSAttributeTypeAcctStatusType RADIUSAttributeType = 40 // RFC2866 5.1. Acct-Status-Type + RADIUSAttributeTypeAcctDelayTime RADIUSAttributeType = 41 // RFC2866 5.2. Acct-Delay-Time + RADIUSAttributeTypeAcctInputOctets RADIUSAttributeType = 42 // RFC2866 5.3. Acct-Input-Octets + RADIUSAttributeTypeAcctOutputOctets RADIUSAttributeType = 43 // RFC2866 5.4. Acct-Output-Octets + RADIUSAttributeTypeAcctSessionId RADIUSAttributeType = 44 // RFC2866 5.5. Acct-Session-Id + RADIUSAttributeTypeAcctAuthentic RADIUSAttributeType = 45 // RFC2866 5.6. Acct-Authentic + RADIUSAttributeTypeAcctSessionTime RADIUSAttributeType = 46 // RFC2866 5.7. Acct-Session-Time + RADIUSAttributeTypeAcctInputPackets RADIUSAttributeType = 47 // RFC2866 5.8. Acct-Input-Packets + RADIUSAttributeTypeAcctOutputPackets RADIUSAttributeType = 48 // RFC2866 5.9. Acct-Output-Packets + RADIUSAttributeTypeAcctTerminateCause RADIUSAttributeType = 49 // RFC2866 5.10. Acct-Terminate-Cause + RADIUSAttributeTypeAcctMultiSessionId RADIUSAttributeType = 50 // RFC2866 5.11. Acct-Multi-Session-Id + RADIUSAttributeTypeAcctLinkCount RADIUSAttributeType = 51 // RFC2866 5.12. Acct-Link-Count + RADIUSAttributeTypeAcctInputGigawords RADIUSAttributeType = 52 // RFC2869 5.1. Acct-Input-Gigawords + RADIUSAttributeTypeAcctOutputGigawords RADIUSAttributeType = 53 // RFC2869 5.2. Acct-Output-Gigawords + RADIUSAttributeTypeEventTimestamp RADIUSAttributeType = 55 // RFC2869 5.3. Event-Timestamp + RADIUSAttributeTypeCHAPChallenge RADIUSAttributeType = 60 // RFC2865 5.40. CHAP-Challenge + RADIUSAttributeTypeNASPortType RADIUSAttributeType = 61 // RFC2865 5.41. NAS-Port-Type + RADIUSAttributeTypePortLimit RADIUSAttributeType = 62 // RFC2865 5.42. Port-Limit + RADIUSAttributeTypeLoginLATPort RADIUSAttributeType = 63 // RFC2865 5.43. Login-LAT-Port + RADIUSAttributeTypeTunnelType RADIUSAttributeType = 64 // RFC2868 3.1. Tunnel-Type + RADIUSAttributeTypeTunnelMediumType RADIUSAttributeType = 65 // RFC2868 3.2. Tunnel-Medium-Type + RADIUSAttributeTypeTunnelClientEndpoint RADIUSAttributeType = 66 // RFC2868 3.3. Tunnel-Client-Endpoint + RADIUSAttributeTypeTunnelServerEndpoint RADIUSAttributeType = 67 // RFC2868 3.4. Tunnel-Server-Endpoint + RADIUSAttributeTypeAcctTunnelConnection RADIUSAttributeType = 68 // RFC2867 4.1. Acct-Tunnel-Connection + RADIUSAttributeTypeTunnelPassword RADIUSAttributeType = 69 // RFC2868 3.5. Tunnel-Password + RADIUSAttributeTypeARAPPassword RADIUSAttributeType = 70 // RFC2869 5.4. ARAP-Password + RADIUSAttributeTypeARAPFeatures RADIUSAttributeType = 71 // RFC2869 5.5. ARAP-Features + RADIUSAttributeTypeARAPZoneAccess RADIUSAttributeType = 72 // RFC2869 5.6. ARAP-Zone-Access + RADIUSAttributeTypeARAPSecurity RADIUSAttributeType = 73 // RFC2869 5.7. ARAP-Security + RADIUSAttributeTypeARAPSecurityData RADIUSAttributeType = 74 // RFC2869 5.8. ARAP-Security-Data + RADIUSAttributeTypePasswordRetry RADIUSAttributeType = 75 // RFC2869 5.9. Password-Retry + RADIUSAttributeTypePrompt RADIUSAttributeType = 76 // RFC2869 5.10. Prompt + RADIUSAttributeTypeConnectInfo RADIUSAttributeType = 77 // RFC2869 5.11. Connect-Info + RADIUSAttributeTypeConfigurationToken RADIUSAttributeType = 78 // RFC2869 5.12. Configuration-Token + RADIUSAttributeTypeEAPMessage RADIUSAttributeType = 79 // RFC2869 5.13. EAP-Message + RADIUSAttributeTypeMessageAuthenticator RADIUSAttributeType = 80 // RFC2869 5.14. Message-Authenticator + RADIUSAttributeTypeTunnelPrivateGroupID RADIUSAttributeType = 81 // RFC2868 3.6. Tunnel-Private-Group-ID + RADIUSAttributeTypeTunnelAssignmentID RADIUSAttributeType = 82 // RFC2868 3.7. Tunnel-Assignment-ID + RADIUSAttributeTypeTunnelPreference RADIUSAttributeType = 83 // RFC2868 3.8. Tunnel-Preference + RADIUSAttributeTypeARAPChallengeResponse RADIUSAttributeType = 84 // RFC2869 5.15. ARAP-Challenge-Response + RADIUSAttributeTypeAcctInterimInterval RADIUSAttributeType = 85 // RFC2869 5.16. Acct-Interim-Interval + RADIUSAttributeTypeAcctTunnelPacketsLost RADIUSAttributeType = 86 // RFC2867 4.2. Acct-Tunnel-Packets-Lost + RADIUSAttributeTypeNASPortId RADIUSAttributeType = 87 // RFC2869 5.17. NAS-Port-Id + RADIUSAttributeTypeFramedPool RADIUSAttributeType = 88 // RFC2869 5.18. Framed-Pool + RADIUSAttributeTypeTunnelClientAuthID RADIUSAttributeType = 90 // RFC2868 3.9. Tunnel-Client-Auth-ID + RADIUSAttributeTypeTunnelServerAuthID RADIUSAttributeType = 91 // RFC2868 3.10. Tunnel-Server-Auth-ID +) + +// RADIUSAttributeType represents attribute length. +type RADIUSAttributeLength uint8 + +// RADIUSAttributeType represents attribute value. +type RADIUSAttributeValue []byte + +// String returns a string version of a RADIUSAttributeType. +func (t RADIUSAttributeType) String() (s string) { + switch t { + case RADIUSAttributeTypeUserName: + s = "User-Name" + case RADIUSAttributeTypeUserPassword: + s = "User-Password" + case RADIUSAttributeTypeCHAPPassword: + s = "CHAP-Password" + case RADIUSAttributeTypeNASIPAddress: + s = "NAS-IP-Address" + case RADIUSAttributeTypeNASPort: + s = "NAS-Port" + case RADIUSAttributeTypeServiceType: + s = "Service-Type" + case RADIUSAttributeTypeFramedProtocol: + s = "Framed-Protocol" + case RADIUSAttributeTypeFramedIPAddress: + s = "Framed-IP-Address" + case RADIUSAttributeTypeFramedIPNetmask: + s = "Framed-IP-Netmask" + case RADIUSAttributeTypeFramedRouting: + s = "Framed-Routing" + case RADIUSAttributeTypeFilterId: + s = "Filter-Id" + case RADIUSAttributeTypeFramedMTU: + s = "Framed-MTU" + case RADIUSAttributeTypeFramedCompression: + s = "Framed-Compression" + case RADIUSAttributeTypeLoginIPHost: + s = "Login-IP-Host" + case RADIUSAttributeTypeLoginService: + s = "Login-Service" + case RADIUSAttributeTypeLoginTCPPort: + s = "Login-TCP-Port" + case RADIUSAttributeTypeReplyMessage: + s = "Reply-Message" + case RADIUSAttributeTypeCallbackNumber: + s = "Callback-Number" + case RADIUSAttributeTypeCallbackId: + s = "Callback-Id" + case RADIUSAttributeTypeFramedRoute: + s = "Framed-Route" + case RADIUSAttributeTypeFramedIPXNetwork: + s = "Framed-IPX-Network" + case RADIUSAttributeTypeState: + s = "State" + case RADIUSAttributeTypeClass: + s = "Class" + case RADIUSAttributeTypeVendorSpecific: + s = "Vendor-Specific" + case RADIUSAttributeTypeSessionTimeout: + s = "Session-Timeout" + case RADIUSAttributeTypeIdleTimeout: + s = "Idle-Timeout" + case RADIUSAttributeTypeTerminationAction: + s = "Termination-Action" + case RADIUSAttributeTypeCalledStationId: + s = "Called-Station-Id" + case RADIUSAttributeTypeCallingStationId: + s = "Calling-Station-Id" + case RADIUSAttributeTypeNASIdentifier: + s = "NAS-Identifier" + case RADIUSAttributeTypeProxyState: + s = "Proxy-State" + case RADIUSAttributeTypeLoginLATService: + s = "Login-LAT-Service" + case RADIUSAttributeTypeLoginLATNode: + s = "Login-LAT-Node" + case RADIUSAttributeTypeLoginLATGroup: + s = "Login-LAT-Group" + case RADIUSAttributeTypeFramedAppleTalkLink: + s = "Framed-AppleTalk-Link" + case RADIUSAttributeTypeFramedAppleTalkNetwork: + s = "Framed-AppleTalk-Network" + case RADIUSAttributeTypeFramedAppleTalkZone: + s = "Framed-AppleTalk-Zone" + case RADIUSAttributeTypeAcctStatusType: + s = "Acct-Status-Type" + case RADIUSAttributeTypeAcctDelayTime: + s = "Acct-Delay-Time" + case RADIUSAttributeTypeAcctInputOctets: + s = "Acct-Input-Octets" + case RADIUSAttributeTypeAcctOutputOctets: + s = "Acct-Output-Octets" + case RADIUSAttributeTypeAcctSessionId: + s = "Acct-Session-Id" + case RADIUSAttributeTypeAcctAuthentic: + s = "Acct-Authentic" + case RADIUSAttributeTypeAcctSessionTime: + s = "Acct-Session-Time" + case RADIUSAttributeTypeAcctInputPackets: + s = "Acct-Input-Packets" + case RADIUSAttributeTypeAcctOutputPackets: + s = "Acct-Output-Packets" + case RADIUSAttributeTypeAcctTerminateCause: + s = "Acct-Terminate-Cause" + case RADIUSAttributeTypeAcctMultiSessionId: + s = "Acct-Multi-Session-Id" + case RADIUSAttributeTypeAcctLinkCount: + s = "Acct-Link-Count" + case RADIUSAttributeTypeAcctInputGigawords: + s = "Acct-Input-Gigawords" + case RADIUSAttributeTypeAcctOutputGigawords: + s = "Acct-Output-Gigawords" + case RADIUSAttributeTypeEventTimestamp: + s = "Event-Timestamp" + case RADIUSAttributeTypeCHAPChallenge: + s = "CHAP-Challenge" + case RADIUSAttributeTypeNASPortType: + s = "NAS-Port-Type" + case RADIUSAttributeTypePortLimit: + s = "Port-Limit" + case RADIUSAttributeTypeLoginLATPort: + s = "Login-LAT-Port" + case RADIUSAttributeTypeTunnelType: + s = "Tunnel-Type" + case RADIUSAttributeTypeTunnelMediumType: + s = "Tunnel-Medium-Type" + case RADIUSAttributeTypeTunnelClientEndpoint: + s = "Tunnel-Client-Endpoint" + case RADIUSAttributeTypeTunnelServerEndpoint: + s = "Tunnel-Server-Endpoint" + case RADIUSAttributeTypeAcctTunnelConnection: + s = "Acct-Tunnel-Connection" + case RADIUSAttributeTypeTunnelPassword: + s = "Tunnel-Password" + case RADIUSAttributeTypeARAPPassword: + s = "ARAP-Password" + case RADIUSAttributeTypeARAPFeatures: + s = "ARAP-Features" + case RADIUSAttributeTypeARAPZoneAccess: + s = "ARAP-Zone-Access" + case RADIUSAttributeTypeARAPSecurity: + s = "ARAP-Security" + case RADIUSAttributeTypeARAPSecurityData: + s = "ARAP-Security-Data" + case RADIUSAttributeTypePasswordRetry: + s = "Password-Retry" + case RADIUSAttributeTypePrompt: + s = "Prompt" + case RADIUSAttributeTypeConnectInfo: + s = "Connect-Info" + case RADIUSAttributeTypeConfigurationToken: + s = "Configuration-Token" + case RADIUSAttributeTypeEAPMessage: + s = "EAP-Message" + case RADIUSAttributeTypeMessageAuthenticator: + s = "Message-Authenticator" + case RADIUSAttributeTypeTunnelPrivateGroupID: + s = "Tunnel-Private-Group-ID" + case RADIUSAttributeTypeTunnelAssignmentID: + s = "Tunnel-Assignment-ID" + case RADIUSAttributeTypeTunnelPreference: + s = "Tunnel-Preference" + case RADIUSAttributeTypeARAPChallengeResponse: + s = "ARAP-Challenge-Response" + case RADIUSAttributeTypeAcctInterimInterval: + s = "Acct-Interim-Interval" + case RADIUSAttributeTypeAcctTunnelPacketsLost: + s = "Acct-Tunnel-Packets-Lost" + case RADIUSAttributeTypeNASPortId: + s = "NAS-Port-Id" + case RADIUSAttributeTypeFramedPool: + s = "Framed-Pool" + case RADIUSAttributeTypeTunnelClientAuthID: + s = "Tunnel-Client-Auth-ID" + case RADIUSAttributeTypeTunnelServerAuthID: + s = "Tunnel-Server-Auth-ID" + default: + s = fmt.Sprintf("Unknown(%d)", t) + } + return +} + +// Len returns the length of a RADIUS packet. +func (radius *RADIUS) Len() (int, error) { + n := radiusMinimumRecordSizeInBytes + for _, v := range radius.Attributes { + alen, err := attributeValueLength(v.Value) + if err != nil { + return 0, err + } + n += int(alen) + 2 // Added Type and Length + } + return n, nil +} + +// LayerType returns LayerTypeRADIUS. +func (radius *RADIUS) LayerType() gopacket.LayerType { + return LayerTypeRADIUS +} + +// DecodeFromBytes decodes the given bytes into this layer. +func (radius *RADIUS) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) error { + if len(data) > radiusMaximumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS length %d too big", len(data)) + } + + if len(data) < radiusMinimumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS length %d too short", len(data)) + } + + radius.BaseLayer = BaseLayer{Contents: data} + + radius.Code = RADIUSCode(data[0]) + radius.Identifier = RADIUSIdentifier(data[1]) + radius.Length = RADIUSLength(binary.BigEndian.Uint16(data[2:4])) + + if int(radius.Length) > radiusMaximumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS length %d too big", radius.Length) + } + + if int(radius.Length) < radiusMinimumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS length %d too short", radius.Length) + } + + // RFC 2865 3. Packet Format + // `If the packet is shorter than the Length field indicates, it MUST be silently discarded.` + if int(radius.Length) > len(data) { + df.SetTruncated() + return fmt.Errorf("RADIUS length %d too big", radius.Length) + } + + // RFC 2865 3. Packet Format + // `Octets outside the range of the Length field MUST be treated as padding and ignored on reception.` + if int(radius.Length) < len(data) { + df.SetTruncated() + data = data[:radius.Length] + } + + copy(radius.Authenticator[:], data[4:20]) + + if len(data) == radiusMinimumRecordSizeInBytes { + return nil + } + + pos := radiusMinimumRecordSizeInBytes + for { + if len(data) == pos { + break + } + + if len(data[pos:]) < radiusAttributesMinimumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS attributes length %d too short", len(data[pos:])) + } + + attr := RADIUSAttribute{} + attr.Type = RADIUSAttributeType(data[pos]) + attr.Length = RADIUSAttributeLength(data[pos+1]) + + if int(attr.Length) > len(data[pos:]) { + df.SetTruncated() + return fmt.Errorf("RADIUS attributes length %d too big", attr.Length) + } + + if int(attr.Length) < radiusAttributesMinimumRecordSizeInBytes { + df.SetTruncated() + return fmt.Errorf("RADIUS attributes length %d too short", attr.Length) + } + + if int(attr.Length) > radiusAttributesMinimumRecordSizeInBytes { + attr.Value = make([]byte, attr.Length-2) + copy(attr.Value[:], data[pos+2:pos+int(attr.Length)]) + radius.Attributes = append(radius.Attributes, attr) + } + + pos += int(attr.Length) + } + + for _, v := range radius.Attributes { + if v.Type == RADIUSAttributeTypeEAPMessage { + radius.BaseLayer.Payload = append(radius.BaseLayer.Payload, v.Value...) + } + } + + return nil +} + +// SerializeTo writes the serialized form of this layer into the +// SerializationBuffer, implementing gopacket.SerializableLayer. +// See the docs for gopacket.SerializableLayer for more info. +func (radius *RADIUS) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { + plen, err := radius.Len() + if err != nil { + return err + } + + if opts.FixLengths { + radius.Length = RADIUSLength(plen) + } + + data, err := b.PrependBytes(plen) + if err != nil { + return err + } + + data[0] = byte(radius.Code) + data[1] = byte(radius.Identifier) + binary.BigEndian.PutUint16(data[2:], uint16(radius.Length)) + copy(data[4:20], radius.Authenticator[:]) + + pos := radiusMinimumRecordSizeInBytes + for _, v := range radius.Attributes { + if opts.FixLengths { + v.Length, err = attributeValueLength(v.Value) + if err != nil { + return err + } + } + + data[pos] = byte(v.Type) + data[pos+1] = byte(v.Length) + copy(data[pos+2:], v.Value[:]) + + pos += len(v.Value) + 2 // Added Type and Length + } + + return nil +} + +// CanDecode returns the set of layer types that this DecodingLayer can decode. +func (radius *RADIUS) CanDecode() gopacket.LayerClass { + return LayerTypeRADIUS +} + +// NextLayerType returns the layer type contained by this DecodingLayer. +func (radius *RADIUS) NextLayerType() gopacket.LayerType { + if len(radius.BaseLayer.Payload) > 0 { + return LayerTypeEAP + } else { + return gopacket.LayerTypeZero + } +} + +// Payload returns the EAP Type-Data for EAP-Message attributes. +func (radius *RADIUS) Payload() []byte { + return radius.BaseLayer.Payload +} + +func decodeRADIUS(data []byte, p gopacket.PacketBuilder) error { + radius := &RADIUS{} + err := radius.DecodeFromBytes(data, p) + if err != nil { + return err + } + p.AddLayer(radius) + p.SetApplicationLayer(radius) + next := radius.NextLayerType() + if next == gopacket.LayerTypeZero { + return nil + } + return p.NextDecoder(next) +} + +func attributeValueLength(v []byte) (RADIUSAttributeLength, error) { + n := len(v) + if n > 255 { + return 0, fmt.Errorf("RADIUS attribute value length %d too long", n) + } else { + return RADIUSAttributeLength(n), nil + } +} diff --git a/vendor/github.com/google/gopacket/layers/sip.go b/vendor/github.com/google/gopacket/layers/sip.go index cace7a8a0..70afdb5c0 100644 --- a/vendor/github.com/google/gopacket/layers/sip.go +++ b/vendor/github.com/google/gopacket/layers/sip.go @@ -469,11 +469,11 @@ func (s *SIP) GetHeader(headerName string) []string { headerName = strings.ToLower(headerName) h := make([]string, 0) if _, ok := s.Headers[headerName]; ok { - if len(s.Headers[headerName]) > 0 { - return s.Headers[headerName] - } else if len(s.Headers[compactSipHeadersCorrespondance[headerName]]) > 0 { - return s.Headers[compactSipHeadersCorrespondance[headerName]] - } + return s.Headers[headerName] + } + compactHeader := compactSipHeadersCorrespondance[headerName] + if _, ok := s.Headers[compactHeader]; ok { + return s.Headers[compactHeader] } return h } @@ -482,13 +482,9 @@ func (s *SIP) GetHeader(headerName string) []string { // the specified name. If the current SIP packet has multiple // headers with the same name, it returns the first. func (s *SIP) GetFirstHeader(headerName string) string { - headerName = strings.ToLower(headerName) - if _, ok := s.Headers[headerName]; ok { - if len(s.Headers[headerName]) > 0 { - return s.Headers[headerName][0] - } else if len(s.Headers[compactSipHeadersCorrespondance[headerName]]) > 0 { - return s.Headers[compactSipHeadersCorrespondance[headerName]][0] - } + headers := s.GetHeader(headerName) + if len(headers) > 0 { + return headers[0] } return "" } diff --git a/vendor/github.com/google/gopacket/layers/tls.go b/vendor/github.com/google/gopacket/layers/tls.go index 7a0aef123..5a155d455 100644 --- a/vendor/github.com/google/gopacket/layers/tls.go +++ b/vendor/github.com/google/gopacket/layers/tls.go @@ -211,23 +211,33 @@ func (t *TLS) Payload() []byte { // SerializeTo writes the serialized form of this layer into the // SerializationBuffer, implementing gopacket.SerializableLayer. func (t *TLS) SerializeTo(b gopacket.SerializeBuffer, opts gopacket.SerializeOptions) error { - if !opts.FixLengths { - return errors.New("serialization of packets without fixing lengths has not been implemented yet") - } totalLength := 0 - for range t.ChangeCipherSpec { + for _, record := range t.ChangeCipherSpec { + if opts.FixLengths { + record.Length = 1 + } totalLength += 5 + 1 // length of header + record } for range t.Handshake { totalLength += 5 + // TODO } for _, record := range t.AppData { + if opts.FixLengths { + record.Length = uint16(len(record.Payload)) + } totalLength += 5 + len(record.Payload) } for _, record := range t.Alert { if len(record.EncryptedMsg) == 0 { + if opts.FixLengths { + record.Length = 2 + } totalLength += 5 + 2 } else { + if opts.FixLengths { + record.Length = uint16(len(record.EncryptedMsg)) + } totalLength += 5 + len(record.EncryptedMsg) } } diff --git a/vendor/github.com/hashicorp/golang-lru/.golangci.yml b/vendor/github.com/hashicorp/golang-lru/.golangci.yml new file mode 100644 index 000000000..49202fc41 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/.golangci.yml @@ -0,0 +1,30 @@ +linters: + enable: + - megacheck + - revive + - govet + - unconvert + - megacheck + - gas + - gocyclo + - dupl + - misspell + - unparam + - unused + - typecheck + - ineffassign + - stylecheck + - exportloopref + - gocritic + - nakedret + - gosimple + - prealloc + fast: false + disable-all: true + +issues: + exclude-rules: + - path: _test\.go + linters: + - dupl + exclude-use-default: false diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go index e474cd075..15fcad030 100644 --- a/vendor/github.com/hashicorp/golang-lru/2q.go +++ b/vendor/github.com/hashicorp/golang-lru/2q.go @@ -44,7 +44,7 @@ func New2Q(size int) (*TwoQueueCache, error) { // New2QParams creates a new TwoQueueCache using the provided // parameter values. -func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { +func New2QParams(size int, recentRatio, ghostRatio float64) (*TwoQueueCache, error) { if size <= 0 { return nil, fmt.Errorf("invalid size") } @@ -138,7 +138,6 @@ func (c *TwoQueueCache) Add(key, value interface{}) { // Add to the recently seen list c.ensureSpace(false) c.recent.Add(key, value) - return } // ensureSpace is used to ensure we have space in the cache diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE index be2cc4dfb..0e5d580e0 100644 --- a/vendor/github.com/hashicorp/golang-lru/LICENSE +++ b/vendor/github.com/hashicorp/golang-lru/LICENSE @@ -1,3 +1,5 @@ +Copyright (c) 2014 HashiCorp, Inc. + Mozilla Public License, version 2.0 1. Definitions diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md index 33e58cfaf..03bcfb5b7 100644 --- a/vendor/github.com/hashicorp/golang-lru/README.md +++ b/vendor/github.com/hashicorp/golang-lru/README.md @@ -1,25 +1,7 @@ golang-lru ========== -This provides the `lru` package which implements a fixed-size -thread safe LRU cache. It is based on the cache in Groupcache. - -Documentation -============= - -Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru) - -Example -======= - -Using the LRU is very simple: - -```go -l, _ := New(128) -for i := 0; i < 256; i++ { - l.Add(i, nil) -} -if l.Len() != 128 { - panic(fmt.Sprintf("bad len: %v", l.Len())) -} -``` +Please upgrade to github.com/hashicorp/golang-lru/v2 for all new code as v1 will +not be updated anymore. The v2 version supports generics and is faster; old code +can specify a specific tag, e.g. github.com/hashicorp/golang-lru/v1.0.2 for +backwards compatibility. diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go index 555225a21..e396f8428 100644 --- a/vendor/github.com/hashicorp/golang-lru/arc.go +++ b/vendor/github.com/hashicorp/golang-lru/arc.go @@ -173,7 +173,6 @@ func (c *ARCCache) Add(key, value interface{}) { // Add to the recently seen list c.t1.Add(key, value) - return } // replace is used to adaptively evict from either T1 or T2 diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go index c8d9b0a23..895d8e3ea 100644 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/lru.go @@ -6,10 +6,17 @@ import ( "github.com/hashicorp/golang-lru/simplelru" ) +const ( + // DefaultEvictedBufferSize defines the default buffer size to store evicted key/val + DefaultEvictedBufferSize = 16 +) + // Cache is a thread-safe fixed size LRU cache. type Cache struct { - lru simplelru.LRUCache - lock sync.RWMutex + lru *simplelru.LRU + evictedKeys, evictedVals []interface{} + onEvictedCB func(k, v interface{}) + lock sync.RWMutex } // New creates an LRU of the given size. @@ -19,92 +26,206 @@ func New(size int) (*Cache, error) { // NewWithEvict constructs a fixed size cache with the given eviction // callback. -func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { - lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) - if err != nil { - return nil, err +func NewWithEvict(size int, onEvicted func(key, value interface{})) (c *Cache, err error) { + // create a cache with default settings + c = &Cache{ + onEvictedCB: onEvicted, } - c := &Cache{ - lru: lru, + if onEvicted != nil { + c.initEvictBuffers() + onEvicted = c.onEvicted } - return c, nil + c.lru, err = simplelru.NewLRU(size, onEvicted) + return +} + +func (c *Cache) initEvictBuffers() { + c.evictedKeys = make([]interface{}, 0, DefaultEvictedBufferSize) + c.evictedVals = make([]interface{}, 0, DefaultEvictedBufferSize) +} + +// onEvicted save evicted key/val and sent in externally registered callback +// outside of critical section +func (c *Cache) onEvicted(k, v interface{}) { + c.evictedKeys = append(c.evictedKeys, k) + c.evictedVals = append(c.evictedVals, v) } // Purge is used to completely clear the cache. func (c *Cache) Purge() { + var ks, vs []interface{} c.lock.Lock() c.lru.Purge() + if c.onEvictedCB != nil && len(c.evictedKeys) > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } c.lock.Unlock() + // invoke callback outside of critical section + if c.onEvictedCB != nil { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } } -// Add adds a value to the cache. Returns true if an eviction occurred. +// Add adds a value to the cache. Returns true if an eviction occurred. func (c *Cache) Add(key, value interface{}) (evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - return c.lru.Add(key, value) + evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } + return } // Get looks up a key's value from the cache. func (c *Cache) Get(key interface{}) (value interface{}, ok bool) { c.lock.Lock() - defer c.lock.Unlock() - return c.lru.Get(key) + value, ok = c.lru.Get(key) + c.lock.Unlock() + return value, ok } // Contains checks if a key is in the cache, without updating the // recent-ness or deleting it for being stale. func (c *Cache) Contains(key interface{}) bool { c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Contains(key) + containKey := c.lru.Contains(key) + c.lock.RUnlock() + return containKey } // Peek returns the key value (or undefined if not found) without updating // the "recently used"-ness of the key. func (c *Cache) Peek(key interface{}) (value interface{}, ok bool) { c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Peek(key) + value, ok = c.lru.Peek(key) + c.lock.RUnlock() + return value, ok } -// ContainsOrAdd checks if a key is in the cache without updating the -// recent-ness or deleting it for being stale, and if not, adds the value. +// ContainsOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. // Returns whether found and whether an eviction occurred. func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evicted bool) { + var k, v interface{} c.lock.Lock() - defer c.lock.Unlock() - if c.lru.Contains(key) { + c.lock.Unlock() return true, false } evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } return false, evicted } +// PeekOrAdd checks if a key is in the cache without updating the +// recent-ness or deleting it for being stale, and if not, adds the value. +// Returns whether found and whether an eviction occurred. +func (c *Cache) PeekOrAdd(key, value interface{}) (previous interface{}, ok, evicted bool) { + var k, v interface{} + c.lock.Lock() + previous, ok = c.lru.Peek(key) + if ok { + c.lock.Unlock() + return previous, true, false + } + evicted = c.lru.Add(key, value) + if c.onEvictedCB != nil && evicted { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted { + c.onEvictedCB(k, v) + } + return nil, false, evicted +} + // Remove removes the provided key from the cache. -func (c *Cache) Remove(key interface{}) { +func (c *Cache) Remove(key interface{}) (present bool) { + var k, v interface{} c.lock.Lock() - c.lru.Remove(key) + present = c.lru.Remove(key) + if c.onEvictedCB != nil && present { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && present { + c.onEvictedCB(k, v) + } + return +} + +// Resize changes the cache size. +func (c *Cache) Resize(size int) (evicted int) { + var ks, vs []interface{} + c.lock.Lock() + evicted = c.lru.Resize(size) + if c.onEvictedCB != nil && evicted > 0 { + ks, vs = c.evictedKeys, c.evictedVals + c.initEvictBuffers() + } + c.lock.Unlock() + if c.onEvictedCB != nil && evicted > 0 { + for i := 0; i < len(ks); i++ { + c.onEvictedCB(ks[i], vs[i]) + } + } + return evicted } // RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { +func (c *Cache) RemoveOldest() (key, value interface{}, ok bool) { + var k, v interface{} c.lock.Lock() - c.lru.RemoveOldest() + key, value, ok = c.lru.RemoveOldest() + if c.onEvictedCB != nil && ok { + k, v = c.evictedKeys[0], c.evictedVals[0] + c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] + } c.lock.Unlock() + if c.onEvictedCB != nil && ok { + c.onEvictedCB(k, v) + } + return +} + +// GetOldest returns the oldest entry +func (c *Cache) GetOldest() (key, value interface{}, ok bool) { + c.lock.RLock() + key, value, ok = c.lru.GetOldest() + c.lock.RUnlock() + return } // Keys returns a slice of the keys in the cache, from oldest to newest. func (c *Cache) Keys() []interface{} { c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Keys() + keys := c.lru.Keys() + c.lock.RUnlock() + return keys } // Len returns the number of items in the cache. func (c *Cache) Len() int { c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Len() + length := c.lru.Len() + c.lock.RUnlock() + return length } diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go index 5673773b2..9233583c9 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go @@ -25,7 +25,7 @@ type entry struct { // NewLRU constructs an LRU of the given size func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { if size <= 0 { - return nil, errors.New("Must provide a positive size") + return nil, errors.New("must provide a positive size") } c := &LRU{ size: size, @@ -73,6 +73,9 @@ func (c *LRU) Add(key, value interface{}) (evicted bool) { func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { if ent, ok := c.items[key]; ok { c.evictList.MoveToFront(ent) + if ent.Value.(*entry) == nil { + return nil, false + } return ent.Value.(*entry).value, true } return @@ -106,7 +109,7 @@ func (c *LRU) Remove(key interface{}) (present bool) { } // RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) RemoveOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { c.removeElement(ent) @@ -117,7 +120,7 @@ func (c *LRU) RemoveOldest() (key interface{}, value interface{}, ok bool) { } // GetOldest returns the oldest entry -func (c *LRU) GetOldest() (key interface{}, value interface{}, ok bool) { +func (c *LRU) GetOldest() (key, value interface{}, ok bool) { ent := c.evictList.Back() if ent != nil { kv := ent.Value.(*entry) @@ -142,6 +145,19 @@ func (c *LRU) Len() int { return c.evictList.Len() } +// Resize changes the cache size. +func (c *LRU) Resize(size int) (evicted int) { + diff := c.Len() - size + if diff < 0 { + diff = 0 + } + for i := 0; i < diff; i++ { + c.removeOldest() + } + c.size = size + return diff +} + // removeOldest removes the oldest item from the cache. func (c *LRU) removeOldest() { ent := c.evictList.Back() diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go index 744cac01c..cb7f8caf0 100644 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go +++ b/vendor/github.com/hashicorp/golang-lru/simplelru/lru_interface.go @@ -1,37 +1,40 @@ +// Package simplelru provides simple LRU implementation based on build-in container/list. package simplelru - // LRUCache is the interface for simple LRU cache. type LRUCache interface { - // Adds a value to the cache, returns true if an eviction occurred and - // updates the "recently used"-ness of the key. - Add(key, value interface{}) bool + // Adds a value to the cache, returns true if an eviction occurred and + // updates the "recently used"-ness of the key. + Add(key, value interface{}) bool + + // Returns key's value from the cache and + // updates the "recently used"-ness of the key. #value, isFound + Get(key interface{}) (value interface{}, ok bool) - // Returns key's value from the cache and - // updates the "recently used"-ness of the key. #value, isFound - Get(key interface{}) (value interface{}, ok bool) + // Checks if a key exists in cache without updating the recent-ness. + Contains(key interface{}) (ok bool) - // Check if a key exsists in cache without updating the recent-ness. - Contains(key interface{}) (ok bool) + // Returns key's value without updating the "recently used"-ness of the key. + Peek(key interface{}) (value interface{}, ok bool) - // Returns key's value without updating the "recently used"-ness of the key. - Peek(key interface{}) (value interface{}, ok bool) + // Removes a key from the cache. + Remove(key interface{}) bool - // Removes a key from the cache. - Remove(key interface{}) bool + // Removes the oldest entry from cache. + RemoveOldest() (interface{}, interface{}, bool) - // Removes the oldest entry from cache. - RemoveOldest() (interface{}, interface{}, bool) + // Returns the oldest entry from the cache. #key, value, isFound + GetOldest() (interface{}, interface{}, bool) - // Returns the oldest entry from the cache. #key, value, isFound - GetOldest() (interface{}, interface{}, bool) + // Returns a slice of the keys in the cache, from oldest to newest. + Keys() []interface{} - // Returns a slice of the keys in the cache, from oldest to newest. - Keys() []interface{} + // Returns the number of items in the cache. + Len() int - // Returns the number of items in the cache. - Len() int + // Clears all cache entries. + Purge() - // Clear all cache entries - Purge() + // Resizes cache, returning number evicted + Resize(int) int } diff --git a/vendor/github.com/hashicorp/golang-lru/testing.go b/vendor/github.com/hashicorp/golang-lru/testing.go new file mode 100644 index 000000000..492760782 --- /dev/null +++ b/vendor/github.com/hashicorp/golang-lru/testing.go @@ -0,0 +1,16 @@ +package lru + +import ( + "crypto/rand" + "math" + "math/big" + "testing" +) + +func getRand(tb testing.TB) int64 { + out, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) + if err != nil { + tb.Fatal(err) + } + return out.Int64() +} diff --git a/vendor/github.com/klauspost/compress/README.md b/vendor/github.com/klauspost/compress/README.md index f710a34ec..4002a16a6 100644 --- a/vendor/github.com/klauspost/compress/README.md +++ b/vendor/github.com/klauspost/compress/README.md @@ -16,6 +16,12 @@ This package provides various compression algorithms. # changelog +* June 13, 2023 - [v1.16.6](https://github.com/klauspost/compress/releases/tag/v1.16.6) + * zstd: correctly ignore WithEncoderPadding(1) by @ianlancetaylor in https://github.com/klauspost/compress/pull/806 + * zstd: Add amd64 match length assembly https://github.com/klauspost/compress/pull/824 + * gzhttp: Handle informational headers by @rtribotte in https://github.com/klauspost/compress/pull/815 + * s2: Improve Better compression slightly https://github.com/klauspost/compress/pull/663 + * Apr 16, 2023 - [v1.16.5](https://github.com/klauspost/compress/releases/tag/v1.16.5) * zstd: readByte needs to use io.ReadFull by @jnoxon in https://github.com/klauspost/compress/pull/802 * gzip: Fix WriterTo after initial read https://github.com/klauspost/compress/pull/804 diff --git a/vendor/github.com/klauspost/compress/SECURITY.md b/vendor/github.com/klauspost/compress/SECURITY.md index 23a43387b..ca6685e2b 100644 --- a/vendor/github.com/klauspost/compress/SECURITY.md +++ b/vendor/github.com/klauspost/compress/SECURITY.md @@ -20,6 +20,6 @@ Vulnerabilities resulting from compiler/assembler errors should be reported upst If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. -Please disclose it at [security advisory](https://github.com/klaupost/compress/security/advisories/new). If possible please provide a minimal reproducer. If the issue only applies to a single platform, it would be helpful to provide access to that. +Please disclose it at [security advisory](https://github.com/klauspost/compress/security/advisories/new). If possible please provide a minimal reproducer. If the issue only applies to a single platform, it would be helpful to provide access to that. This project is maintained by a team of volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. diff --git a/vendor/github.com/klauspost/compress/zstd/enc_base.go b/vendor/github.com/klauspost/compress/zstd/enc_base.go index e008b9929..5ca46038a 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_base.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_base.go @@ -144,6 +144,7 @@ func (e *fastBase) resetBase(d *dict, singleBlock bool) { } else { e.crc.Reset() } + e.blk.dictLitEnc = nil if d != nil { low := e.lowMem if singleBlock { diff --git a/vendor/github.com/klauspost/compress/zstd/enc_dfast.go b/vendor/github.com/klauspost/compress/zstd/enc_dfast.go index 7d425109a..a154c18f7 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_dfast.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_dfast.go @@ -1084,7 +1084,7 @@ func (e *doubleFastEncoderDict) Reset(d *dict, singleBlock bool) { } } e.lastDictID = d.id - e.allDirty = true + allDirty = true } // Reset table to initial state e.cur = e.maxMatchOff diff --git a/vendor/github.com/klauspost/compress/zstd/enc_fast.go b/vendor/github.com/klauspost/compress/zstd/enc_fast.go index cbc626eec..f45a3da7d 100644 --- a/vendor/github.com/klauspost/compress/zstd/enc_fast.go +++ b/vendor/github.com/klauspost/compress/zstd/enc_fast.go @@ -829,13 +829,12 @@ func (e *fastEncoderDict) Reset(d *dict, singleBlock bool) { } if true { end := e.maxMatchOff + int32(len(d.content)) - 8 - for i := e.maxMatchOff; i < end; i += 3 { + for i := e.maxMatchOff; i < end; i += 2 { const hashLog = tableBits cv := load6432(d.content, i-e.maxMatchOff) - nextHash := hashLen(cv, hashLog, tableFastHashLen) // 0 -> 5 - nextHash1 := hashLen(cv>>8, hashLog, tableFastHashLen) // 1 -> 6 - nextHash2 := hashLen(cv>>16, hashLog, tableFastHashLen) // 2 -> 7 + nextHash := hashLen(cv, hashLog, tableFastHashLen) // 0 -> 6 + nextHash1 := hashLen(cv>>8, hashLog, tableFastHashLen) // 1 -> 7 e.dictTable[nextHash] = tableEntry{ val: uint32(cv), offset: i, @@ -844,10 +843,6 @@ func (e *fastEncoderDict) Reset(d *dict, singleBlock bool) { val: uint32(cv >> 8), offset: i + 1, } - e.dictTable[nextHash2] = tableEntry{ - val: uint32(cv >> 16), - offset: i + 2, - } } } e.lastDictID = d.id diff --git a/vendor/github.com/libp2p/go-reuseport/LICENSE b/vendor/github.com/libp2p/go-reuseport/LICENSE new file mode 100644 index 000000000..0d760cbb4 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2013 Conformal Systems LLC. + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/libp2p/go-reuseport/README.md b/vendor/github.com/libp2p/go-reuseport/README.md new file mode 100644 index 000000000..d511adebc --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/README.md @@ -0,0 +1,48 @@ +# go-reuseport + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](https://protocol.ai) +[![GoDoc](https://godoc.org/github.com/libp2p/go-reuseport?status.svg)](https://godoc.org/github.com/libp2p/go-reuseport) +[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](https://libp2p.io/) +[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](https://webchat.freenode.net/?channels=%23libp2p) +[![codecov](https://codecov.io/gh/libp2p/go-reuseport/branch/master/graph/badge.svg)](https://codecov.io/gh/libp2p/go-reuseport) +[![Travis CI](https://travis-ci.org/libp2p/go-reuseport.svg?branch=master)](https://travis-ci.org/libp2p/go-reuseport) +[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io) + +This package enables listening and dialing from _the same_ TCP or UDP port. +This means that the following sockopts may be set: + +``` +SO_REUSEADDR +SO_REUSEPORT +``` + +This is a simple package to help with address reuse. This is particularly +important when attempting to do TCP NAT holepunching, which requires a process +to both Listen and Dial on the same TCP port. This package provides some +utilities around enabling this behaviour on various OS. + +## Examples + + +```Go +// listen on the same port. oh yeah. +l1, _ := reuse.Listen("tcp", "127.0.0.1:1234") +l2, _ := reuse.Listen("tcp", "127.0.0.1:1234") +``` + +```Go +// dial from the same port. oh yeah. +l1, _ := reuse.Listen("tcp", "127.0.0.1:1234") +l2, _ := reuse.Listen("tcp", "127.0.0.1:1235") +c, _ := reuse.Dial("tcp", "127.0.0.1:1234", "127.0.0.1:1235") +``` + +**Note: cant dial self because tcp/ip stacks use 4-tuples to identify connections, and doing so would clash.** + +## Tested + +Tested on `darwin`, `linux`, and `windows`. + +--- + +The last gx published version of this module was: 0.2.2: Qme8kdM7thoCqLqd7GYCRqipoZJS64rhJo5MBcTpyWfsL9 diff --git a/vendor/github.com/libp2p/go-reuseport/addr.go b/vendor/github.com/libp2p/go-reuseport/addr.go new file mode 100644 index 000000000..cfffc7c8c --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/addr.go @@ -0,0 +1,20 @@ +package reuseport + +import ( + "net" +) + +func ResolveAddr(network, address string) (net.Addr, error) { + switch network { + default: + return nil, net.UnknownNetworkError(network) + case "ip", "ip4", "ip6": + return net.ResolveIPAddr(network, address) + case "tcp", "tcp4", "tcp6": + return net.ResolveTCPAddr(network, address) + case "udp", "udp4", "udp6": + return net.ResolveUDPAddr(network, address) + case "unix", "unixgram", "unixpacket": + return net.ResolveUnixAddr(network, address) + } +} diff --git a/vendor/github.com/libp2p/go-reuseport/codecov.yml b/vendor/github.com/libp2p/go-reuseport/codecov.yml new file mode 100644 index 000000000..5f88a9ea2 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/codecov.yml @@ -0,0 +1,3 @@ +coverage: + range: "50...100" +comment: off diff --git a/vendor/github.com/libp2p/go-reuseport/control_freebsd.go b/vendor/github.com/libp2p/go-reuseport/control_freebsd.go new file mode 100644 index 000000000..cec1b11aa --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/control_freebsd.go @@ -0,0 +1,27 @@ +//go:build freebsd + +package reuseport + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +func Control(network, address string, c syscall.RawConn) (err error) { + controlErr := c.Control(func(fd uintptr) { + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + if err != nil { + return + } + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1) + if err != nil { + return + } + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT_LB, 1) + }) + if controlErr != nil { + err = controlErr + } + return +} diff --git a/vendor/github.com/libp2p/go-reuseport/control_plan9.go b/vendor/github.com/libp2p/go-reuseport/control_plan9.go new file mode 100644 index 000000000..a8f7f3456 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/control_plan9.go @@ -0,0 +1,9 @@ +package reuseport + +import ( + "syscall" +) + +func Control(network, address string, c syscall.RawConn) error { + return nil +} diff --git a/vendor/github.com/libp2p/go-reuseport/control_unix.go b/vendor/github.com/libp2p/go-reuseport/control_unix.go new file mode 100644 index 000000000..e80688b5e --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/control_unix.go @@ -0,0 +1,23 @@ +//go:build !plan9 && !windows && !wasm && !freebsd + +package reuseport + +import ( + "syscall" + + "golang.org/x/sys/unix" +) + +func Control(network, address string, c syscall.RawConn) (err error) { + controlErr := c.Control(func(fd uintptr) { + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) + if err != nil { + return + } + err = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEPORT, 1) + }) + if controlErr != nil { + err = controlErr + } + return +} diff --git a/vendor/github.com/libp2p/go-reuseport/control_wasm.go b/vendor/github.com/libp2p/go-reuseport/control_wasm.go new file mode 100644 index 000000000..8b22fade5 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/control_wasm.go @@ -0,0 +1,11 @@ +//go:build wasm + +package reuseport + +import ( + "syscall" +) + +func Control(network, address string, c syscall.RawConn) error { + return nil +} diff --git a/vendor/github.com/libp2p/go-reuseport/control_windows.go b/vendor/github.com/libp2p/go-reuseport/control_windows.go new file mode 100644 index 000000000..c45e43f4b --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/control_windows.go @@ -0,0 +1,17 @@ +package reuseport + +import ( + "syscall" + + "golang.org/x/sys/windows" +) + +func Control(network, address string, c syscall.RawConn) (err error) { + controlErr := c.Control(func(fd uintptr) { + err = windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_REUSEADDR, 1) + }) + if controlErr != nil { + err = controlErr + } + return +} diff --git a/vendor/github.com/libp2p/go-reuseport/interface.go b/vendor/github.com/libp2p/go-reuseport/interface.go new file mode 100644 index 000000000..b864da8c5 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/interface.go @@ -0,0 +1,72 @@ +// Package reuseport provides Listen and Dial functions that set socket +// options in order to be able to reuse ports. You should only use this +// package if you know what SO_REUSEADDR and SO_REUSEPORT are. +// +// For example: +// +// // listen on the same port. oh yeah. +// l1, _ := reuse.Listen("tcp", "127.0.0.1:1234") +// l2, _ := reuse.Listen("tcp", "127.0.0.1:1234") +// +// // dial from the same port. oh yeah. +// l1, _ := reuse.Listen("tcp", "127.0.0.1:1234") +// l2, _ := reuse.Listen("tcp", "127.0.0.1:1235") +// c, _ := reuse.Dial("tcp", "127.0.0.1:1234", "127.0.0.1:1235") +// +// Note: cant dial self because tcp/ip stacks use 4-tuples to identify connections, +// and doing so would clash. +package reuseport + +import ( + "context" + "fmt" + "net" + "time" +) + +// Available returns whether or not SO_REUSEPORT or equivalent behaviour is +// available in the OS. +func Available() bool { + return true +} + +var listenConfig = net.ListenConfig{ + Control: Control, +} + +// Listen listens at the given network and address. see net.Listen +// Returns a net.Listener created from a file discriptor for a socket +// with SO_REUSEPORT and SO_REUSEADDR option set. +func Listen(network, address string) (net.Listener, error) { + return listenConfig.Listen(context.Background(), network, address) +} + +// ListenPacket listens at the given network and address. see net.ListenPacket +// Returns a net.Listener created from a file discriptor for a socket +// with SO_REUSEPORT and SO_REUSEADDR option set. +func ListenPacket(network, address string) (net.PacketConn, error) { + return listenConfig.ListenPacket(context.Background(), network, address) +} + +// Dial dials the given network and address. see net.Dial +// Returns a net.Conn created from a file descriptor for a socket +// with SO_REUSEPORT and SO_REUSEADDR option set. +func Dial(network, laddr, raddr string) (net.Conn, error) { + return DialTimeout(network, laddr, raddr, time.Duration(0)) +} + +// Dial dials the given network and address, with the given timeout. see +// net.DialTimeout Returns a net.Conn created from a file descriptor for +// a socket with SO_REUSEPORT and SO_REUSEADDR option set. +func DialTimeout(network, laddr, raddr string, timeout time.Duration) (net.Conn, error) { + nla, err := ResolveAddr(network, laddr) + if err != nil { + return nil, fmt.Errorf("failed to resolve local addr: %w", err) + } + d := net.Dialer{ + Control: Control, + LocalAddr: nla, + Timeout: timeout, + } + return d.Dial(network, raddr) +} diff --git a/vendor/github.com/libp2p/go-reuseport/version.json b/vendor/github.com/libp2p/go-reuseport/version.json new file mode 100644 index 000000000..372b6eab3 --- /dev/null +++ b/vendor/github.com/libp2p/go-reuseport/version.json @@ -0,0 +1,3 @@ +{ + "version": "v0.4.0" +} diff --git a/vendor/github.com/mroth/weightedrand/README.md b/vendor/github.com/mroth/weightedrand/README.md index 189eb7a98..7a2e028ae 100644 --- a/vendor/github.com/mroth/weightedrand/README.md +++ b/vendor/github.com/mroth/weightedrand/README.md @@ -3,7 +3,7 @@ [![PkgGoDev](https://pkg.go.dev/badge/github.com/mroth/weightedrand)](https://pkg.go.dev/github.com/mroth/weightedrand) [![CodeFactor](https://www.codefactor.io/repository/github/mroth/weightedrand/badge)](https://www.codefactor.io/repository/github/mroth/weightedrand) [![Build Status](https://github.com/mroth/weightedrand/workflows/test/badge.svg)](https://github.com/mroth/weightedrand/actions) -[![codecov](https://codecov.io/gh/mroth/weightedrand/branch/master/graph/badge.svg)](https://codecov.io/gh/mroth/weightedrand) +[![codecov](https://codecov.io/gh/mroth/weightedrand/branch/main/graph/badge.svg)](https://codecov.io/gh/mroth/weightedrand) > Fast weighted random selection for Go. @@ -73,12 +73,6 @@ right choice! If you are only picking from the same distribution once, `randutil` will be faster. `weightedrand` optimizes for repeated calls at the expense of some initialization time and memory storage. -## Caveats - -Note this library utilizes `math/rand` instead of `crypto/rand`, as it is -optimized for performance, and is not intended to be used for cryptographically -secure requirements. - ## Credits To better understand the algorithm used in this library (as well as the one used diff --git a/vendor/github.com/oschwald/maxminddb-golang/.golangci.toml b/vendor/github.com/oschwald/maxminddb-golang/.golangci.toml new file mode 100644 index 000000000..0950c1c54 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/.golangci.toml @@ -0,0 +1,452 @@ +[run] + deadline = "10m" + tests = true + +[linters] + disable-all = true + enable = [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "containedctx", + "contextcheck", + "depguard", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + # "exhaustive", + "exportloopref", + "forbidigo", + "goconst", + "gocyclo", + "gocritic", + "godot", + "gofumpt", + "gomodguard", + "gosec", + "gosimple", + "govet", + "grouper", + "ineffassign", + "lll", + "makezero", + "maintidx", + "misspell", + "nakedret", + "nilerr", + "noctx", + "nolintlint", + "nosprintfhostport", + "predeclared", + "revive", + "rowserrcheck", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tenv", + "tparallel", + "typecheck", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "vetshadow", + "wastedassign", + ] + +[[linters-settings.depguard.rules.main.deny]] +pkg = "io/ioutil" +desc = "Deprecated. Functions have been moved elsewhere." + +[linters-settings.errcheck] + check-blank = true + # Ignoring Close so that we don't have to have a bunch of + # `defer func() { _ = r.Close() }()` constructs when we + # don't actually care about the error. + ignore = "Close,fmt:.*" + +[linters-settings.errorlint] + errorf = true + asserts = true + comparison = true + +[linters-settings.exhaustive] + default-signifies-exhaustive = true + +[linters-settings.forbidigo] + # Forbid the following identifiers + forbid = [ + "Geoip", # use "GeoIP" + "^geoIP", # use "geoip" + "Maxmind", # use "MaxMind" + "^maxMind", # use "maxmind" + ] + +[linters-settings.gocritic] + enabled-checks = [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTestFuncName", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringsCompare", + "stringConcatSimplify", + "stringXbytes", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "underef", + "unlabelStmt", + "unlambda", + # "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + # Covered by nolintlint + # "whyNoLint" + "wrapperFunc", + "yodaStyleExpr", + ] + +[linters-settings.gofumpt] + extra-rules = true + lang-version = "1.19" + +[linters-settings.gosec] + excludes = [ + # G104 - "Audit errors not checked." We use errcheck for this. + "G104", + + # G304 - "Potential file inclusion via variable" + "G304", + + # G306 - "Expect WriteFile permissions to be 0600 or less". + "G306", + + # Prohibits defer (*os.File).Close, which we allow when reading from file. + "G307", + ] + +[linters-settings.govet] + "enable-all" = true + disable = ["shadow"] + +[linters-settings.lll] + line-length = 120 + tab-width = 4 + +[linters-settings.nolintlint] + allow-leading-space = false + allow-unused = false + allow-no-explanation = ["lll", "misspell"] + require-explanation = true + require-specific = true + +[linters-settings.revive] + ignore-generated-header = true + severity = "warning" + + # [[linters-settings.revive.rules]] + # name = "add-constant" + + # [[linters-settings.revive.rules]] + # name = "argument-limit" + + [[linters-settings.revive.rules]] + name = "atomic" + + [[linters-settings.revive.rules]] + name = "bare-return" + + [[linters-settings.revive.rules]] + name = "blank-imports" + + [[linters-settings.revive.rules]] + name = "bool-literal-in-expr" + + [[linters-settings.revive.rules]] + name = "call-to-gc" + + # [[linters-settings.revive.rules]] + # name = "cognitive-complexity" + + [[linters-settings.revive.rules]] + name = "comment-spacings" + arguments = ["easyjson", "nolint"] + + # [[linters-settings.revive.rules]] + # name = "confusing-naming" + + # [[linters-settings.revive.rules]] + # name = "confusing-results" + + [[linters-settings.revive.rules]] + name = "constant-logical-expr" + + [[linters-settings.revive.rules]] + name = "context-as-argument" + + [[linters-settings.revive.rules]] + name = "context-keys-type" + + # [[linters-settings.revive.rules]] + # name = "cyclomatic" + + [[linters-settings.revive.rules]] + name = "datarace" + + # [[linters-settings.revive.rules]] + # name = "deep-exit" + + [[linters-settings.revive.rules]] + name = "defer" + + [[linters-settings.revive.rules]] + name = "dot-imports" + + [[linters-settings.revive.rules]] + name = "duplicated-imports" + + [[linters-settings.revive.rules]] + name = "early-return" + + [[linters-settings.revive.rules]] + name = "empty-block" + + [[linters-settings.revive.rules]] + name = "empty-lines" + + [[linters-settings.revive.rules]] + name = "errorf" + + [[linters-settings.revive.rules]] + name = "error-naming" + + [[linters-settings.revive.rules]] + name = "error-return" + + [[linters-settings.revive.rules]] + name = "error-strings" + + [[linters-settings.revive.rules]] + name = "exported" + + # [[linters-settings.revive.rules]] + # name = "file-header" + + # [[linters-settings.revive.rules]] + # name = "flag-parameter" + + # [[linters-settings.revive.rules]] + # name = "function-result-limit" + + [[linters-settings.revive.rules]] + name = "get-return" + + [[linters-settings.revive.rules]] + name = "identical-branches" + + [[linters-settings.revive.rules]] + name = "if-return" + + [[linters-settings.revive.rules]] + name = "imports-blacklist" + + [[linters-settings.revive.rules]] + name = "import-shadowing" + + [[linters-settings.revive.rules]] + name = "increment-decrement" + + [[linters-settings.revive.rules]] + name = "indent-error-flow" + + # [[linters-settings.revive.rules]] + # name = "line-length-limit" + + # [[linters-settings.revive.rules]] + # name = "max-public-structs" + + [[linters-settings.revive.rules]] + name = "modifies-parameter" + + [[linters-settings.revive.rules]] + name = "modifies-value-receiver" + + # [[linters-settings.revive.rules]] + # name = "nested-structs" + + [[linters-settings.revive.rules]] + name = "optimize-operands-order" + + [[linters-settings.revive.rules]] + name = "package-comments" + + [[linters-settings.revive.rules]] + name = "range" + + [[linters-settings.revive.rules]] + name = "range-val-address" + + [[linters-settings.revive.rules]] + name = "range-val-in-closure" + + [[linters-settings.revive.rules]] + name = "receiver-naming" + + [[linters-settings.revive.rules]] + name = "redefines-builtin-id" + + [[linters-settings.revive.rules]] + name = "string-of-int" + + [[linters-settings.revive.rules]] + name = "struct-tag" + + [[linters-settings.revive.rules]] + name = "superfluous-else" + + [[linters-settings.revive.rules]] + name = "time-equal" + + [[linters-settings.revive.rules]] + name = "time-naming" + + [[linters-settings.revive.rules]] + name = "unconditional-recursion" + + [[linters-settings.revive.rules]] + name = "unexported-naming" + + [[linters-settings.revive.rules]] + name = "unexported-return" + + # [[linters-settings.revive.rules]] + # name = "unhandled-error" + + [[linters-settings.revive.rules]] + name = "unnecessary-stmt" + + [[linters-settings.revive.rules]] + name = "unreachable-code" + + [[linters-settings.revive.rules]] + name = "unused-parameter" + + [[linters-settings.revive.rules]] + name = "unused-receiver" + + [[linters-settings.revive.rules]] + name = "use-any" + + [[linters-settings.revive.rules]] + name = "useless-break" + + [[linters-settings.revive.rules]] + name = "var-declaration" + + [[linters-settings.revive.rules]] + name = "var-naming" + + [[linters-settings.revive.rules]] + name = "waitgroup-by-value" + +[linters-settings.unparam] + check-exported = true + +[issues] +exclude-use-default = false + +[[issues.exclude-rules]] + linters = [ + "govet" + ] + path = "_test.go" + text = "^fieldalignment" diff --git a/vendor/github.com/oschwald/maxminddb-golang/.travis.yml b/vendor/github.com/oschwald/maxminddb-golang/.travis.yml deleted file mode 100644 index 49c4478b9..000000000 --- a/vendor/github.com/oschwald/maxminddb-golang/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: go - -go: - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - tip - -before_install: - - "if [[ $TRAVIS_GO_VERSION == 1.7 ]]; then go get -v github.com/golang/lint/golint; fi" - -install: - - go get -v -t ./... - -script: - - go test -race -cpu 1,4 -v - - go test -race -v -tags appengine - - "if [[ $TRAVIS_GO_VERSION == 1.7 ]]; then go vet ./...; fi" - - "if [[ $TRAVIS_GO_VERSION == 1.7 ]]; then golint .; fi" - -sudo: false diff --git a/vendor/github.com/oschwald/maxminddb-golang/README.md b/vendor/github.com/oschwald/maxminddb-golang/README.md index cdd6bd1a8..9662888bd 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/README.md +++ b/vendor/github.com/oschwald/maxminddb-golang/README.md @@ -1,8 +1,6 @@ # MaxMind DB Reader for Go # -[![Build Status](https://travis-ci.org/oschwald/maxminddb-golang.png?branch=master)](https://travis-ci.org/oschwald/maxminddb-golang) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/4j2f9oep8nnfrmov/branch/master?svg=true)](https://ci.appveyor.com/project/oschwald/maxminddb-golang/branch/master) -[![GoDoc](https://godoc.org/github.com/oschwald/maxminddb-golang?status.png)](https://godoc.org/github.com/oschwald/maxminddb-golang) +[![GoDoc](https://godoc.org/github.com/oschwald/maxminddb-golang?status.svg)](https://godoc.org/github.com/oschwald/maxminddb-golang) This is a Go reader for the MaxMind DB format. Although this can be used to read [GeoLite2](http://dev.maxmind.com/geoip/geoip2/geolite2/) and diff --git a/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml b/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml deleted file mode 100644 index e2bb9dd23..000000000 --- a/vendor/github.com/oschwald/maxminddb-golang/appveyor.yml +++ /dev/null @@ -1,19 +0,0 @@ -version: "{build}" - -os: Windows Server 2012 R2 - -clone_folder: c:\gopath\src\github.com\oschwald\maxminddb-golang - -environment: - GOPATH: c:\gopath - -install: - - echo %PATH% - - echo %GOPATH% - - git submodule update --init --recursive - - go version - - go env - - go get -v -t ./... - -build_script: - - go test -v ./... diff --git a/vendor/github.com/oschwald/maxminddb-golang/decoder.go b/vendor/github.com/oschwald/maxminddb-golang/decoder.go index 396da7544..dd0f9ba30 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/decoder.go +++ b/vendor/github.com/oschwald/maxminddb-golang/decoder.go @@ -27,20 +27,24 @@ const ( _Uint64 _Uint128 _Slice - _Container - _Marker + // We don't use the next two. They are placeholders. See the spec + // for more details. + _Container //nolint: deadcode, varcheck // above + _Marker //nolint: deadcode, varcheck // above _Bool _Float32 ) const ( - // This is the value used in libmaxminddb + // This is the value used in libmaxminddb. maximumDataStructureDepth = 512 ) func (d *decoder) decode(offset uint, result reflect.Value, depth int) (uint, error) { if depth > maximumDataStructureDepth { - return 0, newInvalidDatabaseError("exceeded maximum data structure depth; database is likely corrupt") + return 0, newInvalidDatabaseError( + "exceeded maximum data structure depth; database is likely corrupt", + ) } typeNum, size, newOffset, err := d.decodeCtrlData(offset) if err != nil { @@ -54,6 +58,36 @@ func (d *decoder) decode(offset uint, result reflect.Value, depth int) (uint, er return d.decodeFromType(typeNum, size, newOffset, result, depth+1) } +func (d *decoder) decodeToDeserializer( + offset uint, + dser deserializer, + depth int, + getNext bool, +) (uint, error) { + if depth > maximumDataStructureDepth { + return 0, newInvalidDatabaseError( + "exceeded maximum data structure depth; database is likely corrupt", + ) + } + skip, err := dser.ShouldSkip(uintptr(offset)) + if err != nil { + return 0, err + } + if skip { + if getNext { + return d.nextValueOffset(offset, 1) + } + return 0, nil + } + + typeNum, size, newOffset, err := d.decodeCtrlData(offset) + if err != nil { + return 0, err + } + + return d.decodeFromTypeToDeserializer(typeNum, size, newOffset, dser, depth+1) +} + func (d *decoder) decodeCtrlData(offset uint) (dataType, uint, uint, error) { newOffset := offset + 1 if offset >= uint(len(d.buffer)) { @@ -75,7 +109,11 @@ func (d *decoder) decodeCtrlData(offset uint) (dataType, uint, uint, error) { return typeNum, size, newOffset, err } -func (d *decoder) sizeFromCtrlByte(ctrlByte byte, offset uint, typeNum dataType) (uint, uint, error) { +func (d *decoder) sizeFromCtrlByte( + ctrlByte byte, + offset uint, + typeNum dataType, +) (uint, uint, error) { size := uint(ctrlByte & 0x1f) if typeNum == _Extended { return size, offset, nil @@ -113,12 +151,12 @@ func (d *decoder) decodeFromType( result reflect.Value, depth int, ) (uint, error) { - result = d.indirect(result) + result = indirect(result) // For these types, size has a special meaning switch dtype { case _Bool: - return d.unmarshalBool(size, offset, result) + return unmarshalBool(size, offset, result) case _Map: return d.unmarshalMap(size, offset, result, depth) case _Pointer: @@ -155,14 +193,77 @@ func (d *decoder) decodeFromType( } } -func (d *decoder) unmarshalBool(size uint, offset uint, result reflect.Value) (uint, error) { - if size > 1 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (bool size of %v)", size) +func (d *decoder) decodeFromTypeToDeserializer( + dtype dataType, + size uint, + offset uint, + dser deserializer, + depth int, +) (uint, error) { + // For these types, size has a special meaning + switch dtype { + case _Bool: + v, offset := decodeBool(size, offset) + return offset, dser.Bool(v) + case _Map: + return d.decodeMapToDeserializer(size, offset, dser, depth) + case _Pointer: + pointer, newOffset, err := d.decodePointer(size, offset) + if err != nil { + return 0, err + } + _, err = d.decodeToDeserializer(pointer, dser, depth, false) + return newOffset, err + case _Slice: + return d.decodeSliceToDeserializer(size, offset, dser, depth) } - value, newOffset, err := d.decodeBool(size, offset) - if err != nil { - return 0, err + + // For the remaining types, size is the byte size + if offset+size > uint(len(d.buffer)) { + return 0, newOffsetError() } + switch dtype { + case _Bytes: + v, offset := d.decodeBytes(size, offset) + return offset, dser.Bytes(v) + case _Float32: + v, offset := d.decodeFloat32(size, offset) + return offset, dser.Float32(v) + case _Float64: + v, offset := d.decodeFloat64(size, offset) + return offset, dser.Float64(v) + case _Int32: + v, offset := d.decodeInt(size, offset) + return offset, dser.Int32(int32(v)) + case _String: + v, offset := d.decodeString(size, offset) + return offset, dser.String(v) + case _Uint16: + v, offset := d.decodeUint(size, offset) + return offset, dser.Uint16(uint16(v)) + case _Uint32: + v, offset := d.decodeUint(size, offset) + return offset, dser.Uint32(uint32(v)) + case _Uint64: + v, offset := d.decodeUint(size, offset) + return offset, dser.Uint64(v) + case _Uint128: + v, offset := d.decodeUint128(size, offset) + return offset, dser.Uint128(v) + default: + return 0, newInvalidDatabaseError("unknown type: %d", dtype) + } +} + +func unmarshalBool(size, offset uint, result reflect.Value) (uint, error) { + if size > 1 { + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (bool size of %v)", + size, + ) + } + value, newOffset := decodeBool(size, offset) + switch result.Kind() { case reflect.Bool: result.SetBool(value) @@ -180,7 +281,7 @@ func (d *decoder) unmarshalBool(size uint, offset uint, result reflect.Value) (u // heavily based on encoding/json as my original version had a subtle // bug. This method should be considered to be licensed under // https://golang.org/LICENSE -func (d *decoder) indirect(result reflect.Value) reflect.Value { +func indirect(result reflect.Value) reflect.Value { for { // Load value from interface, but only if the result will be // usefully addressable. @@ -199,6 +300,7 @@ func (d *decoder) indirect(result reflect.Value) reflect.Value { if result.IsNil() { result.Set(reflect.New(result.Type().Elem())) } + result = result.Elem() } return result @@ -206,11 +308,9 @@ func (d *decoder) indirect(result reflect.Value) reflect.Value { var sliceType = reflect.TypeOf([]byte{}) -func (d *decoder) unmarshalBytes(size uint, offset uint, result reflect.Value) (uint, error) { - value, newOffset, err := d.decodeBytes(size, offset) - if err != nil { - return 0, err - } +func (d *decoder) unmarshalBytes(size, offset uint, result reflect.Value) (uint, error) { + value, newOffset := d.decodeBytes(size, offset) + switch result.Kind() { case reflect.Slice: if result.Type() == sliceType { @@ -226,14 +326,14 @@ func (d *decoder) unmarshalBytes(size uint, offset uint, result reflect.Value) ( return newOffset, newUnmarshalTypeError(value, result.Type()) } -func (d *decoder) unmarshalFloat32(size uint, offset uint, result reflect.Value) (uint, error) { +func (d *decoder) unmarshalFloat32(size, offset uint, result reflect.Value) (uint, error) { if size != 4 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float32 size of %v)", size) - } - value, newOffset, err := d.decodeFloat32(size, offset) - if err != nil { - return 0, err + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (float32 size of %v)", + size, + ) } + value, newOffset := d.decodeFloat32(size, offset) switch result.Kind() { case reflect.Float32, reflect.Float64: @@ -248,15 +348,15 @@ func (d *decoder) unmarshalFloat32(size uint, offset uint, result reflect.Value) return newOffset, newUnmarshalTypeError(value, result.Type()) } -func (d *decoder) unmarshalFloat64(size uint, offset uint, result reflect.Value) (uint, error) { - +func (d *decoder) unmarshalFloat64(size, offset uint, result reflect.Value) (uint, error) { if size != 8 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (float 64 size of %v)", size) - } - value, newOffset, err := d.decodeFloat64(size, offset) - if err != nil { - return 0, err + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (float 64 size of %v)", + size, + ) } + value, newOffset := d.decodeFloat64(size, offset) + switch result.Kind() { case reflect.Float32, reflect.Float64: if result.OverflowFloat(value) { @@ -273,14 +373,14 @@ func (d *decoder) unmarshalFloat64(size uint, offset uint, result reflect.Value) return newOffset, newUnmarshalTypeError(value, result.Type()) } -func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) (uint, error) { +func (d *decoder) unmarshalInt32(size, offset uint, result reflect.Value) (uint, error) { if size > 4 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (int32 size of %v)", size) - } - value, newOffset, err := d.decodeInt(size, offset) - if err != nil { - return 0, err + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (int32 size of %v)", + size, + ) } + value, newOffset := d.decodeInt(size, offset) switch result.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: @@ -289,7 +389,12 @@ func (d *decoder) unmarshalInt32(size uint, offset uint, result reflect.Value) ( result.SetInt(n) return newOffset, nil } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + case reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64, + reflect.Uintptr: n := uint64(value) if !result.OverflowUint(n) { result.SetUint(n) @@ -310,7 +415,7 @@ func (d *decoder) unmarshalMap( result reflect.Value, depth int, ) (uint, error) { - result = d.indirect(result) + result = indirect(result) switch result.Kind() { default: return 0, newUnmarshalTypeError("map", result.Type()) @@ -320,7 +425,7 @@ func (d *decoder) unmarshalMap( return d.decodeMap(size, offset, result, depth) case reflect.Interface: if result.NumMethod() == 0 { - rv := reflect.ValueOf(make(map[string]interface{}, size)) + rv := reflect.ValueOf(make(map[string]any, size)) newOffset, err := d.decodeMap(size, offset, rv, depth) result.Set(rv) return newOffset, err @@ -329,7 +434,11 @@ func (d *decoder) unmarshalMap( } } -func (d *decoder) unmarshalPointer(size uint, offset uint, result reflect.Value, depth int) (uint, error) { +func (d *decoder) unmarshalPointer( + size, offset uint, + result reflect.Value, + depth int, +) (uint, error) { pointer, newOffset, err := d.decodePointer(size, offset) if err != nil { return 0, err @@ -349,7 +458,7 @@ func (d *decoder) unmarshalSlice( return d.decodeSlice(size, offset, result, depth) case reflect.Interface: if result.NumMethod() == 0 { - a := []interface{}{} + a := []any{} rv := reflect.ValueOf(&a).Elem() newOffset, err := d.decodeSlice(size, offset, rv, depth) result.Set(rv) @@ -359,12 +468,9 @@ func (d *decoder) unmarshalSlice( return 0, newUnmarshalTypeError("array", result.Type()) } -func (d *decoder) unmarshalString(size uint, offset uint, result reflect.Value) (uint, error) { - value, newOffset, err := d.decodeString(size, offset) +func (d *decoder) unmarshalString(size, offset uint, result reflect.Value) (uint, error) { + value, newOffset := d.decodeString(size, offset) - if err != nil { - return 0, err - } switch result.Kind() { case reflect.String: result.SetString(value) @@ -376,18 +482,22 @@ func (d *decoder) unmarshalString(size uint, offset uint, result reflect.Value) } } return newOffset, newUnmarshalTypeError(value, result.Type()) - } -func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, uintType uint) (uint, error) { +func (d *decoder) unmarshalUint( + size, offset uint, + result reflect.Value, + uintType uint, +) (uint, error) { if size > uintType/8 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint%v size of %v)", uintType, size) + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (uint%v size of %v)", + uintType, + size, + ) } - value, newOffset, err := d.decodeUint(size, offset) - if err != nil { - return 0, err - } + value, newOffset := d.decodeUint(size, offset) switch result.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: @@ -396,7 +506,12 @@ func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, ui result.SetInt(n) return newOffset, nil } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + case reflect.Uint, + reflect.Uint8, + reflect.Uint16, + reflect.Uint32, + reflect.Uint64, + reflect.Uintptr: if !result.OverflowUint(value) { result.SetUint(value) return newOffset, nil @@ -412,14 +527,14 @@ func (d *decoder) unmarshalUint(size uint, offset uint, result reflect.Value, ui var bigIntType = reflect.TypeOf(big.Int{}) -func (d *decoder) unmarshalUint128(size uint, offset uint, result reflect.Value) (uint, error) { +func (d *decoder) unmarshalUint128(size, offset uint, result reflect.Value) (uint, error) { if size > 16 { - return 0, newInvalidDatabaseError("the MaxMind DB file's data section contains bad data (uint128 size of %v)", size) - } - value, newOffset, err := d.decodeUint128(size, offset) - if err != nil { - return 0, err + return 0, newInvalidDatabaseError( + "the MaxMind DB file's data section contains bad data (uint128 size of %v)", + size, + ) } + value, newOffset := d.decodeUint128(size, offset) switch result.Kind() { case reflect.Struct: @@ -436,36 +551,36 @@ func (d *decoder) unmarshalUint128(size uint, offset uint, result reflect.Value) return newOffset, newUnmarshalTypeError(value, result.Type()) } -func (d *decoder) decodeBool(size uint, offset uint) (bool, uint, error) { - return size != 0, offset, nil +func decodeBool(size, offset uint) (bool, uint) { + return size != 0, offset } -func (d *decoder) decodeBytes(size uint, offset uint) ([]byte, uint, error) { +func (d *decoder) decodeBytes(size, offset uint) ([]byte, uint) { newOffset := offset + size bytes := make([]byte, size) copy(bytes, d.buffer[offset:newOffset]) - return bytes, newOffset, nil + return bytes, newOffset } -func (d *decoder) decodeFloat64(size uint, offset uint) (float64, uint, error) { +func (d *decoder) decodeFloat64(size, offset uint) (float64, uint) { newOffset := offset + size bits := binary.BigEndian.Uint64(d.buffer[offset:newOffset]) - return math.Float64frombits(bits), newOffset, nil + return math.Float64frombits(bits), newOffset } -func (d *decoder) decodeFloat32(size uint, offset uint) (float32, uint, error) { +func (d *decoder) decodeFloat32(size, offset uint) (float32, uint) { newOffset := offset + size bits := binary.BigEndian.Uint32(d.buffer[offset:newOffset]) - return math.Float32frombits(bits), newOffset, nil + return math.Float32frombits(bits), newOffset } -func (d *decoder) decodeInt(size uint, offset uint) (int, uint, error) { +func (d *decoder) decodeInt(size, offset uint) (int, uint) { newOffset := offset + size var val int32 for _, b := range d.buffer[offset:newOffset] { val = (val << 8) | int32(b) } - return int(val), newOffset, nil + return int(val), newOffset } func (d *decoder) decodeMap( @@ -475,24 +590,65 @@ func (d *decoder) decodeMap( depth int, ) (uint, error) { if result.IsNil() { - result.Set(reflect.MakeMap(result.Type())) + result.Set(reflect.MakeMapWithSize(result.Type(), int(size))) } + mapType := result.Type() + keyValue := reflect.New(mapType.Key()).Elem() + elemType := mapType.Elem() + var elemValue reflect.Value for i := uint(0); i < size; i++ { var key []byte var err error key, offset, err = d.decodeKey(offset) + if err != nil { + return 0, err + } + + if elemValue.IsValid() { + // After 1.20 is the minimum supported version, this can just be + // elemValue.SetZero() + reflectSetZero(elemValue) + } else { + elemValue = reflect.New(elemType).Elem() + } + offset, err = d.decode(offset, elemValue, depth) if err != nil { return 0, err } - value := reflect.New(result.Type().Elem()) - offset, err = d.decode(offset, value, depth) + keyValue.SetString(string(key)) + result.SetMapIndex(keyValue, elemValue) + } + return offset, nil +} + +func (d *decoder) decodeMapToDeserializer( + size uint, + offset uint, + dser deserializer, + depth int, +) (uint, error) { + err := dser.StartMap(size) + if err != nil { + return 0, err + } + for i := uint(0); i < size; i++ { + // TODO - implement key/value skipping? + offset, err = d.decodeToDeserializer(offset, dser, depth, true) + if err != nil { + return 0, err + } + + offset, err = d.decodeToDeserializer(offset, dser, depth, true) if err != nil { return 0, err } - result.SetMapIndex(reflect.ValueOf(string(key)), value.Elem()) + } + err = dser.End() + if err != nil { + return 0, err } return offset, nil } @@ -511,7 +667,7 @@ func (d *decoder) decodePointer( if pointerSize == 4 { prefix = 0 } else { - prefix = uint(size & 0x7) + prefix = size & 0x7 } unpacked := uintFromBytes(prefix, pointerBytes) @@ -549,60 +705,44 @@ func (d *decoder) decodeSlice( return offset, nil } -func (d *decoder) decodeString(size uint, offset uint) (string, uint, error) { - newOffset := offset + size - return string(d.buffer[offset:newOffset]), newOffset, nil +func (d *decoder) decodeSliceToDeserializer( + size uint, + offset uint, + dser deserializer, + depth int, +) (uint, error) { + err := dser.StartSlice(size) + if err != nil { + return 0, err + } + for i := uint(0); i < size; i++ { + offset, err = d.decodeToDeserializer(offset, dser, depth, true) + if err != nil { + return 0, err + } + } + err = dser.End() + if err != nil { + return 0, err + } + return offset, nil } -type fieldsType struct { - namedFields map[string]int - anonymousFields []int +func (d *decoder) decodeString(size, offset uint) (string, uint) { + newOffset := offset + size + return string(d.buffer[offset:newOffset]), newOffset } -var ( - fieldMap = map[reflect.Type]*fieldsType{} - fieldMapMu sync.RWMutex -) - func (d *decoder) decodeStruct( size uint, offset uint, result reflect.Value, depth int, ) (uint, error) { - resultType := result.Type() - - fieldMapMu.RLock() - fields, ok := fieldMap[resultType] - fieldMapMu.RUnlock() - if !ok { - numFields := resultType.NumField() - namedFields := make(map[string]int, numFields) - var anonymous []int - for i := 0; i < numFields; i++ { - field := resultType.Field(i) - - fieldName := field.Name - if tag := field.Tag.Get("maxminddb"); tag != "" { - if tag == "-" { - continue - } - fieldName = tag - } - if field.Anonymous { - anonymous = append(anonymous, i) - continue - } - namedFields[fieldName] = i - } - fieldMapMu.Lock() - fields = &fieldsType{namedFields, anonymous} - fieldMap[resultType] = fields - fieldMapMu.Unlock() - } + fields := cachedFields(result) // This fills in embedded structs - for i := range fields.anonymousFields { + for _, i := range fields.anonymousFields { _, err := d.unmarshalMap(size, offset, result.Field(i), depth) if err != nil { return 0, err @@ -638,7 +778,45 @@ func (d *decoder) decodeStruct( return offset, nil } -func (d *decoder) decodeUint(size uint, offset uint) (uint64, uint, error) { +type fieldsType struct { + namedFields map[string]int + anonymousFields []int +} + +var fieldsMap sync.Map + +func cachedFields(result reflect.Value) *fieldsType { + resultType := result.Type() + + if fields, ok := fieldsMap.Load(resultType); ok { + return fields.(*fieldsType) + } + numFields := resultType.NumField() + namedFields := make(map[string]int, numFields) + var anonymous []int + for i := 0; i < numFields; i++ { + field := resultType.Field(i) + + fieldName := field.Name + if tag := field.Tag.Get("maxminddb"); tag != "" { + if tag == "-" { + continue + } + fieldName = tag + } + if field.Anonymous { + anonymous = append(anonymous, i) + continue + } + namedFields[fieldName] = i + } + fields := &fieldsType{namedFields, anonymous} + fieldsMap.Store(resultType, fields) + + return fields +} + +func (d *decoder) decodeUint(size, offset uint) (uint64, uint) { newOffset := offset + size bytes := d.buffer[offset:newOffset] @@ -646,15 +824,15 @@ func (d *decoder) decodeUint(size uint, offset uint) (uint64, uint, error) { for _, b := range bytes { val = (val << 8) | uint64(b) } - return val, newOffset, nil + return val, newOffset } -func (d *decoder) decodeUint128(size uint, offset uint) (*big.Int, uint, error) { +func (d *decoder) decodeUint128(size, offset uint) (*big.Int, uint) { newOffset := offset + size val := new(big.Int) val.SetBytes(d.buffer[offset:newOffset]) - return val, newOffset, nil + return val, newOffset } func uintFromBytes(prefix uint, uintBytes []byte) uint { @@ -694,8 +872,8 @@ func (d *decoder) decodeKey(offset uint) ([]byte, uint, error) { // This function is used to skip ahead to the next value without decoding // the one at the offset passed in. The size bits have different meanings for -// different data types -func (d *decoder) nextValueOffset(offset uint, numberToSkip uint) (uint, error) { +// different data types. +func (d *decoder) nextValueOffset(offset, numberToSkip uint) (uint, error) { if numberToSkip == 0 { return offset, nil } diff --git a/vendor/github.com/oschwald/maxminddb-golang/deserializer.go b/vendor/github.com/oschwald/maxminddb-golang/deserializer.go new file mode 100644 index 000000000..c6dd68d14 --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/deserializer.go @@ -0,0 +1,31 @@ +package maxminddb + +import "math/big" + +// deserializer is an interface for a type that deserializes an MaxMind DB +// data record to some other type. This exists as an alternative to the +// standard reflection API. +// +// This is fundamentally different than the Unmarshaler interface that +// several packages provide. A Deserializer will generally create the +// final struct or value rather than unmarshaling to itself. +// +// This interface and the associated unmarshaling code is EXPERIMENTAL! +// It is not currently covered by any Semantic Versioning guarantees. +// Use at your own risk. +type deserializer interface { + ShouldSkip(offset uintptr) (bool, error) + StartSlice(size uint) error + StartMap(size uint) error + End() error + String(string) error + Float64(float64) error + Bytes([]byte) error + Uint16(uint16) error + Uint32(uint32) error + Int32(int32) error + Uint64(uint64) error + Uint128(*big.Int) error + Bool(bool) error + Float32(float32) error +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/errors.go b/vendor/github.com/oschwald/maxminddb-golang/errors.go index 132780019..aeba906b5 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/errors.go +++ b/vendor/github.com/oschwald/maxminddb-golang/errors.go @@ -15,7 +15,7 @@ func newOffsetError() InvalidDatabaseError { return InvalidDatabaseError{"unexpected end of database"} } -func newInvalidDatabaseError(format string, args ...interface{}) InvalidDatabaseError { +func newInvalidDatabaseError(format string, args ...any) InvalidDatabaseError { return InvalidDatabaseError{fmt.Sprintf(format, args...)} } @@ -26,11 +26,11 @@ func (e InvalidDatabaseError) Error() string { // UnmarshalTypeError is returned when the value in the database cannot be // assigned to the specified data type. type UnmarshalTypeError struct { - Value string // stringified copy of the database value that caused the error - Type reflect.Type // type of the value that could not be assign to + Type reflect.Type + Value string } -func newUnmarshalTypeError(value interface{}, rType reflect.Type) UnmarshalTypeError { +func newUnmarshalTypeError(value any, rType reflect.Type) UnmarshalTypeError { return UnmarshalTypeError{ Value: fmt.Sprintf("%v", value), Type: rType, diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go index 99f98cab6..48b2e403c 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go +++ b/vendor/github.com/oschwald/maxminddb-golang/mmap_unix.go @@ -1,15 +1,14 @@ -// +build !windows,!appengine +//go:build !windows && !appengine && !plan9 && !js && !wasip1 && !wasi +// +build !windows,!appengine,!plan9,!js,!wasip1,!wasi package maxminddb import ( - "syscall" - "golang.org/x/sys/unix" ) -func mmap(fd int, length int) (data []byte, err error) { - return unix.Mmap(fd, 0, length, syscall.PROT_READ, syscall.MAP_SHARED) +func mmap(fd, length int) (data []byte, err error) { + return unix.Mmap(fd, 0, length, unix.PROT_READ, unix.MAP_SHARED) } func munmap(b []byte) (err error) { diff --git a/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go b/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go index 661250eca..79133a7fb 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go +++ b/vendor/github.com/oschwald/maxminddb-golang/mmap_windows.go @@ -1,3 +1,4 @@ +//go:build windows && !appengine // +build windows,!appengine package maxminddb diff --git a/vendor/github.com/oschwald/maxminddb-golang/node.go b/vendor/github.com/oschwald/maxminddb-golang/node.go new file mode 100644 index 000000000..16e8b5f6a --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/node.go @@ -0,0 +1,58 @@ +package maxminddb + +type nodeReader interface { + readLeft(uint) uint + readRight(uint) uint +} + +type nodeReader24 struct { + buffer []byte +} + +func (n nodeReader24) readLeft(nodeNumber uint) uint { + return (uint(n.buffer[nodeNumber]) << 16) | + (uint(n.buffer[nodeNumber+1]) << 8) | + uint(n.buffer[nodeNumber+2]) +} + +func (n nodeReader24) readRight(nodeNumber uint) uint { + return (uint(n.buffer[nodeNumber+3]) << 16) | + (uint(n.buffer[nodeNumber+4]) << 8) | + uint(n.buffer[nodeNumber+5]) +} + +type nodeReader28 struct { + buffer []byte +} + +func (n nodeReader28) readLeft(nodeNumber uint) uint { + return ((uint(n.buffer[nodeNumber+3]) & 0xF0) << 20) | + (uint(n.buffer[nodeNumber]) << 16) | + (uint(n.buffer[nodeNumber+1]) << 8) | + uint(n.buffer[nodeNumber+2]) +} + +func (n nodeReader28) readRight(nodeNumber uint) uint { + return ((uint(n.buffer[nodeNumber+3]) & 0x0F) << 24) | + (uint(n.buffer[nodeNumber+4]) << 16) | + (uint(n.buffer[nodeNumber+5]) << 8) | + uint(n.buffer[nodeNumber+6]) +} + +type nodeReader32 struct { + buffer []byte +} + +func (n nodeReader32) readLeft(nodeNumber uint) uint { + return (uint(n.buffer[nodeNumber]) << 24) | + (uint(n.buffer[nodeNumber+1]) << 16) | + (uint(n.buffer[nodeNumber+2]) << 8) | + uint(n.buffer[nodeNumber+3]) +} + +func (n nodeReader32) readRight(nodeNumber uint) uint { + return (uint(n.buffer[nodeNumber+4]) << 24) | + (uint(n.buffer[nodeNumber+5]) << 16) | + (uint(n.buffer[nodeNumber+6]) << 8) | + uint(n.buffer[nodeNumber+7]) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader.go b/vendor/github.com/oschwald/maxminddb-golang/reader.go index bc933e99e..470845b2b 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/reader.go +++ b/vendor/github.com/oschwald/maxminddb-golang/reader.go @@ -1,3 +1,4 @@ +// Package maxminddb provides a reader for the MaxMind DB file format. package maxminddb import ( @@ -20,26 +21,32 @@ var metadataStartMarker = []byte("\xAB\xCD\xEFMaxMind.com") // Reader holds the data corresponding to the MaxMind DB file. Its only public // field is Metadata, which contains the metadata from the MaxMind DB file. +// +// All of the methods on Reader are thread-safe. The struct may be safely +// shared across goroutines. type Reader struct { - hasMappedFile bool - buffer []byte - decoder decoder - Metadata Metadata - ipv4Start uint + nodeReader nodeReader + buffer []byte + decoder decoder + Metadata Metadata + ipv4Start uint + ipv4StartBitDepth int + nodeOffsetMult uint + hasMappedFile bool } // Metadata holds the metadata decoded from the MaxMind DB file. In particular -// in has the format version, the build time as Unix epoch time, the database +// it has the format version, the build time as Unix epoch time, the database // type and description, the IP version supported, and a slice of the natural // languages included. type Metadata struct { + Description map[string]string `maxminddb:"description"` + DatabaseType string `maxminddb:"database_type"` + Languages []string `maxminddb:"languages"` BinaryFormatMajorVersion uint `maxminddb:"binary_format_major_version"` BinaryFormatMinorVersion uint `maxminddb:"binary_format_minor_version"` BuildEpoch uint `maxminddb:"build_epoch"` - DatabaseType string `maxminddb:"database_type"` - Description map[string]string `maxminddb:"description"` IPVersion uint `maxminddb:"ip_version"` - Languages []string `maxminddb:"languages"` NodeCount uint `maxminddb:"node_count"` RecordSize uint `maxminddb:"record_size"` } @@ -74,63 +81,130 @@ func FromBytes(buffer []byte) (*Reader, error) { buffer[searchTreeSize+dataSectionSeparatorSize : metadataStart-len(metadataStartMarker)], } + nodeBuffer := buffer[:searchTreeSize] + var nodeReader nodeReader + switch metadata.RecordSize { + case 24: + nodeReader = nodeReader24{buffer: nodeBuffer} + case 28: + nodeReader = nodeReader28{buffer: nodeBuffer} + case 32: + nodeReader = nodeReader32{buffer: nodeBuffer} + default: + return nil, newInvalidDatabaseError("unknown record size: %d", metadata.RecordSize) + } + reader := &Reader{ - buffer: buffer, - decoder: d, - Metadata: metadata, - ipv4Start: 0, + buffer: buffer, + nodeReader: nodeReader, + decoder: d, + Metadata: metadata, + ipv4Start: 0, + nodeOffsetMult: metadata.RecordSize / 4, } - reader.ipv4Start, err = reader.startNode() + reader.setIPv4Start() return reader, err } -func (r *Reader) startNode() (uint, error) { +func (r *Reader) setIPv4Start() { if r.Metadata.IPVersion != 6 { - return 0, nil + return } nodeCount := r.Metadata.NodeCount node := uint(0) - var err error - for i := 0; i < 96 && node < nodeCount; i++ { - node, err = r.readNode(node, 0) - if err != nil { - return 0, err - } + i := 0 + for ; i < 96 && node < nodeCount; i++ { + node = r.nodeReader.readLeft(node * r.nodeOffsetMult) } - return node, err + r.ipv4Start = node + r.ipv4StartBitDepth = i } -// Lookup takes an IP address as a net.IP structure and a pointer to the -// result value to Decode into. -func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error { - pointer, err := r.lookupPointer(ipAddress) +// Lookup retrieves the database record for ip and stores it in the value +// pointed to by result. If result is nil or not a pointer, an error is +// returned. If the data in the database record cannot be stored in result +// because of type differences, an UnmarshalTypeError is returned. If the +// database is invalid or otherwise cannot be read, an InvalidDatabaseError +// is returned. +func (r *Reader) Lookup(ip net.IP, result any) error { + if r.buffer == nil { + return errors.New("cannot call Lookup on a closed database") + } + pointer, _, _, err := r.lookupPointer(ip) if pointer == 0 || err != nil { return err } return r.retrieveData(pointer, result) } +// LookupNetwork retrieves the database record for ip and stores it in the +// value pointed to by result. The network returned is the network associated +// with the data record in the database. The ok return value indicates whether +// the database contained a record for the ip. +// +// If result is nil or not a pointer, an error is returned. If the data in the +// database record cannot be stored in result because of type differences, an +// UnmarshalTypeError is returned. If the database is invalid or otherwise +// cannot be read, an InvalidDatabaseError is returned. +func (r *Reader) LookupNetwork( + ip net.IP, + result any, +) (network *net.IPNet, ok bool, err error) { + if r.buffer == nil { + return nil, false, errors.New("cannot call Lookup on a closed database") + } + pointer, prefixLength, ip, err := r.lookupPointer(ip) + + network = r.cidr(ip, prefixLength) + if pointer == 0 || err != nil { + return network, false, err + } + + return network, true, r.retrieveData(pointer, result) +} + // LookupOffset maps an argument net.IP to a corresponding record offset in the // database. NotFound is returned if no such record is found, and a record may // otherwise be extracted by passing the returned offset to Decode. LookupOffset // is an advanced API, which exists to provide clients with a means to cache // previously-decoded records. -func (r *Reader) LookupOffset(ipAddress net.IP) (uintptr, error) { - pointer, err := r.lookupPointer(ipAddress) +func (r *Reader) LookupOffset(ip net.IP) (uintptr, error) { + if r.buffer == nil { + return 0, errors.New("cannot call LookupOffset on a closed database") + } + pointer, _, _, err := r.lookupPointer(ip) if pointer == 0 || err != nil { return NotFound, err } return r.resolveDataPointer(pointer) } +func (r *Reader) cidr(ip net.IP, prefixLength int) *net.IPNet { + // This is necessary as the node that the IPv4 start is at may + // be at a bit depth that is less that 96, i.e., ipv4Start points + // to a leaf node. For instance, if a record was inserted at ::/8, + // the ipv4Start would point directly at the leaf node for the + // record and would have a bit depth of 8. This would not happen + // with databases currently distributed by MaxMind as all of them + // have an IPv4 subtree that is greater than a single node. + if r.Metadata.IPVersion == 6 && + len(ip) == net.IPv4len && + r.ipv4StartBitDepth != 96 { + return &net.IPNet{IP: net.ParseIP("::"), Mask: net.CIDRMask(r.ipv4StartBitDepth, 128)} + } + + mask := net.CIDRMask(prefixLength, len(ip)*8) + return &net.IPNet{IP: ip.Mask(mask), Mask: mask} +} + // Decode the record at |offset| into |result|. The result value pointed to // must be a data value that corresponds to a record in the database. This may // include a struct representation of the data, a map capable of holding the -// data or an empty interface{} value. +// data or an empty any value. // // If result is a pointer to a struct, the struct need not include a field // for every value that may be in the database. If a field is not present in @@ -143,103 +217,93 @@ func (r *Reader) LookupOffset(ipAddress net.IP) (uintptr, error) { // the City database, all records of the same country will reference a // single representative record for that country. This uintptr behavior allows // clients to leverage this normalization in their own sub-record caching. -func (r *Reader) Decode(offset uintptr, result interface{}) error { +func (r *Reader) Decode(offset uintptr, result any) error { + if r.buffer == nil { + return errors.New("cannot call Decode on a closed database") + } + return r.decode(offset, result) +} + +func (r *Reader) decode(offset uintptr, result any) error { rv := reflect.ValueOf(result) if rv.Kind() != reflect.Ptr || rv.IsNil() { return errors.New("result param must be a pointer") } - _, err := r.decoder.decode(uint(offset), reflect.ValueOf(result), 0) + if dser, ok := result.(deserializer); ok { + _, err := r.decoder.decodeToDeserializer(uint(offset), dser, 0, false) + return err + } + + _, err := r.decoder.decode(uint(offset), rv, 0) return err } -func (r *Reader) lookupPointer(ipAddress net.IP) (uint, error) { - if ipAddress == nil { - return 0, errors.New("ipAddress passed to Lookup cannot be nil") +func (r *Reader) lookupPointer(ip net.IP) (uint, int, net.IP, error) { + if ip == nil { + return 0, 0, nil, errors.New("IP passed to Lookup cannot be nil") } - ipV4Address := ipAddress.To4() + ipV4Address := ip.To4() if ipV4Address != nil { - ipAddress = ipV4Address + ip = ipV4Address } - if len(ipAddress) == 16 && r.Metadata.IPVersion == 4 { - return 0, fmt.Errorf("error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", ipAddress.String()) + if len(ip) == 16 && r.Metadata.IPVersion == 4 { + return 0, 0, ip, fmt.Errorf( + "error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", + ip.String(), + ) } - return r.findAddressInTree(ipAddress) -} - -func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, error) { - - bitCount := uint(len(ipAddress) * 8) + bitCount := uint(len(ip) * 8) var node uint if bitCount == 32 { node = r.ipv4Start } + node, prefixLength := r.traverseTree(ip, node, bitCount) nodeCount := r.Metadata.NodeCount - - for i := uint(0); i < bitCount && node < nodeCount; i++ { - bit := uint(1) & (uint(ipAddress[i>>3]) >> (7 - (i % 8))) - - var err error - node, err = r.readNode(node, bit) - if err != nil { - return 0, err - } - } if node == nodeCount { // Record is empty - return 0, nil + return 0, prefixLength, ip, nil } else if node > nodeCount { - return node, nil + return node, prefixLength, ip, nil } - return 0, newInvalidDatabaseError("invalid node in search tree") + return 0, prefixLength, ip, newInvalidDatabaseError("invalid node in search tree") } -func (r *Reader) readNode(nodeNumber uint, index uint) (uint, error) { - RecordSize := r.Metadata.RecordSize +func (r *Reader) traverseTree(ip net.IP, node, bitCount uint) (uint, int) { + nodeCount := r.Metadata.NodeCount - baseOffset := nodeNumber * RecordSize / 4 + i := uint(0) + for ; i < bitCount && node < nodeCount; i++ { + bit := uint(1) & (uint(ip[i>>3]) >> (7 - (i % 8))) - var nodeBytes []byte - var prefix uint - switch RecordSize { - case 24: - offset := baseOffset + index*3 - nodeBytes = r.buffer[offset : offset+3] - case 28: - prefix = uint(r.buffer[baseOffset+3]) - if index != 0 { - prefix &= 0x0F + offset := node * r.nodeOffsetMult + if bit == 0 { + node = r.nodeReader.readLeft(offset) } else { - prefix = (0xF0 & prefix) >> 4 + node = r.nodeReader.readRight(offset) } - offset := baseOffset + index*4 - nodeBytes = r.buffer[offset : offset+3] - case 32: - offset := baseOffset + index*4 - nodeBytes = r.buffer[offset : offset+4] - default: - return 0, newInvalidDatabaseError("unknown record size: %d", RecordSize) } - return uintFromBytes(prefix, nodeBytes), nil + + return node, int(i) } -func (r *Reader) retrieveData(pointer uint, result interface{}) error { +func (r *Reader) retrieveData(pointer uint, result any) error { offset, err := r.resolveDataPointer(pointer) if err != nil { return err } - return r.Decode(offset, result) + return r.decode(offset, result) } func (r *Reader) resolveDataPointer(pointer uint) (uintptr, error) { - var resolved = uintptr(pointer - r.Metadata.NodeCount - dataSectionSeparatorSize) + resolved := uintptr(pointer - r.Metadata.NodeCount - dataSectionSeparatorSize) - if resolved > uintptr(len(r.buffer)) { + if resolved >= uintptr(len(r.buffer)) { return 0, newInvalidDatabaseError("the MaxMind DB file's search tree is corrupt") } return resolved, nil diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go b/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go deleted file mode 100644 index 631e19532..000000000 --- a/vendor/github.com/oschwald/maxminddb-golang/reader_appengine.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build appengine - -package maxminddb - -import "io/ioutil" - -// Open takes a string path to a MaxMind DB file and returns a Reader -// structure or an error. The database file is opened using a memory map, -// except on Google App Engine where mmap is not supported; there the database -// is loaded into memory. Use the Close method on the Reader object to return -// the resources to the system. -func Open(file string) (*Reader, error) { - bytes, err := ioutil.ReadFile(file) - if err != nil { - return nil, err - } - - return FromBytes(bytes) -} - -// Close unmaps the database file from virtual memory and returns the -// resources to the system. If called on a Reader opened using FromBytes -// or Open on Google App Engine, this method does nothing. -func (r *Reader) Close() error { - return nil -} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_memory.go b/vendor/github.com/oschwald/maxminddb-golang/reader_memory.go new file mode 100644 index 000000000..4ebb3473d --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/reader_memory.go @@ -0,0 +1,26 @@ +//go:build appengine || plan9 || js || wasip1 || wasi +// +build appengine plan9 js wasip1 wasi + +package maxminddb + +import "io/ioutil" + +// Open takes a string path to a MaxMind DB file and returns a Reader +// structure or an error. The database file is opened using a memory map +// on supported platforms. On platforms without memory map support, such +// as WebAssembly or Google App Engine, the database is loaded into memory. +// Use the Close method on the Reader object to return the resources to the system. +func Open(file string) (*Reader, error) { + bytes, err := ioutil.ReadFile(file) + if err != nil { + return nil, err + } + + return FromBytes(bytes) +} + +// Close returns the resources used by the database to the system. +func (r *Reader) Close() error { + r.buffer = nil + return nil +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_mmap.go b/vendor/github.com/oschwald/maxminddb-golang/reader_mmap.go new file mode 100644 index 000000000..1d083019e --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/reader_mmap.go @@ -0,0 +1,64 @@ +//go:build !appengine && !plan9 && !js && !wasip1 && !wasi +// +build !appengine,!plan9,!js,!wasip1,!wasi + +package maxminddb + +import ( + "os" + "runtime" +) + +// Open takes a string path to a MaxMind DB file and returns a Reader +// structure or an error. The database file is opened using a memory map +// on supported platforms. On platforms without memory map support, such +// as WebAssembly or Google App Engine, the database is loaded into memory. +// Use the Close method on the Reader object to return the resources to the system. +func Open(file string) (*Reader, error) { + mapFile, err := os.Open(file) + if err != nil { + _ = mapFile.Close() + return nil, err + } + + stats, err := mapFile.Stat() + if err != nil { + _ = mapFile.Close() + return nil, err + } + + fileSize := int(stats.Size()) + mmap, err := mmap(int(mapFile.Fd()), fileSize) + if err != nil { + _ = mapFile.Close() + return nil, err + } + + if err := mapFile.Close(); err != nil { + //nolint:errcheck // we prefer to return the original error + munmap(mmap) + return nil, err + } + + reader, err := FromBytes(mmap) + if err != nil { + //nolint:errcheck // we prefer to return the original error + munmap(mmap) + return nil, err + } + + reader.hasMappedFile = true + runtime.SetFinalizer(reader, (*Reader).Close) + return reader, nil +} + +// Close returns the resources used by the database to the system. +func (r *Reader) Close() error { + var err error + if r.hasMappedFile { + runtime.SetFinalizer(r, nil) + r.hasMappedFile = false + err = munmap(r.buffer) + } + r.buffer = nil + return err +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/reader_other.go b/vendor/github.com/oschwald/maxminddb-golang/reader_other.go deleted file mode 100644 index b611a9561..000000000 --- a/vendor/github.com/oschwald/maxminddb-golang/reader_other.go +++ /dev/null @@ -1,61 +0,0 @@ -// +build !appengine - -package maxminddb - -import ( - "os" - "runtime" -) - -// Open takes a string path to a MaxMind DB file and returns a Reader -// structure or an error. The database file is opened using a memory map, -// except on Google App Engine where mmap is not supported; there the database -// is loaded into memory. Use the Close method on the Reader object to return -// the resources to the system. -func Open(file string) (*Reader, error) { - mapFile, err := os.Open(file) - if err != nil { - return nil, err - } - defer func() { - if rerr := mapFile.Close(); rerr != nil { - err = rerr - } - }() - - stats, err := mapFile.Stat() - if err != nil { - return nil, err - } - - fileSize := int(stats.Size()) - mmap, err := mmap(int(mapFile.Fd()), fileSize) - if err != nil { - return nil, err - } - - reader, err := FromBytes(mmap) - if err != nil { - if err2 := munmap(mmap); err2 != nil { - // failing to unmap the file is probably the more severe error - return nil, err2 - } - return nil, err - } - - reader.hasMappedFile = true - runtime.SetFinalizer(reader, (*Reader).Close) - return reader, err -} - -// Close unmaps the database file from virtual memory and returns the -// resources to the system. If called on a Reader opened using FromBytes -// or Open on Google App Engine, this method does nothing. -func (r *Reader) Close() error { - if !r.hasMappedFile { - return nil - } - runtime.SetFinalizer(r, nil) - r.hasMappedFile = false - return munmap(r.buffer) -} diff --git a/vendor/github.com/oschwald/maxminddb-golang/set_zero_120.go b/vendor/github.com/oschwald/maxminddb-golang/set_zero_120.go new file mode 100644 index 000000000..33b9dff9d --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/set_zero_120.go @@ -0,0 +1,10 @@ +//go:build go1.20 +// +build go1.20 + +package maxminddb + +import "reflect" + +func reflectSetZero(v reflect.Value) { + v.SetZero() +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/set_zero_pre120.go b/vendor/github.com/oschwald/maxminddb-golang/set_zero_pre120.go new file mode 100644 index 000000000..6639de73e --- /dev/null +++ b/vendor/github.com/oschwald/maxminddb-golang/set_zero_pre120.go @@ -0,0 +1,10 @@ +//go:build !go1.20 +// +build !go1.20 + +package maxminddb + +import "reflect" + +func reflectSetZero(v reflect.Value) { + v.Set(reflect.Zero(v.Type())) +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/traverse.go b/vendor/github.com/oschwald/maxminddb-golang/traverse.go index f9b443c0d..657e2c40c 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/traverse.go +++ b/vendor/github.com/oschwald/maxminddb-golang/traverse.go @@ -1,6 +1,9 @@ package maxminddb -import "net" +import ( + "fmt" + "net" +) // Internal structure used to keep track of nodes we still need to visit. type netNode struct { @@ -11,77 +14,141 @@ type netNode struct { // Networks represents a set of subnets that we are iterating over. type Networks struct { - reader *Reader - nodes []netNode // Nodes we still have to visit. - lastNode netNode - err error + err error + reader *Reader + nodes []netNode + lastNode netNode + skipAliasedNetworks bool +} + +var ( + allIPv4 = &net.IPNet{IP: make(net.IP, 4), Mask: net.CIDRMask(0, 32)} + allIPv6 = &net.IPNet{IP: make(net.IP, 16), Mask: net.CIDRMask(0, 128)} +) + +// NetworksOption are options for Networks and NetworksWithin. +type NetworksOption func(*Networks) + +// SkipAliasedNetworks is an option for Networks and NetworksWithin that +// makes them not iterate over aliases of the IPv4 subtree in an IPv6 +// database, e.g., ::ffff:0:0/96, 2001::/32, and 2002::/16. +// +// You most likely want to set this. The only reason it isn't the default +// behavior is to provide backwards compatibility to existing users. +func SkipAliasedNetworks(networks *Networks) { + networks.skipAliasedNetworks = true } // Networks returns an iterator that can be used to traverse all networks in // the database. // // Please note that a MaxMind DB may map IPv4 networks into several locations -// in in an IPv6 database. This iterator will iterate over all of these -// locations separately. -func (r *Reader) Networks() *Networks { - s := 4 +// in an IPv6 database. This iterator will iterate over all of these locations +// separately. To only iterate over the IPv4 networks once, use the +// SkipAliasedNetworks option. +func (r *Reader) Networks(options ...NetworksOption) *Networks { + var networks *Networks if r.Metadata.IPVersion == 6 { - s = 16 + networks = r.NetworksWithin(allIPv6, options...) + } else { + networks = r.NetworksWithin(allIPv4, options...) + } + + return networks +} + +// NetworksWithin returns an iterator that can be used to traverse all networks +// in the database which are contained in a given network. +// +// Please note that a MaxMind DB may map IPv4 networks into several locations +// in an IPv6 database. This iterator will iterate over all of these locations +// separately. To only iterate over the IPv4 networks once, use the +// SkipAliasedNetworks option. +// +// If the provided network is contained within a network in the database, the +// iterator will iterate over exactly one network, the containing network. +func (r *Reader) NetworksWithin(network *net.IPNet, options ...NetworksOption) *Networks { + if r.Metadata.IPVersion == 4 && network.IP.To4() == nil { + return &Networks{ + err: fmt.Errorf( + "error getting networks with '%s': you attempted to use an IPv6 network in an IPv4-only database", + network.String(), + ), + } + } + + networks := &Networks{reader: r} + for _, option := range options { + option(networks) } - return &Networks{ - reader: r, - nodes: []netNode{ - { - ip: make(net.IP, s), - }, + + ip := network.IP + prefixLength, _ := network.Mask.Size() + + if r.Metadata.IPVersion == 6 && len(ip) == net.IPv4len { + if networks.skipAliasedNetworks { + ip = net.IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ip[0], ip[1], ip[2], ip[3]} + } else { + ip = ip.To16() + } + prefixLength += 96 + } + + pointer, bit := r.traverseTree(ip, 0, uint(prefixLength)) + networks.nodes = []netNode{ + { + ip: ip, + bit: uint(bit), + pointer: pointer, }, } + + return networks } // Next prepares the next network for reading with the Network method. It // returns true if there is another network to be processed and false if there // are no more networks or if there is an error. func (n *Networks) Next() bool { + if n.err != nil { + return false + } for len(n.nodes) > 0 { node := n.nodes[len(n.nodes)-1] n.nodes = n.nodes[:len(n.nodes)-1] - for { - if node.pointer < n.reader.Metadata.NodeCount { - ipRight := make(net.IP, len(node.ip)) - copy(ipRight, node.ip) - if len(ipRight) <= int(node.bit>>3) { - n.err = newInvalidDatabaseError( - "invalid search tree at %v/%v", ipRight, node.bit) - return false - } - ipRight[node.bit>>3] |= 1 << (7 - (node.bit % 8)) - - rightPointer, err := n.reader.readNode(node.pointer, 1) - if err != nil { - n.err = err - return false - } - - node.bit++ - n.nodes = append(n.nodes, netNode{ - pointer: rightPointer, - ip: ipRight, - bit: node.bit, - }) - - node.pointer, err = n.reader.readNode(node.pointer, 0) - if err != nil { - n.err = err - return false - } - - } else if node.pointer > n.reader.Metadata.NodeCount { + for node.pointer != n.reader.Metadata.NodeCount { + // This skips IPv4 aliases without hardcoding the networks that the writer + // currently aliases. + if n.skipAliasedNetworks && n.reader.ipv4Start != 0 && + node.pointer == n.reader.ipv4Start && !isInIPv4Subtree(node.ip) { + break + } + + if node.pointer > n.reader.Metadata.NodeCount { n.lastNode = node return true - } else { - break } + ipRight := make(net.IP, len(node.ip)) + copy(ipRight, node.ip) + if len(ipRight) <= int(node.bit>>3) { + n.err = newInvalidDatabaseError( + "invalid search tree at %v/%v", ipRight, node.bit) + return false + } + ipRight[node.bit>>3] |= 1 << (7 - (node.bit % 8)) + + offset := node.pointer * n.reader.nodeOffsetMult + rightPointer := n.reader.nodeReader.readRight(offset) + + node.bit++ + n.nodes = append(n.nodes, netNode{ + pointer: rightPointer, + ip: ipRight, + bit: node.bit, + }) + + node.pointer = n.reader.nodeReader.readLeft(offset) } } @@ -91,14 +158,29 @@ func (n *Networks) Next() bool { // Network returns the current network or an error if there is a problem // decoding the data for the network. It takes a pointer to a result value to // decode the network's data into. -func (n *Networks) Network(result interface{}) (*net.IPNet, error) { +func (n *Networks) Network(result any) (*net.IPNet, error) { + if n.err != nil { + return nil, n.err + } if err := n.reader.retrieveData(n.lastNode.pointer, result); err != nil { return nil, err } + ip := n.lastNode.ip + prefixLength := int(n.lastNode.bit) + + // We do this because uses of SkipAliasedNetworks expect the IPv4 networks + // to be returned as IPv4 networks. If we are not skipping aliased + // networks, then the user will get IPv4 networks from the ::FFFF:0:0/96 + // network as Go automatically converts those. + if n.skipAliasedNetworks && isInIPv4Subtree(ip) { + ip = ip[12:] + prefixLength -= 96 + } + return &net.IPNet{ - IP: n.lastNode.ip, - Mask: net.CIDRMask(int(n.lastNode.bit), len(n.lastNode.ip)*8), + IP: ip, + Mask: net.CIDRMask(prefixLength, len(ip)*8), }, nil } @@ -106,3 +188,17 @@ func (n *Networks) Network(result interface{}) (*net.IPNet, error) { func (n *Networks) Err() error { return n.err } + +// isInIPv4Subtree returns true if the IP is an IPv6 address in the database's +// IPv4 subtree. +func isInIPv4Subtree(ip net.IP) bool { + if len(ip) != 16 { + return false + } + for i := 0; i < 12; i++ { + if ip[i] != 0 { + return false + } + } + return true +} diff --git a/vendor/github.com/oschwald/maxminddb-golang/verifier.go b/vendor/github.com/oschwald/maxminddb-golang/verifier.go index ace9d35c4..b14b3e487 100644 --- a/vendor/github.com/oschwald/maxminddb-golang/verifier.go +++ b/vendor/github.com/oschwald/maxminddb-golang/verifier.go @@ -1,6 +1,9 @@ package maxminddb -import "reflect" +import ( + "reflect" + "runtime" +) type verifier struct { reader *Reader @@ -15,7 +18,9 @@ func (r *Reader) Verify() error { return err } - return v.verifyDatabase() + err := v.verifyDatabase() + runtime.KeepAlive(v.reader) + return err } func (v *verifier) verifyMetadata() error { @@ -132,23 +137,34 @@ func (v *verifier) verifyDataSection(offsets map[uint]bool) error { var offset uint bufferLen := uint(len(decoder.buffer)) for offset < bufferLen { - var data interface{} + var data any rv := reflect.ValueOf(&data) newOffset, err := decoder.decode(offset, rv, 0) if err != nil { - return newInvalidDatabaseError("received decoding error (%v) at offset of %v", err, offset) + return newInvalidDatabaseError( + "received decoding error (%v) at offset of %v", + err, + offset, + ) } if newOffset <= offset { - return newInvalidDatabaseError("data section offset unexpectedly went from %v to %v", offset, newOffset) + return newInvalidDatabaseError( + "data section offset unexpectedly went from %v to %v", + offset, + newOffset, + ) } pointer := offset - if _, ok := offsets[pointer]; ok { - delete(offsets, pointer) - } else { - return newInvalidDatabaseError("found data (%v) at %v that the search tree does not point to", data, pointer) + if _, ok := offsets[pointer]; !ok { + return newInvalidDatabaseError( + "found data (%v) at %v that the search tree does not point to", + data, + pointer, + ) } + delete(offsets, pointer) offset = newOffset } @@ -173,8 +189,8 @@ func (v *verifier) verifyDataSection(offsets map[uint]bool) error { func testError( field string, - expected interface{}, - actual interface{}, + expected any, + actual any, ) error { return newInvalidDatabaseError( "%v - Expected: %v Actual: %v", diff --git a/vendor/github.com/pelletier/go-toml/.dockerignore b/vendor/github.com/pelletier/go-toml/.dockerignore new file mode 100644 index 000000000..7b5883475 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.dockerignore @@ -0,0 +1,2 @@ +cmd/tomll/tomll +cmd/tomljson/tomljson diff --git a/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/pelletier/go-toml/.gitignore new file mode 100644 index 000000000..e6ba63a5c --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.gitignore @@ -0,0 +1,5 @@ +test_program/test_program_bin +fuzz/ +cmd/tomll/tomll +cmd/tomljson/tomljson +cmd/tomltestgen/tomltestgen diff --git a/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md b/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md new file mode 100644 index 000000000..98b9893d3 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/CONTRIBUTING.md @@ -0,0 +1,132 @@ +## Contributing + +Thank you for your interest in go-toml! We appreciate you considering +contributing to go-toml! + +The main goal is the project is to provide an easy-to-use TOML +implementation for Go that gets the job done and gets out of your way – +dealing with TOML is probably not the central piece of your project. + +As the single maintainer of go-toml, time is scarce. All help, big or +small, is more than welcomed! + +### Ask questions + +Any question you may have, somebody else might have it too. Always feel +free to ask them on the [issues tracker][issues-tracker]. We will try to +answer them as clearly and quickly as possible, time permitting. + +Asking questions also helps us identify areas where the documentation needs +improvement, or new features that weren't envisioned before. Sometimes, a +seemingly innocent question leads to the fix of a bug. Don't hesitate and +ask away! + +### Improve the documentation + +The best way to share your knowledge and experience with go-toml is to +improve the documentation. Fix a typo, clarify an interface, add an +example, anything goes! + +The documentation is present in the [README][readme] and thorough the +source code. On release, it gets updated on [pkg.go.dev][pkg.go.dev]. To make a +change to the documentation, create a pull request with your proposed +changes. For simple changes like that, the easiest way to go is probably +the "Fork this project and edit the file" button on Github, displayed at +the top right of the file. Unless it's a trivial change (for example a +typo), provide a little bit of context in your pull request description or +commit message. + +### Report a bug + +Found a bug! Sorry to hear that :(. Help us and other track them down and +fix by reporting it. [File a new bug report][bug-report] on the [issues +tracker][issues-tracker]. The template should provide enough guidance on +what to include. When in doubt: add more details! By reducing ambiguity and +providing more information, it decreases back and forth and saves everyone +time. + +### Code changes + +Want to contribute a patch? Very happy to hear that! + +First, some high-level rules: + +* A short proposal with some POC code is better than a lengthy piece of + text with no code. Code speaks louder than words. +* No backward-incompatible patch will be accepted unless discussed. + Sometimes it's hard, and Go's lack of versioning by default does not + help, but we try not to break people's programs unless we absolutely have + to. +* If you are writing a new feature or extending an existing one, make sure + to write some documentation. +* Bug fixes need to be accompanied with regression tests. +* New code needs to be tested. +* Your commit messages need to explain why the change is needed, even if + already included in the PR description. + +It does sound like a lot, but those best practices are here to save time +overall and continuously improve the quality of the project, which is +something everyone benefits from. + +#### Get started + +The fairly standard code contribution process looks like that: + +1. [Fork the project][fork]. +2. Make your changes, commit on any branch you like. +3. [Open up a pull request][pull-request] +4. Review, potential ask for changes. +5. Merge. You're in! + +Feel free to ask for help! You can create draft pull requests to gather +some early feedback! + +#### Run the tests + +You can run tests for go-toml using Go's test tool: `go test ./...`. +When creating a pull requests, all tests will be ran on Linux on a few Go +versions (Travis CI), and on Windows using the latest Go version +(AppVeyor). + +#### Style + +Try to look around and follow the same format and structure as the rest of +the code. We enforce using `go fmt` on the whole code base. + +--- + +### Maintainers-only + +#### Merge pull request + +Checklist: + +* Passing CI. +* Does not introduce backward-incompatible changes (unless discussed). +* Has relevant doc changes. +* Has relevant unit tests. + +1. Merge using "squash and merge". +2. Make sure to edit the commit message to keep all the useful information + nice and clean. +3. Make sure the commit title is clear and contains the PR number (#123). + +#### New release + +1. Go to [releases][releases]. Click on "X commits to master since this + release". +2. Make note of all the changes. Look for backward incompatible changes, + new features, and bug fixes. +3. Pick the new version using the above and semver. +4. Create a [new release][new-release]. +5. Follow the same format as [1.1.0][release-110]. + +[issues-tracker]: https://github.com/pelletier/go-toml/issues +[bug-report]: https://github.com/pelletier/go-toml/issues/new?template=bug_report.md +[pkg.go.dev]: https://pkg.go.dev/github.com/pelletier/go-toml +[readme]: ./README.md +[fork]: https://help.github.com/articles/fork-a-repo +[pull-request]: https://help.github.com/en/articles/creating-a-pull-request +[releases]: https://github.com/pelletier/go-toml/releases +[new-release]: https://github.com/pelletier/go-toml/releases/new +[release-110]: https://github.com/pelletier/go-toml/releases/tag/v1.1.0 diff --git a/vendor/github.com/pelletier/go-toml/Dockerfile b/vendor/github.com/pelletier/go-toml/Dockerfile new file mode 100644 index 000000000..fffdb0166 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.12-alpine3.9 as builder +WORKDIR /go/src/github.com/pelletier/go-toml +COPY . . +ENV CGO_ENABLED=0 +ENV GOOS=linux +RUN go install ./... + +FROM scratch +COPY --from=builder /go/bin/tomll /usr/bin/tomll +COPY --from=builder /go/bin/tomljson /usr/bin/tomljson +COPY --from=builder /go/bin/jsontoml /usr/bin/jsontoml diff --git a/vendor/github.com/pelletier/go-toml/LICENSE b/vendor/github.com/pelletier/go-toml/LICENSE new file mode 100644 index 000000000..f414553c2 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/LICENSE @@ -0,0 +1,247 @@ +The bulk of github.com/pelletier/go-toml is distributed under the MIT license +(see below), with the exception of localtime.go and localtime.test.go. +Those two files have been copied over from Google's civil library at revision +ed46f5086358513cf8c25f8e3f022cb838a49d66, and are distributed under the Apache +2.0 license (see below). + + +github.com/pelletier/go-toml: + + +The MIT License (MIT) + +Copyright (c) 2013 - 2021 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +localtime.go, localtime_test.go: + +Originals: + https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil.go + https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil_test.go +Changes: + * Renamed files from civil* to localtime*. + * Package changed from civil to toml. + * 'Local' prefix added to all structs. +License: + https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/LICENSE + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/pelletier/go-toml/Makefile b/vendor/github.com/pelletier/go-toml/Makefile new file mode 100644 index 000000000..9e4503aea --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Makefile @@ -0,0 +1,29 @@ +export CGO_ENABLED=0 +go := go +go.goos ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f1) +go.goarch ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f2) + +out.tools := tomll tomljson jsontoml +out.dist := $(out.tools:=_$(go.goos)_$(go.goarch).tar.xz) +sources := $(wildcard **/*.go) + + +.PHONY: +tools: $(out.tools) + +$(out.tools): $(sources) + GOOS=$(go.goos) GOARCH=$(go.goarch) $(go) build ./cmd/$@ + +.PHONY: +dist: $(out.dist) + +$(out.dist):%_$(go.goos)_$(go.goarch).tar.xz: % + if [ "$(go.goos)" = "windows" ]; then \ + tar -cJf $@ $^.exe; \ + else \ + tar -cJf $@ $^; \ + fi + +.PHONY: +clean: + rm -rf $(out.tools) $(out.dist) diff --git a/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md b/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..041cdc4a2 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +**Issue:** add link to pelletier/go-toml issue here + +Explanation of what this pull request does. + +More detailed description of the decisions being made and the reasons why (if the patch is non-trivial). diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md new file mode 100644 index 000000000..7399e04bf --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -0,0 +1,176 @@ +# go-toml + +Go library for the [TOML](https://toml.io/) format. + +This library supports TOML version +[v1.0.0-rc.3](https://toml.io/en/v1.0.0-rc.3) + +[![Go Reference](https://pkg.go.dev/badge/github.com/pelletier/go-toml.svg)](https://pkg.go.dev/github.com/pelletier/go-toml) +[![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) +[![Build Status](https://dev.azure.com/pelletierthomas/go-toml-ci/_apis/build/status/pelletier.go-toml?branchName=master)](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master) +[![codecov](https://codecov.io/gh/pelletier/go-toml/branch/master/graph/badge.svg)](https://codecov.io/gh/pelletier/go-toml) +[![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield) + + +## Development status + +**ℹ️ Consider go-toml v2!** + +The next version of go-toml is in [active development][v2-dev], and +[nearing completion][v2-map]. + +Though technically in beta, v2 is already more tested, [fixes bugs][v1-bugs], +and [much faster][v2-bench]. If you only need reading and writing TOML documents +(majority of cases), those features are implemented and the API unlikely to +change. + +The remaining features will be added shortly. While pull-requests are welcome on +v1, no active development is expected on it. When v2.0.0 is released, v1 will be +deprecated. + +👉 [go-toml v2][v2] + +[v2]: https://github.com/pelletier/go-toml/tree/v2 +[v2-map]: https://github.com/pelletier/go-toml/discussions/506 +[v2-dev]: https://github.com/pelletier/go-toml/tree/v2 +[v1-bugs]: https://github.com/pelletier/go-toml/issues?q=is%3Aissue+is%3Aopen+label%3Av2-fixed +[v2-bench]: https://github.com/pelletier/go-toml/tree/v2#benchmarks + +## Features + +Go-toml provides the following features for using data parsed from TOML documents: + +* Load TOML documents from files and string data +* Easily navigate TOML structure using Tree +* Marshaling and unmarshaling to and from data structures +* Line & column position data for all parsed elements +* [Query support similar to JSON-Path](query/) +* Syntax errors contain line and column numbers + +## Import + +```go +import "github.com/pelletier/go-toml" +``` + +## Usage example + +Read a TOML document: + +```go +config, _ := toml.Load(` +[postgres] +user = "pelletier" +password = "mypassword"`) +// retrieve data directly +user := config.Get("postgres.user").(string) + +// or using an intermediate object +postgresConfig := config.Get("postgres").(*toml.Tree) +password := postgresConfig.Get("password").(string) +``` + +Or use Unmarshal: + +```go +type Postgres struct { + User string + Password string +} +type Config struct { + Postgres Postgres +} + +doc := []byte(` +[Postgres] +User = "pelletier" +Password = "mypassword"`) + +config := Config{} +toml.Unmarshal(doc, &config) +fmt.Println("user=", config.Postgres.User) +``` + +Or use a query: + +```go +// use a query to gather elements without walking the tree +q, _ := query.Compile("$..[user,password]") +results := q.Execute(config) +for ii, item := range results.Values() { + fmt.Printf("Query result %d: %v\n", ii, item) +} +``` + +## Documentation + +The documentation and additional examples are available at +[pkg.go.dev](https://pkg.go.dev/github.com/pelletier/go-toml). + +## Tools + +Go-toml provides three handy command line tools: + +* `tomll`: Reads TOML files and lints them. + + ``` + go install github.com/pelletier/go-toml/cmd/tomll + tomll --help + ``` +* `tomljson`: Reads a TOML file and outputs its JSON representation. + + ``` + go install github.com/pelletier/go-toml/cmd/tomljson + tomljson --help + ``` + + * `jsontoml`: Reads a JSON file and outputs a TOML representation. + + ``` + go install github.com/pelletier/go-toml/cmd/jsontoml + jsontoml --help + ``` + +### Docker image + +Those tools are also available as a Docker image from +[dockerhub](https://hub.docker.com/r/pelletier/go-toml). For example, to +use `tomljson`: + +``` +docker run -v $PWD:/workdir pelletier/go-toml tomljson /workdir/example.toml +``` + +Only master (`latest`) and tagged versions are published to dockerhub. You +can build your own image as usual: + +``` +docker build -t go-toml . +``` + +## Contribute + +Feel free to report bugs and patches using GitHub's pull requests system on +[pelletier/go-toml](https://github.com/pelletier/go-toml). Any feedback would be +much appreciated! + +### Run tests + +`go test ./...` + +### Fuzzing + +The script `./fuzz.sh` is available to +run [go-fuzz](https://github.com/dvyukov/go-fuzz) on go-toml. + +## Versioning + +Go-toml follows [Semantic Versioning](http://semver.org/). The supported version +of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of +this document. The last two major versions of Go are supported +(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)). + +## License + +The MIT License (MIT) + Apache 2.0. Read [LICENSE](LICENSE). diff --git a/vendor/github.com/pelletier/go-toml/SECURITY.md b/vendor/github.com/pelletier/go-toml/SECURITY.md new file mode 100644 index 000000000..b2f21cfc9 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ---------- | ------------------ | +| Latest 2.x | :white_check_mark: | +| All 1.x | :x: | +| All 0.x | :x: | + +## Reporting a Vulnerability + +Email a vulnerability report to `security@pelletier.codes`. Make sure to include +as many details as possible to reproduce the vulnerability. This is a +side-project: I will try to get back to you as quickly as possible, time +permitting in my personal life. Providing a working patch helps very much! diff --git a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml new file mode 100644 index 000000000..4af198b4d --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml @@ -0,0 +1,188 @@ +trigger: +- master + +stages: +- stage: run_checks + displayName: "Check" + dependsOn: [] + jobs: + - job: fmt + displayName: "fmt" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.16" + inputs: + version: "1.16" + - task: Go@0 + displayName: "go fmt ./..." + inputs: + command: 'custom' + customCommand: 'fmt' + arguments: './...' + - job: coverage + displayName: "coverage" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.16" + inputs: + version: "1.16" + - task: Go@0 + displayName: "Generate coverage" + inputs: + command: 'test' + arguments: "-race -coverprofile=coverage.txt -covermode=atomic" + - task: Bash@3 + inputs: + targetType: 'inline' + script: 'bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}' + env: + CODECOV_TOKEN: $(CODECOV_TOKEN) + - job: benchmark + displayName: "benchmark" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.16" + inputs: + version: "1.16" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - task: Bash@3 + inputs: + filePath: './benchmark.sh' + arguments: "master $(Build.Repository.Uri)" + + - job: go_unit_tests + displayName: "unit tests" + strategy: + matrix: + linux 1.16: + goVersion: '1.16' + imageName: 'ubuntu-latest' + mac 1.16: + goVersion: '1.16' + imageName: 'macOS-latest' + windows 1.16: + goVersion: '1.16' + imageName: 'windows-latest' + linux 1.15: + goVersion: '1.15' + imageName: 'ubuntu-latest' + mac 1.15: + goVersion: '1.15' + imageName: 'macOS-latest' + windows 1.15: + goVersion: '1.15' + imageName: 'windows-latest' + pool: + vmImage: $(imageName) + steps: + - task: GoTool@0 + displayName: "Install Go $(goVersion)" + inputs: + version: $(goVersion) + - task: Go@0 + displayName: "go test ./..." + inputs: + command: 'test' + arguments: './...' +- stage: build_binaries + displayName: "Build binaries" + dependsOn: run_checks + jobs: + - job: build_binary + displayName: "Build binary" + strategy: + matrix: + linux_amd64: + GOOS: linux + GOARCH: amd64 + darwin_amd64: + GOOS: darwin + GOARCH: amd64 + windows_amd64: + GOOS: windows + GOARCH: amd64 + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go" + inputs: + version: 1.16 + - task: Bash@3 + inputs: + targetType: inline + script: "make dist" + env: + go.goos: $(GOOS) + go.goarch: $(GOARCH) + - task: CopyFiles@2 + inputs: + sourceFolder: '$(Build.SourcesDirectory)' + contents: '*.tar.xz' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: binaries +- stage: build_binaries_manifest + displayName: "Build binaries manifest" + dependsOn: build_binaries + jobs: + - job: build_manifest + displayName: "Build binaries manifest" + steps: + - task: DownloadBuildArtifacts@0 + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'binaries' + downloadPath: '$(Build.SourcesDirectory)' + - task: Bash@3 + inputs: + targetType: inline + script: "cd binaries && sha256sum --binary *.tar.xz | tee $(Build.ArtifactStagingDirectory)/sha256sums.txt" + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: manifest + +- stage: build_docker_image + displayName: "Build Docker image" + dependsOn: run_checks + jobs: + - job: build + displayName: "Build" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + command: 'build' + Dockerfile: 'Dockerfile' + buildContext: '.' + addPipelineData: false + +- stage: publish_docker_image + displayName: "Publish Docker image" + dependsOn: build_docker_image + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: publish + displayName: "Publish" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + containerRegistry: 'DockerHub' + repository: 'pelletier/go-toml' + command: 'buildAndPush' + Dockerfile: 'Dockerfile' + buildContext: '.' + tags: 'latest' diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh new file mode 100644 index 000000000..a69d3040f --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -ex + +reference_ref=${1:-master} +reference_git=${2:-.} + +if ! `hash benchstat 2>/dev/null`; then + echo "Installing benchstat" + go get golang.org/x/perf/cmd/benchstat +fi + +tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` +ref_tempdir="${tempdir}/ref" +ref_benchmark="${ref_tempdir}/benchmark-`echo -n ${reference_ref}|tr -s '/' '-'`.txt" +local_benchmark="`pwd`/benchmark-local.txt" + +echo "=== ${reference_ref} (${ref_tempdir})" +git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null +pushd ${ref_tempdir} >/dev/null +git checkout ${reference_ref} >/dev/null 2>/dev/null +go test -bench=. -benchmem | tee ${ref_benchmark} +cd benchmark +go test -bench=. -benchmem | tee -a ${ref_benchmark} +popd >/dev/null + +echo "" +echo "=== local" +go test -bench=. -benchmem | tee ${local_benchmark} +cd benchmark +go test -bench=. -benchmem | tee -a ${local_benchmark} + +echo "" +echo "=== diff" +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} diff --git a/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/pelletier/go-toml/doc.go new file mode 100644 index 000000000..a1406a32b --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/doc.go @@ -0,0 +1,23 @@ +// Package toml is a TOML parser and manipulation library. +// +// This version supports the specification as described in +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md +// +// Marshaling +// +// Go-toml can marshal and unmarshal TOML documents from and to data +// structures. +// +// TOML document as a tree +// +// Go-toml can operate on a TOML document as a tree. Use one of the Load* +// functions to parse TOML data and obtain a Tree instance, then one of its +// methods to manipulate the tree. +// +// JSONPath-like queries +// +// The package github.com/pelletier/go-toml/query implements a system +// similar to JSONPath to quickly retrieve elements of a TOML document using a +// single expression. See the package documentation for more information. +// +package toml diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml new file mode 100644 index 000000000..f45bf88b8 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -0,0 +1,30 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml new file mode 100644 index 000000000..f45bf88b8 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/example.toml @@ -0,0 +1,30 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/fuzz.go b/vendor/github.com/pelletier/go-toml/fuzz.go new file mode 100644 index 000000000..14570c8d3 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzz.go @@ -0,0 +1,31 @@ +// +build gofuzz + +package toml + +func Fuzz(data []byte) int { + tree, err := LoadBytes(data) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + str, err := tree.ToTomlString() + if err != nil { + if str != "" { + panic(`str must be "" if there is an error`) + } + panic(err) + } + + tree, err = Load(str) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + return 1 +} diff --git a/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/pelletier/go-toml/fuzz.sh new file mode 100644 index 000000000..3204b4c44 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzz.sh @@ -0,0 +1,15 @@ +#! /bin/sh +set -eu + +go get github.com/dvyukov/go-fuzz/go-fuzz +go get github.com/dvyukov/go-fuzz/go-fuzz-build + +if [ ! -e toml-fuzz.zip ]; then + go-fuzz-build github.com/pelletier/go-toml +fi + +rm -fr fuzz +mkdir -p fuzz/corpus +cp *.toml fuzz/corpus + +go-fuzz -bin=toml-fuzz.zip -workdir=fuzz diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go new file mode 100644 index 000000000..e091500b2 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -0,0 +1,112 @@ +// Parsing keys handling both bare and quoted keys. + +package toml + +import ( + "errors" + "fmt" +) + +// Convert the bare key group string to an array. +// The input supports double quotation and single quotation, +// but escape sequences are not supported. Lexers must unescape them beforehand. +func parseKey(key string) ([]string, error) { + runes := []rune(key) + var groups []string + + if len(key) == 0 { + return nil, errors.New("empty key") + } + + idx := 0 + for idx < len(runes) { + for ; idx < len(runes) && isSpace(runes[idx]); idx++ { + // skip leading whitespace + } + if idx >= len(runes) { + break + } + r := runes[idx] + if isValidBareChar(r) { + // parse bare key + startIdx := idx + endIdx := -1 + idx++ + for idx < len(runes) { + r = runes[idx] + if isValidBareChar(r) { + idx++ + } else if r == '.' { + endIdx = idx + break + } else if isSpace(r) { + endIdx = idx + for ; idx < len(runes) && isSpace(runes[idx]); idx++ { + // skip trailing whitespace + } + if idx < len(runes) && runes[idx] != '.' { + return nil, fmt.Errorf("invalid key character after whitespace: %c", runes[idx]) + } + break + } else { + return nil, fmt.Errorf("invalid bare key character: %c", r) + } + } + if endIdx == -1 { + endIdx = idx + } + groups = append(groups, string(runes[startIdx:endIdx])) + } else if r == '\'' { + // parse single quoted key + idx++ + startIdx := idx + for { + if idx >= len(runes) { + return nil, fmt.Errorf("unclosed single-quoted key") + } + r = runes[idx] + if r == '\'' { + groups = append(groups, string(runes[startIdx:idx])) + idx++ + break + } + idx++ + } + } else if r == '"' { + // parse double quoted key + idx++ + startIdx := idx + for { + if idx >= len(runes) { + return nil, fmt.Errorf("unclosed double-quoted key") + } + r = runes[idx] + if r == '"' { + groups = append(groups, string(runes[startIdx:idx])) + idx++ + break + } + idx++ + } + } else if r == '.' { + idx++ + if idx >= len(runes) { + return nil, fmt.Errorf("unexpected end of key") + } + r = runes[idx] + if !isValidBareChar(r) && r != '\'' && r != '"' && r != ' ' { + return nil, fmt.Errorf("expecting key part after dot") + } + } else { + return nil, fmt.Errorf("invalid key character: %c", r) + } + } + if len(groups) == 0 { + return nil, fmt.Errorf("empty key") + } + return groups, nil +} + +func isValidBareChar(r rune) bool { + return isAlphanumeric(r) || r == '-' || isDigit(r) +} diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go new file mode 100644 index 000000000..313908e3e --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -0,0 +1,1031 @@ +// TOML lexer. +// +// Written using the principles developed by Rob Pike in +// http://www.youtube.com/watch?v=HxaD_trXwRE + +package toml + +import ( + "bytes" + "errors" + "fmt" + "strconv" + "strings" +) + +// Define state functions +type tomlLexStateFn func() tomlLexStateFn + +// Define lexer +type tomlLexer struct { + inputIdx int + input []rune // Textual source + currentTokenStart int + currentTokenStop int + tokens []token + brackets []rune + line int + col int + endbufferLine int + endbufferCol int +} + +// Basic read operations on input + +func (l *tomlLexer) read() rune { + r := l.peek() + if r == '\n' { + l.endbufferLine++ + l.endbufferCol = 1 + } else { + l.endbufferCol++ + } + l.inputIdx++ + return r +} + +func (l *tomlLexer) next() rune { + r := l.read() + + if r != eof { + l.currentTokenStop++ + } + return r +} + +func (l *tomlLexer) ignore() { + l.currentTokenStart = l.currentTokenStop + l.line = l.endbufferLine + l.col = l.endbufferCol +} + +func (l *tomlLexer) skip() { + l.next() + l.ignore() +} + +func (l *tomlLexer) fastForward(n int) { + for i := 0; i < n; i++ { + l.next() + } +} + +func (l *tomlLexer) emitWithValue(t tokenType, value string) { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: t, + val: value, + }) + l.ignore() +} + +func (l *tomlLexer) emit(t tokenType) { + l.emitWithValue(t, string(l.input[l.currentTokenStart:l.currentTokenStop])) +} + +func (l *tomlLexer) peek() rune { + if l.inputIdx >= len(l.input) { + return eof + } + return l.input[l.inputIdx] +} + +func (l *tomlLexer) peekString(size int) string { + maxIdx := len(l.input) + upperIdx := l.inputIdx + size // FIXME: potential overflow + if upperIdx > maxIdx { + upperIdx = maxIdx + } + return string(l.input[l.inputIdx:upperIdx]) +} + +func (l *tomlLexer) follow(next string) bool { + return next == l.peekString(len(next)) +} + +// Error management + +func (l *tomlLexer) errorf(format string, args ...interface{}) tomlLexStateFn { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: tokenError, + val: fmt.Sprintf(format, args...), + }) + return nil +} + +// State functions + +func (l *tomlLexer) lexVoid() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '}': // after '{' + return l.lexRightCurlyBrace + case '[': + return l.lexTableKey + case '#': + return l.lexComment(l.lexVoid) + case '=': + return l.lexEqual + case '\r': + fallthrough + case '\n': + l.skip() + continue + } + + if isSpace(next) { + l.skip() + } + + if isKeyStartChar(next) { + return l.lexKey + } + + if next == eof { + l.next() + break + } + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexRvalue() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '.': + return l.errorf("cannot start float with a dot") + case '=': + return l.lexEqual + case '[': + return l.lexLeftBracket + case ']': + return l.lexRightBracket + case '{': + return l.lexLeftCurlyBrace + case '}': + return l.lexRightCurlyBrace + case '#': + return l.lexComment(l.lexRvalue) + case '"': + return l.lexString + case '\'': + return l.lexLiteralString + case ',': + return l.lexComma + case '\r': + fallthrough + case '\n': + l.skip() + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '[' { + return l.lexRvalue + } + return l.lexVoid + } + + if l.follow("true") { + return l.lexTrue + } + + if l.follow("false") { + return l.lexFalse + } + + if l.follow("inf") { + return l.lexInf + } + + if l.follow("nan") { + return l.lexNan + } + + if isSpace(next) { + l.skip() + continue + } + + if next == eof { + l.next() + break + } + + if next == '+' || next == '-' { + return l.lexNumber + } + + if isDigit(next) { + return l.lexDateTimeOrNumber + } + + return l.errorf("no value can start with %c", next) + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexDateTimeOrNumber() tomlLexStateFn { + // Could be either a date/time, or a digit. + // The options for date/times are: + // YYYY-... => date or date-time + // HH:... => time + // Anything else should be a number. + + lookAhead := l.peekString(5) + if len(lookAhead) < 3 { + return l.lexNumber() + } + + for idx, r := range lookAhead { + if !isDigit(r) { + if idx == 2 && r == ':' { + return l.lexDateTimeOrTime() + } + if idx == 4 && r == '-' { + return l.lexDateTimeOrTime() + } + return l.lexNumber() + } + } + return l.lexNumber() +} + +func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenLeftCurlyBrace) + l.brackets = append(l.brackets, '{') + return l.lexVoid +} + +func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenRightCurlyBrace) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '{' { + return l.errorf("cannot have '}' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] + return l.lexRvalue +} + +func (l *tomlLexer) lexDateTimeOrTime() tomlLexStateFn { + // Example matches: + // 1979-05-27T07:32:00Z + // 1979-05-27T00:32:00-07:00 + // 1979-05-27T00:32:00.999999-07:00 + // 1979-05-27 07:32:00Z + // 1979-05-27 00:32:00-07:00 + // 1979-05-27 00:32:00.999999-07:00 + // 1979-05-27T07:32:00 + // 1979-05-27T00:32:00.999999 + // 1979-05-27 07:32:00 + // 1979-05-27 00:32:00.999999 + // 1979-05-27 + // 07:32:00 + // 00:32:00.999999 + + // we already know those two are digits + l.next() + l.next() + + // Got 2 digits. At that point it could be either a time or a date(-time). + + r := l.next() + if r == ':' { + return l.lexTime() + } + + return l.lexDateTime() +} + +func (l *tomlLexer) lexDateTime() tomlLexStateFn { + // This state accepts an offset date-time, a local date-time, or a local date. + // + // v--- cursor + // 1979-05-27T07:32:00Z + // 1979-05-27T00:32:00-07:00 + // 1979-05-27T00:32:00.999999-07:00 + // 1979-05-27 07:32:00Z + // 1979-05-27 00:32:00-07:00 + // 1979-05-27 00:32:00.999999-07:00 + // 1979-05-27T07:32:00 + // 1979-05-27T00:32:00.999999 + // 1979-05-27 07:32:00 + // 1979-05-27 00:32:00.999999 + // 1979-05-27 + + // date + + // already checked by lexRvalue + l.next() // digit + l.next() // - + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid month digit in date: %c", r) + } + } + + r := l.next() + if r != '-' { + return l.errorf("expected - to separate month of a date, not %c", r) + } + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid day digit in date: %c", r) + } + } + + l.emit(tokenLocalDate) + + r = l.peek() + + if r == eof { + + return l.lexRvalue + } + + if r != ' ' && r != 'T' { + return l.errorf("incorrect date/time separation character: %c", r) + } + + if r == ' ' { + lookAhead := l.peekString(3)[1:] + if len(lookAhead) < 2 { + return l.lexRvalue + } + for _, r := range lookAhead { + if !isDigit(r) { + return l.lexRvalue + } + } + } + + l.skip() // skip the T or ' ' + + // time + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid hour digit in time: %c", r) + } + } + + r = l.next() + if r != ':' { + return l.errorf("time hour/minute separator should be :, not %c", r) + } + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid minute digit in time: %c", r) + } + } + + r = l.next() + if r != ':' { + return l.errorf("time minute/second separator should be :, not %c", r) + } + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid second digit in time: %c", r) + } + } + + r = l.peek() + if r == '.' { + l.next() + r := l.next() + if !isDigit(r) { + return l.errorf("expected at least one digit in time's fraction, not %c", r) + } + + for { + r := l.peek() + if !isDigit(r) { + break + } + l.next() + } + } + + l.emit(tokenLocalTime) + + return l.lexTimeOffset + +} + +func (l *tomlLexer) lexTimeOffset() tomlLexStateFn { + // potential offset + + // Z + // -07:00 + // +07:00 + // nothing + + r := l.peek() + + if r == 'Z' { + l.next() + l.emit(tokenTimeOffset) + } else if r == '+' || r == '-' { + l.next() + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid hour digit in time offset: %c", r) + } + } + + r = l.next() + if r != ':' { + return l.errorf("time offset hour/minute separator should be :, not %c", r) + } + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid minute digit in time offset: %c", r) + } + } + + l.emit(tokenTimeOffset) + } + + return l.lexRvalue +} + +func (l *tomlLexer) lexTime() tomlLexStateFn { + // v--- cursor + // 07:32:00 + // 00:32:00.999999 + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid minute digit in time: %c", r) + } + } + + r := l.next() + if r != ':' { + return l.errorf("time minute/second separator should be :, not %c", r) + } + + for i := 0; i < 2; i++ { + r := l.next() + if !isDigit(r) { + return l.errorf("invalid second digit in time: %c", r) + } + } + + r = l.peek() + if r == '.' { + l.next() + r := l.next() + if !isDigit(r) { + return l.errorf("expected at least one digit in time's fraction, not %c", r) + } + + for { + r := l.peek() + if !isDigit(r) { + break + } + l.next() + } + } + + l.emit(tokenLocalTime) + return l.lexRvalue + +} + +func (l *tomlLexer) lexTrue() tomlLexStateFn { + l.fastForward(4) + l.emit(tokenTrue) + return l.lexRvalue +} + +func (l *tomlLexer) lexFalse() tomlLexStateFn { + l.fastForward(5) + l.emit(tokenFalse) + return l.lexRvalue +} + +func (l *tomlLexer) lexInf() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenInf) + return l.lexRvalue +} + +func (l *tomlLexer) lexNan() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenNan) + return l.lexRvalue +} + +func (l *tomlLexer) lexEqual() tomlLexStateFn { + l.next() + l.emit(tokenEqual) + return l.lexRvalue +} + +func (l *tomlLexer) lexComma() tomlLexStateFn { + l.next() + l.emit(tokenComma) + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '{' { + return l.lexVoid + } + return l.lexRvalue +} + +// Parse the key and emits its value without escape sequences. +// bare keys, basic string keys and literal string keys are supported. +func (l *tomlLexer) lexKey() tomlLexStateFn { + var sb strings.Builder + + for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() { + if r == '"' { + l.next() + str, err := l.lexStringAsString(`"`, false, true) + if err != nil { + return l.errorf(err.Error()) + } + sb.WriteString("\"") + sb.WriteString(str) + sb.WriteString("\"") + l.next() + continue + } else if r == '\'' { + l.next() + str, err := l.lexLiteralStringAsString(`'`, false) + if err != nil { + return l.errorf(err.Error()) + } + sb.WriteString("'") + sb.WriteString(str) + sb.WriteString("'") + l.next() + continue + } else if r == '\n' { + return l.errorf("keys cannot contain new lines") + } else if isSpace(r) { + var str strings.Builder + str.WriteString(" ") + + // skip trailing whitespace + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str.WriteRune(r) + l.next() + } + // break loop if not a dot + if r != '.' { + break + } + str.WriteString(".") + // skip trailing whitespace after dot + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str.WriteRune(r) + l.next() + } + sb.WriteString(str.String()) + continue + } else if r == '.' { + // skip + } else if !isValidBareChar(r) { + return l.errorf("keys cannot contain %c character", r) + } + sb.WriteRune(r) + l.next() + } + l.emitWithValue(tokenKey, sb.String()) + return l.lexVoid +} + +func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { + return func() tomlLexStateFn { + for next := l.peek(); next != '\n' && next != eof; next = l.peek() { + if next == '\r' && l.follow("\r\n") { + break + } + l.next() + } + l.ignore() + return previousState + } +} + +func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { + l.next() + l.emit(tokenLeftBracket) + l.brackets = append(l.brackets, '[') + return l.lexRvalue +} + +func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) { + var sb strings.Builder + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + // find end of string + for { + if l.follow(terminator) { + return sb.String(), nil + } + + next := l.peek() + if next == eof { + break + } + sb.WriteRune(l.next()) + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexLiteralString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := "'" + discardLeadingNewLine := false + if l.follow("''") { + l.skip() + l.skip() + terminator = "'''" + discardLeadingNewLine = true + } + + str, err := l.lexLiteralStringAsString(terminator, discardLeadingNewLine) + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +// Lex a string and return the results as a string. +// Terminator is the substring indicating the end of the token. +// The resulting string does not include the terminator. +func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) { + var sb strings.Builder + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + for { + if l.follow(terminator) { + return sb.String(), nil + } + + if l.follow("\\") { + l.next() + switch l.peek() { + case '\r': + fallthrough + case '\n': + fallthrough + case '\t': + fallthrough + case ' ': + // skip all whitespace chars following backslash + for strings.ContainsRune("\r\n\t ", l.peek()) { + l.next() + } + case '"': + sb.WriteString("\"") + l.next() + case 'n': + sb.WriteString("\n") + l.next() + case 'b': + sb.WriteString("\b") + l.next() + case 'f': + sb.WriteString("\f") + l.next() + case '/': + sb.WriteString("/") + l.next() + case 't': + sb.WriteString("\t") + l.next() + case 'r': + sb.WriteString("\r") + l.next() + case '\\': + sb.WriteString("\\") + l.next() + case 'u': + l.next() + var code strings.Builder + for i := 0; i < 4; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code.WriteRune(c) + } + intcode, err := strconv.ParseInt(code.String(), 16, 32) + if err != nil { + return "", errors.New("invalid unicode escape: \\u" + code.String()) + } + sb.WriteRune(rune(intcode)) + case 'U': + l.next() + var code strings.Builder + for i := 0; i < 8; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code.WriteRune(c) + } + intcode, err := strconv.ParseInt(code.String(), 16, 64) + if err != nil { + return "", errors.New("invalid unicode escape: \\U" + code.String()) + } + sb.WriteRune(rune(intcode)) + default: + return "", errors.New("invalid escape sequence: \\" + string(l.peek())) + } + } else { + r := l.peek() + + if 0x00 <= r && r <= 0x1F && r != '\t' && !(acceptNewLines && (r == '\n' || r == '\r')) { + return "", fmt.Errorf("unescaped control character %U", r) + } + l.next() + sb.WriteRune(r) + } + + if l.peek() == eof { + break + } + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := `"` + discardLeadingNewLine := false + acceptNewLines := false + if l.follow(`""`) { + l.skip() + l.skip() + terminator = `"""` + discardLeadingNewLine = true + acceptNewLines = true + } + + str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +func (l *tomlLexer) lexTableKey() tomlLexStateFn { + l.next() + + if l.peek() == '[' { + // token '[[' signifies an array of tables + l.next() + l.emit(tokenDoubleLeftBracket) + return l.lexInsideTableArrayKey + } + // vanilla table key + l.emit(tokenLeftBracket) + return l.lexInsideTableKey +} + +// Parse the key till "]]", but only bare keys are supported +func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroupArray) + } + l.next() + if l.peek() != ']' { + break + } + l.next() + l.emit(tokenDoubleRightBracket) + return l.lexVoid + case '[': + return l.errorf("table array key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table array key") +} + +// Parse the key till "]" but only bare keys are supported +func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroup) + } + l.next() + l.emit(tokenRightBracket) + return l.lexVoid + case '[': + return l.errorf("table key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table key") +} + +func (l *tomlLexer) lexRightBracket() tomlLexStateFn { + l.next() + l.emit(tokenRightBracket) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '[' { + return l.errorf("cannot have ']' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] + return l.lexRvalue +} + +type validRuneFn func(r rune) bool + +func isValidHexRune(r rune) bool { + return r >= 'a' && r <= 'f' || + r >= 'A' && r <= 'F' || + r >= '0' && r <= '9' || + r == '_' +} + +func isValidOctalRune(r rune) bool { + return r >= '0' && r <= '7' || r == '_' +} + +func isValidBinaryRune(r rune) bool { + return r == '0' || r == '1' || r == '_' +} + +func (l *tomlLexer) lexNumber() tomlLexStateFn { + r := l.peek() + + if r == '0' { + follow := l.peekString(2) + if len(follow) == 2 { + var isValidRune validRuneFn + switch follow[1] { + case 'x': + isValidRune = isValidHexRune + case 'o': + isValidRune = isValidOctalRune + case 'b': + isValidRune = isValidBinaryRune + default: + if follow[1] >= 'a' && follow[1] <= 'z' || follow[1] >= 'A' && follow[1] <= 'Z' { + return l.errorf("unknown number base: %s. possible options are x (hex) o (octal) b (binary)", string(follow[1])) + } + } + + if isValidRune != nil { + l.next() + l.next() + digitSeen := false + for { + next := l.peek() + if !isValidRune(next) { + break + } + digitSeen = true + l.next() + } + + if !digitSeen { + return l.errorf("number needs at least one digit") + } + + l.emit(tokenInteger) + + return l.lexRvalue + } + } + } + + if r == '+' || r == '-' { + l.next() + if l.follow("inf") { + return l.lexInf + } + if l.follow("nan") { + return l.lexNan + } + } + + pointSeen := false + expSeen := false + digitSeen := false + for { + next := l.peek() + if next == '.' { + if pointSeen { + return l.errorf("cannot have two dots in one float") + } + l.next() + if !isDigit(l.peek()) { + return l.errorf("float cannot end with a dot") + } + pointSeen = true + } else if next == 'e' || next == 'E' { + expSeen = true + l.next() + r := l.peek() + if r == '+' || r == '-' { + l.next() + } + } else if isDigit(next) { + digitSeen = true + l.next() + } else if next == '_' { + l.next() + } else { + break + } + if pointSeen && !digitSeen { + return l.errorf("cannot start float with a dot") + } + } + + if !digitSeen { + return l.errorf("no digit in that number") + } + if pointSeen || expSeen { + l.emit(tokenFloat) + } else { + l.emit(tokenInteger) + } + return l.lexRvalue +} + +func (l *tomlLexer) run() { + for state := l.lexVoid; state != nil; { + state = state() + } +} + +// Entry point +func lexToml(inputBytes []byte) []token { + runes := bytes.Runes(inputBytes) + l := &tomlLexer{ + input: runes, + tokens: make([]token, 0, 256), + line: 1, + col: 1, + endbufferLine: 1, + endbufferCol: 1, + } + l.run() + return l.tokens +} diff --git a/vendor/github.com/pelletier/go-toml/localtime.go b/vendor/github.com/pelletier/go-toml/localtime.go new file mode 100644 index 000000000..9dfe4b9e6 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/localtime.go @@ -0,0 +1,287 @@ +// Implementation of TOML's local date/time. +// +// Copied over from Google's civil to avoid pulling all the Google dependencies. +// Originals: +// https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil.go +// Changes: +// * Renamed files from civil* to localtime*. +// * Package changed from civil to toml. +// * 'Local' prefix added to all structs. +// +// Copyright 2016 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package civil implements types for civil time, a time-zone-independent +// representation of time that follows the rules of the proleptic +// Gregorian calendar with exactly 24-hour days, 60-minute hours, and 60-second +// minutes. +// +// Because they lack location information, these types do not represent unique +// moments or intervals of time. Use time.Time for that purpose. +package toml + +import ( + "fmt" + "time" +) + +// A LocalDate represents a date (year, month, day). +// +// This type does not include location information, and therefore does not +// describe a unique 24-hour timespan. +type LocalDate struct { + Year int // Year (e.g., 2014). + Month time.Month // Month of the year (January = 1, ...). + Day int // Day of the month, starting at 1. +} + +// LocalDateOf returns the LocalDate in which a time occurs in that time's location. +func LocalDateOf(t time.Time) LocalDate { + var d LocalDate + d.Year, d.Month, d.Day = t.Date() + return d +} + +// ParseLocalDate parses a string in RFC3339 full-date format and returns the date value it represents. +func ParseLocalDate(s string) (LocalDate, error) { + t, err := time.Parse("2006-01-02", s) + if err != nil { + return LocalDate{}, err + } + return LocalDateOf(t), nil +} + +// String returns the date in RFC3339 full-date format. +func (d LocalDate) String() string { + return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day) +} + +// IsValid reports whether the date is valid. +func (d LocalDate) IsValid() bool { + return LocalDateOf(d.In(time.UTC)) == d +} + +// In returns the time corresponding to time 00:00:00 of the date in the location. +// +// In is always consistent with time.LocalDate, even when time.LocalDate returns a time +// on a different day. For example, if loc is America/Indiana/Vincennes, then both +// time.LocalDate(1955, time.May, 1, 0, 0, 0, 0, loc) +// and +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}.In(loc) +// return 23:00:00 on April 30, 1955. +// +// In panics if loc is nil. +func (d LocalDate) In(loc *time.Location) time.Time { + return time.Date(d.Year, d.Month, d.Day, 0, 0, 0, 0, loc) +} + +// AddDays returns the date that is n days in the future. +// n can also be negative to go into the past. +func (d LocalDate) AddDays(n int) LocalDate { + return LocalDateOf(d.In(time.UTC).AddDate(0, 0, n)) +} + +// DaysSince returns the signed number of days between the date and s, not including the end day. +// This is the inverse operation to AddDays. +func (d LocalDate) DaysSince(s LocalDate) (days int) { + // We convert to Unix time so we do not have to worry about leap seconds: + // Unix time increases by exactly 86400 seconds per day. + deltaUnix := d.In(time.UTC).Unix() - s.In(time.UTC).Unix() + return int(deltaUnix / 86400) +} + +// Before reports whether d1 occurs before d2. +func (d1 LocalDate) Before(d2 LocalDate) bool { + if d1.Year != d2.Year { + return d1.Year < d2.Year + } + if d1.Month != d2.Month { + return d1.Month < d2.Month + } + return d1.Day < d2.Day +} + +// After reports whether d1 occurs after d2. +func (d1 LocalDate) After(d2 LocalDate) bool { + return d2.Before(d1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of d.String(). +func (d LocalDate) MarshalText() ([]byte, error) { + return []byte(d.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The date is expected to be a string in a format accepted by ParseLocalDate. +func (d *LocalDate) UnmarshalText(data []byte) error { + var err error + *d, err = ParseLocalDate(string(data)) + return err +} + +// A LocalTime represents a time with nanosecond precision. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +// +// This type exists to represent the TIME type in storage-based APIs like BigQuery. +// Most operations on Times are unlikely to be meaningful. Prefer the LocalDateTime type. +type LocalTime struct { + Hour int // The hour of the day in 24-hour format; range [0-23] + Minute int // The minute of the hour; range [0-59] + Second int // The second of the minute; range [0-59] + Nanosecond int // The nanosecond of the second; range [0-999999999] +} + +// LocalTimeOf returns the LocalTime representing the time of day in which a time occurs +// in that time's location. It ignores the date. +func LocalTimeOf(t time.Time) LocalTime { + var tm LocalTime + tm.Hour, tm.Minute, tm.Second = t.Clock() + tm.Nanosecond = t.Nanosecond() + return tm +} + +// ParseLocalTime parses a string and returns the time value it represents. +// ParseLocalTime accepts an extended form of the RFC3339 partial-time format. After +// the HH:MM:SS part of the string, an optional fractional part may appear, +// consisting of a decimal point followed by one to nine decimal digits. +// (RFC3339 admits only one digit after the decimal point). +func ParseLocalTime(s string) (LocalTime, error) { + t, err := time.Parse("15:04:05.999999999", s) + if err != nil { + return LocalTime{}, err + } + return LocalTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalTime. If Nanoseconds +// is zero, no fractional part will be generated. Otherwise, the result will +// end with a fractional part consisting of a decimal point and nine digits. +func (t LocalTime) String() string { + s := fmt.Sprintf("%02d:%02d:%02d", t.Hour, t.Minute, t.Second) + if t.Nanosecond == 0 { + return s + } + return s + fmt.Sprintf(".%09d", t.Nanosecond) +} + +// IsValid reports whether the time is valid. +func (t LocalTime) IsValid() bool { + // Construct a non-zero time. + tm := time.Date(2, 2, 2, t.Hour, t.Minute, t.Second, t.Nanosecond, time.UTC) + return LocalTimeOf(tm) == t +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of t.String(). +func (t LocalTime) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The time is expected to be a string in a format accepted by ParseLocalTime. +func (t *LocalTime) UnmarshalText(data []byte) error { + var err error + *t, err = ParseLocalTime(string(data)) + return err +} + +// A LocalDateTime represents a date and time. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +type LocalDateTime struct { + Date LocalDate + Time LocalTime +} + +// Note: We deliberately do not embed LocalDate into LocalDateTime, to avoid promoting AddDays and Sub. + +// LocalDateTimeOf returns the LocalDateTime in which a time occurs in that time's location. +func LocalDateTimeOf(t time.Time) LocalDateTime { + return LocalDateTime{ + Date: LocalDateOf(t), + Time: LocalTimeOf(t), + } +} + +// ParseLocalDateTime parses a string and returns the LocalDateTime it represents. +// ParseLocalDateTime accepts a variant of the RFC3339 date-time format that omits +// the time offset but includes an optional fractional time, as described in +// ParseLocalTime. Informally, the accepted format is +// YYYY-MM-DDTHH:MM:SS[.FFFFFFFFF] +// where the 'T' may be a lower-case 't'. +func ParseLocalDateTime(s string) (LocalDateTime, error) { + t, err := time.Parse("2006-01-02T15:04:05.999999999", s) + if err != nil { + t, err = time.Parse("2006-01-02t15:04:05.999999999", s) + if err != nil { + return LocalDateTime{}, err + } + } + return LocalDateTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalDate. +func (dt LocalDateTime) String() string { + return dt.Date.String() + "T" + dt.Time.String() +} + +// IsValid reports whether the datetime is valid. +func (dt LocalDateTime) IsValid() bool { + return dt.Date.IsValid() && dt.Time.IsValid() +} + +// In returns the time corresponding to the LocalDateTime in the given location. +// +// If the time is missing or ambigous at the location, In returns the same +// result as time.LocalDate. For example, if loc is America/Indiana/Vincennes, then +// both +// time.LocalDate(1955, time.May, 1, 0, 30, 0, 0, loc) +// and +// civil.LocalDateTime{ +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}}, +// civil.LocalTime{Minute: 30}}.In(loc) +// return 23:30:00 on April 30, 1955. +// +// In panics if loc is nil. +func (dt LocalDateTime) In(loc *time.Location) time.Time { + return time.Date(dt.Date.Year, dt.Date.Month, dt.Date.Day, dt.Time.Hour, dt.Time.Minute, dt.Time.Second, dt.Time.Nanosecond, loc) +} + +// Before reports whether dt1 occurs before dt2. +func (dt1 LocalDateTime) Before(dt2 LocalDateTime) bool { + return dt1.In(time.UTC).Before(dt2.In(time.UTC)) +} + +// After reports whether dt1 occurs after dt2. +func (dt1 LocalDateTime) After(dt2 LocalDateTime) bool { + return dt2.Before(dt1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of dt.String(). +func (dt LocalDateTime) MarshalText() ([]byte, error) { + return []byte(dt.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The datetime is expected to be a string in a format accepted by ParseLocalDateTime +func (dt *LocalDateTime) UnmarshalText(data []byte) error { + var err error + *dt, err = ParseLocalDateTime(string(data)) + return err +} diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go new file mode 100644 index 000000000..571273049 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -0,0 +1,1308 @@ +package toml + +import ( + "bytes" + "encoding" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +const ( + tagFieldName = "toml" + tagFieldComment = "comment" + tagCommented = "commented" + tagMultiline = "multiline" + tagLiteral = "literal" + tagDefault = "default" +) + +type tomlOpts struct { + name string + nameFromTag bool + comment string + commented bool + multiline bool + literal bool + include bool + omitempty bool + defaultValue string +} + +type encOpts struct { + quoteMapKeys bool + arraysOneElementPerLine bool +} + +var encOptsDefaults = encOpts{ + quoteMapKeys: false, +} + +type annotation struct { + tag string + comment string + commented string + multiline string + literal string + defaultValue string +} + +var annotationDefault = annotation{ + tag: tagFieldName, + comment: tagFieldComment, + commented: tagCommented, + multiline: tagMultiline, + literal: tagLiteral, + defaultValue: tagDefault, +} + +type MarshalOrder int + +// Orders the Encoder can write the fields to the output stream. +const ( + // Sort fields alphabetically. + OrderAlphabetical MarshalOrder = iota + 1 + // Preserve the order the fields are encountered. For example, the order of fields in + // a struct. + OrderPreserve +) + +var timeType = reflect.TypeOf(time.Time{}) +var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() +var unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem() +var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem() +var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem() +var localDateType = reflect.TypeOf(LocalDate{}) +var localTimeType = reflect.TypeOf(LocalTime{}) +var localDateTimeType = reflect.TypeOf(LocalDateTime{}) +var mapStringInterfaceType = reflect.TypeOf(map[string]interface{}{}) + +// Check if the given marshal type maps to a Tree primitive +func isPrimitive(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isPrimitive(mtype.Elem()) + case reflect.Bool: + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Struct: + return isTimeType(mtype) + default: + return false + } +} + +func isTimeType(mtype reflect.Type) bool { + return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType +} + +// Check if the given marshal type maps to a Tree slice or array +func isTreeSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTreeSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTree(mtype.Elem()) + default: + return false + } +} + +// Check if the given marshal type maps to a slice or array of a custom marshaler type +func isCustomMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isCustomMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isCustomMarshaler(mtype.Elem()) || isCustomMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a slice or array of a text marshaler type +func isTextMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTextMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTextMarshaler(mtype.Elem()) || isTextMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a non-Tree slice or array +func isOtherSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return !isTreeSequence(mtype) + default: + return false + } +} + +// Check if the given marshal type maps to a Tree +func isTree(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTree(mtype.Elem()) + case reflect.Map: + return true + case reflect.Struct: + return !isPrimitive(mtype) + default: + return false + } +} + +func isCustomMarshaler(mtype reflect.Type) bool { + return mtype.Implements(marshalerType) +} + +func callCustomMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(Marshaler).MarshalTOML() +} + +func isTextMarshaler(mtype reflect.Type) bool { + return mtype.Implements(textMarshalerType) && !isTimeType(mtype) +} + +func callTextMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(encoding.TextMarshaler).MarshalText() +} + +func isCustomUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(unmarshalerType) +} + +func callCustomUnmarshaler(mval reflect.Value, tval interface{}) error { + return mval.Interface().(Unmarshaler).UnmarshalTOML(tval) +} + +func isTextUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(textUnmarshalerType) +} + +func callTextUnmarshaler(mval reflect.Value, text []byte) error { + return mval.Interface().(encoding.TextUnmarshaler).UnmarshalText(text) +} + +// Marshaler is the interface implemented by types that +// can marshal themselves into valid TOML. +type Marshaler interface { + MarshalTOML() ([]byte, error) +} + +// Unmarshaler is the interface implemented by types that +// can unmarshal a TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + +/* +Marshal returns the TOML encoding of v. Behavior is similar to the Go json +encoder, except that there is no concept of a Marshaler interface or MarshalTOML +function for sub-structs, and currently only definite types can be marshaled +(i.e. no `interface{}`). + +The following struct annotations are supported: + + toml:"Field" Overrides the field's name to output. + omitempty When set, empty values and groups are not emitted. + comment:"comment" Emits a # comment on the same line. This supports new lines. + commented:"true" Emits the value as commented. + +Note that pointers are automatically assigned the "omitempty" option, as TOML +explicitly does not handle null values (saying instead the label should be +dropped). + +Tree structural types and corresponding marshal types: + + *Tree (*)struct, (*)map[string]interface{} + []*Tree (*)[](*)struct, (*)[](*)map[string]interface{} + []interface{} (as interface{}) (*)[]primitive, (*)[]([]interface{}) + interface{} (*)primitive + +Tree primitive types and corresponding marshal types: + + uint64 uint, uint8-uint64, pointers to same + int64 int, int8-uint64, pointers to same + float64 float32, float64, pointers to same + string string, pointers to same + bool bool, pointers to same + time.LocalTime time.LocalTime{}, pointers to same + +For additional flexibility, use the Encoder API. +*/ +func Marshal(v interface{}) ([]byte, error) { + return NewEncoder(nil).marshal(v) +} + +// Encoder writes TOML values to an output stream. +type Encoder struct { + w io.Writer + encOpts + annotation + line int + col int + order MarshalOrder + promoteAnon bool + compactComments bool + indentation string +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + encOpts: encOptsDefaults, + annotation: annotationDefault, + line: 0, + col: 1, + order: OrderAlphabetical, + indentation: " ", + } +} + +// Encode writes the TOML encoding of v to the stream. +// +// See the documentation for Marshal for details. +func (e *Encoder) Encode(v interface{}) error { + b, err := e.marshal(v) + if err != nil { + return err + } + if _, err := e.w.Write(b); err != nil { + return err + } + return nil +} + +// QuoteMapKeys sets up the encoder to encode +// maps with string type keys with quoted TOML keys. +// +// This relieves the character limitations on map keys. +func (e *Encoder) QuoteMapKeys(v bool) *Encoder { + e.quoteMapKeys = v + return e +} + +// ArraysWithOneElementPerLine sets up the encoder to encode arrays +// with more than one element on multiple lines instead of one. +// +// For example: +// +// A = [1,2,3] +// +// Becomes +// +// A = [ +// 1, +// 2, +// 3, +// ] +func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder { + e.arraysOneElementPerLine = v + return e +} + +// Order allows to change in which order fields will be written to the output stream. +func (e *Encoder) Order(ord MarshalOrder) *Encoder { + e.order = ord + return e +} + +// Indentation allows to change indentation when marshalling. +func (e *Encoder) Indentation(indent string) *Encoder { + e.indentation = indent + return e +} + +// SetTagName allows changing default tag "toml" +func (e *Encoder) SetTagName(v string) *Encoder { + e.tag = v + return e +} + +// SetTagComment allows changing default tag "comment" +func (e *Encoder) SetTagComment(v string) *Encoder { + e.comment = v + return e +} + +// SetTagCommented allows changing default tag "commented" +func (e *Encoder) SetTagCommented(v string) *Encoder { + e.commented = v + return e +} + +// SetTagMultiline allows changing default tag "multiline" +func (e *Encoder) SetTagMultiline(v string) *Encoder { + e.multiline = v + return e +} + +// PromoteAnonymous allows to change how anonymous struct fields are marshaled. +// Usually, they are marshaled as if the inner exported fields were fields in +// the outer struct. However, if an anonymous struct field is given a name in +// its TOML tag, it is treated like a regular struct field with that name. +// rather than being anonymous. +// +// In case anonymous promotion is enabled, all anonymous structs are promoted +// and treated like regular struct fields. +func (e *Encoder) PromoteAnonymous(promote bool) *Encoder { + e.promoteAnon = promote + return e +} + +// CompactComments removes the new line before each comment in the tree. +func (e *Encoder) CompactComments(cc bool) *Encoder { + e.compactComments = cc + return e +} + +func (e *Encoder) marshal(v interface{}) ([]byte, error) { + // Check if indentation is valid + for _, char := range e.indentation { + if !isSpace(char) { + return []byte{}, fmt.Errorf("invalid indentation: must only contains space or tab characters") + } + } + + mtype := reflect.TypeOf(v) + if mtype == nil { + return []byte{}, errors.New("nil cannot be marshaled to TOML") + } + + switch mtype.Kind() { + case reflect.Struct, reflect.Map: + case reflect.Ptr: + if mtype.Elem().Kind() != reflect.Struct { + return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML") + } + if reflect.ValueOf(v).IsNil() { + return []byte{}, errors.New("nil pointer cannot be marshaled to TOML") + } + default: + return []byte{}, errors.New("Only a struct or map can be marshaled to TOML") + } + + sval := reflect.ValueOf(v) + if isCustomMarshaler(mtype) { + return callCustomMarshaler(sval) + } + if isTextMarshaler(mtype) { + return callTextMarshaler(sval) + } + t, err := e.valueToTree(mtype, sval) + if err != nil { + return []byte{}, err + } + + var buf bytes.Buffer + _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, e.indentation, e.compactComments, false) + + return buf.Bytes(), err +} + +// Create next tree with a position based on Encoder.line +func (e *Encoder) nextTree() *Tree { + return newTreeWithPosition(Position{Line: e.line, Col: 1}) +} + +// Convert given marshal struct or map value to toml tree +func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToTree(mtype.Elem(), mval.Elem()) + } + tval := e.nextTree() + switch mtype.Kind() { + case reflect.Struct: + switch mval.Interface().(type) { + case Tree: + reflect.ValueOf(tval).Elem().Set(mval) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef, e.annotation) + if opts.include && ((mtypef.Type.Kind() != reflect.Interface && !opts.omitempty) || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + if tree, ok := val.(*Tree); ok && mtypef.Anonymous && !opts.nameFromTag && !e.promoteAnon { + e.appendTree(tval, tree) + } else { + val = e.wrapTomlValue(val, tval) + tval.SetPathWithOptions([]string{opts.name}, SetOptions{ + Comment: opts.comment, + Commented: opts.commented, + Multiline: opts.multiline, + Literal: opts.literal, + }, val) + } + } + } + } + case reflect.Map: + keys := mval.MapKeys() + if e.order == OrderPreserve && len(keys) > 0 { + // Sorting []reflect.Value is not straight forward. + // + // OrderPreserve will support deterministic results when string is used + // as the key to maps. + typ := keys[0].Type() + kind := keys[0].Kind() + if kind == reflect.String { + ikeys := make([]string, len(keys)) + for i := range keys { + ikeys[i] = keys[i].Interface().(string) + } + sort.Strings(ikeys) + for i := range ikeys { + keys[i] = reflect.ValueOf(ikeys[i]).Convert(typ) + } + } + } + for _, key := range keys { + mvalf := mval.MapIndex(key) + if (mtype.Elem().Kind() == reflect.Ptr || mtype.Elem().Kind() == reflect.Interface) && mvalf.IsNil() { + continue + } + val, err := e.valueToToml(mtype.Elem(), mvalf) + if err != nil { + return nil, err + } + val = e.wrapTomlValue(val, tval) + if e.quoteMapKeys { + keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.order, e.arraysOneElementPerLine) + if err != nil { + return nil, err + } + tval.SetPath([]string{keyStr}, val) + } else { + tval.SetPath([]string{key.String()}, val) + } + } + } + return tval, nil +} + +// Convert given marshal slice to slice of Toml trees +func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*Tree, error) { + tval := make([]*Tree, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToTree(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal slice to slice of toml values +func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + tval := make([]interface{}, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToToml(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal value to toml value +func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + if mtype.Kind() == reflect.Ptr { + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + b, err := callTextMarshaler(mval) + return string(b), err + default: + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + } + if mtype.Kind() == reflect.Interface { + return e.valueToToml(mval.Elem().Type(), mval.Elem()) + } + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + b, err := callTextMarshaler(mval) + return string(b), err + case isTree(mtype): + return e.valueToTree(mtype, mval) + case isOtherSequence(mtype), isCustomMarshalerSequence(mtype), isTextMarshalerSequence(mtype): + return e.valueToOtherSlice(mtype, mval) + case isTreeSequence(mtype): + return e.valueToTreeSlice(mtype, mval) + default: + switch mtype.Kind() { + case reflect.Bool: + return mval.Bool(), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if mtype.Kind() == reflect.Int64 && mtype == reflect.TypeOf(time.Duration(1)) { + return fmt.Sprint(mval), nil + } + return mval.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return mval.Uint(), nil + case reflect.Float32, reflect.Float64: + return mval.Float(), nil + case reflect.String: + return mval.String(), nil + case reflect.Struct: + return mval.Interface(), nil + default: + return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) + } + } +} + +func (e *Encoder) appendTree(t, o *Tree) error { + for key, value := range o.values { + if _, ok := t.values[key]; ok { + continue + } + if tomlValue, ok := value.(*tomlValue); ok { + tomlValue.position.Col = t.position.Col + } + t.values[key] = value + } + return nil +} + +// Create a toml value with the current line number as the position line +func (e *Encoder) wrapTomlValue(val interface{}, parent *Tree) interface{} { + _, isTree := val.(*Tree) + _, isTreeS := val.([]*Tree) + if isTree || isTreeS { + e.line++ + return val + } + + ret := &tomlValue{ + value: val, + position: Position{ + e.line, + parent.position.Col, + }, + } + e.line++ + return ret +} + +// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. +// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for +// sub-structs, and only definite types can be unmarshaled. +func (t *Tree) Unmarshal(v interface{}) error { + d := Decoder{tval: t, tagName: tagFieldName} + return d.unmarshal(v) +} + +// Marshal returns the TOML encoding of Tree. +// See Marshal() documentation for types mapping table. +func (t *Tree) Marshal() ([]byte, error) { + var buf bytes.Buffer + _, err := t.WriteTo(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// Unmarshal parses the TOML-encoded data and stores the result in the value +// pointed to by v. Behavior is similar to the Go json encoder, except that there +// is no concept of an Unmarshaler interface or UnmarshalTOML function for +// sub-structs, and currently only definite types can be unmarshaled to (i.e. no +// `interface{}`). +// +// The following struct annotations are supported: +// +// toml:"Field" Overrides the field's name to map to. +// default:"foo" Provides a default value. +// +// For default values, only fields of the following types are supported: +// * string +// * bool +// * int +// * int64 +// * float64 +// +// See Marshal() documentation for types mapping table. +func Unmarshal(data []byte, v interface{}) error { + t, err := LoadReader(bytes.NewReader(data)) + if err != nil { + return err + } + return t.Unmarshal(v) +} + +// Decoder reads and decodes TOML values from an input stream. +type Decoder struct { + r io.Reader + tval *Tree + encOpts + tagName string + strict bool + visitor visitorState +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + r: r, + encOpts: encOptsDefaults, + tagName: tagFieldName, + } +} + +// Decode reads a TOML-encoded value from it's input +// and unmarshals it in the value pointed at by v. +// +// See the documentation for Marshal for details. +func (d *Decoder) Decode(v interface{}) error { + var err error + d.tval, err = LoadReader(d.r) + if err != nil { + return err + } + return d.unmarshal(v) +} + +// SetTagName allows changing default tag "toml" +func (d *Decoder) SetTagName(v string) *Decoder { + d.tagName = v + return d +} + +// Strict allows changing to strict decoding. Any fields that are found in the +// input data and do not have a corresponding struct member cause an error. +func (d *Decoder) Strict(strict bool) *Decoder { + d.strict = strict + return d +} + +func (d *Decoder) unmarshal(v interface{}) error { + mtype := reflect.TypeOf(v) + if mtype == nil { + return errors.New("nil cannot be unmarshaled from TOML") + } + if mtype.Kind() != reflect.Ptr { + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") + } + + elem := mtype.Elem() + + switch elem.Kind() { + case reflect.Struct, reflect.Map: + case reflect.Interface: + elem = mapStringInterfaceType + default: + return errors.New("only a pointer to struct or map can be unmarshaled from TOML") + } + + if reflect.ValueOf(v).IsNil() { + return errors.New("nil pointer cannot be unmarshaled from TOML") + } + + vv := reflect.ValueOf(v).Elem() + + if d.strict { + d.visitor = newVisitorState(d.tval) + } + + sval, err := d.valueFromTree(elem, d.tval, &vv) + if err != nil { + return err + } + if err := d.visitor.validate(); err != nil { + return err + } + reflect.ValueOf(v).Elem().Set(sval) + return nil +} + +// Convert toml tree to marshal struct or map, using marshal type. When mval1 +// is non-nil, merge fields into the given value instead of allocating a new one. +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.Value) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval, mval1) + } + + // Check if pointer to value implements the Unmarshaler interface. + if mvalPtr := reflect.New(mtype); isCustomUnmarshaler(mvalPtr.Type()) { + d.visitor.visitAll() + + if tval == nil { + return mvalPtr.Elem(), nil + } + + if err := callCustomUnmarshaler(mvalPtr, tval.ToMap()); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err) + } + return mvalPtr.Elem(), nil + } + + var mval reflect.Value + switch mtype.Kind() { + case reflect.Struct: + if mval1 != nil { + mval = *mval1 + } else { + mval = reflect.New(mtype).Elem() + } + + switch mval.Interface().(type) { + case Tree: + mval.Set(reflect.ValueOf(tval).Elem()) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + an := annotation{tag: d.tagName} + opts := tomlOptions(mtypef, an) + if !opts.include { + continue + } + baseKey := opts.name + keysToTry := []string{ + baseKey, + strings.ToLower(baseKey), + strings.ToTitle(baseKey), + strings.ToLower(string(baseKey[0])) + baseKey[1:], + } + + found := false + if tval != nil { + for _, key := range keysToTry { + exists := tval.HasPath([]string{key}) + if !exists { + continue + } + + d.visitor.push(key) + val := tval.GetPath([]string{key}) + fval := mval.Field(i) + mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) + if err != nil { + return mval, formatError(err, tval.GetPositionPath([]string{key})) + } + mval.Field(i).Set(mvalf) + found = true + d.visitor.pop() + break + } + } + + if !found && opts.defaultValue != "" { + mvalf := mval.Field(i) + var val interface{} + var err error + switch mvalf.Kind() { + case reflect.String: + val = opts.defaultValue + case reflect.Bool: + val, err = strconv.ParseBool(opts.defaultValue) + case reflect.Uint: + val, err = strconv.ParseUint(opts.defaultValue, 10, 0) + case reflect.Uint8: + val, err = strconv.ParseUint(opts.defaultValue, 10, 8) + case reflect.Uint16: + val, err = strconv.ParseUint(opts.defaultValue, 10, 16) + case reflect.Uint32: + val, err = strconv.ParseUint(opts.defaultValue, 10, 32) + case reflect.Uint64: + val, err = strconv.ParseUint(opts.defaultValue, 10, 64) + case reflect.Int: + val, err = strconv.ParseInt(opts.defaultValue, 10, 0) + case reflect.Int8: + val, err = strconv.ParseInt(opts.defaultValue, 10, 8) + case reflect.Int16: + val, err = strconv.ParseInt(opts.defaultValue, 10, 16) + case reflect.Int32: + val, err = strconv.ParseInt(opts.defaultValue, 10, 32) + case reflect.Int64: + // Check if the provided number has a non-numeric extension. + var hasExtension bool + if len(opts.defaultValue) > 0 { + lastChar := opts.defaultValue[len(opts.defaultValue)-1] + if lastChar < '0' || lastChar > '9' { + hasExtension = true + } + } + // If the value is a time.Duration with extension, parse as duration. + // If the value is an int64 or a time.Duration without extension, parse as number. + if hasExtension && mvalf.Type().String() == "time.Duration" { + val, err = time.ParseDuration(opts.defaultValue) + } else { + val, err = strconv.ParseInt(opts.defaultValue, 10, 64) + } + case reflect.Float32: + val, err = strconv.ParseFloat(opts.defaultValue, 32) + case reflect.Float64: + val, err = strconv.ParseFloat(opts.defaultValue, 64) + default: + return mvalf, fmt.Errorf("unsupported field type for default option") + } + + if err != nil { + return mvalf, err + } + mvalf.Set(reflect.ValueOf(val).Convert(mvalf.Type())) + } + + // save the old behavior above and try to check structs + if !found && opts.defaultValue == "" && mtypef.Type.Kind() == reflect.Struct { + tmpTval := tval + if !mtypef.Anonymous { + tmpTval = nil + } + fval := mval.Field(i) + v, err := d.valueFromTree(mtypef.Type, tmpTval, &fval) + if err != nil { + return v, err + } + mval.Field(i).Set(v) + } + } + } + case reflect.Map: + mval = reflect.MakeMap(mtype) + for _, key := range tval.Keys() { + d.visitor.push(key) + // TODO: path splits key + val := tval.GetPath([]string{key}) + mvalf, err := d.valueFromToml(mtype.Elem(), val, nil) + if err != nil { + return mval, formatError(err, tval.GetPositionPath([]string{key})) + } + mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) + d.visitor.pop() + } + } + return mval, nil +} + +// Convert toml value to marshal struct/map slice, using marshal type +func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + + for i := 0; i < len(tval); i++ { + d.visitor.push(strconv.Itoa(i)) + val, err := d.valueFromTree(mtype.Elem(), tval[i], nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + d.visitor.pop() + } + return mval, nil +} + +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + + for i := 0; i < len(tval); i++ { + val, err := d.valueFromToml(mtype.Elem(), tval[i], nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSliceI(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val := reflect.ValueOf(tval) + length := val.Len() + + mval, err := makeSliceOrArray(mtype, length) + if err != nil { + return mval, err + } + + for i := 0; i < length; i++ { + val, err := d.valueFromToml(mtype.Elem(), val.Index(i).Interface(), nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Create a new slice or a new array with specified length +func makeSliceOrArray(mtype reflect.Type, tLength int) (reflect.Value, error) { + var mval reflect.Value + switch mtype.Kind() { + case reflect.Slice: + mval = reflect.MakeSlice(mtype, tLength, tLength) + case reflect.Array: + mval = reflect.New(reflect.ArrayOf(mtype.Len(), mtype.Elem())).Elem() + if tLength > mtype.Len() { + return mval, fmt.Errorf("unmarshal: TOML array length (%v) exceeds destination array length (%v)", tLength, mtype.Len()) + } + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type. When mval1 is non-nil +// and the given type is a struct value, merge fields into it. +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval, mval1) + } + + switch t := tval.(type) { + case *Tree: + var mval11 *reflect.Value + if mtype.Kind() == reflect.Struct { + mval11 = mval1 + } + + if isTree(mtype) { + return d.valueFromTree(mtype, t, mval11) + } + + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTree(reflect.TypeOf(map[string]interface{}{}), t, nil) + } else { + return d.valueFromToml(mval1.Elem().Type(), t, nil) + } + } + + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) + case []*Tree: + if isTreeSequence(mtype) { + return d.valueFromTreeSlice(mtype, t) + } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTreeSlice(reflect.TypeOf([]map[string]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) + case []interface{}: + d.visitor.visit() + if isOtherSequence(mtype) { + return d.valueFromOtherSlice(mtype, t) + } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromOtherSlice(reflect.TypeOf([]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) + default: + d.visitor.visit() + mvalPtr := reflect.New(mtype) + + // Check if pointer to value implements the Unmarshaler interface. + if isCustomUnmarshaler(mvalPtr.Type()) { + if err := callCustomUnmarshaler(mvalPtr, tval); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err) + } + return mvalPtr.Elem(), nil + } + + // Check if pointer to value implements the encoding.TextUnmarshaler. + if isTextUnmarshaler(mvalPtr.Type()) && !isTimeType(mtype) { + if err := d.unmarshalText(tval, mvalPtr); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal text: %v", err) + } + return mvalPtr.Elem(), nil + } + + switch mtype.Kind() { + case reflect.Bool, reflect.Struct: + val := reflect.ValueOf(tval) + + switch val.Type() { + case localDateType: + localDate := val.Interface().(LocalDate) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date(localDate.Year, localDate.Month, localDate.Day, 0, 0, 0, 0, time.Local)), nil + } + case localDateTimeType: + localDateTime := val.Interface().(LocalDateTime) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date( + localDateTime.Date.Year, + localDateTime.Date.Month, + localDateTime.Date.Day, + localDateTime.Time.Hour, + localDateTime.Time.Minute, + localDateTime.Time.Second, + localDateTime.Time.Nanosecond, + time.Local)), nil + } + } + + // if this passes for when mtype is reflect.Struct, tval is a time.LocalTime + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.String: + val := reflect.ValueOf(tval) + // stupidly, int64 is convertible to string. So special case this. + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + val := reflect.ValueOf(tval) + if mtype.Kind() == reflect.Int64 && mtype == reflect.TypeOf(time.Duration(1)) && val.Kind() == reflect.String { + d, err := time.ParseDuration(val.String()) + if err != nil { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v. %s", tval, tval, mtype.String(), err) + } + return reflect.ValueOf(d), nil + } + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(reflect.TypeOf(int64(0))).Int()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + if val.Type().Kind() != reflect.Uint64 && val.Convert(reflect.TypeOf(int(1))).Int() < 0 { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowUint(val.Convert(reflect.TypeOf(uint64(0))).Uint()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Float32, reflect.Float64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(reflect.TypeOf(float64(0))).Float()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Interface: + if mval1 == nil || mval1.IsNil() { + return reflect.ValueOf(tval), nil + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + case reflect.Slice, reflect.Array: + if isOtherSequence(mtype) && isOtherSequence(reflect.TypeOf(t)) { + return d.valueFromOtherSliceI(mtype, t) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) + default: + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) + } + } +} + +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { + var melem *reflect.Value + + if mval1 != nil && !mval1.IsNil() && (mtype.Elem().Kind() == reflect.Struct || mtype.Elem().Kind() == reflect.Interface) { + elem := mval1.Elem() + melem = &elem + } + + val, err := d.valueFromToml(mtype.Elem(), tval, melem) + if err != nil { + return reflect.ValueOf(nil), err + } + mval := reflect.New(mtype.Elem()) + mval.Elem().Set(val) + return mval, nil +} + +func (d *Decoder) unmarshalText(tval interface{}, mval reflect.Value) error { + var buf bytes.Buffer + fmt.Fprint(&buf, tval) + return callTextUnmarshaler(mval, buf.Bytes()) +} + +func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { + tag := vf.Tag.Get(an.tag) + parse := strings.Split(tag, ",") + var comment string + if c := vf.Tag.Get(an.comment); c != "" { + comment = c + } + commented, _ := strconv.ParseBool(vf.Tag.Get(an.commented)) + multiline, _ := strconv.ParseBool(vf.Tag.Get(an.multiline)) + literal, _ := strconv.ParseBool(vf.Tag.Get(an.literal)) + defaultValue := vf.Tag.Get(tagDefault) + result := tomlOpts{ + name: vf.Name, + nameFromTag: false, + comment: comment, + commented: commented, + multiline: multiline, + literal: literal, + include: true, + omitempty: false, + defaultValue: defaultValue, + } + if parse[0] != "" { + if parse[0] == "-" && len(parse) == 1 { + result.include = false + } else { + result.name = strings.Trim(parse[0], " ") + result.nameFromTag = true + } + } + if vf.PkgPath != "" { + result.include = false + } + if len(parse) > 1 && strings.Trim(parse[1], " ") == "omitempty" { + result.omitempty = true + } + if vf.Type.Kind() == reflect.Ptr { + result.omitempty = true + } + return result +} + +func isZero(val reflect.Value) bool { + switch val.Type().Kind() { + case reflect.Slice, reflect.Array, reflect.Map: + return val.Len() == 0 + default: + return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) + } +} + +func formatError(err error, pos Position) error { + if err.Error()[0] == '(' { // Error already contains position information + return err + } + return fmt.Errorf("%s: %s", pos, err) +} + +// visitorState keeps track of which keys were unmarshaled. +type visitorState struct { + tree *Tree + path []string + keys map[string]struct{} + active bool +} + +func newVisitorState(tree *Tree) visitorState { + path, result := []string{}, map[string]struct{}{} + insertKeys(path, result, tree) + return visitorState{ + tree: tree, + path: path[:0], + keys: result, + active: true, + } +} + +func (s *visitorState) push(key string) { + if s.active { + s.path = append(s.path, key) + } +} + +func (s *visitorState) pop() { + if s.active { + s.path = s.path[:len(s.path)-1] + } +} + +func (s *visitorState) visit() { + if s.active { + delete(s.keys, strings.Join(s.path, ".")) + } +} + +func (s *visitorState) visitAll() { + if s.active { + for k := range s.keys { + if strings.HasPrefix(k, strings.Join(s.path, ".")) { + delete(s.keys, k) + } + } + } +} + +func (s *visitorState) validate() error { + if !s.active { + return nil + } + undecoded := make([]string, 0, len(s.keys)) + for key := range s.keys { + undecoded = append(undecoded, key) + } + sort.Strings(undecoded) + if len(undecoded) > 0 { + return fmt.Errorf("undecoded keys: %q", undecoded) + } + return nil +} + +func insertKeys(path []string, m map[string]struct{}, tree *Tree) { + for k, v := range tree.values { + switch node := v.(type) { + case []*Tree: + for i, item := range node { + insertKeys(append(path, k, strconv.Itoa(i)), m, item) + } + case *Tree: + insertKeys(append(path, k), m, node) + case *tomlValue: + m[strings.Join(append(path, k), ".")] = struct{}{} + } + } +} diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml new file mode 100644 index 000000000..792b72ed7 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml @@ -0,0 +1,39 @@ +title = "TOML Marshal Testing" + +[basic_lists] + floats = [12.3,45.6,78.9] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + ints = [8001,8001,8002] + uints = [5002,5003] + strings = ["One","Two","Three"] + +[[subdocptrs]] + name = "Second" + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.second] + name = "Second" + + [subdoc.first] + name = "First" + +[basic] + uint = 5001 + bool = true + float = 123.4 + float64 = 123.456782132399 + int = 5000 + string = "Bite me" + date = 1979-05-27T07:32:00Z + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml new file mode 100644 index 000000000..ba5e110bf --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -0,0 +1,39 @@ +title = "TOML Marshal Testing" + +[basic] + bool = true + date = 1979-05-27T07:32:00Z + float = 123.4 + float64 = 123.456782132399 + int = 5000 + string = "Bite me" + uint = 5001 + +[basic_lists] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + floats = [12.3,45.6,78.9] + ints = [8001,8001,8002] + strings = ["One","Two","Three"] + uints = [5002,5003] + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.first] + name = "First" + + [subdoc.second] + name = "Second" + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" + +[[subdocptrs]] + name = "Second" diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go new file mode 100644 index 000000000..b3726d0dd --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -0,0 +1,507 @@ +// TOML Parser. + +package toml + +import ( + "errors" + "fmt" + "math" + "reflect" + "strconv" + "strings" + "time" +) + +type tomlParser struct { + flowIdx int + flow []token + tree *Tree + currentTable []string + seenTableKeys []string +} + +type tomlParserStateFn func() tomlParserStateFn + +// Formats and panics an error message based on a token +func (p *tomlParser) raiseError(tok *token, msg string, args ...interface{}) { + panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...)) +} + +func (p *tomlParser) run() { + for state := p.parseStart; state != nil; { + state = state() + } +} + +func (p *tomlParser) peek() *token { + if p.flowIdx >= len(p.flow) { + return nil + } + return &p.flow[p.flowIdx] +} + +func (p *tomlParser) assume(typ tokenType) { + tok := p.getToken() + if tok == nil { + p.raiseError(tok, "was expecting token %s, but token stream is empty", tok) + } + if tok.typ != typ { + p.raiseError(tok, "was expecting token %s, but got %s instead", typ, tok) + } +} + +func (p *tomlParser) getToken() *token { + tok := p.peek() + if tok == nil { + return nil + } + p.flowIdx++ + return tok +} + +func (p *tomlParser) parseStart() tomlParserStateFn { + tok := p.peek() + + // end of stream, parsing is finished + if tok == nil { + return nil + } + + switch tok.typ { + case tokenDoubleLeftBracket: + return p.parseGroupArray + case tokenLeftBracket: + return p.parseGroup + case tokenKey: + return p.parseAssign + case tokenEOF: + return nil + case tokenError: + p.raiseError(tok, "parsing error: %s", tok.String()) + default: + p.raiseError(tok, "unexpected token %s", tok.typ) + } + return nil +} + +func (p *tomlParser) parseGroupArray() tomlParserStateFn { + startToken := p.getToken() // discard the [[ + key := p.getToken() + if key.typ != tokenKeyGroupArray { + p.raiseError(key, "unexpected token %s, was expecting a table array key", key) + } + + // get or create table array element at the indicated part in the path + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + p.tree.createSubTree(keys[:len(keys)-1], startToken.Position) // create parent entries + destTree := p.tree.GetPath(keys) + var array []*Tree + if destTree == nil { + array = make([]*Tree, 0) + } else if target, ok := destTree.([]*Tree); ok && target != nil { + array = destTree.([]*Tree) + } else { + p.raiseError(key, "key %s is already assigned and not of type table array", key) + } + p.currentTable = keys + + // add a new tree to the end of the table array + newTree := newTree() + newTree.position = startToken.Position + array = append(array, newTree) + p.tree.SetPath(p.currentTable, array) + + // remove all keys that were children of this table array + prefix := key.val + "." + found := false + for ii := 0; ii < len(p.seenTableKeys); { + tableKey := p.seenTableKeys[ii] + if strings.HasPrefix(tableKey, prefix) { + p.seenTableKeys = append(p.seenTableKeys[:ii], p.seenTableKeys[ii+1:]...) + } else { + found = (tableKey == key.val) + ii++ + } + } + + // keep this key name from use by other kinds of assignments + if !found { + p.seenTableKeys = append(p.seenTableKeys, key.val) + } + + // move to next parser state + p.assume(tokenDoubleRightBracket) + return p.parseStart +} + +func (p *tomlParser) parseGroup() tomlParserStateFn { + startToken := p.getToken() // discard the [ + key := p.getToken() + if key.typ != tokenKeyGroup { + p.raiseError(key, "unexpected token %s, was expecting a table key", key) + } + for _, item := range p.seenTableKeys { + if item == key.val { + p.raiseError(key, "duplicated tables") + } + } + + p.seenTableKeys = append(p.seenTableKeys, key.val) + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + if err := p.tree.createSubTree(keys, startToken.Position); err != nil { + p.raiseError(key, "%s", err) + } + destTree := p.tree.GetPath(keys) + if target, ok := destTree.(*Tree); ok && target != nil && target.inline { + p.raiseError(key, "could not re-define exist inline table or its sub-table : %s", + strings.Join(keys, ".")) + } + p.assume(tokenRightBracket) + p.currentTable = keys + return p.parseStart +} + +func (p *tomlParser) parseAssign() tomlParserStateFn { + key := p.getToken() + p.assume(tokenEqual) + + parsedKey, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid key: %s", err.Error()) + } + + value := p.parseRvalue() + var tableKey []string + if len(p.currentTable) > 0 { + tableKey = p.currentTable + } else { + tableKey = []string{} + } + + prefixKey := parsedKey[0 : len(parsedKey)-1] + tableKey = append(tableKey, prefixKey...) + + // find the table to assign, looking out for arrays of tables + var targetNode *Tree + switch node := p.tree.GetPath(tableKey).(type) { + case []*Tree: + targetNode = node[len(node)-1] + case *Tree: + targetNode = node + case nil: + // create intermediate + if err := p.tree.createSubTree(tableKey, key.Position); err != nil { + p.raiseError(key, "could not create intermediate group: %s", err) + } + targetNode = p.tree.GetPath(tableKey).(*Tree) + default: + p.raiseError(key, "Unknown table type for path: %s", + strings.Join(tableKey, ".")) + } + + if targetNode.inline { + p.raiseError(key, "could not add key or sub-table to exist inline table or its sub-table : %s", + strings.Join(tableKey, ".")) + } + + // assign value to the found table + keyVal := parsedKey[len(parsedKey)-1] + localKey := []string{keyVal} + finalKey := append(tableKey, keyVal) + if targetNode.GetPath(localKey) != nil { + p.raiseError(key, "The following key was defined twice: %s", + strings.Join(finalKey, ".")) + } + var toInsert interface{} + + switch value.(type) { + case *Tree, []*Tree: + toInsert = value + default: + toInsert = &tomlValue{value: value, position: key.Position} + } + targetNode.values[keyVal] = toInsert + return p.parseStart +} + +var errInvalidUnderscore = errors.New("invalid use of _ in number") + +func numberContainsInvalidUnderscore(value string) error { + // For large numbers, you may use underscores between digits to enhance + // readability. Each underscore must be surrounded by at least one digit on + // each side. + + hasBefore := false + for idx, r := range value { + if r == '_' { + if !hasBefore || idx+1 >= len(value) { + // can't end with an underscore + return errInvalidUnderscore + } + } + hasBefore = isDigit(r) + } + return nil +} + +var errInvalidUnderscoreHex = errors.New("invalid use of _ in hex number") + +func hexNumberContainsInvalidUnderscore(value string) error { + hasBefore := false + for idx, r := range value { + if r == '_' { + if !hasBefore || idx+1 >= len(value) { + // can't end with an underscore + return errInvalidUnderscoreHex + } + } + hasBefore = isHexDigit(r) + } + return nil +} + +func cleanupNumberToken(value string) string { + cleanedVal := strings.Replace(value, "_", "", -1) + return cleanedVal +} + +func (p *tomlParser) parseRvalue() interface{} { + tok := p.getToken() + if tok == nil || tok.typ == tokenEOF { + p.raiseError(tok, "expecting a value") + } + + switch tok.typ { + case tokenString: + return tok.val + case tokenTrue: + return true + case tokenFalse: + return false + case tokenInf: + if tok.val[0] == '-' { + return math.Inf(-1) + } + return math.Inf(1) + case tokenNan: + return math.NaN() + case tokenInteger: + cleanedVal := cleanupNumberToken(tok.val) + base := 10 + s := cleanedVal + checkInvalidUnderscore := numberContainsInvalidUnderscore + if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { + switch cleanedVal[1] { + case 'x': + checkInvalidUnderscore = hexNumberContainsInvalidUnderscore + base = 16 + case 'o': + base = 8 + case 'b': + base = 2 + default: + panic("invalid base") // the lexer should catch this first + } + s = cleanedVal[2:] + } + + err := checkInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + + var val interface{} + val, err = strconv.ParseInt(s, base, 64) + if err == nil { + return val + } + + if s[0] != '-' { + if val, err = strconv.ParseUint(s, base, 64); err == nil { + return val + } + } + p.raiseError(tok, "%s", err) + case tokenFloat: + err := numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + cleanedVal := cleanupNumberToken(tok.val) + val, err := strconv.ParseFloat(cleanedVal, 64) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLocalTime: + val, err := ParseLocalTime(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLocalDate: + // a local date may be followed by: + // * nothing: this is a local date + // * a local time: this is a local date-time + + next := p.peek() + if next == nil || next.typ != tokenLocalTime { + val, err := ParseLocalDate(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + } + + localDate := tok + localTime := p.getToken() + + next = p.peek() + if next == nil || next.typ != tokenTimeOffset { + v := localDate.val + "T" + localTime.val + val, err := ParseLocalDateTime(v) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + } + + offset := p.getToken() + + layout := time.RFC3339Nano + v := localDate.val + "T" + localTime.val + offset.val + val, err := time.ParseInLocation(layout, v, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLeftBracket: + return p.parseArray() + case tokenLeftCurlyBrace: + return p.parseInlineTable() + case tokenEqual: + p.raiseError(tok, "cannot have multiple equals for the same key") + case tokenError: + p.raiseError(tok, "%s", tok) + default: + panic(fmt.Errorf("unhandled token: %v", tok)) + } + + return nil +} + +func tokenIsComma(t *token) bool { + return t != nil && t.typ == tokenComma +} + +func (p *tomlParser) parseInlineTable() *Tree { + tree := newTree() + var previous *token +Loop: + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated inline table") + } + switch follow.typ { + case tokenRightCurlyBrace: + p.getToken() + break Loop + case tokenKey, tokenInteger, tokenString: + if !tokenIsComma(previous) && previous != nil { + p.raiseError(follow, "comma expected between fields in inline table") + } + key := p.getToken() + p.assume(tokenEqual) + + parsedKey, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid key: %s", err) + } + + value := p.parseRvalue() + tree.SetPath(parsedKey, value) + case tokenComma: + if tokenIsComma(previous) { + p.raiseError(follow, "need field between two commas in inline table") + } + p.getToken() + default: + p.raiseError(follow, "unexpected token type in inline table: %s", follow.String()) + } + previous = follow + } + if tokenIsComma(previous) { + p.raiseError(previous, "trailing comma at the end of inline table") + } + tree.inline = true + return tree +} + +func (p *tomlParser) parseArray() interface{} { + var array []interface{} + arrayType := reflect.TypeOf(newTree()) + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ == tokenRightBracket { + p.getToken() + break + } + val := p.parseRvalue() + if reflect.TypeOf(val) != arrayType { + arrayType = nil + } + array = append(array, val) + follow = p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ != tokenRightBracket && follow.typ != tokenComma { + p.raiseError(follow, "missing comma") + } + if follow.typ == tokenComma { + p.getToken() + } + } + + // if the array is a mixed-type array or its length is 0, + // don't convert it to a table array + if len(array) <= 0 { + arrayType = nil + } + // An array of Trees is actually an array of inline + // tables, which is a shorthand for a table array. If the + // array was not converted from []interface{} to []*Tree, + // the two notations would not be equivalent. + if arrayType == reflect.TypeOf(newTree()) { + tomlArray := make([]*Tree, len(array)) + for i, v := range array { + tomlArray[i] = v.(*Tree) + } + return tomlArray + } + return array +} + +func parseToml(flow []token) *Tree { + result := newTree() + result.position = Position{1, 1} + parser := &tomlParser{ + flowIdx: 0, + flow: flow, + tree: result, + currentTable: make([]string, 0), + seenTableKeys: make([]string, 0), + } + parser.run() + return result +} diff --git a/vendor/github.com/pelletier/go-toml/position.go b/vendor/github.com/pelletier/go-toml/position.go new file mode 100644 index 000000000..c17bff87b --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/position.go @@ -0,0 +1,29 @@ +// Position support for go-toml + +package toml + +import ( + "fmt" +) + +// Position of a document element within a TOML document. +// +// Line and Col are both 1-indexed positions for the element's line number and +// column number, respectively. Values of zero or less will cause Invalid(), +// to return true. +type Position struct { + Line int // line within the document + Col int // column within the line +} + +// String representation of the position. +// Displays 1-indexed line and column numbers. +func (p Position) String() string { + return fmt.Sprintf("(%d, %d)", p.Line, p.Col) +} + +// Invalid returns whether or not the position is valid (i.e. with negative or +// null values) +func (p Position) Invalid() bool { + return p.Line <= 0 || p.Col <= 0 +} diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go new file mode 100644 index 000000000..b437fdd3b --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/token.go @@ -0,0 +1,136 @@ +package toml + +import "fmt" + +// Define tokens +type tokenType int + +const ( + eof = -(iota + 1) +) + +const ( + tokenError tokenType = iota + tokenEOF + tokenComment + tokenKey + tokenString + tokenInteger + tokenTrue + tokenFalse + tokenFloat + tokenInf + tokenNan + tokenEqual + tokenLeftBracket + tokenRightBracket + tokenLeftCurlyBrace + tokenRightCurlyBrace + tokenLeftParen + tokenRightParen + tokenDoubleLeftBracket + tokenDoubleRightBracket + tokenLocalDate + tokenLocalTime + tokenTimeOffset + tokenKeyGroup + tokenKeyGroupArray + tokenComma + tokenColon + tokenDollar + tokenStar + tokenQuestion + tokenDot + tokenDotDot + tokenEOL +) + +var tokenTypeNames = []string{ + "Error", + "EOF", + "Comment", + "Key", + "String", + "Integer", + "True", + "False", + "Float", + "Inf", + "NaN", + "=", + "[", + "]", + "{", + "}", + "(", + ")", + "]]", + "[[", + "LocalDate", + "LocalTime", + "TimeOffset", + "KeyGroup", + "KeyGroupArray", + ",", + ":", + "$", + "*", + "?", + ".", + "..", + "EOL", +} + +type token struct { + Position + typ tokenType + val string +} + +func (tt tokenType) String() string { + idx := int(tt) + if idx < len(tokenTypeNames) { + return tokenTypeNames[idx] + } + return "Unknown" +} + +func (t token) String() string { + switch t.typ { + case tokenEOF: + return "EOF" + case tokenError: + return t.val + } + + return fmt.Sprintf("%q", t.val) +} + +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +func isAlphanumeric(r rune) bool { + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_' +} + +func isKeyChar(r rune) bool { + // Keys start with the first character that isn't whitespace or [ and end + // with the last non-whitespace character before the equals sign. Keys + // cannot contain a # character." + return !(r == '\r' || r == '\n' || r == eof || r == '=') +} + +func isKeyStartChar(r rune) bool { + return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[') +} + +func isDigit(r rune) bool { + return '0' <= r && r <= '9' +} + +func isHexDigit(r rune) bool { + return isDigit(r) || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go new file mode 100644 index 000000000..5541b941f --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -0,0 +1,533 @@ +package toml + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "strings" +) + +type tomlValue struct { + value interface{} // string, int64, uint64, float64, bool, time.Time, [] of any of this list + comment string + commented bool + multiline bool + literal bool + position Position +} + +// Tree is the result of the parsing of a TOML file. +type Tree struct { + values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree + comment string + commented bool + inline bool + position Position +} + +func newTree() *Tree { + return newTreeWithPosition(Position{}) +} + +func newTreeWithPosition(pos Position) *Tree { + return &Tree{ + values: make(map[string]interface{}), + position: pos, + } +} + +// TreeFromMap initializes a new Tree object using the given map. +func TreeFromMap(m map[string]interface{}) (*Tree, error) { + result, err := toTree(m) + if err != nil { + return nil, err + } + return result.(*Tree), nil +} + +// Position returns the position of the tree. +func (t *Tree) Position() Position { + return t.position +} + +// Has returns a boolean indicating if the given key exists. +func (t *Tree) Has(key string) bool { + if key == "" { + return false + } + return t.HasPath(strings.Split(key, ".")) +} + +// HasPath returns true if the given path of keys exists, false otherwise. +func (t *Tree) HasPath(keys []string) bool { + return t.GetPath(keys) != nil +} + +// Keys returns the keys of the toplevel tree (does not recurse). +func (t *Tree) Keys() []string { + keys := make([]string, len(t.values)) + i := 0 + for k := range t.values { + keys[i] = k + i++ + } + return keys +} + +// Get the value at key in the Tree. +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// If you need to retrieve non-bare keys, use GetPath. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) Get(key string) interface{} { + if key == "" { + return t + } + return t.GetPath(strings.Split(key, ".")) +} + +// GetPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.value + default: + return node + } +} + +// GetArray returns the value at key in the Tree. +// It returns []string, []int64, etc type if key has homogeneous lists +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetArray(key string) interface{} { + if key == "" { + return t + } + return t.GetArrayPath(strings.Split(key, ".")) +} + +// GetArrayPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetArrayPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + switch n := node.value.(type) { + case []interface{}: + return getArray(n) + default: + return node.value + } + default: + return node + } +} + +// if homogeneous array, then return slice type object over []interface{} +func getArray(n []interface{}) interface{} { + var s []string + var i64 []int64 + var f64 []float64 + var bl []bool + for _, value := range n { + switch v := value.(type) { + case string: + s = append(s, v) + case int64: + i64 = append(i64, v) + case float64: + f64 = append(f64, v) + case bool: + bl = append(bl, v) + default: + return n + } + } + if len(s) == len(n) { + return s + } else if len(i64) == len(n) { + return i64 + } else if len(f64) == len(n) { + return f64 + } else if len(bl) == len(n) { + return bl + } + return n +} + +// GetPosition returns the position of the given key. +func (t *Tree) GetPosition(key string) Position { + if key == "" { + return t.position + } + return t.GetPositionPath(strings.Split(key, ".")) +} + +// SetPositionPath sets the position of element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree position is set. +func (t *Tree) SetPositionPath(keys []string, pos Position) { + if len(keys) == 0 { + t.position = pos + return + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return + } + subtree = node[len(node)-1] + default: + return + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + node.position = pos + return + case *Tree: + node.position = pos + return + case []*Tree: + // go to most recent element + if len(node) == 0 { + return + } + node[len(node)-1].position = pos + return + } +} + +// GetPositionPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPositionPath(keys []string) Position { + if len(keys) == 0 { + return t.position + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return Position{0, 0} + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + subtree = node[len(node)-1] + default: + return Position{0, 0} + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.position + case *Tree: + return node.position + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + return node[len(node)-1].position + default: + return Position{0, 0} + } +} + +// GetDefault works like Get but with a default value +func (t *Tree) GetDefault(key string, def interface{}) interface{} { + val := t.Get(key) + if val == nil { + return def + } + return val +} + +// SetOptions arguments are supplied to the SetWithOptions and SetPathWithOptions functions to modify marshalling behaviour. +// The default values within the struct are valid default options. +type SetOptions struct { + Comment string + Commented bool + Multiline bool + Literal bool +} + +// SetWithOptions is the same as Set, but allows you to provide formatting +// instructions to the key, that will be used by Marshal(). +func (t *Tree) SetWithOptions(key string, opts SetOptions, value interface{}) { + t.SetPathWithOptions(strings.Split(key, "."), opts, value) +} + +// SetPathWithOptions is the same as SetPath, but allows you to provide +// formatting instructions to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interface{}) { + subtree := t + for i, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + nextTree = newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) + subtree.values[intermediateKey] = nextTree // add new element here + } + switch node := nextTree.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + // create element if it does not exist + node = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})) + subtree.values[intermediateKey] = node + } + subtree = node[len(node)-1] + } + } + + var toInsert interface{} + + switch v := value.(type) { + case *Tree: + v.comment = opts.Comment + v.commented = opts.Commented + toInsert = value + case []*Tree: + for i := range v { + v[i].commented = opts.Commented + } + toInsert = value + case *tomlValue: + v.comment = opts.Comment + v.commented = opts.Commented + v.multiline = opts.Multiline + v.literal = opts.Literal + toInsert = v + default: + toInsert = &tomlValue{value: value, + comment: opts.Comment, + commented: opts.Commented, + multiline: opts.Multiline, + literal: opts.Literal, + position: Position{Line: subtree.position.Line + len(subtree.values) + 1, Col: subtree.position.Col}} + } + + subtree.values[keys[len(keys)-1]] = toInsert +} + +// Set an element in the tree. +// Key is a dot-separated path (e.g. a.b.c). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) Set(key string, value interface{}) { + t.SetWithComment(key, "", false, value) +} + +// SetWithComment is the same as Set, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetWithComment(key string, comment string, commented bool, value interface{}) { + t.SetPathWithComment(strings.Split(key, "."), comment, commented, value) +} + +// SetPath sets an element in the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) SetPath(keys []string, value interface{}) { + t.SetPathWithComment(keys, "", false, value) +} + +// SetPathWithComment is the same as SetPath, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) { + t.SetPathWithOptions(keys, SetOptions{Comment: comment, Commented: commented}, value) +} + +// Delete removes a key from the tree. +// Key is a dot-separated path (e.g. a.b.c). +func (t *Tree) Delete(key string) error { + keys, err := parseKey(key) + if err != nil { + return err + } + return t.DeletePath(keys) +} + +// DeletePath removes a key from the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +func (t *Tree) DeletePath(keys []string) error { + keyLen := len(keys) + if keyLen == 1 { + delete(t.values, keys[0]) + return nil + } + tree := t.GetPath(keys[:keyLen-1]) + item := keys[keyLen-1] + switch node := tree.(type) { + case *Tree: + delete(node.values, item) + return nil + } + return errors.New("no such key to delete") +} + +// createSubTree takes a tree and a key and create the necessary intermediate +// subtrees to create a subtree at that point. In-place. +// +// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b] +// and tree[a][b][c] +// +// Returns nil on success, error object on failure +func (t *Tree) createSubTree(keys []string, pos Position) error { + subtree := t + for i, intermediateKey := range keys { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) + tree.position = pos + tree.inline = subtree.inline + subtree.values[intermediateKey] = tree + nextTree = tree + } + + switch node := nextTree.(type) { + case []*Tree: + subtree = node[len(node)-1] + case *Tree: + subtree = node + default: + return fmt.Errorf("unknown type for path %s (%s): %T (%#v)", + strings.Join(keys, "."), intermediateKey, nextTree, nextTree) + } + } + return nil +} + +// LoadBytes creates a Tree from a []byte. +func LoadBytes(b []byte) (tree *Tree, err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + err = fmt.Errorf("%s", r) + } + }() + + if len(b) >= 4 && (hasUTF32BigEndianBOM4(b) || hasUTF32LittleEndianBOM4(b)) { + b = b[4:] + } else if len(b) >= 3 && hasUTF8BOM3(b) { + b = b[3:] + } else if len(b) >= 2 && (hasUTF16BigEndianBOM2(b) || hasUTF16LittleEndianBOM2(b)) { + b = b[2:] + } + + tree = parseToml(lexToml(b)) + return +} + +func hasUTF16BigEndianBOM2(b []byte) bool { + return b[0] == 0xFE && b[1] == 0xFF +} + +func hasUTF16LittleEndianBOM2(b []byte) bool { + return b[0] == 0xFF && b[1] == 0xFE +} + +func hasUTF8BOM3(b []byte) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +func hasUTF32BigEndianBOM4(b []byte) bool { + return b[0] == 0x00 && b[1] == 0x00 && b[2] == 0xFE && b[3] == 0xFF +} + +func hasUTF32LittleEndianBOM4(b []byte) bool { + return b[0] == 0xFF && b[1] == 0xFE && b[2] == 0x00 && b[3] == 0x00 +} + +// LoadReader creates a Tree from any io.Reader. +func LoadReader(reader io.Reader) (tree *Tree, err error) { + inputBytes, err := ioutil.ReadAll(reader) + if err != nil { + return + } + tree, err = LoadBytes(inputBytes) + return +} + +// Load creates a Tree from a string. +func Load(content string) (tree *Tree, err error) { + return LoadBytes([]byte(content)) +} + +// LoadFile creates a Tree from a file. +func LoadFile(path string) (tree *Tree, err error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + return LoadReader(file) +} diff --git a/vendor/github.com/pelletier/go-toml/tomlpub.go b/vendor/github.com/pelletier/go-toml/tomlpub.go new file mode 100644 index 000000000..4136b4625 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomlpub.go @@ -0,0 +1,71 @@ +package toml + +// PubTOMLValue wrapping tomlValue in order to access all properties from outside. +type PubTOMLValue = tomlValue + +func (ptv *PubTOMLValue) Value() interface{} { + return ptv.value +} +func (ptv *PubTOMLValue) Comment() string { + return ptv.comment +} +func (ptv *PubTOMLValue) Commented() bool { + return ptv.commented +} +func (ptv *PubTOMLValue) Multiline() bool { + return ptv.multiline +} +func (ptv *PubTOMLValue) Position() Position { + return ptv.position +} + +func (ptv *PubTOMLValue) SetValue(v interface{}) { + ptv.value = v +} +func (ptv *PubTOMLValue) SetComment(s string) { + ptv.comment = s +} +func (ptv *PubTOMLValue) SetCommented(c bool) { + ptv.commented = c +} +func (ptv *PubTOMLValue) SetMultiline(m bool) { + ptv.multiline = m +} +func (ptv *PubTOMLValue) SetPosition(p Position) { + ptv.position = p +} + +// PubTree wrapping Tree in order to access all properties from outside. +type PubTree = Tree + +func (pt *PubTree) Values() map[string]interface{} { + return pt.values +} + +func (pt *PubTree) Comment() string { + return pt.comment +} + +func (pt *PubTree) Commented() bool { + return pt.commented +} + +func (pt *PubTree) Inline() bool { + return pt.inline +} + +func (pt *PubTree) SetValues(v map[string]interface{}) { + pt.values = v +} + +func (pt *PubTree) SetComment(c string) { + pt.comment = c +} + +func (pt *PubTree) SetCommented(c bool) { + pt.commented = c +} + +func (pt *PubTree) SetInline(i bool) { + pt.inline = i +} diff --git a/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/pelletier/go-toml/tomltree_create.go new file mode 100644 index 000000000..80353500a --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomltree_create.go @@ -0,0 +1,155 @@ +package toml + +import ( + "fmt" + "reflect" + "time" +) + +var kindToType = [reflect.String + 1]reflect.Type{ + reflect.Bool: reflect.TypeOf(true), + reflect.String: reflect.TypeOf(""), + reflect.Float32: reflect.TypeOf(float64(1)), + reflect.Float64: reflect.TypeOf(float64(1)), + reflect.Int: reflect.TypeOf(int64(1)), + reflect.Int8: reflect.TypeOf(int64(1)), + reflect.Int16: reflect.TypeOf(int64(1)), + reflect.Int32: reflect.TypeOf(int64(1)), + reflect.Int64: reflect.TypeOf(int64(1)), + reflect.Uint: reflect.TypeOf(uint64(1)), + reflect.Uint8: reflect.TypeOf(uint64(1)), + reflect.Uint16: reflect.TypeOf(uint64(1)), + reflect.Uint32: reflect.TypeOf(uint64(1)), + reflect.Uint64: reflect.TypeOf(uint64(1)), +} + +// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found. +// supported values: +// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32 +func typeFor(k reflect.Kind) reflect.Type { + if k > 0 && int(k) < len(kindToType) { + return kindToType[k] + } + return nil +} + +func simpleValueCoercion(object interface{}) (interface{}, error) { + switch original := object.(type) { + case string, bool, int64, uint64, float64, time.Time: + return original, nil + case int: + return int64(original), nil + case int8: + return int64(original), nil + case int16: + return int64(original), nil + case int32: + return int64(original), nil + case uint: + return uint64(original), nil + case uint8: + return uint64(original), nil + case uint16: + return uint64(original), nil + case uint32: + return uint64(original), nil + case float32: + return float64(original), nil + case fmt.Stringer: + return original.String(), nil + case []interface{}: + value := reflect.ValueOf(original) + length := value.Len() + arrayValue := reflect.MakeSlice(value.Type(), 0, length) + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return arrayValue.Interface(), nil + default: + return nil, fmt.Errorf("cannot convert type %T to Tree", object) + } +} + +func sliceToTree(object interface{}) (interface{}, error) { + // arrays are a bit tricky, since they can represent either a + // collection of simple values, which is represented by one + // *tomlValue, or an array of tables, which is represented by an + // array of *Tree. + + // holding the assumption that this function is called from toTree only when value.Kind() is Array or Slice + value := reflect.ValueOf(object) + insideType := value.Type().Elem() + length := value.Len() + if length > 0 { + insideType = reflect.ValueOf(value.Index(0).Interface()).Type() + } + if insideType.Kind() == reflect.Map { + // this is considered as an array of tables + tablesArray := make([]*Tree, 0, length) + for i := 0; i < length; i++ { + table := value.Index(i) + tree, err := toTree(table.Interface()) + if err != nil { + return nil, err + } + tablesArray = append(tablesArray, tree.(*Tree)) + } + return tablesArray, nil + } + + sliceType := typeFor(insideType.Kind()) + if sliceType == nil { + sliceType = insideType + } + + arrayValue := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, length) + + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return &tomlValue{value: arrayValue.Interface(), position: Position{}}, nil +} + +func toTree(object interface{}) (interface{}, error) { + value := reflect.ValueOf(object) + + if value.Kind() == reflect.Map { + values := map[string]interface{}{} + keys := value.MapKeys() + for _, key := range keys { + if key.Kind() != reflect.String { + if _, ok := key.Interface().(string); !ok { + return nil, fmt.Errorf("map key needs to be a string, not %T (%v)", key.Interface(), key.Kind()) + } + } + + v := value.MapIndex(key) + newValue, err := toTree(v.Interface()) + if err != nil { + return nil, err + } + values[key.String()] = newValue + } + return &Tree{values: values, position: Position{}}, nil + } + + if value.Kind() == reflect.Array || value.Kind() == reflect.Slice { + return sliceToTree(object) + } + + simpleValue, err := simpleValueCoercion(object) + if err != nil { + return nil, err + } + return &tomlValue{value: simpleValue, position: Position{}}, nil +} diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go new file mode 100644 index 000000000..c9afbdab7 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -0,0 +1,552 @@ +package toml + +import ( + "bytes" + "fmt" + "io" + "math" + "math/big" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +type valueComplexity int + +const ( + valueSimple valueComplexity = iota + 1 + valueComplex +) + +type sortNode struct { + key string + complexity valueComplexity +} + +// Encodes a string to a TOML-compliant multi-line string value +// This function is a clone of the existing encodeTomlString function, except that whitespace characters +// are preserved. Quotation marks and backslashes are also not escaped. +func encodeMultilineTomlString(value string, commented string) string { + var b bytes.Buffer + adjacentQuoteCount := 0 + + b.WriteString(commented) + for i, rr := range value { + if rr != '"' { + adjacentQuoteCount = 0 + } else { + adjacentQuoteCount++ + } + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString("\t") + case '\n': + b.WriteString("\n" + commented) + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString("\r") + case '"': + if adjacentQuoteCount >= 3 || i == len(value)-1 { + adjacentQuoteCount = 0 + b.WriteString(`\"`) + } else { + b.WriteString(`"`) + } + case '\\': + b.WriteString(`\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +// Encodes a string to a TOML-compliant string value +func encodeTomlString(value string) string { + var b bytes.Buffer + + for _, rr := range value { + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString(`\t`) + case '\n': + b.WriteString(`\n`) + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString(`\r`) + case '"': + b.WriteString(`\"`) + case '\\': + b.WriteString(`\\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +func tomlTreeStringRepresentation(t *Tree, ord MarshalOrder) (string, error) { + var orderedVals []sortNode + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + var values []string + for _, node := range orderedVals { + k := node.key + v := t.values[k] + + repr, err := tomlValueStringRepresentation(v, "", "", ord, false) + if err != nil { + return "", err + } + values = append(values, quoteKeyIfNeeded(k)+" = "+repr) + } + return "{ " + strings.Join(values, ", ") + " }", nil +} + +func tomlValueStringRepresentation(v interface{}, commented string, indent string, ord MarshalOrder, arraysOneElementPerLine bool) (string, error) { + // this interface check is added to dereference the change made in the writeTo function. + // That change was made to allow this function to see formatting options. + tv, ok := v.(*tomlValue) + if ok { + v = tv.value + } else { + tv = &tomlValue{} + } + + switch value := v.(type) { + case uint64: + return strconv.FormatUint(value, 10), nil + case int64: + return strconv.FormatInt(value, 10), nil + case float64: + // Default bit length is full 64 + bits := 64 + // Float panics if nan is used + if !math.IsNaN(value) { + // if 32 bit accuracy is enough to exactly show, use 32 + _, acc := big.NewFloat(value).Float32() + if acc == big.Exact { + bits = 32 + } + } + if math.Trunc(value) == value { + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, bits)), nil + } + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil + case string: + if tv.multiline { + if tv.literal { + b := strings.Builder{} + b.WriteString("'''\n") + b.Write([]byte(value)) + b.WriteString("\n'''") + return b.String(), nil + } else { + return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil + } + } + return "\"" + encodeTomlString(value) + "\"", nil + case []byte: + b, _ := v.([]byte) + return string(b), nil + case bool: + if value { + return "true", nil + } + return "false", nil + case time.Time: + return value.Format(time.RFC3339), nil + case LocalDate: + return value.String(), nil + case LocalDateTime: + return value.String(), nil + case LocalTime: + return value.String(), nil + case *Tree: + return tomlTreeStringRepresentation(value, ord) + case nil: + return "", nil + } + + rv := reflect.ValueOf(v) + + if rv.Kind() == reflect.Slice { + var values []string + for i := 0; i < rv.Len(); i++ { + item := rv.Index(i).Interface() + itemRepr, err := tomlValueStringRepresentation(item, commented, indent, ord, arraysOneElementPerLine) + if err != nil { + return "", err + } + values = append(values, itemRepr) + } + if arraysOneElementPerLine && len(values) > 1 { + stringBuffer := bytes.Buffer{} + valueIndent := indent + ` ` // TODO: move that to a shared encoder state + + stringBuffer.WriteString("[\n") + + for _, value := range values { + stringBuffer.WriteString(valueIndent) + stringBuffer.WriteString(commented + value) + stringBuffer.WriteString(`,`) + stringBuffer.WriteString("\n") + } + + stringBuffer.WriteString(indent + commented + "]") + + return stringBuffer.String(), nil + } + return "[" + strings.Join(values, ", ") + "]", nil + } + return "", fmt.Errorf("unsupported value type %T: %v", v, v) +} + +func getTreeArrayLine(trees []*Tree) (line int) { + // Prevent returning 0 for empty trees + line = int(^uint(0) >> 1) + // get lowest line number >= 0 + for _, tv := range trees { + if tv.position.Line < line || line == 0 { + line = tv.position.Line + } + } + return +} + +func sortByLines(t *Tree) (vals []sortNode) { + var ( + line int + lines []int + tv *Tree + tom *tomlValue + node sortNode + ) + vals = make([]sortNode, 0) + m := make(map[int]sortNode) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree: + tv = v.(*Tree) + line = tv.position.Line + node = sortNode{key: k, complexity: valueComplex} + case []*Tree: + line = getTreeArrayLine(v.([]*Tree)) + node = sortNode{key: k, complexity: valueComplex} + default: + tom = v.(*tomlValue) + line = tom.position.Line + node = sortNode{key: k, complexity: valueSimple} + } + lines = append(lines, line) + vals = append(vals, node) + m[line] = node + } + sort.Ints(lines) + + for i, line := range lines { + vals[i] = m[line] + } + + return vals +} + +func sortAlphabetical(t *Tree) (vals []sortNode) { + var ( + node sortNode + simpVals []string + compVals []string + ) + vals = make([]sortNode, 0) + m := make(map[string]sortNode) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree, []*Tree: + node = sortNode{key: k, complexity: valueComplex} + compVals = append(compVals, node.key) + default: + node = sortNode{key: k, complexity: valueSimple} + simpVals = append(simpVals, node.key) + } + vals = append(vals, node) + m[node.key] = node + } + + // Simples first to match previous implementation + sort.Strings(simpVals) + i := 0 + for _, key := range simpVals { + vals[i] = m[key] + i++ + } + + sort.Strings(compVals) + for _, key := range compVals { + vals[i] = m[key] + i++ + } + + return vals +} + +func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { + return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, " ", false, false) +} + +func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord MarshalOrder, indentString string, compactComments, parentCommented bool) (int64, error) { + var orderedVals []sortNode + + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + for _, node := range orderedVals { + switch node.complexity { + case valueComplex: + k := node.key + v := t.values[k] + + combinedKey := quoteKeyIfNeeded(k) + if keyspace != "" { + combinedKey = keyspace + "." + combinedKey + } + + switch node := v.(type) { + // node has to be of those two types given how keys are sorted above + case *Tree: + tv, ok := t.values[k].(*Tree) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + if tv.comment != "" { + comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + + var commented string + if parentCommented || t.commented || tv.commented { + commented = "# " + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + bytesCount, err = node.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, compactComments, parentCommented || t.commented || tv.commented) + if err != nil { + return bytesCount, err + } + case []*Tree: + for _, subTree := range node { + var commented string + if parentCommented || t.commented || subTree.commented { + commented = "# " + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + + bytesCount, err = subTree.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, compactComments, parentCommented || t.commented || subTree.commented) + if err != nil { + return bytesCount, err + } + } + } + default: // Simple + k := node.key + v, ok := t.values[k].(*tomlValue) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + + var commented string + if parentCommented || t.commented || v.commented { + commented = "# " + } + repr, err := tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + + if v.comment != "" { + comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + if !compactComments { + writtenBytesCountComment, errc := writeStrings(w, "\n") + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + writtenBytesCountComment, errc := writeStrings(w, indent, start, comment, "\n") + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + + quotedKey := quoteKeyIfNeeded(k) + writtenBytesCount, err := writeStrings(w, indent, commented, quotedKey, " = ", repr, "\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + } + } + + return bytesCount, nil +} + +// quote a key if it does not fit the bare key format (A-Za-z0-9_-) +// quoted keys use the same rules as strings +func quoteKeyIfNeeded(k string) string { + // when encoding a map with the 'quoteMapKeys' option enabled, the tree will contain + // keys that have already been quoted. + // not an ideal situation, but good enough of a stop gap. + if len(k) >= 2 && k[0] == '"' && k[len(k)-1] == '"' { + return k + } + isBare := true + for _, r := range k { + if !isValidBareChar(r) { + isBare = false + break + } + } + if isBare { + return k + } + return quoteKey(k) +} + +func quoteKey(k string) string { + return "\"" + encodeTomlString(k) + "\"" +} + +func writeStrings(w io.Writer, s ...string) (int, error) { + var n int + for i := range s { + b, err := io.WriteString(w, s[i]) + n += b + if err != nil { + return n, err + } + } + return n, nil +} + +// WriteTo encode the Tree as Toml and writes it to the writer w. +// Returns the number of bytes written in case of success, or an error if anything happened. +func (t *Tree) WriteTo(w io.Writer) (int64, error) { + return t.writeTo(w, "", "", 0, false) +} + +// ToTomlString generates a human-readable representation of the current tree. +// Output spans multiple lines, and is suitable for ingest by a TOML parser. +// If the conversion cannot be performed, ToString returns a non-nil error. +func (t *Tree) ToTomlString() (string, error) { + b, err := t.Marshal() + if err != nil { + return "", err + } + return string(b), nil +} + +// String generates a human-readable representation of the current tree. +// Alias of ToString. Present to implement the fmt.Stringer interface. +func (t *Tree) String() string { + result, _ := t.ToTomlString() + return result +} + +// ToMap recursively generates a representation of the tree using Go built-in structures. +// The following types are used: +// +// * bool +// * float64 +// * int64 +// * string +// * uint64 +// * time.Time +// * map[string]interface{} (where interface{} is any of this list) +// * []interface{} (where interface{} is any of this list) +func (t *Tree) ToMap() map[string]interface{} { + result := map[string]interface{}{} + + for k, v := range t.values { + switch node := v.(type) { + case []*Tree: + var array []interface{} + for _, item := range node { + array = append(array, item.ToMap()) + } + result[k] = array + case *Tree: + result[k] = node.ToMap() + case *tomlValue: + result[k] = tomlValueToGo(node.value) + } + } + return result +} + +func tomlValueToGo(v interface{}) interface{} { + if tree, ok := v.(*Tree); ok { + return tree.ToMap() + } + + rv := reflect.ValueOf(v) + + if rv.Kind() != reflect.Slice { + return v + } + values := make([]interface{}, rv.Len()) + for i := 0; i < rv.Len(); i++ { + item := rv.Index(i).Interface() + values[i] = tomlValueToGo(item) + } + return values +} diff --git a/vendor/github.com/pelletier/go-toml/tomltree_writepub.go b/vendor/github.com/pelletier/go-toml/tomltree_writepub.go new file mode 100644 index 000000000..fa326308c --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomltree_writepub.go @@ -0,0 +1,6 @@ +package toml + +// ValueStringRepresentation transforms an interface{} value into its toml string representation. +func ValueStringRepresentation(v interface{}, commented string, indent string, ord MarshalOrder, arraysOneElementPerLine bool) (string, error) { + return tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine) +} diff --git a/vendor/github.com/pion/dtls/v2/.editorconfig b/vendor/github.com/pion/dtls/v2/.editorconfig new file mode 100644 index 000000000..1dca00f8a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/.editorconfig @@ -0,0 +1,23 @@ +# http://editorconfig.org/ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +root = true + +[*] +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf + +[*.go] +indent_style = tab +indent_size = 4 + +[{*.yml,*.yaml}] +indent_style = space +indent_size = 2 + +# Makefiles always use tabs for indentation +[Makefile] +indent_style = tab diff --git a/vendor/github.com/pion/dtls/v2/.gitignore b/vendor/github.com/pion/dtls/v2/.gitignore new file mode 100644 index 000000000..6e2f206a9 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/.gitignore @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +### JetBrains IDE ### +##################### +.idea/ + +### Emacs Temporary Files ### +############################# +*~ + +### Folders ### +############### +bin/ +vendor/ +node_modules/ + +### Files ### +############# +*.ivf +*.ogg +tags +cover.out +*.sw[poe] +*.wasm +examples/sfu-ws/cert.pem +examples/sfu-ws/key.pem +wasm_exec.js diff --git a/vendor/github.com/pion/dtls/v2/.golangci.yml b/vendor/github.com/pion/dtls/v2/.golangci.yml new file mode 100644 index 000000000..40b3b63a8 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/.golangci.yml @@ -0,0 +1,140 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +linters-settings: + govet: + check-shadowing: true + misspell: + locale: US + exhaustive: + default-signifies-exhaustive: true + gomodguard: + blocked: + modules: + - github.com/pkg/errors: + recommendations: + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ + gomoddirectives: + replace-allow-list: + - github.com/pion/transport/v2 + +linters: + enable: + - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences + - bodyclose # checks whether HTTP response body is closed successfully + - contextcheck # check the function whether use a non-inherited context + - decorder # check declaration order and count of types, constants, variables and functions + - depguard # Go linter that checks if package imports are in a list of acceptable packages + - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted. + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - exhaustive # check exhaustiveness of enum switch statements + - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - forcetypeassert # finds forced type assertions + - gci # Gci control golang package import order and make it always deterministic. + - gochecknoglobals # Checks that no globals are present in Go code + - gochecknoinits # Checks that no init functions are present in Go code + - gocognit # Computes and checks the cognitive complexity of functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # The most opinionated Go source code linter + - godox # Tool for detection of FIXME, TODO and other comment keywords + - goerr113 # Golang linter to check the errors handling expressions + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + - gofumpt # Gofumpt checks whether code was gofumpt-ed. + - goheader # Checks is file header matches to pattern + - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. + - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. + - goprintffuncname # Checks that printf-like functions are named with `f` at the end + - gosec # Inspects source code for security problems + - gosimple # Linter for Go source code that specializes in simplifying a code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - grouper # An analyzer to analyze expression groups. + - importas # Enforces consistent import aliases + - ineffassign # Detects when assignments to existing variables are not used + - misspell # Finds commonly misspelled English words in comments + - nakedret # Finds naked returns in functions greater than a specified function length + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - predeclared # find code that shadows one of Go's predeclared identifiers + - revive # golint replacement, finds style mistakes + - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks + - stylecheck # Stylecheck is a replacement for golint + - tagliatelle # Checks the struct tags. + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - unconvert # Remove unnecessary type conversions + - unparam # Reports unused function parameters + - unused # Checks Go code for unused constants, variables, functions and types + - wastedassign # wastedassign finds wasted assignment statements + - whitespace # Tool for detection of leading and trailing whitespace + disable: + - containedctx # containedctx is a linter that detects struct contained context.Context field + - cyclop # checks function and package cyclomatic complexity + - exhaustivestruct # Checks if all struct's fields are initialized + - funlen # Tool for detection of long functions + - gocyclo # Computes and checks the cyclomatic complexity of functions + - godot # Check if comments end in a period + - gomnd # An analyzer to detect magic numbers. + - ifshort # Checks that your code uses short syntax for if-statements whenever possible + - ireturn # Accept Interfaces, Return Concrete Types + - lll # Reports long lines + - maintidx # maintidx measures the maintainability index of each function. + - makezero # Finds slice declarations with non-zero initial length + - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nestif # Reports deeply nested if statements + - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity + - nolintlint # Reports ill-formed or insufficient nolint directives + - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test + - prealloc # Finds slice declarations that could potentially be preallocated + - promlinter # Check Prometheus metrics naming via promlint + - rowserrcheck # checks whether Err of rows is checked successfully + - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. + - testpackage # linter that makes you use a separate _test package + - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # checks that the length of a variable's name matches its scope + - wrapcheck # Checks that errors returned from external packages are wrapped + - wsl # Whitespace Linter - Forces you to use empty lines! + +issues: + exclude-use-default: false + exclude-rules: + # Allow complex tests, better to be self contained + - path: _test\.go + linters: + - gocognit + - forbidigo + + # Allow complex main function in examples + - path: examples + text: "of func `main` is high" + linters: + - gocognit + + # Allow forbidden identifiers in examples + - path: examples + linters: + - forbidigo + + # Allow forbidden identifiers in CLI commands + - path: cmd + linters: + - forbidigo + +run: + skip-dirs-use-default: false diff --git a/vendor/github.com/pion/dtls/v2/.goreleaser.yml b/vendor/github.com/pion/dtls/v2/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/dtls/v2/AUTHORS.txt b/vendor/github.com/pion/dtls/v2/AUTHORS.txt new file mode 100644 index 000000000..e14fae4c0 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/AUTHORS.txt @@ -0,0 +1,57 @@ +# Thank you to everyone that made Pion possible. If you are interested in contributing +# we would love to have you https://github.com/pion/webrtc/wiki/Contributing +# +# This file is auto generated, using git to list all individuals contributors. +# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting +Aleksandr Razumov +alvarowolfx +Arlo Breault +Atsushi Watanabe +backkem +bjdgyc +boks1971 +Bragadeesh +Carson Hoffman +Cecylia Bocovich +Chris Hiszpanski +cnderrauber +Daniele Sluijters +folbrich +Hayden James +Hugo Arregui +Hugo Arregui +igolaizola <11333576+igolaizola@users.noreply.github.com> +Jeffrey Stoke +Jeroen de Bruijn +Jeroen de Bruijn +Jim Wert +jinleileiking +Jozef Kralik +Julien Salleyron +Juliusz Chroboczek +Kegan Dougal +Kevin Wang +Lander Noterman +Len +Lukas Lihotzki +ManuelBk <26275612+ManuelBk@users.noreply.github.com> +Michael Zabka +Michiel De Backker +Rachel Chen +Robert Eperjesi +Ryan Gordon +Sam Lancia +Sean DuBois +Sean DuBois +Sean DuBois +Shelikhoo +Stefan Tatschner +Steffen Vogel +Vadim +Vadim Filimonov +wmiao +ZHENK +吕海涛 + +# List of contributors not appearing in Git history + diff --git a/vendor/github.com/pion/dtls/v2/LICENSE b/vendor/github.com/pion/dtls/v2/LICENSE new file mode 100644 index 000000000..491caf6b0 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2023 The Pion community + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/dtls/v2/README.md b/vendor/github.com/pion/dtls/v2/README.md new file mode 100644 index 000000000..0d0f2846c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/README.md @@ -0,0 +1,173 @@ +

+
+ Pion DTLS +
+

+

A Go implementation of DTLS

+

+ Pion DTLS + Sourcegraph Widget + Slack Widget +
+ GitHub Workflow Status + Go Reference + Coverage Status + Go Report Card + License: MIT +

+
+ +Native [DTLS 1.2][rfc6347] implementation in the Go programming language. + +A long term goal is a professional security review, and maybe an inclusion in stdlib. + +### RFCs + +#### Implemented + +- **RFC 6347**: [Datagram Transport Layer Security Version 1.2][rfc6347] +- **RFC 5705**: [Keying Material Exporters for Transport Layer Security (TLS)][rfc5705] +- **RFC 7627**: [Transport Layer Security (TLS) - Session Hash and Extended Master Secret Extension][rfc7627] +- **RFC 7301**: [Transport Layer Security (TLS) - Application-Layer Protocol Negotiation Extension][rfc7301] + +[rfc5289]: https://tools.ietf.org/html/rfc5289 +[rfc5487]: https://tools.ietf.org/html/rfc5487 +[rfc5489]: https://tools.ietf.org/html/rfc5489 +[rfc5705]: https://tools.ietf.org/html/rfc5705 +[rfc6347]: https://tools.ietf.org/html/rfc6347 +[rfc6655]: https://tools.ietf.org/html/rfc6655 +[rfc7301]: https://tools.ietf.org/html/rfc7301 +[rfc7627]: https://tools.ietf.org/html/rfc7627 +[rfc8422]: https://tools.ietf.org/html/rfc8422 + +### Goals/Progress + +This will only be targeting DTLS 1.2, and the most modern/common cipher suites. +We would love contributions that fall under the 'Planned Features' and any bug fixes! + +#### Current features + +- DTLS 1.2 Client/Server +- Key Exchange via ECDHE(curve25519, nistp256, nistp384) and PSK +- Packet loss and re-ordering is handled during handshaking +- Key export ([RFC 5705][rfc5705]) +- Serialization and Resumption of sessions +- Extended Master Secret extension ([RFC 7627][rfc7627]) +- ALPN extension ([RFC 7301][rfc7301]) + +[rfc5705]: https://tools.ietf.org/html/rfc5705 +[rfc7627]: https://tools.ietf.org/html/rfc7627 +[rfc7301]: https://tools.ietf.org/html/rfc7301 + +#### Supported ciphers + +##### ECDHE + +- TLS_ECDHE_ECDSA_WITH_AES_128_CCM ([RFC 6655][rfc6655]) +- TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 ([RFC 6655][rfc6655]) +- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ([RFC 5289][rfc5289]) +- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ([RFC 5289][rfc5289]) +- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ([RFC 5289][rfc5289]) +- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ([RFC 5289][rfc5289]) +- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ([RFC 8422][rfc8422]) +- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ([RFC 8422][rfc8422]) + +##### PSK + +- TLS_PSK_WITH_AES_128_CCM ([RFC 6655][rfc6655]) +- TLS_PSK_WITH_AES_128_CCM_8 ([RFC 6655][rfc6655]) +- TLS_PSK_WITH_AES_256_CCM_8 ([RFC 6655][rfc6655]) +- TLS_PSK_WITH_AES_128_GCM_SHA256 ([RFC 5487][rfc5487]) +- TLS_PSK_WITH_AES_128_CBC_SHA256 ([RFC 5487][rfc5487]) + +##### ECDHE & PSK + +- TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 ([RFC 5489][rfc5489]) + +#### Planned Features + +- Chacha20Poly1305 + +#### Excluded Features + +- DTLS 1.0 +- Renegotiation +- Compression + +### Using + +This library needs at least Go 1.13, and you should have [Go modules +enabled](https://github.com/golang/go/wiki/Modules). + +#### Pion DTLS + +For a DTLS 1.2 Server that listens on 127.0.0.1:4444 + +```sh +go run examples/listen/selfsign/main.go +``` + +For a DTLS 1.2 Client that connects to 127.0.0.1:4444 + +```sh +go run examples/dial/selfsign/main.go +``` + +#### OpenSSL + +Pion DTLS can connect to itself and OpenSSL. + +``` + // Generate a certificate + openssl ecparam -out key.pem -name prime256v1 -genkey + openssl req -new -sha256 -key key.pem -out server.csr + openssl x509 -req -sha256 -days 365 -in server.csr -signkey key.pem -out cert.pem + + // Use with examples/dial/selfsign/main.go + openssl s_server -dtls1_2 -cert cert.pem -key key.pem -accept 4444 + + // Use with examples/listen/selfsign/main.go + openssl s_client -dtls1_2 -connect 127.0.0.1:4444 -debug -cert cert.pem -key key.pem +``` + +### Using with PSK + +Pion DTLS also comes with examples that do key exchange via PSK + +#### Pion DTLS + +```sh +go run examples/listen/psk/main.go +``` + +```sh +go run examples/dial/psk/main.go +``` + +#### OpenSSL + +``` + // Use with examples/dial/psk/main.go + openssl s_server -dtls1_2 -accept 4444 -nocert -psk abc123 -cipher PSK-AES128-CCM8 + + // Use with examples/listen/psk/main.go + openssl s_client -dtls1_2 -connect 127.0.0.1:4444 -psk abc123 -cipher PSK-AES128-CCM8 +``` + +### Community + +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. + +We are always looking to support **your projects**. Please reach out if you have something to build! +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing + +Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) + +### License + +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/dtls/v2/certificate.go b/vendor/github.com/pion/dtls/v2/certificate.go new file mode 100644 index 000000000..256d63b25 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/certificate.go @@ -0,0 +1,161 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "crypto/tls" + "crypto/x509" + "fmt" + "strings" + + "github.com/pion/dtls/v2/pkg/protocol/handshake" +) + +// ClientHelloInfo contains information from a ClientHello message in order to +// guide application logic in the GetCertificate. +type ClientHelloInfo struct { + // ServerName indicates the name of the server requested by the client + // in order to support virtual hosting. ServerName is only set if the + // client is using SNI (see RFC 4366, Section 3.1). + ServerName string + + // CipherSuites lists the CipherSuites supported by the client (e.g. + // TLS_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256). + CipherSuites []CipherSuiteID + + RandomBytes [handshake.RandomBytesLength]byte +} + +// CertificateRequestInfo contains information from a server's +// CertificateRequest message, which is used to demand a certificate and proof +// of control from a client. +type CertificateRequestInfo struct { + // AcceptableCAs contains zero or more, DER-encoded, X.501 + // Distinguished Names. These are the names of root or intermediate CAs + // that the server wishes the returned certificate to be signed by. An + // empty slice indicates that the server has no preference. + AcceptableCAs [][]byte +} + +// SupportsCertificate returns nil if the provided certificate is supported by +// the server that sent the CertificateRequest. Otherwise, it returns an error +// describing the reason for the incompatibility. +// NOTE: original src: https://github.com/golang/go/blob/29b9a328d268d53833d2cc063d1d8b4bf6852675/src/crypto/tls/common.go#L1273 +func (cri *CertificateRequestInfo) SupportsCertificate(c *tls.Certificate) error { + if len(cri.AcceptableCAs) == 0 { + return nil + } + + for j, cert := range c.Certificate { + x509Cert := c.Leaf + // Parse the certificate if this isn't the leaf node, or if + // chain.Leaf was nil. + if j != 0 || x509Cert == nil { + var err error + if x509Cert, err = x509.ParseCertificate(cert); err != nil { + return fmt.Errorf("failed to parse certificate #%d in the chain: %w", j, err) + } + } + + for _, ca := range cri.AcceptableCAs { + if bytes.Equal(x509Cert.RawIssuer, ca) { + return nil + } + } + } + return errNotAcceptableCertificateChain +} + +func (c *handshakeConfig) setNameToCertificateLocked() { + nameToCertificate := make(map[string]*tls.Certificate) + for i := range c.localCertificates { + cert := &c.localCertificates[i] + x509Cert := cert.Leaf + if x509Cert == nil { + var parseErr error + x509Cert, parseErr = x509.ParseCertificate(cert.Certificate[0]) + if parseErr != nil { + continue + } + } + if len(x509Cert.Subject.CommonName) > 0 { + nameToCertificate[strings.ToLower(x509Cert.Subject.CommonName)] = cert + } + for _, san := range x509Cert.DNSNames { + nameToCertificate[strings.ToLower(san)] = cert + } + } + c.nameToCertificate = nameToCertificate +} + +func (c *handshakeConfig) getCertificate(clientHelloInfo *ClientHelloInfo) (*tls.Certificate, error) { + c.mu.Lock() + defer c.mu.Unlock() + + if c.localGetCertificate != nil && + (len(c.localCertificates) == 0 || len(clientHelloInfo.ServerName) > 0) { + cert, err := c.localGetCertificate(clientHelloInfo) + if cert != nil || err != nil { + return cert, err + } + } + + if c.nameToCertificate == nil { + c.setNameToCertificateLocked() + } + + if len(c.localCertificates) == 0 { + return nil, errNoCertificates + } + + if len(c.localCertificates) == 1 { + // There's only one choice, so no point doing any work. + return &c.localCertificates[0], nil + } + + if len(clientHelloInfo.ServerName) == 0 { + return &c.localCertificates[0], nil + } + + name := strings.TrimRight(strings.ToLower(clientHelloInfo.ServerName), ".") + + if cert, ok := c.nameToCertificate[name]; ok { + return cert, nil + } + + // try replacing labels in the name with wildcards until we get a + // match. + labels := strings.Split(name, ".") + for i := range labels { + labels[i] = "*" + candidate := strings.Join(labels, ".") + if cert, ok := c.nameToCertificate[candidate]; ok { + return cert, nil + } + } + + // If nothing matches, return the first certificate. + return &c.localCertificates[0], nil +} + +// NOTE: original src: https://github.com/golang/go/blob/29b9a328d268d53833d2cc063d1d8b4bf6852675/src/crypto/tls/handshake_client.go#L974 +func (c *handshakeConfig) getClientCertificate(cri *CertificateRequestInfo) (*tls.Certificate, error) { + c.mu.Lock() + defer c.mu.Unlock() + if c.localGetClientCertificate != nil { + return c.localGetClientCertificate(cri) + } + + for i := range c.localCertificates { + chain := c.localCertificates[i] + if err := cri.SupportsCertificate(&chain); err != nil { + continue + } + return &chain, nil + } + + // No acceptable certificate found. Don't send a certificate. + return new(tls.Certificate), nil +} diff --git a/vendor/github.com/pion/dtls/v2/cipher_suite.go b/vendor/github.com/pion/dtls/v2/cipher_suite.go new file mode 100644 index 000000000..7a5bb4a58 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/cipher_suite.go @@ -0,0 +1,276 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rsa" + "crypto/tls" + "fmt" + "hash" + + "github.com/pion/dtls/v2/internal/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// CipherSuiteID is an ID for our supported CipherSuites +type CipherSuiteID = ciphersuite.ID + +// Supported Cipher Suites +const ( + // AES-128-CCM + TLS_ECDHE_ECDSA_WITH_AES_128_CCM CipherSuiteID = ciphersuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM //nolint:revive,stylecheck + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 CipherSuiteID = ciphersuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 //nolint:revive,stylecheck + + // AES-128-GCM-SHA256 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 CipherSuiteID = ciphersuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 CipherSuiteID = ciphersuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 //nolint:revive,stylecheck + + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 CipherSuiteID = ciphersuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 CipherSuiteID = ciphersuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 //nolint:revive,stylecheck + + // AES-256-CBC-SHA + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA CipherSuiteID = ciphersuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA CipherSuiteID = ciphersuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA //nolint:revive,stylecheck + + TLS_PSK_WITH_AES_128_CCM CipherSuiteID = ciphersuite.TLS_PSK_WITH_AES_128_CCM //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_CCM_8 CipherSuiteID = ciphersuite.TLS_PSK_WITH_AES_128_CCM_8 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_256_CCM_8 CipherSuiteID = ciphersuite.TLS_PSK_WITH_AES_256_CCM_8 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_GCM_SHA256 CipherSuiteID = ciphersuite.TLS_PSK_WITH_AES_128_GCM_SHA256 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_CBC_SHA256 CipherSuiteID = ciphersuite.TLS_PSK_WITH_AES_128_CBC_SHA256 //nolint:revive,stylecheck + + TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 CipherSuiteID = ciphersuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 //nolint:revive,stylecheck +) + +// CipherSuiteAuthenticationType controls what authentication method is using during the handshake for a CipherSuite +type CipherSuiteAuthenticationType = ciphersuite.AuthenticationType + +// AuthenticationType Enums +const ( + CipherSuiteAuthenticationTypeCertificate CipherSuiteAuthenticationType = ciphersuite.AuthenticationTypeCertificate + CipherSuiteAuthenticationTypePreSharedKey CipherSuiteAuthenticationType = ciphersuite.AuthenticationTypePreSharedKey + CipherSuiteAuthenticationTypeAnonymous CipherSuiteAuthenticationType = ciphersuite.AuthenticationTypeAnonymous +) + +// CipherSuiteKeyExchangeAlgorithm controls what exchange algorithm is using during the handshake for a CipherSuite +type CipherSuiteKeyExchangeAlgorithm = ciphersuite.KeyExchangeAlgorithm + +// CipherSuiteKeyExchangeAlgorithm Bitmask +const ( + CipherSuiteKeyExchangeAlgorithmNone CipherSuiteKeyExchangeAlgorithm = ciphersuite.KeyExchangeAlgorithmNone + CipherSuiteKeyExchangeAlgorithmPsk CipherSuiteKeyExchangeAlgorithm = ciphersuite.KeyExchangeAlgorithmPsk + CipherSuiteKeyExchangeAlgorithmEcdhe CipherSuiteKeyExchangeAlgorithm = ciphersuite.KeyExchangeAlgorithmEcdhe +) + +var _ = allCipherSuites() // Necessary until this function isn't only used by Go 1.14 + +// CipherSuite is an interface that all DTLS CipherSuites must satisfy +type CipherSuite interface { + // String of CipherSuite, only used for logging + String() string + + // ID of CipherSuite. + ID() CipherSuiteID + + // What type of Certificate does this CipherSuite use + CertificateType() clientcertificate.Type + + // What Hash function is used during verification + HashFunc() func() hash.Hash + + // AuthenticationType controls what authentication method is using during the handshake + AuthenticationType() CipherSuiteAuthenticationType + + // KeyExchangeAlgorithm controls what exchange algorithm is using during the handshake + KeyExchangeAlgorithm() CipherSuiteKeyExchangeAlgorithm + + // ECC (Elliptic Curve Cryptography) determines whether ECC extesions will be send during handshake. + // https://datatracker.ietf.org/doc/html/rfc4492#page-10 + ECC() bool + + // Called when keying material has been generated, should initialize the internal cipher + Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error + IsInitialized() bool + Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) + Decrypt(in []byte) ([]byte, error) +} + +// CipherSuiteName provides the same functionality as tls.CipherSuiteName +// that appeared first in Go 1.14. +// +// Our implementation differs slightly in that it takes in a CiperSuiteID, +// like the rest of our library, instead of a uint16 like crypto/tls. +func CipherSuiteName(id CipherSuiteID) string { + suite := cipherSuiteForID(id, nil) + if suite != nil { + return suite.String() + } + return fmt.Sprintf("0x%04X", uint16(id)) +} + +// Taken from https://www.iana.org/assignments/tls-parameters/tls-parameters.xml +// A cipherSuite is a specific combination of key agreement, cipher and MAC +// function. +func cipherSuiteForID(id CipherSuiteID, customCiphers func() []CipherSuite) CipherSuite { + switch id { //nolint:exhaustive + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM: + return ciphersuite.NewTLSEcdheEcdsaWithAes128Ccm() + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: + return ciphersuite.NewTLSEcdheEcdsaWithAes128Ccm8() + case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: + return &ciphersuite.TLSEcdheEcdsaWithAes128GcmSha256{} + case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: + return &ciphersuite.TLSEcdheRsaWithAes128GcmSha256{} + case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: + return &ciphersuite.TLSEcdheEcdsaWithAes256CbcSha{} + case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: + return &ciphersuite.TLSEcdheRsaWithAes256CbcSha{} + case TLS_PSK_WITH_AES_128_CCM: + return ciphersuite.NewTLSPskWithAes128Ccm() + case TLS_PSK_WITH_AES_128_CCM_8: + return ciphersuite.NewTLSPskWithAes128Ccm8() + case TLS_PSK_WITH_AES_256_CCM_8: + return ciphersuite.NewTLSPskWithAes256Ccm8() + case TLS_PSK_WITH_AES_128_GCM_SHA256: + return &ciphersuite.TLSPskWithAes128GcmSha256{} + case TLS_PSK_WITH_AES_128_CBC_SHA256: + return &ciphersuite.TLSPskWithAes128CbcSha256{} + case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: + return &ciphersuite.TLSEcdheEcdsaWithAes256GcmSha384{} + case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: + return &ciphersuite.TLSEcdheRsaWithAes256GcmSha384{} + case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256: + return ciphersuite.NewTLSEcdhePskWithAes128CbcSha256() + } + + if customCiphers != nil { + for _, c := range customCiphers() { + if c.ID() == id { + return c + } + } + } + + return nil +} + +// CipherSuites we support in order of preference +func defaultCipherSuites() []CipherSuite { + return []CipherSuite{ + &ciphersuite.TLSEcdheEcdsaWithAes128GcmSha256{}, + &ciphersuite.TLSEcdheRsaWithAes128GcmSha256{}, + &ciphersuite.TLSEcdheEcdsaWithAes256CbcSha{}, + &ciphersuite.TLSEcdheRsaWithAes256CbcSha{}, + &ciphersuite.TLSEcdheEcdsaWithAes256GcmSha384{}, + &ciphersuite.TLSEcdheRsaWithAes256GcmSha384{}, + } +} + +func allCipherSuites() []CipherSuite { + return []CipherSuite{ + ciphersuite.NewTLSEcdheEcdsaWithAes128Ccm(), + ciphersuite.NewTLSEcdheEcdsaWithAes128Ccm8(), + &ciphersuite.TLSEcdheEcdsaWithAes128GcmSha256{}, + &ciphersuite.TLSEcdheRsaWithAes128GcmSha256{}, + &ciphersuite.TLSEcdheEcdsaWithAes256CbcSha{}, + &ciphersuite.TLSEcdheRsaWithAes256CbcSha{}, + ciphersuite.NewTLSPskWithAes128Ccm(), + ciphersuite.NewTLSPskWithAes128Ccm8(), + ciphersuite.NewTLSPskWithAes256Ccm8(), + &ciphersuite.TLSPskWithAes128GcmSha256{}, + &ciphersuite.TLSEcdheEcdsaWithAes256GcmSha384{}, + &ciphersuite.TLSEcdheRsaWithAes256GcmSha384{}, + } +} + +func cipherSuiteIDs(cipherSuites []CipherSuite) []uint16 { + rtrn := []uint16{} + for _, c := range cipherSuites { + rtrn = append(rtrn, uint16(c.ID())) + } + return rtrn +} + +func parseCipherSuites(userSelectedSuites []CipherSuiteID, customCipherSuites func() []CipherSuite, includeCertificateSuites, includePSKSuites bool) ([]CipherSuite, error) { + cipherSuitesForIDs := func(ids []CipherSuiteID) ([]CipherSuite, error) { + cipherSuites := []CipherSuite{} + for _, id := range ids { + c := cipherSuiteForID(id, nil) + if c == nil { + return nil, &invalidCipherSuiteError{id} + } + cipherSuites = append(cipherSuites, c) + } + return cipherSuites, nil + } + + var ( + cipherSuites []CipherSuite + err error + i int + ) + if userSelectedSuites != nil { + cipherSuites, err = cipherSuitesForIDs(userSelectedSuites) + if err != nil { + return nil, err + } + } else { + cipherSuites = defaultCipherSuites() + } + + // Put CustomCipherSuites before ID selected suites + if customCipherSuites != nil { + cipherSuites = append(customCipherSuites(), cipherSuites...) + } + + var foundCertificateSuite, foundPSKSuite, foundAnonymousSuite bool + for _, c := range cipherSuites { + switch { + case includeCertificateSuites && c.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate: + foundCertificateSuite = true + case includePSKSuites && c.AuthenticationType() == CipherSuiteAuthenticationTypePreSharedKey: + foundPSKSuite = true + case c.AuthenticationType() == CipherSuiteAuthenticationTypeAnonymous: + foundAnonymousSuite = true + default: + continue + } + cipherSuites[i] = c + i++ + } + + switch { + case includeCertificateSuites && !foundCertificateSuite && !foundAnonymousSuite: + return nil, errNoAvailableCertificateCipherSuite + case includePSKSuites && !foundPSKSuite: + return nil, errNoAvailablePSKCipherSuite + case i == 0: + return nil, errNoAvailableCipherSuites + } + + return cipherSuites[:i], nil +} + +func filterCipherSuitesForCertificate(cert *tls.Certificate, cipherSuites []CipherSuite) []CipherSuite { + if cert == nil || cert.PrivateKey == nil { + return cipherSuites + } + var certType clientcertificate.Type + switch cert.PrivateKey.(type) { + case ed25519.PrivateKey, *ecdsa.PrivateKey: + certType = clientcertificate.ECDSASign + case *rsa.PrivateKey: + certType = clientcertificate.RSASign + } + + filtered := []CipherSuite{} + for _, c := range cipherSuites { + if c.AuthenticationType() != CipherSuiteAuthenticationTypeCertificate || certType == c.CertificateType() { + filtered = append(filtered, c) + } + } + return filtered +} diff --git a/vendor/github.com/pion/dtls/v2/cipher_suite_go114.go b/vendor/github.com/pion/dtls/v2/cipher_suite_go114.go new file mode 100644 index 000000000..fd46d7bd9 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/cipher_suite_go114.go @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build go1.14 +// +build go1.14 + +package dtls + +import ( + "crypto/tls" +) + +// VersionDTLS12 is the DTLS version in the same style as +// VersionTLSXX from crypto/tls +const VersionDTLS12 = 0xfefd + +// Convert from our cipherSuite interface to a tls.CipherSuite struct +func toTLSCipherSuite(c CipherSuite) *tls.CipherSuite { + return &tls.CipherSuite{ + ID: uint16(c.ID()), + Name: c.String(), + SupportedVersions: []uint16{VersionDTLS12}, + Insecure: false, + } +} + +// CipherSuites returns a list of cipher suites currently implemented by this +// package, excluding those with security issues, which are returned by +// InsecureCipherSuites. +func CipherSuites() []*tls.CipherSuite { + suites := allCipherSuites() + res := make([]*tls.CipherSuite, len(suites)) + for i, c := range suites { + res[i] = toTLSCipherSuite(c) + } + return res +} + +// InsecureCipherSuites returns a list of cipher suites currently implemented by +// this package and which have security issues. +func InsecureCipherSuites() []*tls.CipherSuite { + var res []*tls.CipherSuite + return res +} diff --git a/vendor/github.com/pion/dtls/v2/codecov.yml b/vendor/github.com/pion/dtls/v2/codecov.yml new file mode 100644 index 000000000..263e4d45c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/codecov.yml @@ -0,0 +1,22 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +coverage: + status: + project: + default: + # Allow decreasing 2% of total coverage to avoid noise. + threshold: 2% + patch: + default: + target: 70% + only_pulls: true + +ignore: + - "examples/*" + - "examples/**/*" diff --git a/vendor/github.com/pion/dtls/v2/compression_method.go b/vendor/github.com/pion/dtls/v2/compression_method.go new file mode 100644 index 000000000..7e44de009 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/compression_method.go @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import "github.com/pion/dtls/v2/pkg/protocol" + +func defaultCompressionMethods() []*protocol.CompressionMethod { + return []*protocol.CompressionMethod{ + {}, + } +} diff --git a/vendor/github.com/pion/dtls/v2/config.go b/vendor/github.com/pion/dtls/v2/config.go new file mode 100644 index 000000000..5ffa968aa --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/config.go @@ -0,0 +1,257 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "io" + "time" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/logging" +) + +const keyLogLabelTLS12 = "CLIENT_RANDOM" + +// Config is used to configure a DTLS client or server. +// After a Config is passed to a DTLS function it must not be modified. +type Config struct { + // Certificates contains certificate chain to present to the other side of the connection. + // Server MUST set this if PSK is non-nil + // client SHOULD sets this so CertificateRequests can be handled if PSK is non-nil + Certificates []tls.Certificate + + // CipherSuites is a list of supported cipher suites. + // If CipherSuites is nil, a default list is used + CipherSuites []CipherSuiteID + + // CustomCipherSuites is a list of CipherSuites that can be + // provided by the user. This allow users to user Ciphers that are reserved + // for private usage. + CustomCipherSuites func() []CipherSuite + + // SignatureSchemes contains the signature and hash schemes that the peer requests to verify. + SignatureSchemes []tls.SignatureScheme + + // SRTPProtectionProfiles are the supported protection profiles + // Clients will send this via use_srtp and assert that the server properly responds + // Servers will assert that clients send one of these profiles and will respond as needed + SRTPProtectionProfiles []SRTPProtectionProfile + + // ClientAuth determines the server's policy for + // TLS Client Authentication. The default is NoClientCert. + ClientAuth ClientAuthType + + // RequireExtendedMasterSecret determines if the "Extended Master Secret" extension + // should be disabled, requested, or required (default requested). + ExtendedMasterSecret ExtendedMasterSecretType + + // FlightInterval controls how often we send outbound handshake messages + // defaults to time.Second + FlightInterval time.Duration + + // PSK sets the pre-shared key used by this DTLS connection + // If PSK is non-nil only PSK CipherSuites will be used + PSK PSKCallback + PSKIdentityHint []byte + + // InsecureSkipVerify controls whether a client verifies the + // server's certificate chain and host name. + // If InsecureSkipVerify is true, TLS accepts any certificate + // presented by the server and any host name in that certificate. + // In this mode, TLS is susceptible to man-in-the-middle attacks. + // This should be used only for testing. + InsecureSkipVerify bool + + // InsecureHashes allows the use of hashing algorithms that are known + // to be vulnerable. + InsecureHashes bool + + // VerifyPeerCertificate, if not nil, is called after normal + // certificate verification by either a client or server. It + // receives the certificate provided by the peer and also a flag + // that tells if normal verification has succeedded. If it returns a + // non-nil error, the handshake is aborted and that error results. + // + // If normal verification fails then the handshake will abort before + // considering this callback. If normal verification is disabled by + // setting InsecureSkipVerify, or (for a server) when ClientAuth is + // RequestClientCert or RequireAnyClientCert, then this callback will + // be considered but the verifiedChains will always be nil. + VerifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error + + // VerifyConnection, if not nil, is called after normal certificate + // verification/PSK and after VerifyPeerCertificate by either a TLS client + // or server. If it returns a non-nil error, the handshake is aborted + // and that error results. + // + // If normal verification fails then the handshake will abort before + // considering this callback. This callback will run for all connections + // regardless of InsecureSkipVerify or ClientAuth settings. + VerifyConnection func(*State) error + + // RootCAs defines the set of root certificate authorities + // that one peer uses when verifying the other peer's certificates. + // If RootCAs is nil, TLS uses the host's root CA set. + RootCAs *x509.CertPool + + // ClientCAs defines the set of root certificate authorities + // that servers use if required to verify a client certificate + // by the policy in ClientAuth. + ClientCAs *x509.CertPool + + // ServerName is used to verify the hostname on the returned + // certificates unless InsecureSkipVerify is given. + ServerName string + + LoggerFactory logging.LoggerFactory + + // ConnectContextMaker is a function to make a context used in Dial(), + // Client(), Server(), and Accept(). If nil, the default ConnectContextMaker + // is used. It can be implemented as following. + // + // func ConnectContextMaker() (context.Context, func()) { + // return context.WithTimeout(context.Background(), 30*time.Second) + // } + ConnectContextMaker func() (context.Context, func()) + + // MTU is the length at which handshake messages will be fragmented to + // fit within the maximum transmission unit (default is 1200 bytes) + MTU int + + // ReplayProtectionWindow is the size of the replay attack protection window. + // Duplication of the sequence number is checked in this window size. + // Packet with sequence number older than this value compared to the latest + // accepted packet will be discarded. (default is 64) + ReplayProtectionWindow int + + // KeyLogWriter optionally specifies a destination for TLS master secrets + // in NSS key log format that can be used to allow external programs + // such as Wireshark to decrypt TLS connections. + // See https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format. + // Use of KeyLogWriter compromises security and should only be + // used for debugging. + KeyLogWriter io.Writer + + // SessionStore is the container to store session for resumption. + SessionStore SessionStore + + // List of application protocols the peer supports, for ALPN + SupportedProtocols []string + + // List of Elliptic Curves to use + // + // If an ECC ciphersuite is configured and EllipticCurves is empty + // it will default to X25519, P-256, P-384 in this specific order. + EllipticCurves []elliptic.Curve + + // GetCertificate returns a Certificate based on the given + // ClientHelloInfo. It will only be called if the client supplies SNI + // information or if Certificates is empty. + // + // If GetCertificate is nil or returns nil, then the certificate is + // retrieved from NameToCertificate. If NameToCertificate is nil, the + // best element of Certificates will be used. + GetCertificate func(*ClientHelloInfo) (*tls.Certificate, error) + + // GetClientCertificate, if not nil, is called when a server requests a + // certificate from a client. If set, the contents of Certificates will + // be ignored. + // + // If GetClientCertificate returns an error, the handshake will be + // aborted and that error will be returned. Otherwise + // GetClientCertificate must return a non-nil Certificate. If + // Certificate.Certificate is empty then no certificate will be sent to + // the server. If this is unacceptable to the server then it may abort + // the handshake. + GetClientCertificate func(*CertificateRequestInfo) (*tls.Certificate, error) + + // InsecureSkipVerifyHello, if true and when acting as server, allow client to + // skip hello verify phase and receive ServerHello after initial ClientHello. + // This have implication on DoS attack resistance. + InsecureSkipVerifyHello bool + + // CustomClientHelloRandom optionaly allows the use of custom random bytes in the ClientHello message + CustomClientHelloRandom func() [handshake.RandomBytesLength]byte +} + +func defaultConnectContextMaker() (context.Context, func()) { + return context.WithTimeout(context.Background(), 30*time.Second) +} + +func (c *Config) connectContextMaker() (context.Context, func()) { + if c.ConnectContextMaker == nil { + return defaultConnectContextMaker() + } + return c.ConnectContextMaker() +} + +func (c *Config) includeCertificateSuites() bool { + return c.PSK == nil || len(c.Certificates) > 0 || c.GetCertificate != nil || c.GetClientCertificate != nil +} + +const defaultMTU = 1200 // bytes + +var defaultCurves = []elliptic.Curve{elliptic.X25519, elliptic.P256, elliptic.P384} //nolint:gochecknoglobals + +// PSKCallback is called once we have the remote's PSKIdentityHint. +// If the remote provided none it will be nil +type PSKCallback func([]byte) ([]byte, error) + +// ClientAuthType declares the policy the server will follow for +// TLS Client Authentication. +type ClientAuthType int + +// ClientAuthType enums +const ( + NoClientCert ClientAuthType = iota + RequestClientCert + RequireAnyClientCert + VerifyClientCertIfGiven + RequireAndVerifyClientCert +) + +// ExtendedMasterSecretType declares the policy the client and server +// will follow for the Extended Master Secret extension +type ExtendedMasterSecretType int + +// ExtendedMasterSecretType enums +const ( + RequestExtendedMasterSecret ExtendedMasterSecretType = iota + RequireExtendedMasterSecret + DisableExtendedMasterSecret +) + +func validateConfig(config *Config) error { + switch { + case config == nil: + return errNoConfigProvided + case config.PSKIdentityHint != nil && config.PSK == nil: + return errIdentityNoPSK + } + + for _, cert := range config.Certificates { + if cert.Certificate == nil { + return errInvalidCertificate + } + if cert.PrivateKey != nil { + switch cert.PrivateKey.(type) { + case ed25519.PrivateKey: + case *ecdsa.PrivateKey: + case *rsa.PrivateKey: + default: + return errInvalidPrivateKey + } + } + } + + _, err := parseCipherSuites(config.CipherSuites, config.CustomCipherSuites, config.includeCertificateSuites(), config.PSK != nil) + return err +} diff --git a/vendor/github.com/pion/dtls/v2/conn.go b/vendor/github.com/pion/dtls/v2/conn.go new file mode 100644 index 000000000..d10eb0dc3 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/conn.go @@ -0,0 +1,1033 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "sync" + "sync/atomic" + "time" + + "github.com/pion/dtls/v2/internal/closer" + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" + "github.com/pion/logging" + "github.com/pion/transport/v2/connctx" + "github.com/pion/transport/v2/deadline" + "github.com/pion/transport/v2/replaydetector" +) + +const ( + initialTickerInterval = time.Second + cookieLength = 20 + sessionLength = 32 + defaultNamedCurve = elliptic.X25519 + inboundBufferSize = 8192 + // Default replay protection window is specified by RFC 6347 Section 4.1.2.6 + defaultReplayProtectionWindow = 64 +) + +func invalidKeyingLabels() map[string]bool { + return map[string]bool{ + "client finished": true, + "server finished": true, + "master secret": true, + "key expansion": true, + } +} + +// Conn represents a DTLS connection +type Conn struct { + lock sync.RWMutex // Internal lock (must not be public) + nextConn connctx.ConnCtx // Embedded Conn, typically a udpconn we read/write from + fragmentBuffer *fragmentBuffer // out-of-order and missing fragment handling + handshakeCache *handshakeCache // caching of handshake messages for verifyData generation + decrypted chan interface{} // Decrypted Application Data or error, pull by calling `Read` + + state State // Internal state + + maximumTransmissionUnit int + + handshakeCompletedSuccessfully atomic.Value + + encryptedPackets [][]byte + + connectionClosedByUser bool + closeLock sync.Mutex + closed *closer.Closer + handshakeLoopsFinished sync.WaitGroup + + readDeadline *deadline.Deadline + writeDeadline *deadline.Deadline + + log logging.LeveledLogger + + reading chan struct{} + handshakeRecv chan chan struct{} + cancelHandshaker func() + cancelHandshakeReader func() + + fsm *handshakeFSM + + replayProtectionWindow uint +} + +func createConn(ctx context.Context, nextConn net.Conn, config *Config, isClient bool, initialState *State) (*Conn, error) { + err := validateConfig(config) + if err != nil { + return nil, err + } + + if nextConn == nil { + return nil, errNilNextConn + } + + cipherSuites, err := parseCipherSuites(config.CipherSuites, config.CustomCipherSuites, config.includeCertificateSuites(), config.PSK != nil) + if err != nil { + return nil, err + } + + signatureSchemes, err := signaturehash.ParseSignatureSchemes(config.SignatureSchemes, config.InsecureHashes) + if err != nil { + return nil, err + } + + workerInterval := initialTickerInterval + if config.FlightInterval != 0 { + workerInterval = config.FlightInterval + } + + loggerFactory := config.LoggerFactory + if loggerFactory == nil { + loggerFactory = logging.NewDefaultLoggerFactory() + } + + logger := loggerFactory.NewLogger("dtls") + + mtu := config.MTU + if mtu <= 0 { + mtu = defaultMTU + } + + replayProtectionWindow := config.ReplayProtectionWindow + if replayProtectionWindow <= 0 { + replayProtectionWindow = defaultReplayProtectionWindow + } + + c := &Conn{ + nextConn: connctx.New(nextConn), + fragmentBuffer: newFragmentBuffer(), + handshakeCache: newHandshakeCache(), + maximumTransmissionUnit: mtu, + + decrypted: make(chan interface{}, 1), + log: logger, + + readDeadline: deadline.New(), + writeDeadline: deadline.New(), + + reading: make(chan struct{}, 1), + handshakeRecv: make(chan chan struct{}), + closed: closer.NewCloser(), + cancelHandshaker: func() {}, + + replayProtectionWindow: uint(replayProtectionWindow), + + state: State{ + isClient: isClient, + }, + } + + c.setRemoteEpoch(0) + c.setLocalEpoch(0) + + serverName := config.ServerName + // Do not allow the use of an IP address literal as an SNI value. + // See RFC 6066, Section 3. + if net.ParseIP(serverName) != nil { + serverName = "" + } + + curves := config.EllipticCurves + if len(curves) == 0 { + curves = defaultCurves + } + + hsCfg := &handshakeConfig{ + localPSKCallback: config.PSK, + localPSKIdentityHint: config.PSKIdentityHint, + localCipherSuites: cipherSuites, + localSignatureSchemes: signatureSchemes, + extendedMasterSecret: config.ExtendedMasterSecret, + localSRTPProtectionProfiles: config.SRTPProtectionProfiles, + serverName: serverName, + supportedProtocols: config.SupportedProtocols, + clientAuth: config.ClientAuth, + localCertificates: config.Certificates, + insecureSkipVerify: config.InsecureSkipVerify, + verifyPeerCertificate: config.VerifyPeerCertificate, + verifyConnection: config.VerifyConnection, + rootCAs: config.RootCAs, + clientCAs: config.ClientCAs, + customCipherSuites: config.CustomCipherSuites, + retransmitInterval: workerInterval, + log: logger, + initialEpoch: 0, + keyLogWriter: config.KeyLogWriter, + sessionStore: config.SessionStore, + ellipticCurves: curves, + localGetCertificate: config.GetCertificate, + localGetClientCertificate: config.GetClientCertificate, + insecureSkipHelloVerify: config.InsecureSkipVerifyHello, + customClientHelloRandom: config.CustomClientHelloRandom, + } + + // rfc5246#section-7.4.3 + // In addition, the hash and signature algorithms MUST be compatible + // with the key in the server's end-entity certificate. + if !isClient { + cert, err := hsCfg.getCertificate(&ClientHelloInfo{}) + if err != nil && !errors.Is(err, errNoCertificates) { + return nil, err + } + hsCfg.localCipherSuites = filterCipherSuitesForCertificate(cert, cipherSuites) + } + + var initialFlight flightVal + var initialFSMState handshakeState + + if initialState != nil { + if c.state.isClient { + initialFlight = flight5 + } else { + initialFlight = flight6 + } + initialFSMState = handshakeFinished + + c.state = *initialState + } else { + if c.state.isClient { + initialFlight = flight1 + } else { + initialFlight = flight0 + } + initialFSMState = handshakePreparing + } + // Do handshake + if err := c.handshake(ctx, hsCfg, initialFlight, initialFSMState); err != nil { + return nil, err + } + + c.log.Trace("Handshake Completed") + + return c, nil +} + +// Dial connects to the given network address and establishes a DTLS connection on top. +// Connection handshake will timeout using ConnectContextMaker in the Config. +// If you want to specify the timeout duration, use DialWithContext() instead. +func Dial(network string, raddr *net.UDPAddr, config *Config) (*Conn, error) { + ctx, cancel := config.connectContextMaker() + defer cancel() + + return DialWithContext(ctx, network, raddr, config) +} + +// Client establishes a DTLS connection over an existing connection. +// Connection handshake will timeout using ConnectContextMaker in the Config. +// If you want to specify the timeout duration, use ClientWithContext() instead. +func Client(conn net.Conn, config *Config) (*Conn, error) { + ctx, cancel := config.connectContextMaker() + defer cancel() + + return ClientWithContext(ctx, conn, config) +} + +// Server listens for incoming DTLS connections. +// Connection handshake will timeout using ConnectContextMaker in the Config. +// If you want to specify the timeout duration, use ServerWithContext() instead. +func Server(conn net.Conn, config *Config) (*Conn, error) { + ctx, cancel := config.connectContextMaker() + defer cancel() + + return ServerWithContext(ctx, conn, config) +} + +// DialWithContext connects to the given network address and establishes a DTLS connection on top. +func DialWithContext(ctx context.Context, network string, raddr *net.UDPAddr, config *Config) (*Conn, error) { + pConn, err := net.DialUDP(network, nil, raddr) + if err != nil { + return nil, err + } + return ClientWithContext(ctx, pConn, config) +} + +// ClientWithContext establishes a DTLS connection over an existing connection. +func ClientWithContext(ctx context.Context, conn net.Conn, config *Config) (*Conn, error) { + switch { + case config == nil: + return nil, errNoConfigProvided + case config.PSK != nil && config.PSKIdentityHint == nil: + return nil, errPSKAndIdentityMustBeSetForClient + } + + return createConn(ctx, conn, config, true, nil) +} + +// ServerWithContext listens for incoming DTLS connections. +func ServerWithContext(ctx context.Context, conn net.Conn, config *Config) (*Conn, error) { + if config == nil { + return nil, errNoConfigProvided + } + + return createConn(ctx, conn, config, false, nil) +} + +// Read reads data from the connection. +func (c *Conn) Read(p []byte) (n int, err error) { + if !c.isHandshakeCompletedSuccessfully() { + return 0, errHandshakeInProgress + } + + select { + case <-c.readDeadline.Done(): + return 0, errDeadlineExceeded + default: + } + + for { + select { + case <-c.readDeadline.Done(): + return 0, errDeadlineExceeded + case out, ok := <-c.decrypted: + if !ok { + return 0, io.EOF + } + switch val := out.(type) { + case ([]byte): + if len(p) < len(val) { + return 0, errBufferTooSmall + } + copy(p, val) + return len(val), nil + case (error): + return 0, val + } + } + } +} + +// Write writes len(p) bytes from p to the DTLS connection +func (c *Conn) Write(p []byte) (int, error) { + if c.isConnectionClosed() { + return 0, ErrConnClosed + } + + select { + case <-c.writeDeadline.Done(): + return 0, errDeadlineExceeded + default: + } + + if !c.isHandshakeCompletedSuccessfully() { + return 0, errHandshakeInProgress + } + + return len(p), c.writePackets(c.writeDeadline, []*packet{ + { + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Epoch: c.state.getLocalEpoch(), + Version: protocol.Version1_2, + }, + Content: &protocol.ApplicationData{ + Data: p, + }, + }, + shouldEncrypt: true, + }, + }) +} + +// Close closes the connection. +func (c *Conn) Close() error { + err := c.close(true) //nolint:contextcheck + c.handshakeLoopsFinished.Wait() + return err +} + +// ConnectionState returns basic DTLS details about the connection. +// Note that this replaced the `Export` function of v1. +func (c *Conn) ConnectionState() State { + c.lock.RLock() + defer c.lock.RUnlock() + return *c.state.clone() +} + +// SelectedSRTPProtectionProfile returns the selected SRTPProtectionProfile +func (c *Conn) SelectedSRTPProtectionProfile() (SRTPProtectionProfile, bool) { + c.lock.RLock() + defer c.lock.RUnlock() + + if c.state.srtpProtectionProfile == 0 { + return 0, false + } + + return c.state.srtpProtectionProfile, true +} + +func (c *Conn) writePackets(ctx context.Context, pkts []*packet) error { + c.lock.Lock() + defer c.lock.Unlock() + + var rawPackets [][]byte + + for _, p := range pkts { + if h, ok := p.record.Content.(*handshake.Handshake); ok { + handshakeRaw, err := p.record.Marshal() + if err != nil { + return err + } + + c.log.Tracef("[handshake:%v] -> %s (epoch: %d, seq: %d)", + srvCliStr(c.state.isClient), h.Header.Type.String(), + p.record.Header.Epoch, h.Header.MessageSequence) + c.handshakeCache.push(handshakeRaw[recordlayer.HeaderSize:], p.record.Header.Epoch, h.Header.MessageSequence, h.Header.Type, c.state.isClient) + + rawHandshakePackets, err := c.processHandshakePacket(p, h) + if err != nil { + return err + } + rawPackets = append(rawPackets, rawHandshakePackets...) + } else { + rawPacket, err := c.processPacket(p) + if err != nil { + return err + } + rawPackets = append(rawPackets, rawPacket) + } + } + if len(rawPackets) == 0 { + return nil + } + compactedRawPackets := c.compactRawPackets(rawPackets) + + for _, compactedRawPackets := range compactedRawPackets { + if _, err := c.nextConn.WriteContext(ctx, compactedRawPackets); err != nil { + return netError(err) + } + } + + return nil +} + +func (c *Conn) compactRawPackets(rawPackets [][]byte) [][]byte { + // avoid a useless copy in the common case + if len(rawPackets) == 1 { + return rawPackets + } + + combinedRawPackets := make([][]byte, 0) + currentCombinedRawPacket := make([]byte, 0) + + for _, rawPacket := range rawPackets { + if len(currentCombinedRawPacket) > 0 && len(currentCombinedRawPacket)+len(rawPacket) >= c.maximumTransmissionUnit { + combinedRawPackets = append(combinedRawPackets, currentCombinedRawPacket) + currentCombinedRawPacket = []byte{} + } + currentCombinedRawPacket = append(currentCombinedRawPacket, rawPacket...) + } + + combinedRawPackets = append(combinedRawPackets, currentCombinedRawPacket) + + return combinedRawPackets +} + +func (c *Conn) processPacket(p *packet) ([]byte, error) { + epoch := p.record.Header.Epoch + for len(c.state.localSequenceNumber) <= int(epoch) { + c.state.localSequenceNumber = append(c.state.localSequenceNumber, uint64(0)) + } + seq := atomic.AddUint64(&c.state.localSequenceNumber[epoch], 1) - 1 + if seq > recordlayer.MaxSequenceNumber { + // RFC 6347 Section 4.1.0 + // The implementation must either abandon an association or rehandshake + // prior to allowing the sequence number to wrap. + return nil, errSequenceNumberOverflow + } + p.record.Header.SequenceNumber = seq + + rawPacket, err := p.record.Marshal() + if err != nil { + return nil, err + } + + if p.shouldEncrypt { + var err error + rawPacket, err = c.state.cipherSuite.Encrypt(p.record, rawPacket) + if err != nil { + return nil, err + } + } + + return rawPacket, nil +} + +func (c *Conn) processHandshakePacket(p *packet, h *handshake.Handshake) ([][]byte, error) { + rawPackets := make([][]byte, 0) + + handshakeFragments, err := c.fragmentHandshake(h) + if err != nil { + return nil, err + } + epoch := p.record.Header.Epoch + for len(c.state.localSequenceNumber) <= int(epoch) { + c.state.localSequenceNumber = append(c.state.localSequenceNumber, uint64(0)) + } + + for _, handshakeFragment := range handshakeFragments { + seq := atomic.AddUint64(&c.state.localSequenceNumber[epoch], 1) - 1 + if seq > recordlayer.MaxSequenceNumber { + return nil, errSequenceNumberOverflow + } + + recordlayerHeader := &recordlayer.Header{ + Version: p.record.Header.Version, + ContentType: p.record.Header.ContentType, + ContentLen: uint16(len(handshakeFragment)), + Epoch: p.record.Header.Epoch, + SequenceNumber: seq, + } + + rawPacket, err := recordlayerHeader.Marshal() + if err != nil { + return nil, err + } + + p.record.Header = *recordlayerHeader + + rawPacket = append(rawPacket, handshakeFragment...) + if p.shouldEncrypt { + var err error + rawPacket, err = c.state.cipherSuite.Encrypt(p.record, rawPacket) + if err != nil { + return nil, err + } + } + + rawPackets = append(rawPackets, rawPacket) + } + + return rawPackets, nil +} + +func (c *Conn) fragmentHandshake(h *handshake.Handshake) ([][]byte, error) { + content, err := h.Message.Marshal() + if err != nil { + return nil, err + } + + fragmentedHandshakes := make([][]byte, 0) + + contentFragments := splitBytes(content, c.maximumTransmissionUnit) + if len(contentFragments) == 0 { + contentFragments = [][]byte{ + {}, + } + } + + offset := 0 + for _, contentFragment := range contentFragments { + contentFragmentLen := len(contentFragment) + + headerFragment := &handshake.Header{ + Type: h.Header.Type, + Length: h.Header.Length, + MessageSequence: h.Header.MessageSequence, + FragmentOffset: uint32(offset), + FragmentLength: uint32(contentFragmentLen), + } + + offset += contentFragmentLen + + fragmentedHandshake, err := headerFragment.Marshal() + if err != nil { + return nil, err + } + + fragmentedHandshake = append(fragmentedHandshake, contentFragment...) + fragmentedHandshakes = append(fragmentedHandshakes, fragmentedHandshake) + } + + return fragmentedHandshakes, nil +} + +var poolReadBuffer = sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + b := make([]byte, inboundBufferSize) + return &b + }, +} + +func (c *Conn) readAndBuffer(ctx context.Context) error { + bufptr, ok := poolReadBuffer.Get().(*[]byte) + if !ok { + return errFailedToAccessPoolReadBuffer + } + defer poolReadBuffer.Put(bufptr) + + b := *bufptr + i, err := c.nextConn.ReadContext(ctx, b) + if err != nil { + return netError(err) + } + + pkts, err := recordlayer.UnpackDatagram(b[:i]) + if err != nil { + return err + } + + var hasHandshake bool + for _, p := range pkts { + hs, alert, err := c.handleIncomingPacket(ctx, p, true) + if alert != nil { + if alertErr := c.notify(ctx, alert.Level, alert.Description); alertErr != nil { + if err == nil { + err = alertErr + } + } + } + if hs { + hasHandshake = true + } + + var e *alertError + if errors.As(err, &e) { + if e.IsFatalOrCloseNotify() { + return e + } + } else if err != nil { + return e + } + } + if hasHandshake { + done := make(chan struct{}) + select { + case c.handshakeRecv <- done: + // If the other party may retransmit the flight, + // we should respond even if it not a new message. + <-done + case <-c.fsm.Done(): + } + } + return nil +} + +func (c *Conn) handleQueuedPackets(ctx context.Context) error { + pkts := c.encryptedPackets + c.encryptedPackets = nil + + for _, p := range pkts { + _, alert, err := c.handleIncomingPacket(ctx, p, false) // don't re-enqueue + if alert != nil { + if alertErr := c.notify(ctx, alert.Level, alert.Description); alertErr != nil { + if err == nil { + err = alertErr + } + } + } + var e *alertError + if errors.As(err, &e) { + if e.IsFatalOrCloseNotify() { + return e + } + } else if err != nil { + return e + } + } + return nil +} + +func (c *Conn) handleIncomingPacket(ctx context.Context, buf []byte, enqueue bool) (bool, *alert.Alert, error) { //nolint:gocognit + h := &recordlayer.Header{} + if err := h.Unmarshal(buf); err != nil { + // Decode error must be silently discarded + // [RFC6347 Section-4.1.2.7] + c.log.Debugf("discarded broken packet: %v", err) + return false, nil, nil + } + + // Validate epoch + remoteEpoch := c.state.getRemoteEpoch() + if h.Epoch > remoteEpoch { + if h.Epoch > remoteEpoch+1 { + c.log.Debugf("discarded future packet (epoch: %d, seq: %d)", + h.Epoch, h.SequenceNumber, + ) + return false, nil, nil + } + if enqueue { + c.log.Debug("received packet of next epoch, queuing packet") + c.encryptedPackets = append(c.encryptedPackets, buf) + } + return false, nil, nil + } + + // Anti-replay protection + for len(c.state.replayDetector) <= int(h.Epoch) { + c.state.replayDetector = append(c.state.replayDetector, + replaydetector.New(c.replayProtectionWindow, recordlayer.MaxSequenceNumber), + ) + } + markPacketAsValid, ok := c.state.replayDetector[int(h.Epoch)].Check(h.SequenceNumber) + if !ok { + c.log.Debugf("discarded duplicated packet (epoch: %d, seq: %d)", + h.Epoch, h.SequenceNumber, + ) + return false, nil, nil + } + + // Decrypt + if h.Epoch != 0 { + if c.state.cipherSuite == nil || !c.state.cipherSuite.IsInitialized() { + if enqueue { + c.encryptedPackets = append(c.encryptedPackets, buf) + c.log.Debug("handshake not finished, queuing packet") + } + return false, nil, nil + } + + var err error + buf, err = c.state.cipherSuite.Decrypt(buf) + if err != nil { + c.log.Debugf("%s: decrypt failed: %s", srvCliStr(c.state.isClient), err) + return false, nil, nil + } + } + + isHandshake, err := c.fragmentBuffer.push(append([]byte{}, buf...)) + if err != nil { + // Decode error must be silently discarded + // [RFC6347 Section-4.1.2.7] + c.log.Debugf("defragment failed: %s", err) + return false, nil, nil + } else if isHandshake { + markPacketAsValid() + for out, epoch := c.fragmentBuffer.pop(); out != nil; out, epoch = c.fragmentBuffer.pop() { + header := &handshake.Header{} + if err := header.Unmarshal(out); err != nil { + c.log.Debugf("%s: handshake parse failed: %s", srvCliStr(c.state.isClient), err) + continue + } + c.handshakeCache.push(out, epoch, header.MessageSequence, header.Type, !c.state.isClient) + } + + return true, nil, nil + } + + r := &recordlayer.RecordLayer{} + if err := r.Unmarshal(buf); err != nil { + return false, &alert.Alert{Level: alert.Fatal, Description: alert.DecodeError}, err + } + + switch content := r.Content.(type) { + case *alert.Alert: + c.log.Tracef("%s: <- %s", srvCliStr(c.state.isClient), content.String()) + var a *alert.Alert + if content.Description == alert.CloseNotify { + // Respond with a close_notify [RFC5246 Section 7.2.1] + a = &alert.Alert{Level: alert.Warning, Description: alert.CloseNotify} + } + markPacketAsValid() + return false, a, &alertError{content} + case *protocol.ChangeCipherSpec: + if c.state.cipherSuite == nil || !c.state.cipherSuite.IsInitialized() { + if enqueue { + c.encryptedPackets = append(c.encryptedPackets, buf) + c.log.Debugf("CipherSuite not initialized, queuing packet") + } + return false, nil, nil + } + + newRemoteEpoch := h.Epoch + 1 + c.log.Tracef("%s: <- ChangeCipherSpec (epoch: %d)", srvCliStr(c.state.isClient), newRemoteEpoch) + + if c.state.getRemoteEpoch()+1 == newRemoteEpoch { + c.setRemoteEpoch(newRemoteEpoch) + markPacketAsValid() + } + case *protocol.ApplicationData: + if h.Epoch == 0 { + return false, &alert.Alert{Level: alert.Fatal, Description: alert.UnexpectedMessage}, errApplicationDataEpochZero + } + + markPacketAsValid() + + select { + case c.decrypted <- content.Data: + case <-c.closed.Done(): + case <-ctx.Done(): + } + + default: + return false, &alert.Alert{Level: alert.Fatal, Description: alert.UnexpectedMessage}, fmt.Errorf("%w: %d", errUnhandledContextType, content.ContentType()) + } + return false, nil, nil +} + +func (c *Conn) recvHandshake() <-chan chan struct{} { + return c.handshakeRecv +} + +func (c *Conn) notify(ctx context.Context, level alert.Level, desc alert.Description) error { + if level == alert.Fatal && len(c.state.SessionID) > 0 { + // According to the RFC, we need to delete the stored session. + // https://datatracker.ietf.org/doc/html/rfc5246#section-7.2 + if ss := c.fsm.cfg.sessionStore; ss != nil { + c.log.Tracef("clean invalid session: %s", c.state.SessionID) + if err := ss.Del(c.sessionKey()); err != nil { + return err + } + } + } + return c.writePackets(ctx, []*packet{ + { + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Epoch: c.state.getLocalEpoch(), + Version: protocol.Version1_2, + }, + Content: &alert.Alert{ + Level: level, + Description: desc, + }, + }, + shouldEncrypt: c.isHandshakeCompletedSuccessfully(), + }, + }) +} + +func (c *Conn) setHandshakeCompletedSuccessfully() { + c.handshakeCompletedSuccessfully.Store(struct{ bool }{true}) +} + +func (c *Conn) isHandshakeCompletedSuccessfully() bool { + boolean, _ := c.handshakeCompletedSuccessfully.Load().(struct{ bool }) + return boolean.bool +} + +func (c *Conn) handshake(ctx context.Context, cfg *handshakeConfig, initialFlight flightVal, initialState handshakeState) error { //nolint:gocognit + c.fsm = newHandshakeFSM(&c.state, c.handshakeCache, cfg, initialFlight) + + done := make(chan struct{}) + ctxRead, cancelRead := context.WithCancel(context.Background()) + c.cancelHandshakeReader = cancelRead + cfg.onFlightState = func(f flightVal, s handshakeState) { + if s == handshakeFinished && !c.isHandshakeCompletedSuccessfully() { + c.setHandshakeCompletedSuccessfully() + close(done) + } + } + + ctxHs, cancel := context.WithCancel(context.Background()) + c.cancelHandshaker = cancel + + firstErr := make(chan error, 1) + + c.handshakeLoopsFinished.Add(2) + + // Handshake routine should be live until close. + // The other party may request retransmission of the last flight to cope with packet drop. + go func() { + defer c.handshakeLoopsFinished.Done() + err := c.fsm.Run(ctxHs, c, initialState) + if !errors.Is(err, context.Canceled) { + select { + case firstErr <- err: + default: + } + } + }() + go func() { + defer func() { + // Escaping read loop. + // It's safe to close decrypted channnel now. + close(c.decrypted) + + // Force stop handshaker when the underlying connection is closed. + cancel() + }() + defer c.handshakeLoopsFinished.Done() + for { + if err := c.readAndBuffer(ctxRead); err != nil { + var e *alertError + if errors.As(err, &e) { + if !e.IsFatalOrCloseNotify() { + if c.isHandshakeCompletedSuccessfully() { + // Pass the error to Read() + select { + case c.decrypted <- err: + case <-c.closed.Done(): + case <-ctxRead.Done(): + } + } + continue // non-fatal alert must not stop read loop + } + } else { + switch { + case errors.Is(err, context.DeadlineExceeded), errors.Is(err, context.Canceled), errors.Is(err, io.EOF): + default: + if c.isHandshakeCompletedSuccessfully() { + // Keep read loop and pass the read error to Read() + select { + case c.decrypted <- err: + case <-c.closed.Done(): + case <-ctxRead.Done(): + } + continue // non-fatal alert must not stop read loop + } + } + } + + select { + case firstErr <- err: + default: + } + + if e != nil { + if e.IsFatalOrCloseNotify() { + _ = c.close(false) //nolint:contextcheck + } + } + if !c.isConnectionClosed() && errors.Is(err, context.Canceled) { + c.log.Trace("handshake timeouts - closing underline connection") + _ = c.close(false) //nolint:contextcheck + } + return + } + } + }() + + select { + case err := <-firstErr: + cancelRead() + cancel() + c.handshakeLoopsFinished.Wait() + return c.translateHandshakeCtxError(err) + case <-ctx.Done(): + cancelRead() + cancel() + c.handshakeLoopsFinished.Wait() + return c.translateHandshakeCtxError(ctx.Err()) + case <-done: + return nil + } +} + +func (c *Conn) translateHandshakeCtxError(err error) error { + if err == nil { + return nil + } + if errors.Is(err, context.Canceled) && c.isHandshakeCompletedSuccessfully() { + return nil + } + return &HandshakeError{Err: err} +} + +func (c *Conn) close(byUser bool) error { + c.cancelHandshaker() + c.cancelHandshakeReader() + + if c.isHandshakeCompletedSuccessfully() && byUser { + // Discard error from notify() to return non-error on the first user call of Close() + // even if the underlying connection is already closed. + _ = c.notify(context.Background(), alert.Warning, alert.CloseNotify) + } + + c.closeLock.Lock() + // Don't return ErrConnClosed at the first time of the call from user. + closedByUser := c.connectionClosedByUser + if byUser { + c.connectionClosedByUser = true + } + isClosed := c.isConnectionClosed() + c.closed.Close() + c.closeLock.Unlock() + + if closedByUser { + return ErrConnClosed + } + + if isClosed { + return nil + } + + return c.nextConn.Close() +} + +func (c *Conn) isConnectionClosed() bool { + select { + case <-c.closed.Done(): + return true + default: + return false + } +} + +func (c *Conn) setLocalEpoch(epoch uint16) { + c.state.localEpoch.Store(epoch) +} + +func (c *Conn) setRemoteEpoch(epoch uint16) { + c.state.remoteEpoch.Store(epoch) +} + +// LocalAddr implements net.Conn.LocalAddr +func (c *Conn) LocalAddr() net.Addr { + return c.nextConn.LocalAddr() +} + +// RemoteAddr implements net.Conn.RemoteAddr +func (c *Conn) RemoteAddr() net.Addr { + return c.nextConn.RemoteAddr() +} + +func (c *Conn) sessionKey() []byte { + if c.state.isClient { + // As ServerName can be like 0.example.com, it's better to add + // delimiter character which is not allowed to be in + // neither address or domain name. + return []byte(c.nextConn.RemoteAddr().String() + "_" + c.fsm.cfg.serverName) + } + return c.state.SessionID +} + +// SetDeadline implements net.Conn.SetDeadline +func (c *Conn) SetDeadline(t time.Time) error { + c.readDeadline.Set(t) + return c.SetWriteDeadline(t) +} + +// SetReadDeadline implements net.Conn.SetReadDeadline +func (c *Conn) SetReadDeadline(t time.Time) error { + c.readDeadline.Set(t) + // Read deadline is fully managed by this layer. + // Don't set read deadline to underlying connection. + return nil +} + +// SetWriteDeadline implements net.Conn.SetWriteDeadline +func (c *Conn) SetWriteDeadline(t time.Time) error { + c.writeDeadline.Set(t) + // Write deadline is also fully managed by this layer. + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/crypto.go b/vendor/github.com/pion/dtls/v2/crypto.go new file mode 100644 index 000000000..968910c7e --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/crypto.go @@ -0,0 +1,228 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rand" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/asn1" + "encoding/binary" + "math/big" + "time" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/hash" +) + +type ecdsaSignature struct { + R, S *big.Int +} + +func valueKeyMessage(clientRandom, serverRandom, publicKey []byte, namedCurve elliptic.Curve) []byte { + serverECDHParams := make([]byte, 4) + serverECDHParams[0] = 3 // named curve + binary.BigEndian.PutUint16(serverECDHParams[1:], uint16(namedCurve)) + serverECDHParams[3] = byte(len(publicKey)) + + plaintext := []byte{} + plaintext = append(plaintext, clientRandom...) + plaintext = append(plaintext, serverRandom...) + plaintext = append(plaintext, serverECDHParams...) + plaintext = append(plaintext, publicKey...) + + return plaintext +} + +// If the client provided a "signature_algorithms" extension, then all +// certificates provided by the server MUST be signed by a +// hash/signature algorithm pair that appears in that extension +// +// https://tools.ietf.org/html/rfc5246#section-7.4.2 +func generateKeySignature(clientRandom, serverRandom, publicKey []byte, namedCurve elliptic.Curve, privateKey crypto.PrivateKey, hashAlgorithm hash.Algorithm) ([]byte, error) { + msg := valueKeyMessage(clientRandom, serverRandom, publicKey, namedCurve) + switch p := privateKey.(type) { + case ed25519.PrivateKey: + // https://crypto.stackexchange.com/a/55483 + return p.Sign(rand.Reader, msg, crypto.Hash(0)) + case *ecdsa.PrivateKey: + hashed := hashAlgorithm.Digest(msg) + return p.Sign(rand.Reader, hashed, hashAlgorithm.CryptoHash()) + case *rsa.PrivateKey: + hashed := hashAlgorithm.Digest(msg) + return p.Sign(rand.Reader, hashed, hashAlgorithm.CryptoHash()) + } + + return nil, errKeySignatureGenerateUnimplemented +} + +func verifyKeySignature(message, remoteKeySignature []byte, hashAlgorithm hash.Algorithm, rawCertificates [][]byte) error { //nolint:dupl + if len(rawCertificates) == 0 { + return errLengthMismatch + } + certificate, err := x509.ParseCertificate(rawCertificates[0]) + if err != nil { + return err + } + + switch p := certificate.PublicKey.(type) { + case ed25519.PublicKey: + if ok := ed25519.Verify(p, message, remoteKeySignature); !ok { + return errKeySignatureMismatch + } + return nil + case *ecdsa.PublicKey: + ecdsaSig := &ecdsaSignature{} + if _, err := asn1.Unmarshal(remoteKeySignature, ecdsaSig); err != nil { + return err + } + if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 { + return errInvalidECDSASignature + } + hashed := hashAlgorithm.Digest(message) + if !ecdsa.Verify(p, hashed, ecdsaSig.R, ecdsaSig.S) { + return errKeySignatureMismatch + } + return nil + case *rsa.PublicKey: + switch certificate.SignatureAlgorithm { + case x509.SHA1WithRSA, x509.SHA256WithRSA, x509.SHA384WithRSA, x509.SHA512WithRSA: + hashed := hashAlgorithm.Digest(message) + return rsa.VerifyPKCS1v15(p, hashAlgorithm.CryptoHash(), hashed, remoteKeySignature) + default: + return errKeySignatureVerifyUnimplemented + } + } + + return errKeySignatureVerifyUnimplemented +} + +// If the server has sent a CertificateRequest message, the client MUST send the Certificate +// message. The ClientKeyExchange message is now sent, and the content +// of that message will depend on the public key algorithm selected +// between the ClientHello and the ServerHello. If the client has sent +// a certificate with signing ability, a digitally-signed +// CertificateVerify message is sent to explicitly verify possession of +// the private key in the certificate. +// https://tools.ietf.org/html/rfc5246#section-7.3 +func generateCertificateVerify(handshakeBodies []byte, privateKey crypto.PrivateKey, hashAlgorithm hash.Algorithm) ([]byte, error) { + if p, ok := privateKey.(ed25519.PrivateKey); ok { + // https://pkg.go.dev/crypto/ed25519#PrivateKey.Sign + // Sign signs the given message with priv. Ed25519 performs two passes over + // messages to be signed and therefore cannot handle pre-hashed messages. + return p.Sign(rand.Reader, handshakeBodies, crypto.Hash(0)) + } + + h := sha256.New() + if _, err := h.Write(handshakeBodies); err != nil { + return nil, err + } + hashed := h.Sum(nil) + + switch p := privateKey.(type) { + case *ecdsa.PrivateKey: + return p.Sign(rand.Reader, hashed, hashAlgorithm.CryptoHash()) + case *rsa.PrivateKey: + return p.Sign(rand.Reader, hashed, hashAlgorithm.CryptoHash()) + } + + return nil, errInvalidSignatureAlgorithm +} + +func verifyCertificateVerify(handshakeBodies []byte, hashAlgorithm hash.Algorithm, remoteKeySignature []byte, rawCertificates [][]byte) error { //nolint:dupl + if len(rawCertificates) == 0 { + return errLengthMismatch + } + certificate, err := x509.ParseCertificate(rawCertificates[0]) + if err != nil { + return err + } + + switch p := certificate.PublicKey.(type) { + case ed25519.PublicKey: + if ok := ed25519.Verify(p, handshakeBodies, remoteKeySignature); !ok { + return errKeySignatureMismatch + } + return nil + case *ecdsa.PublicKey: + ecdsaSig := &ecdsaSignature{} + if _, err := asn1.Unmarshal(remoteKeySignature, ecdsaSig); err != nil { + return err + } + if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 { + return errInvalidECDSASignature + } + hash := hashAlgorithm.Digest(handshakeBodies) + if !ecdsa.Verify(p, hash, ecdsaSig.R, ecdsaSig.S) { + return errKeySignatureMismatch + } + return nil + case *rsa.PublicKey: + switch certificate.SignatureAlgorithm { + case x509.SHA1WithRSA, x509.SHA256WithRSA, x509.SHA384WithRSA, x509.SHA512WithRSA: + hash := hashAlgorithm.Digest(handshakeBodies) + return rsa.VerifyPKCS1v15(p, hashAlgorithm.CryptoHash(), hash, remoteKeySignature) + default: + return errKeySignatureVerifyUnimplemented + } + } + + return errKeySignatureVerifyUnimplemented +} + +func loadCerts(rawCertificates [][]byte) ([]*x509.Certificate, error) { + if len(rawCertificates) == 0 { + return nil, errLengthMismatch + } + + certs := make([]*x509.Certificate, 0, len(rawCertificates)) + for _, rawCert := range rawCertificates { + cert, err := x509.ParseCertificate(rawCert) + if err != nil { + return nil, err + } + certs = append(certs, cert) + } + return certs, nil +} + +func verifyClientCert(rawCertificates [][]byte, roots *x509.CertPool) (chains [][]*x509.Certificate, err error) { + certificate, err := loadCerts(rawCertificates) + if err != nil { + return nil, err + } + intermediateCAPool := x509.NewCertPool() + for _, cert := range certificate[1:] { + intermediateCAPool.AddCert(cert) + } + opts := x509.VerifyOptions{ + Roots: roots, + CurrentTime: time.Now(), + Intermediates: intermediateCAPool, + KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + } + return certificate[0].Verify(opts) +} + +func verifyServerCert(rawCertificates [][]byte, roots *x509.CertPool, serverName string) (chains [][]*x509.Certificate, err error) { + certificate, err := loadCerts(rawCertificates) + if err != nil { + return nil, err + } + intermediateCAPool := x509.NewCertPool() + for _, cert := range certificate[1:] { + intermediateCAPool.AddCert(cert) + } + opts := x509.VerifyOptions{ + Roots: roots, + CurrentTime: time.Now(), + DNSName: serverName, + Intermediates: intermediateCAPool, + } + return certificate[0].Verify(opts) +} diff --git a/vendor/github.com/pion/dtls/v2/dtls.go b/vendor/github.com/pion/dtls/v2/dtls.go new file mode 100644 index 000000000..b799770d8 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/dtls.go @@ -0,0 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package dtls implements Datagram Transport Layer Security (DTLS) 1.2 +package dtls diff --git a/vendor/github.com/pion/dtls/v2/errors.go b/vendor/github.com/pion/dtls/v2/errors.go new file mode 100644 index 000000000..025d8645e --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/errors.go @@ -0,0 +1,157 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "os" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" +) + +// Typed errors +var ( + ErrConnClosed = &FatalError{Err: errors.New("conn is closed")} //nolint:goerr113 + + errDeadlineExceeded = &TimeoutError{Err: fmt.Errorf("read/write timeout: %w", context.DeadlineExceeded)} + errInvalidContentType = &TemporaryError{Err: errors.New("invalid content type")} //nolint:goerr113 + + errBufferTooSmall = &TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errContextUnsupported = &TemporaryError{Err: errors.New("context is not supported for ExportKeyingMaterial")} //nolint:goerr113 + errHandshakeInProgress = &TemporaryError{Err: errors.New("handshake is in progress")} //nolint:goerr113 + errReservedExportKeyingMaterial = &TemporaryError{Err: errors.New("ExportKeyingMaterial can not be used with a reserved label")} //nolint:goerr113 + errApplicationDataEpochZero = &TemporaryError{Err: errors.New("ApplicationData with epoch of 0")} //nolint:goerr113 + errUnhandledContextType = &TemporaryError{Err: errors.New("unhandled contentType")} //nolint:goerr113 + + errCertificateVerifyNoCertificate = &FatalError{Err: errors.New("client sent certificate verify but we have no certificate to verify")} //nolint:goerr113 + errCipherSuiteNoIntersection = &FatalError{Err: errors.New("client+server do not support any shared cipher suites")} //nolint:goerr113 + errClientCertificateNotVerified = &FatalError{Err: errors.New("client sent certificate but did not verify it")} //nolint:goerr113 + errClientCertificateRequired = &FatalError{Err: errors.New("server required client verification, but got none")} //nolint:goerr113 + errClientNoMatchingSRTPProfile = &FatalError{Err: errors.New("server responded with SRTP Profile we do not support")} //nolint:goerr113 + errClientRequiredButNoServerEMS = &FatalError{Err: errors.New("client required Extended Master Secret extension, but server does not support it")} //nolint:goerr113 + errCookieMismatch = &FatalError{Err: errors.New("client+server cookie does not match")} //nolint:goerr113 + errIdentityNoPSK = &FatalError{Err: errors.New("PSK Identity Hint provided but PSK is nil")} //nolint:goerr113 + errInvalidCertificate = &FatalError{Err: errors.New("no certificate provided")} //nolint:goerr113 + errInvalidCipherSuite = &FatalError{Err: errors.New("invalid or unknown cipher suite")} //nolint:goerr113 + errInvalidECDSASignature = &FatalError{Err: errors.New("ECDSA signature contained zero or negative values")} //nolint:goerr113 + errInvalidPrivateKey = &FatalError{Err: errors.New("invalid private key type")} //nolint:goerr113 + errInvalidSignatureAlgorithm = &FatalError{Err: errors.New("invalid signature algorithm")} //nolint:goerr113 + errKeySignatureMismatch = &FatalError{Err: errors.New("expected and actual key signature do not match")} //nolint:goerr113 + errNilNextConn = &FatalError{Err: errors.New("Conn can not be created with a nil nextConn")} //nolint:goerr113 + errNoAvailableCipherSuites = &FatalError{Err: errors.New("connection can not be created, no CipherSuites satisfy this Config")} //nolint:goerr113 + errNoAvailablePSKCipherSuite = &FatalError{Err: errors.New("connection can not be created, pre-shared key present but no compatible CipherSuite")} //nolint:goerr113 + errNoAvailableCertificateCipherSuite = &FatalError{Err: errors.New("connection can not be created, certificate present but no compatible CipherSuite")} //nolint:goerr113 + errNoAvailableSignatureSchemes = &FatalError{Err: errors.New("connection can not be created, no SignatureScheme satisfy this Config")} //nolint:goerr113 + errNoCertificates = &FatalError{Err: errors.New("no certificates configured")} //nolint:goerr113 + errNoConfigProvided = &FatalError{Err: errors.New("no config provided")} //nolint:goerr113 + errNoSupportedEllipticCurves = &FatalError{Err: errors.New("client requested zero or more elliptic curves that are not supported by the server")} //nolint:goerr113 + errUnsupportedProtocolVersion = &FatalError{Err: errors.New("unsupported protocol version")} //nolint:goerr113 + errPSKAndIdentityMustBeSetForClient = &FatalError{Err: errors.New("PSK and PSK Identity Hint must both be set for client")} //nolint:goerr113 + errRequestedButNoSRTPExtension = &FatalError{Err: errors.New("SRTP support was requested but server did not respond with use_srtp extension")} //nolint:goerr113 + errServerNoMatchingSRTPProfile = &FatalError{Err: errors.New("client requested SRTP but we have no matching profiles")} //nolint:goerr113 + errServerRequiredButNoClientEMS = &FatalError{Err: errors.New("server requires the Extended Master Secret extension, but the client does not support it")} //nolint:goerr113 + errVerifyDataMismatch = &FatalError{Err: errors.New("expected and actual verify data does not match")} //nolint:goerr113 + errNotAcceptableCertificateChain = &FatalError{Err: errors.New("certificate chain is not signed by an acceptable CA")} //nolint:goerr113 + + errInvalidFlight = &InternalError{Err: errors.New("invalid flight number")} //nolint:goerr113 + errKeySignatureGenerateUnimplemented = &InternalError{Err: errors.New("unable to generate key signature, unimplemented")} //nolint:goerr113 + errKeySignatureVerifyUnimplemented = &InternalError{Err: errors.New("unable to verify key signature, unimplemented")} //nolint:goerr113 + errLengthMismatch = &InternalError{Err: errors.New("data length and declared length do not match")} //nolint:goerr113 + errSequenceNumberOverflow = &InternalError{Err: errors.New("sequence number overflow")} //nolint:goerr113 + errInvalidFSMTransition = &InternalError{Err: errors.New("invalid state machine transition")} //nolint:goerr113 + errFailedToAccessPoolReadBuffer = &InternalError{Err: errors.New("failed to access pool read buffer")} //nolint:goerr113 + errFragmentBufferOverflow = &InternalError{Err: errors.New("fragment buffer overflow")} //nolint:goerr113 +) + +// FatalError indicates that the DTLS connection is no longer available. +// It is mainly caused by wrong configuration of server or client. +type FatalError = protocol.FatalError + +// InternalError indicates and internal error caused by the implementation, and the DTLS connection is no longer available. +// It is mainly caused by bugs or tried to use unimplemented features. +type InternalError = protocol.InternalError + +// TemporaryError indicates that the DTLS connection is still available, but the request was failed temporary. +type TemporaryError = protocol.TemporaryError + +// TimeoutError indicates that the request was timed out. +type TimeoutError = protocol.TimeoutError + +// HandshakeError indicates that the handshake failed. +type HandshakeError = protocol.HandshakeError + +// errInvalidCipherSuite indicates an attempt at using an unsupported cipher suite. +type invalidCipherSuiteError struct { + id CipherSuiteID +} + +func (e *invalidCipherSuiteError) Error() string { + return fmt.Sprintf("CipherSuite with id(%d) is not valid", e.id) +} + +func (e *invalidCipherSuiteError) Is(err error) bool { + var other *invalidCipherSuiteError + if errors.As(err, &other) { + return e.id == other.id + } + return false +} + +// errAlert wraps DTLS alert notification as an error +type alertError struct { + *alert.Alert +} + +func (e *alertError) Error() string { + return fmt.Sprintf("alert: %s", e.Alert.String()) +} + +func (e *alertError) IsFatalOrCloseNotify() bool { + return e.Level == alert.Fatal || e.Description == alert.CloseNotify +} + +func (e *alertError) Is(err error) bool { + var other *alertError + if errors.As(err, &other) { + return e.Level == other.Level && e.Description == other.Description + } + return false +} + +// netError translates an error from underlying Conn to corresponding net.Error. +func netError(err error) error { + switch { + case errors.Is(err, io.EOF), errors.Is(err, context.Canceled), errors.Is(err, context.DeadlineExceeded): + // Return io.EOF and context errors as is. + return err + } + + var ( + ne net.Error + opError *net.OpError + se *os.SyscallError + ) + + if errors.As(err, &opError) { + if errors.As(opError, &se) { + if se.Timeout() { + return &TimeoutError{Err: err} + } + if isOpErrorTemporary(se) { + return &TemporaryError{Err: err} + } + } + } + + if errors.As(err, &ne) { + return err + } + + return &FatalError{Err: err} +} diff --git a/vendor/github.com/pion/dtls/v2/errors_errno.go b/vendor/github.com/pion/dtls/v2/errors_errno.go new file mode 100644 index 000000000..f8e424eb3 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/errors_errno.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build aix || darwin || dragonfly || freebsd || linux || nacl || nacljs || netbsd || openbsd || solaris || windows +// +build aix darwin dragonfly freebsd linux nacl nacljs netbsd openbsd solaris windows + +// For systems having syscall.Errno. +// Update build targets by following command: +// $ grep -R ECONN $(go env GOROOT)/src/syscall/zerrors_*.go \ +// | tr "." "_" | cut -d"_" -f"2" | sort | uniq + +package dtls + +import ( + "errors" + "os" + "syscall" +) + +func isOpErrorTemporary(err *os.SyscallError) bool { + return errors.Is(err.Err, syscall.ECONNREFUSED) +} diff --git a/vendor/github.com/pion/dtls/v2/errors_noerrno.go b/vendor/github.com/pion/dtls/v2/errors_noerrno.go new file mode 100644 index 000000000..844ff1e75 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/errors_noerrno.go @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !nacl && !nacljs && !netbsd && !openbsd && !solaris && !windows +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!nacl,!nacljs,!netbsd,!openbsd,!solaris,!windows + +// For systems without syscall.Errno. +// Build targets must be inverse of errors_errno.go + +package dtls + +import ( + "os" +) + +func isOpErrorTemporary(err *os.SyscallError) bool { + return false +} diff --git a/vendor/github.com/pion/dtls/v2/flight.go b/vendor/github.com/pion/dtls/v2/flight.go new file mode 100644 index 000000000..cfa58c574 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight.go @@ -0,0 +1,104 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +/* + DTLS messages are grouped into a series of message flights, according + to the diagrams below. Although each flight of messages may consist + of a number of messages, they should be viewed as monolithic for the + purpose of timeout and retransmission. + https://tools.ietf.org/html/rfc4347#section-4.2.4 + + Message flights for full handshake: + + Client Server + ------ ------ + Waiting Flight 0 + + ClientHello --------> Flight 1 + + <------- HelloVerifyRequest Flight 2 + + ClientHello --------> Flight 3 + + ServerHello \ + Certificate* \ + ServerKeyExchange* Flight 4 + CertificateRequest* / + <-------- ServerHelloDone / + + Certificate* \ + ClientKeyExchange \ + CertificateVerify* Flight 5 + [ChangeCipherSpec] / + Finished --------> / + + [ChangeCipherSpec] \ Flight 6 + <-------- Finished / + + Message flights for session-resuming handshake (no cookie exchange): + + Client Server + ------ ------ + Waiting Flight 0 + + ClientHello --------> Flight 1 + + ServerHello \ + [ChangeCipherSpec] Flight 4b + <-------- Finished / + + [ChangeCipherSpec] \ Flight 5b + Finished --------> / + + [ChangeCipherSpec] \ Flight 6 + <-------- Finished / +*/ + +type flightVal uint8 + +const ( + flight0 flightVal = iota + 1 + flight1 + flight2 + flight3 + flight4 + flight4b + flight5 + flight5b + flight6 +) + +func (f flightVal) String() string { + switch f { + case flight0: + return "Flight 0" + case flight1: + return "Flight 1" + case flight2: + return "Flight 2" + case flight3: + return "Flight 3" + case flight4: + return "Flight 4" + case flight4b: + return "Flight 4b" + case flight5: + return "Flight 5" + case flight5b: + return "Flight 5b" + case flight6: + return "Flight 6" + default: + return "Invalid Flight" + } +} + +func (f flightVal) isLastSendFlight() bool { + return f == flight6 || f == flight5b +} + +func (f flightVal) isLastRecvFlight() bool { + return f == flight5 || f == flight4b +} diff --git a/vendor/github.com/pion/dtls/v2/flight0handler.go b/vendor/github.com/pion/dtls/v2/flight0handler.go new file mode 100644 index 000000000..ec766ddff --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight0handler.go @@ -0,0 +1,138 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "crypto/rand" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/extension" + "github.com/pion/dtls/v2/pkg/protocol/handshake" +) + +func flight0Parse(_ context.Context, _ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + seq, msgs, ok := cache.fullPullMap(0, state.cipherSuite, + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + state.handshakeRecvSequence = seq + + var clientHello *handshake.MessageClientHello + + // Validate type + if clientHello, ok = msgs[handshake.TypeClientHello].(*handshake.MessageClientHello); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + if !clientHello.Version.Equal(protocol.Version1_2) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion + } + + state.remoteRandom = clientHello.Random + + cipherSuites := []CipherSuite{} + for _, id := range clientHello.CipherSuiteIDs { + if c := cipherSuiteForID(CipherSuiteID(id), cfg.customCipherSuites); c != nil { + cipherSuites = append(cipherSuites, c) + } + } + + if state.cipherSuite, ok = findMatchingCipherSuite(cipherSuites, cfg.localCipherSuites); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errCipherSuiteNoIntersection + } + + for _, val := range clientHello.Extensions { + switch e := val.(type) { + case *extension.SupportedEllipticCurves: + if len(e.EllipticCurves) == 0 { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errNoSupportedEllipticCurves + } + state.namedCurve = e.EllipticCurves[0] + case *extension.UseSRTP: + profile, ok := findMatchingSRTPProfile(e.ProtectionProfiles, cfg.localSRTPProtectionProfiles) + if !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errServerNoMatchingSRTPProfile + } + state.srtpProtectionProfile = profile + case *extension.UseExtendedMasterSecret: + if cfg.extendedMasterSecret != DisableExtendedMasterSecret { + state.extendedMasterSecret = true + } + case *extension.ServerName: + state.serverName = e.ServerName // remote server name + case *extension.ALPN: + state.peerSupportedProtocols = e.ProtocolNameList + } + } + + if cfg.extendedMasterSecret == RequireExtendedMasterSecret && !state.extendedMasterSecret { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errServerRequiredButNoClientEMS + } + + if state.localKeypair == nil { + var err error + state.localKeypair, err = elliptic.GenerateKeypair(state.namedCurve) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.IllegalParameter}, err + } + } + + nextFlight := flight2 + + if cfg.insecureSkipHelloVerify { + nextFlight = flight4 + } + + return handleHelloResume(clientHello.SessionID, state, cfg, nextFlight) +} + +func handleHelloResume(sessionID []byte, state *State, cfg *handshakeConfig, next flightVal) (flightVal, *alert.Alert, error) { + if len(sessionID) > 0 && cfg.sessionStore != nil { + if s, err := cfg.sessionStore.Get(sessionID); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } else if s.ID != nil { + cfg.log.Tracef("[handshake] resume session: %x", sessionID) + + state.SessionID = sessionID + state.masterSecret = s.Secret + + if err := state.initCipherSuite(); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + clientRandom := state.localRandom.MarshalFixed() + cfg.writeKeyLog(keyLogLabelTLS12, clientRandom[:], state.masterSecret) + + return flight4b, nil, nil + } + } + return next, nil, nil +} + +func flight0Generate(_ flightConn, state *State, _ *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + // Initialize + if !cfg.insecureSkipHelloVerify { + state.cookie = make([]byte, cookieLength) + if _, err := rand.Read(state.cookie); err != nil { + return nil, nil, err + } + } + + var zeroEpoch uint16 + state.localEpoch.Store(zeroEpoch) + state.remoteEpoch.Store(zeroEpoch) + state.namedCurve = defaultNamedCurve + + if err := state.localRandom.Populate(); err != nil { + return nil, nil, err + } + + return nil, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight1handler.go b/vendor/github.com/pion/dtls/v2/flight1handler.go new file mode 100644 index 000000000..20a08f909 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight1handler.go @@ -0,0 +1,145 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/extension" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight1Parse(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + // HelloVerifyRequest can be skipped by the server, + // so allow ServerHello during flight1 also + seq, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeHelloVerifyRequest, cfg.initialEpoch, false, true}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, true}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + if _, ok := msgs[handshake.TypeServerHello]; ok { + // Flight1 and flight2 were skipped. + // Parse as flight3. + return flight3Parse(ctx, c, state, cache, cfg) + } + + if h, ok := msgs[handshake.TypeHelloVerifyRequest].(*handshake.MessageHelloVerifyRequest); ok { + // DTLS 1.2 clients must not assume that the server will use the protocol version + // specified in HelloVerifyRequest message. RFC 6347 Section 4.2.1 + if !h.Version.Equal(protocol.Version1_0) && !h.Version.Equal(protocol.Version1_2) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion + } + state.cookie = append([]byte{}, h.Cookie...) + state.handshakeRecvSequence = seq + return flight3, nil, nil + } + + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil +} + +func flight1Generate(c flightConn, state *State, _ *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + var zeroEpoch uint16 + state.localEpoch.Store(zeroEpoch) + state.remoteEpoch.Store(zeroEpoch) + state.namedCurve = defaultNamedCurve + state.cookie = nil + + if err := state.localRandom.Populate(); err != nil { + return nil, nil, err + } + + if state.isClient && cfg.customClientHelloRandom != nil { + state.localRandom.RandomBytes = cfg.customClientHelloRandom() + } + + extensions := []extension.Extension{ + &extension.SupportedSignatureAlgorithms{ + SignatureHashAlgorithms: cfg.localSignatureSchemes, + }, + &extension.RenegotiationInfo{ + RenegotiatedConnection: 0, + }, + } + + var setEllipticCurveCryptographyClientHelloExtensions bool + for _, c := range cfg.localCipherSuites { + if c.ECC() { + setEllipticCurveCryptographyClientHelloExtensions = true + break + } + } + + if setEllipticCurveCryptographyClientHelloExtensions { + extensions = append(extensions, []extension.Extension{ + &extension.SupportedEllipticCurves{ + EllipticCurves: cfg.ellipticCurves, + }, + &extension.SupportedPointFormats{ + PointFormats: []elliptic.CurvePointFormat{elliptic.CurvePointFormatUncompressed}, + }, + }...) + } + + if len(cfg.localSRTPProtectionProfiles) > 0 { + extensions = append(extensions, &extension.UseSRTP{ + ProtectionProfiles: cfg.localSRTPProtectionProfiles, + }) + } + + if cfg.extendedMasterSecret == RequestExtendedMasterSecret || + cfg.extendedMasterSecret == RequireExtendedMasterSecret { + extensions = append(extensions, &extension.UseExtendedMasterSecret{ + Supported: true, + }) + } + + if len(cfg.serverName) > 0 { + extensions = append(extensions, &extension.ServerName{ServerName: cfg.serverName}) + } + + if len(cfg.supportedProtocols) > 0 { + extensions = append(extensions, &extension.ALPN{ProtocolNameList: cfg.supportedProtocols}) + } + + if cfg.sessionStore != nil { + cfg.log.Tracef("[handshake] try to resume session") + if s, err := cfg.sessionStore.Get(c.sessionKey()); err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } else if s.ID != nil { + cfg.log.Tracef("[handshake] get saved session: %x", s.ID) + + state.SessionID = s.ID + state.masterSecret = s.Secret + } + } + + return []*packet{ + { + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageClientHello{ + Version: protocol.Version1_2, + SessionID: state.SessionID, + Cookie: state.cookie, + Random: state.localRandom, + CipherSuiteIDs: cipherSuiteIDs(cfg.localCipherSuites), + CompressionMethods: defaultCompressionMethods(), + Extensions: extensions, + }, + }, + }, + }, + }, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight2handler.go b/vendor/github.com/pion/dtls/v2/flight2handler.go new file mode 100644 index 000000000..26e57d2f2 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight2handler.go @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "context" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight2Parse(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + seq, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + ) + if !ok { + // Client may retransmit the first ClientHello when HelloVerifyRequest is dropped. + // Parse as flight 0 in this case. + return flight0Parse(ctx, c, state, cache, cfg) + } + state.handshakeRecvSequence = seq + + var clientHello *handshake.MessageClientHello + + // Validate type + if clientHello, ok = msgs[handshake.TypeClientHello].(*handshake.MessageClientHello); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + if !clientHello.Version.Equal(protocol.Version1_2) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion + } + + if len(clientHello.Cookie) == 0 { + return 0, nil, nil + } + if !bytes.Equal(state.cookie, clientHello.Cookie) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.AccessDenied}, errCookieMismatch + } + return flight4, nil, nil +} + +func flight2Generate(_ flightConn, state *State, _ *handshakeCache, _ *handshakeConfig) ([]*packet, *alert.Alert, error) { + state.handshakeSendSequence = 0 + return []*packet{ + { + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageHelloVerifyRequest{ + Version: protocol.Version1_2, + Cookie: state.cookie, + }, + }, + }, + }, + }, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight3handler.go b/vendor/github.com/pion/dtls/v2/flight3handler.go new file mode 100644 index 000000000..5a763dc08 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight3handler.go @@ -0,0 +1,291 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "context" + + "github.com/pion/dtls/v2/internal/ciphersuite/types" + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/extension" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight3Parse(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { //nolint:gocognit + // Clients may receive multiple HelloVerifyRequest messages with different cookies. + // Clients SHOULD handle this by sending a new ClientHello with a cookie in response + // to the new HelloVerifyRequest. RFC 6347 Section 4.2.1 + seq, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeHelloVerifyRequest, cfg.initialEpoch, false, true}, + ) + if ok { + if h, msgOk := msgs[handshake.TypeHelloVerifyRequest].(*handshake.MessageHelloVerifyRequest); msgOk { + // DTLS 1.2 clients must not assume that the server will use the protocol version + // specified in HelloVerifyRequest message. RFC 6347 Section 4.2.1 + if !h.Version.Equal(protocol.Version1_0) && !h.Version.Equal(protocol.Version1_2) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion + } + state.cookie = append([]byte{}, h.Cookie...) + state.handshakeRecvSequence = seq + return flight3, nil, nil + } + } + + _, msgs, ok = cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + ) + if !ok { + // Don't have enough messages. Keep reading + return 0, nil, nil + } + + if h, msgOk := msgs[handshake.TypeServerHello].(*handshake.MessageServerHello); msgOk { + if !h.Version.Equal(protocol.Version1_2) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.ProtocolVersion}, errUnsupportedProtocolVersion + } + for _, v := range h.Extensions { + switch e := v.(type) { + case *extension.UseSRTP: + profile, found := findMatchingSRTPProfile(e.ProtectionProfiles, cfg.localSRTPProtectionProfiles) + if !found { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.IllegalParameter}, errClientNoMatchingSRTPProfile + } + state.srtpProtectionProfile = profile + case *extension.UseExtendedMasterSecret: + if cfg.extendedMasterSecret != DisableExtendedMasterSecret { + state.extendedMasterSecret = true + } + case *extension.ALPN: + if len(e.ProtocolNameList) > 1 { // This should be exactly 1, the zero case is handle when unmarshalling + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, extension.ErrALPNInvalidFormat // Meh, internal error? + } + state.NegotiatedProtocol = e.ProtocolNameList[0] + } + } + if cfg.extendedMasterSecret == RequireExtendedMasterSecret && !state.extendedMasterSecret { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errClientRequiredButNoServerEMS + } + if len(cfg.localSRTPProtectionProfiles) > 0 && state.srtpProtectionProfile == 0 { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errRequestedButNoSRTPExtension + } + + remoteCipherSuite := cipherSuiteForID(CipherSuiteID(*h.CipherSuiteID), cfg.customCipherSuites) + if remoteCipherSuite == nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errCipherSuiteNoIntersection + } + + selectedCipherSuite, found := findMatchingCipherSuite([]CipherSuite{remoteCipherSuite}, cfg.localCipherSuites) + if !found { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errInvalidCipherSuite + } + + state.cipherSuite = selectedCipherSuite + state.remoteRandom = h.Random + cfg.log.Tracef("[handshake] use cipher suite: %s", selectedCipherSuite.String()) + + if len(h.SessionID) > 0 && bytes.Equal(state.SessionID, h.SessionID) { + return handleResumption(ctx, c, state, cache, cfg) + } + + if len(state.SessionID) > 0 { + cfg.log.Tracef("[handshake] clean old session : %s", state.SessionID) + if err := cfg.sessionStore.Del(state.SessionID); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + if cfg.sessionStore == nil { + state.SessionID = []byte{} + } else { + state.SessionID = h.SessionID + } + + state.masterSecret = []byte{} + } + + if cfg.localPSKCallback != nil { + seq, msgs, ok = cache.fullPullMap(state.handshakeRecvSequence+1, state.cipherSuite, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, true}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + ) + } else { + seq, msgs, ok = cache.fullPullMap(state.handshakeRecvSequence+1, state.cipherSuite, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, true}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, true}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + ) + } + if !ok { + // Don't have enough messages. Keep reading + return 0, nil, nil + } + state.handshakeRecvSequence = seq + + if h, ok := msgs[handshake.TypeCertificate].(*handshake.MessageCertificate); ok { + state.PeerCertificates = h.Certificate + } else if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.NoCertificate}, errInvalidCertificate + } + + if h, ok := msgs[handshake.TypeServerKeyExchange].(*handshake.MessageServerKeyExchange); ok { + alertPtr, err := handleServerKeyExchange(c, state, cfg, h) + if err != nil { + return 0, alertPtr, err + } + } + + if _, ok := msgs[handshake.TypeCertificateRequest].(*handshake.MessageCertificateRequest); ok { + state.remoteRequestedCertificate = true + } + + return flight5, nil, nil +} + +func handleResumption(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + if err := state.initCipherSuite(); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + // Now, encrypted packets can be handled + if err := c.handleQueuedPackets(ctx); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence+1, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, false, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + var finished *handshake.MessageFinished + if finished, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + ) + + expectedVerifyData, err := prf.VerifyDataServer(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + if !bytes.Equal(expectedVerifyData, finished.VerifyData) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errVerifyDataMismatch + } + + clientRandom := state.localRandom.MarshalFixed() + cfg.writeKeyLog(keyLogLabelTLS12, clientRandom[:], state.masterSecret) + + return flight5b, nil, nil +} + +func handleServerKeyExchange(_ flightConn, state *State, cfg *handshakeConfig, h *handshake.MessageServerKeyExchange) (*alert.Alert, error) { + var err error + if state.cipherSuite == nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errInvalidCipherSuite + } + if cfg.localPSKCallback != nil { + var psk []byte + if psk, err = cfg.localPSKCallback(h.IdentityHint); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + state.IdentityHint = h.IdentityHint + switch state.cipherSuite.KeyExchangeAlgorithm() { + case types.KeyExchangeAlgorithmPsk: + state.preMasterSecret = prf.PSKPreMasterSecret(psk) + case (types.KeyExchangeAlgorithmEcdhe | types.KeyExchangeAlgorithmPsk): + if state.localKeypair, err = elliptic.GenerateKeypair(h.NamedCurve); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + state.preMasterSecret, err = prf.EcdhePSKPreMasterSecret(psk, h.PublicKey, state.localKeypair.PrivateKey, state.localKeypair.Curve) + if err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + default: + return &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errInvalidCipherSuite + } + } else { + if state.localKeypair, err = elliptic.GenerateKeypair(h.NamedCurve); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + if state.preMasterSecret, err = prf.PreMasterSecret(h.PublicKey, state.localKeypair.PrivateKey, state.localKeypair.Curve); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + return nil, nil //nolint:nilnil +} + +func flight3Generate(_ flightConn, state *State, _ *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + extensions := []extension.Extension{ + &extension.SupportedSignatureAlgorithms{ + SignatureHashAlgorithms: cfg.localSignatureSchemes, + }, + &extension.RenegotiationInfo{ + RenegotiatedConnection: 0, + }, + } + if state.namedCurve != 0 { + extensions = append(extensions, []extension.Extension{ + &extension.SupportedEllipticCurves{ + EllipticCurves: []elliptic.Curve{elliptic.X25519, elliptic.P256, elliptic.P384}, + }, + &extension.SupportedPointFormats{ + PointFormats: []elliptic.CurvePointFormat{elliptic.CurvePointFormatUncompressed}, + }, + }...) + } + + if len(cfg.localSRTPProtectionProfiles) > 0 { + extensions = append(extensions, &extension.UseSRTP{ + ProtectionProfiles: cfg.localSRTPProtectionProfiles, + }) + } + + if cfg.extendedMasterSecret == RequestExtendedMasterSecret || + cfg.extendedMasterSecret == RequireExtendedMasterSecret { + extensions = append(extensions, &extension.UseExtendedMasterSecret{ + Supported: true, + }) + } + + if len(cfg.serverName) > 0 { + extensions = append(extensions, &extension.ServerName{ServerName: cfg.serverName}) + } + + if len(cfg.supportedProtocols) > 0 { + extensions = append(extensions, &extension.ALPN{ProtocolNameList: cfg.supportedProtocols}) + } + + return []*packet{ + { + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageClientHello{ + Version: protocol.Version1_2, + SessionID: state.SessionID, + Cookie: state.cookie, + Random: state.localRandom, + CipherSuiteIDs: cipherSuiteIDs(cfg.localCipherSuites), + CompressionMethods: defaultCompressionMethods(), + Extensions: extensions, + }, + }, + }, + }, + }, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight4bhandler.go b/vendor/github.com/pion/dtls/v2/flight4bhandler.go new file mode 100644 index 000000000..6bbbc5972 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight4bhandler.go @@ -0,0 +1,144 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "context" + + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/extension" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight4bParse(_ context.Context, _ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + var finished *handshake.MessageFinished + if finished, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, false, false}, + ) + + expectedVerifyData, err := prf.VerifyDataClient(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + if !bytes.Equal(expectedVerifyData, finished.VerifyData) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errVerifyDataMismatch + } + + // Other party may re-transmit the last flight. Keep state to be flight4b. + return flight4b, nil, nil +} + +func flight4bGenerate(_ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + var pkts []*packet + + extensions := []extension.Extension{&extension.RenegotiationInfo{ + RenegotiatedConnection: 0, + }} + if (cfg.extendedMasterSecret == RequestExtendedMasterSecret || + cfg.extendedMasterSecret == RequireExtendedMasterSecret) && state.extendedMasterSecret { + extensions = append(extensions, &extension.UseExtendedMasterSecret{ + Supported: true, + }) + } + if state.srtpProtectionProfile != 0 { + extensions = append(extensions, &extension.UseSRTP{ + ProtectionProfiles: []SRTPProtectionProfile{state.srtpProtectionProfile}, + }) + } + + selectedProto, err := extension.ALPNProtocolSelection(cfg.supportedProtocols, state.peerSupportedProtocols) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.NoApplicationProtocol}, err + } + if selectedProto != "" { + extensions = append(extensions, &extension.ALPN{ + ProtocolNameList: []string{selectedProto}, + }) + state.NegotiatedProtocol = selectedProto + } + + cipherSuiteID := uint16(state.cipherSuite.ID()) + serverHello := &handshake.Handshake{ + Message: &handshake.MessageServerHello{ + Version: protocol.Version1_2, + Random: state.localRandom, + SessionID: state.SessionID, + CipherSuiteID: &cipherSuiteID, + CompressionMethod: defaultCompressionMethods()[0], + Extensions: extensions, + }, + } + + serverHello.Header.MessageSequence = uint16(state.handshakeSendSequence) + + if len(state.localVerifyData) == 0 { + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + ) + raw, err := serverHello.Marshal() + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + plainText = append(plainText, raw...) + + state.localVerifyData, err = prf.VerifyDataServer(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: serverHello, + }, + }, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &protocol.ChangeCipherSpec{}, + }, + }, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + Epoch: 1, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageFinished{ + VerifyData: state.localVerifyData, + }, + }, + }, + shouldEncrypt: true, + resetLocalSequenceNumber: true, + }, + ) + + return pkts, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight4handler.go b/vendor/github.com/pion/dtls/v2/flight4handler.go new file mode 100644 index 000000000..0e2091539 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight4handler.go @@ -0,0 +1,403 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "crypto/rand" + "crypto/x509" + + "github.com/pion/dtls/v2/internal/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/extension" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight4Parse(ctx context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { //nolint:gocognit + seq, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, true}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeCertificateVerify, cfg.initialEpoch, true, true}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + // Validate type + var clientKeyExchange *handshake.MessageClientKeyExchange + if clientKeyExchange, ok = msgs[handshake.TypeClientKeyExchange].(*handshake.MessageClientKeyExchange); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + if h, hasCert := msgs[handshake.TypeCertificate].(*handshake.MessageCertificate); hasCert { + state.PeerCertificates = h.Certificate + // If the client offer its certificate, just disable session resumption. + // Otherwise, we have to store the certificate identitfication and expire time. + // And we have to check whether this certificate expired, revoked or changed. + // + // https://curl.se/docs/CVE-2016-5419.html + state.SessionID = nil + } + + if h, hasCertVerify := msgs[handshake.TypeCertificateVerify].(*handshake.MessageCertificateVerify); hasCertVerify { + if state.PeerCertificates == nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.NoCertificate}, errCertificateVerifyNoCertificate + } + + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + ) + + // Verify that the pair of hash algorithm and signiture is listed. + var validSignatureScheme bool + for _, ss := range cfg.localSignatureSchemes { + if ss.Hash == h.HashAlgorithm && ss.Signature == h.SignatureAlgorithm { + validSignatureScheme = true + break + } + } + if !validSignatureScheme { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errNoAvailableSignatureSchemes + } + + if err := verifyCertificateVerify(plainText, h.HashAlgorithm, h.Signature, state.PeerCertificates); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + var chains [][]*x509.Certificate + var err error + var verified bool + if cfg.clientAuth >= VerifyClientCertIfGiven { + if chains, err = verifyClientCert(state.PeerCertificates, cfg.clientCAs); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + verified = true + } + if cfg.verifyPeerCertificate != nil { + if err := cfg.verifyPeerCertificate(state.PeerCertificates, chains); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + state.peerCertificatesVerified = verified + } else if state.PeerCertificates != nil { + // A certificate was received, but we haven't seen a CertificateVerify + // keep reading until we receive one + return 0, nil, nil + } + + if !state.cipherSuite.IsInitialized() { + serverRandom := state.localRandom.MarshalFixed() + clientRandom := state.remoteRandom.MarshalFixed() + + var err error + var preMasterSecret []byte + if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypePreSharedKey { + var psk []byte + if psk, err = cfg.localPSKCallback(clientKeyExchange.IdentityHint); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + state.IdentityHint = clientKeyExchange.IdentityHint + switch state.cipherSuite.KeyExchangeAlgorithm() { + case CipherSuiteKeyExchangeAlgorithmPsk: + preMasterSecret = prf.PSKPreMasterSecret(psk) + case (CipherSuiteKeyExchangeAlgorithmPsk | CipherSuiteKeyExchangeAlgorithmEcdhe): + if preMasterSecret, err = prf.EcdhePSKPreMasterSecret(psk, clientKeyExchange.PublicKey, state.localKeypair.PrivateKey, state.localKeypair.Curve); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + default: + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, errInvalidCipherSuite + } + } else { + preMasterSecret, err = prf.PreMasterSecret(clientKeyExchange.PublicKey, state.localKeypair.PrivateKey, state.localKeypair.Curve) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.IllegalParameter}, err + } + } + + if state.extendedMasterSecret { + var sessionHash []byte + sessionHash, err = cache.sessionHash(state.cipherSuite.HashFunc(), cfg.initialEpoch) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + state.masterSecret, err = prf.ExtendedMasterSecret(preMasterSecret, sessionHash, state.cipherSuite.HashFunc()) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } else { + state.masterSecret, err = prf.MasterSecret(preMasterSecret, clientRandom[:], serverRandom[:], state.cipherSuite.HashFunc()) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + if err := state.cipherSuite.Init(state.masterSecret, clientRandom[:], serverRandom[:], false); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + cfg.writeKeyLog(keyLogLabelTLS12, clientRandom[:], state.masterSecret) + } + + if len(state.SessionID) > 0 { + s := Session{ + ID: state.SessionID, + Secret: state.masterSecret, + } + cfg.log.Tracef("[handshake] save new session: %x", s.ID) + if err := cfg.sessionStore.Set(state.SessionID, s); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + // Now, encrypted packets can be handled + if err := c.handleQueuedPackets(ctx); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + seq, msgs, ok = cache.fullPullMap(seq, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + state.handshakeRecvSequence = seq + + if _, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeAnonymous { + if cfg.verifyConnection != nil { + if err := cfg.verifyConnection(state.clone()); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + return flight6, nil, nil + } + + switch cfg.clientAuth { + case RequireAnyClientCert: + if state.PeerCertificates == nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.NoCertificate}, errClientCertificateRequired + } + case VerifyClientCertIfGiven: + if state.PeerCertificates != nil && !state.peerCertificatesVerified { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, errClientCertificateNotVerified + } + case RequireAndVerifyClientCert: + if state.PeerCertificates == nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.NoCertificate}, errClientCertificateRequired + } + if !state.peerCertificatesVerified { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, errClientCertificateNotVerified + } + case NoClientCert, RequestClientCert: + // go to flight6 + } + if cfg.verifyConnection != nil { + if err := cfg.verifyConnection(state.clone()); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + + return flight6, nil, nil +} + +func flight4Generate(_ flightConn, state *State, _ *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + extensions := []extension.Extension{&extension.RenegotiationInfo{ + RenegotiatedConnection: 0, + }} + if (cfg.extendedMasterSecret == RequestExtendedMasterSecret || + cfg.extendedMasterSecret == RequireExtendedMasterSecret) && state.extendedMasterSecret { + extensions = append(extensions, &extension.UseExtendedMasterSecret{ + Supported: true, + }) + } + if state.srtpProtectionProfile != 0 { + extensions = append(extensions, &extension.UseSRTP{ + ProtectionProfiles: []SRTPProtectionProfile{state.srtpProtectionProfile}, + }) + } + if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate { + extensions = append(extensions, &extension.SupportedPointFormats{ + PointFormats: []elliptic.CurvePointFormat{elliptic.CurvePointFormatUncompressed}, + }) + } + + selectedProto, err := extension.ALPNProtocolSelection(cfg.supportedProtocols, state.peerSupportedProtocols) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.NoApplicationProtocol}, err + } + if selectedProto != "" { + extensions = append(extensions, &extension.ALPN{ + ProtocolNameList: []string{selectedProto}, + }) + state.NegotiatedProtocol = selectedProto + } + + var pkts []*packet + cipherSuiteID := uint16(state.cipherSuite.ID()) + + if cfg.sessionStore != nil { + state.SessionID = make([]byte, sessionLength) + if _, err := rand.Read(state.SessionID); err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageServerHello{ + Version: protocol.Version1_2, + Random: state.localRandom, + SessionID: state.SessionID, + CipherSuiteID: &cipherSuiteID, + CompressionMethod: defaultCompressionMethods()[0], + Extensions: extensions, + }, + }, + }, + }) + + switch { + case state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate: + certificate, err := cfg.getCertificate(&ClientHelloInfo{ + ServerName: state.serverName, + CipherSuites: []ciphersuite.ID{state.cipherSuite.ID()}, + RandomBytes: state.remoteRandom.RandomBytes, + }) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, err + } + + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageCertificate{ + Certificate: certificate.Certificate, + }, + }, + }, + }) + + serverRandom := state.localRandom.MarshalFixed() + clientRandom := state.remoteRandom.MarshalFixed() + + // Find compatible signature scheme + signatureHashAlgo, err := signaturehash.SelectSignatureScheme(cfg.localSignatureSchemes, certificate.PrivateKey) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, err + } + + signature, err := generateKeySignature(clientRandom[:], serverRandom[:], state.localKeypair.PublicKey, state.namedCurve, certificate.PrivateKey, signatureHashAlgo.Hash) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + state.localKeySignature = signature + + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageServerKeyExchange{ + EllipticCurveType: elliptic.CurveTypeNamedCurve, + NamedCurve: state.namedCurve, + PublicKey: state.localKeypair.PublicKey, + HashAlgorithm: signatureHashAlgo.Hash, + SignatureAlgorithm: signatureHashAlgo.Signature, + Signature: state.localKeySignature, + }, + }, + }, + }) + + if cfg.clientAuth > NoClientCert { + // An empty list of certificateAuthorities signals to + // the client that it may send any certificate in response + // to our request. When we know the CAs we trust, then + // we can send them down, so that the client can choose + // an appropriate certificate to give to us. + var certificateAuthorities [][]byte + if cfg.clientCAs != nil { + // nolint:staticcheck // ignoring tlsCert.RootCAs.Subjects is deprecated ERR because cert does not come from SystemCertPool and it's ok if certificate authorities is empty. + certificateAuthorities = cfg.clientCAs.Subjects() + } + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageCertificateRequest{ + CertificateTypes: []clientcertificate.Type{clientcertificate.RSASign, clientcertificate.ECDSASign}, + SignatureHashAlgorithms: cfg.localSignatureSchemes, + CertificateAuthoritiesNames: certificateAuthorities, + }, + }, + }, + }) + } + case cfg.localPSKIdentityHint != nil || state.cipherSuite.KeyExchangeAlgorithm().Has(CipherSuiteKeyExchangeAlgorithmEcdhe): + // To help the client in selecting which identity to use, the server + // can provide a "PSK identity hint" in the ServerKeyExchange message. + // If no hint is provided and cipher suite doesn't use elliptic curve, + // the ServerKeyExchange message is omitted. + // + // https://tools.ietf.org/html/rfc4279#section-2 + srvExchange := &handshake.MessageServerKeyExchange{ + IdentityHint: cfg.localPSKIdentityHint, + } + if state.cipherSuite.KeyExchangeAlgorithm().Has(CipherSuiteKeyExchangeAlgorithmEcdhe) { + srvExchange.EllipticCurveType = elliptic.CurveTypeNamedCurve + srvExchange.NamedCurve = state.namedCurve + srvExchange.PublicKey = state.localKeypair.PublicKey + } + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: srvExchange, + }, + }, + }) + } + + pkts = append(pkts, &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageServerHelloDone{}, + }, + }, + }) + + return pkts, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight5bhandler.go b/vendor/github.com/pion/dtls/v2/flight5bhandler.go new file mode 100644 index 000000000..ddd37324c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight5bhandler.go @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight5bParse(_ context.Context, _ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence-1, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, false, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + if _, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + // Other party may re-transmit the last flight. Keep state to be flight5b. + return flight5b, nil, nil +} + +func flight5bGenerate(_ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { //nolint:gocognit + var pkts []*packet + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &protocol.ChangeCipherSpec{}, + }, + }) + + if len(state.localVerifyData) == 0 { + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, false, false}, + ) + + var err error + state.localVerifyData, err = prf.VerifyDataClient(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + Epoch: 1, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageFinished{ + VerifyData: state.localVerifyData, + }, + }, + }, + shouldEncrypt: true, + resetLocalSequenceNumber: true, + }) + + return pkts, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flight5handler.go b/vendor/github.com/pion/dtls/v2/flight5handler.go new file mode 100644 index 000000000..e8adf4f36 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight5handler.go @@ -0,0 +1,357 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "context" + "crypto" + "crypto/x509" + + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight5Parse(_ context.Context, c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, false, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + var finished *handshake.MessageFinished + if finished, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeCertificateVerify, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + + expectedVerifyData, err := prf.VerifyDataServer(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + if !bytes.Equal(expectedVerifyData, finished.VerifyData) { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errVerifyDataMismatch + } + + if len(state.SessionID) > 0 { + s := Session{ + ID: state.SessionID, + Secret: state.masterSecret, + } + cfg.log.Tracef("[handshake] save new session: %x", s.ID) + if err := cfg.sessionStore.Set(c.sessionKey(), s); err != nil { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + return flight5, nil, nil +} + +func flight5Generate(c flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { //nolint:gocognit + var privateKey crypto.PrivateKey + var pkts []*packet + if state.remoteRequestedCertificate { + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence-2, state.cipherSuite, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}) + if !ok { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errClientCertificateRequired + } + reqInfo := CertificateRequestInfo{} + if r, ok := msgs[handshake.TypeCertificateRequest].(*handshake.MessageCertificateRequest); ok { + reqInfo.AcceptableCAs = r.CertificateAuthoritiesNames + } else { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errClientCertificateRequired + } + certificate, err := cfg.getClientCertificate(&reqInfo) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, err + } + if certificate == nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.HandshakeFailure}, errNotAcceptableCertificateChain + } + if certificate.Certificate != nil { + privateKey = certificate.PrivateKey + } + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageCertificate{ + Certificate: certificate.Certificate, + }, + }, + }, + }) + } + + clientKeyExchange := &handshake.MessageClientKeyExchange{} + if cfg.localPSKCallback == nil { + clientKeyExchange.PublicKey = state.localKeypair.PublicKey + } else { + clientKeyExchange.IdentityHint = cfg.localPSKIdentityHint + } + if state != nil && state.localKeypair != nil && len(state.localKeypair.PublicKey) > 0 { + clientKeyExchange.PublicKey = state.localKeypair.PublicKey + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: clientKeyExchange, + }, + }, + }) + + serverKeyExchangeData := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + ) + + serverKeyExchange := &handshake.MessageServerKeyExchange{} + + // handshakeMessageServerKeyExchange is optional for PSK + if len(serverKeyExchangeData) == 0 { + alertPtr, err := handleServerKeyExchange(c, state, cfg, &handshake.MessageServerKeyExchange{}) + if err != nil { + return nil, alertPtr, err + } + } else { + rawHandshake := &handshake.Handshake{ + KeyExchangeAlgorithm: state.cipherSuite.KeyExchangeAlgorithm(), + } + err := rawHandshake.Unmarshal(serverKeyExchangeData) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.UnexpectedMessage}, err + } + + switch h := rawHandshake.Message.(type) { + case *handshake.MessageServerKeyExchange: + serverKeyExchange = h + default: + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.UnexpectedMessage}, errInvalidContentType + } + } + + // Append not-yet-sent packets + merged := []byte{} + seqPred := uint16(state.handshakeSendSequence) + for _, p := range pkts { + h, ok := p.record.Content.(*handshake.Handshake) + if !ok { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, errInvalidContentType + } + h.Header.MessageSequence = seqPred + seqPred++ + raw, err := h.Marshal() + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + merged = append(merged, raw...) + } + + if alertPtr, err := initalizeCipherSuite(state, cache, cfg, serverKeyExchange, merged); err != nil { + return nil, alertPtr, err + } + + // If the client has sent a certificate with signing ability, a digitally-signed + // CertificateVerify message is sent to explicitly verify possession of the + // private key in the certificate. + if state.remoteRequestedCertificate && privateKey != nil { + plainText := append(cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + ), merged...) + + // Find compatible signature scheme + signatureHashAlgo, err := signaturehash.SelectSignatureScheme(cfg.localSignatureSchemes, privateKey) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, err + } + + certVerify, err := generateCertificateVerify(plainText, privateKey, signatureHashAlgo.Hash) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + state.localCertificatesVerify = certVerify + + p := &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageCertificateVerify{ + HashAlgorithm: signatureHashAlgo.Hash, + SignatureAlgorithm: signatureHashAlgo.Signature, + Signature: state.localCertificatesVerify, + }, + }, + }, + } + pkts = append(pkts, p) + + h, ok := p.record.Content.(*handshake.Handshake) + if !ok { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, errInvalidContentType + } + h.Header.MessageSequence = seqPred + // seqPred++ // this is the last use of seqPred + raw, err := h.Marshal() + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + merged = append(merged, raw...) + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &protocol.ChangeCipherSpec{}, + }, + }) + + if len(state.localVerifyData) == 0 { + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeCertificateVerify, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + + var err error + state.localVerifyData, err = prf.VerifyDataClient(state.masterSecret, append(plainText, merged...), state.cipherSuite.HashFunc()) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + Epoch: 1, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageFinished{ + VerifyData: state.localVerifyData, + }, + }, + }, + shouldEncrypt: true, + resetLocalSequenceNumber: true, + }) + + return pkts, nil, nil +} + +func initalizeCipherSuite(state *State, cache *handshakeCache, cfg *handshakeConfig, h *handshake.MessageServerKeyExchange, sendingPlainText []byte) (*alert.Alert, error) { //nolint:gocognit + if state.cipherSuite.IsInitialized() { + return nil, nil //nolint + } + + clientRandom := state.localRandom.MarshalFixed() + serverRandom := state.remoteRandom.MarshalFixed() + + var err error + + if state.extendedMasterSecret { + var sessionHash []byte + sessionHash, err = cache.sessionHash(state.cipherSuite.HashFunc(), cfg.initialEpoch, sendingPlainText) + if err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + state.masterSecret, err = prf.ExtendedMasterSecret(state.preMasterSecret, sessionHash, state.cipherSuite.HashFunc()) + if err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.IllegalParameter}, err + } + } else { + state.masterSecret, err = prf.MasterSecret(state.preMasterSecret, clientRandom[:], serverRandom[:], state.cipherSuite.HashFunc()) + if err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + if state.cipherSuite.AuthenticationType() == CipherSuiteAuthenticationTypeCertificate { + // Verify that the pair of hash algorithm and signiture is listed. + var validSignatureScheme bool + for _, ss := range cfg.localSignatureSchemes { + if ss.Hash == h.HashAlgorithm && ss.Signature == h.SignatureAlgorithm { + validSignatureScheme = true + break + } + } + if !validSignatureScheme { + return &alert.Alert{Level: alert.Fatal, Description: alert.InsufficientSecurity}, errNoAvailableSignatureSchemes + } + + expectedMsg := valueKeyMessage(clientRandom[:], serverRandom[:], h.PublicKey, h.NamedCurve) + if err = verifyKeySignature(expectedMsg, h.Signature, h.HashAlgorithm, state.PeerCertificates); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + var chains [][]*x509.Certificate + if !cfg.insecureSkipVerify { + if chains, err = verifyServerCert(state.PeerCertificates, cfg.rootCAs, cfg.serverName); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + if cfg.verifyPeerCertificate != nil { + if err = cfg.verifyPeerCertificate(state.PeerCertificates, chains); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + } + if cfg.verifyConnection != nil { + if err = cfg.verifyConnection(state.clone()); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.BadCertificate}, err + } + } + + if err = state.cipherSuite.Init(state.masterSecret, clientRandom[:], serverRandom[:], true); err != nil { + return &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + + cfg.writeKeyLog(keyLogLabelTLS12, clientRandom[:], state.masterSecret) + + return nil, nil //nolint +} diff --git a/vendor/github.com/pion/dtls/v2/flight6handler.go b/vendor/github.com/pion/dtls/v2/flight6handler.go new file mode 100644 index 000000000..57ac14360 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flight6handler.go @@ -0,0 +1,85 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +func flight6Parse(_ context.Context, _ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) (flightVal, *alert.Alert, error) { + _, msgs, ok := cache.fullPullMap(state.handshakeRecvSequence-1, state.cipherSuite, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + if !ok { + // No valid message received. Keep reading + return 0, nil, nil + } + + if _, ok = msgs[handshake.TypeFinished].(*handshake.MessageFinished); !ok { + return 0, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, nil + } + + // Other party may re-transmit the last flight. Keep state to be flight6. + return flight6, nil, nil +} + +func flight6Generate(_ flightConn, state *State, cache *handshakeCache, cfg *handshakeConfig) ([]*packet, *alert.Alert, error) { + var pkts []*packet + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + }, + Content: &protocol.ChangeCipherSpec{}, + }, + }) + + if len(state.localVerifyData) == 0 { + plainText := cache.pullAndMerge( + handshakeCachePullRule{handshake.TypeClientHello, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, cfg.initialEpoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeCertificateVerify, cfg.initialEpoch, true, false}, + handshakeCachePullRule{handshake.TypeFinished, cfg.initialEpoch + 1, true, false}, + ) + + var err error + state.localVerifyData, err = prf.VerifyDataServer(state.masterSecret, plainText, state.cipherSuite.HashFunc()) + if err != nil { + return nil, &alert.Alert{Level: alert.Fatal, Description: alert.InternalError}, err + } + } + + pkts = append(pkts, + &packet{ + record: &recordlayer.RecordLayer{ + Header: recordlayer.Header{ + Version: protocol.Version1_2, + Epoch: 1, + }, + Content: &handshake.Handshake{ + Message: &handshake.MessageFinished{ + VerifyData: state.localVerifyData, + }, + }, + }, + shouldEncrypt: true, + resetLocalSequenceNumber: true, + }, + ) + return pkts, nil, nil +} diff --git a/vendor/github.com/pion/dtls/v2/flighthandler.go b/vendor/github.com/pion/dtls/v2/flighthandler.go new file mode 100644 index 000000000..ceb4a992b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/flighthandler.go @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + + "github.com/pion/dtls/v2/pkg/protocol/alert" +) + +// Parse received handshakes and return next flightVal +type flightParser func(context.Context, flightConn, *State, *handshakeCache, *handshakeConfig) (flightVal, *alert.Alert, error) + +// Generate flights +type flightGenerator func(flightConn, *State, *handshakeCache, *handshakeConfig) ([]*packet, *alert.Alert, error) + +func (f flightVal) getFlightParser() (flightParser, error) { + switch f { + case flight0: + return flight0Parse, nil + case flight1: + return flight1Parse, nil + case flight2: + return flight2Parse, nil + case flight3: + return flight3Parse, nil + case flight4: + return flight4Parse, nil + case flight4b: + return flight4bParse, nil + case flight5: + return flight5Parse, nil + case flight5b: + return flight5bParse, nil + case flight6: + return flight6Parse, nil + default: + return nil, errInvalidFlight + } +} + +func (f flightVal) getFlightGenerator() (gen flightGenerator, retransmit bool, err error) { + switch f { + case flight0: + return flight0Generate, true, nil + case flight1: + return flight1Generate, true, nil + case flight2: + // https://tools.ietf.org/html/rfc6347#section-3.2.1 + // HelloVerifyRequests must not be retransmitted. + return flight2Generate, false, nil + case flight3: + return flight3Generate, true, nil + case flight4: + return flight4Generate, true, nil + case flight4b: + return flight4bGenerate, true, nil + case flight5: + return flight5Generate, true, nil + case flight5b: + return flight5bGenerate, true, nil + case flight6: + return flight6Generate, true, nil + default: + return nil, false, errInvalidFlight + } +} diff --git a/vendor/github.com/pion/dtls/v2/fragment_buffer.go b/vendor/github.com/pion/dtls/v2/fragment_buffer.go new file mode 100644 index 000000000..f20033758 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/fragment_buffer.go @@ -0,0 +1,132 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// 2 megabytes +const fragmentBufferMaxSize = 2000000 + +type fragment struct { + recordLayerHeader recordlayer.Header + handshakeHeader handshake.Header + data []byte +} + +type fragmentBuffer struct { + // map of MessageSequenceNumbers that hold slices of fragments + cache map[uint16][]*fragment + + currentMessageSequenceNumber uint16 +} + +func newFragmentBuffer() *fragmentBuffer { + return &fragmentBuffer{cache: map[uint16][]*fragment{}} +} + +// current total size of buffer +func (f *fragmentBuffer) size() int { + size := 0 + for i := range f.cache { + for j := range f.cache[i] { + size += len(f.cache[i][j].data) + } + } + return size +} + +// Attempts to push a DTLS packet to the fragmentBuffer +// when it returns true it means the fragmentBuffer has inserted and the buffer shouldn't be handled +// when an error returns it is fatal, and the DTLS connection should be stopped +func (f *fragmentBuffer) push(buf []byte) (bool, error) { + if f.size()+len(buf) >= fragmentBufferMaxSize { + return false, errFragmentBufferOverflow + } + + frag := new(fragment) + if err := frag.recordLayerHeader.Unmarshal(buf); err != nil { + return false, err + } + + // fragment isn't a handshake, we don't need to handle it + if frag.recordLayerHeader.ContentType != protocol.ContentTypeHandshake { + return false, nil + } + + for buf = buf[recordlayer.HeaderSize:]; len(buf) != 0; frag = new(fragment) { + if err := frag.handshakeHeader.Unmarshal(buf); err != nil { + return false, err + } + + if _, ok := f.cache[frag.handshakeHeader.MessageSequence]; !ok { + f.cache[frag.handshakeHeader.MessageSequence] = []*fragment{} + } + + // end index should be the length of handshake header but if the handshake + // was fragmented, we should keep them all + end := int(handshake.HeaderLength + frag.handshakeHeader.Length) + if size := len(buf); end > size { + end = size + } + + // Discard all headers, when rebuilding the packet we will re-build + frag.data = append([]byte{}, buf[handshake.HeaderLength:end]...) + f.cache[frag.handshakeHeader.MessageSequence] = append(f.cache[frag.handshakeHeader.MessageSequence], frag) + buf = buf[end:] + } + + return true, nil +} + +func (f *fragmentBuffer) pop() (content []byte, epoch uint16) { + frags, ok := f.cache[f.currentMessageSequenceNumber] + if !ok { + return nil, 0 + } + + // Go doesn't support recursive lambdas + var appendMessage func(targetOffset uint32) bool + + rawMessage := []byte{} + appendMessage = func(targetOffset uint32) bool { + for _, f := range frags { + if f.handshakeHeader.FragmentOffset == targetOffset { + fragmentEnd := (f.handshakeHeader.FragmentOffset + f.handshakeHeader.FragmentLength) + if fragmentEnd != f.handshakeHeader.Length && f.handshakeHeader.FragmentLength != 0 { + if !appendMessage(fragmentEnd) { + return false + } + } + + rawMessage = append(f.data, rawMessage...) + return true + } + } + return false + } + + // Recursively collect up + if !appendMessage(0) { + return nil, 0 + } + + firstHeader := frags[0].handshakeHeader + firstHeader.FragmentOffset = 0 + firstHeader.FragmentLength = firstHeader.Length + + rawHeader, err := firstHeader.Marshal() + if err != nil { + return nil, 0 + } + + messageEpoch := frags[0].recordLayerHeader.Epoch + + delete(f.cache, f.currentMessageSequenceNumber) + f.currentMessageSequenceNumber++ + return append(rawHeader, rawMessage...), messageEpoch +} diff --git a/vendor/github.com/pion/dtls/v2/handshake_cache.go b/vendor/github.com/pion/dtls/v2/handshake_cache.go new file mode 100644 index 000000000..8d5960568 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/handshake_cache.go @@ -0,0 +1,172 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "sync" + + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/handshake" +) + +type handshakeCacheItem struct { + typ handshake.Type + isClient bool + epoch uint16 + messageSequence uint16 + data []byte +} + +type handshakeCachePullRule struct { + typ handshake.Type + epoch uint16 + isClient bool + optional bool +} + +type handshakeCache struct { + cache []*handshakeCacheItem + mu sync.Mutex +} + +func newHandshakeCache() *handshakeCache { + return &handshakeCache{} +} + +func (h *handshakeCache) push(data []byte, epoch, messageSequence uint16, typ handshake.Type, isClient bool) { + h.mu.Lock() + defer h.mu.Unlock() + + h.cache = append(h.cache, &handshakeCacheItem{ + data: append([]byte{}, data...), + epoch: epoch, + messageSequence: messageSequence, + typ: typ, + isClient: isClient, + }) +} + +// returns a list handshakes that match the requested rules +// the list will contain null entries for rules that can't be satisfied +// multiple entries may match a rule, but only the last match is returned (ie ClientHello with cookies) +func (h *handshakeCache) pull(rules ...handshakeCachePullRule) []*handshakeCacheItem { + h.mu.Lock() + defer h.mu.Unlock() + + out := make([]*handshakeCacheItem, len(rules)) + for i, r := range rules { + for _, c := range h.cache { + if c.typ == r.typ && c.isClient == r.isClient && c.epoch == r.epoch { + switch { + case out[i] == nil: + out[i] = c + case out[i].messageSequence < c.messageSequence: + out[i] = c + } + } + } + } + + return out +} + +// fullPullMap pulls all handshakes between rules[0] to rules[len(rules)-1] as map. +func (h *handshakeCache) fullPullMap(startSeq int, cipherSuite CipherSuite, rules ...handshakeCachePullRule) (int, map[handshake.Type]handshake.Message, bool) { + h.mu.Lock() + defer h.mu.Unlock() + + ci := make(map[handshake.Type]*handshakeCacheItem) + for _, r := range rules { + var item *handshakeCacheItem + for _, c := range h.cache { + if c.typ == r.typ && c.isClient == r.isClient && c.epoch == r.epoch { + switch { + case item == nil: + item = c + case item.messageSequence < c.messageSequence: + item = c + } + } + } + if !r.optional && item == nil { + // Missing mandatory message. + return startSeq, nil, false + } + ci[r.typ] = item + } + out := make(map[handshake.Type]handshake.Message) + seq := startSeq + for _, r := range rules { + t := r.typ + i := ci[t] + if i == nil { + continue + } + var keyExchangeAlgorithm CipherSuiteKeyExchangeAlgorithm + if cipherSuite != nil { + keyExchangeAlgorithm = cipherSuite.KeyExchangeAlgorithm() + } + rawHandshake := &handshake.Handshake{ + KeyExchangeAlgorithm: keyExchangeAlgorithm, + } + if err := rawHandshake.Unmarshal(i.data); err != nil { + return startSeq, nil, false + } + if uint16(seq) != rawHandshake.Header.MessageSequence { + // There is a gap. Some messages are not arrived. + return startSeq, nil, false + } + seq++ + out[t] = rawHandshake.Message + } + return seq, out, true +} + +// pullAndMerge calls pull and then merges the results, ignoring any null entries +func (h *handshakeCache) pullAndMerge(rules ...handshakeCachePullRule) []byte { + merged := []byte{} + + for _, p := range h.pull(rules...) { + if p != nil { + merged = append(merged, p.data...) + } + } + return merged +} + +// sessionHash returns the session hash for Extended Master Secret support +// https://tools.ietf.org/html/draft-ietf-tls-session-hash-06#section-4 +func (h *handshakeCache) sessionHash(hf prf.HashFunc, epoch uint16, additional ...[]byte) ([]byte, error) { + merged := []byte{} + + // Order defined by https://tools.ietf.org/html/rfc5246#section-7.3 + handshakeBuffer := h.pull( + handshakeCachePullRule{handshake.TypeClientHello, epoch, true, false}, + handshakeCachePullRule{handshake.TypeServerHello, epoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, epoch, false, false}, + handshakeCachePullRule{handshake.TypeServerKeyExchange, epoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificateRequest, epoch, false, false}, + handshakeCachePullRule{handshake.TypeServerHelloDone, epoch, false, false}, + handshakeCachePullRule{handshake.TypeCertificate, epoch, true, false}, + handshakeCachePullRule{handshake.TypeClientKeyExchange, epoch, true, false}, + ) + + for _, p := range handshakeBuffer { + if p == nil { + continue + } + + merged = append(merged, p.data...) + } + for _, a := range additional { + merged = append(merged, a...) + } + + hash := hf() + if _, err := hash.Write(merged); err != nil { + return []byte{}, err + } + + return hash.Sum(nil), nil +} diff --git a/vendor/github.com/pion/dtls/v2/handshaker.go b/vendor/github.com/pion/dtls/v2/handshaker.go new file mode 100644 index 000000000..c56cee2ff --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/handshaker.go @@ -0,0 +1,351 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "io" + "sync" + "time" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/logging" +) + +// [RFC6347 Section-4.2.4] +// +-----------+ +// +---> | PREPARING | <--------------------+ +// | +-----------+ | +// | | | +// | | Buffer next flight | +// | | | +// | \|/ | +// | +-----------+ | +// | | SENDING |<------------------+ | Send +// | +-----------+ | | HelloRequest +// Receive | | | | +// next | | Send flight | | or +// flight | +--------+ | | +// | | | Set retransmit timer | | Receive +// | | \|/ | | HelloRequest +// | | +-----------+ | | Send +// +--)--| WAITING |-------------------+ | ClientHello +// | | +-----------+ Timer expires | | +// | | | | | +// | | +------------------------+ | +// Receive | | Send Read retransmit | +// last | | last | +// flight | | flight | +// | | | +// \|/\|/ | +// +-----------+ | +// | FINISHED | -------------------------------+ +// +-----------+ +// | /|\ +// | | +// +---+ +// Read retransmit +// Retransmit last flight + +type handshakeState uint8 + +const ( + handshakeErrored handshakeState = iota + handshakePreparing + handshakeSending + handshakeWaiting + handshakeFinished +) + +func (s handshakeState) String() string { + switch s { + case handshakeErrored: + return "Errored" + case handshakePreparing: + return "Preparing" + case handshakeSending: + return "Sending" + case handshakeWaiting: + return "Waiting" + case handshakeFinished: + return "Finished" + default: + return "Unknown" + } +} + +type handshakeFSM struct { + currentFlight flightVal + flights []*packet + retransmit bool + state *State + cache *handshakeCache + cfg *handshakeConfig + closed chan struct{} +} + +type handshakeConfig struct { + localPSKCallback PSKCallback + localPSKIdentityHint []byte + localCipherSuites []CipherSuite // Available CipherSuites + localSignatureSchemes []signaturehash.Algorithm // Available signature schemes + extendedMasterSecret ExtendedMasterSecretType // Policy for the Extended Master Support extension + localSRTPProtectionProfiles []SRTPProtectionProfile // Available SRTPProtectionProfiles, if empty no SRTP support + serverName string + supportedProtocols []string + clientAuth ClientAuthType // If we are a client should we request a client certificate + localCertificates []tls.Certificate + nameToCertificate map[string]*tls.Certificate + insecureSkipVerify bool + verifyPeerCertificate func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error + verifyConnection func(*State) error + sessionStore SessionStore + rootCAs *x509.CertPool + clientCAs *x509.CertPool + retransmitInterval time.Duration + customCipherSuites func() []CipherSuite + ellipticCurves []elliptic.Curve + insecureSkipHelloVerify bool + customClientHelloRandom func() [handshake.RandomBytesLength]byte + + onFlightState func(flightVal, handshakeState) + log logging.LeveledLogger + keyLogWriter io.Writer + + localGetCertificate func(*ClientHelloInfo) (*tls.Certificate, error) + localGetClientCertificate func(*CertificateRequestInfo) (*tls.Certificate, error) + + initialEpoch uint16 + + mu sync.Mutex +} + +type flightConn interface { + notify(ctx context.Context, level alert.Level, desc alert.Description) error + writePackets(context.Context, []*packet) error + recvHandshake() <-chan chan struct{} + setLocalEpoch(epoch uint16) + handleQueuedPackets(context.Context) error + sessionKey() []byte +} + +func (c *handshakeConfig) writeKeyLog(label string, clientRandom, secret []byte) { + if c.keyLogWriter == nil { + return + } + c.mu.Lock() + defer c.mu.Unlock() + _, err := c.keyLogWriter.Write([]byte(fmt.Sprintf("%s %x %x\n", label, clientRandom, secret))) + if err != nil { + c.log.Debugf("failed to write key log file: %s", err) + } +} + +func srvCliStr(isClient bool) string { + if isClient { + return "client" + } + return "server" +} + +func newHandshakeFSM( + s *State, cache *handshakeCache, cfg *handshakeConfig, + initialFlight flightVal, +) *handshakeFSM { + return &handshakeFSM{ + currentFlight: initialFlight, + state: s, + cache: cache, + cfg: cfg, + closed: make(chan struct{}), + } +} + +func (s *handshakeFSM) Run(ctx context.Context, c flightConn, initialState handshakeState) error { + state := initialState + defer func() { + close(s.closed) + }() + for { + s.cfg.log.Tracef("[handshake:%s] %s: %s", srvCliStr(s.state.isClient), s.currentFlight.String(), state.String()) + if s.cfg.onFlightState != nil { + s.cfg.onFlightState(s.currentFlight, state) + } + var err error + switch state { + case handshakePreparing: + state, err = s.prepare(ctx, c) + case handshakeSending: + state, err = s.send(ctx, c) + case handshakeWaiting: + state, err = s.wait(ctx, c) + case handshakeFinished: + state, err = s.finish(ctx, c) + default: + return errInvalidFSMTransition + } + if err != nil { + return err + } + } +} + +func (s *handshakeFSM) Done() <-chan struct{} { + return s.closed +} + +func (s *handshakeFSM) prepare(ctx context.Context, c flightConn) (handshakeState, error) { + s.flights = nil + // Prepare flights + var ( + a *alert.Alert + err error + pkts []*packet + ) + gen, retransmit, errFlight := s.currentFlight.getFlightGenerator() + if errFlight != nil { + err = errFlight + a = &alert.Alert{Level: alert.Fatal, Description: alert.InternalError} + } else { + pkts, a, err = gen(c, s.state, s.cache, s.cfg) + s.retransmit = retransmit + } + if a != nil { + if alertErr := c.notify(ctx, a.Level, a.Description); alertErr != nil { + if err != nil { + err = alertErr + } + } + } + if err != nil { + return handshakeErrored, err + } + + s.flights = pkts + epoch := s.cfg.initialEpoch + nextEpoch := epoch + for _, p := range s.flights { + p.record.Header.Epoch += epoch + if p.record.Header.Epoch > nextEpoch { + nextEpoch = p.record.Header.Epoch + } + if h, ok := p.record.Content.(*handshake.Handshake); ok { + h.Header.MessageSequence = uint16(s.state.handshakeSendSequence) + s.state.handshakeSendSequence++ + } + } + if epoch != nextEpoch { + s.cfg.log.Tracef("[handshake:%s] -> changeCipherSpec (epoch: %d)", srvCliStr(s.state.isClient), nextEpoch) + c.setLocalEpoch(nextEpoch) + } + return handshakeSending, nil +} + +func (s *handshakeFSM) send(ctx context.Context, c flightConn) (handshakeState, error) { + // Send flights + if err := c.writePackets(ctx, s.flights); err != nil { + return handshakeErrored, err + } + + if s.currentFlight.isLastSendFlight() { + return handshakeFinished, nil + } + return handshakeWaiting, nil +} + +func (s *handshakeFSM) wait(ctx context.Context, c flightConn) (handshakeState, error) { //nolint:gocognit + parse, errFlight := s.currentFlight.getFlightParser() + if errFlight != nil { + if alertErr := c.notify(ctx, alert.Fatal, alert.InternalError); alertErr != nil { + if errFlight != nil { + return handshakeErrored, alertErr + } + } + return handshakeErrored, errFlight + } + + retransmitTimer := time.NewTimer(s.cfg.retransmitInterval) + for { + select { + case done := <-c.recvHandshake(): + nextFlight, alert, err := parse(ctx, c, s.state, s.cache, s.cfg) + close(done) + if alert != nil { + if alertErr := c.notify(ctx, alert.Level, alert.Description); alertErr != nil { + if err != nil { + err = alertErr + } + } + } + if err != nil { + return handshakeErrored, err + } + if nextFlight == 0 { + break + } + s.cfg.log.Tracef("[handshake:%s] %s -> %s", srvCliStr(s.state.isClient), s.currentFlight.String(), nextFlight.String()) + if nextFlight.isLastRecvFlight() && s.currentFlight == nextFlight { + return handshakeFinished, nil + } + s.currentFlight = nextFlight + return handshakePreparing, nil + + case <-retransmitTimer.C: + if !s.retransmit { + return handshakeWaiting, nil + } + return handshakeSending, nil + case <-ctx.Done(): + return handshakeErrored, ctx.Err() + } + } +} + +func (s *handshakeFSM) finish(ctx context.Context, c flightConn) (handshakeState, error) { + parse, errFlight := s.currentFlight.getFlightParser() + if errFlight != nil { + if alertErr := c.notify(ctx, alert.Fatal, alert.InternalError); alertErr != nil { + if errFlight != nil { + return handshakeErrored, alertErr + } + } + return handshakeErrored, errFlight + } + + retransmitTimer := time.NewTimer(s.cfg.retransmitInterval) + select { + case done := <-c.recvHandshake(): + nextFlight, alert, err := parse(ctx, c, s.state, s.cache, s.cfg) + close(done) + if alert != nil { + if alertErr := c.notify(ctx, alert.Level, alert.Description); alertErr != nil { + if err != nil { + err = alertErr + } + } + } + if err != nil { + return handshakeErrored, err + } + if nextFlight == 0 { + break + } + if nextFlight.isLastRecvFlight() && s.currentFlight == nextFlight { + return handshakeFinished, nil + } + <-retransmitTimer.C + // Retransmit last flight + return handshakeSending, nil + + case <-ctx.Done(): + return handshakeErrored, ctx.Err() + } + return handshakeFinished, nil +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_128_ccm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_128_ccm.go new file mode 100644 index 000000000..f78b6dc2c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_128_ccm.go @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// Aes128Ccm is a base class used by multiple AES-CCM Ciphers +type Aes128Ccm struct { + AesCcm +} + +func newAes128Ccm(clientCertificateType clientcertificate.Type, id ID, psk bool, cryptoCCMTagLen ciphersuite.CCMTagLen, keyExchangeAlgorithm KeyExchangeAlgorithm, ecc bool) *Aes128Ccm { + return &Aes128Ccm{ + AesCcm: AesCcm{ + clientCertificateType: clientCertificateType, + id: id, + psk: psk, + cryptoCCMTagLen: cryptoCCMTagLen, + keyExchangeAlgorithm: keyExchangeAlgorithm, + ecc: ecc, + }, + } +} + +// Init initializes the internal Cipher with keying material +func (c *Aes128Ccm) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const prfKeyLen = 16 + return c.AesCcm.Init(masterSecret, clientRandom, serverRandom, isClient, prfKeyLen) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_256_ccm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_256_ccm.go new file mode 100644 index 000000000..bb8128627 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_256_ccm.go @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// Aes256Ccm is a base class used by multiple AES-CCM Ciphers +type Aes256Ccm struct { + AesCcm +} + +func newAes256Ccm(clientCertificateType clientcertificate.Type, id ID, psk bool, cryptoCCMTagLen ciphersuite.CCMTagLen, keyExchangeAlgorithm KeyExchangeAlgorithm, ecc bool) *Aes256Ccm { + return &Aes256Ccm{ + AesCcm: AesCcm{ + clientCertificateType: clientCertificateType, + id: id, + psk: psk, + cryptoCCMTagLen: cryptoCCMTagLen, + keyExchangeAlgorithm: keyExchangeAlgorithm, + ecc: ecc, + }, + } +} + +// Init initializes the internal Cipher with keying material +func (c *Aes256Ccm) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const prfKeyLen = 32 + return c.AesCcm.Init(masterSecret, clientRandom, serverRandom, isClient, prfKeyLen) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_ccm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_ccm.go new file mode 100644 index 000000000..dc5119823 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/aes_ccm.go @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha256" + "fmt" + "hash" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// AesCcm is a base class used by multiple AES-CCM Ciphers +type AesCcm struct { + ccm atomic.Value // *cryptoCCM + clientCertificateType clientcertificate.Type + id ID + psk bool + keyExchangeAlgorithm KeyExchangeAlgorithm + cryptoCCMTagLen ciphersuite.CCMTagLen + ecc bool +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *AesCcm) CertificateType() clientcertificate.Type { + return c.clientCertificateType +} + +// ID returns the ID of the CipherSuite +func (c *AesCcm) ID() ID { + return c.id +} + +func (c *AesCcm) String() string { + return c.id.String() +} + +// ECC uses Elliptic Curve Cryptography +func (c *AesCcm) ECC() bool { + return c.ecc +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *AesCcm) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return c.keyExchangeAlgorithm +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *AesCcm) HashFunc() func() hash.Hash { + return sha256.New +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *AesCcm) AuthenticationType() AuthenticationType { + if c.psk { + return AuthenticationTypePreSharedKey + } + return AuthenticationTypeCertificate +} + +// IsInitialized returns if the CipherSuite has keying material and can +// encrypt/decrypt packets +func (c *AesCcm) IsInitialized() bool { + return c.ccm.Load() != nil +} + +// Init initializes the internal Cipher with keying material +func (c *AesCcm) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool, prfKeyLen int) error { + const ( + prfMacLen = 0 + prfIvLen = 4 + ) + + keys, err := prf.GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) + if err != nil { + return err + } + + var ccm *ciphersuite.CCM + if isClient { + ccm, err = ciphersuite.NewCCM(c.cryptoCCMTagLen, keys.ClientWriteKey, keys.ClientWriteIV, keys.ServerWriteKey, keys.ServerWriteIV) + } else { + ccm, err = ciphersuite.NewCCM(c.cryptoCCMTagLen, keys.ServerWriteKey, keys.ServerWriteIV, keys.ClientWriteKey, keys.ClientWriteIV) + } + c.ccm.Store(ccm) + + return err +} + +// Encrypt encrypts a single TLS RecordLayer +func (c *AesCcm) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + cipherSuite, ok := c.ccm.Load().(*ciphersuite.CCM) + if !ok { + return nil, fmt.Errorf("%w, unable to encrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Encrypt(pkt, raw) +} + +// Decrypt decrypts a single TLS RecordLayer +func (c *AesCcm) Decrypt(raw []byte) ([]byte, error) { + cipherSuite, ok := c.ccm.Load().(*ciphersuite.CCM) + if !ok { + return nil, fmt.Errorf("%w, unable to decrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Decrypt(raw) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/ciphersuite.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/ciphersuite.go new file mode 100644 index 000000000..f44f29fd3 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/ciphersuite.go @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package ciphersuite provides TLS Ciphers as registered with the IANA https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4 +package ciphersuite + +import ( + "errors" + "fmt" + + "github.com/pion/dtls/v2/internal/ciphersuite/types" + "github.com/pion/dtls/v2/pkg/protocol" +) + +var errCipherSuiteNotInit = &protocol.TemporaryError{Err: errors.New("CipherSuite has not been initialized")} //nolint:goerr113 + +// ID is an ID for our supported CipherSuites +type ID uint16 + +func (i ID) String() string { + switch i { + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM: + return "TLS_ECDHE_ECDSA_WITH_AES_128_CCM" + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8: + return "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8" + case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: + return "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" + case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: + return "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" + case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA: + return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" + case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA: + return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" + case TLS_PSK_WITH_AES_128_CCM: + return "TLS_PSK_WITH_AES_128_CCM" + case TLS_PSK_WITH_AES_128_CCM_8: + return "TLS_PSK_WITH_AES_128_CCM_8" + case TLS_PSK_WITH_AES_256_CCM_8: + return "TLS_PSK_WITH_AES_256_CCM_8" + case TLS_PSK_WITH_AES_128_GCM_SHA256: + return "TLS_PSK_WITH_AES_128_GCM_SHA256" + case TLS_PSK_WITH_AES_128_CBC_SHA256: + return "TLS_PSK_WITH_AES_128_CBC_SHA256" + case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384: + return "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" + case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384: + return "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" + case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256: + return "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256" + default: + return fmt.Sprintf("unknown(%v)", uint16(i)) + } +} + +// Supported Cipher Suites +const ( + // AES-128-CCM + TLS_ECDHE_ECDSA_WITH_AES_128_CCM ID = 0xc0ac //nolint:revive,stylecheck + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 ID = 0xc0ae //nolint:revive,stylecheck + + // AES-128-GCM-SHA256 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ID = 0xc02b //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ID = 0xc02f //nolint:revive,stylecheck + + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ID = 0xc02c //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ID = 0xc030 //nolint:revive,stylecheck + // AES-256-CBC-SHA + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA ID = 0xc00a //nolint:revive,stylecheck + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ID = 0xc014 //nolint:revive,stylecheck + + TLS_PSK_WITH_AES_128_CCM ID = 0xc0a4 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_CCM_8 ID = 0xc0a8 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_256_CCM_8 ID = 0xc0a9 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_GCM_SHA256 ID = 0x00a8 //nolint:revive,stylecheck + TLS_PSK_WITH_AES_128_CBC_SHA256 ID = 0x00ae //nolint:revive,stylecheck + + TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 ID = 0xC037 //nolint:revive,stylecheck +) + +// AuthenticationType controls what authentication method is using during the handshake +type AuthenticationType = types.AuthenticationType + +// AuthenticationType Enums +const ( + AuthenticationTypeCertificate AuthenticationType = types.AuthenticationTypeCertificate + AuthenticationTypePreSharedKey AuthenticationType = types.AuthenticationTypePreSharedKey + AuthenticationTypeAnonymous AuthenticationType = types.AuthenticationTypeAnonymous +) + +// KeyExchangeAlgorithm controls what exchange algorithm was chosen. +type KeyExchangeAlgorithm = types.KeyExchangeAlgorithm + +// KeyExchangeAlgorithm Bitmask +const ( + KeyExchangeAlgorithmNone KeyExchangeAlgorithm = types.KeyExchangeAlgorithmNone + KeyExchangeAlgorithmPsk KeyExchangeAlgorithm = types.KeyExchangeAlgorithmPsk + KeyExchangeAlgorithmEcdhe KeyExchangeAlgorithm = types.KeyExchangeAlgorithmEcdhe +) diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm.go new file mode 100644 index 000000000..8367b2c6d --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// NewTLSEcdheEcdsaWithAes128Ccm constructs a TLS_ECDHE_ECDSA_WITH_AES_128_CCM Cipher +func NewTLSEcdheEcdsaWithAes128Ccm() *Aes128Ccm { + return newAes128Ccm(clientcertificate.ECDSASign, TLS_ECDHE_ECDSA_WITH_AES_128_CCM, false, ciphersuite.CCMTagLength, KeyExchangeAlgorithmEcdhe, true) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm8.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm8.go new file mode 100644 index 000000000..11b687327 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_ccm8.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// NewTLSEcdheEcdsaWithAes128Ccm8 creates a new TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 CipherSuite +func NewTLSEcdheEcdsaWithAes128Ccm8() *Aes128Ccm { + return newAes128Ccm(clientcertificate.ECDSASign, TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, false, ciphersuite.CCMTagLength8, KeyExchangeAlgorithmEcdhe, true) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_gcm_sha256.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_gcm_sha256.go new file mode 100644 index 000000000..0c919fe47 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_128_gcm_sha256.go @@ -0,0 +1,108 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha256" + "fmt" + "hash" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// TLSEcdheEcdsaWithAes128GcmSha256 represents a TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 CipherSuite +type TLSEcdheEcdsaWithAes128GcmSha256 struct { + gcm atomic.Value // *cryptoGCM +} + +// CertificateType returns what type of certficate this CipherSuite exchanges +func (c *TLSEcdheEcdsaWithAes128GcmSha256) CertificateType() clientcertificate.Type { + return clientcertificate.ECDSASign +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *TLSEcdheEcdsaWithAes128GcmSha256) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return KeyExchangeAlgorithmEcdhe +} + +// ECC uses Elliptic Curve Cryptography +func (c *TLSEcdheEcdsaWithAes128GcmSha256) ECC() bool { + return true +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheEcdsaWithAes128GcmSha256) ID() ID { + return TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 +} + +func (c *TLSEcdheEcdsaWithAes128GcmSha256) String() string { + return "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *TLSEcdheEcdsaWithAes128GcmSha256) HashFunc() func() hash.Hash { + return sha256.New +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *TLSEcdheEcdsaWithAes128GcmSha256) AuthenticationType() AuthenticationType { + return AuthenticationTypeCertificate +} + +// IsInitialized returns if the CipherSuite has keying material and can +// encrypt/decrypt packets +func (c *TLSEcdheEcdsaWithAes128GcmSha256) IsInitialized() bool { + return c.gcm.Load() != nil +} + +func (c *TLSEcdheEcdsaWithAes128GcmSha256) init(masterSecret, clientRandom, serverRandom []byte, isClient bool, prfMacLen, prfKeyLen, prfIvLen int, hashFunc func() hash.Hash) error { + keys, err := prf.GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom, prfMacLen, prfKeyLen, prfIvLen, hashFunc) + if err != nil { + return err + } + + var gcm *ciphersuite.GCM + if isClient { + gcm, err = ciphersuite.NewGCM(keys.ClientWriteKey, keys.ClientWriteIV, keys.ServerWriteKey, keys.ServerWriteIV) + } else { + gcm, err = ciphersuite.NewGCM(keys.ServerWriteKey, keys.ServerWriteIV, keys.ClientWriteKey, keys.ClientWriteIV) + } + c.gcm.Store(gcm) + return err +} + +// Init initializes the internal Cipher with keying material +func (c *TLSEcdheEcdsaWithAes128GcmSha256) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const ( + prfMacLen = 0 + prfKeyLen = 16 + prfIvLen = 4 + ) + + return c.init(masterSecret, clientRandom, serverRandom, isClient, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) +} + +// Encrypt encrypts a single TLS RecordLayer +func (c *TLSEcdheEcdsaWithAes128GcmSha256) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + cipherSuite, ok := c.gcm.Load().(*ciphersuite.GCM) + if !ok { + return nil, fmt.Errorf("%w, unable to encrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Encrypt(pkt, raw) +} + +// Decrypt decrypts a single TLS RecordLayer +func (c *TLSEcdheEcdsaWithAes128GcmSha256) Decrypt(raw []byte) ([]byte, error) { + cipherSuite, ok := c.gcm.Load().(*ciphersuite.GCM) + if !ok { + return nil, fmt.Errorf("%w, unable to decrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Decrypt(raw) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_cbc_sha.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_cbc_sha.go new file mode 100644 index 000000000..577192c89 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_cbc_sha.go @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha1" //nolint: gosec,gci + "crypto/sha256" + "fmt" + "hash" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// TLSEcdheEcdsaWithAes256CbcSha represents a TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA CipherSuite +type TLSEcdheEcdsaWithAes256CbcSha struct { + cbc atomic.Value // *cryptoCBC +} + +// CertificateType returns what type of certficate this CipherSuite exchanges +func (c *TLSEcdheEcdsaWithAes256CbcSha) CertificateType() clientcertificate.Type { + return clientcertificate.ECDSASign +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *TLSEcdheEcdsaWithAes256CbcSha) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return KeyExchangeAlgorithmEcdhe +} + +// ECC uses Elliptic Curve Cryptography +func (c *TLSEcdheEcdsaWithAes256CbcSha) ECC() bool { + return true +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheEcdsaWithAes256CbcSha) ID() ID { + return TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA +} + +func (c *TLSEcdheEcdsaWithAes256CbcSha) String() string { + return "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA" +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *TLSEcdheEcdsaWithAes256CbcSha) HashFunc() func() hash.Hash { + return sha256.New +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *TLSEcdheEcdsaWithAes256CbcSha) AuthenticationType() AuthenticationType { + return AuthenticationTypeCertificate +} + +// IsInitialized returns if the CipherSuite has keying material and can +// encrypt/decrypt packets +func (c *TLSEcdheEcdsaWithAes256CbcSha) IsInitialized() bool { + return c.cbc.Load() != nil +} + +// Init initializes the internal Cipher with keying material +func (c *TLSEcdheEcdsaWithAes256CbcSha) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const ( + prfMacLen = 20 + prfKeyLen = 32 + prfIvLen = 16 + ) + + keys, err := prf.GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) + if err != nil { + return err + } + + var cbc *ciphersuite.CBC + if isClient { + cbc, err = ciphersuite.NewCBC( + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + sha1.New, + ) + } else { + cbc, err = ciphersuite.NewCBC( + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + sha1.New, + ) + } + c.cbc.Store(cbc) + + return err +} + +// Encrypt encrypts a single TLS RecordLayer +func (c *TLSEcdheEcdsaWithAes256CbcSha) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { + return nil, fmt.Errorf("%w, unable to encrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Encrypt(pkt, raw) +} + +// Decrypt decrypts a single TLS RecordLayer +func (c *TLSEcdheEcdsaWithAes256CbcSha) Decrypt(raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { + return nil, fmt.Errorf("%w, unable to decrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Decrypt(raw) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_gcm_sha384.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_gcm_sha384.go new file mode 100644 index 000000000..2a3cfa4f5 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_ecdsa_with_aes_256_gcm_sha384.go @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha512" + "hash" +) + +// TLSEcdheEcdsaWithAes256GcmSha384 represents a TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 CipherSuite +type TLSEcdheEcdsaWithAes256GcmSha384 struct { + TLSEcdheEcdsaWithAes128GcmSha256 +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheEcdsaWithAes256GcmSha384) ID() ID { + return TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 +} + +func (c *TLSEcdheEcdsaWithAes256GcmSha384) String() string { + return "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *TLSEcdheEcdsaWithAes256GcmSha384) HashFunc() func() hash.Hash { + return sha512.New384 +} + +// Init initializes the internal Cipher with keying material +func (c *TLSEcdheEcdsaWithAes256GcmSha384) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const ( + prfMacLen = 0 + prfKeyLen = 32 + prfIvLen = 4 + ) + + return c.init(masterSecret, clientRandom, serverRandom, isClient, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_psk_with_aes_128_cbc_sha256.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_psk_with_aes_128_cbc_sha256.go new file mode 100644 index 000000000..75a25633a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_psk_with_aes_128_cbc_sha256.go @@ -0,0 +1,118 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha256" + "fmt" + "hash" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// TLSEcdhePskWithAes128CbcSha256 implements the TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 CipherSuite +type TLSEcdhePskWithAes128CbcSha256 struct { + cbc atomic.Value // *cryptoCBC +} + +// NewTLSEcdhePskWithAes128CbcSha256 creates TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 cipher. +func NewTLSEcdhePskWithAes128CbcSha256() *TLSEcdhePskWithAes128CbcSha256 { + return &TLSEcdhePskWithAes128CbcSha256{} +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSEcdhePskWithAes128CbcSha256) CertificateType() clientcertificate.Type { + return clientcertificate.Type(0) +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *TLSEcdhePskWithAes128CbcSha256) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return (KeyExchangeAlgorithmPsk | KeyExchangeAlgorithmEcdhe) +} + +// ECC uses Elliptic Curve Cryptography +func (c *TLSEcdhePskWithAes128CbcSha256) ECC() bool { + return true +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdhePskWithAes128CbcSha256) ID() ID { + return TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 +} + +func (c *TLSEcdhePskWithAes128CbcSha256) String() string { + return "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256" +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *TLSEcdhePskWithAes128CbcSha256) HashFunc() func() hash.Hash { + return sha256.New +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *TLSEcdhePskWithAes128CbcSha256) AuthenticationType() AuthenticationType { + return AuthenticationTypePreSharedKey +} + +// IsInitialized returns if the CipherSuite has keying material and can +// encrypt/decrypt packets +func (c *TLSEcdhePskWithAes128CbcSha256) IsInitialized() bool { + return c.cbc.Load() != nil +} + +// Init initializes the internal Cipher with keying material +func (c *TLSEcdhePskWithAes128CbcSha256) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const ( + prfMacLen = 32 + prfKeyLen = 16 + prfIvLen = 16 + ) + + keys, err := prf.GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) + if err != nil { + return err + } + + var cbc *ciphersuite.CBC + if isClient { + cbc, err = ciphersuite.NewCBC( + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + c.HashFunc(), + ) + } else { + cbc, err = ciphersuite.NewCBC( + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + c.HashFunc(), + ) + } + c.cbc.Store(cbc) + + return err +} + +// Encrypt encrypts a single TLS RecordLayer +func (c *TLSEcdhePskWithAes128CbcSha256) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { // !c.isInitialized() + return nil, fmt.Errorf("%w, unable to encrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Encrypt(pkt, raw) +} + +// Decrypt decrypts a single TLS RecordLayer +func (c *TLSEcdhePskWithAes128CbcSha256) Decrypt(raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { // !c.isInitialized() + return nil, fmt.Errorf("%w, unable to decrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Decrypt(raw) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_128_gcm_sha256.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_128_gcm_sha256.go new file mode 100644 index 000000000..478a2e0dc --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_128_gcm_sha256.go @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + +// TLSEcdheRsaWithAes128GcmSha256 implements the TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 CipherSuite +type TLSEcdheRsaWithAes128GcmSha256 struct { + TLSEcdheEcdsaWithAes128GcmSha256 +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSEcdheRsaWithAes128GcmSha256) CertificateType() clientcertificate.Type { + return clientcertificate.RSASign +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheRsaWithAes128GcmSha256) ID() ID { + return TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 +} + +func (c *TLSEcdheRsaWithAes128GcmSha256) String() string { + return "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_cbc_sha.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_cbc_sha.go new file mode 100644 index 000000000..8e88ee639 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_cbc_sha.go @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + +// TLSEcdheRsaWithAes256CbcSha implements the TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA CipherSuite +type TLSEcdheRsaWithAes256CbcSha struct { + TLSEcdheEcdsaWithAes256CbcSha +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSEcdheRsaWithAes256CbcSha) CertificateType() clientcertificate.Type { + return clientcertificate.RSASign +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheRsaWithAes256CbcSha) ID() ID { + return TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA +} + +func (c *TLSEcdheRsaWithAes256CbcSha) String() string { + return "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_gcm_sha384.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_gcm_sha384.go new file mode 100644 index 000000000..752fb529c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_ecdhe_rsa_with_aes_256_gcm_sha384.go @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + +// TLSEcdheRsaWithAes256GcmSha384 implements the TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 CipherSuite +type TLSEcdheRsaWithAes256GcmSha384 struct { + TLSEcdheEcdsaWithAes256GcmSha384 +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSEcdheRsaWithAes256GcmSha384) CertificateType() clientcertificate.Type { + return clientcertificate.RSASign +} + +// ID returns the ID of the CipherSuite +func (c *TLSEcdheRsaWithAes256GcmSha384) ID() ID { + return TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +} + +func (c *TLSEcdheRsaWithAes256GcmSha384) String() string { + return "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_cbc_sha256.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_cbc_sha256.go new file mode 100644 index 000000000..7336ad946 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_cbc_sha256.go @@ -0,0 +1,113 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/sha256" + "fmt" + "hash" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// TLSPskWithAes128CbcSha256 implements the TLS_PSK_WITH_AES_128_CBC_SHA256 CipherSuite +type TLSPskWithAes128CbcSha256 struct { + cbc atomic.Value // *cryptoCBC +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSPskWithAes128CbcSha256) CertificateType() clientcertificate.Type { + return clientcertificate.Type(0) +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *TLSPskWithAes128CbcSha256) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return KeyExchangeAlgorithmPsk +} + +// ECC uses Elliptic Curve Cryptography +func (c *TLSPskWithAes128CbcSha256) ECC() bool { + return false +} + +// ID returns the ID of the CipherSuite +func (c *TLSPskWithAes128CbcSha256) ID() ID { + return TLS_PSK_WITH_AES_128_CBC_SHA256 +} + +func (c *TLSPskWithAes128CbcSha256) String() string { + return "TLS_PSK_WITH_AES_128_CBC_SHA256" +} + +// HashFunc returns the hashing func for this CipherSuite +func (c *TLSPskWithAes128CbcSha256) HashFunc() func() hash.Hash { + return sha256.New +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *TLSPskWithAes128CbcSha256) AuthenticationType() AuthenticationType { + return AuthenticationTypePreSharedKey +} + +// IsInitialized returns if the CipherSuite has keying material and can +// encrypt/decrypt packets +func (c *TLSPskWithAes128CbcSha256) IsInitialized() bool { + return c.cbc.Load() != nil +} + +// Init initializes the internal Cipher with keying material +func (c *TLSPskWithAes128CbcSha256) Init(masterSecret, clientRandom, serverRandom []byte, isClient bool) error { + const ( + prfMacLen = 32 + prfKeyLen = 16 + prfIvLen = 16 + ) + + keys, err := prf.GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom, prfMacLen, prfKeyLen, prfIvLen, c.HashFunc()) + if err != nil { + return err + } + + var cbc *ciphersuite.CBC + if isClient { + cbc, err = ciphersuite.NewCBC( + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + c.HashFunc(), + ) + } else { + cbc, err = ciphersuite.NewCBC( + keys.ServerWriteKey, keys.ServerWriteIV, keys.ServerMACKey, + keys.ClientWriteKey, keys.ClientWriteIV, keys.ClientMACKey, + c.HashFunc(), + ) + } + c.cbc.Store(cbc) + + return err +} + +// Encrypt encrypts a single TLS RecordLayer +func (c *TLSPskWithAes128CbcSha256) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { + return nil, fmt.Errorf("%w, unable to encrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Encrypt(pkt, raw) +} + +// Decrypt decrypts a single TLS RecordLayer +func (c *TLSPskWithAes128CbcSha256) Decrypt(raw []byte) ([]byte, error) { + cipherSuite, ok := c.cbc.Load().(*ciphersuite.CBC) + if !ok { + return nil, fmt.Errorf("%w, unable to decrypt", errCipherSuiteNotInit) + } + + return cipherSuite.Decrypt(raw) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm.go new file mode 100644 index 000000000..1ded09b88 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// NewTLSPskWithAes128Ccm returns the TLS_PSK_WITH_AES_128_CCM CipherSuite +func NewTLSPskWithAes128Ccm() *Aes128Ccm { + return newAes128Ccm(clientcertificate.Type(0), TLS_PSK_WITH_AES_128_CCM, true, ciphersuite.CCMTagLength, KeyExchangeAlgorithmPsk, false) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm8.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm8.go new file mode 100644 index 000000000..478197074 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_ccm8.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// NewTLSPskWithAes128Ccm8 returns the TLS_PSK_WITH_AES_128_CCM_8 CipherSuite +func NewTLSPskWithAes128Ccm8() *Aes128Ccm { + return newAes128Ccm(clientcertificate.Type(0), TLS_PSK_WITH_AES_128_CCM_8, true, ciphersuite.CCMTagLength8, KeyExchangeAlgorithmPsk, false) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_gcm_sha256.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_gcm_sha256.go new file mode 100644 index 000000000..8ab5b89a8 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_128_gcm_sha256.go @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + +// TLSPskWithAes128GcmSha256 implements the TLS_PSK_WITH_AES_128_GCM_SHA256 CipherSuite +type TLSPskWithAes128GcmSha256 struct { + TLSEcdheEcdsaWithAes128GcmSha256 +} + +// CertificateType returns what type of certificate this CipherSuite exchanges +func (c *TLSPskWithAes128GcmSha256) CertificateType() clientcertificate.Type { + return clientcertificate.Type(0) +} + +// KeyExchangeAlgorithm controls what key exchange algorithm is using during the handshake +func (c *TLSPskWithAes128GcmSha256) KeyExchangeAlgorithm() KeyExchangeAlgorithm { + return KeyExchangeAlgorithmPsk +} + +// ID returns the ID of the CipherSuite +func (c *TLSPskWithAes128GcmSha256) ID() ID { + return TLS_PSK_WITH_AES_128_GCM_SHA256 +} + +func (c *TLSPskWithAes128GcmSha256) String() string { + return "TLS_PSK_WITH_AES_128_GCM_SHA256" +} + +// AuthenticationType controls what authentication method is using during the handshake +func (c *TLSPskWithAes128GcmSha256) AuthenticationType() AuthenticationType { + return AuthenticationTypePreSharedKey +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_256_ccm8.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_256_ccm8.go new file mode 100644 index 000000000..32d503018 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/tls_psk_with_aes_256_ccm8.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "github.com/pion/dtls/v2/pkg/crypto/ciphersuite" + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" +) + +// NewTLSPskWithAes256Ccm8 returns the TLS_PSK_WITH_AES_256_CCM_8 CipherSuite +func NewTLSPskWithAes256Ccm8() *Aes256Ccm { + return newAes256Ccm(clientcertificate.Type(0), TLS_PSK_WITH_AES_256_CCM_8, true, ciphersuite.CCMTagLength8, KeyExchangeAlgorithmPsk, false) +} diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/authentication_type.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/authentication_type.go new file mode 100644 index 000000000..2da21e642 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/authentication_type.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package types + +// AuthenticationType controls what authentication method is using during the handshake +type AuthenticationType int + +// AuthenticationType Enums +const ( + AuthenticationTypeCertificate AuthenticationType = iota + 1 + AuthenticationTypePreSharedKey + AuthenticationTypeAnonymous +) diff --git a/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/key_exchange_algorithm.go b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/key_exchange_algorithm.go new file mode 100644 index 000000000..c2c39113a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/ciphersuite/types/key_exchange_algorithm.go @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package types provides types for TLS Ciphers +package types + +// KeyExchangeAlgorithm controls what exchange algorithm was chosen. +type KeyExchangeAlgorithm int + +// KeyExchangeAlgorithm Bitmask +const ( + KeyExchangeAlgorithmNone KeyExchangeAlgorithm = 0 + KeyExchangeAlgorithmPsk KeyExchangeAlgorithm = iota << 1 + KeyExchangeAlgorithmEcdhe +) + +// Has check if keyExchangeAlgorithm is supported. +func (a KeyExchangeAlgorithm) Has(v KeyExchangeAlgorithm) bool { + return (a & v) == v +} diff --git a/vendor/github.com/pion/dtls/v2/internal/closer/closer.go b/vendor/github.com/pion/dtls/v2/internal/closer/closer.go new file mode 100644 index 000000000..bfa171cda --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/closer/closer.go @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package closer provides signaling channel for shutdown +package closer + +import ( + "context" +) + +// Closer allows for each signaling a channel for shutdown +type Closer struct { + ctx context.Context + closeFunc func() +} + +// NewCloser creates a new instance of Closer +func NewCloser() *Closer { + ctx, closeFunc := context.WithCancel(context.Background()) + return &Closer{ + ctx: ctx, + closeFunc: closeFunc, + } +} + +// NewCloserWithParent creates a new instance of Closer with a parent context +func NewCloserWithParent(ctx context.Context) *Closer { + ctx, closeFunc := context.WithCancel(ctx) + return &Closer{ + ctx: ctx, + closeFunc: closeFunc, + } +} + +// Done returns a channel signaling when it is done +func (c *Closer) Done() <-chan struct{} { + return c.ctx.Done() +} + +// Err returns an error of the context +func (c *Closer) Err() error { + return c.ctx.Err() +} + +// Close sends a signal to trigger the ctx done channel +func (c *Closer) Close() { + c.closeFunc() +} diff --git a/vendor/github.com/pion/dtls/v2/internal/util/util.go b/vendor/github.com/pion/dtls/v2/internal/util/util.go new file mode 100644 index 000000000..685910fc2 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/internal/util/util.go @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package util contains small helpers used across the repo +package util + +import ( + "encoding/binary" +) + +// BigEndianUint24 returns the value of a big endian uint24 +func BigEndianUint24(raw []byte) uint32 { + if len(raw) < 3 { + return 0 + } + + rawCopy := make([]byte, 4) + copy(rawCopy[1:], raw) + return binary.BigEndian.Uint32(rawCopy) +} + +// PutBigEndianUint24 encodes a uint24 and places into out +func PutBigEndianUint24(out []byte, in uint32) { + tmp := make([]byte, 4) + binary.BigEndian.PutUint32(tmp, in) + copy(out, tmp[1:]) +} + +// PutBigEndianUint48 encodes a uint64 and places into out +func PutBigEndianUint48(out []byte, in uint64) { + tmp := make([]byte, 8) + binary.BigEndian.PutUint64(tmp, in) + copy(out, tmp[2:]) +} + +// Max returns the larger value +func Max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/vendor/github.com/pion/dtls/v2/listener.go b/vendor/github.com/pion/dtls/v2/listener.go new file mode 100644 index 000000000..190d236c7 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/listener.go @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "net" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" + "github.com/pion/transport/v2/udp" +) + +// Listen creates a DTLS listener +func Listen(network string, laddr *net.UDPAddr, config *Config) (net.Listener, error) { + if err := validateConfig(config); err != nil { + return nil, err + } + + lc := udp.ListenConfig{ + AcceptFilter: func(packet []byte) bool { + pkts, err := recordlayer.UnpackDatagram(packet) + if err != nil || len(pkts) < 1 { + return false + } + h := &recordlayer.Header{} + if err := h.Unmarshal(pkts[0]); err != nil { + return false + } + return h.ContentType == protocol.ContentTypeHandshake + }, + } + parent, err := lc.Listen(network, laddr) + if err != nil { + return nil, err + } + return &listener{ + config: config, + parent: parent, + }, nil +} + +// NewListener creates a DTLS listener which accepts connections from an inner Listener. +func NewListener(inner net.Listener, config *Config) (net.Listener, error) { + if err := validateConfig(config); err != nil { + return nil, err + } + + return &listener{ + config: config, + parent: inner, + }, nil +} + +// listener represents a DTLS listener +type listener struct { + config *Config + parent net.Listener +} + +// Accept waits for and returns the next connection to the listener. +// You have to either close or read on all connection that are created. +// Connection handshake will timeout using ConnectContextMaker in the Config. +// If you want to specify the timeout duration, set ConnectContextMaker. +func (l *listener) Accept() (net.Conn, error) { + c, err := l.parent.Accept() + if err != nil { + return nil, err + } + return Server(c, l.config) +} + +// Close closes the listener. +// Any blocked Accept operations will be unblocked and return errors. +// Already Accepted connections are not closed. +func (l *listener) Close() error { + return l.parent.Close() +} + +// Addr returns the listener's network address. +func (l *listener) Addr() net.Addr { + return l.parent.Addr() +} diff --git a/vendor/github.com/pion/dtls/v2/packet.go b/vendor/github.com/pion/dtls/v2/packet.go new file mode 100644 index 000000000..55d6272ee --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/packet.go @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import "github.com/pion/dtls/v2/pkg/protocol/recordlayer" + +type packet struct { + record *recordlayer.RecordLayer + shouldEncrypt bool + resetLocalSequenceNumber bool +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ccm/ccm.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ccm/ccm.go new file mode 100644 index 000000000..d6e6fc479 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ccm/ccm.go @@ -0,0 +1,254 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package ccm implements a CCM, Counter with CBC-MAC +// as per RFC 3610. +// +// See https://tools.ietf.org/html/rfc3610 +// +// This code was lifted from https://github.com/bocajim/dtls/blob/a3300364a283fcb490d28a93d7fcfa7ba437fbbe/ccm/ccm.go +// and as such was not written by the Pions authors. Like Pions this +// code is licensed under MIT. +// +// A request for including CCM into the Go standard library +// can be found as issue #27484 on the https://github.com/golang/go/ +// repository. +package ccm + +import ( + "crypto/cipher" + "crypto/subtle" + "encoding/binary" + "errors" + "math" +) + +// ccm represents a Counter with CBC-MAC with a specific key. +type ccm struct { + b cipher.Block + M uint8 + L uint8 +} + +const ccmBlockSize = 16 + +// CCM is a block cipher in Counter with CBC-MAC mode. +// Providing authenticated encryption with associated data via the cipher.AEAD interface. +type CCM interface { + cipher.AEAD + // MaxLength returns the maxium length of plaintext in calls to Seal. + // The maximum length of ciphertext in calls to Open is MaxLength()+Overhead(). + // The maximum length is related to CCM's `L` parameter (15-noncesize) and + // is 1<<(8*L) - 1 (but also limited by the maxium size of an int). + MaxLength() int +} + +var ( + errInvalidBlockSize = errors.New("ccm: NewCCM requires 128-bit block cipher") + errInvalidTagSize = errors.New("ccm: tagsize must be 4, 6, 8, 10, 12, 14, or 16") + errInvalidNonceSize = errors.New("ccm: invalid nonce size") +) + +// NewCCM returns the given 128-bit block cipher wrapped in CCM. +// The tagsize must be an even integer between 4 and 16 inclusive +// and is used as CCM's `M` parameter. +// The noncesize must be an integer between 7 and 13 inclusive, +// 15-noncesize is used as CCM's `L` parameter. +func NewCCM(b cipher.Block, tagsize, noncesize int) (CCM, error) { + if b.BlockSize() != ccmBlockSize { + return nil, errInvalidBlockSize + } + if tagsize < 4 || tagsize > 16 || tagsize&1 != 0 { + return nil, errInvalidTagSize + } + lensize := 15 - noncesize + if lensize < 2 || lensize > 8 { + return nil, errInvalidNonceSize + } + c := &ccm{b: b, M: uint8(tagsize), L: uint8(lensize)} + return c, nil +} + +func (c *ccm) NonceSize() int { return 15 - int(c.L) } +func (c *ccm) Overhead() int { return int(c.M) } +func (c *ccm) MaxLength() int { return maxlen(c.L, c.Overhead()) } + +func maxlen(l uint8, tagsize int) int { + max := (uint64(1) << (8 * l)) - 1 + if m64 := uint64(math.MaxInt64) - uint64(tagsize); l > 8 || max > m64 { + max = m64 // The maximum lentgh on a 64bit arch + } + if max != uint64(int(max)) { + return math.MaxInt32 - tagsize // We have only 32bit int's + } + return int(max) +} + +// MaxNonceLength returns the maximum nonce length for a given plaintext length. +// A return value <= 0 indicates that plaintext length is too large for +// any nonce length. +func MaxNonceLength(pdatalen int) int { + const tagsize = 16 + for L := 2; L <= 8; L++ { + if maxlen(uint8(L), tagsize) >= pdatalen { + return 15 - L + } + } + return 0 +} + +func (c *ccm) cbcRound(mac, data []byte) { + for i := 0; i < ccmBlockSize; i++ { + mac[i] ^= data[i] + } + c.b.Encrypt(mac, mac) +} + +func (c *ccm) cbcData(mac, data []byte) { + for len(data) >= ccmBlockSize { + c.cbcRound(mac, data[:ccmBlockSize]) + data = data[ccmBlockSize:] + } + if len(data) > 0 { + var block [ccmBlockSize]byte + copy(block[:], data) + c.cbcRound(mac, block[:]) + } +} + +var errPlaintextTooLong = errors.New("ccm: plaintext too large") + +func (c *ccm) tag(nonce, plaintext, adata []byte) ([]byte, error) { + var mac [ccmBlockSize]byte + + if len(adata) > 0 { + mac[0] |= 1 << 6 + } + mac[0] |= (c.M - 2) << 2 + mac[0] |= c.L - 1 + if len(nonce) != c.NonceSize() { + return nil, errInvalidNonceSize + } + if len(plaintext) > c.MaxLength() { + return nil, errPlaintextTooLong + } + binary.BigEndian.PutUint64(mac[ccmBlockSize-8:], uint64(len(plaintext))) + copy(mac[1:ccmBlockSize-c.L], nonce) + c.b.Encrypt(mac[:], mac[:]) + + var block [ccmBlockSize]byte + if n := uint64(len(adata)); n > 0 { + // First adata block includes adata length + i := 2 + if n <= 0xfeff { + binary.BigEndian.PutUint16(block[:i], uint16(n)) + } else { + block[0] = 0xfe + block[1] = 0xff + if n < uint64(1<<32) { + i = 2 + 4 + binary.BigEndian.PutUint32(block[2:i], uint32(n)) + } else { + i = 2 + 8 + binary.BigEndian.PutUint64(block[2:i], n) + } + } + i = copy(block[i:], adata) + c.cbcRound(mac[:], block[:]) + c.cbcData(mac[:], adata[i:]) + } + + if len(plaintext) > 0 { + c.cbcData(mac[:], plaintext) + } + + return mac[:c.M], nil +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +// From crypto/cipher/gcm.go +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} + +// Seal encrypts and authenticates plaintext, authenticates the +// additional data and appends the result to dst, returning the updated +// slice. The nonce must be NonceSize() bytes long and unique for all +// time, for a given key. +// The plaintext must be no longer than MaxLength() bytes long. +// +// The plaintext and dst may alias exactly or not at all. +func (c *ccm) Seal(dst, nonce, plaintext, adata []byte) []byte { + tag, err := c.tag(nonce, plaintext, adata) + if err != nil { + // The cipher.AEAD interface doesn't allow for an error return. + panic(err) // nolint + } + + var iv, s0 [ccmBlockSize]byte + iv[0] = c.L - 1 + copy(iv[1:ccmBlockSize-c.L], nonce) + c.b.Encrypt(s0[:], iv[:]) + for i := 0; i < int(c.M); i++ { + tag[i] ^= s0[i] + } + iv[len(iv)-1] |= 1 + stream := cipher.NewCTR(c.b, iv[:]) + ret, out := sliceForAppend(dst, len(plaintext)+int(c.M)) + stream.XORKeyStream(out, plaintext) + copy(out[len(plaintext):], tag) + return ret +} + +var ( + errOpen = errors.New("ccm: message authentication failed") + errCiphertextTooShort = errors.New("ccm: ciphertext too short") + errCiphertextTooLong = errors.New("ccm: ciphertext too long") +) + +func (c *ccm) Open(dst, nonce, ciphertext, adata []byte) ([]byte, error) { + if len(ciphertext) < int(c.M) { + return nil, errCiphertextTooShort + } + if len(ciphertext) > c.MaxLength()+c.Overhead() { + return nil, errCiphertextTooLong + } + + tag := make([]byte, int(c.M)) + copy(tag, ciphertext[len(ciphertext)-int(c.M):]) + ciphertextWithoutTag := ciphertext[:len(ciphertext)-int(c.M)] + + var iv, s0 [ccmBlockSize]byte + iv[0] = c.L - 1 + copy(iv[1:ccmBlockSize-c.L], nonce) + c.b.Encrypt(s0[:], iv[:]) + for i := 0; i < int(c.M); i++ { + tag[i] ^= s0[i] + } + iv[len(iv)-1] |= 1 + stream := cipher.NewCTR(c.b, iv[:]) + + // Cannot decrypt directly to dst since we're not supposed to + // reveal the plaintext to the caller if authentication fails. + plaintext := make([]byte, len(ciphertextWithoutTag)) + stream.XORKeyStream(plaintext, ciphertextWithoutTag) + expectedTag, err := c.tag(nonce, plaintext, adata) + if err != nil { + return nil, err + } + + if subtle.ConstantTimeCompare(tag, expectedTag) != 1 { + return nil, errOpen + } + return append(dst, plaintext...), nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/cbc.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/cbc.go new file mode 100644 index 000000000..460fb1437 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/cbc.go @@ -0,0 +1,177 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( //nolint:gci + "crypto/aes" + "crypto/cipher" + "crypto/hmac" + "crypto/rand" + "encoding/binary" + "hash" + + "github.com/pion/dtls/v2/internal/util" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// block ciphers using cipher block chaining. +type cbcMode interface { + cipher.BlockMode + SetIV([]byte) +} + +// CBC Provides an API to Encrypt/Decrypt DTLS 1.2 Packets +type CBC struct { + writeCBC, readCBC cbcMode + writeMac, readMac []byte + h prf.HashFunc +} + +// NewCBC creates a DTLS CBC Cipher +func NewCBC(localKey, localWriteIV, localMac, remoteKey, remoteWriteIV, remoteMac []byte, h prf.HashFunc) (*CBC, error) { + writeBlock, err := aes.NewCipher(localKey) + if err != nil { + return nil, err + } + + readBlock, err := aes.NewCipher(remoteKey) + if err != nil { + return nil, err + } + + writeCBC, ok := cipher.NewCBCEncrypter(writeBlock, localWriteIV).(cbcMode) + if !ok { + return nil, errFailedToCast + } + + readCBC, ok := cipher.NewCBCDecrypter(readBlock, remoteWriteIV).(cbcMode) + if !ok { + return nil, errFailedToCast + } + + return &CBC{ + writeCBC: writeCBC, + writeMac: localMac, + + readCBC: readCBC, + readMac: remoteMac, + h: h, + }, nil +} + +// Encrypt encrypt a DTLS RecordLayer message +func (c *CBC) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + payload := raw[recordlayer.HeaderSize:] + raw = raw[:recordlayer.HeaderSize] + blockSize := c.writeCBC.BlockSize() + + // Generate + Append MAC + h := pkt.Header + + MAC, err := c.hmac(h.Epoch, h.SequenceNumber, h.ContentType, h.Version, payload, c.writeMac, c.h) + if err != nil { + return nil, err + } + payload = append(payload, MAC...) + + // Generate + Append padding + padding := make([]byte, blockSize-len(payload)%blockSize) + paddingLen := len(padding) + for i := 0; i < paddingLen; i++ { + padding[i] = byte(paddingLen - 1) + } + payload = append(payload, padding...) + + // Generate IV + iv := make([]byte, blockSize) + if _, err := rand.Read(iv); err != nil { + return nil, err + } + + // Set IV + Encrypt + Prepend IV + c.writeCBC.SetIV(iv) + c.writeCBC.CryptBlocks(payload, payload) + payload = append(iv, payload...) + + // Prepend unencrypte header with encrypted payload + raw = append(raw, payload...) + + // Update recordLayer size to include IV+MAC+Padding + binary.BigEndian.PutUint16(raw[recordlayer.HeaderSize-2:], uint16(len(raw)-recordlayer.HeaderSize)) + + return raw, nil +} + +// Decrypt decrypts a DTLS RecordLayer message +func (c *CBC) Decrypt(in []byte) ([]byte, error) { + body := in[recordlayer.HeaderSize:] + blockSize := c.readCBC.BlockSize() + mac := c.h() + + var h recordlayer.Header + err := h.Unmarshal(in) + switch { + case err != nil: + return nil, err + case h.ContentType == protocol.ContentTypeChangeCipherSpec: + // Nothing to encrypt with ChangeCipherSpec + return in, nil + case len(body)%blockSize != 0 || len(body) < blockSize+util.Max(mac.Size()+1, blockSize): + return nil, errNotEnoughRoomForNonce + } + + // Set + remove per record IV + c.readCBC.SetIV(body[:blockSize]) + body = body[blockSize:] + + // Decrypt + c.readCBC.CryptBlocks(body, body) + + // Padding+MAC needs to be checked in constant time + // Otherwise we reveal information about the level of correctness + paddingLen, paddingGood := examinePadding(body) + if paddingGood != 255 { + return nil, errInvalidMAC + } + + macSize := mac.Size() + if len(body) < macSize { + return nil, errInvalidMAC + } + + dataEnd := len(body) - macSize - paddingLen + + expectedMAC := body[dataEnd : dataEnd+macSize] + actualMAC, err := c.hmac(h.Epoch, h.SequenceNumber, h.ContentType, h.Version, body[:dataEnd], c.readMac, c.h) + + // Compute Local MAC and compare + if err != nil || !hmac.Equal(actualMAC, expectedMAC) { + return nil, errInvalidMAC + } + + return append(in[:recordlayer.HeaderSize], body[:dataEnd]...), nil +} + +func (c *CBC) hmac(epoch uint16, sequenceNumber uint64, contentType protocol.ContentType, protocolVersion protocol.Version, payload []byte, key []byte, hf func() hash.Hash) ([]byte, error) { + h := hmac.New(hf, key) + + msg := make([]byte, 13) + + binary.BigEndian.PutUint16(msg, epoch) + util.PutBigEndianUint48(msg[2:], sequenceNumber) + msg[8] = byte(contentType) + msg[9] = protocolVersion.Major + msg[10] = protocolVersion.Minor + binary.BigEndian.PutUint16(msg[11:], uint16(len(payload))) + + if _, err := h.Write(msg); err != nil { + return nil, err + } else if _, err := h.Write(payload); err != nil { + return nil, err + } + + return h.Sum(nil), nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go new file mode 100644 index 000000000..24050dc92 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ccm.go @@ -0,0 +1,107 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/aes" + "crypto/rand" + "encoding/binary" + "fmt" + + "github.com/pion/dtls/v2/pkg/crypto/ccm" + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +// CCMTagLen is the length of Authentication Tag +type CCMTagLen int + +// CCM Enums +const ( + CCMTagLength8 CCMTagLen = 8 + CCMTagLength CCMTagLen = 16 + ccmNonceLength = 12 +) + +// CCM Provides an API to Encrypt/Decrypt DTLS 1.2 Packets +type CCM struct { + localCCM, remoteCCM ccm.CCM + localWriteIV, remoteWriteIV []byte + tagLen CCMTagLen +} + +// NewCCM creates a DTLS GCM Cipher +func NewCCM(tagLen CCMTagLen, localKey, localWriteIV, remoteKey, remoteWriteIV []byte) (*CCM, error) { + localBlock, err := aes.NewCipher(localKey) + if err != nil { + return nil, err + } + localCCM, err := ccm.NewCCM(localBlock, int(tagLen), ccmNonceLength) + if err != nil { + return nil, err + } + + remoteBlock, err := aes.NewCipher(remoteKey) + if err != nil { + return nil, err + } + remoteCCM, err := ccm.NewCCM(remoteBlock, int(tagLen), ccmNonceLength) + if err != nil { + return nil, err + } + + return &CCM{ + localCCM: localCCM, + localWriteIV: localWriteIV, + remoteCCM: remoteCCM, + remoteWriteIV: remoteWriteIV, + tagLen: tagLen, + }, nil +} + +// Encrypt encrypt a DTLS RecordLayer message +func (c *CCM) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + payload := raw[recordlayer.HeaderSize:] + raw = raw[:recordlayer.HeaderSize] + + nonce := append(append([]byte{}, c.localWriteIV[:4]...), make([]byte, 8)...) + if _, err := rand.Read(nonce[4:]); err != nil { + return nil, err + } + + additionalData := generateAEADAdditionalData(&pkt.Header, len(payload)) + encryptedPayload := c.localCCM.Seal(nil, nonce, payload, additionalData) + + encryptedPayload = append(nonce[4:], encryptedPayload...) + raw = append(raw, encryptedPayload...) + + // Update recordLayer size to include explicit nonce + binary.BigEndian.PutUint16(raw[recordlayer.HeaderSize-2:], uint16(len(raw)-recordlayer.HeaderSize)) + return raw, nil +} + +// Decrypt decrypts a DTLS RecordLayer message +func (c *CCM) Decrypt(in []byte) ([]byte, error) { + var h recordlayer.Header + err := h.Unmarshal(in) + switch { + case err != nil: + return nil, err + case h.ContentType == protocol.ContentTypeChangeCipherSpec: + // Nothing to encrypt with ChangeCipherSpec + return in, nil + case len(in) <= (8 + recordlayer.HeaderSize): + return nil, errNotEnoughRoomForNonce + } + + nonce := append(append([]byte{}, c.remoteWriteIV[:4]...), in[recordlayer.HeaderSize:recordlayer.HeaderSize+8]...) + out := in[recordlayer.HeaderSize+8:] + + additionalData := generateAEADAdditionalData(&h, len(out)-int(c.tagLen)) + out, err = c.remoteCCM.Open(out[:0], nonce, out, additionalData) + if err != nil { + return nil, fmt.Errorf("%w: %v", errDecryptPacket, err) //nolint:errorlint + } + return append(in[:recordlayer.HeaderSize], out...), nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ciphersuite.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ciphersuite.go new file mode 100644 index 000000000..9d9fb7418 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/ciphersuite.go @@ -0,0 +1,76 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package ciphersuite provides the crypto operations needed for a DTLS CipherSuite +package ciphersuite + +import ( + "encoding/binary" + "errors" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +var ( + errNotEnoughRoomForNonce = &protocol.InternalError{Err: errors.New("buffer not long enough to contain nonce")} //nolint:goerr113 + errDecryptPacket = &protocol.TemporaryError{Err: errors.New("failed to decrypt packet")} //nolint:goerr113 + errInvalidMAC = &protocol.TemporaryError{Err: errors.New("invalid mac")} //nolint:goerr113 + errFailedToCast = &protocol.FatalError{Err: errors.New("failed to cast")} //nolint:goerr113 +) + +func generateAEADAdditionalData(h *recordlayer.Header, payloadLen int) []byte { + var additionalData [13]byte + // SequenceNumber MUST be set first + // we only want uint48, clobbering an extra 2 (using uint64, Golang doesn't have uint48) + binary.BigEndian.PutUint64(additionalData[:], h.SequenceNumber) + binary.BigEndian.PutUint16(additionalData[:], h.Epoch) + additionalData[8] = byte(h.ContentType) + additionalData[9] = h.Version.Major + additionalData[10] = h.Version.Minor + binary.BigEndian.PutUint16(additionalData[len(additionalData)-2:], uint16(payloadLen)) + + return additionalData[:] +} + +// examinePadding returns, in constant time, the length of the padding to remove +// from the end of payload. It also returns a byte which is equal to 255 if the +// padding was valid and 0 otherwise. See RFC 2246, Section 6.2.3.2. +// +// https://github.com/golang/go/blob/039c2081d1178f90a8fa2f4e6958693129f8de33/src/crypto/tls/conn.go#L245 +func examinePadding(payload []byte) (toRemove int, good byte) { + if len(payload) < 1 { + return 0, 0 + } + + paddingLen := payload[len(payload)-1] + t := uint(len(payload)-1) - uint(paddingLen) + // if len(payload) >= (paddingLen - 1) then the MSB of t is zero + good = byte(int32(^t) >> 31) + + // The maximum possible padding length plus the actual length field + toCheck := 256 + // The length of the padded data is public, so we can use an if here + if toCheck > len(payload) { + toCheck = len(payload) + } + + for i := 0; i < toCheck; i++ { + t := uint(paddingLen) - uint(i) + // if i <= paddingLen then the MSB of t is zero + mask := byte(int32(^t) >> 31) + b := payload[len(payload)-1-i] + good &^= mask&paddingLen ^ mask&b + } + + // We AND together the bits of good and replicate the result across + // all the bits. + good &= good << 4 + good &= good << 2 + good &= good << 1 + good = uint8(int8(good) >> 7) + + toRemove = int(paddingLen) + 1 + + return toRemove, good +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go new file mode 100644 index 000000000..c0fd1f76f --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/ciphersuite/gcm.go @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package ciphersuite + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/binary" + "fmt" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/recordlayer" +) + +const ( + gcmTagLength = 16 + gcmNonceLength = 12 +) + +// GCM Provides an API to Encrypt/Decrypt DTLS 1.2 Packets +type GCM struct { + localGCM, remoteGCM cipher.AEAD + localWriteIV, remoteWriteIV []byte +} + +// NewGCM creates a DTLS GCM Cipher +func NewGCM(localKey, localWriteIV, remoteKey, remoteWriteIV []byte) (*GCM, error) { + localBlock, err := aes.NewCipher(localKey) + if err != nil { + return nil, err + } + localGCM, err := cipher.NewGCM(localBlock) + if err != nil { + return nil, err + } + + remoteBlock, err := aes.NewCipher(remoteKey) + if err != nil { + return nil, err + } + remoteGCM, err := cipher.NewGCM(remoteBlock) + if err != nil { + return nil, err + } + + return &GCM{ + localGCM: localGCM, + localWriteIV: localWriteIV, + remoteGCM: remoteGCM, + remoteWriteIV: remoteWriteIV, + }, nil +} + +// Encrypt encrypt a DTLS RecordLayer message +func (g *GCM) Encrypt(pkt *recordlayer.RecordLayer, raw []byte) ([]byte, error) { + payload := raw[recordlayer.HeaderSize:] + raw = raw[:recordlayer.HeaderSize] + + nonce := make([]byte, gcmNonceLength) + copy(nonce, g.localWriteIV[:4]) + if _, err := rand.Read(nonce[4:]); err != nil { + return nil, err + } + + additionalData := generateAEADAdditionalData(&pkt.Header, len(payload)) + encryptedPayload := g.localGCM.Seal(nil, nonce, payload, additionalData) + r := make([]byte, len(raw)+len(nonce[4:])+len(encryptedPayload)) + copy(r, raw) + copy(r[len(raw):], nonce[4:]) + copy(r[len(raw)+len(nonce[4:]):], encryptedPayload) + + // Update recordLayer size to include explicit nonce + binary.BigEndian.PutUint16(r[recordlayer.HeaderSize-2:], uint16(len(r)-recordlayer.HeaderSize)) + return r, nil +} + +// Decrypt decrypts a DTLS RecordLayer message +func (g *GCM) Decrypt(in []byte) ([]byte, error) { + var h recordlayer.Header + err := h.Unmarshal(in) + switch { + case err != nil: + return nil, err + case h.ContentType == protocol.ContentTypeChangeCipherSpec: + // Nothing to encrypt with ChangeCipherSpec + return in, nil + case len(in) <= (8 + recordlayer.HeaderSize): + return nil, errNotEnoughRoomForNonce + } + + nonce := make([]byte, 0, gcmNonceLength) + nonce = append(append(nonce, g.remoteWriteIV[:4]...), in[recordlayer.HeaderSize:recordlayer.HeaderSize+8]...) + out := in[recordlayer.HeaderSize+8:] + + additionalData := generateAEADAdditionalData(&h, len(out)-gcmTagLength) + out, err = g.remoteGCM.Open(out[:0], nonce, out, additionalData) + if err != nil { + return nil, fmt.Errorf("%w: %v", errDecryptPacket, err) //nolint:errorlint + } + return append(in[:recordlayer.HeaderSize], out...), nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/clientcertificate/client_certificate.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/clientcertificate/client_certificate.go new file mode 100644 index 000000000..ddfa39ebe --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/clientcertificate/client_certificate.go @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package clientcertificate provides all the support Client Certificate types +package clientcertificate + +// Type is used to communicate what +// type of certificate is being transported +// +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-2 +type Type byte + +// ClientCertificateType enums +const ( + RSASign Type = 1 + ECDSASign Type = 64 +) + +// Types returns all valid ClientCertificate Types +func Types() map[Type]bool { + return map[Type]bool{ + RSASign: true, + ECDSASign: true, + } +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/elliptic/elliptic.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/elliptic/elliptic.go new file mode 100644 index 000000000..126523872 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/elliptic/elliptic.go @@ -0,0 +1,115 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package elliptic provides elliptic curve cryptography for DTLS +package elliptic + +import ( + "crypto/elliptic" + "crypto/rand" + "errors" + "fmt" + + "golang.org/x/crypto/curve25519" +) + +var errInvalidNamedCurve = errors.New("invalid named curve") + +// CurvePointFormat is used to represent the IANA registered curve points +// +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-9 +type CurvePointFormat byte + +// CurvePointFormat enums +const ( + CurvePointFormatUncompressed CurvePointFormat = 0 +) + +// Keypair is a Curve with a Private/Public Keypair +type Keypair struct { + Curve Curve + PublicKey []byte + PrivateKey []byte +} + +// CurveType is used to represent the IANA registered curve types for TLS +// +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-10 +type CurveType byte + +// CurveType enums +const ( + CurveTypeNamedCurve CurveType = 0x03 +) + +// CurveTypes returns all known curves +func CurveTypes() map[CurveType]struct{} { + return map[CurveType]struct{}{ + CurveTypeNamedCurve: {}, + } +} + +// Curve is used to represent the IANA registered curves for TLS +// +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8 +type Curve uint16 + +// Curve enums +const ( + P256 Curve = 0x0017 + P384 Curve = 0x0018 + X25519 Curve = 0x001d +) + +func (c Curve) String() string { + switch c { + case P256: + return "P-256" + case P384: + return "P-384" + case X25519: + return "X25519" + } + return fmt.Sprintf("%#x", uint16(c)) +} + +// Curves returns all curves we implement +func Curves() map[Curve]bool { + return map[Curve]bool{ + X25519: true, + P256: true, + P384: true, + } +} + +// GenerateKeypair generates a keypair for the given Curve +func GenerateKeypair(c Curve) (*Keypair, error) { + switch c { //nolint:revive + case X25519: + tmp := make([]byte, 32) + if _, err := rand.Read(tmp); err != nil { + return nil, err + } + + var public, private [32]byte + copy(private[:], tmp) + + curve25519.ScalarBaseMult(&public, &private) + return &Keypair{X25519, public[:], private[:]}, nil + case P256: + return ellipticCurveKeypair(P256, elliptic.P256(), elliptic.P256()) + case P384: + return ellipticCurveKeypair(P384, elliptic.P384(), elliptic.P384()) + default: + return nil, errInvalidNamedCurve + } +} + +func ellipticCurveKeypair(nc Curve, c1, c2 elliptic.Curve) (*Keypair, error) { + privateKey, x, y, err := elliptic.GenerateKey(c1, rand.Reader) + if err != nil { + return nil, err + } + + return &Keypair{nc, elliptic.Marshal(c2, x, y), privateKey}, nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/hash/hash.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/hash/hash.go new file mode 100644 index 000000000..9966626e3 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/hash/hash.go @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package hash provides TLS HashAlgorithm as defined in TLS 1.2 +package hash + +import ( //nolint:gci + "crypto" + "crypto/md5" //nolint:gosec + "crypto/sha1" //nolint:gosec + "crypto/sha256" + "crypto/sha512" +) + +// Algorithm is used to indicate the hash algorithm used +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-18 +type Algorithm uint16 + +// Supported hash algorithms +const ( + None Algorithm = 0 // Blacklisted + MD5 Algorithm = 1 // Blacklisted + SHA1 Algorithm = 2 // Blacklisted + SHA224 Algorithm = 3 + SHA256 Algorithm = 4 + SHA384 Algorithm = 5 + SHA512 Algorithm = 6 + Ed25519 Algorithm = 8 +) + +// String makes hashAlgorithm printable +func (a Algorithm) String() string { + switch a { + case None: + return "none" + case MD5: + return "md5" // [RFC3279] + case SHA1: + return "sha-1" // [RFC3279] + case SHA224: + return "sha-224" // [RFC4055] + case SHA256: + return "sha-256" // [RFC4055] + case SHA384: + return "sha-384" // [RFC4055] + case SHA512: + return "sha-512" // [RFC4055] + case Ed25519: + return "null" + default: + return "unknown or unsupported hash algorithm" + } +} + +// Digest performs a digest on the passed value +func (a Algorithm) Digest(b []byte) []byte { + switch a { + case None: + return nil + case MD5: + hash := md5.Sum(b) // #nosec + return hash[:] + case SHA1: + hash := sha1.Sum(b) // #nosec + return hash[:] + case SHA224: + hash := sha256.Sum224(b) + return hash[:] + case SHA256: + hash := sha256.Sum256(b) + return hash[:] + case SHA384: + hash := sha512.Sum384(b) + return hash[:] + case SHA512: + hash := sha512.Sum512(b) + return hash[:] + default: + return nil + } +} + +// Insecure returns if the given HashAlgorithm is considered secure in DTLS 1.2 +func (a Algorithm) Insecure() bool { + switch a { + case None, MD5, SHA1: + return true + default: + return false + } +} + +// CryptoHash returns the crypto.Hash implementation for the given HashAlgorithm +func (a Algorithm) CryptoHash() crypto.Hash { + switch a { + case None: + return crypto.Hash(0) + case MD5: + return crypto.MD5 + case SHA1: + return crypto.SHA1 + case SHA224: + return crypto.SHA224 + case SHA256: + return crypto.SHA256 + case SHA384: + return crypto.SHA384 + case SHA512: + return crypto.SHA512 + case Ed25519: + return crypto.Hash(0) + default: + return crypto.Hash(0) + } +} + +// Algorithms returns all the supported Hash Algorithms +func Algorithms() map[Algorithm]struct{} { + return map[Algorithm]struct{}{ + None: {}, + MD5: {}, + SHA1: {}, + SHA224: {}, + SHA256: {}, + SHA384: {}, + SHA512: {}, + Ed25519: {}, + } +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/prf/prf.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/prf/prf.go new file mode 100644 index 000000000..6e7b3ecba --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/prf/prf.go @@ -0,0 +1,255 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package prf implements TLS 1.2 Pseudorandom functions +package prf + +import ( //nolint:gci + ellipticStdlib "crypto/elliptic" + "crypto/hmac" + "encoding/binary" + "errors" + "fmt" + "hash" + "math" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/protocol" + "golang.org/x/crypto/curve25519" +) + +const ( + masterSecretLabel = "master secret" + extendedMasterSecretLabel = "extended master secret" + keyExpansionLabel = "key expansion" + verifyDataClientLabel = "client finished" + verifyDataServerLabel = "server finished" +) + +// HashFunc allows callers to decide what hash is used in PRF +type HashFunc func() hash.Hash + +// EncryptionKeys is all the state needed for a TLS CipherSuite +type EncryptionKeys struct { + MasterSecret []byte + ClientMACKey []byte + ServerMACKey []byte + ClientWriteKey []byte + ServerWriteKey []byte + ClientWriteIV []byte + ServerWriteIV []byte +} + +var errInvalidNamedCurve = &protocol.FatalError{Err: errors.New("invalid named curve")} //nolint:goerr113 + +func (e *EncryptionKeys) String() string { + return fmt.Sprintf(`encryptionKeys: +- masterSecret: %#v +- clientMACKey: %#v +- serverMACKey: %#v +- clientWriteKey: %#v +- serverWriteKey: %#v +- clientWriteIV: %#v +- serverWriteIV: %#v +`, + e.MasterSecret, + e.ClientMACKey, + e.ServerMACKey, + e.ClientWriteKey, + e.ServerWriteKey, + e.ClientWriteIV, + e.ServerWriteIV) +} + +// PSKPreMasterSecret generates the PSK Premaster Secret +// The premaster secret is formed as follows: if the PSK is N octets +// long, concatenate a uint16 with the value N, N zero octets, a second +// uint16 with the value N, and the PSK itself. +// +// https://tools.ietf.org/html/rfc4279#section-2 +func PSKPreMasterSecret(psk []byte) []byte { + pskLen := uint16(len(psk)) + + out := append(make([]byte, 2+pskLen+2), psk...) + binary.BigEndian.PutUint16(out, pskLen) + binary.BigEndian.PutUint16(out[2+pskLen:], pskLen) + + return out +} + +// EcdhePSKPreMasterSecret implements TLS 1.2 Premaster Secret generation given a psk, a keypair and a curve +// +// https://datatracker.ietf.org/doc/html/rfc5489#section-2 +func EcdhePSKPreMasterSecret(psk, publicKey, privateKey []byte, curve elliptic.Curve) ([]byte, error) { + preMasterSecret, err := PreMasterSecret(publicKey, privateKey, curve) + if err != nil { + return nil, err + } + out := make([]byte, 2+len(preMasterSecret)+2+len(psk)) + + // write preMasterSecret length + offset := 0 + binary.BigEndian.PutUint16(out[offset:], uint16(len(preMasterSecret))) + offset += 2 + + // write preMasterSecret + copy(out[offset:], preMasterSecret) + offset += len(preMasterSecret) + + // write psk length + binary.BigEndian.PutUint16(out[offset:], uint16(len(psk))) + offset += 2 + + // write psk + copy(out[offset:], psk) + return out, nil +} + +// PreMasterSecret implements TLS 1.2 Premaster Secret generation given a keypair and a curve +func PreMasterSecret(publicKey, privateKey []byte, curve elliptic.Curve) ([]byte, error) { + switch curve { + case elliptic.X25519: + return curve25519.X25519(privateKey, publicKey) + case elliptic.P256: + return ellipticCurvePreMasterSecret(publicKey, privateKey, ellipticStdlib.P256(), ellipticStdlib.P256()) + case elliptic.P384: + return ellipticCurvePreMasterSecret(publicKey, privateKey, ellipticStdlib.P384(), ellipticStdlib.P384()) + default: + return nil, errInvalidNamedCurve + } +} + +func ellipticCurvePreMasterSecret(publicKey, privateKey []byte, c1, c2 ellipticStdlib.Curve) ([]byte, error) { + x, y := ellipticStdlib.Unmarshal(c1, publicKey) + if x == nil || y == nil { + return nil, errInvalidNamedCurve + } + + result, _ := c2.ScalarMult(x, y, privateKey) + preMasterSecret := make([]byte, (c2.Params().BitSize+7)>>3) + resultBytes := result.Bytes() + copy(preMasterSecret[len(preMasterSecret)-len(resultBytes):], resultBytes) + return preMasterSecret, nil +} + +// PHash is PRF is the SHA-256 hash function is used for all cipher suites +// defined in this TLS 1.2 document and in TLS documents published prior to this +// document when TLS 1.2 is negotiated. New cipher suites MUST explicitly +// specify a PRF and, in general, SHOULD use the TLS PRF with SHA-256 or a +// stronger standard hash function. +// +// P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) + +// HMAC_hash(secret, A(2) + seed) + +// HMAC_hash(secret, A(3) + seed) + ... +// +// A() is defined as: +// +// A(0) = seed +// A(i) = HMAC_hash(secret, A(i-1)) +// +// P_hash can be iterated as many times as necessary to produce the +// required quantity of data. For example, if P_SHA256 is being used to +// create 80 bytes of data, it will have to be iterated three times +// (through A(3)), creating 96 bytes of output data; the last 16 bytes +// of the final iteration will then be discarded, leaving 80 bytes of +// output data. +// +// https://tools.ietf.org/html/rfc4346w +func PHash(secret, seed []byte, requestedLength int, h HashFunc) ([]byte, error) { + hmacSHA256 := func(key, data []byte) ([]byte, error) { + mac := hmac.New(h, key) + if _, err := mac.Write(data); err != nil { + return nil, err + } + return mac.Sum(nil), nil + } + + var err error + lastRound := seed + out := []byte{} + + iterations := int(math.Ceil(float64(requestedLength) / float64(h().Size()))) + for i := 0; i < iterations; i++ { + lastRound, err = hmacSHA256(secret, lastRound) + if err != nil { + return nil, err + } + withSecret, err := hmacSHA256(secret, append(lastRound, seed...)) + if err != nil { + return nil, err + } + out = append(out, withSecret...) + } + + return out[:requestedLength], nil +} + +// ExtendedMasterSecret generates a Extended MasterSecret as defined in +// https://tools.ietf.org/html/rfc7627 +func ExtendedMasterSecret(preMasterSecret, sessionHash []byte, h HashFunc) ([]byte, error) { + seed := append([]byte(extendedMasterSecretLabel), sessionHash...) + return PHash(preMasterSecret, seed, 48, h) +} + +// MasterSecret generates a TLS 1.2 MasterSecret +func MasterSecret(preMasterSecret, clientRandom, serverRandom []byte, h HashFunc) ([]byte, error) { + seed := append(append([]byte(masterSecretLabel), clientRandom...), serverRandom...) + return PHash(preMasterSecret, seed, 48, h) +} + +// GenerateEncryptionKeys is the final step TLS 1.2 PRF. Given all state generated so far generates +// the final keys need for encryption +func GenerateEncryptionKeys(masterSecret, clientRandom, serverRandom []byte, macLen, keyLen, ivLen int, h HashFunc) (*EncryptionKeys, error) { + seed := append(append([]byte(keyExpansionLabel), serverRandom...), clientRandom...) + keyMaterial, err := PHash(masterSecret, seed, (2*macLen)+(2*keyLen)+(2*ivLen), h) + if err != nil { + return nil, err + } + + clientMACKey := keyMaterial[:macLen] + keyMaterial = keyMaterial[macLen:] + + serverMACKey := keyMaterial[:macLen] + keyMaterial = keyMaterial[macLen:] + + clientWriteKey := keyMaterial[:keyLen] + keyMaterial = keyMaterial[keyLen:] + + serverWriteKey := keyMaterial[:keyLen] + keyMaterial = keyMaterial[keyLen:] + + clientWriteIV := keyMaterial[:ivLen] + keyMaterial = keyMaterial[ivLen:] + + serverWriteIV := keyMaterial[:ivLen] + + return &EncryptionKeys{ + MasterSecret: masterSecret, + ClientMACKey: clientMACKey, + ServerMACKey: serverMACKey, + ClientWriteKey: clientWriteKey, + ServerWriteKey: serverWriteKey, + ClientWriteIV: clientWriteIV, + ServerWriteIV: serverWriteIV, + }, nil +} + +func prfVerifyData(masterSecret, handshakeBodies []byte, label string, hashFunc HashFunc) ([]byte, error) { + h := hashFunc() + if _, err := h.Write(handshakeBodies); err != nil { + return nil, err + } + + seed := append([]byte(label), h.Sum(nil)...) + return PHash(masterSecret, seed, 12, hashFunc) +} + +// VerifyDataClient is caled on the Client Side to either verify or generate the VerifyData message +func VerifyDataClient(masterSecret, handshakeBodies []byte, h HashFunc) ([]byte, error) { + return prfVerifyData(masterSecret, handshakeBodies, verifyDataClientLabel, h) +} + +// VerifyDataServer is caled on the Server Side to either verify or generate the VerifyData message +func VerifyDataServer(masterSecret, handshakeBodies []byte, h HashFunc) ([]byte, error) { + return prfVerifyData(masterSecret, handshakeBodies, verifyDataServerLabel, h) +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/signature/signature.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/signature/signature.go new file mode 100644 index 000000000..fec7fba3b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/signature/signature.go @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package signature provides our implemented Signature Algorithms +package signature + +// Algorithm as defined in TLS 1.2 +// https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-16 +type Algorithm uint16 + +// SignatureAlgorithm enums +const ( + Anonymous Algorithm = 0 + RSA Algorithm = 1 + ECDSA Algorithm = 3 + Ed25519 Algorithm = 7 +) + +// Algorithms returns all implemented Signature Algorithms +func Algorithms() map[Algorithm]struct{} { + return map[Algorithm]struct{}{ + Anonymous: {}, + RSA: {}, + ECDSA: {}, + Ed25519: {}, + } +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/errors.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/errors.go new file mode 100644 index 000000000..4aeb3e40a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/errors.go @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package signaturehash + +import "errors" + +var ( + errNoAvailableSignatureSchemes = errors.New("connection can not be created, no SignatureScheme satisfy this Config") + errInvalidSignatureAlgorithm = errors.New("invalid signature algorithm") + errInvalidHashAlgorithm = errors.New("invalid hash algorithm") +) diff --git a/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/signaturehash.go b/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/signaturehash.go new file mode 100644 index 000000000..2561accd1 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/crypto/signaturehash/signaturehash.go @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package signaturehash provides the SignatureHashAlgorithm as defined in TLS 1.2 +package signaturehash + +import ( + "crypto" + "crypto/ecdsa" + "crypto/ed25519" + "crypto/rsa" + "crypto/tls" + "fmt" + + "github.com/pion/dtls/v2/pkg/crypto/hash" + "github.com/pion/dtls/v2/pkg/crypto/signature" +) + +// Algorithm is a signature/hash algorithm pairs which may be used in +// digital signatures. +// +// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 +type Algorithm struct { + Hash hash.Algorithm + Signature signature.Algorithm +} + +// Algorithms are all the know SignatureHash Algorithms +func Algorithms() []Algorithm { + return []Algorithm{ + {hash.SHA256, signature.ECDSA}, + {hash.SHA384, signature.ECDSA}, + {hash.SHA512, signature.ECDSA}, + {hash.SHA256, signature.RSA}, + {hash.SHA384, signature.RSA}, + {hash.SHA512, signature.RSA}, + {hash.Ed25519, signature.Ed25519}, + } +} + +// SelectSignatureScheme returns most preferred and compatible scheme. +func SelectSignatureScheme(sigs []Algorithm, privateKey crypto.PrivateKey) (Algorithm, error) { + for _, ss := range sigs { + if ss.isCompatible(privateKey) { + return ss, nil + } + } + return Algorithm{}, errNoAvailableSignatureSchemes +} + +// isCompatible checks that given private key is compatible with the signature scheme. +func (a *Algorithm) isCompatible(privateKey crypto.PrivateKey) bool { + switch privateKey.(type) { + case ed25519.PrivateKey: + return a.Signature == signature.Ed25519 + case *ecdsa.PrivateKey: + return a.Signature == signature.ECDSA + case *rsa.PrivateKey: + return a.Signature == signature.RSA + default: + return false + } +} + +// ParseSignatureSchemes translates []tls.SignatureScheme to []signatureHashAlgorithm. +// It returns default signature scheme list if no SignatureScheme is passed. +func ParseSignatureSchemes(sigs []tls.SignatureScheme, insecureHashes bool) ([]Algorithm, error) { + if len(sigs) == 0 { + return Algorithms(), nil + } + out := []Algorithm{} + for _, ss := range sigs { + sig := signature.Algorithm(ss & 0xFF) + if _, ok := signature.Algorithms()[sig]; !ok { + return nil, + fmt.Errorf("SignatureScheme %04x: %w", ss, errInvalidSignatureAlgorithm) + } + h := hash.Algorithm(ss >> 8) + if _, ok := hash.Algorithms()[h]; !ok || (ok && h == hash.None) { + return nil, fmt.Errorf("SignatureScheme %04x: %w", ss, errInvalidHashAlgorithm) + } + if h.Insecure() && !insecureHashes { + continue + } + out = append(out, Algorithm{ + Hash: h, + Signature: sig, + }) + } + + if len(out) == 0 { + return nil, errNoAvailableSignatureSchemes + } + + return out, nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/alert/alert.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/alert/alert.go new file mode 100644 index 000000000..91e9f4d60 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/alert/alert.go @@ -0,0 +1,166 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package alert implements TLS alert protocol https://tools.ietf.org/html/rfc5246#section-7.2 +package alert + +import ( + "errors" + "fmt" + + "github.com/pion/dtls/v2/pkg/protocol" +) + +var errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + +// Level is the level of the TLS Alert +type Level byte + +// Level enums +const ( + Warning Level = 1 + Fatal Level = 2 +) + +func (l Level) String() string { + switch l { + case Warning: + return "Warning" + case Fatal: + return "Fatal" + default: + return "Invalid alert level" + } +} + +// Description is the extended info of the TLS Alert +type Description byte + +// Description enums +const ( + CloseNotify Description = 0 + UnexpectedMessage Description = 10 + BadRecordMac Description = 20 + DecryptionFailed Description = 21 + RecordOverflow Description = 22 + DecompressionFailure Description = 30 + HandshakeFailure Description = 40 + NoCertificate Description = 41 + BadCertificate Description = 42 + UnsupportedCertificate Description = 43 + CertificateRevoked Description = 44 + CertificateExpired Description = 45 + CertificateUnknown Description = 46 + IllegalParameter Description = 47 + UnknownCA Description = 48 + AccessDenied Description = 49 + DecodeError Description = 50 + DecryptError Description = 51 + ExportRestriction Description = 60 + ProtocolVersion Description = 70 + InsufficientSecurity Description = 71 + InternalError Description = 80 + UserCanceled Description = 90 + NoRenegotiation Description = 100 + UnsupportedExtension Description = 110 + NoApplicationProtocol Description = 120 +) + +func (d Description) String() string { + switch d { + case CloseNotify: + return "CloseNotify" + case UnexpectedMessage: + return "UnexpectedMessage" + case BadRecordMac: + return "BadRecordMac" + case DecryptionFailed: + return "DecryptionFailed" + case RecordOverflow: + return "RecordOverflow" + case DecompressionFailure: + return "DecompressionFailure" + case HandshakeFailure: + return "HandshakeFailure" + case NoCertificate: + return "NoCertificate" + case BadCertificate: + return "BadCertificate" + case UnsupportedCertificate: + return "UnsupportedCertificate" + case CertificateRevoked: + return "CertificateRevoked" + case CertificateExpired: + return "CertificateExpired" + case CertificateUnknown: + return "CertificateUnknown" + case IllegalParameter: + return "IllegalParameter" + case UnknownCA: + return "UnknownCA" + case AccessDenied: + return "AccessDenied" + case DecodeError: + return "DecodeError" + case DecryptError: + return "DecryptError" + case ExportRestriction: + return "ExportRestriction" + case ProtocolVersion: + return "ProtocolVersion" + case InsufficientSecurity: + return "InsufficientSecurity" + case InternalError: + return "InternalError" + case UserCanceled: + return "UserCanceled" + case NoRenegotiation: + return "NoRenegotiation" + case UnsupportedExtension: + return "UnsupportedExtension" + case NoApplicationProtocol: + return "NoApplicationProtocol" + default: + return "Invalid alert description" + } +} + +// Alert is one of the content types supported by the TLS record layer. +// Alert messages convey the severity of the message +// (warning or fatal) and a description of the alert. Alert messages +// with a level of fatal result in the immediate termination of the +// connection. In this case, other connections corresponding to the +// session may continue, but the session identifier MUST be invalidated, +// preventing the failed session from being used to establish new +// connections. Like other messages, alert messages are encrypted and +// compressed, as specified by the current connection state. +// https://tools.ietf.org/html/rfc5246#section-7.2 +type Alert struct { + Level Level + Description Description +} + +// ContentType returns the ContentType of this Content +func (a Alert) ContentType() protocol.ContentType { + return protocol.ContentTypeAlert +} + +// Marshal returns the encoded alert +func (a *Alert) Marshal() ([]byte, error) { + return []byte{byte(a.Level), byte(a.Description)}, nil +} + +// Unmarshal populates the alert from binary data +func (a *Alert) Unmarshal(data []byte) error { + if len(data) != 2 { + return errBufferTooSmall + } + + a.Level = Level(data[0]) + a.Description = Description(data[1]) + return nil +} + +func (a *Alert) String() string { + return fmt.Sprintf("Alert %s: %s", a.Level, a.Description) +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/application_data.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/application_data.go new file mode 100644 index 000000000..f42211511 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/application_data.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package protocol + +// ApplicationData messages are carried by the record layer and are +// fragmented, compressed, and encrypted based on the current connection +// state. The messages are treated as transparent data to the record +// layer. +// https://tools.ietf.org/html/rfc5246#section-10 +type ApplicationData struct { + Data []byte +} + +// ContentType returns the ContentType of this content +func (a ApplicationData) ContentType() ContentType { + return ContentTypeApplicationData +} + +// Marshal encodes the ApplicationData to binary +func (a *ApplicationData) Marshal() ([]byte, error) { + return append([]byte{}, a.Data...), nil +} + +// Unmarshal populates the ApplicationData from binary +func (a *ApplicationData) Unmarshal(data []byte) error { + a.Data = append([]byte{}, data...) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/change_cipher_spec.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/change_cipher_spec.go new file mode 100644 index 000000000..87f28bc37 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/change_cipher_spec.go @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package protocol + +// ChangeCipherSpec protocol exists to signal transitions in +// ciphering strategies. The protocol consists of a single message, +// which is encrypted and compressed under the current (not the pending) +// connection state. The message consists of a single byte of value 1. +// https://tools.ietf.org/html/rfc5246#section-7.1 +type ChangeCipherSpec struct{} + +// ContentType returns the ContentType of this content +func (c ChangeCipherSpec) ContentType() ContentType { + return ContentTypeChangeCipherSpec +} + +// Marshal encodes the ChangeCipherSpec to binary +func (c *ChangeCipherSpec) Marshal() ([]byte, error) { + return []byte{0x01}, nil +} + +// Unmarshal populates the ChangeCipherSpec from binary +func (c *ChangeCipherSpec) Unmarshal(data []byte) error { + if len(data) == 1 && data[0] == 0x01 { + return nil + } + + return errInvalidCipherSpec +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/compression_method.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/compression_method.go new file mode 100644 index 000000000..3478ee38c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/compression_method.go @@ -0,0 +1,51 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package protocol + +// CompressionMethodID is the ID for a CompressionMethod +type CompressionMethodID byte + +const ( + compressionMethodNull CompressionMethodID = 0 +) + +// CompressionMethod represents a TLS Compression Method +type CompressionMethod struct { + ID CompressionMethodID +} + +// CompressionMethods returns all supported CompressionMethods +func CompressionMethods() map[CompressionMethodID]*CompressionMethod { + return map[CompressionMethodID]*CompressionMethod{ + compressionMethodNull: {ID: compressionMethodNull}, + } +} + +// DecodeCompressionMethods the given compression methods +func DecodeCompressionMethods(buf []byte) ([]*CompressionMethod, error) { + if len(buf) < 1 { + return nil, errBufferTooSmall + } + compressionMethodsCount := int(buf[0]) + c := []*CompressionMethod{} + for i := 0; i < compressionMethodsCount; i++ { + if len(buf) <= i+1 { + return nil, errBufferTooSmall + } + id := CompressionMethodID(buf[i+1]) + if compressionMethod, ok := CompressionMethods()[id]; ok { + c = append(c, compressionMethod) + } + } + return c, nil +} + +// EncodeCompressionMethods the given compression methods +func EncodeCompressionMethods(c []*CompressionMethod) []byte { + out := []byte{byte(len(c))} + for i := len(c); i > 0; i-- { + out = append(out, byte(c[i-1].ID)) + } + return out +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/content.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/content.go new file mode 100644 index 000000000..92c9db2bf --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/content.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package protocol + +// ContentType represents the IANA Registered ContentTypes +// +// https://tools.ietf.org/html/rfc4346#section-6.2.1 +type ContentType uint8 + +// ContentType enums +const ( + ContentTypeChangeCipherSpec ContentType = 20 + ContentTypeAlert ContentType = 21 + ContentTypeHandshake ContentType = 22 + ContentTypeApplicationData ContentType = 23 +) + +// Content is the top level distinguisher for a DTLS Datagram +type Content interface { + ContentType() ContentType + Marshal() ([]byte, error) + Unmarshal(data []byte) error +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/errors.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/errors.go new file mode 100644 index 000000000..d87aff7fb --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/errors.go @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package protocol + +import ( + "errors" + "fmt" + "net" +) + +var ( + errBufferTooSmall = &TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errInvalidCipherSpec = &FatalError{Err: errors.New("cipher spec invalid")} //nolint:goerr113 +) + +// FatalError indicates that the DTLS connection is no longer available. +// It is mainly caused by wrong configuration of server or client. +type FatalError struct { + Err error +} + +// InternalError indicates and internal error caused by the implementation, and the DTLS connection is no longer available. +// It is mainly caused by bugs or tried to use unimplemented features. +type InternalError struct { + Err error +} + +// TemporaryError indicates that the DTLS connection is still available, but the request was failed temporary. +type TemporaryError struct { + Err error +} + +// TimeoutError indicates that the request was timed out. +type TimeoutError struct { + Err error +} + +// HandshakeError indicates that the handshake failed. +type HandshakeError struct { + Err error +} + +// Timeout implements net.Error.Timeout() +func (*FatalError) Timeout() bool { return false } + +// Temporary implements net.Error.Temporary() +func (*FatalError) Temporary() bool { return false } + +// Unwrap implements Go1.13 error unwrapper. +func (e *FatalError) Unwrap() error { return e.Err } + +func (e *FatalError) Error() string { return fmt.Sprintf("dtls fatal: %v", e.Err) } + +// Timeout implements net.Error.Timeout() +func (*InternalError) Timeout() bool { return false } + +// Temporary implements net.Error.Temporary() +func (*InternalError) Temporary() bool { return false } + +// Unwrap implements Go1.13 error unwrapper. +func (e *InternalError) Unwrap() error { return e.Err } + +func (e *InternalError) Error() string { return fmt.Sprintf("dtls internal: %v", e.Err) } + +// Timeout implements net.Error.Timeout() +func (*TemporaryError) Timeout() bool { return false } + +// Temporary implements net.Error.Temporary() +func (*TemporaryError) Temporary() bool { return true } + +// Unwrap implements Go1.13 error unwrapper. +func (e *TemporaryError) Unwrap() error { return e.Err } + +func (e *TemporaryError) Error() string { return fmt.Sprintf("dtls temporary: %v", e.Err) } + +// Timeout implements net.Error.Timeout() +func (*TimeoutError) Timeout() bool { return true } + +// Temporary implements net.Error.Temporary() +func (*TimeoutError) Temporary() bool { return true } + +// Unwrap implements Go1.13 error unwrapper. +func (e *TimeoutError) Unwrap() error { return e.Err } + +func (e *TimeoutError) Error() string { return fmt.Sprintf("dtls timeout: %v", e.Err) } + +// Timeout implements net.Error.Timeout() +func (e *HandshakeError) Timeout() bool { + var netErr net.Error + if errors.As(e.Err, &netErr) { + return netErr.Timeout() + } + return false +} + +// Temporary implements net.Error.Temporary() +func (e *HandshakeError) Temporary() bool { + var netErr net.Error + if errors.As(e.Err, &netErr) { + return netErr.Temporary() //nolint + } + return false +} + +// Unwrap implements Go1.13 error unwrapper. +func (e *HandshakeError) Unwrap() error { return e.Err } + +func (e *HandshakeError) Error() string { return fmt.Sprintf("handshake error: %v", e.Err) } diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/alpn.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/alpn.go new file mode 100644 index 000000000..e780dc9e1 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/alpn.go @@ -0,0 +1,80 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "golang.org/x/crypto/cryptobyte" +) + +// ALPN is a TLS extension for application-layer protocol negotiation within +// the TLS handshake. +// +// https://tools.ietf.org/html/rfc7301 +type ALPN struct { + ProtocolNameList []string +} + +// TypeValue returns the extension TypeValue +func (a ALPN) TypeValue() TypeValue { + return ALPNTypeValue +} + +// Marshal encodes the extension +func (a *ALPN) Marshal() ([]byte, error) { + var b cryptobyte.Builder + b.AddUint16(uint16(a.TypeValue())) + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + for _, proto := range a.ProtocolNameList { + p := proto // Satisfy range scope lint + b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddBytes([]byte(p)) + }) + } + }) + }) + return b.Bytes() +} + +// Unmarshal populates the extension from encoded data +func (a *ALPN) Unmarshal(data []byte) error { + val := cryptobyte.String(data) + + var extension uint16 + val.ReadUint16(&extension) + if TypeValue(extension) != a.TypeValue() { + return errInvalidExtensionType + } + + var extData cryptobyte.String + val.ReadUint16LengthPrefixed(&extData) + + var protoList cryptobyte.String + if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() { + return ErrALPNInvalidFormat + } + for !protoList.Empty() { + var proto cryptobyte.String + if !protoList.ReadUint8LengthPrefixed(&proto) || proto.Empty() { + return ErrALPNInvalidFormat + } + a.ProtocolNameList = append(a.ProtocolNameList, string(proto)) + } + return nil +} + +// ALPNProtocolSelection negotiates a shared protocol according to #3.2 of rfc7301 +func ALPNProtocolSelection(supportedProtocols, peerSupportedProtocols []string) (string, error) { + if len(supportedProtocols) == 0 || len(peerSupportedProtocols) == 0 { + return "", nil + } + for _, s := range supportedProtocols { + for _, c := range peerSupportedProtocols { + if s == c { + return s, nil + } + } + } + return "", errALPNNoAppProto +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/errors.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/errors.go new file mode 100644 index 000000000..c5e954ce5 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/errors.go @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "errors" + + "github.com/pion/dtls/v2/pkg/protocol" +) + +var ( + // ErrALPNInvalidFormat is raised when the ALPN format is invalid + ErrALPNInvalidFormat = &protocol.FatalError{Err: errors.New("invalid alpn format")} //nolint:goerr113 + errALPNNoAppProto = &protocol.FatalError{Err: errors.New("no application protocol")} //nolint:goerr113 + errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errInvalidExtensionType = &protocol.FatalError{Err: errors.New("invalid extension type")} //nolint:goerr113 + errInvalidSNIFormat = &protocol.FatalError{Err: errors.New("invalid server name format")} //nolint:goerr113 + errLengthMismatch = &protocol.InternalError{Err: errors.New("data length and declared length do not match")} //nolint:goerr113 +) diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/extension.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/extension.go new file mode 100644 index 000000000..5173a5863 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/extension.go @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package extension implements the extension values in the ClientHello/ServerHello +package extension + +import "encoding/binary" + +// TypeValue is the 2 byte value for a TLS Extension as registered in the IANA +// +// https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml +type TypeValue uint16 + +// TypeValue constants +const ( + ServerNameTypeValue TypeValue = 0 + SupportedEllipticCurvesTypeValue TypeValue = 10 + SupportedPointFormatsTypeValue TypeValue = 11 + SupportedSignatureAlgorithmsTypeValue TypeValue = 13 + UseSRTPTypeValue TypeValue = 14 + ALPNTypeValue TypeValue = 16 + UseExtendedMasterSecretTypeValue TypeValue = 23 + RenegotiationInfoTypeValue TypeValue = 65281 +) + +// Extension represents a single TLS extension +type Extension interface { + Marshal() ([]byte, error) + Unmarshal(data []byte) error + TypeValue() TypeValue +} + +// Unmarshal many extensions at once +func Unmarshal(buf []byte) ([]Extension, error) { + switch { + case len(buf) == 0: + return []Extension{}, nil + case len(buf) < 2: + return nil, errBufferTooSmall + } + + declaredLen := binary.BigEndian.Uint16(buf) + if len(buf)-2 != int(declaredLen) { + return nil, errLengthMismatch + } + + extensions := []Extension{} + unmarshalAndAppend := func(data []byte, e Extension) error { + err := e.Unmarshal(data) + if err != nil { + return err + } + extensions = append(extensions, e) + return nil + } + + for offset := 2; offset < len(buf); { + if len(buf) < (offset + 2) { + return nil, errBufferTooSmall + } + var err error + switch TypeValue(binary.BigEndian.Uint16(buf[offset:])) { + case ServerNameTypeValue: + err = unmarshalAndAppend(buf[offset:], &ServerName{}) + case SupportedEllipticCurvesTypeValue: + err = unmarshalAndAppend(buf[offset:], &SupportedEllipticCurves{}) + case UseSRTPTypeValue: + err = unmarshalAndAppend(buf[offset:], &UseSRTP{}) + case ALPNTypeValue: + err = unmarshalAndAppend(buf[offset:], &ALPN{}) + case UseExtendedMasterSecretTypeValue: + err = unmarshalAndAppend(buf[offset:], &UseExtendedMasterSecret{}) + case RenegotiationInfoTypeValue: + err = unmarshalAndAppend(buf[offset:], &RenegotiationInfo{}) + default: + } + if err != nil { + return nil, err + } + if len(buf) < (offset + 4) { + return nil, errBufferTooSmall + } + extensionLength := binary.BigEndian.Uint16(buf[offset+2:]) + offset += (4 + int(extensionLength)) + } + return extensions, nil +} + +// Marshal many extensions at once +func Marshal(e []Extension) ([]byte, error) { + extensions := []byte{} + for _, e := range e { + raw, err := e.Marshal() + if err != nil { + return nil, err + } + extensions = append(extensions, raw...) + } + out := []byte{0x00, 0x00} + binary.BigEndian.PutUint16(out, uint16(len(extensions))) + return append(out, extensions...), nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/renegotiation_info.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/renegotiation_info.go new file mode 100644 index 000000000..c5092a7db --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/renegotiation_info.go @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import "encoding/binary" + +const ( + renegotiationInfoHeaderSize = 5 +) + +// RenegotiationInfo allows a Client/Server to +// communicate their renegotation support +// +// https://tools.ietf.org/html/rfc5746 +type RenegotiationInfo struct { + RenegotiatedConnection uint8 +} + +// TypeValue returns the extension TypeValue +func (r RenegotiationInfo) TypeValue() TypeValue { + return RenegotiationInfoTypeValue +} + +// Marshal encodes the extension +func (r *RenegotiationInfo) Marshal() ([]byte, error) { + out := make([]byte, renegotiationInfoHeaderSize) + + binary.BigEndian.PutUint16(out, uint16(r.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(1)) // length + out[4] = r.RenegotiatedConnection + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (r *RenegotiationInfo) Unmarshal(data []byte) error { + if len(data) < renegotiationInfoHeaderSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != r.TypeValue() { + return errInvalidExtensionType + } + + r.RenegotiatedConnection = data[4] + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/server_name.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/server_name.go new file mode 100644 index 000000000..183e08e6e --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/server_name.go @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "strings" + + "golang.org/x/crypto/cryptobyte" +) + +const serverNameTypeDNSHostName = 0 + +// ServerName allows the client to inform the server the specific +// name it wishes to contact. Useful if multiple DNS names resolve +// to one IP +// +// https://tools.ietf.org/html/rfc6066#section-3 +type ServerName struct { + ServerName string +} + +// TypeValue returns the extension TypeValue +func (s ServerName) TypeValue() TypeValue { + return ServerNameTypeValue +} + +// Marshal encodes the extension +func (s *ServerName) Marshal() ([]byte, error) { + var b cryptobyte.Builder + b.AddUint16(uint16(s.TypeValue())) + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddUint8(serverNameTypeDNSHostName) + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddBytes([]byte(s.ServerName)) + }) + }) + }) + return b.Bytes() +} + +// Unmarshal populates the extension from encoded data +func (s *ServerName) Unmarshal(data []byte) error { + val := cryptobyte.String(data) + var extension uint16 + val.ReadUint16(&extension) + if TypeValue(extension) != s.TypeValue() { + return errInvalidExtensionType + } + + var extData cryptobyte.String + val.ReadUint16LengthPrefixed(&extData) + + var nameList cryptobyte.String + if !extData.ReadUint16LengthPrefixed(&nameList) || nameList.Empty() { + return errInvalidSNIFormat + } + for !nameList.Empty() { + var nameType uint8 + var serverName cryptobyte.String + if !nameList.ReadUint8(&nameType) || + !nameList.ReadUint16LengthPrefixed(&serverName) || + serverName.Empty() { + return errInvalidSNIFormat + } + if nameType != serverNameTypeDNSHostName { + continue + } + if len(s.ServerName) != 0 { + // Multiple names of the same name_type are prohibited. + return errInvalidSNIFormat + } + s.ServerName = string(serverName) + // An SNI value may not include a trailing dot. + if strings.HasSuffix(s.ServerName, ".") { + return errInvalidSNIFormat + } + } + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/srtp_protection_profile.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/srtp_protection_profile.go new file mode 100644 index 000000000..2966966dd --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/srtp_protection_profile.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +// SRTPProtectionProfile defines the parameters and options that are in effect for the SRTP processing +// https://tools.ietf.org/html/rfc5764#section-4.1.2 +type SRTPProtectionProfile uint16 + +const ( + SRTP_AES128_CM_HMAC_SHA1_80 SRTPProtectionProfile = 0x0001 // nolint + SRTP_AES128_CM_HMAC_SHA1_32 SRTPProtectionProfile = 0x0002 // nolint + SRTP_AEAD_AES_128_GCM SRTPProtectionProfile = 0x0007 // nolint + SRTP_AEAD_AES_256_GCM SRTPProtectionProfile = 0x0008 // nolint +) + +func srtpProtectionProfiles() map[SRTPProtectionProfile]bool { + return map[SRTPProtectionProfile]bool{ + SRTP_AES128_CM_HMAC_SHA1_80: true, + SRTP_AES128_CM_HMAC_SHA1_32: true, + SRTP_AEAD_AES_128_GCM: true, + SRTP_AEAD_AES_256_GCM: true, + } +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_elliptic_curves.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_elliptic_curves.go new file mode 100644 index 000000000..dd9b54f0d --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_elliptic_curves.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" +) + +const ( + supportedGroupsHeaderSize = 6 +) + +// SupportedEllipticCurves allows a Client/Server to communicate +// what curves they both support +// +// https://tools.ietf.org/html/rfc8422#section-5.1.1 +type SupportedEllipticCurves struct { + EllipticCurves []elliptic.Curve +} + +// TypeValue returns the extension TypeValue +func (s SupportedEllipticCurves) TypeValue() TypeValue { + return SupportedEllipticCurvesTypeValue +} + +// Marshal encodes the extension +func (s *SupportedEllipticCurves) Marshal() ([]byte, error) { + out := make([]byte, supportedGroupsHeaderSize) + + binary.BigEndian.PutUint16(out, uint16(s.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(2+(len(s.EllipticCurves)*2))) + binary.BigEndian.PutUint16(out[4:], uint16(len(s.EllipticCurves)*2)) + + for _, v := range s.EllipticCurves { + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(v)) + } + + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (s *SupportedEllipticCurves) Unmarshal(data []byte) error { + if len(data) <= supportedGroupsHeaderSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != s.TypeValue() { + return errInvalidExtensionType + } + + groupCount := int(binary.BigEndian.Uint16(data[4:]) / 2) + if supportedGroupsHeaderSize+(groupCount*2) > len(data) { + return errLengthMismatch + } + + for i := 0; i < groupCount; i++ { + supportedGroupID := elliptic.Curve(binary.BigEndian.Uint16(data[(supportedGroupsHeaderSize + (i * 2)):])) + if _, ok := elliptic.Curves()[supportedGroupID]; ok { + s.EllipticCurves = append(s.EllipticCurves, supportedGroupID) + } + } + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_point_formats.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_point_formats.go new file mode 100644 index 000000000..9c2543e6e --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_point_formats.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" +) + +const ( + supportedPointFormatsSize = 5 +) + +// SupportedPointFormats allows a Client/Server to negotiate +// the EllipticCurvePointFormats +// +// https://tools.ietf.org/html/rfc4492#section-5.1.2 +type SupportedPointFormats struct { + PointFormats []elliptic.CurvePointFormat +} + +// TypeValue returns the extension TypeValue +func (s SupportedPointFormats) TypeValue() TypeValue { + return SupportedPointFormatsTypeValue +} + +// Marshal encodes the extension +func (s *SupportedPointFormats) Marshal() ([]byte, error) { + out := make([]byte, supportedPointFormatsSize) + + binary.BigEndian.PutUint16(out, uint16(s.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(1+(len(s.PointFormats)))) + out[4] = byte(len(s.PointFormats)) + + for _, v := range s.PointFormats { + out = append(out, byte(v)) + } + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (s *SupportedPointFormats) Unmarshal(data []byte) error { + if len(data) <= supportedPointFormatsSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != s.TypeValue() { + return errInvalidExtensionType + } + + pointFormatCount := int(binary.BigEndian.Uint16(data[4:])) + if supportedGroupsHeaderSize+(pointFormatCount) > len(data) { + return errLengthMismatch + } + + for i := 0; i < pointFormatCount; i++ { + p := elliptic.CurvePointFormat(data[supportedPointFormatsSize+i]) + switch p { + case elliptic.CurvePointFormatUncompressed: + s.PointFormats = append(s.PointFormats, p) + default: + } + } + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_signature_algorithms.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_signature_algorithms.go new file mode 100644 index 000000000..2ff4b90b6 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/supported_signature_algorithms.go @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/crypto/hash" + "github.com/pion/dtls/v2/pkg/crypto/signature" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" +) + +const ( + supportedSignatureAlgorithmsHeaderSize = 6 +) + +// SupportedSignatureAlgorithms allows a Client/Server to +// negotiate what SignatureHash Algorithms they both support +// +// https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 +type SupportedSignatureAlgorithms struct { + SignatureHashAlgorithms []signaturehash.Algorithm +} + +// TypeValue returns the extension TypeValue +func (s SupportedSignatureAlgorithms) TypeValue() TypeValue { + return SupportedSignatureAlgorithmsTypeValue +} + +// Marshal encodes the extension +func (s *SupportedSignatureAlgorithms) Marshal() ([]byte, error) { + out := make([]byte, supportedSignatureAlgorithmsHeaderSize) + + binary.BigEndian.PutUint16(out, uint16(s.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(2+(len(s.SignatureHashAlgorithms)*2))) + binary.BigEndian.PutUint16(out[4:], uint16(len(s.SignatureHashAlgorithms)*2)) + for _, v := range s.SignatureHashAlgorithms { + out = append(out, []byte{0x00, 0x00}...) + out[len(out)-2] = byte(v.Hash) + out[len(out)-1] = byte(v.Signature) + } + + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (s *SupportedSignatureAlgorithms) Unmarshal(data []byte) error { + if len(data) <= supportedSignatureAlgorithmsHeaderSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != s.TypeValue() { + return errInvalidExtensionType + } + + algorithmCount := int(binary.BigEndian.Uint16(data[4:]) / 2) + if supportedSignatureAlgorithmsHeaderSize+(algorithmCount*2) > len(data) { + return errLengthMismatch + } + for i := 0; i < algorithmCount; i++ { + supportedHashAlgorithm := hash.Algorithm(data[supportedSignatureAlgorithmsHeaderSize+(i*2)]) + supportedSignatureAlgorithm := signature.Algorithm(data[supportedSignatureAlgorithmsHeaderSize+(i*2)+1]) + if _, ok := hash.Algorithms()[supportedHashAlgorithm]; ok { + if _, ok := signature.Algorithms()[supportedSignatureAlgorithm]; ok { + s.SignatureHashAlgorithms = append(s.SignatureHashAlgorithms, signaturehash.Algorithm{ + Hash: supportedHashAlgorithm, + Signature: supportedSignatureAlgorithm, + }) + } + } + } + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_master_secret.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_master_secret.go new file mode 100644 index 000000000..d0b70cafb --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_master_secret.go @@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import "encoding/binary" + +const ( + useExtendedMasterSecretHeaderSize = 4 +) + +// UseExtendedMasterSecret defines a TLS extension that contextually binds the +// master secret to a log of the full handshake that computes it, thus +// preventing MITM attacks. +type UseExtendedMasterSecret struct { + Supported bool +} + +// TypeValue returns the extension TypeValue +func (u UseExtendedMasterSecret) TypeValue() TypeValue { + return UseExtendedMasterSecretTypeValue +} + +// Marshal encodes the extension +func (u *UseExtendedMasterSecret) Marshal() ([]byte, error) { + if !u.Supported { + return []byte{}, nil + } + + out := make([]byte, useExtendedMasterSecretHeaderSize) + + binary.BigEndian.PutUint16(out, uint16(u.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(0)) // length + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (u *UseExtendedMasterSecret) Unmarshal(data []byte) error { + if len(data) < useExtendedMasterSecretHeaderSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != u.TypeValue() { + return errInvalidExtensionType + } + + u.Supported = true + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_srtp.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_srtp.go new file mode 100644 index 000000000..ea9f10872 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/extension/use_srtp.go @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package extension + +import "encoding/binary" + +const ( + useSRTPHeaderSize = 6 +) + +// UseSRTP allows a Client/Server to negotiate what SRTPProtectionProfiles +// they both support +// +// https://tools.ietf.org/html/rfc8422 +type UseSRTP struct { + ProtectionProfiles []SRTPProtectionProfile +} + +// TypeValue returns the extension TypeValue +func (u UseSRTP) TypeValue() TypeValue { + return UseSRTPTypeValue +} + +// Marshal encodes the extension +func (u *UseSRTP) Marshal() ([]byte, error) { + out := make([]byte, useSRTPHeaderSize) + + binary.BigEndian.PutUint16(out, uint16(u.TypeValue())) + binary.BigEndian.PutUint16(out[2:], uint16(2+(len(u.ProtectionProfiles)*2)+ /* MKI Length */ 1)) + binary.BigEndian.PutUint16(out[4:], uint16(len(u.ProtectionProfiles)*2)) + + for _, v := range u.ProtectionProfiles { + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(v)) + } + + out = append(out, 0x00) /* MKI Length */ + return out, nil +} + +// Unmarshal populates the extension from encoded data +func (u *UseSRTP) Unmarshal(data []byte) error { + if len(data) <= useSRTPHeaderSize { + return errBufferTooSmall + } else if TypeValue(binary.BigEndian.Uint16(data)) != u.TypeValue() { + return errInvalidExtensionType + } + + profileCount := int(binary.BigEndian.Uint16(data[4:]) / 2) + if supportedGroupsHeaderSize+(profileCount*2) > len(data) { + return errLengthMismatch + } + + for i := 0; i < profileCount; i++ { + supportedProfile := SRTPProtectionProfile(binary.BigEndian.Uint16(data[(useSRTPHeaderSize + (i * 2)):])) + if _, ok := srtpProtectionProfiles()[supportedProfile]; ok { + u.ProtectionProfiles = append(u.ProtectionProfiles, supportedProfile) + } + } + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/cipher_suite.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/cipher_suite.go new file mode 100644 index 000000000..b29629717 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/cipher_suite.go @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import "encoding/binary" + +func decodeCipherSuiteIDs(buf []byte) ([]uint16, error) { + if len(buf) < 2 { + return nil, errBufferTooSmall + } + cipherSuitesCount := int(binary.BigEndian.Uint16(buf[0:])) / 2 + rtrn := make([]uint16, cipherSuitesCount) + for i := 0; i < cipherSuitesCount; i++ { + if len(buf) < (i*2 + 4) { + return nil, errBufferTooSmall + } + + rtrn[i] = binary.BigEndian.Uint16(buf[(i*2)+2:]) + } + return rtrn, nil +} + +func encodeCipherSuiteIDs(cipherSuiteIDs []uint16) []byte { + out := []byte{0x00, 0x00} + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(len(cipherSuiteIDs)*2)) + for _, id := range cipherSuiteIDs { + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], id) + } + return out +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/errors.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/errors.go new file mode 100644 index 000000000..1354300c4 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/errors.go @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "errors" + + "github.com/pion/dtls/v2/pkg/protocol" +) + +// Typed errors +var ( + errUnableToMarshalFragmented = &protocol.InternalError{Err: errors.New("unable to marshal fragmented handshakes")} //nolint:goerr113 + errHandshakeMessageUnset = &protocol.InternalError{Err: errors.New("handshake message unset, unable to marshal")} //nolint:goerr113 + errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errLengthMismatch = &protocol.InternalError{Err: errors.New("data length and declared length do not match")} //nolint:goerr113 + errInvalidClientKeyExchange = &protocol.FatalError{Err: errors.New("unable to determine if ClientKeyExchange is a public key or PSK Identity")} //nolint:goerr113 + errInvalidHashAlgorithm = &protocol.FatalError{Err: errors.New("invalid hash algorithm")} //nolint:goerr113 + errInvalidSignatureAlgorithm = &protocol.FatalError{Err: errors.New("invalid signature algorithm")} //nolint:goerr113 + errCookieTooLong = &protocol.FatalError{Err: errors.New("cookie must not be longer then 255 bytes")} //nolint:goerr113 + errInvalidEllipticCurveType = &protocol.FatalError{Err: errors.New("invalid or unknown elliptic curve type")} //nolint:goerr113 + errInvalidNamedCurve = &protocol.FatalError{Err: errors.New("invalid named curve")} //nolint:goerr113 + errCipherSuiteUnset = &protocol.FatalError{Err: errors.New("server hello can not be created without a cipher suite")} //nolint:goerr113 + errCompressionMethodUnset = &protocol.FatalError{Err: errors.New("server hello can not be created without a compression method")} //nolint:goerr113 + errInvalidCompressionMethod = &protocol.FatalError{Err: errors.New("invalid or unknown compression method")} //nolint:goerr113 + errNotImplemented = &protocol.InternalError{Err: errors.New("feature has not been implemented yet")} //nolint:goerr113 +) diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/handshake.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/handshake.go new file mode 100644 index 000000000..b1f682bf5 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/handshake.go @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package handshake provides the DTLS wire protocol for handshakes +package handshake + +import ( + "github.com/pion/dtls/v2/internal/ciphersuite/types" + "github.com/pion/dtls/v2/internal/util" + "github.com/pion/dtls/v2/pkg/protocol" +) + +// Type is the unique identifier for each handshake message +// https://tools.ietf.org/html/rfc5246#section-7.4 +type Type uint8 + +// Types of DTLS Handshake messages we know about +const ( + TypeHelloRequest Type = 0 + TypeClientHello Type = 1 + TypeServerHello Type = 2 + TypeHelloVerifyRequest Type = 3 + TypeCertificate Type = 11 + TypeServerKeyExchange Type = 12 + TypeCertificateRequest Type = 13 + TypeServerHelloDone Type = 14 + TypeCertificateVerify Type = 15 + TypeClientKeyExchange Type = 16 + TypeFinished Type = 20 +) + +// String returns the string representation of this type +func (t Type) String() string { + switch t { + case TypeHelloRequest: + return "HelloRequest" + case TypeClientHello: + return "ClientHello" + case TypeServerHello: + return "ServerHello" + case TypeHelloVerifyRequest: + return "HelloVerifyRequest" + case TypeCertificate: + return "TypeCertificate" + case TypeServerKeyExchange: + return "ServerKeyExchange" + case TypeCertificateRequest: + return "CertificateRequest" + case TypeServerHelloDone: + return "ServerHelloDone" + case TypeCertificateVerify: + return "CertificateVerify" + case TypeClientKeyExchange: + return "ClientKeyExchange" + case TypeFinished: + return "Finished" + } + return "" +} + +// Message is the body of a Handshake datagram +type Message interface { + Marshal() ([]byte, error) + Unmarshal(data []byte) error + Type() Type +} + +// Handshake protocol is responsible for selecting a cipher spec and +// generating a master secret, which together comprise the primary +// cryptographic parameters associated with a secure session. The +// handshake protocol can also optionally authenticate parties who have +// certificates signed by a trusted certificate authority. +// https://tools.ietf.org/html/rfc5246#section-7.3 +type Handshake struct { + Header Header + Message Message + + KeyExchangeAlgorithm types.KeyExchangeAlgorithm +} + +// ContentType returns what kind of content this message is carying +func (h Handshake) ContentType() protocol.ContentType { + return protocol.ContentTypeHandshake +} + +// Marshal encodes a handshake into a binary message +func (h *Handshake) Marshal() ([]byte, error) { + if h.Message == nil { + return nil, errHandshakeMessageUnset + } else if h.Header.FragmentOffset != 0 { + return nil, errUnableToMarshalFragmented + } + + msg, err := h.Message.Marshal() + if err != nil { + return nil, err + } + + h.Header.Length = uint32(len(msg)) + h.Header.FragmentLength = h.Header.Length + h.Header.Type = h.Message.Type() + header, err := h.Header.Marshal() + if err != nil { + return nil, err + } + + return append(header, msg...), nil +} + +// Unmarshal decodes a handshake from a binary message +func (h *Handshake) Unmarshal(data []byte) error { + if err := h.Header.Unmarshal(data); err != nil { + return err + } + + reportedLen := util.BigEndianUint24(data[1:]) + if uint32(len(data)-HeaderLength) != reportedLen { + return errLengthMismatch + } else if reportedLen != h.Header.FragmentLength { + return errLengthMismatch + } + + switch Type(data[0]) { + case TypeHelloRequest: + return errNotImplemented + case TypeClientHello: + h.Message = &MessageClientHello{} + case TypeHelloVerifyRequest: + h.Message = &MessageHelloVerifyRequest{} + case TypeServerHello: + h.Message = &MessageServerHello{} + case TypeCertificate: + h.Message = &MessageCertificate{} + case TypeServerKeyExchange: + h.Message = &MessageServerKeyExchange{KeyExchangeAlgorithm: h.KeyExchangeAlgorithm} + case TypeCertificateRequest: + h.Message = &MessageCertificateRequest{} + case TypeServerHelloDone: + h.Message = &MessageServerHelloDone{} + case TypeClientKeyExchange: + h.Message = &MessageClientKeyExchange{KeyExchangeAlgorithm: h.KeyExchangeAlgorithm} + case TypeFinished: + h.Message = &MessageFinished{} + case TypeCertificateVerify: + h.Message = &MessageCertificateVerify{} + default: + return errNotImplemented + } + return h.Message.Unmarshal(data[HeaderLength:]) +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/header.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/header.go new file mode 100644 index 000000000..4f9a96287 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/header.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/internal/util" +) + +// HeaderLength msg_len for Handshake messages assumes an extra +// 12 bytes for sequence, fragment and version information vs TLS +const HeaderLength = 12 + +// Header is the static first 12 bytes of each RecordLayer +// of type Handshake. These fields allow us to support message loss, reordering, and +// message fragmentation, +// +// https://tools.ietf.org/html/rfc6347#section-4.2.2 +type Header struct { + Type Type + Length uint32 // uint24 in spec + MessageSequence uint16 + FragmentOffset uint32 // uint24 in spec + FragmentLength uint32 // uint24 in spec +} + +// Marshal encodes the Header +func (h *Header) Marshal() ([]byte, error) { + out := make([]byte, HeaderLength) + + out[0] = byte(h.Type) + util.PutBigEndianUint24(out[1:], h.Length) + binary.BigEndian.PutUint16(out[4:], h.MessageSequence) + util.PutBigEndianUint24(out[6:], h.FragmentOffset) + util.PutBigEndianUint24(out[9:], h.FragmentLength) + return out, nil +} + +// Unmarshal populates the header from encoded data +func (h *Header) Unmarshal(data []byte) error { + if len(data) < HeaderLength { + return errBufferTooSmall + } + + h.Type = Type(data[0]) + h.Length = util.BigEndianUint24(data[1:]) + h.MessageSequence = binary.BigEndian.Uint16(data[4:]) + h.FragmentOffset = util.BigEndianUint24(data[6:]) + h.FragmentLength = util.BigEndianUint24(data[9:]) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate.go new file mode 100644 index 000000000..d5c861d90 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate.go @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "github.com/pion/dtls/v2/internal/util" +) + +// MessageCertificate is a DTLS Handshake Message +// it can contain either a Client or Server Certificate +// +// https://tools.ietf.org/html/rfc5246#section-7.4.2 +type MessageCertificate struct { + Certificate [][]byte +} + +// Type returns the Handshake Type +func (m MessageCertificate) Type() Type { + return TypeCertificate +} + +const ( + handshakeMessageCertificateLengthFieldSize = 3 +) + +// Marshal encodes the Handshake +func (m *MessageCertificate) Marshal() ([]byte, error) { + out := make([]byte, handshakeMessageCertificateLengthFieldSize) + + for _, r := range m.Certificate { + // Certificate Length + out = append(out, make([]byte, handshakeMessageCertificateLengthFieldSize)...) + util.PutBigEndianUint24(out[len(out)-handshakeMessageCertificateLengthFieldSize:], uint32(len(r))) + + // Certificate body + out = append(out, append([]byte{}, r...)...) + } + + // Total Payload Size + util.PutBigEndianUint24(out[0:], uint32(len(out[handshakeMessageCertificateLengthFieldSize:]))) + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageCertificate) Unmarshal(data []byte) error { + if len(data) < handshakeMessageCertificateLengthFieldSize { + return errBufferTooSmall + } + + if certificateBodyLen := int(util.BigEndianUint24(data)); certificateBodyLen+handshakeMessageCertificateLengthFieldSize != len(data) { + return errLengthMismatch + } + + offset := handshakeMessageCertificateLengthFieldSize + for offset < len(data) { + certificateLen := int(util.BigEndianUint24(data[offset:])) + offset += handshakeMessageCertificateLengthFieldSize + + if offset+certificateLen > len(data) { + return errLengthMismatch + } + + m.Certificate = append(m.Certificate, append([]byte{}, data[offset:offset+certificateLen]...)) + offset += certificateLen + } + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_request.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_request.go new file mode 100644 index 000000000..11a44d440 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_request.go @@ -0,0 +1,144 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/crypto/clientcertificate" + "github.com/pion/dtls/v2/pkg/crypto/hash" + "github.com/pion/dtls/v2/pkg/crypto/signature" + "github.com/pion/dtls/v2/pkg/crypto/signaturehash" +) + +/* +MessageCertificateRequest is so a non-anonymous server can optionally +request a certificate from the client, if appropriate for the selected cipher +suite. This message, if sent, will immediately follow the ServerKeyExchange +message (if it is sent; otherwise, this message follows the +server's Certificate message). + +https://tools.ietf.org/html/rfc5246#section-7.4.4 +*/ +type MessageCertificateRequest struct { + CertificateTypes []clientcertificate.Type + SignatureHashAlgorithms []signaturehash.Algorithm + CertificateAuthoritiesNames [][]byte +} + +const ( + messageCertificateRequestMinLength = 5 +) + +// Type returns the Handshake Type +func (m MessageCertificateRequest) Type() Type { + return TypeCertificateRequest +} + +// Marshal encodes the Handshake +func (m *MessageCertificateRequest) Marshal() ([]byte, error) { + out := []byte{byte(len(m.CertificateTypes))} + for _, v := range m.CertificateTypes { + out = append(out, byte(v)) + } + + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(len(m.SignatureHashAlgorithms)*2)) + for _, v := range m.SignatureHashAlgorithms { + out = append(out, byte(v.Hash)) + out = append(out, byte(v.Signature)) + } + + // Distinguished Names + casLength := 0 + for _, ca := range m.CertificateAuthoritiesNames { + casLength += len(ca) + 2 + } + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(casLength)) + if casLength > 0 { + for _, ca := range m.CertificateAuthoritiesNames { + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(len(ca))) + out = append(out, ca...) + } + } + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageCertificateRequest) Unmarshal(data []byte) error { + if len(data) < messageCertificateRequestMinLength { + return errBufferTooSmall + } + + offset := 0 + certificateTypesLength := int(data[0]) + offset++ + + if (offset + certificateTypesLength) > len(data) { + return errBufferTooSmall + } + + for i := 0; i < certificateTypesLength; i++ { + certType := clientcertificate.Type(data[offset+i]) + if _, ok := clientcertificate.Types()[certType]; ok { + m.CertificateTypes = append(m.CertificateTypes, certType) + } + } + offset += certificateTypesLength + if len(data) < offset+2 { + return errBufferTooSmall + } + signatureHashAlgorithmsLength := int(binary.BigEndian.Uint16(data[offset:])) + offset += 2 + + if (offset + signatureHashAlgorithmsLength) > len(data) { + return errBufferTooSmall + } + + for i := 0; i < signatureHashAlgorithmsLength; i += 2 { + if len(data) < (offset + i + 2) { + return errBufferTooSmall + } + h := hash.Algorithm(data[offset+i]) + s := signature.Algorithm(data[offset+i+1]) + + if _, ok := hash.Algorithms()[h]; !ok { + continue + } else if _, ok := signature.Algorithms()[s]; !ok { + continue + } + m.SignatureHashAlgorithms = append(m.SignatureHashAlgorithms, signaturehash.Algorithm{Signature: s, Hash: h}) + } + + offset += signatureHashAlgorithmsLength + if len(data) < offset+2 { + return errBufferTooSmall + } + casLength := int(binary.BigEndian.Uint16(data[offset:])) + offset += 2 + if (offset + casLength) > len(data) { + return errBufferTooSmall + } + cas := make([]byte, casLength) + copy(cas, data[offset:offset+casLength]) + m.CertificateAuthoritiesNames = nil + for len(cas) > 0 { + if len(cas) < 2 { + return errBufferTooSmall + } + caLen := binary.BigEndian.Uint16(cas) + cas = cas[2:] + + if len(cas) < int(caLen) { + return errBufferTooSmall + } + + m.CertificateAuthoritiesNames = append(m.CertificateAuthoritiesNames, cas[:caLen]) + cas = cas[caLen:] + } + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_verify.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_verify.go new file mode 100644 index 000000000..9e02a9c11 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_certificate_verify.go @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/crypto/hash" + "github.com/pion/dtls/v2/pkg/crypto/signature" +) + +// MessageCertificateVerify provide explicit verification of a +// client certificate. +// +// https://tools.ietf.org/html/rfc5246#section-7.4.8 +type MessageCertificateVerify struct { + HashAlgorithm hash.Algorithm + SignatureAlgorithm signature.Algorithm + Signature []byte +} + +const handshakeMessageCertificateVerifyMinLength = 4 + +// Type returns the Handshake Type +func (m MessageCertificateVerify) Type() Type { + return TypeCertificateVerify +} + +// Marshal encodes the Handshake +func (m *MessageCertificateVerify) Marshal() ([]byte, error) { + out := make([]byte, 1+1+2+len(m.Signature)) + + out[0] = byte(m.HashAlgorithm) + out[1] = byte(m.SignatureAlgorithm) + binary.BigEndian.PutUint16(out[2:], uint16(len(m.Signature))) + copy(out[4:], m.Signature) + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageCertificateVerify) Unmarshal(data []byte) error { + if len(data) < handshakeMessageCertificateVerifyMinLength { + return errBufferTooSmall + } + + m.HashAlgorithm = hash.Algorithm(data[0]) + if _, ok := hash.Algorithms()[m.HashAlgorithm]; !ok { + return errInvalidHashAlgorithm + } + + m.SignatureAlgorithm = signature.Algorithm(data[1]) + if _, ok := signature.Algorithms()[m.SignatureAlgorithm]; !ok { + return errInvalidSignatureAlgorithm + } + + signatureLength := int(binary.BigEndian.Uint16(data[2:])) + if (signatureLength + 4) != len(data) { + return errBufferTooSmall + } + + m.Signature = append([]byte{}, data[4:]...) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_hello.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_hello.go new file mode 100644 index 000000000..bea6dd969 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_hello.go @@ -0,0 +1,141 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/extension" +) + +/* +MessageClientHello is for when a client first connects to a server it is +required to send the client hello as its first message. The client can also send a +client hello in response to a hello request or on its own +initiative in order to renegotiate the security parameters in an +existing connection. +*/ +type MessageClientHello struct { + Version protocol.Version + Random Random + Cookie []byte + + SessionID []byte + + CipherSuiteIDs []uint16 + CompressionMethods []*protocol.CompressionMethod + Extensions []extension.Extension +} + +const handshakeMessageClientHelloVariableWidthStart = 34 + +// Type returns the Handshake Type +func (m MessageClientHello) Type() Type { + return TypeClientHello +} + +// Marshal encodes the Handshake +func (m *MessageClientHello) Marshal() ([]byte, error) { + if len(m.Cookie) > 255 { + return nil, errCookieTooLong + } + + out := make([]byte, handshakeMessageClientHelloVariableWidthStart) + out[0] = m.Version.Major + out[1] = m.Version.Minor + + rand := m.Random.MarshalFixed() + copy(out[2:], rand[:]) + + out = append(out, byte(len(m.SessionID))) + out = append(out, m.SessionID...) + + out = append(out, byte(len(m.Cookie))) + out = append(out, m.Cookie...) + out = append(out, encodeCipherSuiteIDs(m.CipherSuiteIDs)...) + out = append(out, protocol.EncodeCompressionMethods(m.CompressionMethods)...) + + extensions, err := extension.Marshal(m.Extensions) + if err != nil { + return nil, err + } + + return append(out, extensions...), nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageClientHello) Unmarshal(data []byte) error { + if len(data) < 2+RandomLength { + return errBufferTooSmall + } + + m.Version.Major = data[0] + m.Version.Minor = data[1] + + var random [RandomLength]byte + copy(random[:], data[2:]) + m.Random.UnmarshalFixed(random) + + // rest of packet has variable width sections + currOffset := handshakeMessageClientHelloVariableWidthStart + + currOffset++ + if len(data) <= currOffset { + return errBufferTooSmall + } + n := int(data[currOffset-1]) + if len(data) <= currOffset+n { + return errBufferTooSmall + } + m.SessionID = append([]byte{}, data[currOffset:currOffset+n]...) + currOffset += len(m.SessionID) + + currOffset++ + if len(data) <= currOffset { + return errBufferTooSmall + } + n = int(data[currOffset-1]) + if len(data) <= currOffset+n { + return errBufferTooSmall + } + m.Cookie = append([]byte{}, data[currOffset:currOffset+n]...) + currOffset += len(m.Cookie) + + // Cipher Suites + if len(data) < currOffset { + return errBufferTooSmall + } + cipherSuiteIDs, err := decodeCipherSuiteIDs(data[currOffset:]) + if err != nil { + return err + } + m.CipherSuiteIDs = cipherSuiteIDs + if len(data) < currOffset+2 { + return errBufferTooSmall + } + currOffset += int(binary.BigEndian.Uint16(data[currOffset:])) + 2 + + // Compression Methods + if len(data) < currOffset { + return errBufferTooSmall + } + compressionMethods, err := protocol.DecodeCompressionMethods(data[currOffset:]) + if err != nil { + return err + } + m.CompressionMethods = compressionMethods + if len(data) < currOffset { + return errBufferTooSmall + } + currOffset += int(data[currOffset]) + 1 + + // Extensions + extensions, err := extension.Unmarshal(data[currOffset:]) + if err != nil { + return err + } + m.Extensions = extensions + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_key_exchange.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_key_exchange.go new file mode 100644 index 000000000..2abcd5bf7 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_client_key_exchange.go @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/internal/ciphersuite/types" +) + +// MessageClientKeyExchange is a DTLS Handshake Message +// With this message, the premaster secret is set, either by direct +// transmission of the RSA-encrypted secret or by the transmission of +// Diffie-Hellman parameters that will allow each side to agree upon +// the same premaster secret. +// +// https://tools.ietf.org/html/rfc5246#section-7.4.7 +type MessageClientKeyExchange struct { + IdentityHint []byte + PublicKey []byte + + // for unmarshaling + KeyExchangeAlgorithm types.KeyExchangeAlgorithm +} + +// Type returns the Handshake Type +func (m MessageClientKeyExchange) Type() Type { + return TypeClientKeyExchange +} + +// Marshal encodes the Handshake +func (m *MessageClientKeyExchange) Marshal() (out []byte, err error) { + if m.IdentityHint == nil && m.PublicKey == nil { + return nil, errInvalidClientKeyExchange + } + + if m.IdentityHint != nil { + out = append([]byte{0x00, 0x00}, m.IdentityHint...) + binary.BigEndian.PutUint16(out, uint16(len(out)-2)) + } + + if m.PublicKey != nil { + out = append(out, byte(len(m.PublicKey))) + out = append(out, m.PublicKey...) + } + + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageClientKeyExchange) Unmarshal(data []byte) error { + switch { + case len(data) < 2: + return errBufferTooSmall + case m.KeyExchangeAlgorithm == types.KeyExchangeAlgorithmNone: + return errCipherSuiteUnset + } + + offset := 0 + if m.KeyExchangeAlgorithm.Has(types.KeyExchangeAlgorithmPsk) { + pskLength := int(binary.BigEndian.Uint16(data)) + if pskLength > len(data)-2 { + return errBufferTooSmall + } + + m.IdentityHint = append([]byte{}, data[2:pskLength+2]...) + offset += pskLength + 2 + } + + if m.KeyExchangeAlgorithm.Has(types.KeyExchangeAlgorithmEcdhe) { + publicKeyLength := int(data[offset]) + if publicKeyLength > len(data)-1-offset { + return errBufferTooSmall + } + + m.PublicKey = append([]byte{}, data[offset+1:]...) + } + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_finished.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_finished.go new file mode 100644 index 000000000..255aedd7e --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_finished.go @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +// MessageFinished is a DTLS Handshake Message +// this message is the first one protected with the just +// negotiated algorithms, keys, and secrets. Recipients of Finished +// messages MUST verify that the contents are correct. +// +// https://tools.ietf.org/html/rfc5246#section-7.4.9 +type MessageFinished struct { + VerifyData []byte +} + +// Type returns the Handshake Type +func (m MessageFinished) Type() Type { + return TypeFinished +} + +// Marshal encodes the Handshake +func (m *MessageFinished) Marshal() ([]byte, error) { + return append([]byte{}, m.VerifyData...), nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageFinished) Unmarshal(data []byte) error { + m.VerifyData = append([]byte{}, data...) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_hello_verify_request.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_hello_verify_request.go new file mode 100644 index 000000000..398e59cc3 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_hello_verify_request.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "github.com/pion/dtls/v2/pkg/protocol" +) + +// MessageHelloVerifyRequest is as follows: +// +// struct { +// ProtocolVersion server_version; +// opaque cookie<0..2^8-1>; +// } HelloVerifyRequest; +// +// The HelloVerifyRequest message type is hello_verify_request(3). +// +// When the client sends its ClientHello message to the server, the server +// MAY respond with a HelloVerifyRequest message. This message contains +// a stateless cookie generated using the technique of [PHOTURIS]. The +// client MUST retransmit the ClientHello with the cookie added. +// +// https://tools.ietf.org/html/rfc6347#section-4.2.1 +type MessageHelloVerifyRequest struct { + Version protocol.Version + Cookie []byte +} + +// Type returns the Handshake Type +func (m MessageHelloVerifyRequest) Type() Type { + return TypeHelloVerifyRequest +} + +// Marshal encodes the Handshake +func (m *MessageHelloVerifyRequest) Marshal() ([]byte, error) { + if len(m.Cookie) > 255 { + return nil, errCookieTooLong + } + + out := make([]byte, 3+len(m.Cookie)) + out[0] = m.Version.Major + out[1] = m.Version.Minor + out[2] = byte(len(m.Cookie)) + copy(out[3:], m.Cookie) + + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageHelloVerifyRequest) Unmarshal(data []byte) error { + if len(data) < 3 { + return errBufferTooSmall + } + m.Version.Major = data[0] + m.Version.Minor = data[1] + cookieLength := int(data[2]) + if len(data) < cookieLength+3 { + return errBufferTooSmall + } + m.Cookie = make([]byte, cookieLength) + + copy(m.Cookie, data[3:3+cookieLength]) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello.go new file mode 100644 index 000000000..caf186da8 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello.go @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/extension" +) + +// MessageServerHello is sent in response to a ClientHello +// message when it was able to find an acceptable set of algorithms. +// If it cannot find such a match, it will respond with a handshake +// failure alert. +// +// https://tools.ietf.org/html/rfc5246#section-7.4.1.3 +type MessageServerHello struct { + Version protocol.Version + Random Random + + SessionID []byte + + CipherSuiteID *uint16 + CompressionMethod *protocol.CompressionMethod + Extensions []extension.Extension +} + +const messageServerHelloVariableWidthStart = 2 + RandomLength + +// Type returns the Handshake Type +func (m MessageServerHello) Type() Type { + return TypeServerHello +} + +// Marshal encodes the Handshake +func (m *MessageServerHello) Marshal() ([]byte, error) { + if m.CipherSuiteID == nil { + return nil, errCipherSuiteUnset + } else if m.CompressionMethod == nil { + return nil, errCompressionMethodUnset + } + + out := make([]byte, messageServerHelloVariableWidthStart) + out[0] = m.Version.Major + out[1] = m.Version.Minor + + rand := m.Random.MarshalFixed() + copy(out[2:], rand[:]) + + out = append(out, byte(len(m.SessionID))) + out = append(out, m.SessionID...) + + out = append(out, []byte{0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], *m.CipherSuiteID) + + out = append(out, byte(m.CompressionMethod.ID)) + + extensions, err := extension.Marshal(m.Extensions) + if err != nil { + return nil, err + } + + return append(out, extensions...), nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageServerHello) Unmarshal(data []byte) error { + if len(data) < 2+RandomLength { + return errBufferTooSmall + } + + m.Version.Major = data[0] + m.Version.Minor = data[1] + + var random [RandomLength]byte + copy(random[:], data[2:]) + m.Random.UnmarshalFixed(random) + + currOffset := messageServerHelloVariableWidthStart + currOffset++ + if len(data) <= currOffset { + return errBufferTooSmall + } + + n := int(data[currOffset-1]) + if len(data) <= currOffset+n { + return errBufferTooSmall + } + m.SessionID = append([]byte{}, data[currOffset:currOffset+n]...) + currOffset += len(m.SessionID) + + if len(data) < currOffset+2 { + return errBufferTooSmall + } + m.CipherSuiteID = new(uint16) + *m.CipherSuiteID = binary.BigEndian.Uint16(data[currOffset:]) + currOffset += 2 + + if len(data) <= currOffset { + return errBufferTooSmall + } + if compressionMethod, ok := protocol.CompressionMethods()[protocol.CompressionMethodID(data[currOffset])]; ok { + m.CompressionMethod = compressionMethod + currOffset++ + } else { + return errInvalidCompressionMethod + } + + if len(data) <= currOffset { + m.Extensions = []extension.Extension{} + return nil + } + + extensions, err := extension.Unmarshal(data[currOffset:]) + if err != nil { + return err + } + m.Extensions = extensions + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello_done.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello_done.go new file mode 100644 index 000000000..b187dd417 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_hello_done.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +// MessageServerHelloDone is final non-encrypted message from server +// this communicates server has sent all its handshake messages and next +// should be MessageFinished +type MessageServerHelloDone struct{} + +// Type returns the Handshake Type +func (m MessageServerHelloDone) Type() Type { + return TypeServerHelloDone +} + +// Marshal encodes the Handshake +func (m *MessageServerHelloDone) Marshal() ([]byte, error) { + return []byte{}, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageServerHelloDone) Unmarshal([]byte) error { + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_key_exchange.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_key_exchange.go new file mode 100644 index 000000000..82abbe0d4 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/message_server_key_exchange.go @@ -0,0 +1,148 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/internal/ciphersuite/types" + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/hash" + "github.com/pion/dtls/v2/pkg/crypto/signature" +) + +// MessageServerKeyExchange supports ECDH and PSK +type MessageServerKeyExchange struct { + IdentityHint []byte + + EllipticCurveType elliptic.CurveType + NamedCurve elliptic.Curve + PublicKey []byte + HashAlgorithm hash.Algorithm + SignatureAlgorithm signature.Algorithm + Signature []byte + + // for unmarshaling + KeyExchangeAlgorithm types.KeyExchangeAlgorithm +} + +// Type returns the Handshake Type +func (m MessageServerKeyExchange) Type() Type { + return TypeServerKeyExchange +} + +// Marshal encodes the Handshake +func (m *MessageServerKeyExchange) Marshal() ([]byte, error) { + var out []byte + if m.IdentityHint != nil { + out = append([]byte{0x00, 0x00}, m.IdentityHint...) + binary.BigEndian.PutUint16(out, uint16(len(out)-2)) + } + + if m.EllipticCurveType == 0 || len(m.PublicKey) == 0 { + return out, nil + } + out = append(out, byte(m.EllipticCurveType), 0x00, 0x00) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(m.NamedCurve)) + + out = append(out, byte(len(m.PublicKey))) + out = append(out, m.PublicKey...) + switch { + case m.HashAlgorithm != hash.None && len(m.Signature) == 0: + return nil, errInvalidHashAlgorithm + case m.HashAlgorithm == hash.None && len(m.Signature) > 0: + return nil, errInvalidHashAlgorithm + case m.SignatureAlgorithm == signature.Anonymous && (m.HashAlgorithm != hash.None || len(m.Signature) > 0): + return nil, errInvalidSignatureAlgorithm + case m.SignatureAlgorithm == signature.Anonymous: + return out, nil + } + + out = append(out, []byte{byte(m.HashAlgorithm), byte(m.SignatureAlgorithm), 0x00, 0x00}...) + binary.BigEndian.PutUint16(out[len(out)-2:], uint16(len(m.Signature))) + out = append(out, m.Signature...) + + return out, nil +} + +// Unmarshal populates the message from encoded data +func (m *MessageServerKeyExchange) Unmarshal(data []byte) error { + switch { + case len(data) < 2: + return errBufferTooSmall + case m.KeyExchangeAlgorithm == types.KeyExchangeAlgorithmNone: + return errCipherSuiteUnset + } + + hintLength := binary.BigEndian.Uint16(data) + if int(hintLength) <= len(data)-2 && m.KeyExchangeAlgorithm.Has(types.KeyExchangeAlgorithmPsk) { + m.IdentityHint = append([]byte{}, data[2:2+hintLength]...) + data = data[2+hintLength:] + } + if m.KeyExchangeAlgorithm == types.KeyExchangeAlgorithmPsk { + if len(data) == 0 { + return nil + } + return errLengthMismatch + } + + if !m.KeyExchangeAlgorithm.Has(types.KeyExchangeAlgorithmEcdhe) { + return errLengthMismatch + } + + if _, ok := elliptic.CurveTypes()[elliptic.CurveType(data[0])]; ok { + m.EllipticCurveType = elliptic.CurveType(data[0]) + } else { + return errInvalidEllipticCurveType + } + + if len(data[1:]) < 2 { + return errBufferTooSmall + } + m.NamedCurve = elliptic.Curve(binary.BigEndian.Uint16(data[1:3])) + if _, ok := elliptic.Curves()[m.NamedCurve]; !ok { + return errInvalidNamedCurve + } + if len(data) < 4 { + return errBufferTooSmall + } + + publicKeyLength := int(data[3]) + offset := 4 + publicKeyLength + if len(data) < offset { + return errBufferTooSmall + } + m.PublicKey = append([]byte{}, data[4:offset]...) + + // Anon connection doesn't contains hashAlgorithm, signatureAlgorithm, signature + if len(data) == offset { + return nil + } else if len(data) <= offset { + return errBufferTooSmall + } + + m.HashAlgorithm = hash.Algorithm(data[offset]) + if _, ok := hash.Algorithms()[m.HashAlgorithm]; !ok { + return errInvalidHashAlgorithm + } + offset++ + if len(data) <= offset { + return errBufferTooSmall + } + m.SignatureAlgorithm = signature.Algorithm(data[offset]) + if _, ok := signature.Algorithms()[m.SignatureAlgorithm]; !ok { + return errInvalidSignatureAlgorithm + } + offset++ + if len(data) < offset+2 { + return errBufferTooSmall + } + signatureLength := int(binary.BigEndian.Uint16(data[offset:])) + offset += 2 + if len(data) < offset+signatureLength { + return errBufferTooSmall + } + m.Signature = append([]byte{}, data[offset:offset+signatureLength]...) + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/random.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/random.go new file mode 100644 index 000000000..56f37569b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/handshake/random.go @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package handshake + +import ( + "crypto/rand" + "encoding/binary" + "time" +) + +// Consts for Random in Handshake +const ( + RandomBytesLength = 28 + RandomLength = RandomBytesLength + 4 +) + +// Random value that is used in ClientHello and ServerHello +// +// https://tools.ietf.org/html/rfc4346#section-7.4.1.2 +type Random struct { + GMTUnixTime time.Time + RandomBytes [RandomBytesLength]byte +} + +// MarshalFixed encodes the Handshake +func (r *Random) MarshalFixed() [RandomLength]byte { + var out [RandomLength]byte + + binary.BigEndian.PutUint32(out[0:], uint32(r.GMTUnixTime.Unix())) + copy(out[4:], r.RandomBytes[:]) + + return out +} + +// UnmarshalFixed populates the message from encoded data +func (r *Random) UnmarshalFixed(data [RandomLength]byte) { + r.GMTUnixTime = time.Unix(int64(binary.BigEndian.Uint32(data[0:])), 0) + copy(r.RandomBytes[:], data[4:]) +} + +// Populate fills the handshakeRandom with random values +// may be called multiple times +func (r *Random) Populate() error { + r.GMTUnixTime = time.Now() + + tmp := make([]byte, RandomBytesLength) + _, err := rand.Read(tmp) + copy(r.RandomBytes[:], tmp) + + return err +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go new file mode 100644 index 000000000..cd4cb60a5 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/errors.go @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package recordlayer implements the TLS Record Layer https://tools.ietf.org/html/rfc5246#section-6 +package recordlayer + +import ( + "errors" + + "github.com/pion/dtls/v2/pkg/protocol" +) + +var ( + errBufferTooSmall = &protocol.TemporaryError{Err: errors.New("buffer is too small")} //nolint:goerr113 + errInvalidPacketLength = &protocol.TemporaryError{Err: errors.New("packet length and declared length do not match")} //nolint:goerr113 + errSequenceNumberOverflow = &protocol.InternalError{Err: errors.New("sequence number overflow")} //nolint:goerr113 + errUnsupportedProtocolVersion = &protocol.FatalError{Err: errors.New("unsupported protocol version")} //nolint:goerr113 + errInvalidContentType = &protocol.TemporaryError{Err: errors.New("invalid content type")} //nolint:goerr113 +) diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/header.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/header.go new file mode 100644 index 000000000..92252502b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/header.go @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package recordlayer + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/internal/util" + "github.com/pion/dtls/v2/pkg/protocol" +) + +// Header implements a TLS RecordLayer header +type Header struct { + ContentType protocol.ContentType + ContentLen uint16 + Version protocol.Version + Epoch uint16 + SequenceNumber uint64 // uint48 in spec +} + +// RecordLayer enums +const ( + HeaderSize = 13 + MaxSequenceNumber = 0x0000FFFFFFFFFFFF +) + +// Marshal encodes a TLS RecordLayer Header to binary +func (h *Header) Marshal() ([]byte, error) { + if h.SequenceNumber > MaxSequenceNumber { + return nil, errSequenceNumberOverflow + } + + out := make([]byte, HeaderSize) + out[0] = byte(h.ContentType) + out[1] = h.Version.Major + out[2] = h.Version.Minor + binary.BigEndian.PutUint16(out[3:], h.Epoch) + util.PutBigEndianUint48(out[5:], h.SequenceNumber) + binary.BigEndian.PutUint16(out[HeaderSize-2:], h.ContentLen) + return out, nil +} + +// Unmarshal populates a TLS RecordLayer Header from binary +func (h *Header) Unmarshal(data []byte) error { + if len(data) < HeaderSize { + return errBufferTooSmall + } + h.ContentType = protocol.ContentType(data[0]) + h.Version.Major = data[1] + h.Version.Minor = data[2] + h.Epoch = binary.BigEndian.Uint16(data[3:]) + + // SequenceNumber is stored as uint48, make into uint64 + seqCopy := make([]byte, 8) + copy(seqCopy[2:], data[5:11]) + h.SequenceNumber = binary.BigEndian.Uint64(seqCopy) + + if !h.Version.Equal(protocol.Version1_0) && !h.Version.Equal(protocol.Version1_2) { + return errUnsupportedProtocolVersion + } + + return nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go new file mode 100644 index 000000000..02325fd2d --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/recordlayer/recordlayer.go @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package recordlayer + +import ( + "encoding/binary" + + "github.com/pion/dtls/v2/pkg/protocol" + "github.com/pion/dtls/v2/pkg/protocol/alert" + "github.com/pion/dtls/v2/pkg/protocol/handshake" +) + +// RecordLayer which handles all data transport. +// The record layer is assumed to sit directly on top of some +// reliable transport such as TCP. The record layer can carry four types of content: +// +// 1. Handshake messages—used for algorithm negotiation and key establishment. +// 2. ChangeCipherSpec messages—really part of the handshake but technically a separate kind of message. +// 3. Alert messages—used to signal that errors have occurred +// 4. Application layer data +// +// The DTLS record layer is extremely similar to that of TLS 1.1. The +// only change is the inclusion of an explicit sequence number in the +// record. This sequence number allows the recipient to correctly +// verify the TLS MAC. +// +// https://tools.ietf.org/html/rfc4347#section-4.1 +type RecordLayer struct { + Header Header + Content protocol.Content +} + +// Marshal encodes the RecordLayer to binary +func (r *RecordLayer) Marshal() ([]byte, error) { + contentRaw, err := r.Content.Marshal() + if err != nil { + return nil, err + } + + r.Header.ContentLen = uint16(len(contentRaw)) + r.Header.ContentType = r.Content.ContentType() + + headerRaw, err := r.Header.Marshal() + if err != nil { + return nil, err + } + + return append(headerRaw, contentRaw...), nil +} + +// Unmarshal populates the RecordLayer from binary +func (r *RecordLayer) Unmarshal(data []byte) error { + if len(data) < HeaderSize { + return errBufferTooSmall + } + if err := r.Header.Unmarshal(data); err != nil { + return err + } + + switch protocol.ContentType(data[0]) { + case protocol.ContentTypeChangeCipherSpec: + r.Content = &protocol.ChangeCipherSpec{} + case protocol.ContentTypeAlert: + r.Content = &alert.Alert{} + case protocol.ContentTypeHandshake: + r.Content = &handshake.Handshake{} + case protocol.ContentTypeApplicationData: + r.Content = &protocol.ApplicationData{} + default: + return errInvalidContentType + } + + return r.Content.Unmarshal(data[HeaderSize:]) +} + +// UnpackDatagram extracts all RecordLayer messages from a single datagram. +// Note that as with TLS, multiple handshake messages may be placed in +// the same DTLS record, provided that there is room and that they are +// part of the same flight. Thus, there are two acceptable ways to pack +// two DTLS messages into the same datagram: in the same record or in +// separate records. +// https://tools.ietf.org/html/rfc6347#section-4.2.3 +func UnpackDatagram(buf []byte) ([][]byte, error) { + out := [][]byte{} + + for offset := 0; len(buf) != offset; { + if len(buf)-offset <= HeaderSize { + return nil, errInvalidPacketLength + } + + pktLen := (HeaderSize + int(binary.BigEndian.Uint16(buf[offset+11:]))) + if offset+pktLen > len(buf) { + return nil, errInvalidPacketLength + } + + out = append(out, buf[offset:offset+pktLen]) + offset += pktLen + } + + return out, nil +} diff --git a/vendor/github.com/pion/dtls/v2/pkg/protocol/version.go b/vendor/github.com/pion/dtls/v2/pkg/protocol/version.go new file mode 100644 index 000000000..c4d94ac3a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/pkg/protocol/version.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package protocol provides the DTLS wire format +package protocol + +// Version enums +var ( + Version1_0 = Version{Major: 0xfe, Minor: 0xff} //nolint:gochecknoglobals + Version1_2 = Version{Major: 0xfe, Minor: 0xfd} //nolint:gochecknoglobals +) + +// Version is the minor/major value in the RecordLayer +// and ClientHello/ServerHello +// +// https://tools.ietf.org/html/rfc4346#section-6.2.1 +type Version struct { + Major, Minor uint8 +} + +// Equal determines if two protocol versions are equal +func (v Version) Equal(x Version) bool { + return v.Major == x.Major && v.Minor == x.Minor +} diff --git a/vendor/github.com/pion/dtls/v2/renovate.json b/vendor/github.com/pion/dtls/v2/renovate.json new file mode 100644 index 000000000..f1bb98c6a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>pion/renovate-config" + ] +} diff --git a/vendor/github.com/pion/dtls/v2/resume.go b/vendor/github.com/pion/dtls/v2/resume.go new file mode 100644 index 000000000..c470d856b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/resume.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "net" +) + +// Resume imports an already established dtls connection using a specific dtls state +func Resume(state *State, conn net.Conn, config *Config) (*Conn, error) { + if err := state.initCipherSuite(); err != nil { + return nil, err + } + c, err := createConn(context.Background(), conn, config, state.isClient, state) + if err != nil { + return nil, err + } + + return c, nil +} diff --git a/vendor/github.com/pion/dtls/v2/session.go b/vendor/github.com/pion/dtls/v2/session.go new file mode 100644 index 000000000..99bf5a499 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/session.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +// Session store data needed in resumption +type Session struct { + // ID store session id + ID []byte + // Secret store session master secret + Secret []byte +} + +// SessionStore defines methods needed for session resumption. +type SessionStore interface { + // Set save a session. + // For client, use server name as key. + // For server, use session id. + Set(key []byte, s Session) error + // Get fetch a session. + Get(key []byte) (Session, error) + // Del clean saved session. + Del(key []byte) error +} diff --git a/vendor/github.com/pion/dtls/v2/srtp_protection_profile.go b/vendor/github.com/pion/dtls/v2/srtp_protection_profile.go new file mode 100644 index 000000000..e306e9e6a --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/srtp_protection_profile.go @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import "github.com/pion/dtls/v2/pkg/protocol/extension" + +// SRTPProtectionProfile defines the parameters and options that are in effect for the SRTP processing +// https://tools.ietf.org/html/rfc5764#section-4.1.2 +type SRTPProtectionProfile = extension.SRTPProtectionProfile + +const ( + SRTP_AES128_CM_HMAC_SHA1_80 SRTPProtectionProfile = extension.SRTP_AES128_CM_HMAC_SHA1_80 // nolint:revive,stylecheck + SRTP_AES128_CM_HMAC_SHA1_32 SRTPProtectionProfile = extension.SRTP_AES128_CM_HMAC_SHA1_32 // nolint:revive,stylecheck + SRTP_AEAD_AES_128_GCM SRTPProtectionProfile = extension.SRTP_AEAD_AES_128_GCM // nolint:revive,stylecheck + SRTP_AEAD_AES_256_GCM SRTPProtectionProfile = extension.SRTP_AEAD_AES_256_GCM // nolint:revive,stylecheck +) diff --git a/vendor/github.com/pion/dtls/v2/state.go b/vendor/github.com/pion/dtls/v2/state.go new file mode 100644 index 000000000..e9f86a80b --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/state.go @@ -0,0 +1,216 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "bytes" + "encoding/gob" + "sync/atomic" + + "github.com/pion/dtls/v2/pkg/crypto/elliptic" + "github.com/pion/dtls/v2/pkg/crypto/prf" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/transport/v2/replaydetector" +) + +// State holds the dtls connection state and implements both encoding.BinaryMarshaler and encoding.BinaryUnmarshaler +type State struct { + localEpoch, remoteEpoch atomic.Value + localSequenceNumber []uint64 // uint48 + localRandom, remoteRandom handshake.Random + masterSecret []byte + cipherSuite CipherSuite // nil if a cipherSuite hasn't been chosen + + srtpProtectionProfile SRTPProtectionProfile // Negotiated SRTPProtectionProfile + PeerCertificates [][]byte + IdentityHint []byte + SessionID []byte + + isClient bool + + preMasterSecret []byte + extendedMasterSecret bool + + namedCurve elliptic.Curve + localKeypair *elliptic.Keypair + cookie []byte + handshakeSendSequence int + handshakeRecvSequence int + serverName string + remoteRequestedCertificate bool // Did we get a CertificateRequest + localCertificatesVerify []byte // cache CertificateVerify + localVerifyData []byte // cached VerifyData + localKeySignature []byte // cached keySignature + peerCertificatesVerified bool + + replayDetector []replaydetector.ReplayDetector + + peerSupportedProtocols []string + NegotiatedProtocol string +} + +type serializedState struct { + LocalEpoch uint16 + RemoteEpoch uint16 + LocalRandom [handshake.RandomLength]byte + RemoteRandom [handshake.RandomLength]byte + CipherSuiteID uint16 + MasterSecret []byte + SequenceNumber uint64 + SRTPProtectionProfile uint16 + PeerCertificates [][]byte + IdentityHint []byte + SessionID []byte + IsClient bool +} + +func (s *State) clone() *State { + serialized := s.serialize() + state := &State{} + state.deserialize(*serialized) + + return state +} + +func (s *State) serialize() *serializedState { + // Marshal random values + localRnd := s.localRandom.MarshalFixed() + remoteRnd := s.remoteRandom.MarshalFixed() + + epoch := s.getLocalEpoch() + return &serializedState{ + LocalEpoch: s.getLocalEpoch(), + RemoteEpoch: s.getRemoteEpoch(), + CipherSuiteID: uint16(s.cipherSuite.ID()), + MasterSecret: s.masterSecret, + SequenceNumber: atomic.LoadUint64(&s.localSequenceNumber[epoch]), + LocalRandom: localRnd, + RemoteRandom: remoteRnd, + SRTPProtectionProfile: uint16(s.srtpProtectionProfile), + PeerCertificates: s.PeerCertificates, + IdentityHint: s.IdentityHint, + SessionID: s.SessionID, + IsClient: s.isClient, + } +} + +func (s *State) deserialize(serialized serializedState) { + // Set epoch values + epoch := serialized.LocalEpoch + s.localEpoch.Store(serialized.LocalEpoch) + s.remoteEpoch.Store(serialized.RemoteEpoch) + + for len(s.localSequenceNumber) <= int(epoch) { + s.localSequenceNumber = append(s.localSequenceNumber, uint64(0)) + } + + // Set random values + localRandom := &handshake.Random{} + localRandom.UnmarshalFixed(serialized.LocalRandom) + s.localRandom = *localRandom + + remoteRandom := &handshake.Random{} + remoteRandom.UnmarshalFixed(serialized.RemoteRandom) + s.remoteRandom = *remoteRandom + + s.isClient = serialized.IsClient + + // Set master secret + s.masterSecret = serialized.MasterSecret + + // Set cipher suite + s.cipherSuite = cipherSuiteForID(CipherSuiteID(serialized.CipherSuiteID), nil) + + atomic.StoreUint64(&s.localSequenceNumber[epoch], serialized.SequenceNumber) + s.srtpProtectionProfile = SRTPProtectionProfile(serialized.SRTPProtectionProfile) + + // Set remote certificate + s.PeerCertificates = serialized.PeerCertificates + s.IdentityHint = serialized.IdentityHint + s.SessionID = serialized.SessionID +} + +func (s *State) initCipherSuite() error { + if s.cipherSuite.IsInitialized() { + return nil + } + + localRandom := s.localRandom.MarshalFixed() + remoteRandom := s.remoteRandom.MarshalFixed() + + var err error + if s.isClient { + err = s.cipherSuite.Init(s.masterSecret, localRandom[:], remoteRandom[:], true) + } else { + err = s.cipherSuite.Init(s.masterSecret, remoteRandom[:], localRandom[:], false) + } + if err != nil { + return err + } + return nil +} + +// MarshalBinary is a binary.BinaryMarshaler.MarshalBinary implementation +func (s *State) MarshalBinary() ([]byte, error) { + serialized := s.serialize() + + var buf bytes.Buffer + enc := gob.NewEncoder(&buf) + if err := enc.Encode(*serialized); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// UnmarshalBinary is a binary.BinaryUnmarshaler.UnmarshalBinary implementation +func (s *State) UnmarshalBinary(data []byte) error { + enc := gob.NewDecoder(bytes.NewBuffer(data)) + var serialized serializedState + if err := enc.Decode(&serialized); err != nil { + return err + } + + s.deserialize(serialized) + + return s.initCipherSuite() +} + +// ExportKeyingMaterial returns length bytes of exported key material in a new +// slice as defined in RFC 5705. +// This allows protocols to use DTLS for key establishment, but +// then use some of the keying material for their own purposes +func (s *State) ExportKeyingMaterial(label string, context []byte, length int) ([]byte, error) { + if s.getLocalEpoch() == 0 { + return nil, errHandshakeInProgress + } else if len(context) != 0 { + return nil, errContextUnsupported + } else if _, ok := invalidKeyingLabels()[label]; ok { + return nil, errReservedExportKeyingMaterial + } + + localRandom := s.localRandom.MarshalFixed() + remoteRandom := s.remoteRandom.MarshalFixed() + + seed := []byte(label) + if s.isClient { + seed = append(append(seed, localRandom[:]...), remoteRandom[:]...) + } else { + seed = append(append(seed, remoteRandom[:]...), localRandom[:]...) + } + return prf.PHash(s.masterSecret, seed, length, s.cipherSuite.HashFunc()) +} + +func (s *State) getRemoteEpoch() uint16 { + if remoteEpoch, ok := s.remoteEpoch.Load().(uint16); ok { + return remoteEpoch + } + return 0 +} + +func (s *State) getLocalEpoch() uint16 { + if localEpoch, ok := s.localEpoch.Load().(uint16); ok { + return localEpoch + } + return 0 +} diff --git a/vendor/github.com/pion/dtls/v2/state_getters.go b/vendor/github.com/pion/dtls/v2/state_getters.go new file mode 100644 index 000000000..0d8904b57 --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/state_getters.go @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import "github.com/pion/dtls/v2/pkg/protocol/handshake" + +// RemoteRandomBytes returns the random bytes from the client or server hello +func (s *State) RemoteRandomBytes() [handshake.RandomBytesLength]byte { + return s.remoteRandom.RandomBytes +} diff --git a/vendor/github.com/pion/dtls/v2/util.go b/vendor/github.com/pion/dtls/v2/util.go new file mode 100644 index 000000000..663c4437c --- /dev/null +++ b/vendor/github.com/pion/dtls/v2/util.go @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +func findMatchingSRTPProfile(a, b []SRTPProtectionProfile) (SRTPProtectionProfile, bool) { + for _, aProfile := range a { + for _, bProfile := range b { + if aProfile == bProfile { + return aProfile, true + } + } + } + return 0, false +} + +func findMatchingCipherSuite(a, b []CipherSuite) (CipherSuite, bool) { + for _, aSuite := range a { + for _, bSuite := range b { + if aSuite.ID() == bSuite.ID() { + return aSuite, true + } + } + } + return nil, false +} + +func splitBytes(bytes []byte, splitLen int) [][]byte { + splitBytes := make([][]byte, 0) + numBytes := len(bytes) + for i := 0; i < numBytes; i += splitLen { + j := i + splitLen + if j > numBytes { + j = numBytes + } + + splitBytes = append(splitBytes, bytes[i:j]) + } + + return splitBytes +} diff --git a/vendor/github.com/pion/logging/.golangci.yml b/vendor/github.com/pion/logging/.golangci.yml new file mode 100644 index 000000000..ffb0058e6 --- /dev/null +++ b/vendor/github.com/pion/logging/.golangci.yml @@ -0,0 +1,13 @@ +linters-settings: + govet: + check-shadowing: true + misspell: + locale: US + +linters: + enable-all: true + +issues: + exclude-use-default: false + max-per-linter: 0 + max-same-issues: 50 diff --git a/vendor/github.com/pion/logging/.travis.yml b/vendor/github.com/pion/logging/.travis.yml new file mode 100644 index 000000000..b96a1edb9 --- /dev/null +++ b/vendor/github.com/pion/logging/.travis.yml @@ -0,0 +1,19 @@ +language: go + +go: + - "1.x" # use the latest Go release + +env: + - GO111MODULE=on + +before_script: + - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v1.15.0 + +script: + - golangci-lint run ./... +# - rm -rf examples # Remove examples, no test coverage for them + - go test -coverpkg=$(go list ./... | tr '\n' ',') -coverprofile=cover.out -v -race -covermode=atomic ./... + - bash <(curl -s https://codecov.io/bash) + - bash .github/assert-contributors.sh + - bash .github/lint-disallowed-functions-in-library.sh + - bash .github/lint-commit-message.sh diff --git a/vendor/github.com/pion/logging/LICENSE b/vendor/github.com/pion/logging/LICENSE new file mode 100644 index 000000000..ab602974d --- /dev/null +++ b/vendor/github.com/pion/logging/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/pion/logging/README.md b/vendor/github.com/pion/logging/README.md new file mode 100644 index 000000000..c15471d61 --- /dev/null +++ b/vendor/github.com/pion/logging/README.md @@ -0,0 +1,41 @@ +

+
+ Pion Logging +
+

+

The Pion logging library

+

+ Pion transport + Slack Widget +
+ Build Status + GoDoc + Coverage Status + Go Report Card + License: MIT +

+
+ +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. + +### Community +Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). + +We are always looking to support **your projects**. Please reach out if you have something to build! + +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing +Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: + +* [John Bradley](https://github.com/kc5nra) - *Original Author* +* [Sean DuBois](https://github.com/Sean-Der) - *Original Author* +* [Michael MacDonald](https://github.com/mjmac) - *Original Author* +* [Woodrow Douglass](https://github.com/wdouglass) - *Test coverage* +* [Michiel De Backker](https://github.com/backkem) - *Docs* +* [Hugo Arregui](https://github.com/hugoArregui) - *Custom Logs* +* [Justin Okamoto](https://github.com/justinokamoto) - *Disabled Logs Update* + +### License +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/logging/logger.go b/vendor/github.com/pion/logging/logger.go new file mode 100644 index 000000000..35f650581 --- /dev/null +++ b/vendor/github.com/pion/logging/logger.go @@ -0,0 +1,228 @@ +package logging + +import ( + "fmt" + "io" + "log" + "os" + "strings" + "sync" +) + +// Use this abstraction to ensure thread-safe access to the logger's io.Writer +// (which could change at runtime) +type loggerWriter struct { + sync.RWMutex + output io.Writer +} + +func (lw *loggerWriter) SetOutput(output io.Writer) { + lw.Lock() + defer lw.Unlock() + lw.output = output +} + +func (lw *loggerWriter) Write(data []byte) (int, error) { + lw.RLock() + defer lw.RUnlock() + return lw.output.Write(data) +} + +// DefaultLeveledLogger encapsulates functionality for providing logging at +// user-defined levels +type DefaultLeveledLogger struct { + level LogLevel + writer *loggerWriter + trace *log.Logger + debug *log.Logger + info *log.Logger + warn *log.Logger + err *log.Logger +} + +// WithTraceLogger is a chainable configuration function which sets the +// Trace-level logger +func (ll *DefaultLeveledLogger) WithTraceLogger(log *log.Logger) *DefaultLeveledLogger { + ll.trace = log + return ll +} + +// WithDebugLogger is a chainable configuration function which sets the +// Debug-level logger +func (ll *DefaultLeveledLogger) WithDebugLogger(log *log.Logger) *DefaultLeveledLogger { + ll.debug = log + return ll +} + +// WithInfoLogger is a chainable configuration function which sets the +// Info-level logger +func (ll *DefaultLeveledLogger) WithInfoLogger(log *log.Logger) *DefaultLeveledLogger { + ll.info = log + return ll +} + +// WithWarnLogger is a chainable configuration function which sets the +// Warn-level logger +func (ll *DefaultLeveledLogger) WithWarnLogger(log *log.Logger) *DefaultLeveledLogger { + ll.warn = log + return ll +} + +// WithErrorLogger is a chainable configuration function which sets the +// Error-level logger +func (ll *DefaultLeveledLogger) WithErrorLogger(log *log.Logger) *DefaultLeveledLogger { + ll.err = log + return ll +} + +// WithOutput is a chainable configuration function which sets the logger's +// logging output to the supplied io.Writer +func (ll *DefaultLeveledLogger) WithOutput(output io.Writer) *DefaultLeveledLogger { + ll.writer.SetOutput(output) + return ll +} + +func (ll *DefaultLeveledLogger) logf(logger *log.Logger, level LogLevel, format string, args ...interface{}) { + if ll.level.Get() < level { + return + } + + callDepth := 3 // this frame + wrapper func + caller + msg := fmt.Sprintf(format, args...) + if err := logger.Output(callDepth, msg); err != nil { + fmt.Fprintf(os.Stderr, "Unable to log: %s", err) + } +} + +// SetLevel sets the logger's logging level +func (ll *DefaultLeveledLogger) SetLevel(newLevel LogLevel) { + ll.level.Set(newLevel) +} + +// Trace emits the preformatted message if the logger is at or below LogLevelTrace +func (ll *DefaultLeveledLogger) Trace(msg string) { + ll.logf(ll.trace, LogLevelTrace, msg) +} + +// Tracef formats and emits a message if the logger is at or below LogLevelTrace +func (ll *DefaultLeveledLogger) Tracef(format string, args ...interface{}) { + ll.logf(ll.trace, LogLevelTrace, format, args...) +} + +// Debug emits the preformatted message if the logger is at or below LogLevelDebug +func (ll *DefaultLeveledLogger) Debug(msg string) { + ll.logf(ll.debug, LogLevelDebug, msg) +} + +// Debugf formats and emits a message if the logger is at or below LogLevelDebug +func (ll *DefaultLeveledLogger) Debugf(format string, args ...interface{}) { + ll.logf(ll.debug, LogLevelDebug, format, args...) +} + +// Info emits the preformatted message if the logger is at or below LogLevelInfo +func (ll *DefaultLeveledLogger) Info(msg string) { + ll.logf(ll.info, LogLevelInfo, msg) +} + +// Infof formats and emits a message if the logger is at or below LogLevelInfo +func (ll *DefaultLeveledLogger) Infof(format string, args ...interface{}) { + ll.logf(ll.info, LogLevelInfo, format, args...) +} + +// Warn emits the preformatted message if the logger is at or below LogLevelWarn +func (ll *DefaultLeveledLogger) Warn(msg string) { + ll.logf(ll.warn, LogLevelWarn, msg) +} + +// Warnf formats and emits a message if the logger is at or below LogLevelWarn +func (ll *DefaultLeveledLogger) Warnf(format string, args ...interface{}) { + ll.logf(ll.warn, LogLevelWarn, format, args...) +} + +// Error emits the preformatted message if the logger is at or below LogLevelError +func (ll *DefaultLeveledLogger) Error(msg string) { + ll.logf(ll.err, LogLevelError, msg) +} + +// Errorf formats and emits a message if the logger is at or below LogLevelError +func (ll *DefaultLeveledLogger) Errorf(format string, args ...interface{}) { + ll.logf(ll.err, LogLevelError, format, args...) +} + +// NewDefaultLeveledLoggerForScope returns a configured LeveledLogger +func NewDefaultLeveledLoggerForScope(scope string, level LogLevel, writer io.Writer) *DefaultLeveledLogger { + if writer == nil { + writer = os.Stdout + } + logger := &DefaultLeveledLogger{ + writer: &loggerWriter{output: writer}, + level: level, + } + return logger. + WithTraceLogger(log.New(logger.writer, fmt.Sprintf("%s TRACE: ", scope), log.Lmicroseconds|log.Lshortfile)). + WithDebugLogger(log.New(logger.writer, fmt.Sprintf("%s DEBUG: ", scope), log.Lmicroseconds|log.Lshortfile)). + WithInfoLogger(log.New(logger.writer, fmt.Sprintf("%s INFO: ", scope), log.LstdFlags)). + WithWarnLogger(log.New(logger.writer, fmt.Sprintf("%s WARNING: ", scope), log.LstdFlags)). + WithErrorLogger(log.New(logger.writer, fmt.Sprintf("%s ERROR: ", scope), log.LstdFlags)) +} + +// DefaultLoggerFactory define levels by scopes and creates new DefaultLeveledLogger +type DefaultLoggerFactory struct { + Writer io.Writer + DefaultLogLevel LogLevel + ScopeLevels map[string]LogLevel +} + +// NewDefaultLoggerFactory creates a new DefaultLoggerFactory +func NewDefaultLoggerFactory() *DefaultLoggerFactory { + factory := DefaultLoggerFactory{} + factory.DefaultLogLevel = LogLevelError + factory.ScopeLevels = make(map[string]LogLevel) + factory.Writer = os.Stdout + + logLevels := map[string]LogLevel{ + "DISABLE": LogLevelDisabled, + "ERROR": LogLevelError, + "WARN": LogLevelWarn, + "INFO": LogLevelInfo, + "DEBUG": LogLevelDebug, + "TRACE": LogLevelTrace, + } + + for name, level := range logLevels { + env := os.Getenv(fmt.Sprintf("PION_LOG_%s", name)) + + if env == "" { + env = os.Getenv(fmt.Sprintf("PIONS_LOG_%s", name)) + } + + if env == "" { + continue + } + + if strings.ToLower(env) == "all" { + factory.DefaultLogLevel = level + continue + } + + scopes := strings.Split(strings.ToLower(env), ",") + for _, scope := range scopes { + factory.ScopeLevels[scope] = level + } + } + + return &factory +} + +// NewLogger returns a configured LeveledLogger for the given , argsscope +func (f *DefaultLoggerFactory) NewLogger(scope string) LeveledLogger { + logLevel := f.DefaultLogLevel + if f.ScopeLevels != nil { + scopeLevel, found := f.ScopeLevels[scope] + + if found { + logLevel = scopeLevel + } + } + return NewDefaultLeveledLoggerForScope(scope, logLevel, f.Writer) +} diff --git a/vendor/github.com/pion/logging/scoped.go b/vendor/github.com/pion/logging/scoped.go new file mode 100644 index 000000000..678bab426 --- /dev/null +++ b/vendor/github.com/pion/logging/scoped.go @@ -0,0 +1,72 @@ +package logging + +import ( + "sync/atomic" +) + +// LogLevel represents the level at which the logger will emit log messages +type LogLevel int32 + +// Set updates the LogLevel to the supplied value +func (ll *LogLevel) Set(newLevel LogLevel) { + atomic.StoreInt32((*int32)(ll), int32(newLevel)) +} + +// Get retrieves the current LogLevel value +func (ll *LogLevel) Get() LogLevel { + return LogLevel(atomic.LoadInt32((*int32)(ll))) +} + +func (ll LogLevel) String() string { + switch ll { + case LogLevelDisabled: + return "Disabled" + case LogLevelError: + return "Error" + case LogLevelWarn: + return "Warn" + case LogLevelInfo: + return "Info" + case LogLevelDebug: + return "Debug" + case LogLevelTrace: + return "Trace" + default: + return "UNKNOWN" + } +} + +const ( + // LogLevelDisabled completely disables logging of any events + LogLevelDisabled LogLevel = iota + // LogLevelError is for fatal errors which should be handled by user code, + // but are logged to ensure that they are seen + LogLevelError + // LogLevelWarn is for logging abnormal, but non-fatal library operation + LogLevelWarn + // LogLevelInfo is for logging normal library operation (e.g. state transitions, etc.) + LogLevelInfo + // LogLevelDebug is for logging low-level library information (e.g. internal operations) + LogLevelDebug + // LogLevelTrace is for logging very low-level library information (e.g. network traces) + LogLevelTrace +) + +// LeveledLogger is the basic pion Logger interface +type LeveledLogger interface { + Trace(msg string) + Tracef(format string, args ...interface{}) + Debug(msg string) + Debugf(format string, args ...interface{}) + Info(msg string) + Infof(format string, args ...interface{}) + Warn(msg string) + Warnf(format string, args ...interface{}) + Error(msg string) + Errorf(format string, args ...interface{}) +} + +// LoggerFactory is the basic pion LoggerFactory interface +type LoggerFactory interface { + NewLogger(scope string) LeveledLogger +} diff --git a/vendor/github.com/pion/randutil/.travis.yml b/vendor/github.com/pion/randutil/.travis.yml new file mode 100644 index 000000000..f04a89667 --- /dev/null +++ b/vendor/github.com/pion/randutil/.travis.yml @@ -0,0 +1,142 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# If this repository should have package specific CI config, +# remove the repository name from .goassets/.github/workflows/assets-sync.yml. +# +# If you want to update the shared CI config, send a PR to +# https://github.com/pion/.goassets instead of this repository. +# + +dist: bionic +language: go + + +branches: + only: + - master + +env: + global: + - GO111MODULE=on + - GOLANGCI_LINT_VERSION=1.19.1 + +cache: + directories: + - ${HOME}/.cache/go-build + - ${GOPATH}/pkg/mod + npm: true + yarn: true + +_lint_job: &lint_job + env: CACHE_NAME=lint + before_install: + - if [ -f .github/.ci.conf ]; then . .github/.ci.conf; fi + install: skip + before_script: + - | + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh \ + | bash -s - -b $GOPATH/bin v${GOLANGCI_LINT_VERSION} + script: + - bash .github/assert-contributors.sh + - bash .github/lint-disallowed-functions-in-library.sh + - bash .github/lint-commit-message.sh + - bash .github/lint-filename.sh + - golangci-lint run ./... +_test_job: &test_job + env: CACHE_NAME=test + before_install: + - if [ -f .github/.ci.conf ]; then . .github/.ci.conf; fi + - go mod download + install: + - go build ./... + script: + # If you want to specify repository specific test packages rule, + # add `TEST_PACKAGES=$(command to list test target packages)` to .github/.ci.conf + - testpkgs=${TEST_PACKAGES:-$(go list ./... | grep -v examples)} + - coverpkgs=$(echo "${testpkgs}" | paste -s -d ',') + - | + go test \ + -coverpkg=${coverpkgs} -coverprofile=cover.out -covermode=atomic \ + ${TEST_EXTRA_ARGS:-} \ + -v -race ${testpkgs} + - if [ -n "${TEST_HOOK}" ]; then ${TEST_HOOK}; fi + after_success: + - travis_retry bash <(curl -s https://codecov.io/bash) -c -F go +_test_i386_job: &test_i386_job + env: CACHE_NAME=test386 + services: docker + before_install: + - if [ -f .github/.ci.conf ]; then . .github/.ci.conf; fi + script: + - testpkgs=${TEST_PACKAGES:-$(go list ./... | grep -v examples)} + - | + docker run \ + -u $(id -u):$(id -g) \ + -e "GO111MODULE=on" \ + -e "CGO_ENABLED=0" \ + -v ${PWD}:/go/src/github.com/pion/$(basename ${PWD}) \ + -v ${HOME}/gopath/pkg/mod:/go/pkg/mod \ + -v ${HOME}/.cache/go-build:/.cache/go-build \ + -w /go/src/github.com/pion/$(basename ${PWD}) \ + -it i386/golang:${GO_VERSION}-alpine \ + /usr/local/go/bin/go test \ + ${TEST_EXTRA_ARGS:-} \ + -v ${testpkgs} +_test_wasm_job: &test_wasm_job + env: CACHE_NAME=wasm + language: node_js + node_js: 12 + before_install: + - if [ -f .github/.ci.conf ]; then . .github/.ci.conf; fi + - if ${SKIP_WASM_TEST:-false}; then exit 0; fi + install: + # Manually download and install Go instead of using gimme. + # It looks like gimme Go causes some errors on go-test for Wasm. + - curl -sSfL https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz | tar -C ~ -xzf - + - export GOROOT=${HOME}/go + - export PATH=${GOROOT}/bin:${PATH} + - yarn install + - export GO_JS_WASM_EXEC=${GO_JS_WASM_EXEC:-${GOROOT}/misc/wasm/go_js_wasm_exec} + script: + - testpkgs=${TEST_PACKAGES:-$(go list ./... | grep -v examples)} + - coverpkgs=$(echo "${testpkgs}" | paste -s -d ',') + - | + GOOS=js GOARCH=wasm go test \ + -coverpkg=${coverpkgs} -coverprofile=cover.out -covermode=atomic \ + -exec="${GO_JS_WASM_EXEC}" \ + -v ${testpkgs} + after_success: + - travis_retry bash <(curl -s https://codecov.io/bash) -c -F wasm + +jobs: + include: + - <<: *lint_job + name: Lint 1.14 + go: 1.14 + - <<: *test_job + name: Test 1.13 + go: 1.13 + - <<: *test_job + name: Test 1.14 + go: 1.14 + - <<: *test_i386_job + name: Test i386 1.13 + env: GO_VERSION=1.13 + go: 1.14 # Go version for host environment only for `go list`. + # All tests are done on the version specified by GO_VERSION. + - <<: *test_i386_job + name: Test i386 1.14 + env: GO_VERSION=1.14 + go: 1.14 # Go version for host environment only for `go list`. + # All tests are done on the version specified by GO_VERSION. + - <<: *test_wasm_job + name: Test WASM 1.13 + env: GO_VERSION=1.13 + - <<: *test_wasm_job + name: Test WASM 1.14 + env: GO_VERSION=1.14 + +notifications: + email: false diff --git a/vendor/github.com/pion/randutil/LICENSE b/vendor/github.com/pion/randutil/LICENSE new file mode 100644 index 000000000..5b5a39425 --- /dev/null +++ b/vendor/github.com/pion/randutil/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Pion + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/pion/randutil/README.md b/vendor/github.com/pion/randutil/README.md new file mode 100644 index 000000000..94baf7781 --- /dev/null +++ b/vendor/github.com/pion/randutil/README.md @@ -0,0 +1,14 @@ +# randutil +Helper library for cryptographic and mathmatical randoms + +### Community +Pion has an active community on the [Golang Slack](https://invite.slack.golangbridge.org/). Sign up and join the **#pion** channel for discussions and support. You can also use [Pion mailing list](https://groups.google.com/forum/#!forum/pion). + +We are always looking to support **your projects**. Please reach out if you have something to build! + +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing +Check out the **[contributing wiki](https://github.com/pion/webrtc/wiki/Contributing)** to join the group of amazing people making this project possible: + +* [Atsushi Watanabe](https://github.com/at-wat) - *Original Author* diff --git a/vendor/github.com/pion/randutil/codecov.yml b/vendor/github.com/pion/randutil/codecov.yml new file mode 100644 index 000000000..085200a48 --- /dev/null +++ b/vendor/github.com/pion/randutil/codecov.yml @@ -0,0 +1,20 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# + +coverage: + status: + project: + default: + # Allow decreasing 2% of total coverage to avoid noise. + threshold: 2% + patch: + default: + target: 70% + only_pulls: true + +ignore: + - "examples/*" + - "examples/**/*" diff --git a/vendor/github.com/pion/randutil/crypto.go b/vendor/github.com/pion/randutil/crypto.go new file mode 100644 index 000000000..d10df98d0 --- /dev/null +++ b/vendor/github.com/pion/randutil/crypto.go @@ -0,0 +1,30 @@ +package randutil + +import ( + crand "crypto/rand" + "encoding/binary" + "math/big" +) + +// GenerateCryptoRandomString generates a random string for cryptographic usage. +func GenerateCryptoRandomString(n int, runes string) (string, error) { + letters := []rune(runes) + b := make([]rune, n) + for i := range b { + v, err := crand.Int(crand.Reader, big.NewInt(int64(len(letters)))) + if err != nil { + return "", err + } + b[i] = letters[v.Int64()] + } + return string(b), nil +} + +// CryptoUint64 returns cryptographic random uint64. +func CryptoUint64() (uint64, error) { + var v uint64 + if err := binary.Read(crand.Reader, binary.LittleEndian, &v); err != nil { + return 0, err + } + return v, nil +} diff --git a/vendor/github.com/pion/randutil/math.go b/vendor/github.com/pion/randutil/math.go new file mode 100644 index 000000000..fbbf46023 --- /dev/null +++ b/vendor/github.com/pion/randutil/math.go @@ -0,0 +1,72 @@ +package randutil + +import ( + mrand "math/rand" // used for non-crypto unique ID and random port selection + "sync" + "time" +) + +// MathRandomGenerator is a random generator for non-crypto usage. +type MathRandomGenerator interface { + // Intn returns random integer within [0:n). + Intn(n int) int + + // Uint32 returns random 32-bit unsigned integer. + Uint32() uint32 + + // Uint64 returns random 64-bit unsigned integer. + Uint64() uint64 + + // GenerateString returns ranom string using given set of runes. + // It can be used for generating unique ID to avoid name collision. + // + // Caution: DO NOT use this for cryptographic usage. + GenerateString(n int, runes string) string +} + +type mathRandomGenerator struct { + r *mrand.Rand + mu sync.Mutex +} + +// NewMathRandomGenerator creates new mathmatical random generator. +// Random generator is seeded by crypto random. +func NewMathRandomGenerator() MathRandomGenerator { + seed, err := CryptoUint64() + if err != nil { + // crypto/rand is unavailable. Fallback to seed by time. + seed = uint64(time.Now().UnixNano()) + } + + return &mathRandomGenerator{r: mrand.New(mrand.NewSource(int64(seed)))} +} + +func (g *mathRandomGenerator) Intn(n int) int { + g.mu.Lock() + v := g.r.Intn(n) + g.mu.Unlock() + return v +} + +func (g *mathRandomGenerator) Uint32() uint32 { + g.mu.Lock() + v := g.r.Uint32() + g.mu.Unlock() + return v +} + +func (g *mathRandomGenerator) Uint64() uint64 { + g.mu.Lock() + v := g.r.Uint64() + g.mu.Unlock() + return v +} + +func (g *mathRandomGenerator) GenerateString(n int, runes string) string { + letters := []rune(runes) + b := make([]rune, n) + for i := range b { + b[i] = letters[g.Intn(len(letters))] + } + return string(b) +} diff --git a/vendor/github.com/pion/randutil/renovate.json b/vendor/github.com/pion/randutil/renovate.json new file mode 100644 index 000000000..4400fd9b2 --- /dev/null +++ b/vendor/github.com/pion/randutil/renovate.json @@ -0,0 +1,15 @@ +{ + "extends": [ + "config:base" + ], + "postUpdateOptions": [ + "gomodTidy" + ], + "commitBody": "Generated by renovateBot", + "packageRules": [ + { + "packagePatterns": ["^golang.org/x/"], + "schedule": ["on the first day of the month"] + } + ] +} diff --git a/vendor/github.com/pion/sctp/.gitignore b/vendor/github.com/pion/sctp/.gitignore new file mode 100644 index 000000000..6e2f206a9 --- /dev/null +++ b/vendor/github.com/pion/sctp/.gitignore @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +### JetBrains IDE ### +##################### +.idea/ + +### Emacs Temporary Files ### +############################# +*~ + +### Folders ### +############### +bin/ +vendor/ +node_modules/ + +### Files ### +############# +*.ivf +*.ogg +tags +cover.out +*.sw[poe] +*.wasm +examples/sfu-ws/cert.pem +examples/sfu-ws/key.pem +wasm_exec.js diff --git a/vendor/github.com/pion/sctp/.golangci.yml b/vendor/github.com/pion/sctp/.golangci.yml new file mode 100644 index 000000000..4e3eddf42 --- /dev/null +++ b/vendor/github.com/pion/sctp/.golangci.yml @@ -0,0 +1,137 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +linters-settings: + govet: + check-shadowing: true + misspell: + locale: US + exhaustive: + default-signifies-exhaustive: true + gomodguard: + blocked: + modules: + - github.com/pkg/errors: + recommendations: + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ + +linters: + enable: + - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences + - bodyclose # checks whether HTTP response body is closed successfully + - contextcheck # check the function whether use a non-inherited context + - decorder # check declaration order and count of types, constants, variables and functions + - depguard # Go linter that checks if package imports are in a list of acceptable packages + - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted. + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - exhaustive # check exhaustiveness of enum switch statements + - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - forcetypeassert # finds forced type assertions + - gci # Gci control golang package import order and make it always deterministic. + - gochecknoglobals # Checks that no globals are present in Go code + - gochecknoinits # Checks that no init functions are present in Go code + - gocognit # Computes and checks the cognitive complexity of functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # The most opinionated Go source code linter + - godox # Tool for detection of FIXME, TODO and other comment keywords + - goerr113 # Golang linter to check the errors handling expressions + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + - gofumpt # Gofumpt checks whether code was gofumpt-ed. + - goheader # Checks is file header matches to pattern + - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. + - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. + - goprintffuncname # Checks that printf-like functions are named with `f` at the end + - gosec # Inspects source code for security problems + - gosimple # Linter for Go source code that specializes in simplifying a code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - grouper # An analyzer to analyze expression groups. + - importas # Enforces consistent import aliases + - ineffassign # Detects when assignments to existing variables are not used + - misspell # Finds commonly misspelled English words in comments + - nakedret # Finds naked returns in functions greater than a specified function length + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - predeclared # find code that shadows one of Go's predeclared identifiers + - revive # golint replacement, finds style mistakes + - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks + - stylecheck # Stylecheck is a replacement for golint + - tagliatelle # Checks the struct tags. + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - unconvert # Remove unnecessary type conversions + - unparam # Reports unused function parameters + - unused # Checks Go code for unused constants, variables, functions and types + - wastedassign # wastedassign finds wasted assignment statements + - whitespace # Tool for detection of leading and trailing whitespace + disable: + - containedctx # containedctx is a linter that detects struct contained context.Context field + - cyclop # checks function and package cyclomatic complexity + - exhaustivestruct # Checks if all struct's fields are initialized + - funlen # Tool for detection of long functions + - gocyclo # Computes and checks the cyclomatic complexity of functions + - godot # Check if comments end in a period + - gomnd # An analyzer to detect magic numbers. + - ifshort # Checks that your code uses short syntax for if-statements whenever possible + - ireturn # Accept Interfaces, Return Concrete Types + - lll # Reports long lines + - maintidx # maintidx measures the maintainability index of each function. + - makezero # Finds slice declarations with non-zero initial length + - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nestif # Reports deeply nested if statements + - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity + - nolintlint # Reports ill-formed or insufficient nolint directives + - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test + - prealloc # Finds slice declarations that could potentially be preallocated + - promlinter # Check Prometheus metrics naming via promlint + - rowserrcheck # checks whether Err of rows is checked successfully + - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. + - testpackage # linter that makes you use a separate _test package + - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # checks that the length of a variable's name matches its scope + - wrapcheck # Checks that errors returned from external packages are wrapped + - wsl # Whitespace Linter - Forces you to use empty lines! + +issues: + exclude-use-default: false + exclude-rules: + # Allow complex tests, better to be self contained + - path: _test\.go + linters: + - gocognit + - forbidigo + + # Allow complex main function in examples + - path: examples + text: "of func `main` is high" + linters: + - gocognit + + # Allow forbidden identifiers in examples + - path: examples + linters: + - forbidigo + + # Allow forbidden identifiers in CLI commands + - path: cmd + linters: + - forbidigo + +run: + skip-dirs-use-default: false diff --git a/vendor/github.com/pion/sctp/.goreleaser.yml b/vendor/github.com/pion/sctp/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/sctp/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/sctp/AUTHORS.txt b/vendor/github.com/pion/sctp/AUTHORS.txt new file mode 100644 index 000000000..ae88cf02b --- /dev/null +++ b/vendor/github.com/pion/sctp/AUTHORS.txt @@ -0,0 +1,35 @@ +# Thank you to everyone that made Pion possible. If you are interested in contributing +# we would love to have you https://github.com/pion/webrtc/wiki/Contributing +# +# This file is auto generated, using git to list all individuals contributors. +# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting +Aaron France +Adrian Cable +Atsushi Watanabe +backkem +Cecylia Bocovich +chenkaiC4 +Eric Daniels +Hugo Arregui +Hugo Arregui +Jerko Steiner +Jerry Tao +John Bradley +Juliusz Chroboczek +Konstantin Itskov +Lukas Herman +Luke Curley +Michael MacDonald +ronan +Sam Lancia +Sean DuBois +Sean DuBois +Steffen +Steffen Vogel +Teddy +Will Forcey +Yutaka Takeda +ZHENK + +# List of contributors not appearing in Git history + diff --git a/vendor/github.com/pion/sctp/LICENSE b/vendor/github.com/pion/sctp/LICENSE new file mode 100644 index 000000000..491caf6b0 --- /dev/null +++ b/vendor/github.com/pion/sctp/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2023 The Pion community + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/sctp/README.md b/vendor/github.com/pion/sctp/README.md new file mode 100644 index 000000000..3ca234452 --- /dev/null +++ b/vendor/github.com/pion/sctp/README.md @@ -0,0 +1,34 @@ +

+
+ Pion SCTP +
+

+

A Go implementation of SCTP

+

+ Pion SCTP + Slack Widget +
+ GitHub Workflow Status + Go Reference + Coverage Status + Go Report Card + License: MIT +

+
+ +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. + +### Community +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. + +We are always looking to support **your projects**. Please reach out if you have something to build! +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) + +### License +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/sctp/ack_timer.go b/vendor/github.com/pion/sctp/ack_timer.go new file mode 100644 index 000000000..3d9b43e0a --- /dev/null +++ b/vendor/github.com/pion/sctp/ack_timer.go @@ -0,0 +1,108 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "sync" + "time" +) + +const ( + ackInterval time.Duration = 200 * time.Millisecond +) + +// ackTimerObserver is the inteface to an ack timer observer. +type ackTimerObserver interface { + onAckTimeout() +} + +// ackTimer provides the retnransmission timer conforms with RFC 4960 Sec 6.3.1 +type ackTimer struct { + observer ackTimerObserver + interval time.Duration + stopFunc stopAckTimerLoop + closed bool + mutex sync.RWMutex +} + +type stopAckTimerLoop func() + +// newAckTimer creates a new acknowledgement timer used to enable delayed ack. +func newAckTimer(observer ackTimerObserver) *ackTimer { + return &ackTimer{ + observer: observer, + interval: ackInterval, + } +} + +// start starts the timer. +func (t *ackTimer) start() bool { + t.mutex.Lock() + defer t.mutex.Unlock() + + // this timer is already closed + if t.closed { + return false + } + + // this is a noop if the timer is already running + if t.stopFunc != nil { + return false + } + + cancelCh := make(chan struct{}) + + go func() { + timer := time.NewTimer(t.interval) + + select { + case <-timer.C: + t.stop() + t.observer.onAckTimeout() + case <-cancelCh: + timer.Stop() + } + }() + + t.stopFunc = func() { + close(cancelCh) + } + + return true +} + +// stops the timer. this is similar to stop() but subsequent start() call +// will fail (the timer is no longer usable) +func (t *ackTimer) stop() { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.stopFunc != nil { + t.stopFunc() + t.stopFunc = nil + } +} + +// closes the timer. this is similar to stop() but subsequent start() call +// will fail (the timer is no longer usable) +func (t *ackTimer) close() { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.stopFunc != nil { + t.stopFunc() + t.stopFunc = nil + } + + t.closed = true +} + +// isRunning tests if the timer is running. +// Debug purpose only +func (t *ackTimer) isRunning() bool { + t.mutex.RLock() + defer t.mutex.RUnlock() + + return (t.stopFunc != nil) +} diff --git a/vendor/github.com/pion/sctp/association.go b/vendor/github.com/pion/sctp/association.go new file mode 100644 index 000000000..ce3725ec3 --- /dev/null +++ b/vendor/github.com/pion/sctp/association.go @@ -0,0 +1,2584 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "math" + "net" + "sync" + "sync/atomic" + "time" + + "github.com/pion/logging" + "github.com/pion/randutil" +) + +// Use global random generator to properly seed by crypto grade random. +var globalMathRandomGenerator = randutil.NewMathRandomGenerator() // nolint:gochecknoglobals + +// Association errors +var ( + ErrChunk = errors.New("abort chunk, with following errors") + ErrShutdownNonEstablished = errors.New("shutdown called in non-established state") + ErrAssociationClosedBeforeConn = errors.New("association closed before connecting") + ErrSilentlyDiscard = errors.New("silently discard") + ErrInitNotStoredToSend = errors.New("the init not stored to send") + ErrCookieEchoNotStoredToSend = errors.New("cookieEcho not stored to send") + ErrSCTPPacketSourcePortZero = errors.New("sctp packet must not have a source port of 0") + ErrSCTPPacketDestinationPortZero = errors.New("sctp packet must not have a destination port of 0") + ErrInitChunkBundled = errors.New("init chunk must not be bundled with any other chunk") + ErrInitChunkVerifyTagNotZero = errors.New("init chunk expects a verification tag of 0 on the packet when out-of-the-blue") + ErrHandleInitState = errors.New("todo: handle Init when in state") + ErrInitAckNoCookie = errors.New("no cookie in InitAck") + ErrInflightQueueTSNPop = errors.New("unable to be popped from inflight queue TSN") + ErrTSNRequestNotExist = errors.New("requested non-existent TSN") + ErrResetPacketInStateNotExist = errors.New("sending reset packet in non-established state") + ErrParamterType = errors.New("unexpected parameter type") + ErrPayloadDataStateNotExist = errors.New("sending payload data in non-established state") + ErrChunkTypeUnhandled = errors.New("unhandled chunk type") + ErrHandshakeInitAck = errors.New("handshake failed (INIT ACK)") + ErrHandshakeCookieEcho = errors.New("handshake failed (COOKIE ECHO)") +) + +const ( + receiveMTU uint32 = 8192 // MTU for inbound packet (from DTLS) + initialMTU uint32 = 1228 // initial MTU for outgoing packets (to DTLS) + initialRecvBufSize uint32 = 1024 * 1024 + commonHeaderSize uint32 = 12 + dataChunkHeaderSize uint32 = 16 + defaultMaxMessageSize uint32 = 65536 +) + +// association state enums +const ( + closed uint32 = iota + cookieWait + cookieEchoed + established + shutdownAckSent + shutdownPending + shutdownReceived + shutdownSent +) + +// retransmission timer IDs +const ( + timerT1Init int = iota + timerT1Cookie + timerT2Shutdown + timerT3RTX + timerReconfig +) + +// ack mode (for testing) +const ( + ackModeNormal int = iota + ackModeNoDelay + ackModeAlwaysDelay +) + +// ack transmission state +const ( + ackStateIdle int = iota // ack timer is off + ackStateImmediate // will send ack immediately + ackStateDelay // ack timer is on (ack is being delayed) +) + +// other constants +const ( + acceptChSize = 16 +) + +func getAssociationStateString(a uint32) string { + switch a { + case closed: + return "Closed" + case cookieWait: + return "CookieWait" + case cookieEchoed: + return "CookieEchoed" + case established: + return "Established" + case shutdownPending: + return "ShutdownPending" + case shutdownSent: + return "ShutdownSent" + case shutdownReceived: + return "ShutdownReceived" + case shutdownAckSent: + return "ShutdownAckSent" + default: + return fmt.Sprintf("Invalid association state %d", a) + } +} + +// Association represents an SCTP association +// 13.2. Parameters Necessary per Association (i.e., the TCB) +// +// Peer : Tag value to be sent in every packet and is received +// Verification: in the INIT or INIT ACK chunk. +// Tag : +// State : A state variable indicating what state the association +// : is in, i.e., COOKIE-WAIT, COOKIE-ECHOED, ESTABLISHED, +// : SHUTDOWN-PENDING, SHUTDOWN-SENT, SHUTDOWN-RECEIVED, +// : SHUTDOWN-ACK-SENT. +// +// Note: No "CLOSED" state is illustrated since if a +// association is "CLOSED" its TCB SHOULD be removed. +type Association struct { + bytesReceived uint64 + bytesSent uint64 + + lock sync.RWMutex + + netConn net.Conn + + peerVerificationTag uint32 + myVerificationTag uint32 + state uint32 + myNextTSN uint32 // nextTSN + peerLastTSN uint32 // lastRcvdTSN + minTSN2MeasureRTT uint32 // for RTT measurement + willSendForwardTSN bool + willRetransmitFast bool + willRetransmitReconfig bool + + willSendShutdown bool + willSendShutdownAck bool + willSendShutdownComplete bool + + willSendAbort bool + willSendAbortCause errorCause + + // Reconfig + myNextRSN uint32 + reconfigs map[uint32]*chunkReconfig + reconfigRequests map[uint32]*paramOutgoingResetRequest + + // Non-RFC internal data + sourcePort uint16 + destinationPort uint16 + myMaxNumInboundStreams uint16 + myMaxNumOutboundStreams uint16 + myCookie *paramStateCookie + payloadQueue *payloadQueue + inflightQueue *payloadQueue + pendingQueue *pendingQueue + controlQueue *controlQueue + mtu uint32 + maxPayloadSize uint32 // max DATA chunk payload size + srtt atomic.Value // type float64 + cumulativeTSNAckPoint uint32 + advancedPeerTSNAckPoint uint32 + useForwardTSN bool + + // Congestion control parameters + maxReceiveBufferSize uint32 + maxMessageSize uint32 + cwnd uint32 // my congestion window size + rwnd uint32 // calculated peer's receiver windows size + ssthresh uint32 // slow start threshold + partialBytesAcked uint32 + inFastRecovery bool + fastRecoverExitPoint uint32 + + // RTX & Ack timer + rtoMgr *rtoManager + t1Init *rtxTimer + t1Cookie *rtxTimer + t2Shutdown *rtxTimer + t3RTX *rtxTimer + tReconfig *rtxTimer + ackTimer *ackTimer + + // Chunks stored for retransmission + storedInit *chunkInit + storedCookieEcho *chunkCookieEcho + + streams map[uint16]*Stream + acceptCh chan *Stream + readLoopCloseCh chan struct{} + awakeWriteLoopCh chan struct{} + closeWriteLoopCh chan struct{} + handshakeCompletedCh chan error + + closeWriteLoopOnce sync.Once + + // local error + silentError error + + ackState int + ackMode int // for testing + + // stats + stats *associationStats + + // per inbound packet context + delayedAckTriggered bool + immediateAckTriggered bool + + name string + log logging.LeveledLogger +} + +// Config collects the arguments to createAssociation construction into +// a single structure +type Config struct { + NetConn net.Conn + MaxReceiveBufferSize uint32 + MaxMessageSize uint32 + LoggerFactory logging.LoggerFactory +} + +// Server accepts a SCTP stream over a conn +func Server(config Config) (*Association, error) { + a := createAssociation(config) + a.init(false) + + select { + case err := <-a.handshakeCompletedCh: + if err != nil { + return nil, err + } + return a, nil + case <-a.readLoopCloseCh: + return nil, ErrAssociationClosedBeforeConn + } +} + +// Client opens a SCTP stream over a conn +func Client(config Config) (*Association, error) { + a := createAssociation(config) + a.init(true) + + select { + case err := <-a.handshakeCompletedCh: + if err != nil { + return nil, err + } + return a, nil + case <-a.readLoopCloseCh: + return nil, ErrAssociationClosedBeforeConn + } +} + +func createAssociation(config Config) *Association { + var maxReceiveBufferSize uint32 + if config.MaxReceiveBufferSize == 0 { + maxReceiveBufferSize = initialRecvBufSize + } else { + maxReceiveBufferSize = config.MaxReceiveBufferSize + } + + var maxMessageSize uint32 + if config.MaxMessageSize == 0 { + maxMessageSize = defaultMaxMessageSize + } else { + maxMessageSize = config.MaxMessageSize + } + + tsn := globalMathRandomGenerator.Uint32() + a := &Association{ + netConn: config.NetConn, + maxReceiveBufferSize: maxReceiveBufferSize, + maxMessageSize: maxMessageSize, + myMaxNumOutboundStreams: math.MaxUint16, + myMaxNumInboundStreams: math.MaxUint16, + payloadQueue: newPayloadQueue(), + inflightQueue: newPayloadQueue(), + pendingQueue: newPendingQueue(), + controlQueue: newControlQueue(), + mtu: initialMTU, + maxPayloadSize: initialMTU - (commonHeaderSize + dataChunkHeaderSize), + myVerificationTag: globalMathRandomGenerator.Uint32(), + myNextTSN: tsn, + myNextRSN: tsn, + minTSN2MeasureRTT: tsn, + state: closed, + rtoMgr: newRTOManager(), + streams: map[uint16]*Stream{}, + reconfigs: map[uint32]*chunkReconfig{}, + reconfigRequests: map[uint32]*paramOutgoingResetRequest{}, + acceptCh: make(chan *Stream, acceptChSize), + readLoopCloseCh: make(chan struct{}), + awakeWriteLoopCh: make(chan struct{}, 1), + closeWriteLoopCh: make(chan struct{}), + handshakeCompletedCh: make(chan error), + cumulativeTSNAckPoint: tsn - 1, + advancedPeerTSNAckPoint: tsn - 1, + silentError: ErrSilentlyDiscard, + stats: &associationStats{}, + log: config.LoggerFactory.NewLogger("sctp"), + } + + a.name = fmt.Sprintf("%p", a) + + // RFC 4690 Sec 7.2.1 + // o The initial cwnd before DATA transmission or after a sufficiently + // long idle period MUST be set to min(4*MTU, max (2*MTU, 4380 + // bytes)). + a.setCWND(min32(4*a.MTU(), max32(2*a.MTU(), 4380))) + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (INI)", + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) + + a.srtt.Store(float64(0)) + a.t1Init = newRTXTimer(timerT1Init, a, maxInitRetrans) + a.t1Cookie = newRTXTimer(timerT1Cookie, a, maxInitRetrans) + a.t2Shutdown = newRTXTimer(timerT2Shutdown, a, noMaxRetrans) // retransmit forever + a.t3RTX = newRTXTimer(timerT3RTX, a, noMaxRetrans) // retransmit forever + a.tReconfig = newRTXTimer(timerReconfig, a, noMaxRetrans) // retransmit forever + a.ackTimer = newAckTimer(a) + + return a +} + +func (a *Association) init(isClient bool) { + a.lock.Lock() + defer a.lock.Unlock() + + go a.readLoop() + go a.writeLoop() + + if isClient { + a.setState(cookieWait) + init := &chunkInit{} + init.initialTSN = a.myNextTSN + init.numOutboundStreams = a.myMaxNumOutboundStreams + init.numInboundStreams = a.myMaxNumInboundStreams + init.initiateTag = a.myVerificationTag + init.advertisedReceiverWindowCredit = a.maxReceiveBufferSize + setSupportedExtensions(&init.chunkInitCommon) + a.storedInit = init + + err := a.sendInit() + if err != nil { + a.log.Errorf("[%s] failed to send init: %s", a.name, err.Error()) + } + + a.t1Init.start(a.rtoMgr.getRTO()) + } +} + +// caller must hold a.lock +func (a *Association) sendInit() error { + a.log.Debugf("[%s] sending INIT", a.name) + if a.storedInit == nil { + return ErrInitNotStoredToSend + } + + outbound := &packet{} + outbound.verificationTag = a.peerVerificationTag + a.sourcePort = 5000 // Spec?? + a.destinationPort = 5000 // Spec?? + outbound.sourcePort = a.sourcePort + outbound.destinationPort = a.destinationPort + + outbound.chunks = []chunk{a.storedInit} + + a.controlQueue.push(outbound) + a.awakeWriteLoop() + + return nil +} + +// caller must hold a.lock +func (a *Association) sendCookieEcho() error { + if a.storedCookieEcho == nil { + return ErrCookieEchoNotStoredToSend + } + + a.log.Debugf("[%s] sending COOKIE-ECHO", a.name) + + outbound := &packet{} + outbound.verificationTag = a.peerVerificationTag + outbound.sourcePort = a.sourcePort + outbound.destinationPort = a.destinationPort + outbound.chunks = []chunk{a.storedCookieEcho} + + a.controlQueue.push(outbound) + a.awakeWriteLoop() + + return nil +} + +// Shutdown initiates the shutdown sequence. The method blocks until the +// shutdown sequence is completed and the connection is closed, or until the +// passed context is done, in which case the context's error is returned. +func (a *Association) Shutdown(ctx context.Context) error { + a.log.Debugf("[%s] closing association..", a.name) + + state := a.getState() + + if state != established { + return fmt.Errorf("%w: shutdown %s", ErrShutdownNonEstablished, a.name) + } + + // Attempt a graceful shutdown. + a.setState(shutdownPending) + + a.lock.Lock() + + if a.inflightQueue.size() == 0 { + // No more outstanding, send shutdown. + a.willSendShutdown = true + a.awakeWriteLoop() + a.setState(shutdownSent) + } + + a.lock.Unlock() + + select { + case <-a.closeWriteLoopCh: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +// Close ends the SCTP Association and cleans up any state +func (a *Association) Close() error { + a.log.Debugf("[%s] closing association..", a.name) + + err := a.close() + + // Wait for readLoop to end + <-a.readLoopCloseCh + + a.log.Debugf("[%s] association closed", a.name) + a.log.Debugf("[%s] stats nDATAs (in) : %d", a.name, a.stats.getNumDATAs()) + a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKs()) + a.log.Debugf("[%s] stats nT3Timeouts : %d", a.name, a.stats.getNumT3Timeouts()) + a.log.Debugf("[%s] stats nAckTimeouts: %d", a.name, a.stats.getNumAckTimeouts()) + a.log.Debugf("[%s] stats nFastRetrans: %d", a.name, a.stats.getNumFastRetrans()) + + return err +} + +func (a *Association) close() error { + a.log.Debugf("[%s] closing association..", a.name) + + a.setState(closed) + + err := a.netConn.Close() + + a.closeAllTimers() + + // awake writeLoop to exit + a.closeWriteLoopOnce.Do(func() { close(a.closeWriteLoopCh) }) + + return err +} + +// Abort sends the abort packet with user initiated abort and immediately +// closes the connection. +func (a *Association) Abort(reason string) { + a.log.Debugf("[%s] aborting association: %s", a.name, reason) + + a.lock.Lock() + + a.willSendAbort = true + a.willSendAbortCause = &errorCauseUserInitiatedAbort{ + upperLayerAbortReason: []byte(reason), + } + + a.lock.Unlock() + + a.awakeWriteLoop() + + // Wait for readLoop to end + <-a.readLoopCloseCh +} + +func (a *Association) closeAllTimers() { + // Close all retransmission & ack timers + a.t1Init.close() + a.t1Cookie.close() + a.t2Shutdown.close() + a.t3RTX.close() + a.tReconfig.close() + a.ackTimer.close() +} + +func (a *Association) readLoop() { + var closeErr error + defer func() { + // also stop writeLoop, otherwise writeLoop can be leaked + // if connection is lost when there is no writing packet. + a.closeWriteLoopOnce.Do(func() { close(a.closeWriteLoopCh) }) + + a.lock.Lock() + for _, s := range a.streams { + a.unregisterStream(s, closeErr) + } + a.lock.Unlock() + close(a.acceptCh) + close(a.readLoopCloseCh) + + a.log.Debugf("[%s] association closed", a.name) + a.log.Debugf("[%s] stats nDATAs (in) : %d", a.name, a.stats.getNumDATAs()) + a.log.Debugf("[%s] stats nSACKs (in) : %d", a.name, a.stats.getNumSACKs()) + a.log.Debugf("[%s] stats nT3Timeouts : %d", a.name, a.stats.getNumT3Timeouts()) + a.log.Debugf("[%s] stats nAckTimeouts: %d", a.name, a.stats.getNumAckTimeouts()) + a.log.Debugf("[%s] stats nFastRetrans: %d", a.name, a.stats.getNumFastRetrans()) + }() + + a.log.Debugf("[%s] readLoop entered", a.name) + buffer := make([]byte, receiveMTU) + + for { + n, err := a.netConn.Read(buffer) + if err != nil { + closeErr = err + break + } + // Make a buffer sized to what we read, then copy the data we + // read from the underlying transport. We do this because the + // user data is passed to the reassembly queue without + // copying. + inbound := make([]byte, n) + copy(inbound, buffer[:n]) + atomic.AddUint64(&a.bytesReceived, uint64(n)) + if err = a.handleInbound(inbound); err != nil { + closeErr = err + break + } + } + + a.log.Debugf("[%s] readLoop exited %s", a.name, closeErr) +} + +func (a *Association) writeLoop() { + a.log.Debugf("[%s] writeLoop entered", a.name) + defer a.log.Debugf("[%s] writeLoop exited", a.name) + +loop: + for { + rawPackets, ok := a.gatherOutbound() + + for _, raw := range rawPackets { + _, err := a.netConn.Write(raw) + if err != nil { + if !errors.Is(err, io.EOF) { + a.log.Warnf("[%s] failed to write packets on netConn: %v", a.name, err) + } + a.log.Debugf("[%s] writeLoop ended", a.name) + break loop + } + atomic.AddUint64(&a.bytesSent, uint64(len(raw))) + } + + if !ok { + if err := a.close(); err != nil { + a.log.Warnf("[%s] failed to close association: %v", a.name, err) + } + + return + } + + select { + case <-a.awakeWriteLoopCh: + case <-a.closeWriteLoopCh: + break loop + } + } + + a.setState(closed) + a.closeAllTimers() +} + +func (a *Association) awakeWriteLoop() { + select { + case a.awakeWriteLoopCh <- struct{}{}: + default: + } +} + +// unregisterStream un-registers a stream from the association +// The caller should hold the association write lock. +func (a *Association) unregisterStream(s *Stream, err error) { + s.lock.Lock() + defer s.lock.Unlock() + + delete(a.streams, s.streamIdentifier) + s.readErr = err + s.readNotifier.Broadcast() +} + +// handleInbound parses incoming raw packets +func (a *Association) handleInbound(raw []byte) error { + p := &packet{} + if err := p.unmarshal(raw); err != nil { + a.log.Warnf("[%s] unable to parse SCTP packet %s", a.name, err) + return nil + } + + if err := checkPacket(p); err != nil { + a.log.Warnf("[%s] failed validating packet %s", a.name, err) + return nil + } + + a.handleChunkStart() + + for _, c := range p.chunks { + if err := a.handleChunk(p, c); err != nil { + return err + } + } + + a.handleChunkEnd() + + return nil +} + +// The caller should hold the lock +func (a *Association) gatherDataPacketsToRetransmit(rawPackets [][]byte) [][]byte { + for _, p := range a.getDataPacketsToRetransmit() { + raw, err := p.marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a DATA packet to be retransmitted", a.name) + continue + } + rawPackets = append(rawPackets, raw) + } + + return rawPackets +} + +// The caller should hold the lock +func (a *Association) gatherOutboundDataAndReconfigPackets(rawPackets [][]byte) [][]byte { + // Pop unsent data chunks from the pending queue to send as much as + // cwnd and rwnd allow. + chunks, sisToReset := a.popPendingDataChunksToSend() + if len(chunks) > 0 { + // Start timer. (noop if already started) + a.log.Tracef("[%s] T3-rtx timer start (pt1)", a.name) + a.t3RTX.start(a.rtoMgr.getRTO()) + for _, p := range a.bundleDataChunksIntoPackets(chunks) { + raw, err := p.marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a DATA packet", a.name) + continue + } + rawPackets = append(rawPackets, raw) + } + } + + if len(sisToReset) > 0 || a.willRetransmitReconfig { + if a.willRetransmitReconfig { + a.willRetransmitReconfig = false + a.log.Debugf("[%s] retransmit %d RECONFIG chunk(s)", a.name, len(a.reconfigs)) + for _, c := range a.reconfigs { + p := a.createPacket([]chunk{c}) + raw, err := p.marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a RECONFIG packet to be retransmitted", a.name) + } else { + rawPackets = append(rawPackets, raw) + } + } + } + + if len(sisToReset) > 0 { + rsn := a.generateNextRSN() + tsn := a.myNextTSN - 1 + c := &chunkReconfig{ + paramA: ¶mOutgoingResetRequest{ + reconfigRequestSequenceNumber: rsn, + senderLastTSN: tsn, + streamIdentifiers: sisToReset, + }, + } + a.reconfigs[rsn] = c // store in the map for retransmission + a.log.Debugf("[%s] sending RECONFIG: rsn=%d tsn=%d streams=%v", + a.name, rsn, a.myNextTSN-1, sisToReset) + p := a.createPacket([]chunk{c}) + raw, err := p.marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a RECONFIG packet to be transmitted", a.name) + } else { + rawPackets = append(rawPackets, raw) + } + } + + if len(a.reconfigs) > 0 { + a.tReconfig.start(a.rtoMgr.getRTO()) + } + } + + return rawPackets +} + +// The caller should hold the lock +func (a *Association) gatherOutboundFastRetransmissionPackets(rawPackets [][]byte) [][]byte { + if a.willRetransmitFast { + a.willRetransmitFast = false + + toFastRetrans := []chunk{} + fastRetransSize := commonHeaderSize + + for i := 0; ; i++ { + c, ok := a.inflightQueue.get(a.cumulativeTSNAckPoint + uint32(i) + 1) + if !ok { + break // end of pending data + } + + if c.acked || c.abandoned() { + continue + } + + if c.nSent > 1 || c.missIndicator < 3 { + continue + } + + // RFC 4960 Sec 7.2.4 Fast Retransmit on Gap Reports + // 3) Determine how many of the earliest (i.e., lowest TSN) DATA chunks + // marked for retransmission will fit into a single packet, subject + // to constraint of the path MTU of the destination transport + // address to which the packet is being sent. Call this value K. + // Retransmit those K DATA chunks in a single packet. When a Fast + // Retransmit is being performed, the sender SHOULD ignore the value + // of cwnd and SHOULD NOT delay retransmission for this single + // packet. + + dataChunkSize := dataChunkHeaderSize + uint32(len(c.userData)) + if a.MTU() < fastRetransSize+dataChunkSize { + break + } + + fastRetransSize += dataChunkSize + a.stats.incFastRetrans() + c.nSent++ + a.checkPartialReliabilityStatus(c) + toFastRetrans = append(toFastRetrans, c) + a.log.Tracef("[%s] fast-retransmit: tsn=%d sent=%d htna=%d", + a.name, c.tsn, c.nSent, a.fastRecoverExitPoint) + } + + if len(toFastRetrans) > 0 { + raw, err := a.createPacket(toFastRetrans).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a DATA packet to be fast-retransmitted", a.name) + } else { + rawPackets = append(rawPackets, raw) + } + } + } + + return rawPackets +} + +// The caller should hold the lock +func (a *Association) gatherOutboundSackPackets(rawPackets [][]byte) [][]byte { + if a.ackState == ackStateImmediate { + a.ackState = ackStateIdle + sack := a.createSelectiveAckChunk() + a.log.Debugf("[%s] sending SACK: %s", a.name, sack) + raw, err := a.createPacket([]chunk{sack}).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a SACK packet", a.name) + } else { + rawPackets = append(rawPackets, raw) + } + } + + return rawPackets +} + +// The caller should hold the lock +func (a *Association) gatherOutboundForwardTSNPackets(rawPackets [][]byte) [][]byte { + if a.willSendForwardTSN { + a.willSendForwardTSN = false + if sna32GT(a.advancedPeerTSNAckPoint, a.cumulativeTSNAckPoint) { + fwdtsn := a.createForwardTSN() + raw, err := a.createPacket([]chunk{fwdtsn}).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a Forward TSN packet", a.name) + } else { + rawPackets = append(rawPackets, raw) + } + } + } + + return rawPackets +} + +func (a *Association) gatherOutboundShutdownPackets(rawPackets [][]byte) ([][]byte, bool) { + ok := true + + switch { + case a.willSendShutdown: + a.willSendShutdown = false + + shutdown := &chunkShutdown{ + cumulativeTSNAck: a.cumulativeTSNAckPoint, + } + + raw, err := a.createPacket([]chunk{shutdown}).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a Shutdown packet", a.name) + } else { + a.t2Shutdown.start(a.rtoMgr.getRTO()) + rawPackets = append(rawPackets, raw) + } + case a.willSendShutdownAck: + a.willSendShutdownAck = false + + shutdownAck := &chunkShutdownAck{} + + raw, err := a.createPacket([]chunk{shutdownAck}).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a ShutdownAck packet", a.name) + } else { + a.t2Shutdown.start(a.rtoMgr.getRTO()) + rawPackets = append(rawPackets, raw) + } + case a.willSendShutdownComplete: + a.willSendShutdownComplete = false + + shutdownComplete := &chunkShutdownComplete{} + + raw, err := a.createPacket([]chunk{shutdownComplete}).marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a ShutdownComplete packet", a.name) + } else { + rawPackets = append(rawPackets, raw) + ok = false + } + } + + return rawPackets, ok +} + +func (a *Association) gatherAbortPacket() ([]byte, error) { + cause := a.willSendAbortCause + + a.willSendAbort = false + a.willSendAbortCause = nil + + abort := &chunkAbort{} + + if cause != nil { + abort.errorCauses = []errorCause{cause} + } + + raw, err := a.createPacket([]chunk{abort}).marshal() + + return raw, err +} + +// gatherOutbound gathers outgoing packets. The returned bool value set to +// false means the association should be closed down after the final send. +func (a *Association) gatherOutbound() ([][]byte, bool) { + a.lock.Lock() + defer a.lock.Unlock() + + if a.willSendAbort { + pkt, err := a.gatherAbortPacket() + if err != nil { + a.log.Warnf("[%s] failed to serialize an abort packet", a.name) + return nil, false + } + + return [][]byte{pkt}, false + } + + rawPackets := [][]byte{} + + if a.controlQueue.size() > 0 { + for _, p := range a.controlQueue.popAll() { + raw, err := p.marshal() + if err != nil { + a.log.Warnf("[%s] failed to serialize a control packet", a.name) + continue + } + rawPackets = append(rawPackets, raw) + } + } + + state := a.getState() + + ok := true + + switch state { + case established: + rawPackets = a.gatherDataPacketsToRetransmit(rawPackets) + rawPackets = a.gatherOutboundDataAndReconfigPackets(rawPackets) + rawPackets = a.gatherOutboundFastRetransmissionPackets(rawPackets) + rawPackets = a.gatherOutboundSackPackets(rawPackets) + rawPackets = a.gatherOutboundForwardTSNPackets(rawPackets) + case shutdownPending, shutdownSent, shutdownReceived: + rawPackets = a.gatherDataPacketsToRetransmit(rawPackets) + rawPackets = a.gatherOutboundFastRetransmissionPackets(rawPackets) + rawPackets = a.gatherOutboundSackPackets(rawPackets) + rawPackets, ok = a.gatherOutboundShutdownPackets(rawPackets) + case shutdownAckSent: + rawPackets, ok = a.gatherOutboundShutdownPackets(rawPackets) + } + + return rawPackets, ok +} + +func checkPacket(p *packet) error { + // All packets must adhere to these rules + + // This is the SCTP sender's port number. It can be used by the + // receiver in combination with the source IP address, the SCTP + // destination port, and possibly the destination IP address to + // identify the association to which this packet belongs. The port + // number 0 MUST NOT be used. + if p.sourcePort == 0 { + return ErrSCTPPacketSourcePortZero + } + + // This is the SCTP port number to which this packet is destined. + // The receiving host will use this port number to de-multiplex the + // SCTP packet to the correct receiving endpoint/application. The + // port number 0 MUST NOT be used. + if p.destinationPort == 0 { + return ErrSCTPPacketDestinationPortZero + } + + // Check values on the packet that are specific to a particular chunk type + for _, c := range p.chunks { + switch c.(type) { // nolint:gocritic + case *chunkInit: + // An INIT or INIT ACK chunk MUST NOT be bundled with any other chunk. + // They MUST be the only chunks present in the SCTP packets that carry + // them. + if len(p.chunks) != 1 { + return ErrInitChunkBundled + } + + // A packet containing an INIT chunk MUST have a zero Verification + // Tag. + if p.verificationTag != 0 { + return ErrInitChunkVerifyTagNotZero + } + } + } + + return nil +} + +func min16(a, b uint16) uint16 { + if a < b { + return a + } + return b +} + +func max32(a, b uint32) uint32 { + if a > b { + return a + } + return b +} + +func min32(a, b uint32) uint32 { + if a < b { + return a + } + return b +} + +// setState atomically sets the state of the Association. +// The caller should hold the lock. +func (a *Association) setState(newState uint32) { + oldState := atomic.SwapUint32(&a.state, newState) + if newState != oldState { + a.log.Debugf("[%s] state change: '%s' => '%s'", + a.name, + getAssociationStateString(oldState), + getAssociationStateString(newState)) + } +} + +// getState atomically returns the state of the Association. +func (a *Association) getState() uint32 { + return atomic.LoadUint32(&a.state) +} + +// BytesSent returns the number of bytes sent +func (a *Association) BytesSent() uint64 { + return atomic.LoadUint64(&a.bytesSent) +} + +// BytesReceived returns the number of bytes received +func (a *Association) BytesReceived() uint64 { + return atomic.LoadUint64(&a.bytesReceived) +} + +// MTU returns the association's current MTU +func (a *Association) MTU() uint32 { + return atomic.LoadUint32(&a.mtu) +} + +// CWND returns the association's current congestion window (cwnd) +func (a *Association) CWND() uint32 { + return atomic.LoadUint32(&a.cwnd) +} + +func (a *Association) setCWND(cwnd uint32) { + atomic.StoreUint32(&a.cwnd, cwnd) +} + +// RWND returns the association's current receiver window (rwnd) +func (a *Association) RWND() uint32 { + return atomic.LoadUint32(&a.rwnd) +} + +func (a *Association) setRWND(rwnd uint32) { + atomic.StoreUint32(&a.rwnd, rwnd) +} + +// SRTT returns the latest smoothed round-trip time (srrt) +func (a *Association) SRTT() float64 { + return a.srtt.Load().(float64) //nolint:forcetypeassert +} + +func setSupportedExtensions(init *chunkInitCommon) { + // nolint:godox + // TODO RFC5061 https://tools.ietf.org/html/rfc6525#section-5.2 + // An implementation supporting this (Supported Extensions Parameter) + // extension MUST list the ASCONF, the ASCONF-ACK, and the AUTH chunks + // in its INIT and INIT-ACK parameters. + init.params = append(init.params, ¶mSupportedExtensions{ + ChunkTypes: []chunkType{ctReconfig, ctForwardTSN}, + }) +} + +// The caller should hold the lock. +func (a *Association) handleInit(p *packet, i *chunkInit) ([]*packet, error) { + state := a.getState() + a.log.Debugf("[%s] chunkInit received in state '%s'", a.name, getAssociationStateString(state)) + + // https://tools.ietf.org/html/rfc4960#section-5.2.1 + // Upon receipt of an INIT in the COOKIE-WAIT state, an endpoint MUST + // respond with an INIT ACK using the same parameters it sent in its + // original INIT chunk (including its Initiate Tag, unchanged). When + // responding, the endpoint MUST send the INIT ACK back to the same + // address that the original INIT (sent by this endpoint) was sent. + + if state != closed && state != cookieWait && state != cookieEchoed { + // 5.2.2. Unexpected INIT in States Other than CLOSED, COOKIE-ECHOED, + // COOKIE-WAIT, and SHUTDOWN-ACK-SENT + return nil, fmt.Errorf("%w: %s", ErrHandleInitState, getAssociationStateString(state)) + } + + // Should we be setting any of these permanently until we've ACKed further? + a.myMaxNumInboundStreams = min16(i.numInboundStreams, a.myMaxNumInboundStreams) + a.myMaxNumOutboundStreams = min16(i.numOutboundStreams, a.myMaxNumOutboundStreams) + a.peerVerificationTag = i.initiateTag + a.sourcePort = p.destinationPort + a.destinationPort = p.sourcePort + + // 13.2 This is the last TSN received in sequence. This value + // is set initially by taking the peer's initial TSN, + // received in the INIT or INIT ACK chunk, and + // subtracting one from it. + a.peerLastTSN = i.initialTSN - 1 + + for _, param := range i.params { + switch v := param.(type) { // nolint:gocritic + case *paramSupportedExtensions: + for _, t := range v.ChunkTypes { + if t == ctForwardTSN { + a.log.Debugf("[%s] use ForwardTSN (on init)", a.name) + a.useForwardTSN = true + } + } + } + } + if !a.useForwardTSN { + a.log.Warnf("[%s] not using ForwardTSN (on init)", a.name) + } + + outbound := &packet{} + outbound.verificationTag = a.peerVerificationTag + outbound.sourcePort = a.sourcePort + outbound.destinationPort = a.destinationPort + + initAck := &chunkInitAck{} + + initAck.initialTSN = a.myNextTSN + initAck.numOutboundStreams = a.myMaxNumOutboundStreams + initAck.numInboundStreams = a.myMaxNumInboundStreams + initAck.initiateTag = a.myVerificationTag + initAck.advertisedReceiverWindowCredit = a.maxReceiveBufferSize + + if a.myCookie == nil { + var err error + if a.myCookie, err = newRandomStateCookie(); err != nil { + return nil, err + } + } + + initAck.params = []param{a.myCookie} + + setSupportedExtensions(&initAck.chunkInitCommon) + + outbound.chunks = []chunk{initAck} + + return pack(outbound), nil +} + +// The caller should hold the lock. +func (a *Association) handleInitAck(p *packet, i *chunkInitAck) error { + state := a.getState() + a.log.Debugf("[%s] chunkInitAck received in state '%s'", a.name, getAssociationStateString(state)) + if state != cookieWait { + // RFC 4960 + // 5.2.3. Unexpected INIT ACK + // If an INIT ACK is received by an endpoint in any state other than the + // COOKIE-WAIT state, the endpoint should discard the INIT ACK chunk. + // An unexpected INIT ACK usually indicates the processing of an old or + // duplicated INIT chunk. + return nil + } + + a.myMaxNumInboundStreams = min16(i.numInboundStreams, a.myMaxNumInboundStreams) + a.myMaxNumOutboundStreams = min16(i.numOutboundStreams, a.myMaxNumOutboundStreams) + a.peerVerificationTag = i.initiateTag + a.peerLastTSN = i.initialTSN - 1 + if a.sourcePort != p.destinationPort || + a.destinationPort != p.sourcePort { + a.log.Warnf("[%s] handleInitAck: port mismatch", a.name) + return nil + } + + a.setRWND(i.advertisedReceiverWindowCredit) + a.log.Debugf("[%s] initial rwnd=%d", a.name, a.RWND()) + + // RFC 4690 Sec 7.2.1 + // o The initial value of ssthresh MAY be arbitrarily high (for + // example, implementations MAY use the size of the receiver + // advertised window). + a.ssthresh = a.RWND() + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (INI)", + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) + + a.t1Init.stop() + a.storedInit = nil + + var cookieParam *paramStateCookie + for _, param := range i.params { + switch v := param.(type) { + case *paramStateCookie: + cookieParam = v + case *paramSupportedExtensions: + for _, t := range v.ChunkTypes { + if t == ctForwardTSN { + a.log.Debugf("[%s] use ForwardTSN (on initAck)", a.name) + a.useForwardTSN = true + } + } + } + } + if !a.useForwardTSN { + a.log.Warnf("[%s] not using ForwardTSN (on initAck)", a.name) + } + if cookieParam == nil { + return ErrInitAckNoCookie + } + + a.storedCookieEcho = &chunkCookieEcho{} + a.storedCookieEcho.cookie = cookieParam.cookie + + err := a.sendCookieEcho() + if err != nil { + a.log.Errorf("[%s] failed to send init: %s", a.name, err.Error()) + } + + a.t1Cookie.start(a.rtoMgr.getRTO()) + a.setState(cookieEchoed) + return nil +} + +// The caller should hold the lock. +func (a *Association) handleHeartbeat(c *chunkHeartbeat) []*packet { + a.log.Tracef("[%s] chunkHeartbeat", a.name) + hbi, ok := c.params[0].(*paramHeartbeatInfo) + if !ok { + a.log.Warnf("[%s] failed to handle Heartbeat, no ParamHeartbeatInfo", a.name) + } + + return pack(&packet{ + verificationTag: a.peerVerificationTag, + sourcePort: a.sourcePort, + destinationPort: a.destinationPort, + chunks: []chunk{&chunkHeartbeatAck{ + params: []param{ + ¶mHeartbeatInfo{ + heartbeatInformation: hbi.heartbeatInformation, + }, + }, + }}, + }) +} + +// The caller should hold the lock. +func (a *Association) handleCookieEcho(c *chunkCookieEcho) []*packet { + state := a.getState() + a.log.Debugf("[%s] COOKIE-ECHO received in state '%s'", a.name, getAssociationStateString(state)) + + if a.myCookie == nil { + a.log.Debugf("[%s] COOKIE-ECHO received before initialization", a.name) + return nil + } + switch state { + default: + return nil + case established: + if !bytes.Equal(a.myCookie.cookie, c.cookie) { + return nil + } + case closed, cookieWait, cookieEchoed: + if !bytes.Equal(a.myCookie.cookie, c.cookie) { + return nil + } + + a.t1Init.stop() + a.storedInit = nil + + a.t1Cookie.stop() + a.storedCookieEcho = nil + + a.setState(established) + a.handshakeCompletedCh <- nil + } + + p := &packet{ + verificationTag: a.peerVerificationTag, + sourcePort: a.sourcePort, + destinationPort: a.destinationPort, + chunks: []chunk{&chunkCookieAck{}}, + } + return pack(p) +} + +// The caller should hold the lock. +func (a *Association) handleCookieAck() { + state := a.getState() + a.log.Debugf("[%s] COOKIE-ACK received in state '%s'", a.name, getAssociationStateString(state)) + if state != cookieEchoed { + // RFC 4960 + // 5.2.5. Handle Duplicate COOKIE-ACK. + // At any state other than COOKIE-ECHOED, an endpoint should silently + // discard a received COOKIE ACK chunk. + return + } + + a.t1Cookie.stop() + a.storedCookieEcho = nil + + a.setState(established) + a.handshakeCompletedCh <- nil +} + +// The caller should hold the lock. +func (a *Association) handleData(d *chunkPayloadData) []*packet { + a.log.Tracef("[%s] DATA: tsn=%d immediateSack=%v len=%d", + a.name, d.tsn, d.immediateSack, len(d.userData)) + a.stats.incDATAs() + + canPush := a.payloadQueue.canPush(d, a.peerLastTSN) + if canPush { + s := a.getOrCreateStream(d.streamIdentifier, true, PayloadTypeUnknown) + if s == nil { + // silentely discard the data. (sender will retry on T3-rtx timeout) + // see pion/sctp#30 + a.log.Debugf("discard %d", d.streamSequenceNumber) + return nil + } + + if a.getMyReceiverWindowCredit() > 0 { + // Pass the new chunk to stream level as soon as it arrives + a.payloadQueue.push(d, a.peerLastTSN) + s.handleData(d) + } else { + // Receive buffer is full + lastTSN, ok := a.payloadQueue.getLastTSNReceived() + if ok && sna32LT(d.tsn, lastTSN) { + a.log.Debugf("[%s] receive buffer full, but accepted as this is a missing chunk with tsn=%d ssn=%d", a.name, d.tsn, d.streamSequenceNumber) + a.payloadQueue.push(d, a.peerLastTSN) + s.handleData(d) + } else { + a.log.Debugf("[%s] receive buffer full. dropping DATA with tsn=%d ssn=%d", a.name, d.tsn, d.streamSequenceNumber) + } + } + } + + return a.handlePeerLastTSNAndAcknowledgement(d.immediateSack) +} + +// A common routine for handleData and handleForwardTSN routines +// The caller should hold the lock. +func (a *Association) handlePeerLastTSNAndAcknowledgement(sackImmediately bool) []*packet { + var reply []*packet + + // Try to advance peerLastTSN + + // From RFC 3758 Sec 3.6: + // .. and then MUST further advance its cumulative TSN point locally + // if possible + // Meaning, if peerLastTSN+1 points to a chunk that is received, + // advance peerLastTSN until peerLastTSN+1 points to unreceived chunk. + for { + if _, popOk := a.payloadQueue.pop(a.peerLastTSN + 1); !popOk { + break + } + a.peerLastTSN++ + + for _, rstReq := range a.reconfigRequests { + resp := a.resetStreamsIfAny(rstReq) + if resp != nil { + a.log.Debugf("[%s] RESET RESPONSE: %+v", a.name, resp) + reply = append(reply, resp) + } + } + } + + hasPacketLoss := (a.payloadQueue.size() > 0) + if hasPacketLoss { + a.log.Tracef("[%s] packetloss: %s", a.name, a.payloadQueue.getGapAckBlocksString(a.peerLastTSN)) + } + + if (a.ackState != ackStateImmediate && !sackImmediately && !hasPacketLoss && a.ackMode == ackModeNormal) || a.ackMode == ackModeAlwaysDelay { + if a.ackState == ackStateIdle { + a.delayedAckTriggered = true + } else { + a.immediateAckTriggered = true + } + } else { + a.immediateAckTriggered = true + } + + return reply +} + +// The caller should hold the lock. +func (a *Association) getMyReceiverWindowCredit() uint32 { + var bytesQueued uint32 + for _, s := range a.streams { + bytesQueued += uint32(s.getNumBytesInReassemblyQueue()) + } + + if bytesQueued >= a.maxReceiveBufferSize { + return 0 + } + return a.maxReceiveBufferSize - bytesQueued +} + +// OpenStream opens a stream +func (a *Association) OpenStream(streamIdentifier uint16, defaultPayloadType PayloadProtocolIdentifier) (*Stream, error) { + a.lock.Lock() + defer a.lock.Unlock() + + return a.getOrCreateStream(streamIdentifier, false, defaultPayloadType), nil +} + +// AcceptStream accepts a stream +func (a *Association) AcceptStream() (*Stream, error) { + s, ok := <-a.acceptCh + if !ok { + return nil, io.EOF // no more incoming streams + } + return s, nil +} + +// createStream creates a stream. The caller should hold the lock and check no stream exists for this id. +func (a *Association) createStream(streamIdentifier uint16, accept bool) *Stream { + s := &Stream{ + association: a, + streamIdentifier: streamIdentifier, + reassemblyQueue: newReassemblyQueue(streamIdentifier), + log: a.log, + name: fmt.Sprintf("%d:%s", streamIdentifier, a.name), + } + + s.readNotifier = sync.NewCond(&s.lock) + + if accept { + select { + case a.acceptCh <- s: + a.streams[streamIdentifier] = s + a.log.Debugf("[%s] accepted a new stream (streamIdentifier: %d)", + a.name, streamIdentifier) + default: + a.log.Debugf("[%s] dropped a new stream (acceptCh size: %d)", + a.name, len(a.acceptCh)) + return nil + } + } else { + a.streams[streamIdentifier] = s + } + + return s +} + +// getOrCreateStream gets or creates a stream. The caller should hold the lock. +func (a *Association) getOrCreateStream(streamIdentifier uint16, accept bool, defaultPayloadType PayloadProtocolIdentifier) *Stream { + if s, ok := a.streams[streamIdentifier]; ok { + s.SetDefaultPayloadType(defaultPayloadType) + return s + } + + s := a.createStream(streamIdentifier, accept) + if s != nil { + s.SetDefaultPayloadType(defaultPayloadType) + } + return s +} + +// The caller should hold the lock. +func (a *Association) processSelectiveAck(d *chunkSelectiveAck) (map[uint16]int, uint32, error) { // nolint:gocognit + bytesAckedPerStream := map[uint16]int{} + + // New ack point, so pop all ACKed packets from inflightQueue + // We add 1 because the "currentAckPoint" has already been popped from the inflight queue + // For the first SACK we take care of this by setting the ackpoint to cumAck - 1 + for i := a.cumulativeTSNAckPoint + 1; sna32LTE(i, d.cumulativeTSNAck); i++ { + c, ok := a.inflightQueue.pop(i) + if !ok { + return nil, 0, fmt.Errorf("%w: %v", ErrInflightQueueTSNPop, i) + } + + if !c.acked { + // RFC 4096 sec 6.3.2. Retransmission Timer Rules + // R3) Whenever a SACK is received that acknowledges the DATA chunk + // with the earliest outstanding TSN for that address, restart the + // T3-rtx timer for that address with its current RTO (if there is + // still outstanding data on that address). + if i == a.cumulativeTSNAckPoint+1 { + // T3 timer needs to be reset. Stop it for now. + a.t3RTX.stop() + } + + nBytesAcked := len(c.userData) + + // Sum the number of bytes acknowledged per stream + if amount, ok := bytesAckedPerStream[c.streamIdentifier]; ok { + bytesAckedPerStream[c.streamIdentifier] = amount + nBytesAcked + } else { + bytesAckedPerStream[c.streamIdentifier] = nBytesAcked + } + + // RFC 4960 sec 6.3.1. RTO Calculation + // C4) When data is in flight and when allowed by rule C5 below, a new + // RTT measurement MUST be made each round trip. Furthermore, new + // RTT measurements SHOULD be made no more than once per round trip + // for a given destination transport address. + // C5) Karn's algorithm: RTT measurements MUST NOT be made using + // packets that were retransmitted (and thus for which it is + // ambiguous whether the reply was for the first instance of the + // chunk or for a later instance) + if c.nSent == 1 && sna32GTE(c.tsn, a.minTSN2MeasureRTT) { + a.minTSN2MeasureRTT = a.myNextTSN + rtt := time.Since(c.since).Seconds() * 1000.0 + srtt := a.rtoMgr.setNewRTT(rtt) + a.srtt.Store(srtt) + a.log.Tracef("[%s] SACK: measured-rtt=%f srtt=%f new-rto=%f", + a.name, rtt, srtt, a.rtoMgr.getRTO()) + } + } + + if a.inFastRecovery && c.tsn == a.fastRecoverExitPoint { + a.log.Debugf("[%s] exit fast-recovery", a.name) + a.inFastRecovery = false + } + } + + htna := d.cumulativeTSNAck + + // Mark selectively acknowledged chunks as "acked" + for _, g := range d.gapAckBlocks { + for i := g.start; i <= g.end; i++ { + tsn := d.cumulativeTSNAck + uint32(i) + c, ok := a.inflightQueue.get(tsn) + if !ok { + return nil, 0, fmt.Errorf("%w: %v", ErrTSNRequestNotExist, tsn) + } + + if !c.acked { + nBytesAcked := a.inflightQueue.markAsAcked(tsn) + + // Sum the number of bytes acknowledged per stream + if amount, ok := bytesAckedPerStream[c.streamIdentifier]; ok { + bytesAckedPerStream[c.streamIdentifier] = amount + nBytesAcked + } else { + bytesAckedPerStream[c.streamIdentifier] = nBytesAcked + } + + a.log.Tracef("[%s] tsn=%d has been sacked", a.name, c.tsn) + + if c.nSent == 1 { + a.minTSN2MeasureRTT = a.myNextTSN + rtt := time.Since(c.since).Seconds() * 1000.0 + srtt := a.rtoMgr.setNewRTT(rtt) + a.srtt.Store(srtt) + a.log.Tracef("[%s] SACK: measured-rtt=%f srtt=%f new-rto=%f", + a.name, rtt, srtt, a.rtoMgr.getRTO()) + } + + if sna32LT(htna, tsn) { + htna = tsn + } + } + } + } + + return bytesAckedPerStream, htna, nil +} + +// The caller should hold the lock. +func (a *Association) onCumulativeTSNAckPointAdvanced(totalBytesAcked int) { + // RFC 4096, sec 6.3.2. Retransmission Timer Rules + // R2) Whenever all outstanding data sent to an address have been + // acknowledged, turn off the T3-rtx timer of that address. + if a.inflightQueue.size() == 0 { + a.log.Tracef("[%s] SACK: no more packet in-flight (pending=%d)", a.name, a.pendingQueue.size()) + a.t3RTX.stop() + } else { + a.log.Tracef("[%s] T3-rtx timer start (pt2)", a.name) + a.t3RTX.start(a.rtoMgr.getRTO()) + } + + // Update congestion control parameters + if a.CWND() <= a.ssthresh { + // RFC 4096, sec 7.2.1. Slow-Start + // o When cwnd is less than or equal to ssthresh, an SCTP endpoint MUST + // use the slow-start algorithm to increase cwnd only if the current + // congestion window is being fully utilized, an incoming SACK + // advances the Cumulative TSN Ack Point, and the data sender is not + // in Fast Recovery. Only when these three conditions are met can + // the cwnd be increased; otherwise, the cwnd MUST not be increased. + // If these conditions are met, then cwnd MUST be increased by, at + // most, the lesser of 1) the total size of the previously + // outstanding DATA chunk(s) acknowledged, and 2) the destination's + // path MTU. + if !a.inFastRecovery && + a.pendingQueue.size() > 0 { + a.setCWND(a.CWND() + min32(uint32(totalBytesAcked), a.CWND())) + // a.cwnd += min32(uint32(totalBytesAcked), a.MTU()) // SCTP way (slow) + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d acked=%d (SS)", + a.name, a.CWND(), a.ssthresh, totalBytesAcked) + } else { + a.log.Tracef("[%s] cwnd did not grow: cwnd=%d ssthresh=%d acked=%d FR=%v pending=%d", + a.name, a.CWND(), a.ssthresh, totalBytesAcked, a.inFastRecovery, a.pendingQueue.size()) + } + } else { + // RFC 4096, sec 7.2.2. Congestion Avoidance + // o Whenever cwnd is greater than ssthresh, upon each SACK arrival + // that advances the Cumulative TSN Ack Point, increase + // partial_bytes_acked by the total number of bytes of all new chunks + // acknowledged in that SACK including chunks acknowledged by the new + // Cumulative TSN Ack and by Gap Ack Blocks. + a.partialBytesAcked += uint32(totalBytesAcked) + + // o When partial_bytes_acked is equal to or greater than cwnd and + // before the arrival of the SACK the sender had cwnd or more bytes + // of data outstanding (i.e., before arrival of the SACK, flight size + // was greater than or equal to cwnd), increase cwnd by MTU, and + // reset partial_bytes_acked to (partial_bytes_acked - cwnd). + if a.partialBytesAcked >= a.CWND() && a.pendingQueue.size() > 0 { + a.partialBytesAcked -= a.CWND() + a.setCWND(a.CWND() + a.MTU()) + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d acked=%d (CA)", + a.name, a.CWND(), a.ssthresh, totalBytesAcked) + } + } +} + +// The caller should hold the lock. +func (a *Association) processFastRetransmission(cumTSNAckPoint, htna uint32, cumTSNAckPointAdvanced bool) error { + // HTNA algorithm - RFC 4960 Sec 7.2.4 + // Increment missIndicator of each chunks that the SACK reported missing + // when either of the following is met: + // a) Not in fast-recovery + // miss indications are incremented only for missing TSNs prior to the + // highest TSN newly acknowledged in the SACK. + // b) In fast-recovery AND the Cumulative TSN Ack Point advanced + // the miss indications are incremented for all TSNs reported missing + // in the SACK. + if !a.inFastRecovery || (a.inFastRecovery && cumTSNAckPointAdvanced) { + var maxTSN uint32 + if !a.inFastRecovery { + // a) increment only for missing TSNs prior to the HTNA + maxTSN = htna + } else { + // b) increment for all TSNs reported missing + maxTSN = cumTSNAckPoint + uint32(a.inflightQueue.size()) + 1 + } + + for tsn := cumTSNAckPoint + 1; sna32LT(tsn, maxTSN); tsn++ { + c, ok := a.inflightQueue.get(tsn) + if !ok { + return fmt.Errorf("%w: %v", ErrTSNRequestNotExist, tsn) + } + if !c.acked && !c.abandoned() && c.missIndicator < 3 { + c.missIndicator++ + if c.missIndicator == 3 { + if !a.inFastRecovery { + // 2) If not in Fast Recovery, adjust the ssthresh and cwnd of the + // destination address(es) to which the missing DATA chunks were + // last sent, according to the formula described in Section 7.2.3. + a.inFastRecovery = true + a.fastRecoverExitPoint = htna + a.ssthresh = max32(a.CWND()/2, 4*a.MTU()) + a.setCWND(a.ssthresh) + a.partialBytesAcked = 0 + a.willRetransmitFast = true + + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (FR)", + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) + } + } + } + } + } + + if a.inFastRecovery && cumTSNAckPointAdvanced { + a.willRetransmitFast = true + } + + return nil +} + +// The caller should hold the lock. +func (a *Association) handleSack(d *chunkSelectiveAck) error { + a.log.Tracef("[%s] SACK: cumTSN=%d a_rwnd=%d", a.name, d.cumulativeTSNAck, d.advertisedReceiverWindowCredit) + state := a.getState() + if state != established && state != shutdownPending && state != shutdownReceived { + return nil + } + + a.stats.incSACKs() + + if sna32GT(a.cumulativeTSNAckPoint, d.cumulativeTSNAck) { + // RFC 4960 sec 6.2.1. Processing a Received SACK + // D) + // i) If Cumulative TSN Ack is less than the Cumulative TSN Ack + // Point, then drop the SACK. Since Cumulative TSN Ack is + // monotonically increasing, a SACK whose Cumulative TSN Ack is + // less than the Cumulative TSN Ack Point indicates an out-of- + // order SACK. + + a.log.Debugf("[%s] SACK Cumulative ACK %v is older than ACK point %v", + a.name, + d.cumulativeTSNAck, + a.cumulativeTSNAckPoint) + + return nil + } + + // Process selective ack + bytesAckedPerStream, htna, err := a.processSelectiveAck(d) + if err != nil { + return err + } + + var totalBytesAcked int + for _, nBytesAcked := range bytesAckedPerStream { + totalBytesAcked += nBytesAcked + } + + cumTSNAckPointAdvanced := false + if sna32LT(a.cumulativeTSNAckPoint, d.cumulativeTSNAck) { + a.log.Tracef("[%s] SACK: cumTSN advanced: %d -> %d", + a.name, + a.cumulativeTSNAckPoint, + d.cumulativeTSNAck) + + a.cumulativeTSNAckPoint = d.cumulativeTSNAck + cumTSNAckPointAdvanced = true + a.onCumulativeTSNAckPointAdvanced(totalBytesAcked) + } + + for si, nBytesAcked := range bytesAckedPerStream { + if s, ok := a.streams[si]; ok { + a.lock.Unlock() + s.onBufferReleased(nBytesAcked) + a.lock.Lock() + } + } + + // New rwnd value + // RFC 4960 sec 6.2.1. Processing a Received SACK + // D) + // ii) Set rwnd equal to the newly received a_rwnd minus the number + // of bytes still outstanding after processing the Cumulative + // TSN Ack and the Gap Ack Blocks. + + // bytes acked were already subtracted by markAsAcked() method + bytesOutstanding := uint32(a.inflightQueue.getNumBytes()) + if bytesOutstanding >= d.advertisedReceiverWindowCredit { + a.setRWND(0) + } else { + a.setRWND(d.advertisedReceiverWindowCredit - bytesOutstanding) + } + + err = a.processFastRetransmission(d.cumulativeTSNAck, htna, cumTSNAckPointAdvanced) + if err != nil { + return err + } + + if a.useForwardTSN { + // RFC 3758 Sec 3.5 C1 + if sna32LT(a.advancedPeerTSNAckPoint, a.cumulativeTSNAckPoint) { + a.advancedPeerTSNAckPoint = a.cumulativeTSNAckPoint + } + + // RFC 3758 Sec 3.5 C2 + for i := a.advancedPeerTSNAckPoint + 1; ; i++ { + c, ok := a.inflightQueue.get(i) + if !ok { + break + } + if !c.abandoned() { + break + } + a.advancedPeerTSNAckPoint = i + } + + // RFC 3758 Sec 3.5 C3 + if sna32GT(a.advancedPeerTSNAckPoint, a.cumulativeTSNAckPoint) { + a.willSendForwardTSN = true + } + a.awakeWriteLoop() + } + + a.postprocessSack(state, cumTSNAckPointAdvanced) + + return nil +} + +// The caller must hold the lock. This method was only added because the +// linter was complaining about the "cognitive complexity" of handleSack. +func (a *Association) postprocessSack(state uint32, shouldAwakeWriteLoop bool) { + switch { + case a.inflightQueue.size() > 0: + // Start timer. (noop if already started) + a.log.Tracef("[%s] T3-rtx timer start (pt3)", a.name) + a.t3RTX.start(a.rtoMgr.getRTO()) + case state == shutdownPending: + // No more outstanding, send shutdown. + shouldAwakeWriteLoop = true + a.willSendShutdown = true + a.setState(shutdownSent) + case state == shutdownReceived: + // No more outstanding, send shutdown ack. + shouldAwakeWriteLoop = true + a.willSendShutdownAck = true + a.setState(shutdownAckSent) + } + + if shouldAwakeWriteLoop { + a.awakeWriteLoop() + } +} + +// The caller should hold the lock. +func (a *Association) handleShutdown(_ *chunkShutdown) { + state := a.getState() + + switch state { + case established: + if a.inflightQueue.size() > 0 { + a.setState(shutdownReceived) + } else { + // No more outstanding, send shutdown ack. + a.willSendShutdownAck = true + a.setState(shutdownAckSent) + + a.awakeWriteLoop() + } + + // a.cumulativeTSNAckPoint = c.cumulativeTSNAck + case shutdownSent: + a.willSendShutdownAck = true + a.setState(shutdownAckSent) + + a.awakeWriteLoop() + } +} + +// The caller should hold the lock. +func (a *Association) handleShutdownAck(_ *chunkShutdownAck) { + state := a.getState() + if state == shutdownSent || state == shutdownAckSent { + a.t2Shutdown.stop() + a.willSendShutdownComplete = true + + a.awakeWriteLoop() + } +} + +func (a *Association) handleShutdownComplete(_ *chunkShutdownComplete) error { + state := a.getState() + if state == shutdownAckSent { + a.t2Shutdown.stop() + + return a.close() + } + + return nil +} + +func (a *Association) handleAbort(c *chunkAbort) error { + var errStr string + for _, e := range c.errorCauses { + errStr += fmt.Sprintf("(%s)", e) + } + + _ = a.close() + + return fmt.Errorf("[%s] %w: %s", a.name, ErrChunk, errStr) +} + +// createForwardTSN generates ForwardTSN chunk. +// This method will be be called if useForwardTSN is set to false. +// The caller should hold the lock. +func (a *Association) createForwardTSN() *chunkForwardTSN { + // RFC 3758 Sec 3.5 C4 + streamMap := map[uint16]uint16{} // to report only once per SI + for i := a.cumulativeTSNAckPoint + 1; sna32LTE(i, a.advancedPeerTSNAckPoint); i++ { + c, ok := a.inflightQueue.get(i) + if !ok { + break + } + + ssn, ok := streamMap[c.streamIdentifier] + if !ok { + streamMap[c.streamIdentifier] = c.streamSequenceNumber + } else if sna16LT(ssn, c.streamSequenceNumber) { + // to report only once with greatest SSN + streamMap[c.streamIdentifier] = c.streamSequenceNumber + } + } + + fwdtsn := &chunkForwardTSN{ + newCumulativeTSN: a.advancedPeerTSNAckPoint, + streams: []chunkForwardTSNStream{}, + } + + var streamStr string + for si, ssn := range streamMap { + streamStr += fmt.Sprintf("(si=%d ssn=%d)", si, ssn) + fwdtsn.streams = append(fwdtsn.streams, chunkForwardTSNStream{ + identifier: si, + sequence: ssn, + }) + } + a.log.Tracef("[%s] building fwdtsn: newCumulativeTSN=%d cumTSN=%d - %s", a.name, fwdtsn.newCumulativeTSN, a.cumulativeTSNAckPoint, streamStr) + + return fwdtsn +} + +// createPacket wraps chunks in a packet. +// The caller should hold the read lock. +func (a *Association) createPacket(cs []chunk) *packet { + return &packet{ + verificationTag: a.peerVerificationTag, + sourcePort: a.sourcePort, + destinationPort: a.destinationPort, + chunks: cs, + } +} + +// The caller should hold the lock. +func (a *Association) handleReconfig(c *chunkReconfig) ([]*packet, error) { + a.log.Tracef("[%s] handleReconfig", a.name) + + pp := make([]*packet, 0) + + p, err := a.handleReconfigParam(c.paramA) + if err != nil { + return nil, err + } + if p != nil { + pp = append(pp, p) + } + + if c.paramB != nil { + p, err = a.handleReconfigParam(c.paramB) + if err != nil { + return nil, err + } + if p != nil { + pp = append(pp, p) + } + } + return pp, nil +} + +// The caller should hold the lock. +func (a *Association) handleForwardTSN(c *chunkForwardTSN) []*packet { + a.log.Tracef("[%s] FwdTSN: %s", a.name, c.String()) + + if !a.useForwardTSN { + a.log.Warn("[%s] received FwdTSN but not enabled") + // Return an error chunk + cerr := &chunkError{ + errorCauses: []errorCause{&errorCauseUnrecognizedChunkType{}}, + } + outbound := &packet{} + outbound.verificationTag = a.peerVerificationTag + outbound.sourcePort = a.sourcePort + outbound.destinationPort = a.destinationPort + outbound.chunks = []chunk{cerr} + return []*packet{outbound} + } + + // From RFC 3758 Sec 3.6: + // Note, if the "New Cumulative TSN" value carried in the arrived + // FORWARD TSN chunk is found to be behind or at the current cumulative + // TSN point, the data receiver MUST treat this FORWARD TSN as out-of- + // date and MUST NOT update its Cumulative TSN. The receiver SHOULD + // send a SACK to its peer (the sender of the FORWARD TSN) since such a + // duplicate may indicate the previous SACK was lost in the network. + + a.log.Tracef("[%s] should send ack? newCumTSN=%d peerLastTSN=%d", + a.name, c.newCumulativeTSN, a.peerLastTSN) + if sna32LTE(c.newCumulativeTSN, a.peerLastTSN) { + a.log.Tracef("[%s] sending ack on Forward TSN", a.name) + a.ackState = ackStateImmediate + a.ackTimer.stop() + a.awakeWriteLoop() + return nil + } + + // From RFC 3758 Sec 3.6: + // the receiver MUST perform the same TSN handling, including duplicate + // detection, gap detection, SACK generation, cumulative TSN + // advancement, etc. as defined in RFC 2960 [2]---with the following + // exceptions and additions. + + // When a FORWARD TSN chunk arrives, the data receiver MUST first update + // its cumulative TSN point to the value carried in the FORWARD TSN + // chunk, + + // Advance peerLastTSN + for sna32LT(a.peerLastTSN, c.newCumulativeTSN) { + a.payloadQueue.pop(a.peerLastTSN + 1) // may not exist + a.peerLastTSN++ + } + + // Report new peerLastTSN value and abandoned largest SSN value to + // corresponding streams so that the abandoned chunks can be removed + // from the reassemblyQueue. + for _, forwarded := range c.streams { + if s, ok := a.streams[forwarded.identifier]; ok { + s.handleForwardTSNForOrdered(forwarded.sequence) + } + } + + // TSN may be forewared for unordered chunks. ForwardTSN chunk does not + // report which stream identifier it skipped for unordered chunks. + // Therefore, we need to broadcast this event to all existing streams for + // unordered chunks. + // See https://github.com/pion/sctp/issues/106 + for _, s := range a.streams { + s.handleForwardTSNForUnordered(c.newCumulativeTSN) + } + + return a.handlePeerLastTSNAndAcknowledgement(false) +} + +func (a *Association) sendResetRequest(streamIdentifier uint16) error { + a.lock.Lock() + defer a.lock.Unlock() + + state := a.getState() + if state != established { + return fmt.Errorf("%w: state=%s", ErrResetPacketInStateNotExist, + getAssociationStateString(state)) + } + + // Create DATA chunk which only contains valid stream identifier with + // nil userData and use it as a EOS from the stream. + c := &chunkPayloadData{ + streamIdentifier: streamIdentifier, + beginningFragment: true, + endingFragment: true, + userData: nil, + } + + a.pendingQueue.push(c) + a.awakeWriteLoop() + return nil +} + +// The caller should hold the lock. +func (a *Association) handleReconfigParam(raw param) (*packet, error) { + switch p := raw.(type) { + case *paramOutgoingResetRequest: + a.log.Tracef("[%s] handleReconfigParam (OutgoingResetRequest)", a.name) + a.reconfigRequests[p.reconfigRequestSequenceNumber] = p + resp := a.resetStreamsIfAny(p) + if resp != nil { + return resp, nil + } + return nil, nil //nolint:nilnil + + case *paramReconfigResponse: + a.log.Tracef("[%s] handleReconfigParam (ReconfigResponse)", a.name) + delete(a.reconfigs, p.reconfigResponseSequenceNumber) + if len(a.reconfigs) == 0 { + a.tReconfig.stop() + } + return nil, nil //nolint:nilnil + default: + return nil, fmt.Errorf("%w: %t", ErrParamterType, p) + } +} + +// The caller should hold the lock. +func (a *Association) resetStreamsIfAny(p *paramOutgoingResetRequest) *packet { + result := reconfigResultSuccessPerformed + if sna32LTE(p.senderLastTSN, a.peerLastTSN) { + a.log.Debugf("[%s] resetStream(): senderLastTSN=%d <= peerLastTSN=%d", + a.name, p.senderLastTSN, a.peerLastTSN) + for _, id := range p.streamIdentifiers { + s, ok := a.streams[id] + if !ok { + continue + } + a.lock.Unlock() + s.onInboundStreamReset() + a.lock.Lock() + a.log.Debugf("[%s] deleting stream %d", a.name, id) + delete(a.streams, s.streamIdentifier) + } + delete(a.reconfigRequests, p.reconfigRequestSequenceNumber) + } else { + a.log.Debugf("[%s] resetStream(): senderLastTSN=%d > peerLastTSN=%d", + a.name, p.senderLastTSN, a.peerLastTSN) + result = reconfigResultInProgress + } + + return a.createPacket([]chunk{&chunkReconfig{ + paramA: ¶mReconfigResponse{ + reconfigResponseSequenceNumber: p.reconfigRequestSequenceNumber, + result: result, + }, + }}) +} + +// Move the chunk peeked with a.pendingQueue.peek() to the inflightQueue. +// The caller should hold the lock. +func (a *Association) movePendingDataChunkToInflightQueue(c *chunkPayloadData) { + if err := a.pendingQueue.pop(c); err != nil { + a.log.Errorf("[%s] failed to pop from pending queue: %s", a.name, err.Error()) + } + + // Mark all fragements are in-flight now + if c.endingFragment { + c.setAllInflight() + } + + // Assign TSN + c.tsn = a.generateNextTSN() + + c.since = time.Now() // use to calculate RTT and also for maxPacketLifeTime + c.nSent = 1 // being sent for the first time + + a.checkPartialReliabilityStatus(c) + + a.log.Tracef("[%s] sending ppi=%d tsn=%d ssn=%d sent=%d len=%d (%v,%v)", + a.name, c.payloadType, c.tsn, c.streamSequenceNumber, c.nSent, len(c.userData), c.beginningFragment, c.endingFragment) + + a.inflightQueue.pushNoCheck(c) +} + +// popPendingDataChunksToSend pops chunks from the pending queues as many as +// the cwnd and rwnd allows to send. +// The caller should hold the lock. +func (a *Association) popPendingDataChunksToSend() ([]*chunkPayloadData, []uint16) { + chunks := []*chunkPayloadData{} + var sisToReset []uint16 // stream identifieres to reset + + if a.pendingQueue.size() > 0 { + // RFC 4960 sec 6.1. Transmission of DATA Chunks + // A) At any given time, the data sender MUST NOT transmit new data to + // any destination transport address if its peer's rwnd indicates + // that the peer has no buffer space (i.e., rwnd is 0; see Section + // 6.2.1). However, regardless of the value of rwnd (including if it + // is 0), the data sender can always have one DATA chunk in flight to + // the receiver if allowed by cwnd (see rule B, below). + + for { + c := a.pendingQueue.peek() + if c == nil { + break // no more pending data + } + + dataLen := uint32(len(c.userData)) + if dataLen == 0 { + sisToReset = append(sisToReset, c.streamIdentifier) + err := a.pendingQueue.pop(c) + if err != nil { + a.log.Errorf("failed to pop from pending queue: %s", err.Error()) + } + continue + } + + if uint32(a.inflightQueue.getNumBytes())+dataLen > a.CWND() { + break // would exceeds cwnd + } + + if dataLen > a.rwnd { + break // no more rwnd + } + + a.setRWND(a.RWND() - dataLen) + + a.movePendingDataChunkToInflightQueue(c) + chunks = append(chunks, c) + } + + // the data sender can always have one DATA chunk in flight to the receiver + if len(chunks) == 0 && a.inflightQueue.size() == 0 { + // Send zero window probe + c := a.pendingQueue.peek() + if c != nil { + a.movePendingDataChunkToInflightQueue(c) + chunks = append(chunks, c) + } + } + } + + return chunks, sisToReset +} + +// bundleDataChunksIntoPackets packs DATA chunks into packets. It tries to bundle +// DATA chunks into a packet so long as the resulting packet size does not exceed +// the path MTU. +// The caller should hold the lock. +func (a *Association) bundleDataChunksIntoPackets(chunks []*chunkPayloadData) []*packet { + packets := []*packet{} + chunksToSend := []chunk{} + bytesInPacket := int(commonHeaderSize) + + for _, c := range chunks { + // RFC 4960 sec 6.1. Transmission of DATA Chunks + // Multiple DATA chunks committed for transmission MAY be bundled in a + // single packet. Furthermore, DATA chunks being retransmitted MAY be + // bundled with new DATA chunks, as long as the resulting packet size + // does not exceed the path MTU. + if bytesInPacket+len(c.userData) > int(a.MTU()) { + packets = append(packets, a.createPacket(chunksToSend)) + chunksToSend = []chunk{} + bytesInPacket = int(commonHeaderSize) + } + + chunksToSend = append(chunksToSend, c) + bytesInPacket += int(dataChunkHeaderSize) + len(c.userData) + } + + if len(chunksToSend) > 0 { + packets = append(packets, a.createPacket(chunksToSend)) + } + + return packets +} + +// sendPayloadData sends the data chunks. +func (a *Association) sendPayloadData(chunks []*chunkPayloadData) error { + a.lock.Lock() + defer a.lock.Unlock() + + state := a.getState() + if state != established { + return fmt.Errorf("%w: state=%s", ErrPayloadDataStateNotExist, + getAssociationStateString(state)) + } + + // Push the chunks into the pending queue first. + for _, c := range chunks { + a.pendingQueue.push(c) + } + + a.awakeWriteLoop() + return nil +} + +// The caller should hold the lock. +func (a *Association) checkPartialReliabilityStatus(c *chunkPayloadData) { + if !a.useForwardTSN { + return + } + + // draft-ietf-rtcweb-data-protocol-09.txt section 6 + // 6. Procedures + // All Data Channel Establishment Protocol messages MUST be sent using + // ordered delivery and reliable transmission. + // + if c.payloadType == PayloadTypeWebRTCDCEP { + return + } + + // PR-SCTP + if s, ok := a.streams[c.streamIdentifier]; ok { + s.lock.RLock() + if s.reliabilityType == ReliabilityTypeRexmit { + if c.nSent >= s.reliabilityValue { + c.setAbandoned(true) + a.log.Tracef("[%s] marked as abandoned: tsn=%d ppi=%d (remix: %d)", a.name, c.tsn, c.payloadType, c.nSent) + } + } else if s.reliabilityType == ReliabilityTypeTimed { + elapsed := int64(time.Since(c.since).Seconds() * 1000) + if elapsed >= int64(s.reliabilityValue) { + c.setAbandoned(true) + a.log.Tracef("[%s] marked as abandoned: tsn=%d ppi=%d (timed: %d)", a.name, c.tsn, c.payloadType, elapsed) + } + } + s.lock.RUnlock() + } else { + a.log.Errorf("[%s] stream %d not found)", a.name, c.streamIdentifier) + } +} + +// getDataPacketsToRetransmit is called when T3-rtx is timed out and retransmit outstanding data chunks +// that are not acked or abandoned yet. +// The caller should hold the lock. +func (a *Association) getDataPacketsToRetransmit() []*packet { + awnd := min32(a.CWND(), a.RWND()) + chunks := []*chunkPayloadData{} + var bytesToSend int + var done bool + + for i := 0; !done; i++ { + c, ok := a.inflightQueue.get(a.cumulativeTSNAckPoint + uint32(i) + 1) + if !ok { + break // end of pending data + } + + if !c.retransmit { + continue + } + + if i == 0 && int(a.RWND()) < len(c.userData) { + // Send it as a zero window probe + done = true + } else if bytesToSend+len(c.userData) > int(awnd) { + break + } + + // reset the retransmit flag not to retransmit again before the next + // t3-rtx timer fires + c.retransmit = false + bytesToSend += len(c.userData) + + c.nSent++ + + a.checkPartialReliabilityStatus(c) + + a.log.Tracef("[%s] retransmitting tsn=%d ssn=%d sent=%d", a.name, c.tsn, c.streamSequenceNumber, c.nSent) + + chunks = append(chunks, c) + } + + return a.bundleDataChunksIntoPackets(chunks) +} + +// generateNextTSN returns the myNextTSN and increases it. The caller should hold the lock. +// The caller should hold the lock. +func (a *Association) generateNextTSN() uint32 { + tsn := a.myNextTSN + a.myNextTSN++ + return tsn +} + +// generateNextRSN returns the myNextRSN and increases it. The caller should hold the lock. +// The caller should hold the lock. +func (a *Association) generateNextRSN() uint32 { + rsn := a.myNextRSN + a.myNextRSN++ + return rsn +} + +func (a *Association) createSelectiveAckChunk() *chunkSelectiveAck { + sack := &chunkSelectiveAck{} + sack.cumulativeTSNAck = a.peerLastTSN + sack.advertisedReceiverWindowCredit = a.getMyReceiverWindowCredit() + sack.duplicateTSN = a.payloadQueue.popDuplicates() + sack.gapAckBlocks = a.payloadQueue.getGapAckBlocks(a.peerLastTSN) + return sack +} + +func pack(p *packet) []*packet { + return []*packet{p} +} + +func (a *Association) handleChunkStart() { + a.lock.Lock() + defer a.lock.Unlock() + + a.delayedAckTriggered = false + a.immediateAckTriggered = false +} + +func (a *Association) handleChunkEnd() { + a.lock.Lock() + defer a.lock.Unlock() + + if a.immediateAckTriggered { + a.ackState = ackStateImmediate + a.ackTimer.stop() + a.awakeWriteLoop() + } else if a.delayedAckTriggered { + // Will send delayed ack in the next ack timeout + a.ackState = ackStateDelay + a.ackTimer.start() + } +} + +func (a *Association) handleChunk(p *packet, c chunk) error { + a.lock.Lock() + defer a.lock.Unlock() + + var packets []*packet + var err error + + if _, err = c.check(); err != nil { + a.log.Errorf("[ %s ] failed validating chunk: %s ", a.name, err) + return nil + } + + isAbort := false + + switch c := c.(type) { + case *chunkInit: + packets, err = a.handleInit(p, c) + + case *chunkInitAck: + err = a.handleInitAck(p, c) + + case *chunkAbort: + isAbort = true + err = a.handleAbort(c) + + case *chunkError: + var errStr string + for _, e := range c.errorCauses { + errStr += fmt.Sprintf("(%s)", e) + } + a.log.Debugf("[%s] Error chunk, with following errors: %s", a.name, errStr) + + case *chunkHeartbeat: + packets = a.handleHeartbeat(c) + + case *chunkCookieEcho: + packets = a.handleCookieEcho(c) + + case *chunkCookieAck: + a.handleCookieAck() + + case *chunkPayloadData: + packets = a.handleData(c) + + case *chunkSelectiveAck: + err = a.handleSack(c) + + case *chunkReconfig: + packets, err = a.handleReconfig(c) + + case *chunkForwardTSN: + packets = a.handleForwardTSN(c) + + case *chunkShutdown: + a.handleShutdown(c) + case *chunkShutdownAck: + a.handleShutdownAck(c) + case *chunkShutdownComplete: + err = a.handleShutdownComplete(c) + + default: + err = ErrChunkTypeUnhandled + } + + // Log and return, the only condition that is fatal is a ABORT chunk + if err != nil { + if isAbort { + return err + } + + a.log.Errorf("Failed to handle chunk: %v", err) + return nil + } + + if len(packets) > 0 { + a.controlQueue.pushAll(packets) + a.awakeWriteLoop() + } + + return nil +} + +func (a *Association) onRetransmissionTimeout(id int, nRtos uint) { + a.lock.Lock() + defer a.lock.Unlock() + + if id == timerT1Init { + err := a.sendInit() + if err != nil { + a.log.Debugf("[%s] failed to retransmit init (nRtos=%d): %v", a.name, nRtos, err) + } + return + } + + if id == timerT1Cookie { + err := a.sendCookieEcho() + if err != nil { + a.log.Debugf("[%s] failed to retransmit cookie-echo (nRtos=%d): %v", a.name, nRtos, err) + } + return + } + + if id == timerT2Shutdown { + a.log.Debugf("[%s] retransmission of shutdown timeout (nRtos=%d): %v", a.name, nRtos) + state := a.getState() + + switch state { + case shutdownSent: + a.willSendShutdown = true + a.awakeWriteLoop() + case shutdownAckSent: + a.willSendShutdownAck = true + a.awakeWriteLoop() + } + } + + if id == timerT3RTX { + a.stats.incT3Timeouts() + + // RFC 4960 sec 6.3.3 + // E1) For the destination address for which the timer expires, adjust + // its ssthresh with rules defined in Section 7.2.3 and set the + // cwnd <- MTU. + // RFC 4960 sec 7.2.3 + // When the T3-rtx timer expires on an address, SCTP should perform slow + // start by: + // ssthresh = max(cwnd/2, 4*MTU) + // cwnd = 1*MTU + + a.ssthresh = max32(a.CWND()/2, 4*a.MTU()) + a.setCWND(a.MTU()) + a.log.Tracef("[%s] updated cwnd=%d ssthresh=%d inflight=%d (RTO)", + a.name, a.CWND(), a.ssthresh, a.inflightQueue.getNumBytes()) + + // RFC 3758 sec 3.5 + // A5) Any time the T3-rtx timer expires, on any destination, the sender + // SHOULD try to advance the "Advanced.Peer.Ack.Point" by following + // the procedures outlined in C2 - C5. + if a.useForwardTSN { + // RFC 3758 Sec 3.5 C2 + for i := a.advancedPeerTSNAckPoint + 1; ; i++ { + c, ok := a.inflightQueue.get(i) + if !ok { + break + } + if !c.abandoned() { + break + } + a.advancedPeerTSNAckPoint = i + } + + // RFC 3758 Sec 3.5 C3 + if sna32GT(a.advancedPeerTSNAckPoint, a.cumulativeTSNAckPoint) { + a.willSendForwardTSN = true + } + } + + a.log.Debugf("[%s] T3-rtx timed out: nRtos=%d cwnd=%d ssthresh=%d", a.name, nRtos, a.CWND(), a.ssthresh) + + /* + a.log.Debugf(" - advancedPeerTSNAckPoint=%d", a.advancedPeerTSNAckPoint) + a.log.Debugf(" - cumulativeTSNAckPoint=%d", a.cumulativeTSNAckPoint) + a.inflightQueue.updateSortedKeys() + for i, tsn := range a.inflightQueue.sorted { + if c, ok := a.inflightQueue.get(tsn); ok { + a.log.Debugf(" - [%d] tsn=%d acked=%v abandoned=%v (%v,%v) len=%d", + i, c.tsn, c.acked, c.abandoned(), c.beginningFragment, c.endingFragment, len(c.userData)) + } + } + */ + + a.inflightQueue.markAllToRetrasmit() + a.awakeWriteLoop() + + return + } + + if id == timerReconfig { + a.willRetransmitReconfig = true + a.awakeWriteLoop() + } +} + +func (a *Association) onRetransmissionFailure(id int) { + a.lock.Lock() + defer a.lock.Unlock() + + if id == timerT1Init { + a.log.Errorf("[%s] retransmission failure: T1-init", a.name) + a.handshakeCompletedCh <- ErrHandshakeInitAck + return + } + + if id == timerT1Cookie { + a.log.Errorf("[%s] retransmission failure: T1-cookie", a.name) + a.handshakeCompletedCh <- ErrHandshakeCookieEcho + return + } + + if id == timerT2Shutdown { + a.log.Errorf("[%s] retransmission failure: T2-shutdown", a.name) + return + } + + if id == timerT3RTX { + // T3-rtx timer will not fail by design + // Justifications: + // * ICE would fail if the connectivity is lost + // * WebRTC spec is not clear how this incident should be reported to ULP + a.log.Errorf("[%s] retransmission failure: T3-rtx (DATA)", a.name) + return + } +} + +func (a *Association) onAckTimeout() { + a.lock.Lock() + defer a.lock.Unlock() + + a.log.Tracef("[%s] ack timed out (ackState: %d)", a.name, a.ackState) + a.stats.incAckTimeouts() + + a.ackState = ackStateImmediate + a.awakeWriteLoop() +} + +// bufferedAmount returns total amount (in bytes) of currently buffered user data. +// This is used only by testing. +func (a *Association) bufferedAmount() int { + a.lock.RLock() + defer a.lock.RUnlock() + + return a.pendingQueue.getNumBytes() + a.inflightQueue.getNumBytes() +} + +// MaxMessageSize returns the maximum message size you can send. +func (a *Association) MaxMessageSize() uint32 { + return atomic.LoadUint32(&a.maxMessageSize) +} + +// SetMaxMessageSize sets the maximum message size you can send. +func (a *Association) SetMaxMessageSize(maxMsgSize uint32) { + atomic.StoreUint32(&a.maxMessageSize, maxMsgSize) +} diff --git a/vendor/github.com/pion/sctp/association_stats.go b/vendor/github.com/pion/sctp/association_stats.go new file mode 100644 index 000000000..60883c470 --- /dev/null +++ b/vendor/github.com/pion/sctp/association_stats.go @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "sync/atomic" +) + +type associationStats struct { + nDATAs uint64 + nSACKs uint64 + nT3Timeouts uint64 + nAckTimeouts uint64 + nFastRetrans uint64 +} + +func (s *associationStats) incDATAs() { + atomic.AddUint64(&s.nDATAs, 1) +} + +func (s *associationStats) getNumDATAs() uint64 { + return atomic.LoadUint64(&s.nDATAs) +} + +func (s *associationStats) incSACKs() { + atomic.AddUint64(&s.nSACKs, 1) +} + +func (s *associationStats) getNumSACKs() uint64 { + return atomic.LoadUint64(&s.nSACKs) +} + +func (s *associationStats) incT3Timeouts() { + atomic.AddUint64(&s.nT3Timeouts, 1) +} + +func (s *associationStats) getNumT3Timeouts() uint64 { + return atomic.LoadUint64(&s.nT3Timeouts) +} + +func (s *associationStats) incAckTimeouts() { + atomic.AddUint64(&s.nAckTimeouts, 1) +} + +func (s *associationStats) getNumAckTimeouts() uint64 { + return atomic.LoadUint64(&s.nAckTimeouts) +} + +func (s *associationStats) incFastRetrans() { + atomic.AddUint64(&s.nFastRetrans, 1) +} + +func (s *associationStats) getNumFastRetrans() uint64 { + return atomic.LoadUint64(&s.nFastRetrans) +} + +func (s *associationStats) reset() { + atomic.StoreUint64(&s.nDATAs, 0) + atomic.StoreUint64(&s.nSACKs, 0) + atomic.StoreUint64(&s.nT3Timeouts, 0) + atomic.StoreUint64(&s.nAckTimeouts, 0) + atomic.StoreUint64(&s.nFastRetrans, 0) +} diff --git a/vendor/github.com/pion/sctp/chunk.go b/vendor/github.com/pion/sctp/chunk.go new file mode 100644 index 000000000..50b8a2e4d --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk.go @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type chunk interface { + unmarshal(raw []byte) error + marshal() ([]byte, error) + check() (bool, error) + + valueLength() int +} diff --git a/vendor/github.com/pion/sctp/chunk_abort.go b/vendor/github.com/pion/sctp/chunk_abort.go new file mode 100644 index 000000000..eaed69785 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_abort.go @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp // nolint:dupl + +import ( + "errors" + "fmt" +) + +/* +Abort represents an SCTP Chunk of type ABORT + +The ABORT chunk is sent to the peer of an association to close the +association. The ABORT chunk may contain Cause Parameters to inform +the receiver about the reason of the abort. DATA chunks MUST NOT be +bundled with ABORT. Control chunks (except for INIT, INIT ACK, and +SHUTDOWN COMPLETE) MAY be bundled with an ABORT, but they MUST be +placed before the ABORT in the SCTP packet or they will be ignored by +the receiver. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 6 |Reserved |T| Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | zero or more Error Causes | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkAbort struct { + chunkHeader + errorCauses []errorCause +} + +// Abort chunk errors +var ( + ErrChunkTypeNotAbort = errors.New("ChunkType is not of type ABORT") + ErrBuildAbortChunkFailed = errors.New("failed build Abort Chunk") +) + +func (a *chunkAbort) unmarshal(raw []byte) error { + if err := a.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if a.typ != ctAbort { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotAbort, a.typ.String()) + } + + offset := chunkHeaderSize + for { + if len(raw)-offset < 4 { + break + } + + e, err := buildErrorCause(raw[offset:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrBuildAbortChunkFailed, err) //nolint:errorlint + } + + offset += int(e.length()) + a.errorCauses = append(a.errorCauses, e) + } + return nil +} + +func (a *chunkAbort) marshal() ([]byte, error) { + a.chunkHeader.typ = ctAbort + a.flags = 0x00 + a.raw = []byte{} + for _, ec := range a.errorCauses { + raw, err := ec.marshal() + if err != nil { + return nil, err + } + a.raw = append(a.raw, raw...) + } + return a.chunkHeader.marshal() +} + +func (a *chunkAbort) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkAbort printable +func (a *chunkAbort) String() string { + res := a.chunkHeader.String() + + for _, cause := range a.errorCauses { + res += fmt.Sprintf("\n - %s", cause) + } + + return res +} diff --git a/vendor/github.com/pion/sctp/chunk_cookie_ack.go b/vendor/github.com/pion/sctp/chunk_cookie_ack.go new file mode 100644 index 000000000..814ed2ca4 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_cookie_ack.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +chunkCookieAck represents an SCTP Chunk of type chunkCookieAck + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 11 |Chunk Flags | Length = 4 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkCookieAck struct { + chunkHeader +} + +// Cookie ack chunk errors +var ( + ErrChunkTypeNotCookieAck = errors.New("ChunkType is not of type COOKIEACK") +) + +func (c *chunkCookieAck) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if c.typ != ctCookieAck { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotCookieAck, c.typ.String()) + } + + return nil +} + +func (c *chunkCookieAck) marshal() ([]byte, error) { + c.chunkHeader.typ = ctCookieAck + return c.chunkHeader.marshal() +} + +func (c *chunkCookieAck) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkCookieAck printable +func (c *chunkCookieAck) String() string { + return c.chunkHeader.String() +} diff --git a/vendor/github.com/pion/sctp/chunk_cookie_echo.go b/vendor/github.com/pion/sctp/chunk_cookie_echo.go new file mode 100644 index 000000000..23a2fc26e --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_cookie_echo.go @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +CookieEcho represents an SCTP Chunk of type CookieEcho + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 10 |Chunk Flags | Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Cookie | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkCookieEcho struct { + chunkHeader + cookie []byte +} + +// Cookie echo chunk errors +var ( + ErrChunkTypeNotCookieEcho = errors.New("ChunkType is not of type COOKIEECHO") +) + +func (c *chunkCookieEcho) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if c.typ != ctCookieEcho { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotCookieEcho, c.typ.String()) + } + c.cookie = c.raw + + return nil +} + +func (c *chunkCookieEcho) marshal() ([]byte, error) { + c.chunkHeader.typ = ctCookieEcho + c.chunkHeader.raw = c.cookie + return c.chunkHeader.marshal() +} + +func (c *chunkCookieEcho) check() (abort bool, err error) { + return false, nil +} diff --git a/vendor/github.com/pion/sctp/chunk_error.go b/vendor/github.com/pion/sctp/chunk_error.go new file mode 100644 index 000000000..b62be3ae2 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_error.go @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp // nolint:dupl + +import ( + "errors" + "fmt" +) + +/* +Operation Error (ERROR) (9) + +An endpoint sends this chunk to its peer endpoint to notify it of +certain error conditions. It contains one or more error causes. An +Operation Error is not considered fatal in and of itself, but may be +used with an ERROR chunk to report a fatal condition. It has the +following parameters: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 9 | Chunk Flags | Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + \ \ + / one or more Error Causes / + \ \ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Chunk Flags: 8 bits + + Set to 0 on transmit and ignored on receipt. + +Length: 16 bits (unsigned integer) + + Set to the size of the chunk in bytes, including the chunk header + and all the Error Cause fields present. +*/ +type chunkError struct { + chunkHeader + errorCauses []errorCause +} + +// Error chunk errors +var ( + ErrChunkTypeNotCtError = errors.New("ChunkType is not of type ctError") + ErrBuildErrorChunkFailed = errors.New("failed build Error Chunk") +) + +func (a *chunkError) unmarshal(raw []byte) error { + if err := a.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if a.typ != ctError { + return fmt.Errorf("%w, actually is %s", ErrChunkTypeNotCtError, a.typ.String()) + } + + offset := chunkHeaderSize + for { + if len(raw)-offset < 4 { + break + } + + e, err := buildErrorCause(raw[offset:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrBuildErrorChunkFailed, err) //nolint:errorlint + } + + offset += int(e.length()) + a.errorCauses = append(a.errorCauses, e) + } + return nil +} + +func (a *chunkError) marshal() ([]byte, error) { + a.chunkHeader.typ = ctError + a.flags = 0x00 + a.raw = []byte{} + for _, ec := range a.errorCauses { + raw, err := ec.marshal() + if err != nil { + return nil, err + } + a.raw = append(a.raw, raw...) + } + return a.chunkHeader.marshal() +} + +func (a *chunkError) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkError printable +func (a *chunkError) String() string { + res := a.chunkHeader.String() + + for _, cause := range a.errorCauses { + res += fmt.Sprintf("\n - %s", cause) + } + + return res +} diff --git a/vendor/github.com/pion/sctp/chunk_forward_tsn.go b/vendor/github.com/pion/sctp/chunk_forward_tsn.go new file mode 100644 index 000000000..b053e98e9 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_forward_tsn.go @@ -0,0 +1,151 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +// This chunk shall be used by the data sender to inform the data +// receiver to adjust its cumulative received TSN point forward because +// some missing TSNs are associated with data chunks that SHOULD NOT be +// transmitted or retransmitted by the sender. +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type = 192 | Flags = 0x00 | Length = Variable | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | New Cumulative TSN | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Stream-1 | Stream Sequence-1 | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// \ / +// / \ +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Stream-N | Stream Sequence-N | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type chunkForwardTSN struct { + chunkHeader + + // This indicates the new cumulative TSN to the data receiver. Upon + // the reception of this value, the data receiver MUST consider + // any missing TSNs earlier than or equal to this value as received, + // and stop reporting them as gaps in any subsequent SACKs. + newCumulativeTSN uint32 + + streams []chunkForwardTSNStream +} + +const ( + newCumulativeTSNLength = 4 + forwardTSNStreamLength = 4 +) + +// Forward TSN chunk errors +var ( + ErrMarshalStreamFailed = errors.New("failed to marshal stream") + ErrChunkTooShort = errors.New("chunk too short") +) + +func (c *chunkForwardTSN) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if len(c.raw) < newCumulativeTSNLength { + return ErrChunkTooShort + } + + c.newCumulativeTSN = binary.BigEndian.Uint32(c.raw[0:]) + + offset := newCumulativeTSNLength + remaining := len(c.raw) - offset + for remaining > 0 { + s := chunkForwardTSNStream{} + + if err := s.unmarshal(c.raw[offset:]); err != nil { + return fmt.Errorf("%w: %v", ErrMarshalStreamFailed, err) //nolint:errorlint + } + + c.streams = append(c.streams, s) + + offset += s.length() + remaining -= s.length() + } + + return nil +} + +func (c *chunkForwardTSN) marshal() ([]byte, error) { + out := make([]byte, newCumulativeTSNLength) + binary.BigEndian.PutUint32(out[0:], c.newCumulativeTSN) + + for _, s := range c.streams { + b, err := s.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrMarshalStreamFailed, err) //nolint:errorlint + } + out = append(out, b...) + } + + c.typ = ctForwardTSN + c.raw = out + return c.chunkHeader.marshal() +} + +func (c *chunkForwardTSN) check() (abort bool, err error) { + return true, nil +} + +// String makes chunkForwardTSN printable +func (c *chunkForwardTSN) String() string { + res := fmt.Sprintf("New Cumulative TSN: %d\n", c.newCumulativeTSN) + for _, s := range c.streams { + res += fmt.Sprintf(" - si=%d, ssn=%d\n", s.identifier, s.sequence) + } + return res +} + +type chunkForwardTSNStream struct { + // This field holds a stream number that was skipped by this + // FWD-TSN. + identifier uint16 + + // This field holds the sequence number associated with the stream + // that was skipped. The stream sequence field holds the largest + // stream sequence number in this stream being skipped. The receiver + // of the FWD-TSN's can use the Stream-N and Stream Sequence-N fields + // to enable delivery of any stranded TSN's that remain on the stream + // re-ordering queues. This field MUST NOT report TSN's corresponding + // to DATA chunks that are marked as unordered. For ordered DATA + // chunks this field MUST be filled in. + sequence uint16 +} + +func (s *chunkForwardTSNStream) length() int { + return forwardTSNStreamLength +} + +func (s *chunkForwardTSNStream) unmarshal(raw []byte) error { + if len(raw) < forwardTSNStreamLength { + return ErrChunkTooShort + } + s.identifier = binary.BigEndian.Uint16(raw[0:]) + s.sequence = binary.BigEndian.Uint16(raw[2:]) + + return nil +} + +func (s *chunkForwardTSNStream) marshal() ([]byte, error) { // nolint:unparam + out := make([]byte, forwardTSNStreamLength) + + binary.BigEndian.PutUint16(out[0:], s.identifier) + binary.BigEndian.PutUint16(out[2:], s.sequence) + + return out, nil +} diff --git a/vendor/github.com/pion/sctp/chunk_heartbeat.go b/vendor/github.com/pion/sctp/chunk_heartbeat.go new file mode 100644 index 000000000..64914a360 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_heartbeat.go @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +chunkHeartbeat represents an SCTP Chunk of type HEARTBEAT + +An endpoint should send this chunk to its peer endpoint to probe the +reachability of a particular destination transport address defined in +the present association. + +The parameter field contains the Heartbeat Information, which is a +variable-length opaque data structure understood only by the sender. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 4 | Chunk Flags | Heartbeat Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Heartbeat Information TLV (Variable-Length) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Defined as a variable-length parameter using the format described +in Section 3.2.1, i.e.: + +Variable Parameters Status Type Value +------------------------------------------------------------- +heartbeat Info Mandatory 1 +*/ +type chunkHeartbeat struct { + chunkHeader + params []param +} + +// Heartbeat chunk errors +var ( + ErrChunkTypeNotHeartbeat = errors.New("ChunkType is not of type HEARTBEAT") + ErrHeartbeatNotLongEnoughInfo = errors.New("heartbeat is not long enough to contain Heartbeat Info") + ErrParseParamTypeFailed = errors.New("failed to parse param type") + ErrHeartbeatParam = errors.New("heartbeat should only have HEARTBEAT param") + ErrHeartbeatChunkUnmarshal = errors.New("failed unmarshalling param in Heartbeat Chunk") +) + +func (h *chunkHeartbeat) unmarshal(raw []byte) error { + if err := h.chunkHeader.unmarshal(raw); err != nil { + return err + } else if h.typ != ctHeartbeat { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotHeartbeat, h.typ.String()) + } + + if len(raw) <= chunkHeaderSize { + return fmt.Errorf("%w: %d", ErrHeartbeatNotLongEnoughInfo, len(raw)) + } + + pType, err := parseParamType(raw[chunkHeaderSize:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrParseParamTypeFailed, err) //nolint:errorlint + } + if pType != heartbeatInfo { + return fmt.Errorf("%w: instead have %s", ErrHeartbeatParam, pType.String()) + } + + p, err := buildParam(pType, raw[chunkHeaderSize:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrHeartbeatChunkUnmarshal, err) //nolint:errorlint + } + h.params = append(h.params, p) + + return nil +} + +func (h *chunkHeartbeat) Marshal() ([]byte, error) { + return nil, ErrUnimplemented +} + +func (h *chunkHeartbeat) check() (abort bool, err error) { + return false, nil +} diff --git a/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go b/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go new file mode 100644 index 000000000..6d825e00c --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_heartbeat_ack.go @@ -0,0 +1,96 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +chunkHeartbeatAck represents an SCTP Chunk of type HEARTBEAT ACK + +An endpoint should send this chunk to its peer endpoint as a response +to a HEARTBEAT chunk (see Section 8.3). A HEARTBEAT ACK is always +sent to the source IP address of the IP datagram containing the +HEARTBEAT chunk to which this ack is responding. + +The parameter field contains a variable-length opaque data structure. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 5 | Chunk Flags | Heartbeat Ack Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Heartbeat Information TLV (Variable-Length) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Defined as a variable-length parameter using the format described +in Section 3.2.1, i.e.: + +Variable Parameters Status Type Value +------------------------------------------------------------- +Heartbeat Info Mandatory 1 +*/ +type chunkHeartbeatAck struct { + chunkHeader + params []param +} + +// Heartbeat ack chunk errors +var ( + ErrUnimplemented = errors.New("unimplemented") + ErrHeartbeatAckParams = errors.New("heartbeat Ack must have one param") + ErrHeartbeatAckNotHeartbeatInfo = errors.New("heartbeat Ack must have one param, and it should be a HeartbeatInfo") + ErrHeartbeatAckMarshalParam = errors.New("unable to marshal parameter for Heartbeat Ack") +) + +func (h *chunkHeartbeatAck) unmarshal([]byte) error { + return ErrUnimplemented +} + +func (h *chunkHeartbeatAck) marshal() ([]byte, error) { + if len(h.params) != 1 { + return nil, ErrHeartbeatAckParams + } + + switch h.params[0].(type) { + case *paramHeartbeatInfo: + // ParamHeartbeatInfo is valid + default: + return nil, ErrHeartbeatAckNotHeartbeatInfo + } + + out := make([]byte, 0) + for idx, p := range h.params { + pp, err := p.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrHeartbeatAckMarshalParam, err) //nolint:errorlint + } + + out = append(out, pp...) + + // Chunks (including Type, Length, and Value fields) are padded out + // by the sender with all zero bytes to be a multiple of 4 bytes + // long. This padding MUST NOT be more than 3 bytes in total. The + // Chunk Length value does not include terminating padding of the + // chunk. *However, it does include padding of any variable-length + // parameter except the last parameter in the chunk.* The receiver + // MUST ignore the padding. + if idx != len(h.params)-1 { + out = padByte(out, getPadding(len(pp))) + } + } + + h.chunkHeader.typ = ctHeartbeatAck + h.chunkHeader.raw = out + + return h.chunkHeader.marshal() +} + +func (h *chunkHeartbeatAck) check() (abort bool, err error) { + return false, nil +} diff --git a/vendor/github.com/pion/sctp/chunk_init.go b/vendor/github.com/pion/sctp/chunk_init.go new file mode 100644 index 000000000..fb8984465 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_init.go @@ -0,0 +1,138 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp // nolint:dupl + +import ( + "errors" + "fmt" +) + +/* +Init represents an SCTP Chunk of type INIT + +See chunkInitCommon for the fixed headers + + Variable Parameters Status Type Value + ------------------------------------------------------------- + IPv4 IP (Note 1) Optional 5 + IPv6 IP (Note 1) Optional 6 + Cookie Preservative Optional 9 + Reserved for ECN Capable (Note 2) Optional 32768 (0x8000) + Host Name IP (Note 3) Optional 11 + Supported IP Types (Note 4) Optional 12 +*/ +type chunkInit struct { + chunkHeader + chunkInitCommon +} + +// Init chunk errors +var ( + ErrChunkTypeNotTypeInit = errors.New("ChunkType is not of type INIT") + ErrChunkValueNotLongEnough = errors.New("chunk Value isn't long enough for mandatory parameters exp") + ErrChunkTypeInitFlagZero = errors.New("ChunkType of type INIT flags must be all 0") + ErrChunkTypeInitUnmarshalFailed = errors.New("failed to unmarshal INIT body") + ErrChunkTypeInitMarshalFailed = errors.New("failed marshaling INIT common data") + ErrChunkTypeInitInitateTagZero = errors.New("ChunkType of type INIT ACK InitiateTag must not be 0") + ErrInitInboundStreamRequestZero = errors.New("INIT ACK inbound stream request must be > 0") + ErrInitOutboundStreamRequestZero = errors.New("INIT ACK outbound stream request must be > 0") + ErrInitAdvertisedReceiver1500 = errors.New("INIT ACK Advertised Receiver Window Credit (a_rwnd) must be >= 1500") +) + +func (i *chunkInit) unmarshal(raw []byte) error { + if err := i.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if i.typ != ctInit { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotTypeInit, i.typ.String()) + } else if len(i.raw) < initChunkMinLength { + return fmt.Errorf("%w: %d actual: %d", ErrChunkValueNotLongEnough, initChunkMinLength, len(i.raw)) + } + + // The Chunk Flags field in INIT is reserved, and all bits in it should + // be set to 0 by the sender and ignored by the receiver. The sequence + // of parameters within an INIT can be processed in any order. + if i.flags != 0 { + return ErrChunkTypeInitFlagZero + } + + if err := i.chunkInitCommon.unmarshal(i.raw); err != nil { + return fmt.Errorf("%w: %v", ErrChunkTypeInitUnmarshalFailed, err) //nolint:errorlint + } + + return nil +} + +func (i *chunkInit) marshal() ([]byte, error) { + initShared, err := i.chunkInitCommon.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrChunkTypeInitMarshalFailed, err) //nolint:errorlint + } + + i.chunkHeader.typ = ctInit + i.chunkHeader.raw = initShared + return i.chunkHeader.marshal() +} + +func (i *chunkInit) check() (abort bool, err error) { + // The receiver of the INIT (the responding end) records the value of + // the Initiate Tag parameter. This value MUST be placed into the + // Verification Tag field of every SCTP packet that the receiver of + // the INIT transmits within this association. + // + // The Initiate Tag is allowed to have any value except 0. See + // Section 5.3.1 for more on the selection of the tag value. + // + // If the value of the Initiate Tag in a received INIT chunk is found + // to be 0, the receiver MUST treat it as an error and close the + // association by transmitting an ABORT. + if i.initiateTag == 0 { + abort = true + return abort, ErrChunkTypeInitInitateTagZero + } + + // Defines the maximum number of streams the sender of this INIT + // chunk allows the peer end to create in this association. The + // value 0 MUST NOT be used. + // + // Note: There is no negotiation of the actual number of streams but + // instead the two endpoints will use the min(requested, offered). + // See Section 5.1.1 for details. + // + // Note: A receiver of an INIT with the MIS value of 0 SHOULD abort + // the association. + if i.numInboundStreams == 0 { + abort = true + return abort, ErrInitInboundStreamRequestZero + } + + // Defines the number of outbound streams the sender of this INIT + // chunk wishes to create in this association. The value of 0 MUST + // NOT be used. + // + // Note: A receiver of an INIT with the OS value set to 0 SHOULD + // abort the association. + + if i.numOutboundStreams == 0 { + abort = true + return abort, ErrInitOutboundStreamRequestZero + } + + // An SCTP receiver MUST be able to receive a minimum of 1500 bytes in + // one SCTP packet. This means that an SCTP endpoint MUST NOT indicate + // less than 1500 bytes in its initial a_rwnd sent in the INIT or INIT + // ACK. + if i.advertisedReceiverWindowCredit < 1500 { + abort = true + return abort, ErrInitAdvertisedReceiver1500 + } + + return false, nil +} + +// String makes chunkInit printable +func (i *chunkInit) String() string { + return fmt.Sprintf("%s\n%s", i.chunkHeader, i.chunkInitCommon) +} diff --git a/vendor/github.com/pion/sctp/chunk_init_ack.go b/vendor/github.com/pion/sctp/chunk_init_ack.go new file mode 100644 index 000000000..ab790bd82 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_init_ack.go @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp // nolint:dupl + +import ( + "errors" + "fmt" +) + +/* +chunkInitAck represents an SCTP Chunk of type INIT ACK + +See chunkInitCommon for the fixed headers + + Variable Parameters Status Type Value + ------------------------------------------------------------- + State Cookie Mandatory 7 + IPv4 IP (Note 1) Optional 5 + IPv6 IP (Note 1) Optional 6 + Unrecognized Parameter Optional 8 + Reserved for ECN Capable (Note 2) Optional 32768 (0x8000) + Host Name IP (Note 3) Optional 11 +*/ +type chunkInitAck struct { + chunkHeader + chunkInitCommon +} + +// Init ack chunk errors +var ( + ErrChunkTypeNotInitAck = errors.New("ChunkType is not of type INIT ACK") + ErrChunkNotLongEnoughForParams = errors.New("chunk Value isn't long enough for mandatory parameters exp") + ErrChunkTypeInitAckFlagZero = errors.New("ChunkType of type INIT ACK flags must be all 0") + ErrInitAckUnmarshalFailed = errors.New("failed to unmarshal INIT body") + ErrInitCommonDataMarshalFailed = errors.New("failed marshaling INIT common data") + ErrChunkTypeInitAckInitateTagZero = errors.New("ChunkType of type INIT ACK InitiateTag must not be 0") + ErrInitAckInboundStreamRequestZero = errors.New("INIT ACK inbound stream request must be > 0") + ErrInitAckOutboundStreamRequestZero = errors.New("INIT ACK outbound stream request must be > 0") + ErrInitAckAdvertisedReceiver1500 = errors.New("INIT ACK Advertised Receiver Window Credit (a_rwnd) must be >= 1500") +) + +func (i *chunkInitAck) unmarshal(raw []byte) error { + if err := i.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if i.typ != ctInitAck { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotInitAck, i.typ.String()) + } else if len(i.raw) < initChunkMinLength { + return fmt.Errorf("%w: %d actual: %d", ErrChunkNotLongEnoughForParams, initChunkMinLength, len(i.raw)) + } + + // The Chunk Flags field in INIT is reserved, and all bits in it should + // be set to 0 by the sender and ignored by the receiver. The sequence + // of parameters within an INIT can be processed in any order. + if i.flags != 0 { + return ErrChunkTypeInitAckFlagZero + } + + if err := i.chunkInitCommon.unmarshal(i.raw); err != nil { + return fmt.Errorf("%w: %v", ErrInitAckUnmarshalFailed, err) //nolint:errorlint + } + + return nil +} + +func (i *chunkInitAck) marshal() ([]byte, error) { + initShared, err := i.chunkInitCommon.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrInitCommonDataMarshalFailed, err) //nolint:errorlint + } + + i.chunkHeader.typ = ctInitAck + i.chunkHeader.raw = initShared + return i.chunkHeader.marshal() +} + +func (i *chunkInitAck) check() (abort bool, err error) { + // The receiver of the INIT ACK records the value of the Initiate Tag + // parameter. This value MUST be placed into the Verification Tag + // field of every SCTP packet that the INIT ACK receiver transmits + // within this association. + // + // The Initiate Tag MUST NOT take the value 0. See Section 5.3.1 for + // more on the selection of the Initiate Tag value. + // + // If the value of the Initiate Tag in a received INIT ACK chunk is + // found to be 0, the receiver MUST destroy the association + // discarding its TCB. The receiver MAY send an ABORT for debugging + // purpose. + if i.initiateTag == 0 { + abort = true + return abort, ErrChunkTypeInitAckInitateTagZero + } + + // Defines the maximum number of streams the sender of this INIT ACK + // chunk allows the peer end to create in this association. The + // value 0 MUST NOT be used. + // + // Note: There is no negotiation of the actual number of streams but + // instead the two endpoints will use the min(requested, offered). + // See Section 5.1.1 for details. + // + // Note: A receiver of an INIT ACK with the MIS value set to 0 SHOULD + // destroy the association discarding its TCB. + if i.numInboundStreams == 0 { + abort = true + return abort, ErrInitAckInboundStreamRequestZero + } + + // Defines the number of outbound streams the sender of this INIT ACK + // chunk wishes to create in this association. The value of 0 MUST + // NOT be used, and the value MUST NOT be greater than the MIS value + // sent in the INIT chunk. + // + // Note: A receiver of an INIT ACK with the OS value set to 0 SHOULD + // destroy the association discarding its TCB. + + if i.numOutboundStreams == 0 { + abort = true + return abort, ErrInitAckOutboundStreamRequestZero + } + + // An SCTP receiver MUST be able to receive a minimum of 1500 bytes in + // one SCTP packet. This means that an SCTP endpoint MUST NOT indicate + // less than 1500 bytes in its initial a_rwnd sent in the INIT or INIT + // ACK. + if i.advertisedReceiverWindowCredit < 1500 { + abort = true + return abort, ErrInitAckAdvertisedReceiver1500 + } + + return false, nil +} + +// String makes chunkInitAck printable +func (i *chunkInitAck) String() string { + return fmt.Sprintf("%s\n%s", i.chunkHeader, i.chunkInitCommon) +} diff --git a/vendor/github.com/pion/sctp/chunk_init_common.go b/vendor/github.com/pion/sctp/chunk_init_common.go new file mode 100644 index 000000000..63c70c98b --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_init_common.go @@ -0,0 +1,164 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +/* +chunkInitCommon represents an SCTP Chunk body of type INIT and INIT ACK + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type = 1 | Chunk Flags | Chunk Length | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Initiate Tag | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Advertised Receiver Window Credit (a_rwnd) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Number of Outbound Streams | Number of Inbound Streams | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Initial TSN | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | +| Optional/Variable-Length Parameters | +| | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +The INIT chunk contains the following parameters. Unless otherwise +noted, each parameter MUST only be included once in the INIT chunk. + +Fixed Parameters Status +---------------------------------------------- +Initiate Tag Mandatory +Advertised Receiver Window Credit Mandatory +Number of Outbound Streams Mandatory +Number of Inbound Streams Mandatory +Initial TSN Mandatory +*/ + +type chunkInitCommon struct { + initiateTag uint32 + advertisedReceiverWindowCredit uint32 + numOutboundStreams uint16 + numInboundStreams uint16 + initialTSN uint32 + params []param +} + +const ( + initChunkMinLength = 16 + initOptionalVarHeaderLength = 4 +) + +// Init chunk errors +var ( + ErrInitChunkParseParamTypeFailed = errors.New("failed to parse param type") + ErrInitChunkUnmarshalParam = errors.New("failed unmarshalling param in Init Chunk") + ErrInitAckMarshalParam = errors.New("unable to marshal parameter for INIT/INITACK") +) + +func (i *chunkInitCommon) unmarshal(raw []byte) error { + i.initiateTag = binary.BigEndian.Uint32(raw[0:]) + i.advertisedReceiverWindowCredit = binary.BigEndian.Uint32(raw[4:]) + i.numOutboundStreams = binary.BigEndian.Uint16(raw[8:]) + i.numInboundStreams = binary.BigEndian.Uint16(raw[10:]) + i.initialTSN = binary.BigEndian.Uint32(raw[12:]) + + // https://tools.ietf.org/html/rfc4960#section-3.2.1 + // + // Chunk values of SCTP control chunks consist of a chunk-type-specific + // header of required fields, followed by zero or more parameters. The + // optional and variable-length parameters contained in a chunk are + // defined in a Type-Length-Value format as shown below. + // + // 0 1 2 3 + // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | Parameter Type | Parameter Length | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | | + // | Parameter Value | + // | | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + offset := initChunkMinLength + remaining := len(raw) - offset + for remaining > 0 { + if remaining > initOptionalVarHeaderLength { + pType, err := parseParamType(raw[offset:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrInitChunkParseParamTypeFailed, err) //nolint:errorlint + } + p, err := buildParam(pType, raw[offset:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrInitChunkUnmarshalParam, err) //nolint:errorlint + } + i.params = append(i.params, p) + padding := getPadding(p.length()) + offset += p.length() + padding + remaining -= p.length() + padding + } else { + break + } + } + + return nil +} + +func (i *chunkInitCommon) marshal() ([]byte, error) { + out := make([]byte, initChunkMinLength) + binary.BigEndian.PutUint32(out[0:], i.initiateTag) + binary.BigEndian.PutUint32(out[4:], i.advertisedReceiverWindowCredit) + binary.BigEndian.PutUint16(out[8:], i.numOutboundStreams) + binary.BigEndian.PutUint16(out[10:], i.numInboundStreams) + binary.BigEndian.PutUint32(out[12:], i.initialTSN) + for idx, p := range i.params { + pp, err := p.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrInitAckMarshalParam, err) //nolint:errorlint + } + + out = append(out, pp...) + + // Chunks (including Type, Length, and Value fields) are padded out + // by the sender with all zero bytes to be a multiple of 4 bytes + // long. This padding MUST NOT be more than 3 bytes in total. The + // Chunk Length value does not include terminating padding of the + // chunk. *However, it does include padding of any variable-length + // parameter except the last parameter in the chunk.* The receiver + // MUST ignore the padding. + if idx != len(i.params)-1 { + out = padByte(out, getPadding(len(pp))) + } + } + + return out, nil +} + +// String makes chunkInitCommon printable +func (i chunkInitCommon) String() string { + format := `initiateTag: %d + advertisedReceiverWindowCredit: %d + numOutboundStreams: %d + numInboundStreams: %d + initialTSN: %d` + + res := fmt.Sprintf(format, + i.initiateTag, + i.advertisedReceiverWindowCredit, + i.numOutboundStreams, + i.numInboundStreams, + i.initialTSN, + ) + + for i, param := range i.params { + res += fmt.Sprintf("Param %d:\n %s", i, param) + } + return res +} diff --git a/vendor/github.com/pion/sctp/chunk_payload_data.go b/vendor/github.com/pion/sctp/chunk_payload_data.go new file mode 100644 index 000000000..b6f1b6140 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_payload_data.go @@ -0,0 +1,208 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" + "time" +) + +/* +chunkPayloadData represents an SCTP Chunk of type DATA + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Type = 0 | Reserved|U|B|E| Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | TSN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Stream Identifier S | Stream Sequence Number n | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Protocol Identifier | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | User Data (seq n of Stream S) | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +An unfragmented user message shall have both the B and E bits set to +'1'. Setting both B and E bits to '0' indicates a middle fragment of +a multi-fragment user message, as summarized in the following table: + + B E Description + ============================================================ + | 1 0 | First piece of a fragmented user message | + +----------------------------------------------------------+ + | 0 0 | Middle piece of a fragmented user message | + +----------------------------------------------------------+ + | 0 1 | Last piece of a fragmented user message | + +----------------------------------------------------------+ + | 1 1 | Unfragmented message | + ============================================================ + | Table 1: Fragment Description Flags | + ============================================================ +*/ +type chunkPayloadData struct { + chunkHeader + + unordered bool + beginningFragment bool + endingFragment bool + immediateSack bool + + tsn uint32 + streamIdentifier uint16 + streamSequenceNumber uint16 + payloadType PayloadProtocolIdentifier + userData []byte + + // Whether this data chunk was acknowledged (received by peer) + acked bool + missIndicator uint32 + + // Partial-reliability parameters used only by sender + since time.Time + nSent uint32 // number of transmission made for this chunk + _abandoned bool + _allInflight bool // valid only with the first fragment + + // Retransmission flag set when T1-RTX timeout occurred and this + // chunk is still in the inflight queue + retransmit bool + + head *chunkPayloadData // link to the head of the fragment +} + +const ( + payloadDataEndingFragmentBitmask = 1 + payloadDataBeginingFragmentBitmask = 2 + payloadDataUnorderedBitmask = 4 + payloadDataImmediateSACK = 8 + + payloadDataHeaderSize = 12 +) + +// PayloadProtocolIdentifier is an enum for DataChannel payload types +type PayloadProtocolIdentifier uint32 + +// PayloadProtocolIdentifier enums +// https://www.iana.org/assignments/sctp-parameters/sctp-parameters.xhtml#sctp-parameters-25 +const ( + PayloadTypeUnknown PayloadProtocolIdentifier = 0 + PayloadTypeWebRTCDCEP PayloadProtocolIdentifier = 50 + PayloadTypeWebRTCString PayloadProtocolIdentifier = 51 + PayloadTypeWebRTCBinary PayloadProtocolIdentifier = 53 + PayloadTypeWebRTCStringEmpty PayloadProtocolIdentifier = 56 + PayloadTypeWebRTCBinaryEmpty PayloadProtocolIdentifier = 57 +) + +// Data chunk errors +var ( + ErrChunkPayloadSmall = errors.New("packet is smaller than the header size") +) + +func (p PayloadProtocolIdentifier) String() string { + switch p { + case PayloadTypeWebRTCDCEP: + return "WebRTC DCEP" + case PayloadTypeWebRTCString: + return "WebRTC String" + case PayloadTypeWebRTCBinary: + return "WebRTC Binary" + case PayloadTypeWebRTCStringEmpty: + return "WebRTC String (Empty)" + case PayloadTypeWebRTCBinaryEmpty: + return "WebRTC Binary (Empty)" + default: + return fmt.Sprintf("Unknown Payload Protocol Identifier: %d", p) + } +} + +func (p *chunkPayloadData) unmarshal(raw []byte) error { + if err := p.chunkHeader.unmarshal(raw); err != nil { + return err + } + + p.immediateSack = p.flags&payloadDataImmediateSACK != 0 + p.unordered = p.flags&payloadDataUnorderedBitmask != 0 + p.beginningFragment = p.flags&payloadDataBeginingFragmentBitmask != 0 + p.endingFragment = p.flags&payloadDataEndingFragmentBitmask != 0 + + if len(raw) < payloadDataHeaderSize { + return ErrChunkPayloadSmall + } + p.tsn = binary.BigEndian.Uint32(p.raw[0:]) + p.streamIdentifier = binary.BigEndian.Uint16(p.raw[4:]) + p.streamSequenceNumber = binary.BigEndian.Uint16(p.raw[6:]) + p.payloadType = PayloadProtocolIdentifier(binary.BigEndian.Uint32(p.raw[8:])) + p.userData = p.raw[payloadDataHeaderSize:] + + return nil +} + +func (p *chunkPayloadData) marshal() ([]byte, error) { + payRaw := make([]byte, payloadDataHeaderSize+len(p.userData)) + + binary.BigEndian.PutUint32(payRaw[0:], p.tsn) + binary.BigEndian.PutUint16(payRaw[4:], p.streamIdentifier) + binary.BigEndian.PutUint16(payRaw[6:], p.streamSequenceNumber) + binary.BigEndian.PutUint32(payRaw[8:], uint32(p.payloadType)) + copy(payRaw[payloadDataHeaderSize:], p.userData) + + flags := uint8(0) + if p.endingFragment { + flags = 1 + } + if p.beginningFragment { + flags |= 1 << 1 + } + if p.unordered { + flags |= 1 << 2 + } + if p.immediateSack { + flags |= 1 << 3 + } + + p.chunkHeader.flags = flags + p.chunkHeader.typ = ctPayloadData + p.chunkHeader.raw = payRaw + return p.chunkHeader.marshal() +} + +func (p *chunkPayloadData) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkPayloadData printable +func (p *chunkPayloadData) String() string { + return fmt.Sprintf("%s\n%d", p.chunkHeader, p.tsn) +} + +func (p *chunkPayloadData) abandoned() bool { + if p.head != nil { + return p.head._abandoned && p.head._allInflight + } + return p._abandoned && p._allInflight +} + +func (p *chunkPayloadData) setAbandoned(abandoned bool) { + if p.head != nil { + p.head._abandoned = abandoned + return + } + p._abandoned = abandoned +} + +func (p *chunkPayloadData) setAllInflight() { + if p.endingFragment { + if p.head != nil { + p.head._allInflight = true + } else { + p._allInflight = true + } + } +} diff --git a/vendor/github.com/pion/sctp/chunk_reconfig.go b/vendor/github.com/pion/sctp/chunk_reconfig.go new file mode 100644 index 000000000..39cb1fbd5 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_reconfig.go @@ -0,0 +1,108 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +// https://tools.ietf.org/html/rfc6525#section-3.1 +// chunkReconfig represents an SCTP Chunk used to reconfigure streams. +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Type = 130 | Chunk Flags | Chunk Length | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// \ \ +// / Re-configuration Parameter / +// \ \ +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// \ \ +// / Re-configuration Parameter (optional) / +// \ \ +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type chunkReconfig struct { + chunkHeader + paramA param + paramB param +} + +// Reconfigure chunk errors +var ( + ErrChunkParseParamTypeFailed = errors.New("failed to parse param type") + ErrChunkMarshalParamAReconfigFailed = errors.New("unable to marshal parameter A for reconfig") + ErrChunkMarshalParamBReconfigFailed = errors.New("unable to marshal parameter B for reconfig") +) + +func (c *chunkReconfig) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + pType, err := parseParamType(c.raw) + if err != nil { + return fmt.Errorf("%w: %v", ErrChunkParseParamTypeFailed, err) //nolint:errorlint + } + a, err := buildParam(pType, c.raw) + if err != nil { + return err + } + c.paramA = a + + padding := getPadding(a.length()) + offset := a.length() + padding + if len(c.raw) > offset { + pType, err := parseParamType(c.raw[offset:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrChunkParseParamTypeFailed, err) //nolint:errorlint + } + b, err := buildParam(pType, c.raw[offset:]) + if err != nil { + return err + } + c.paramB = b + } + + return nil +} + +func (c *chunkReconfig) marshal() ([]byte, error) { + out, err := c.paramA.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrChunkMarshalParamAReconfigFailed, err) //nolint:errorlint + } + if c.paramB != nil { + // Pad param A + out = padByte(out, getPadding(len(out))) + + outB, err := c.paramB.marshal() + if err != nil { + return nil, fmt.Errorf("%w: %v", ErrChunkMarshalParamBReconfigFailed, err) //nolint:errorlint + } + + out = append(out, outB...) + } + + c.typ = ctReconfig + c.raw = out + return c.chunkHeader.marshal() +} + +func (c *chunkReconfig) check() (abort bool, err error) { + // nolint:godox + // TODO: check allowed combinations: + // https://tools.ietf.org/html/rfc6525#section-3.1 + return true, nil +} + +// String makes chunkReconfig printable +func (c *chunkReconfig) String() string { + res := fmt.Sprintf("Param A:\n %s", c.paramA) + if c.paramB != nil { + res += fmt.Sprintf("Param B:\n %s", c.paramB) + } + return res +} diff --git a/vendor/github.com/pion/sctp/chunk_selective_ack.go b/vendor/github.com/pion/sctp/chunk_selective_ack.go new file mode 100644 index 000000000..0d60b6a27 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_selective_ack.go @@ -0,0 +1,151 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +/* +chunkSelectiveAck represents an SCTP Chunk of type SACK + +This chunk is sent to the peer endpoint to acknowledge received DATA +chunks and to inform the peer endpoint of gaps in the received +subsequences of DATA chunks as represented by their TSNs. +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type = 3 |Chunk Flags | Chunk Length | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Cumulative TSN Ack | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Advertised Receiver Window Credit (a_rwnd) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Number of Gap Ack Blocks = N | Number of Duplicate TSNs = X | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Gap Ack Block #1 Start | Gap Ack Block #1 End | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +/ / +\ ... \ +/ / ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Gap Ack Block #N Start | Gap Ack Block #N End | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Duplicate TSN 1 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +/ / +\ ... \ +/ / ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Duplicate TSN X | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + +type gapAckBlock struct { + start uint16 + end uint16 +} + +// Selective ack chunk errors +var ( + ErrChunkTypeNotSack = errors.New("ChunkType is not of type SACK") + ErrSackSizeNotLargeEnoughInfo = errors.New("SACK Chunk size is not large enough to contain header") + ErrSackSizeNotMatchPredicted = errors.New("SACK Chunk size does not match predicted amount from header values") +) + +// String makes gapAckBlock printable +func (g gapAckBlock) String() string { + return fmt.Sprintf("%d - %d", g.start, g.end) +} + +type chunkSelectiveAck struct { + chunkHeader + cumulativeTSNAck uint32 + advertisedReceiverWindowCredit uint32 + gapAckBlocks []gapAckBlock + duplicateTSN []uint32 +} + +const ( + selectiveAckHeaderSize = 12 +) + +func (s *chunkSelectiveAck) unmarshal(raw []byte) error { + if err := s.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if s.typ != ctSack { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotSack, s.typ.String()) + } + + if len(s.raw) < selectiveAckHeaderSize { + return fmt.Errorf("%w: %v remaining, needs %v bytes", ErrSackSizeNotLargeEnoughInfo, + len(s.raw), selectiveAckHeaderSize) + } + + s.cumulativeTSNAck = binary.BigEndian.Uint32(s.raw[0:]) + s.advertisedReceiverWindowCredit = binary.BigEndian.Uint32(s.raw[4:]) + s.gapAckBlocks = make([]gapAckBlock, binary.BigEndian.Uint16(s.raw[8:])) + s.duplicateTSN = make([]uint32, binary.BigEndian.Uint16(s.raw[10:])) + + if len(s.raw) != selectiveAckHeaderSize+(4*len(s.gapAckBlocks)+(4*len(s.duplicateTSN))) { + return ErrSackSizeNotMatchPredicted + } + + offset := selectiveAckHeaderSize + for i := range s.gapAckBlocks { + s.gapAckBlocks[i].start = binary.BigEndian.Uint16(s.raw[offset:]) + s.gapAckBlocks[i].end = binary.BigEndian.Uint16(s.raw[offset+2:]) + offset += 4 + } + for i := range s.duplicateTSN { + s.duplicateTSN[i] = binary.BigEndian.Uint32(s.raw[offset:]) + offset += 4 + } + + return nil +} + +func (s *chunkSelectiveAck) marshal() ([]byte, error) { + sackRaw := make([]byte, selectiveAckHeaderSize+(4*len(s.gapAckBlocks)+(4*len(s.duplicateTSN)))) + binary.BigEndian.PutUint32(sackRaw[0:], s.cumulativeTSNAck) + binary.BigEndian.PutUint32(sackRaw[4:], s.advertisedReceiverWindowCredit) + binary.BigEndian.PutUint16(sackRaw[8:], uint16(len(s.gapAckBlocks))) + binary.BigEndian.PutUint16(sackRaw[10:], uint16(len(s.duplicateTSN))) + offset := selectiveAckHeaderSize + for _, g := range s.gapAckBlocks { + binary.BigEndian.PutUint16(sackRaw[offset:], g.start) + binary.BigEndian.PutUint16(sackRaw[offset+2:], g.end) + offset += 4 + } + for _, t := range s.duplicateTSN { + binary.BigEndian.PutUint32(sackRaw[offset:], t) + offset += 4 + } + + s.chunkHeader.typ = ctSack + s.chunkHeader.raw = sackRaw + return s.chunkHeader.marshal() +} + +func (s *chunkSelectiveAck) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkSelectiveAck printable +func (s *chunkSelectiveAck) String() string { + res := fmt.Sprintf("SACK cumTsnAck=%d arwnd=%d dupTsn=%d", + s.cumulativeTSNAck, + s.advertisedReceiverWindowCredit, + s.duplicateTSN) + + for _, gap := range s.gapAckBlocks { + res = fmt.Sprintf("%s\n gap ack: %s", res, gap) + } + + return res +} diff --git a/vendor/github.com/pion/sctp/chunk_shutdown.go b/vendor/github.com/pion/sctp/chunk_shutdown.go new file mode 100644 index 000000000..9cc756c1d --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_shutdown.go @@ -0,0 +1,72 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +/* +chunkShutdown represents an SCTP Chunk of type chunkShutdown + +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type = 7 | Chunk Flags | Length = 8 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Cumulative TSN Ack | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkShutdown struct { + chunkHeader + cumulativeTSNAck uint32 +} + +const ( + cumulativeTSNAckLength = 4 +) + +// Shutdown chunk errors +var ( + ErrInvalidChunkSize = errors.New("invalid chunk size") + ErrChunkTypeNotShutdown = errors.New("ChunkType is not of type SHUTDOWN") +) + +func (c *chunkShutdown) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if c.typ != ctShutdown { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotShutdown, c.typ.String()) + } + + if len(c.raw) != cumulativeTSNAckLength { + return ErrInvalidChunkSize + } + + c.cumulativeTSNAck = binary.BigEndian.Uint32(c.raw[0:]) + + return nil +} + +func (c *chunkShutdown) marshal() ([]byte, error) { + out := make([]byte, cumulativeTSNAckLength) + binary.BigEndian.PutUint32(out[0:], c.cumulativeTSNAck) + + c.typ = ctShutdown + c.raw = out + return c.chunkHeader.marshal() +} + +func (c *chunkShutdown) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkShutdown printable +func (c *chunkShutdown) String() string { + return c.chunkHeader.String() +} diff --git a/vendor/github.com/pion/sctp/chunk_shutdown_ack.go b/vendor/github.com/pion/sctp/chunk_shutdown_ack.go new file mode 100644 index 000000000..87f417001 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_shutdown_ack.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +chunkShutdownAck represents an SCTP Chunk of type chunkShutdownAck + +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type = 8 | Chunk Flags | Length = 4 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkShutdownAck struct { + chunkHeader +} + +// Shutdown ack chunk errors +var ( + ErrChunkTypeNotShutdownAck = errors.New("ChunkType is not of type SHUTDOWN-ACK") +) + +func (c *chunkShutdownAck) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if c.typ != ctShutdownAck { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotShutdownAck, c.typ.String()) + } + + return nil +} + +func (c *chunkShutdownAck) marshal() ([]byte, error) { + c.typ = ctShutdownAck + return c.chunkHeader.marshal() +} + +func (c *chunkShutdownAck) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkShutdownAck printable +func (c *chunkShutdownAck) String() string { + return c.chunkHeader.String() +} diff --git a/vendor/github.com/pion/sctp/chunk_shutdown_complete.go b/vendor/github.com/pion/sctp/chunk_shutdown_complete.go new file mode 100644 index 000000000..9652f8878 --- /dev/null +++ b/vendor/github.com/pion/sctp/chunk_shutdown_complete.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +chunkShutdownComplete represents an SCTP Chunk of type chunkShutdownComplete + +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type = 14 |Reserved |T| Length = 4 | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkShutdownComplete struct { + chunkHeader +} + +// Shutdown complete chunk errors +var ( + ErrChunkTypeNotShutdownComplete = errors.New("ChunkType is not of type SHUTDOWN-COMPLETE") +) + +func (c *chunkShutdownComplete) unmarshal(raw []byte) error { + if err := c.chunkHeader.unmarshal(raw); err != nil { + return err + } + + if c.typ != ctShutdownComplete { + return fmt.Errorf("%w: actually is %s", ErrChunkTypeNotShutdownComplete, c.typ.String()) + } + + return nil +} + +func (c *chunkShutdownComplete) marshal() ([]byte, error) { + c.typ = ctShutdownComplete + return c.chunkHeader.marshal() +} + +func (c *chunkShutdownComplete) check() (abort bool, err error) { + return false, nil +} + +// String makes chunkShutdownComplete printable +func (c *chunkShutdownComplete) String() string { + return c.chunkHeader.String() +} diff --git a/vendor/github.com/pion/sctp/chunkheader.go b/vendor/github.com/pion/sctp/chunkheader.go new file mode 100644 index 000000000..60b903b4b --- /dev/null +++ b/vendor/github.com/pion/sctp/chunkheader.go @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +/* +chunkHeader represents a SCTP Chunk header, defined in https://tools.ietf.org/html/rfc4960#section-3.2 +The figure below illustrates the field format for the chunks to be +transmitted in the SCTP packet. Each chunk is formatted with a Chunk +Type field, a chunk-specific Flag field, a Chunk Length field, and a +Value field. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Chunk Type | Chunk Flags | Chunk Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Chunk Value | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type chunkHeader struct { + typ chunkType + flags byte + raw []byte +} + +const ( + chunkHeaderSize = 4 +) + +// SCTP chunk header errors +var ( + ErrChunkHeaderTooSmall = errors.New("raw is too small for a SCTP chunk") + ErrChunkHeaderNotEnoughSpace = errors.New("not enough data left in SCTP packet to satisfy requested length") + ErrChunkHeaderPaddingNonZero = errors.New("chunk padding is non-zero at offset") +) + +func (c *chunkHeader) unmarshal(raw []byte) error { + if len(raw) < chunkHeaderSize { + return fmt.Errorf("%w: raw only %d bytes, %d is the minimum length", ErrChunkHeaderTooSmall, len(raw), chunkHeaderSize) + } + + c.typ = chunkType(raw[0]) + c.flags = raw[1] + length := binary.BigEndian.Uint16(raw[2:]) + + // Length includes Chunk header + valueLength := int(length - chunkHeaderSize) + lengthAfterValue := len(raw) - (chunkHeaderSize + valueLength) + + if lengthAfterValue < 0 { + return fmt.Errorf("%w: remain %d req %d ", ErrChunkHeaderNotEnoughSpace, valueLength, len(raw)-chunkHeaderSize) + } else if lengthAfterValue < 4 { + // https://tools.ietf.org/html/rfc4960#section-3.2 + // The Chunk Length field does not count any chunk padding. + // Chunks (including Type, Length, and Value fields) are padded out + // by the sender with all zero bytes to be a multiple of 4 bytes + // long. This padding MUST NOT be more than 3 bytes in total. The + // Chunk Length value does not include terminating padding of the + // chunk. However, it does include padding of any variable-length + // parameter except the last parameter in the chunk. The receiver + // MUST ignore the padding. + for i := lengthAfterValue; i > 0; i-- { + paddingOffset := chunkHeaderSize + valueLength + (i - 1) + if raw[paddingOffset] != 0 { + return fmt.Errorf("%w: %d ", ErrChunkHeaderPaddingNonZero, paddingOffset) + } + } + } + + c.raw = raw[chunkHeaderSize : chunkHeaderSize+valueLength] + return nil +} + +func (c *chunkHeader) marshal() ([]byte, error) { + raw := make([]byte, 4+len(c.raw)) + + raw[0] = uint8(c.typ) + raw[1] = c.flags + binary.BigEndian.PutUint16(raw[2:], uint16(len(c.raw)+chunkHeaderSize)) + copy(raw[4:], c.raw) + return raw, nil +} + +func (c *chunkHeader) valueLength() int { + return len(c.raw) +} + +// String makes chunkHeader printable +func (c chunkHeader) String() string { + return c.typ.String() +} diff --git a/vendor/github.com/pion/sctp/chunktype.go b/vendor/github.com/pion/sctp/chunktype.go new file mode 100644 index 000000000..ed7e60cce --- /dev/null +++ b/vendor/github.com/pion/sctp/chunktype.go @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import "fmt" + +// chunkType is an enum for SCTP Chunk Type field +// This field identifies the type of information contained in the +// Chunk Value field. +type chunkType uint8 + +// List of known chunkType enums +const ( + ctPayloadData chunkType = 0 + ctInit chunkType = 1 + ctInitAck chunkType = 2 + ctSack chunkType = 3 + ctHeartbeat chunkType = 4 + ctHeartbeatAck chunkType = 5 + ctAbort chunkType = 6 + ctShutdown chunkType = 7 + ctShutdownAck chunkType = 8 + ctError chunkType = 9 + ctCookieEcho chunkType = 10 + ctCookieAck chunkType = 11 + ctCWR chunkType = 13 + ctShutdownComplete chunkType = 14 + ctReconfig chunkType = 130 + ctForwardTSN chunkType = 192 +) + +func (c chunkType) String() string { + switch c { + case ctPayloadData: + return "DATA" + case ctInit: + return "INIT" + case ctInitAck: + return "INIT-ACK" + case ctSack: + return "SACK" + case ctHeartbeat: + return "HEARTBEAT" + case ctHeartbeatAck: + return "HEARTBEAT-ACK" + case ctAbort: + return "ABORT" + case ctShutdown: + return "SHUTDOWN" + case ctShutdownAck: + return "SHUTDOWN-ACK" + case ctError: + return "ERROR" + case ctCookieEcho: + return "COOKIE-ECHO" + case ctCookieAck: + return "COOKIE-ACK" + case ctCWR: + return "ECNE" // Explicit Congestion Notification Echo + case ctShutdownComplete: + return "SHUTDOWN-COMPLETE" + case ctReconfig: + return "RECONFIG" // Re-configuration + case ctForwardTSN: + return "FORWARD-TSN" + default: + return fmt.Sprintf("Unknown ChunkType: %d", c) + } +} diff --git a/vendor/github.com/pion/sctp/codecov.yml b/vendor/github.com/pion/sctp/codecov.yml new file mode 100644 index 000000000..263e4d45c --- /dev/null +++ b/vendor/github.com/pion/sctp/codecov.yml @@ -0,0 +1,22 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +coverage: + status: + project: + default: + # Allow decreasing 2% of total coverage to avoid noise. + threshold: 2% + patch: + default: + target: 70% + only_pulls: true + +ignore: + - "examples/*" + - "examples/**/*" diff --git a/vendor/github.com/pion/sctp/control_queue.go b/vendor/github.com/pion/sctp/control_queue.go new file mode 100644 index 000000000..5c417bf01 --- /dev/null +++ b/vendor/github.com/pion/sctp/control_queue.go @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +// control queue + +type controlQueue struct { + queue []*packet +} + +func newControlQueue() *controlQueue { + return &controlQueue{queue: []*packet{}} +} + +func (q *controlQueue) push(c *packet) { + q.queue = append(q.queue, c) +} + +func (q *controlQueue) pushAll(packets []*packet) { + q.queue = append(q.queue, packets...) +} + +func (q *controlQueue) popAll() []*packet { + packets := q.queue + q.queue = []*packet{} + return packets +} + +func (q *controlQueue) size() int { + return len(q.queue) +} diff --git a/vendor/github.com/pion/sctp/error_cause.go b/vendor/github.com/pion/sctp/error_cause.go new file mode 100644 index 000000000..bb1c7c8c6 --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause.go @@ -0,0 +1,101 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +// errorCauseCode is a cause code that appears in either a ERROR or ABORT chunk +type errorCauseCode uint16 + +type errorCause interface { + unmarshal([]byte) error + marshal() ([]byte, error) + length() uint16 + String() string + + errorCauseCode() errorCauseCode +} + +// Error and abort chunk errors +var ( + ErrBuildErrorCaseHandle = errors.New("BuildErrorCause does not handle") +) + +// buildErrorCause delegates the building of a error cause from raw bytes to the correct structure +func buildErrorCause(raw []byte) (errorCause, error) { + var e errorCause + + c := errorCauseCode(binary.BigEndian.Uint16(raw[0:])) + switch c { + case invalidMandatoryParameter: + e = &errorCauseInvalidMandatoryParameter{} + case unrecognizedChunkType: + e = &errorCauseUnrecognizedChunkType{} + case protocolViolation: + e = &errorCauseProtocolViolation{} + case userInitiatedAbort: + e = &errorCauseUserInitiatedAbort{} + default: + return nil, fmt.Errorf("%w: %s", ErrBuildErrorCaseHandle, c.String()) + } + + if err := e.unmarshal(raw); err != nil { + return nil, err + } + + return e, nil +} + +const ( + invalidStreamIdentifier errorCauseCode = 1 + missingMandatoryParameter errorCauseCode = 2 + staleCookieError errorCauseCode = 3 + outOfResource errorCauseCode = 4 + unresolvableAddress errorCauseCode = 5 + unrecognizedChunkType errorCauseCode = 6 + invalidMandatoryParameter errorCauseCode = 7 + unrecognizedParameters errorCauseCode = 8 + noUserData errorCauseCode = 9 + cookieReceivedWhileShuttingDown errorCauseCode = 10 + restartOfAnAssociationWithNewAddresses errorCauseCode = 11 + userInitiatedAbort errorCauseCode = 12 + protocolViolation errorCauseCode = 13 +) + +func (e errorCauseCode) String() string { + switch e { + case invalidStreamIdentifier: + return "Invalid Stream Identifier" + case missingMandatoryParameter: + return "Missing Mandatory Parameter" + case staleCookieError: + return "Stale Cookie Error" + case outOfResource: + return "Out Of Resource" + case unresolvableAddress: + return "Unresolvable IP" + case unrecognizedChunkType: + return "Unrecognized Chunk Type" + case invalidMandatoryParameter: + return "Invalid Mandatory Parameter" + case unrecognizedParameters: + return "Unrecognized Parameters" + case noUserData: + return "No User Data" + case cookieReceivedWhileShuttingDown: + return "Cookie Received While Shutting Down" + case restartOfAnAssociationWithNewAddresses: + return "Restart Of An Association With New Addresses" + case userInitiatedAbort: + return "User Initiated Abort" + case protocolViolation: + return "Protocol Violation" + default: + return fmt.Sprintf("Unknown CauseCode: %d", e) + } +} diff --git a/vendor/github.com/pion/sctp/error_cause_header.go b/vendor/github.com/pion/sctp/error_cause_header.go new file mode 100644 index 000000000..84ff209d2 --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause_header.go @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" +) + +// errorCauseHeader represents the shared header that is shared by all error causes +type errorCauseHeader struct { + code errorCauseCode + len uint16 + raw []byte +} + +const ( + errorCauseHeaderLength = 4 +) + +func (e *errorCauseHeader) marshal() ([]byte, error) { + e.len = uint16(len(e.raw)) + uint16(errorCauseHeaderLength) + raw := make([]byte, e.len) + binary.BigEndian.PutUint16(raw[0:], uint16(e.code)) + binary.BigEndian.PutUint16(raw[2:], e.len) + copy(raw[errorCauseHeaderLength:], e.raw) + + return raw, nil +} + +func (e *errorCauseHeader) unmarshal(raw []byte) error { + e.code = errorCauseCode(binary.BigEndian.Uint16(raw[0:])) + e.len = binary.BigEndian.Uint16(raw[2:]) + valueLength := e.len - errorCauseHeaderLength + e.raw = raw[errorCauseHeaderLength : errorCauseHeaderLength+valueLength] + return nil +} + +func (e *errorCauseHeader) length() uint16 { + return e.len +} + +func (e *errorCauseHeader) errorCauseCode() errorCauseCode { + return e.code +} + +// String makes errorCauseHeader printable +func (e errorCauseHeader) String() string { + return e.code.String() +} diff --git a/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go b/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go new file mode 100644 index 000000000..e73774bfd --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause_invalid_mandatory_parameter.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +// errorCauseInvalidMandatoryParameter represents an SCTP error cause +type errorCauseInvalidMandatoryParameter struct { + errorCauseHeader +} + +func (e *errorCauseInvalidMandatoryParameter) marshal() ([]byte, error) { + return e.errorCauseHeader.marshal() +} + +func (e *errorCauseInvalidMandatoryParameter) unmarshal(raw []byte) error { + return e.errorCauseHeader.unmarshal(raw) +} + +// String makes errorCauseInvalidMandatoryParameter printable +func (e *errorCauseInvalidMandatoryParameter) String() string { + return e.errorCauseHeader.String() +} diff --git a/vendor/github.com/pion/sctp/error_cause_protocol_violation.go b/vendor/github.com/pion/sctp/error_cause_protocol_violation.go new file mode 100644 index 000000000..5861aeddf --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause_protocol_violation.go @@ -0,0 +1,57 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +/* +This error cause MAY be included in ABORT chunks that are sent +because an SCTP endpoint detects a protocol violation of the peer +that is not covered by the error causes described in Section 3.3.10.1 +to Section 3.3.10.12. An implementation MAY provide additional +information specifying what kind of protocol violation has been +detected. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Cause Code=13 | Cause Length=Variable | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + / Additional Information / + \ \ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type errorCauseProtocolViolation struct { + errorCauseHeader + additionalInformation []byte +} + +// Abort chunk errors +var ( + ErrProtocolViolationUnmarshal = errors.New("unable to unmarshal Protocol Violation error") +) + +func (e *errorCauseProtocolViolation) marshal() ([]byte, error) { + e.raw = e.additionalInformation + return e.errorCauseHeader.marshal() +} + +func (e *errorCauseProtocolViolation) unmarshal(raw []byte) error { + err := e.errorCauseHeader.unmarshal(raw) + if err != nil { + return fmt.Errorf("%w: %v", ErrProtocolViolationUnmarshal, err) //nolint:errorlint + } + + e.additionalInformation = e.raw + + return nil +} + +// String makes errorCauseProtocolViolation printable +func (e *errorCauseProtocolViolation) String() string { + return fmt.Sprintf("%s: %s", e.errorCauseHeader, e.additionalInformation) +} diff --git a/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go b/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go new file mode 100644 index 000000000..84ea0e101 --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause_unrecognized_chunk_type.go @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +// errorCauseUnrecognizedChunkType represents an SCTP error cause +type errorCauseUnrecognizedChunkType struct { + errorCauseHeader + unrecognizedChunk []byte +} + +func (e *errorCauseUnrecognizedChunkType) marshal() ([]byte, error) { + e.code = unrecognizedChunkType + e.errorCauseHeader.raw = e.unrecognizedChunk + return e.errorCauseHeader.marshal() +} + +func (e *errorCauseUnrecognizedChunkType) unmarshal(raw []byte) error { + err := e.errorCauseHeader.unmarshal(raw) + if err != nil { + return err + } + + e.unrecognizedChunk = e.errorCauseHeader.raw + return nil +} + +// String makes errorCauseUnrecognizedChunkType printable +func (e *errorCauseUnrecognizedChunkType) String() string { + return e.errorCauseHeader.String() +} diff --git a/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go b/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go new file mode 100644 index 000000000..871460e24 --- /dev/null +++ b/vendor/github.com/pion/sctp/error_cause_user_initiated_abort.go @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "fmt" +) + +/* +This error cause MAY be included in ABORT chunks that are sent +because of an upper-layer request. The upper layer can specify an +Upper Layer Abort Reason that is transported by SCTP transparently +and MAY be delivered to the upper-layer protocol at the peer. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Cause Code=12 | Cause Length=Variable | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + / Upper Layer Abort Reason / + \ \ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type errorCauseUserInitiatedAbort struct { + errorCauseHeader + upperLayerAbortReason []byte +} + +func (e *errorCauseUserInitiatedAbort) marshal() ([]byte, error) { + e.code = userInitiatedAbort + e.errorCauseHeader.raw = e.upperLayerAbortReason + return e.errorCauseHeader.marshal() +} + +func (e *errorCauseUserInitiatedAbort) unmarshal(raw []byte) error { + err := e.errorCauseHeader.unmarshal(raw) + if err != nil { + return err + } + + e.upperLayerAbortReason = e.errorCauseHeader.raw + return nil +} + +// String makes errorCauseUserInitiatedAbort printable +func (e *errorCauseUserInitiatedAbort) String() string { + return fmt.Sprintf("%s: %s", e.errorCauseHeader.String(), e.upperLayerAbortReason) +} diff --git a/vendor/github.com/pion/sctp/packet.go b/vendor/github.com/pion/sctp/packet.go new file mode 100644 index 000000000..2d40d2953 --- /dev/null +++ b/vendor/github.com/pion/sctp/packet.go @@ -0,0 +1,189 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" + "hash/crc32" +) + +// Create the crc32 table we'll use for the checksum +var castagnoliTable = crc32.MakeTable(crc32.Castagnoli) // nolint:gochecknoglobals + +// Allocate and zero this data once. +// We need to use it for the checksum and don't want to allocate/clear each time. +var fourZeroes [4]byte // nolint:gochecknoglobals + +/* +Packet represents an SCTP packet, defined in https://tools.ietf.org/html/rfc4960#section-3 +An SCTP packet is composed of a common header and chunks. A chunk +contains either control information or user data. + + SCTP Packet Format + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Common Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Chunk #1 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Chunk #n | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + SCTP Common Header Format + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Source Value Number | Destination Value Number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Verification Tag | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Checksum | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ +type packet struct { + sourcePort uint16 + destinationPort uint16 + verificationTag uint32 + chunks []chunk +} + +const ( + packetHeaderSize = 12 +) + +// SCTP packet errors +var ( + ErrPacketRawTooSmall = errors.New("raw is smaller than the minimum length for a SCTP packet") + ErrParseSCTPChunkNotEnoughData = errors.New("unable to parse SCTP chunk, not enough data for complete header") + ErrUnmarshalUnknownChunkType = errors.New("failed to unmarshal, contains unknown chunk type") + ErrChecksumMismatch = errors.New("checksum mismatch theirs") +) + +func (p *packet) unmarshal(raw []byte) error { + if len(raw) < packetHeaderSize { + return fmt.Errorf("%w: raw only %d bytes, %d is the minimum length", ErrPacketRawTooSmall, len(raw), packetHeaderSize) + } + + p.sourcePort = binary.BigEndian.Uint16(raw[0:]) + p.destinationPort = binary.BigEndian.Uint16(raw[2:]) + p.verificationTag = binary.BigEndian.Uint32(raw[4:]) + + offset := packetHeaderSize + for { + // Exact match, no more chunks + if offset == len(raw) { + break + } else if offset+chunkHeaderSize > len(raw) { + return fmt.Errorf("%w: offset %d remaining %d", ErrParseSCTPChunkNotEnoughData, offset, len(raw)) + } + + var c chunk + switch chunkType(raw[offset]) { + case ctInit: + c = &chunkInit{} + case ctInitAck: + c = &chunkInitAck{} + case ctAbort: + c = &chunkAbort{} + case ctCookieEcho: + c = &chunkCookieEcho{} + case ctCookieAck: + c = &chunkCookieAck{} + case ctHeartbeat: + c = &chunkHeartbeat{} + case ctPayloadData: + c = &chunkPayloadData{} + case ctSack: + c = &chunkSelectiveAck{} + case ctReconfig: + c = &chunkReconfig{} + case ctForwardTSN: + c = &chunkForwardTSN{} + case ctError: + c = &chunkError{} + case ctShutdown: + c = &chunkShutdown{} + case ctShutdownAck: + c = &chunkShutdownAck{} + case ctShutdownComplete: + c = &chunkShutdownComplete{} + default: + return fmt.Errorf("%w: %s", ErrUnmarshalUnknownChunkType, chunkType(raw[offset]).String()) + } + + if err := c.unmarshal(raw[offset:]); err != nil { + return err + } + + p.chunks = append(p.chunks, c) + chunkValuePadding := getPadding(c.valueLength()) + offset += chunkHeaderSize + c.valueLength() + chunkValuePadding + } + theirChecksum := binary.LittleEndian.Uint32(raw[8:]) + ourChecksum := generatePacketChecksum(raw) + if theirChecksum != ourChecksum { + return fmt.Errorf("%w: %d ours: %d", ErrChecksumMismatch, theirChecksum, ourChecksum) + } + return nil +} + +func (p *packet) marshal() ([]byte, error) { + raw := make([]byte, packetHeaderSize) + + // Populate static headers + // 8-12 is Checksum which will be populated when packet is complete + binary.BigEndian.PutUint16(raw[0:], p.sourcePort) + binary.BigEndian.PutUint16(raw[2:], p.destinationPort) + binary.BigEndian.PutUint32(raw[4:], p.verificationTag) + + // Populate chunks + for _, c := range p.chunks { + chunkRaw, err := c.marshal() + if err != nil { + return nil, err + } + raw = append(raw, chunkRaw...) + + paddingNeeded := getPadding(len(raw)) + if paddingNeeded != 0 { + raw = append(raw, make([]byte, paddingNeeded)...) + } + } + + // Checksum is already in BigEndian + // Using LittleEndian.PutUint32 stops it from being flipped + binary.LittleEndian.PutUint32(raw[8:], generatePacketChecksum(raw)) + return raw, nil +} + +func generatePacketChecksum(raw []byte) (sum uint32) { + // Fastest way to do a crc32 without allocating. + sum = crc32.Update(sum, castagnoliTable, raw[0:8]) + sum = crc32.Update(sum, castagnoliTable, fourZeroes[:]) + sum = crc32.Update(sum, castagnoliTable, raw[12:]) + return sum +} + +// String makes packet printable +func (p *packet) String() string { + format := `Packet: + sourcePort: %d + destinationPort: %d + verificationTag: %d + ` + res := fmt.Sprintf(format, + p.sourcePort, + p.destinationPort, + p.verificationTag, + ) + for i, chunk := range p.chunks { + res += fmt.Sprintf("Chunk %d:\n %s", i, chunk) + } + return res +} diff --git a/vendor/github.com/pion/sctp/param.go b/vendor/github.com/pion/sctp/param.go new file mode 100644 index 000000000..8035add3b --- /dev/null +++ b/vendor/github.com/pion/sctp/param.go @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" +) + +type param interface { + marshal() ([]byte, error) + length() int +} + +// ErrParamTypeUnhandled is returned if unknown parameter type is specified. +var ErrParamTypeUnhandled = errors.New("unhandled ParamType") + +func buildParam(t paramType, rawParam []byte) (param, error) { + switch t { + case forwardTSNSupp: + return (¶mForwardTSNSupported{}).unmarshal(rawParam) + case supportedExt: + return (¶mSupportedExtensions{}).unmarshal(rawParam) + case ecnCapable: + return (¶mECNCapable{}).unmarshal(rawParam) + case random: + return (¶mRandom{}).unmarshal(rawParam) + case reqHMACAlgo: + return (¶mRequestedHMACAlgorithm{}).unmarshal(rawParam) + case chunkList: + return (¶mChunkList{}).unmarshal(rawParam) + case stateCookie: + return (¶mStateCookie{}).unmarshal(rawParam) + case heartbeatInfo: + return (¶mHeartbeatInfo{}).unmarshal(rawParam) + case outSSNResetReq: + return (¶mOutgoingResetRequest{}).unmarshal(rawParam) + case reconfigResp: + return (¶mReconfigResponse{}).unmarshal(rawParam) + default: + return nil, fmt.Errorf("%w: %v", ErrParamTypeUnhandled, t) + } +} diff --git a/vendor/github.com/pion/sctp/param_chunk_list.go b/vendor/github.com/pion/sctp/param_chunk_list.go new file mode 100644 index 000000000..fe8905208 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_chunk_list.go @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type paramChunkList struct { + paramHeader + chunkTypes []chunkType +} + +func (c *paramChunkList) marshal() ([]byte, error) { + c.typ = chunkList + c.raw = make([]byte, len(c.chunkTypes)) + for i, t := range c.chunkTypes { + c.raw[i] = byte(t) + } + + return c.paramHeader.marshal() +} + +func (c *paramChunkList) unmarshal(raw []byte) (param, error) { + err := c.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + for _, t := range c.raw { + c.chunkTypes = append(c.chunkTypes, chunkType(t)) + } + + return c, nil +} diff --git a/vendor/github.com/pion/sctp/param_ecn_capable.go b/vendor/github.com/pion/sctp/param_ecn_capable.go new file mode 100644 index 000000000..d6cd0d320 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_ecn_capable.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type paramECNCapable struct { + paramHeader +} + +func (r *paramECNCapable) marshal() ([]byte, error) { + r.typ = ecnCapable + r.raw = []byte{} + return r.paramHeader.marshal() +} + +func (r *paramECNCapable) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/github.com/pion/sctp/param_forward_tsn_supported.go b/vendor/github.com/pion/sctp/param_forward_tsn_supported.go new file mode 100644 index 000000000..655a93ff8 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_forward_tsn_supported.go @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +// At the initialization of the association, the sender of the INIT or +// INIT ACK chunk MAY include this OPTIONAL parameter to inform its peer +// that it is able to support the Forward TSN chunk +// +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Parameter Type = 49152 | Parameter Length = 4 | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type paramForwardTSNSupported struct { + paramHeader +} + +func (f *paramForwardTSNSupported) marshal() ([]byte, error) { + f.typ = forwardTSNSupp + f.raw = []byte{} + return f.paramHeader.marshal() +} + +func (f *paramForwardTSNSupported) unmarshal(raw []byte) (param, error) { + err := f.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + return f, nil +} diff --git a/vendor/github.com/pion/sctp/param_heartbeat_info.go b/vendor/github.com/pion/sctp/param_heartbeat_info.go new file mode 100644 index 000000000..06f70486d --- /dev/null +++ b/vendor/github.com/pion/sctp/param_heartbeat_info.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type paramHeartbeatInfo struct { + paramHeader + heartbeatInformation []byte +} + +func (h *paramHeartbeatInfo) marshal() ([]byte, error) { + h.typ = heartbeatInfo + h.raw = h.heartbeatInformation + return h.paramHeader.marshal() +} + +func (h *paramHeartbeatInfo) unmarshal(raw []byte) (param, error) { + err := h.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + h.heartbeatInformation = h.raw + return h, nil +} diff --git a/vendor/github.com/pion/sctp/param_outgoing_reset_request.go b/vendor/github.com/pion/sctp/param_outgoing_reset_request.go new file mode 100644 index 000000000..45ee28f95 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_outgoing_reset_request.go @@ -0,0 +1,94 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" +) + +const ( + paramOutgoingResetRequestStreamIdentifiersOffset = 12 +) + +// This parameter is used by the sender to request the reset of some or +// all outgoing streams. +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Parameter Type = 13 | Parameter Length = 16 + 2 * N | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Re-configuration Request Sequence Number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Re-configuration Response Sequence Number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Sender's Last Assigned TSN | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Stream Number 1 (optional) | Stream Number 2 (optional) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// / ...... / +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Stream Number N-1 (optional) | Stream Number N (optional) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type paramOutgoingResetRequest struct { + paramHeader + // reconfigRequestSequenceNumber is used to identify the request. It is a monotonically + // increasing number that is initialized to the same value as the + // initial TSN. It is increased by 1 whenever sending a new Re- + // configuration Request Parameter. + reconfigRequestSequenceNumber uint32 + // When this Outgoing SSN Reset Request Parameter is sent in response + // to an Incoming SSN Reset Request Parameter, this parameter is also + // an implicit response to the incoming request. This field then + // holds the Re-configuration Request Sequence Number of the incoming + // request. In other cases, it holds the next expected + // Re-configuration Request Sequence Number minus 1. + reconfigResponseSequenceNumber uint32 + // This value holds the next TSN minus 1 -- in other words, the last + // TSN that this sender assigned. + senderLastTSN uint32 + // This optional field, if included, is used to indicate specific + // streams that are to be reset. If no streams are listed, then all + // streams are to be reset. + streamIdentifiers []uint16 +} + +// Outgoing reset request parameter errors +var ( + ErrSSNResetRequestParamTooShort = errors.New("outgoing SSN reset request parameter too short") +) + +func (r *paramOutgoingResetRequest) marshal() ([]byte, error) { + r.typ = outSSNResetReq + r.raw = make([]byte, paramOutgoingResetRequestStreamIdentifiersOffset+2*len(r.streamIdentifiers)) + binary.BigEndian.PutUint32(r.raw, r.reconfigRequestSequenceNumber) + binary.BigEndian.PutUint32(r.raw[4:], r.reconfigResponseSequenceNumber) + binary.BigEndian.PutUint32(r.raw[8:], r.senderLastTSN) + for i, sID := range r.streamIdentifiers { + binary.BigEndian.PutUint16(r.raw[paramOutgoingResetRequestStreamIdentifiersOffset+2*i:], sID) + } + return r.paramHeader.marshal() +} + +func (r *paramOutgoingResetRequest) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + if len(r.raw) < paramOutgoingResetRequestStreamIdentifiersOffset { + return nil, ErrSSNResetRequestParamTooShort + } + r.reconfigRequestSequenceNumber = binary.BigEndian.Uint32(r.raw) + r.reconfigResponseSequenceNumber = binary.BigEndian.Uint32(r.raw[4:]) + r.senderLastTSN = binary.BigEndian.Uint32(r.raw[8:]) + + lim := (len(r.raw) - paramOutgoingResetRequestStreamIdentifiersOffset) / 2 + r.streamIdentifiers = make([]uint16, lim) + for i := 0; i < lim; i++ { + r.streamIdentifiers[i] = binary.BigEndian.Uint16(r.raw[paramOutgoingResetRequestStreamIdentifiersOffset+2*i:]) + } + + return r, nil +} diff --git a/vendor/github.com/pion/sctp/param_random.go b/vendor/github.com/pion/sctp/param_random.go new file mode 100644 index 000000000..4a80aa01b --- /dev/null +++ b/vendor/github.com/pion/sctp/param_random.go @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type paramRandom struct { + paramHeader + randomData []byte +} + +func (r *paramRandom) marshal() ([]byte, error) { + r.typ = random + r.raw = r.randomData + return r.paramHeader.marshal() +} + +func (r *paramRandom) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + r.randomData = r.raw + return r, nil +} diff --git a/vendor/github.com/pion/sctp/param_reconfig_response.go b/vendor/github.com/pion/sctp/param_reconfig_response.go new file mode 100644 index 000000000..e35f16a15 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_reconfig_response.go @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +// This parameter is used by the receiver of a Re-configuration Request +// Parameter to respond to the request. +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Parameter Type = 16 | Parameter Length | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Re-configuration Response Sequence Number | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Result | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Sender's Next TSN (optional) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Receiver's Next TSN (optional) | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +type paramReconfigResponse struct { + paramHeader + // This value is copied from the request parameter and is used by the + // receiver of the Re-configuration Response Parameter to tie the + // response to the request. + reconfigResponseSequenceNumber uint32 + // This value describes the result of the processing of the request. + result reconfigResult +} + +type reconfigResult uint32 + +const ( + reconfigResultSuccessNOP reconfigResult = 0 + reconfigResultSuccessPerformed reconfigResult = 1 + reconfigResultDenied reconfigResult = 2 + reconfigResultErrorWrongSSN reconfigResult = 3 + reconfigResultErrorRequestAlreadyInProgress reconfigResult = 4 + reconfigResultErrorBadSequenceNumber reconfigResult = 5 + reconfigResultInProgress reconfigResult = 6 +) + +// Reconfiguration response errors +var ( + ErrReconfigRespParamTooShort = errors.New("reconfig response parameter too short") +) + +func (t reconfigResult) String() string { + switch t { + case reconfigResultSuccessNOP: + return "0: Success - Nothing to do" + case reconfigResultSuccessPerformed: + return "1: Success - Performed" + case reconfigResultDenied: + return "2: Denied" + case reconfigResultErrorWrongSSN: + return "3: Error - Wrong SSN" + case reconfigResultErrorRequestAlreadyInProgress: + return "4: Error - Request already in progress" + case reconfigResultErrorBadSequenceNumber: + return "5: Error - Bad Sequence Number" + case reconfigResultInProgress: + return "6: In progress" + default: + return fmt.Sprintf("Unknown reconfigResult: %d", t) + } +} + +func (r *paramReconfigResponse) marshal() ([]byte, error) { + r.typ = reconfigResp + r.raw = make([]byte, 8) + binary.BigEndian.PutUint32(r.raw, r.reconfigResponseSequenceNumber) + binary.BigEndian.PutUint32(r.raw[4:], uint32(r.result)) + + return r.paramHeader.marshal() +} + +func (r *paramReconfigResponse) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + if len(r.raw) < 8 { + return nil, ErrReconfigRespParamTooShort + } + r.reconfigResponseSequenceNumber = binary.BigEndian.Uint32(r.raw) + r.result = reconfigResult(binary.BigEndian.Uint32(r.raw[4:])) + + return r, nil +} diff --git a/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go b/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go new file mode 100644 index 000000000..ca9b01470 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_requested_hmac_algorithm.go @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +type hmacAlgorithm uint16 + +const ( + hmacResv1 hmacAlgorithm = 0 + hmacSHA128 = 1 + hmacResv2 hmacAlgorithm = 2 + hmacSHA256 hmacAlgorithm = 3 +) + +// ErrInvalidAlgorithmType is returned if unknown auth algorithm is specified. +var ErrInvalidAlgorithmType = errors.New("invalid algorithm type") + +func (c hmacAlgorithm) String() string { + switch c { + case hmacResv1: + return "HMAC Reserved (0x00)" + case hmacSHA128: + return "HMAC SHA-128" + case hmacResv2: + return "HMAC Reserved (0x02)" + case hmacSHA256: + return "HMAC SHA-256" + default: + return fmt.Sprintf("Unknown HMAC Algorithm type: %d", c) + } +} + +type paramRequestedHMACAlgorithm struct { + paramHeader + availableAlgorithms []hmacAlgorithm +} + +func (r *paramRequestedHMACAlgorithm) marshal() ([]byte, error) { + r.typ = reqHMACAlgo + r.raw = make([]byte, len(r.availableAlgorithms)*2) + i := 0 + for _, a := range r.availableAlgorithms { + binary.BigEndian.PutUint16(r.raw[i:], uint16(a)) + i += 2 + } + + return r.paramHeader.marshal() +} + +func (r *paramRequestedHMACAlgorithm) unmarshal(raw []byte) (param, error) { + err := r.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + + i := 0 + for i < len(r.raw) { + a := hmacAlgorithm(binary.BigEndian.Uint16(r.raw[i:])) + switch a { + case hmacSHA128: + fallthrough + case hmacSHA256: + r.availableAlgorithms = append(r.availableAlgorithms, a) + default: + return nil, fmt.Errorf("%w: %v", ErrInvalidAlgorithmType, a) + } + + i += 2 + } + + return r, nil +} diff --git a/vendor/github.com/pion/sctp/param_state_cookie.go b/vendor/github.com/pion/sctp/param_state_cookie.go new file mode 100644 index 000000000..dbf8992e7 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_state_cookie.go @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "crypto/rand" + "fmt" +) + +type paramStateCookie struct { + paramHeader + cookie []byte +} + +func newRandomStateCookie() (*paramStateCookie, error) { + randCookie := make([]byte, 32) + _, err := rand.Read(randCookie) + // crypto/rand.Read returns n == len(b) if and only if err == nil. + if err != nil { + return nil, err + } + + s := ¶mStateCookie{ + cookie: randCookie, + } + + return s, nil +} + +func (s *paramStateCookie) marshal() ([]byte, error) { + s.typ = stateCookie + s.raw = s.cookie + return s.paramHeader.marshal() +} + +func (s *paramStateCookie) unmarshal(raw []byte) (param, error) { + err := s.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + s.cookie = s.raw + return s, nil +} + +// String makes paramStateCookie printable +func (s *paramStateCookie) String() string { + return fmt.Sprintf("%s: %s", s.paramHeader, s.cookie) +} diff --git a/vendor/github.com/pion/sctp/param_supported_extensions.go b/vendor/github.com/pion/sctp/param_supported_extensions.go new file mode 100644 index 000000000..0441053a1 --- /dev/null +++ b/vendor/github.com/pion/sctp/param_supported_extensions.go @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +type paramSupportedExtensions struct { + paramHeader + ChunkTypes []chunkType +} + +func (s *paramSupportedExtensions) marshal() ([]byte, error) { + s.typ = supportedExt + s.raw = make([]byte, len(s.ChunkTypes)) + for i, c := range s.ChunkTypes { + s.raw[i] = byte(c) + } + + return s.paramHeader.marshal() +} + +func (s *paramSupportedExtensions) unmarshal(raw []byte) (param, error) { + err := s.paramHeader.unmarshal(raw) + if err != nil { + return nil, err + } + + for _, t := range s.raw { + s.ChunkTypes = append(s.ChunkTypes, chunkType(t)) + } + + return s, nil +} diff --git a/vendor/github.com/pion/sctp/paramheader.go b/vendor/github.com/pion/sctp/paramheader.go new file mode 100644 index 000000000..5cef07d5c --- /dev/null +++ b/vendor/github.com/pion/sctp/paramheader.go @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "encoding/hex" + "errors" + "fmt" +) + +type paramHeader struct { + typ paramType + len int + raw []byte +} + +const ( + paramHeaderLength = 4 +) + +// Parameter header parse errors +var ( + ErrParamHeaderTooShort = errors.New("param header too short") + ErrParamHeaderSelfReportedLengthShorter = errors.New("param self reported length is shorter than header length") + ErrParamHeaderSelfReportedLengthLonger = errors.New("param self reported length is longer than header length") + ErrParamHeaderParseFailed = errors.New("failed to parse param type") +) + +func (p *paramHeader) marshal() ([]byte, error) { + paramLengthPlusHeader := paramHeaderLength + len(p.raw) + + rawParam := make([]byte, paramLengthPlusHeader) + binary.BigEndian.PutUint16(rawParam[0:], uint16(p.typ)) + binary.BigEndian.PutUint16(rawParam[2:], uint16(paramLengthPlusHeader)) + copy(rawParam[paramHeaderLength:], p.raw) + + return rawParam, nil +} + +func (p *paramHeader) unmarshal(raw []byte) error { + if len(raw) < paramHeaderLength { + return ErrParamHeaderTooShort + } + + paramLengthPlusHeader := binary.BigEndian.Uint16(raw[2:]) + if int(paramLengthPlusHeader) < paramHeaderLength { + return fmt.Errorf("%w: param self reported length (%d) shorter than header length (%d)", ErrParamHeaderSelfReportedLengthShorter, int(paramLengthPlusHeader), paramHeaderLength) + } + if len(raw) < int(paramLengthPlusHeader) { + return fmt.Errorf("%w: param length (%d) shorter than its self reported length (%d)", ErrParamHeaderSelfReportedLengthLonger, len(raw), int(paramLengthPlusHeader)) + } + + typ, err := parseParamType(raw[0:]) + if err != nil { + return fmt.Errorf("%w: %v", ErrParamHeaderParseFailed, err) //nolint:errorlint + } + p.typ = typ + p.raw = raw[paramHeaderLength:paramLengthPlusHeader] + p.len = int(paramLengthPlusHeader) + + return nil +} + +func (p *paramHeader) length() int { + return p.len +} + +// String makes paramHeader printable +func (p paramHeader) String() string { + return fmt.Sprintf("%s (%d): %s", p.typ, p.len, hex.Dump(p.raw)) +} diff --git a/vendor/github.com/pion/sctp/paramtype.go b/vendor/github.com/pion/sctp/paramtype.go new file mode 100644 index 000000000..f0a3da385 --- /dev/null +++ b/vendor/github.com/pion/sctp/paramtype.go @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "encoding/binary" + "errors" + "fmt" +) + +// paramType represents a SCTP INIT/INITACK parameter +type paramType uint16 + +const ( + heartbeatInfo paramType = 1 // Heartbeat Info [RFC4960] + ipV4Addr paramType = 5 // IPv4 IP [RFC4960] + ipV6Addr paramType = 6 // IPv6 IP [RFC4960] + stateCookie paramType = 7 // State Cookie [RFC4960] + unrecognizedParam paramType = 8 // Unrecognized Parameters [RFC4960] + cookiePreservative paramType = 9 // Cookie Preservative [RFC4960] + hostNameAddr paramType = 11 // Host Name IP [RFC4960] + supportedAddrTypes paramType = 12 // Supported IP Types [RFC4960] + outSSNResetReq paramType = 13 // Outgoing SSN Reset Request Parameter [RFC6525] + incSSNResetReq paramType = 14 // Incoming SSN Reset Request Parameter [RFC6525] + ssnTSNResetReq paramType = 15 // SSN/TSN Reset Request Parameter [RFC6525] + reconfigResp paramType = 16 // Re-configuration Response Parameter [RFC6525] + addOutStreamsReq paramType = 17 // Add Outgoing Streams Request Parameter [RFC6525] + addIncStreamsReq paramType = 18 // Add Incoming Streams Request Parameter [RFC6525] + ecnCapable paramType = 32768 // ECN Capable (0x8000) [RFC2960] + random paramType = 32770 // Random (0x8002) [RFC4805] + chunkList paramType = 32771 // Chunk List (0x8003) [RFC4895] + reqHMACAlgo paramType = 32772 // Requested HMAC Algorithm Parameter (0x8004) [RFC4895] + padding paramType = 32773 // Padding (0x8005) + supportedExt paramType = 32776 // Supported Extensions (0x8008) [RFC5061] + forwardTSNSupp paramType = 49152 // Forward TSN supported (0xC000) [RFC3758] + addIPAddr paramType = 49153 // Add IP IP (0xC001) [RFC5061] + delIPAddr paramType = 49154 // Delete IP IP (0xC002) [RFC5061] + errClauseInd paramType = 49155 // Error Cause Indication (0xC003) [RFC5061] + setPriAddr paramType = 49156 // Set Primary IP (0xC004) [RFC5061] + successInd paramType = 49157 // Success Indication (0xC005) [RFC5061] + adaptLayerInd paramType = 49158 // Adaptation Layer Indication (0xC006) [RFC5061] +) + +// Parameter packet errors +var ( + ErrParamPacketTooShort = errors.New("packet to short") +) + +func parseParamType(raw []byte) (paramType, error) { + if len(raw) < 2 { + return paramType(0), ErrParamPacketTooShort + } + return paramType(binary.BigEndian.Uint16(raw)), nil +} + +func (p paramType) String() string { + switch p { + case heartbeatInfo: + return "Heartbeat Info" + case ipV4Addr: + return "IPv4 IP" + case ipV6Addr: + return "IPv6 IP" + case stateCookie: + return "State Cookie" + case unrecognizedParam: + return "Unrecognized Parameters" + case cookiePreservative: + return "Cookie Preservative" + case hostNameAddr: + return "Host Name IP" + case supportedAddrTypes: + return "Supported IP Types" + case outSSNResetReq: + return "Outgoing SSN Reset Request Parameter" + case incSSNResetReq: + return "Incoming SSN Reset Request Parameter" + case ssnTSNResetReq: + return "SSN/TSN Reset Request Parameter" + case reconfigResp: + return "Re-configuration Response Parameter" + case addOutStreamsReq: + return "Add Outgoing Streams Request Parameter" + case addIncStreamsReq: + return "Add Incoming Streams Request Parameter" + case ecnCapable: + return "ECN Capable" + case random: + return "Random" + case chunkList: + return "Chunk List" + case reqHMACAlgo: + return "Requested HMAC Algorithm Parameter" + case padding: + return "Padding" + case supportedExt: + return "Supported Extensions" + case forwardTSNSupp: + return "Forward TSN supported" + case addIPAddr: + return "Add IP IP" + case delIPAddr: + return "Delete IP IP" + case errClauseInd: + return "Error Cause Indication" + case setPriAddr: + return "Set Primary IP" + case successInd: + return "Success Indication" + case adaptLayerInd: + return "Adaptation Layer Indication" + default: + return fmt.Sprintf("Unknown ParamType: %d", p) + } +} diff --git a/vendor/github.com/pion/sctp/payload_queue.go b/vendor/github.com/pion/sctp/payload_queue.go new file mode 100644 index 000000000..e5925a51e --- /dev/null +++ b/vendor/github.com/pion/sctp/payload_queue.go @@ -0,0 +1,182 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "fmt" + "sort" +) + +type payloadQueue struct { + chunkMap map[uint32]*chunkPayloadData + sorted []uint32 + dupTSN []uint32 + nBytes int +} + +func newPayloadQueue() *payloadQueue { + return &payloadQueue{chunkMap: map[uint32]*chunkPayloadData{}} +} + +func (q *payloadQueue) updateSortedKeys() { + if q.sorted != nil { + return + } + + q.sorted = make([]uint32, len(q.chunkMap)) + i := 0 + for k := range q.chunkMap { + q.sorted[i] = k + i++ + } + + sort.Slice(q.sorted, func(i, j int) bool { + return sna32LT(q.sorted[i], q.sorted[j]) + }) +} + +func (q *payloadQueue) canPush(p *chunkPayloadData, cumulativeTSN uint32) bool { + _, ok := q.chunkMap[p.tsn] + if ok || sna32LTE(p.tsn, cumulativeTSN) { + return false + } + return true +} + +func (q *payloadQueue) pushNoCheck(p *chunkPayloadData) { + q.chunkMap[p.tsn] = p + q.nBytes += len(p.userData) + q.sorted = nil +} + +// push pushes a payload data. If the payload data is already in our queue or +// older than our cumulativeTSN marker, it will be recored as duplications, +// which can later be retrieved using popDuplicates. +func (q *payloadQueue) push(p *chunkPayloadData, cumulativeTSN uint32) bool { + _, ok := q.chunkMap[p.tsn] + if ok || sna32LTE(p.tsn, cumulativeTSN) { + // Found the packet, log in dups + q.dupTSN = append(q.dupTSN, p.tsn) + return false + } + + q.chunkMap[p.tsn] = p + q.nBytes += len(p.userData) + q.sorted = nil + return true +} + +// pop pops only if the oldest chunk's TSN matches the given TSN. +func (q *payloadQueue) pop(tsn uint32) (*chunkPayloadData, bool) { + q.updateSortedKeys() + + if len(q.chunkMap) > 0 && tsn == q.sorted[0] { + q.sorted = q.sorted[1:] + if c, ok := q.chunkMap[tsn]; ok { + delete(q.chunkMap, tsn) + q.nBytes -= len(c.userData) + return c, true + } + } + + return nil, false +} + +// get returns reference to chunkPayloadData with the given TSN value. +func (q *payloadQueue) get(tsn uint32) (*chunkPayloadData, bool) { + c, ok := q.chunkMap[tsn] + return c, ok +} + +// popDuplicates returns an array of TSN values that were found duplicate. +func (q *payloadQueue) popDuplicates() []uint32 { + dups := q.dupTSN + q.dupTSN = []uint32{} + return dups +} + +func (q *payloadQueue) getGapAckBlocks(cumulativeTSN uint32) (gapAckBlocks []gapAckBlock) { + var b gapAckBlock + + if len(q.chunkMap) == 0 { + return []gapAckBlock{} + } + + q.updateSortedKeys() + + for i, tsn := range q.sorted { + if i == 0 { + b.start = uint16(tsn - cumulativeTSN) + b.end = b.start + continue + } + diff := uint16(tsn - cumulativeTSN) + if b.end+1 == diff { + b.end++ + } else { + gapAckBlocks = append(gapAckBlocks, gapAckBlock{ + start: b.start, + end: b.end, + }) + b.start = diff + b.end = diff + } + } + + gapAckBlocks = append(gapAckBlocks, gapAckBlock{ + start: b.start, + end: b.end, + }) + + return gapAckBlocks +} + +func (q *payloadQueue) getGapAckBlocksString(cumulativeTSN uint32) string { + gapAckBlocks := q.getGapAckBlocks(cumulativeTSN) + str := fmt.Sprintf("cumTSN=%d", cumulativeTSN) + for _, b := range gapAckBlocks { + str += fmt.Sprintf(",%d-%d", b.start, b.end) + } + return str +} + +func (q *payloadQueue) markAsAcked(tsn uint32) int { + var nBytesAcked int + if c, ok := q.chunkMap[tsn]; ok { + c.acked = true + c.retransmit = false + nBytesAcked = len(c.userData) + q.nBytes -= nBytesAcked + c.userData = []byte{} + } + + return nBytesAcked +} + +func (q *payloadQueue) getLastTSNReceived() (uint32, bool) { + q.updateSortedKeys() + + qlen := len(q.sorted) + if qlen == 0 { + return 0, false + } + return q.sorted[qlen-1], true +} + +func (q *payloadQueue) markAllToRetrasmit() { + for _, c := range q.chunkMap { + if c.acked || c.abandoned() { + continue + } + c.retransmit = true + } +} + +func (q *payloadQueue) getNumBytes() int { + return q.nBytes +} + +func (q *payloadQueue) size() int { + return len(q.chunkMap) +} diff --git a/vendor/github.com/pion/sctp/pending_queue.go b/vendor/github.com/pion/sctp/pending_queue.go new file mode 100644 index 000000000..6f70fea23 --- /dev/null +++ b/vendor/github.com/pion/sctp/pending_queue.go @@ -0,0 +1,142 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" +) + +// pendingBaseQueue + +type pendingBaseQueue struct { + queue []*chunkPayloadData +} + +func newPendingBaseQueue() *pendingBaseQueue { + return &pendingBaseQueue{queue: []*chunkPayloadData{}} +} + +func (q *pendingBaseQueue) push(c *chunkPayloadData) { + q.queue = append(q.queue, c) +} + +func (q *pendingBaseQueue) pop() *chunkPayloadData { + if len(q.queue) == 0 { + return nil + } + c := q.queue[0] + q.queue = q.queue[1:] + return c +} + +func (q *pendingBaseQueue) get(i int) *chunkPayloadData { + if len(q.queue) == 0 || i < 0 || i >= len(q.queue) { + return nil + } + return q.queue[i] +} + +func (q *pendingBaseQueue) size() int { + return len(q.queue) +} + +// pendingQueue + +type pendingQueue struct { + unorderedQueue *pendingBaseQueue + orderedQueue *pendingBaseQueue + nBytes int + selected bool + unorderedIsSelected bool +} + +// Pending queue errors +var ( + ErrUnexpectedChuckPoppedUnordered = errors.New("unexpected chunk popped (unordered)") + ErrUnexpectedChuckPoppedOrdered = errors.New("unexpected chunk popped (ordered)") + ErrUnexpectedQState = errors.New("unexpected q state (should've been selected)") +) + +func newPendingQueue() *pendingQueue { + return &pendingQueue{ + unorderedQueue: newPendingBaseQueue(), + orderedQueue: newPendingBaseQueue(), + } +} + +func (q *pendingQueue) push(c *chunkPayloadData) { + if c.unordered { + q.unorderedQueue.push(c) + } else { + q.orderedQueue.push(c) + } + q.nBytes += len(c.userData) +} + +func (q *pendingQueue) peek() *chunkPayloadData { + if q.selected { + if q.unorderedIsSelected { + return q.unorderedQueue.get(0) + } + return q.orderedQueue.get(0) + } + + if c := q.unorderedQueue.get(0); c != nil { + return c + } + return q.orderedQueue.get(0) +} + +func (q *pendingQueue) pop(c *chunkPayloadData) error { + if q.selected { + var popped *chunkPayloadData + if q.unorderedIsSelected { + popped = q.unorderedQueue.pop() + if popped != c { + return ErrUnexpectedChuckPoppedUnordered + } + } else { + popped = q.orderedQueue.pop() + if popped != c { + return ErrUnexpectedChuckPoppedOrdered + } + } + if popped.endingFragment { + q.selected = false + } + } else { + if !c.beginningFragment { + return ErrUnexpectedQState + } + if c.unordered { + popped := q.unorderedQueue.pop() + if popped != c { + return ErrUnexpectedChuckPoppedUnordered + } + if !popped.endingFragment { + q.selected = true + q.unorderedIsSelected = true + } + } else { + popped := q.orderedQueue.pop() + if popped != c { + return ErrUnexpectedChuckPoppedOrdered + } + if !popped.endingFragment { + q.selected = true + q.unorderedIsSelected = false + } + } + } + q.nBytes -= len(c.userData) + return nil +} + +func (q *pendingQueue) getNumBytes() int { + return q.nBytes +} + +func (q *pendingQueue) size() int { + return q.unorderedQueue.size() + q.orderedQueue.size() +} diff --git a/vendor/github.com/pion/sctp/reassembly_queue.go b/vendor/github.com/pion/sctp/reassembly_queue.go new file mode 100644 index 000000000..c23e69915 --- /dev/null +++ b/vendor/github.com/pion/sctp/reassembly_queue.go @@ -0,0 +1,355 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "io" + "sort" + "sync/atomic" +) + +func sortChunksByTSN(a []*chunkPayloadData) { + sort.Slice(a, func(i, j int) bool { + return sna32LT(a[i].tsn, a[j].tsn) + }) +} + +func sortChunksBySSN(a []*chunkSet) { + sort.Slice(a, func(i, j int) bool { + return sna16LT(a[i].ssn, a[j].ssn) + }) +} + +// chunkSet is a set of chunks that share the same SSN +type chunkSet struct { + ssn uint16 // used only with the ordered chunks + ppi PayloadProtocolIdentifier + chunks []*chunkPayloadData +} + +func newChunkSet(ssn uint16, ppi PayloadProtocolIdentifier) *chunkSet { + return &chunkSet{ + ssn: ssn, + ppi: ppi, + chunks: []*chunkPayloadData{}, + } +} + +func (set *chunkSet) push(chunk *chunkPayloadData) bool { + // check if dup + for _, c := range set.chunks { + if c.tsn == chunk.tsn { + return false + } + } + + // append and sort + set.chunks = append(set.chunks, chunk) + sortChunksByTSN(set.chunks) + + // Check if we now have a complete set + complete := set.isComplete() + return complete +} + +func (set *chunkSet) isComplete() bool { + // Condition for complete set + // 0. Has at least one chunk. + // 1. Begins with beginningFragment set to true + // 2. Ends with endingFragment set to true + // 3. TSN monotinically increase by 1 from beginning to end + + // 0. + nChunks := len(set.chunks) + if nChunks == 0 { + return false + } + + // 1. + if !set.chunks[0].beginningFragment { + return false + } + + // 2. + if !set.chunks[nChunks-1].endingFragment { + return false + } + + // 3. + var lastTSN uint32 + for i, c := range set.chunks { + if i > 0 { + // Fragments must have contiguous TSN + // From RFC 4960 Section 3.3.1: + // When a user message is fragmented into multiple chunks, the TSNs are + // used by the receiver to reassemble the message. This means that the + // TSNs for each fragment of a fragmented user message MUST be strictly + // sequential. + if c.tsn != lastTSN+1 { + // mid or end fragment is missing + return false + } + } + + lastTSN = c.tsn + } + + return true +} + +type reassemblyQueue struct { + si uint16 + nextSSN uint16 // expected SSN for next ordered chunk + ordered []*chunkSet + unordered []*chunkSet + unorderedChunks []*chunkPayloadData + nBytes uint64 +} + +var errTryAgain = errors.New("try again") + +func newReassemblyQueue(si uint16) *reassemblyQueue { + // From RFC 4960 Sec 6.5: + // The Stream Sequence Number in all the streams MUST start from 0 when + // the association is established. Also, when the Stream Sequence + // Number reaches the value 65535 the next Stream Sequence Number MUST + // be set to 0. + return &reassemblyQueue{ + si: si, + nextSSN: 0, // From RFC 4960 Sec 6.5: + ordered: make([]*chunkSet, 0), + unordered: make([]*chunkSet, 0), + } +} + +func (r *reassemblyQueue) push(chunk *chunkPayloadData) bool { + var cset *chunkSet + + if chunk.streamIdentifier != r.si { + return false + } + + if chunk.unordered { + // First, insert into unorderedChunks array + r.unorderedChunks = append(r.unorderedChunks, chunk) + atomic.AddUint64(&r.nBytes, uint64(len(chunk.userData))) + sortChunksByTSN(r.unorderedChunks) + + // Scan unorderedChunks that are contiguous (in TSN) + cset = r.findCompleteUnorderedChunkSet() + + // If found, append the complete set to the unordered array + if cset != nil { + r.unordered = append(r.unordered, cset) + return true + } + + return false + } + + // This is an ordered chunk + + if sna16LT(chunk.streamSequenceNumber, r.nextSSN) { + return false + } + + // Check if a chunkSet with the SSN already exists + for _, set := range r.ordered { + if set.ssn == chunk.streamSequenceNumber { + cset = set + break + } + } + + // If not found, create a new chunkSet + if cset == nil { + cset = newChunkSet(chunk.streamSequenceNumber, chunk.payloadType) + r.ordered = append(r.ordered, cset) + if !chunk.unordered { + sortChunksBySSN(r.ordered) + } + } + + atomic.AddUint64(&r.nBytes, uint64(len(chunk.userData))) + + return cset.push(chunk) +} + +func (r *reassemblyQueue) findCompleteUnorderedChunkSet() *chunkSet { + startIdx := -1 + nChunks := 0 + var lastTSN uint32 + var found bool + + for i, c := range r.unorderedChunks { + // seek beigining + if c.beginningFragment { + startIdx = i + nChunks = 1 + lastTSN = c.tsn + + if c.endingFragment { + found = true + break + } + continue + } + + if startIdx < 0 { + continue + } + + // Check if contiguous in TSN + if c.tsn != lastTSN+1 { + startIdx = -1 + continue + } + + lastTSN = c.tsn + nChunks++ + + if c.endingFragment { + found = true + break + } + } + + if !found { + return nil + } + + // Extract the range of chunks + var chunks []*chunkPayloadData + chunks = append(chunks, r.unorderedChunks[startIdx:startIdx+nChunks]...) + + r.unorderedChunks = append( + r.unorderedChunks[:startIdx], + r.unorderedChunks[startIdx+nChunks:]...) + + chunkSet := newChunkSet(0, chunks[0].payloadType) + chunkSet.chunks = chunks + + return chunkSet +} + +func (r *reassemblyQueue) isReadable() bool { + // Check unordered first + if len(r.unordered) > 0 { + // The chunk sets in r.unordered should all be complete. + return true + } + + // Check ordered sets + if len(r.ordered) > 0 { + cset := r.ordered[0] + if cset.isComplete() { + if sna16LTE(cset.ssn, r.nextSSN) { + return true + } + } + } + return false +} + +func (r *reassemblyQueue) read(buf []byte) (int, PayloadProtocolIdentifier, error) { + var cset *chunkSet + // Check unordered first + switch { + case len(r.unordered) > 0: + cset = r.unordered[0] + r.unordered = r.unordered[1:] + case len(r.ordered) > 0: + // Now, check ordered + cset = r.ordered[0] + if !cset.isComplete() { + return 0, 0, errTryAgain + } + if sna16GT(cset.ssn, r.nextSSN) { + return 0, 0, errTryAgain + } + r.ordered = r.ordered[1:] + if cset.ssn == r.nextSSN { + r.nextSSN++ + } + default: + return 0, 0, errTryAgain + } + + // Concat all fragments into the buffer + nWritten := 0 + ppi := cset.ppi + var err error + for _, c := range cset.chunks { + toCopy := len(c.userData) + r.subtractNumBytes(toCopy) + if err == nil { + n := copy(buf[nWritten:], c.userData) + nWritten += n + if n < toCopy { + err = io.ErrShortBuffer + } + } + } + + return nWritten, ppi, err +} + +func (r *reassemblyQueue) forwardTSNForOrdered(lastSSN uint16) { + // Use lastSSN to locate a chunkSet then remove it if the set has + // not been complete + keep := []*chunkSet{} + for _, set := range r.ordered { + if sna16LTE(set.ssn, lastSSN) { + if !set.isComplete() { + // drop the set + for _, c := range set.chunks { + r.subtractNumBytes(len(c.userData)) + } + continue + } + } + keep = append(keep, set) + } + r.ordered = keep + + // Finally, forward nextSSN + if sna16LTE(r.nextSSN, lastSSN) { + r.nextSSN = lastSSN + 1 + } +} + +func (r *reassemblyQueue) forwardTSNForUnordered(newCumulativeTSN uint32) { + // Remove all fragments in the unordered sets that contains chunks + // equal to or older than `newCumulativeTSN`. + // We know all sets in the r.unordered are complete ones. + // Just remove chunks that are equal to or older than newCumulativeTSN + // from the unorderedChunks + lastIdx := -1 + for i, c := range r.unorderedChunks { + if sna32GT(c.tsn, newCumulativeTSN) { + break + } + lastIdx = i + } + if lastIdx >= 0 { + for _, c := range r.unorderedChunks[0 : lastIdx+1] { + r.subtractNumBytes(len(c.userData)) + } + r.unorderedChunks = r.unorderedChunks[lastIdx+1:] + } +} + +func (r *reassemblyQueue) subtractNumBytes(nBytes int) { + cur := atomic.LoadUint64(&r.nBytes) + if int(cur) >= nBytes { + atomic.AddUint64(&r.nBytes, -uint64(nBytes)) + } else { + atomic.StoreUint64(&r.nBytes, 0) + } +} + +func (r *reassemblyQueue) getNumBytes() int { + return int(atomic.LoadUint64(&r.nBytes)) +} diff --git a/vendor/github.com/pion/sctp/renovate.json b/vendor/github.com/pion/sctp/renovate.json new file mode 100644 index 000000000..f1bb98c6a --- /dev/null +++ b/vendor/github.com/pion/sctp/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>pion/renovate-config" + ] +} diff --git a/vendor/github.com/pion/sctp/rtx_timer.go b/vendor/github.com/pion/sctp/rtx_timer.go new file mode 100644 index 000000000..8be001c1f --- /dev/null +++ b/vendor/github.com/pion/sctp/rtx_timer.go @@ -0,0 +1,222 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "math" + "sync" + "time" +) + +const ( + rtoInitial float64 = 3.0 * 1000 // msec + rtoMin float64 = 1.0 * 1000 // msec + rtoMax float64 = 60.0 * 1000 // msec + rtoAlpha float64 = 0.125 + rtoBeta float64 = 0.25 + maxInitRetrans uint = 8 + pathMaxRetrans uint = 5 + noMaxRetrans uint = 0 +) + +// rtoManager manages Rtx timeout values. +// This is an implementation of RFC 4960 sec 6.3.1. +type rtoManager struct { + srtt float64 + rttvar float64 + rto float64 + noUpdate bool + mutex sync.RWMutex +} + +// newRTOManager creates a new rtoManager. +func newRTOManager() *rtoManager { + return &rtoManager{ + rto: rtoInitial, + } +} + +// setNewRTT takes a newly measured RTT then adjust the RTO in msec. +func (m *rtoManager) setNewRTT(rtt float64) float64 { + m.mutex.Lock() + defer m.mutex.Unlock() + + if m.noUpdate { + return m.srtt + } + + if m.srtt == 0 { + // First measurement + m.srtt = rtt + m.rttvar = rtt / 2 + } else { + // Subsequent rtt measurement + m.rttvar = (1-rtoBeta)*m.rttvar + rtoBeta*(math.Abs(m.srtt-rtt)) + m.srtt = (1-rtoAlpha)*m.srtt + rtoAlpha*rtt + } + m.rto = math.Min(math.Max(m.srtt+4*m.rttvar, rtoMin), rtoMax) + return m.srtt +} + +// getRTO simply returns the current RTO in msec. +func (m *rtoManager) getRTO() float64 { + m.mutex.RLock() + defer m.mutex.RUnlock() + + return m.rto +} + +// reset resets the RTO variables to the initial values. +func (m *rtoManager) reset() { + m.mutex.Lock() + defer m.mutex.Unlock() + + if m.noUpdate { + return + } + + m.srtt = 0 + m.rttvar = 0 + m.rto = rtoInitial +} + +// set RTO value for testing +func (m *rtoManager) setRTO(rto float64, noUpdate bool) { + m.mutex.Lock() + defer m.mutex.Unlock() + + m.rto = rto + m.noUpdate = noUpdate +} + +// rtxTimerObserver is the inteface to a timer observer. +// NOTE: Observers MUST NOT call start() or stop() method on rtxTimer +// from within these callbacks. +type rtxTimerObserver interface { + onRetransmissionTimeout(timerID int, n uint) + onRetransmissionFailure(timerID int) +} + +// rtxTimer provides the retnransmission timer conforms with RFC 4960 Sec 6.3.1 +type rtxTimer struct { + id int + observer rtxTimerObserver + maxRetrans uint + stopFunc stopTimerLoop + closed bool + mutex sync.RWMutex +} + +type stopTimerLoop func() + +// newRTXTimer creates a new retransmission timer. +// if maxRetrans is set to 0, it will keep retransmitting until stop() is called. +// (it will never make onRetransmissionFailure() callback. +func newRTXTimer(id int, observer rtxTimerObserver, maxRetrans uint) *rtxTimer { + return &rtxTimer{ + id: id, + observer: observer, + maxRetrans: maxRetrans, + } +} + +// start starts the timer. +func (t *rtxTimer) start(rto float64) bool { + t.mutex.Lock() + defer t.mutex.Unlock() + + // this timer is already closed + if t.closed { + return false + } + + // this is a noop if the timer is always running + if t.stopFunc != nil { + return false + } + + // Note: rto value is intentionally not capped by RTO.Min to allow + // fast timeout for the tests. Non-test code should pass in the + // rto generated by rtoManager getRTO() method which caps the + // value at RTO.Min or at RTO.Max. + var nRtos uint + + cancelCh := make(chan struct{}) + + go func() { + canceling := false + + for !canceling { + timeout := calculateNextTimeout(rto, nRtos) + timer := time.NewTimer(time.Duration(timeout) * time.Millisecond) + + select { + case <-timer.C: + nRtos++ + if t.maxRetrans == 0 || nRtos <= t.maxRetrans { + t.observer.onRetransmissionTimeout(t.id, nRtos) + } else { + t.stop() + t.observer.onRetransmissionFailure(t.id) + } + case <-cancelCh: + canceling = true + timer.Stop() + } + } + }() + + t.stopFunc = func() { + close(cancelCh) + } + + return true +} + +// stop stops the timer. +func (t *rtxTimer) stop() { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.stopFunc != nil { + t.stopFunc() + t.stopFunc = nil + } +} + +// closes the timer. this is similar to stop() but subsequent start() call +// will fail (the timer is no longer usable) +func (t *rtxTimer) close() { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.stopFunc != nil { + t.stopFunc() + t.stopFunc = nil + } + + t.closed = true +} + +// isRunning tests if the timer is running. +// Debug purpose only +func (t *rtxTimer) isRunning() bool { + t.mutex.RLock() + defer t.mutex.RUnlock() + + return (t.stopFunc != nil) +} + +func calculateNextTimeout(rto float64, nRtos uint) float64 { + // RFC 4096 sec 6.3.3. Handle T3-rtx Expiration + // E2) For the destination address for which the timer expires, set RTO + // <- RTO * 2 ("back off the timer"). The maximum value discussed + // in rule C7 above (RTO.max) may be used to provide an upper bound + // to this doubling operation. + if nRtos < 31 { + m := 1 << nRtos + return math.Min(rto*float64(m), rtoMax) + } + return rtoMax +} diff --git a/vendor/github.com/pion/sctp/sctp.go b/vendor/github.com/pion/sctp/sctp.go new file mode 100644 index 000000000..2bf74fb38 --- /dev/null +++ b/vendor/github.com/pion/sctp/sctp.go @@ -0,0 +1,5 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package sctp implements the SCTP spec +package sctp diff --git a/vendor/github.com/pion/sctp/stream.go b/vendor/github.com/pion/sctp/stream.go new file mode 100644 index 000000000..b12bb24ce --- /dev/null +++ b/vendor/github.com/pion/sctp/stream.go @@ -0,0 +1,467 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +import ( + "errors" + "fmt" + "io" + "math" + "os" + "sync" + "sync/atomic" + "time" + + "github.com/pion/logging" +) + +const ( + // ReliabilityTypeReliable is used for reliable transmission + ReliabilityTypeReliable byte = 0 + // ReliabilityTypeRexmit is used for partial reliability by retransmission count + ReliabilityTypeRexmit byte = 1 + // ReliabilityTypeTimed is used for partial reliability by retransmission duration + ReliabilityTypeTimed byte = 2 +) + +// StreamState is an enum for SCTP Stream state field +// This field identifies the state of stream. +type StreamState int + +// StreamState enums +const ( + StreamStateOpen StreamState = iota // Stream object starts with StreamStateOpen + StreamStateClosing // Outgoing stream is being reset + StreamStateClosed // Stream has been closed +) + +func (ss StreamState) String() string { + switch ss { + case StreamStateOpen: + return "open" + case StreamStateClosing: + return "closing" + case StreamStateClosed: + return "closed" + } + return "unknown" +} + +// SCTP stream errors +var ( + ErrOutboundPacketTooLarge = errors.New("outbound packet larger than maximum message size") + ErrStreamClosed = errors.New("stream closed") + ErrReadDeadlineExceeded = fmt.Errorf("read deadline exceeded: %w", os.ErrDeadlineExceeded) +) + +// Stream represents an SCTP stream +type Stream struct { + association *Association + lock sync.RWMutex + streamIdentifier uint16 + defaultPayloadType PayloadProtocolIdentifier + reassemblyQueue *reassemblyQueue + sequenceNumber uint16 + readNotifier *sync.Cond + readErr error + readTimeoutCancel chan struct{} + unordered bool + reliabilityType byte + reliabilityValue uint32 + bufferedAmount uint64 + bufferedAmountLow uint64 + onBufferedAmountLow func() + state StreamState + log logging.LeveledLogger + name string +} + +// StreamIdentifier returns the Stream identifier associated to the stream. +func (s *Stream) StreamIdentifier() uint16 { + s.lock.RLock() + defer s.lock.RUnlock() + return s.streamIdentifier +} + +// SetDefaultPayloadType sets the default payload type used by Write. +func (s *Stream) SetDefaultPayloadType(defaultPayloadType PayloadProtocolIdentifier) { + atomic.StoreUint32((*uint32)(&s.defaultPayloadType), uint32(defaultPayloadType)) +} + +// SetReliabilityParams sets reliability parameters for this stream. +func (s *Stream) SetReliabilityParams(unordered bool, relType byte, relVal uint32) { + s.lock.Lock() + defer s.lock.Unlock() + + s.setReliabilityParams(unordered, relType, relVal) +} + +// setReliabilityParams sets reliability parameters for this stream. +// The caller should hold the lock. +func (s *Stream) setReliabilityParams(unordered bool, relType byte, relVal uint32) { + s.log.Debugf("[%s] reliability params: ordered=%v type=%d value=%d", + s.name, !unordered, relType, relVal) + s.unordered = unordered + s.reliabilityType = relType + s.reliabilityValue = relVal +} + +// Read reads a packet of len(p) bytes, dropping the Payload Protocol Identifier. +// Returns EOF when the stream is reset or an error if the stream is closed +// otherwise. +func (s *Stream) Read(p []byte) (int, error) { + n, _, err := s.ReadSCTP(p) + return n, err +} + +// ReadSCTP reads a packet of len(p) bytes and returns the associated Payload +// Protocol Identifier. +// Returns EOF when the stream is reset or an error if the stream is closed +// otherwise. +func (s *Stream) ReadSCTP(p []byte) (int, PayloadProtocolIdentifier, error) { + s.lock.Lock() + defer s.lock.Unlock() + + defer func() { + // close readTimeoutCancel if the current read timeout routine is no longer effective + if s.readTimeoutCancel != nil && s.readErr != nil { + close(s.readTimeoutCancel) + s.readTimeoutCancel = nil + } + }() + + for { + n, ppi, err := s.reassemblyQueue.read(p) + if err == nil { + return n, ppi, nil + } else if errors.Is(err, io.ErrShortBuffer) { + return 0, PayloadProtocolIdentifier(0), err + } + + err = s.readErr + if err != nil { + return 0, PayloadProtocolIdentifier(0), err + } + + s.readNotifier.Wait() + } +} + +// SetReadDeadline sets the read deadline in an identical way to net.Conn +func (s *Stream) SetReadDeadline(deadline time.Time) error { + s.lock.Lock() + defer s.lock.Unlock() + + if s.readTimeoutCancel != nil { + close(s.readTimeoutCancel) + s.readTimeoutCancel = nil + } + + if s.readErr != nil { + if !errors.Is(s.readErr, ErrReadDeadlineExceeded) { + return nil + } + s.readErr = nil + } + + if !deadline.IsZero() { + s.readTimeoutCancel = make(chan struct{}) + + go func(readTimeoutCancel chan struct{}) { + t := time.NewTimer(time.Until(deadline)) + select { + case <-readTimeoutCancel: + t.Stop() + return + case <-t.C: + s.lock.Lock() + if s.readErr == nil { + s.readErr = ErrReadDeadlineExceeded + } + s.readTimeoutCancel = nil + s.lock.Unlock() + + s.readNotifier.Signal() + } + }(s.readTimeoutCancel) + } + return nil +} + +func (s *Stream) handleData(pd *chunkPayloadData) { + s.lock.Lock() + defer s.lock.Unlock() + + var readable bool + if s.reassemblyQueue.push(pd) { + readable = s.reassemblyQueue.isReadable() + s.log.Debugf("[%s] reassemblyQueue readable=%v", s.name, readable) + if readable { + s.log.Debugf("[%s] readNotifier.signal()", s.name) + s.readNotifier.Signal() + s.log.Debugf("[%s] readNotifier.signal() done", s.name) + } + } +} + +func (s *Stream) handleForwardTSNForOrdered(ssn uint16) { + var readable bool + + func() { + s.lock.Lock() + defer s.lock.Unlock() + + if s.unordered { + return // unordered chunks are handled by handleForwardUnordered method + } + + // Remove all chunks older than or equal to the new TSN from + // the reassemblyQueue. + s.reassemblyQueue.forwardTSNForOrdered(ssn) + readable = s.reassemblyQueue.isReadable() + }() + + // Notify the reader asynchronously if there's a data chunk to read. + if readable { + s.readNotifier.Signal() + } +} + +func (s *Stream) handleForwardTSNForUnordered(newCumulativeTSN uint32) { + var readable bool + + func() { + s.lock.Lock() + defer s.lock.Unlock() + + if !s.unordered { + return // ordered chunks are handled by handleForwardTSNOrdered method + } + + // Remove all chunks older than or equal to the new TSN from + // the reassemblyQueue. + s.reassemblyQueue.forwardTSNForUnordered(newCumulativeTSN) + readable = s.reassemblyQueue.isReadable() + }() + + // Notify the reader asynchronously if there's a data chunk to read. + if readable { + s.readNotifier.Signal() + } +} + +// Write writes len(p) bytes from p with the default Payload Protocol Identifier +func (s *Stream) Write(p []byte) (n int, err error) { + ppi := PayloadProtocolIdentifier(atomic.LoadUint32((*uint32)(&s.defaultPayloadType))) + return s.WriteSCTP(p, ppi) +} + +// WriteSCTP writes len(p) bytes from p to the DTLS connection +func (s *Stream) WriteSCTP(p []byte, ppi PayloadProtocolIdentifier) (int, error) { + maxMessageSize := s.association.MaxMessageSize() + if len(p) > int(maxMessageSize) { + return 0, fmt.Errorf("%w: %v", ErrOutboundPacketTooLarge, math.MaxUint16) + } + + if s.State() != StreamStateOpen { + return 0, ErrStreamClosed + } + + chunks := s.packetize(p, ppi) + n := len(p) + err := s.association.sendPayloadData(chunks) + if err != nil { + return n, ErrStreamClosed + } + return n, nil +} + +func (s *Stream) packetize(raw []byte, ppi PayloadProtocolIdentifier) []*chunkPayloadData { + s.lock.Lock() + defer s.lock.Unlock() + + i := uint32(0) + remaining := uint32(len(raw)) + + // From draft-ietf-rtcweb-data-protocol-09, section 6: + // All Data Channel Establishment Protocol messages MUST be sent using + // ordered delivery and reliable transmission. + unordered := ppi != PayloadTypeWebRTCDCEP && s.unordered + + var chunks []*chunkPayloadData + var head *chunkPayloadData + for remaining != 0 { + fragmentSize := min32(s.association.maxPayloadSize, remaining) + + // Copy the userdata since we'll have to store it until acked + // and the caller may re-use the buffer in the mean time + userData := make([]byte, fragmentSize) + copy(userData, raw[i:i+fragmentSize]) + + chunk := &chunkPayloadData{ + streamIdentifier: s.streamIdentifier, + userData: userData, + unordered: unordered, + beginningFragment: i == 0, + endingFragment: remaining-fragmentSize == 0, + immediateSack: false, + payloadType: ppi, + streamSequenceNumber: s.sequenceNumber, + head: head, + } + + if head == nil { + head = chunk + } + + chunks = append(chunks, chunk) + + remaining -= fragmentSize + i += fragmentSize + } + + // RFC 4960 Sec 6.6 + // Note: When transmitting ordered and unordered data, an endpoint does + // not increment its Stream Sequence Number when transmitting a DATA + // chunk with U flag set to 1. + if !unordered { + s.sequenceNumber++ + } + + s.bufferedAmount += uint64(len(raw)) + s.log.Tracef("[%s] bufferedAmount = %d", s.name, s.bufferedAmount) + + return chunks +} + +// Close closes the write-direction of the stream. +// Future calls to Write are not permitted after calling Close. +func (s *Stream) Close() error { + if sid, resetOutbound := func() (uint16, bool) { + s.lock.Lock() + defer s.lock.Unlock() + + s.log.Debugf("[%s] Close: state=%s", s.name, s.state.String()) + + if s.state == StreamStateOpen { + if s.readErr == nil { + s.state = StreamStateClosing + } else { + s.state = StreamStateClosed + } + s.log.Debugf("[%s] state change: open => %s", s.name, s.state.String()) + return s.streamIdentifier, true + } + return s.streamIdentifier, false + }(); resetOutbound { + // Reset the outgoing stream + // https://tools.ietf.org/html/rfc6525 + return s.association.sendResetRequest(sid) + } + + return nil +} + +// BufferedAmount returns the number of bytes of data currently queued to be sent over this stream. +func (s *Stream) BufferedAmount() uint64 { + s.lock.RLock() + defer s.lock.RUnlock() + + return s.bufferedAmount +} + +// BufferedAmountLowThreshold returns the number of bytes of buffered outgoing data that is +// considered "low." Defaults to 0. +func (s *Stream) BufferedAmountLowThreshold() uint64 { + s.lock.RLock() + defer s.lock.RUnlock() + + return s.bufferedAmountLow +} + +// SetBufferedAmountLowThreshold is used to update the threshold. +// See BufferedAmountLowThreshold(). +func (s *Stream) SetBufferedAmountLowThreshold(th uint64) { + s.lock.Lock() + defer s.lock.Unlock() + + s.bufferedAmountLow = th +} + +// OnBufferedAmountLow sets the callback handler which would be called when the number of +// bytes of outgoing data buffered is lower than the threshold. +func (s *Stream) OnBufferedAmountLow(f func()) { + s.lock.Lock() + defer s.lock.Unlock() + + s.onBufferedAmountLow = f +} + +// This method is called by association's readLoop (go-)routine to notify this stream +// of the specified amount of outgoing data has been delivered to the peer. +func (s *Stream) onBufferReleased(nBytesReleased int) { + if nBytesReleased <= 0 { + return + } + + s.lock.Lock() + + fromAmount := s.bufferedAmount + + if s.bufferedAmount < uint64(nBytesReleased) { + s.bufferedAmount = 0 + s.log.Errorf("[%s] released buffer size %d should be <= %d", + s.name, nBytesReleased, s.bufferedAmount) + } else { + s.bufferedAmount -= uint64(nBytesReleased) + } + + s.log.Tracef("[%s] bufferedAmount = %d", s.name, s.bufferedAmount) + + if s.onBufferedAmountLow != nil && fromAmount > s.bufferedAmountLow && s.bufferedAmount <= s.bufferedAmountLow { + f := s.onBufferedAmountLow + s.lock.Unlock() + f() + return + } + + s.lock.Unlock() +} + +func (s *Stream) getNumBytesInReassemblyQueue() int { + // No lock is required as it reads the size with atomic load function. + return s.reassemblyQueue.getNumBytes() +} + +func (s *Stream) onInboundStreamReset() { + s.lock.Lock() + defer s.lock.Unlock() + + s.log.Debugf("[%s] onInboundStreamReset: state=%s", s.name, s.state.String()) + + // No more inbound data to read. Unblock the read with io.EOF. + // This should cause DCEP layer (datachannel package) to call Close() which + // will reset outgoing stream also. + + // See RFC 8831 section 6.7: + // if one side decides to close the data channel, it resets the corresponding + // outgoing stream. When the peer sees that an incoming stream was + // reset, it also resets its corresponding outgoing stream. Once this + // is completed, the data channel is closed. + + s.readErr = io.EOF + s.readNotifier.Broadcast() + + if s.state == StreamStateClosing { + s.log.Debugf("[%s] state change: closing => closed", s.name) + s.state = StreamStateClosed + } +} + +// State return the stream state. +func (s *Stream) State() StreamState { + s.lock.RLock() + defer s.lock.RUnlock() + return s.state +} diff --git a/vendor/github.com/pion/sctp/util.go b/vendor/github.com/pion/sctp/util.go new file mode 100644 index 000000000..b8afc1232 --- /dev/null +++ b/vendor/github.com/pion/sctp/util.go @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package sctp + +const ( + paddingMultiple = 4 +) + +func getPadding(l int) int { + return (paddingMultiple - (l % paddingMultiple)) % paddingMultiple +} + +func padByte(in []byte, cnt int) []byte { + if cnt < 0 { + cnt = 0 + } + padding := make([]byte, cnt) + return append(in, padding...) +} + +// Serial Number Arithmetic (RFC 1982) +func sna32LT(i1, i2 uint32) bool { + return (i1 < i2 && i2-i1 < 1<<31) || (i1 > i2 && i1-i2 > 1<<31) +} + +func sna32LTE(i1, i2 uint32) bool { + return i1 == i2 || sna32LT(i1, i2) +} + +func sna32GT(i1, i2 uint32) bool { + return (i1 < i2 && (i2-i1) >= 1<<31) || (i1 > i2 && (i1-i2) <= 1<<31) +} + +func sna32GTE(i1, i2 uint32) bool { + return i1 == i2 || sna32GT(i1, i2) +} + +func sna32EQ(i1, i2 uint32) bool { + return i1 == i2 +} + +func sna16LT(i1, i2 uint16) bool { + return (i1 < i2 && (i2-i1) < 1<<15) || (i1 > i2 && (i1-i2) > 1<<15) +} + +func sna16LTE(i1, i2 uint16) bool { + return i1 == i2 || sna16LT(i1, i2) +} + +func sna16GT(i1, i2 uint16) bool { + return (i1 < i2 && (i2-i1) >= 1<<15) || (i1 > i2 && (i1-i2) <= 1<<15) +} + +func sna16GTE(i1, i2 uint16) bool { + return i1 == i2 || sna16GT(i1, i2) +} + +func sna16EQ(i1, i2 uint16) bool { + return i1 == i2 +} diff --git a/vendor/github.com/pion/stun/.gitignore b/vendor/github.com/pion/stun/.gitignore new file mode 100644 index 000000000..6e2f206a9 --- /dev/null +++ b/vendor/github.com/pion/stun/.gitignore @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +### JetBrains IDE ### +##################### +.idea/ + +### Emacs Temporary Files ### +############################# +*~ + +### Folders ### +############### +bin/ +vendor/ +node_modules/ + +### Files ### +############# +*.ivf +*.ogg +tags +cover.out +*.sw[poe] +*.wasm +examples/sfu-ws/cert.pem +examples/sfu-ws/key.pem +wasm_exec.js diff --git a/vendor/github.com/pion/stun/.golangci.yml b/vendor/github.com/pion/stun/.golangci.yml new file mode 100644 index 000000000..4e3eddf42 --- /dev/null +++ b/vendor/github.com/pion/stun/.golangci.yml @@ -0,0 +1,137 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +linters-settings: + govet: + check-shadowing: true + misspell: + locale: US + exhaustive: + default-signifies-exhaustive: true + gomodguard: + blocked: + modules: + - github.com/pkg/errors: + recommendations: + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ + +linters: + enable: + - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences + - bodyclose # checks whether HTTP response body is closed successfully + - contextcheck # check the function whether use a non-inherited context + - decorder # check declaration order and count of types, constants, variables and functions + - depguard # Go linter that checks if package imports are in a list of acceptable packages + - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted. + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - exhaustive # check exhaustiveness of enum switch statements + - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - forcetypeassert # finds forced type assertions + - gci # Gci control golang package import order and make it always deterministic. + - gochecknoglobals # Checks that no globals are present in Go code + - gochecknoinits # Checks that no init functions are present in Go code + - gocognit # Computes and checks the cognitive complexity of functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # The most opinionated Go source code linter + - godox # Tool for detection of FIXME, TODO and other comment keywords + - goerr113 # Golang linter to check the errors handling expressions + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + - gofumpt # Gofumpt checks whether code was gofumpt-ed. + - goheader # Checks is file header matches to pattern + - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. + - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. + - goprintffuncname # Checks that printf-like functions are named with `f` at the end + - gosec # Inspects source code for security problems + - gosimple # Linter for Go source code that specializes in simplifying a code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - grouper # An analyzer to analyze expression groups. + - importas # Enforces consistent import aliases + - ineffassign # Detects when assignments to existing variables are not used + - misspell # Finds commonly misspelled English words in comments + - nakedret # Finds naked returns in functions greater than a specified function length + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - predeclared # find code that shadows one of Go's predeclared identifiers + - revive # golint replacement, finds style mistakes + - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks + - stylecheck # Stylecheck is a replacement for golint + - tagliatelle # Checks the struct tags. + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - unconvert # Remove unnecessary type conversions + - unparam # Reports unused function parameters + - unused # Checks Go code for unused constants, variables, functions and types + - wastedassign # wastedassign finds wasted assignment statements + - whitespace # Tool for detection of leading and trailing whitespace + disable: + - containedctx # containedctx is a linter that detects struct contained context.Context field + - cyclop # checks function and package cyclomatic complexity + - exhaustivestruct # Checks if all struct's fields are initialized + - funlen # Tool for detection of long functions + - gocyclo # Computes and checks the cyclomatic complexity of functions + - godot # Check if comments end in a period + - gomnd # An analyzer to detect magic numbers. + - ifshort # Checks that your code uses short syntax for if-statements whenever possible + - ireturn # Accept Interfaces, Return Concrete Types + - lll # Reports long lines + - maintidx # maintidx measures the maintainability index of each function. + - makezero # Finds slice declarations with non-zero initial length + - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nestif # Reports deeply nested if statements + - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity + - nolintlint # Reports ill-formed or insufficient nolint directives + - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test + - prealloc # Finds slice declarations that could potentially be preallocated + - promlinter # Check Prometheus metrics naming via promlint + - rowserrcheck # checks whether Err of rows is checked successfully + - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. + - testpackage # linter that makes you use a separate _test package + - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # checks that the length of a variable's name matches its scope + - wrapcheck # Checks that errors returned from external packages are wrapped + - wsl # Whitespace Linter - Forces you to use empty lines! + +issues: + exclude-use-default: false + exclude-rules: + # Allow complex tests, better to be self contained + - path: _test\.go + linters: + - gocognit + - forbidigo + + # Allow complex main function in examples + - path: examples + text: "of func `main` is high" + linters: + - gocognit + + # Allow forbidden identifiers in examples + - path: examples + linters: + - forbidigo + + # Allow forbidden identifiers in CLI commands + - path: cmd + linters: + - forbidigo + +run: + skip-dirs-use-default: false diff --git a/vendor/github.com/pion/stun/.goreleaser.yml b/vendor/github.com/pion/stun/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/stun/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/stun/AUTHORS.txt b/vendor/github.com/pion/stun/AUTHORS.txt new file mode 100644 index 000000000..3c3d9e00f --- /dev/null +++ b/vendor/github.com/pion/stun/AUTHORS.txt @@ -0,0 +1,40 @@ +# Thank you to everyone that made Pion possible. If you are interested in contributing +# we would love to have you https://github.com/pion/webrtc/wiki/Contributing +# +# This file is auto generated, using git to list all individuals contributors. +# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting +Adam Kiss +Aleksandr Razumov +Aleksandr Razumov +Atsushi Watanabe +backkem +Cecylia Bocovich +Christian Muehlhaeuser +David-dp- +ernado +ernado +fossabot +Frank Dietrich +Hugo Arregui +Jerry Tao +jinleileiking +John Bradley +Juliusz Chroboczek +Maanas Royy +Moises Marangoni +Raphael Randschau +Sean DuBois +Sean DuBois +Sean DuBois +songjiayang +Steffen Vogel +Vladislav Yarmak +Will LE +Y.Horie +Yutaka Takeda +ZHENK + +# List of contributors not appearing in Git history +Aliaksandr Valialkin +The IETF Trust +The gortc project diff --git a/vendor/github.com/pion/stun/LICENSE b/vendor/github.com/pion/stun/LICENSE new file mode 100644 index 000000000..491caf6b0 --- /dev/null +++ b/vendor/github.com/pion/stun/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2023 The Pion community + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/stun/Makefile b/vendor/github.com/pion/stun/Makefile new file mode 100644 index 000000000..ebfcd3394 --- /dev/null +++ b/vendor/github.com/pion/stun/Makefile @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +VERSION := $(shell git describe --tags | sed -e 's/^v//g' | awk -F "-" '{print $$1}') +ITERATION := $(shell git describe --tags --long | awk -F "-" '{print $$2}') +GO_VERSION=$(shell gobuild -v) +GO := $(or $(GOROOT),/usr/lib/go)/bin/go +PROCS := $(shell nproc) +cores: + @echo "cores: $(PROCS)" +bench: + go test -bench . +bench-record: + $(GO) test -bench . > "benchmarks/stun-go-$(GO_VERSION).txt" +lint: + @golangci-lint run ./... + @echo "ok" +escape: + @echo "Not escapes, except autogenerated:" + @go build -gcflags '-m -l' 2>&1 \ + | grep -v "" \ + | grep escapes +format: + goimports -w . +bench-compare: + go test -bench . > bench.go-16 + go-tip test -bench . > bench.go-tip + @benchcmp bench.go-16 bench.go-tip +install: + go get gortc.io/api + go get -u github.com/golangci/golangci-lint/cmd/golangci-lint +test-integration: + @cd e2e && bash ./test.sh +prepush: test lint test-integration +check-api: + @cd api && bash ./check.sh +test: + @./go.test.sh +clean: diff --git a/vendor/github.com/pion/stun/README.md b/vendor/github.com/pion/stun/README.md new file mode 100644 index 000000000..fe1b28ffb --- /dev/null +++ b/vendor/github.com/pion/stun/README.md @@ -0,0 +1,186 @@ +

+
+ Pion STUN +
+

+

A Go implementation of STUN

+

+ Pion stun + Slack Widget +
+ GitHub Workflow Status + Go Reference + Coverage Status + Go Report Card + License: MIT +

+
+ +Package `stun` implements Session Traversal Utilities for NAT (STUN) ([RFC 5389][rfc5389]) +protocol and [client](https://pkg.go.dev/github.com/pion/stun#Client) with no external dependencies and zero allocations in hot paths. +Client [supports](https://pkg.go.dev/github.com/pion/stun#WithRTO) automatic request retransmissions. + +### Example +You can get your current IP address from any STUN server by sending +binding request. See more idiomatic example at `cmd/stun-client`. +```go +package main + +import ( + "fmt" + + "github.com/pion/stun" +) + +func main() { + // Parse a STUN URI + u, err := stun.ParseURI("stun:stun.l.google.com:19302") + if err != nil { + panic(err) + } + + // Creating a "connection" to STUN server. + c, err := stun.DialURI(u, &stun.DialConfig{}) + if err != nil { + panic(err) + } + // Building binding request with random transaction id. + message := stun.MustBuild(stun.TransactionID, stun.BindingRequest) + // Sending request to STUN server, waiting for response message. + if err := c.Do(message, func(res stun.Event) { + if res.Error != nil { + panic(res.Error) + } + // Decoding XOR-MAPPED-ADDRESS attribute from message. + var xorAddr stun.XORMappedAddress + if err := xorAddr.GetFrom(res.Message); err != nil { + panic(err) + } + fmt.Println("your IP is", xorAddr.IP) + }); err != nil { + panic(err) + } +} +``` + +### RFCs +#### Implemented +- **RFC 5389**: [Session Traversal Utilities for NAT (STUN)][rfc5389] +- **RFC 5769**: [Test Vectors for Session Traversal Utilities for NAT (STUN)][rfc5769] +- **RFC 6062**: [Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations][rfc6062] +- **RFC 7064**: [URI Scheme for the Session Traversal Utilities for NAT (STUN) Protocol][rfc7064] +- **RFC 7065**: [Traversal Using Relays around NAT (TURN) Uniform Resource Identifiers][rfc7065] +- **RFC 5780**: [NAT Behavior Discovery Using Session Traversal Utilities for NAT (STUN)][rfc5780] via [cmd/stun-nat-behaviour](cmd/stun-nat-behaviour) +- (TLS-over-)TCP client support + +#### Planned +- **RFC 5389**: [ALTERNATE-SERVER](https://tools.ietf.org/html/rfc5389#section-11) support [#48](https://github.com/pion/stun/issues/48) + +#### Compatability notes + +[RFC 5389][rfc5389] obsoletes [RFC 3489][rfc3489], so implementation was ignored by purpose, however, +[RFC 3489][rfc3489] can be easily implemented as separate package. + +[rfc3489]: https://tools.ietf.org/html/rfc3489 +[rfc5389]: https://tools.ietf.org/html/rfc5389 +[rfc5769]: https://tools.ietf.org/html/rfc5769 +[rfc5780]: https://tools.ietf.org/html/rfc5780 +[rfc6062]: https://tools.ietf.org/html/rfc6062 +[rfc7064]: https://tools.ietf.org/html/rfc7064 +[rfc7065]: https://tools.ietf.org/html/rfc7065 + +### Stability +Package is currently stable, no backward incompatible changes are expected +with exception of critical bugs or security fixes. + +Additional attributes are unlikely to be implemented in scope of stun package, +the only exception is constants for attribute or message types. + +### Requirements +Go 1.12 is currently supported and tested in CI. + +### Testing +Client behavior is tested and verified in many ways: + * End-To-End with long-term credentials + * **coturn**: The coturn [server](https://github.com/coturn/coturn/wiki/turnserver) (linux) + * Bunch of code static checkers (linters) + * Standard unit-tests with coverage reporting (linux {amd64, **arm**64}, windows and darwin) + * Explicit API backward compatibility [check](https://github.com/gortc/api), see `api` directory + +See [TeamCity project](https://tc.gortc.io/project.html?projectId=stun&guest=1) and `e2e` directory +for more information. Also the Wireshark `.pcap` files are available for e2e test in +artifacts for build. + +### Benchmarks +Intel(R) Core(TM) i7-8700K: + +``` +version: 1.22.2 +goos: linux +goarch: amd64 +pkg: github.com/pion/stun +PASS +benchmark iter time/iter throughput bytes alloc allocs +--------- ---- --------- ---------- ----------- ------ +BenchmarkMappedAddress_AddTo-12 32489450 38.30 ns/op 0 B/op 0 allocs/op +BenchmarkAlternateServer_AddTo-12 31230991 39.00 ns/op 0 B/op 0 allocs/op +BenchmarkAgent_GC-12 431390 2918.00 ns/op 0 B/op 0 allocs/op +BenchmarkAgent_Process-12 35901940 36.20 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_GetNotFound-12 242004358 5.19 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_Get-12 230520343 5.21 ns/op 0 B/op 0 allocs/op +BenchmarkClient_Do-12 1282231 943.00 ns/op 0 B/op 0 allocs/op +BenchmarkErrorCode_AddTo-12 16318916 75.50 ns/op 0 B/op 0 allocs/op +BenchmarkErrorCodeAttribute_AddTo-12 21584140 54.80 ns/op 0 B/op 0 allocs/op +BenchmarkErrorCodeAttribute_GetFrom-12 100000000 11.10 ns/op 0 B/op 0 allocs/op +BenchmarkFingerprint_AddTo-12 19368768 64.00 ns/op 687.81 MB/s 0 B/op 0 allocs/op +BenchmarkFingerprint_Check-12 24167007 49.10 ns/op 1057.99 MB/s 0 B/op 0 allocs/op +BenchmarkBuildOverhead/Build-12 5486252 224.00 ns/op 0 B/op 0 allocs/op +BenchmarkBuildOverhead/BuildNonPointer-12 2496544 517.00 ns/op 100 B/op 4 allocs/op +BenchmarkBuildOverhead/Raw-12 6652118 181.00 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_ForEach-12 28254212 35.90 ns/op 0 B/op 0 allocs/op +BenchmarkMessageIntegrity_AddTo-12 1000000 1179.00 ns/op 16.96 MB/s 0 B/op 0 allocs/op +BenchmarkMessageIntegrity_Check-12 975954 1219.00 ns/op 26.24 MB/s 0 B/op 0 allocs/op +BenchmarkMessage_Write-12 41040598 30.40 ns/op 922.13 MB/s 0 B/op 0 allocs/op +BenchmarkMessageType_Value-12 1000000000 0.53 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_WriteTo-12 94942935 11.30 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_ReadFrom-12 43437718 29.30 ns/op 682.87 MB/s 0 B/op 0 allocs/op +BenchmarkMessage_ReadBytes-12 74693397 15.90 ns/op 1257.42 MB/s 0 B/op 0 allocs/op +BenchmarkIsMessage-12 1000000000 1.20 ns/op 16653.64 MB/s 0 B/op 0 allocs/op +BenchmarkMessage_NewTransactionID-12 521121 2450.00 ns/op 0 B/op 0 allocs/op +BenchmarkMessageFull-12 5389495 221.00 ns/op 0 B/op 0 allocs/op +BenchmarkMessageFullHardcore-12 12715876 94.40 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_WriteHeader-12 100000000 11.60 ns/op 0 B/op 0 allocs/op +BenchmarkMessage_CloneTo-12 30199020 41.80 ns/op 1626.66 MB/s 0 B/op 0 allocs/op +BenchmarkMessage_AddTo-12 415257625 2.97 ns/op 0 B/op 0 allocs/op +BenchmarkDecode-12 49573747 23.60 ns/op 0 B/op 0 allocs/op +BenchmarkUsername_AddTo-12 56282674 22.50 ns/op 0 B/op 0 allocs/op +BenchmarkUsername_GetFrom-12 100000000 10.10 ns/op 0 B/op 0 allocs/op +BenchmarkNonce_AddTo-12 39419097 35.80 ns/op 0 B/op 0 allocs/op +BenchmarkNonce_AddTo_BadLength-12 196291666 6.04 ns/op 0 B/op 0 allocs/op +BenchmarkNonce_GetFrom-12 120857732 9.93 ns/op 0 B/op 0 allocs/op +BenchmarkUnknownAttributes/AddTo-12 28881430 37.20 ns/op 0 B/op 0 allocs/op +BenchmarkUnknownAttributes/GetFrom-12 64907534 19.80 ns/op 0 B/op 0 allocs/op +BenchmarkXOR-12 32868506 32.20 ns/op 31836.66 MB/s +BenchmarkXORSafe-12 5185776 234.00 ns/op 4378.74 MB/s +BenchmarkXORFast-12 30975679 32.50 ns/op 31525.28 MB/s +BenchmarkXORMappedAddress_AddTo-12 21518028 54.50 ns/op 0 B/op 0 allocs/op +BenchmarkXORMappedAddress_GetFrom-12 35597667 34.40 ns/op 0 B/op 0 allocs/op +ok github.com/pion/stun 60.973s +``` + +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. + +### Community +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. + +We are always looking to support **your projects**. Please reach out if you have something to build! +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) + +### License +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/stun/addr.go b/vendor/github.com/pion/stun/addr.go new file mode 100644 index 000000000..d15e2bbd2 --- /dev/null +++ b/vendor/github.com/pion/stun/addr.go @@ -0,0 +1,163 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "fmt" + "io" + "net" + "strconv" +) + +// MappedAddress represents MAPPED-ADDRESS attribute. +// +// This attribute is used only by servers for achieving backwards +// compatibility with RFC 3489 clients. +// +// RFC 5389 Section 15.1 +type MappedAddress struct { + IP net.IP + Port int +} + +// AlternateServer represents ALTERNATE-SERVER attribute. +// +// RFC 5389 Section 15.11 +type AlternateServer struct { + IP net.IP + Port int +} + +// ResponseOrigin represents RESPONSE-ORIGIN attribute. +// +// RFC 5780 Section 7.3 +type ResponseOrigin struct { + IP net.IP + Port int +} + +// OtherAddress represents OTHER-ADDRESS attribute. +// +// RFC 5780 Section 7.4 +type OtherAddress struct { + IP net.IP + Port int +} + +// AddTo adds ALTERNATE-SERVER attribute to message. +func (s *AlternateServer) AddTo(m *Message) error { + a := (*MappedAddress)(s) + return a.AddToAs(m, AttrAlternateServer) +} + +// GetFrom decodes ALTERNATE-SERVER from message. +func (s *AlternateServer) GetFrom(m *Message) error { + a := (*MappedAddress)(s) + return a.GetFromAs(m, AttrAlternateServer) +} + +func (a MappedAddress) String() string { + return net.JoinHostPort(a.IP.String(), strconv.Itoa(a.Port)) +} + +// GetFromAs decodes MAPPED-ADDRESS value in message m as an attribute of type t. +func (a *MappedAddress) GetFromAs(m *Message, t AttrType) error { + v, err := m.Get(t) + if err != nil { + return err + } + if len(v) <= 4 { + return io.ErrUnexpectedEOF + } + family := bin.Uint16(v[0:2]) + if family != familyIPv6 && family != familyIPv4 { + return newDecodeErr("xor-mapped address", "family", + fmt.Sprintf("bad value %d", family), + ) + } + ipLen := net.IPv4len + if family == familyIPv6 { + ipLen = net.IPv6len + } + // Ensuring len(a.IP) == ipLen and reusing a.IP. + if len(a.IP) < ipLen { + a.IP = a.IP[:cap(a.IP)] + for len(a.IP) < ipLen { + a.IP = append(a.IP, 0) + } + } + a.IP = a.IP[:ipLen] + for i := range a.IP { + a.IP[i] = 0 + } + a.Port = int(bin.Uint16(v[2:4])) + copy(a.IP, v[4:]) + return nil +} + +// AddToAs adds MAPPED-ADDRESS value to m as t attribute. +func (a *MappedAddress) AddToAs(m *Message, t AttrType) error { + var ( + family = familyIPv4 + ip = a.IP + ) + if len(a.IP) == net.IPv6len { + if isIPv4(ip) { + ip = ip[12:16] // like in ip.To4() + } else { + family = familyIPv6 + } + } else if len(ip) != net.IPv4len { + return ErrBadIPLength + } + value := make([]byte, 128) + value[0] = 0 // first 8 bits are zeroes + bin.PutUint16(value[0:2], family) + bin.PutUint16(value[2:4], uint16(a.Port)) + copy(value[4:], ip) + m.Add(t, value[:4+len(ip)]) + return nil +} + +// AddTo adds MAPPED-ADDRESS to message. +func (a *MappedAddress) AddTo(m *Message) error { + return a.AddToAs(m, AttrMappedAddress) +} + +// GetFrom decodes MAPPED-ADDRESS from message. +func (a *MappedAddress) GetFrom(m *Message) error { + return a.GetFromAs(m, AttrMappedAddress) +} + +// AddTo adds OTHER-ADDRESS attribute to message. +func (o *OtherAddress) AddTo(m *Message) error { + a := (*MappedAddress)(o) + return a.AddToAs(m, AttrOtherAddress) +} + +// GetFrom decodes OTHER-ADDRESS from message. +func (o *OtherAddress) GetFrom(m *Message) error { + a := (*MappedAddress)(o) + return a.GetFromAs(m, AttrOtherAddress) +} + +func (o OtherAddress) String() string { + return net.JoinHostPort(o.IP.String(), strconv.Itoa(o.Port)) +} + +// AddTo adds RESPONSE-ORIGIN attribute to message. +func (o *ResponseOrigin) AddTo(m *Message) error { + a := (*MappedAddress)(o) + return a.AddToAs(m, AttrResponseOrigin) +} + +// GetFrom decodes RESPONSE-ORIGIN from message. +func (o *ResponseOrigin) GetFrom(m *Message) error { + a := (*MappedAddress)(o) + return a.GetFromAs(m, AttrResponseOrigin) +} + +func (o ResponseOrigin) String() string { + return net.JoinHostPort(o.IP.String(), strconv.Itoa(o.Port)) +} diff --git a/vendor/github.com/pion/stun/agent.go b/vendor/github.com/pion/stun/agent.go new file mode 100644 index 000000000..f03efa3c0 --- /dev/null +++ b/vendor/github.com/pion/stun/agent.go @@ -0,0 +1,233 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "sync" + "time" +) + +// NoopHandler just discards any event. +func NoopHandler() Handler { + return func(e Event) {} +} + +// NewAgent initializes and returns new Agent with provided handler. +// If h is nil, the NoopHandler will be used. +func NewAgent(h Handler) *Agent { + if h == nil { + h = NoopHandler() + } + a := &Agent{ + transactions: make(map[transactionID]agentTransaction), + handler: h, + } + return a +} + +// Agent is low-level abstraction over transaction list that +// handles concurrency (all calls are goroutine-safe) and +// time outs (via Collect call). +type Agent struct { + // transactions is map of transactions that are currently + // in progress. Event handling is done in such way when + // transaction is unregistered before agentTransaction access, + // minimizing mux lock and protecting agentTransaction from + // data races via unexpected concurrent access. + transactions map[transactionID]agentTransaction + closed bool // all calls are invalid if true + mux sync.Mutex // protects transactions and closed + handler Handler // handles transactions +} + +// Handler handles state changes of transaction. +// +// Handler is called on transaction state change. +// Usage of e is valid only during call, user must +// copy needed fields explicitly. +type Handler func(e Event) + +// Event is passed to Handler describing the transaction event. +// Do not reuse outside Handler. +type Event struct { + TransactionID [TransactionIDSize]byte + Message *Message + Error error +} + +// agentTransaction represents transaction in progress. +// Concurrent access is invalid. +type agentTransaction struct { + id transactionID + deadline time.Time +} + +var ( + // ErrTransactionStopped indicates that transaction was manually stopped. + ErrTransactionStopped = errors.New("transaction is stopped") + // ErrTransactionNotExists indicates that agent failed to find transaction. + ErrTransactionNotExists = errors.New("transaction not exists") + // ErrTransactionExists indicates that transaction with same id is already + // registered. + ErrTransactionExists = errors.New("transaction exists with same id") +) + +// StopWithError removes transaction from list and calls handler with +// provided error. Can return ErrTransactionNotExists and ErrAgentClosed. +func (a *Agent) StopWithError(id [TransactionIDSize]byte, err error) error { + a.mux.Lock() + if a.closed { + a.mux.Unlock() + return ErrAgentClosed + } + t, exists := a.transactions[id] + delete(a.transactions, id) + h := a.handler + a.mux.Unlock() + if !exists { + return ErrTransactionNotExists + } + h(Event{ + TransactionID: t.id, + Error: err, + }) + return nil +} + +// Stop stops transaction by id with ErrTransactionStopped, blocking +// until handler returns. +func (a *Agent) Stop(id [TransactionIDSize]byte) error { + return a.StopWithError(id, ErrTransactionStopped) +} + +// ErrAgentClosed indicates that agent is in closed state and is unable +// to handle transactions. +var ErrAgentClosed = errors.New("agent is closed") + +// Start registers transaction with provided id and deadline. +// Could return ErrAgentClosed, ErrTransactionExists. +// +// Agent handler is guaranteed to be eventually called. +func (a *Agent) Start(id [TransactionIDSize]byte, deadline time.Time) error { + a.mux.Lock() + defer a.mux.Unlock() + if a.closed { + return ErrAgentClosed + } + _, exists := a.transactions[id] + if exists { + return ErrTransactionExists + } + a.transactions[id] = agentTransaction{ + id: id, + deadline: deadline, + } + return nil +} + +// agentCollectCap is initial capacity for Agent.Collect slices, +// sufficient to make function zero-alloc in most cases. +const agentCollectCap = 100 + +// ErrTransactionTimeOut indicates that transaction has reached deadline. +var ErrTransactionTimeOut = errors.New("transaction is timed out") + +// Collect terminates all transactions that have deadline before provided +// time, blocking until all handlers will process ErrTransactionTimeOut. +// Will return ErrAgentClosed if agent is already closed. +// +// It is safe to call Collect concurrently but makes no sense. +func (a *Agent) Collect(gcTime time.Time) error { + toRemove := make([]transactionID, 0, agentCollectCap) + a.mux.Lock() + if a.closed { + // Doing nothing if agent is closed. + // All transactions should be already closed + // during Close() call. + a.mux.Unlock() + return ErrAgentClosed + } + // Adding all transactions with deadline before gcTime + // to toCall and toRemove slices. + // No allocs if there are less than agentCollectCap + // timed out transactions. + for id, t := range a.transactions { + if t.deadline.Before(gcTime) { + toRemove = append(toRemove, id) + } + } + // Un-registering timed out transactions. + for _, id := range toRemove { + delete(a.transactions, id) + } + // Calling handler does not require locked mutex, + // reducing lock time. + h := a.handler + a.mux.Unlock() + // Sending ErrTransactionTimeOut to handler for all transactions, + // blocking until last one. + event := Event{ + Error: ErrTransactionTimeOut, + } + for _, id := range toRemove { + event.TransactionID = id + h(event) + } + return nil +} + +// Process incoming message, synchronously passing it to handler. +func (a *Agent) Process(m *Message) error { + e := Event{ + TransactionID: m.TransactionID, + Message: m, + } + a.mux.Lock() + if a.closed { + a.mux.Unlock() + return ErrAgentClosed + } + h := a.handler + delete(a.transactions, m.TransactionID) + a.mux.Unlock() + h(e) + return nil +} + +// SetHandler sets agent handler to h. +func (a *Agent) SetHandler(h Handler) error { + a.mux.Lock() + if a.closed { + a.mux.Unlock() + return ErrAgentClosed + } + a.handler = h + a.mux.Unlock() + return nil +} + +// Close terminates all transactions with ErrAgentClosed and renders Agent to +// closed state. +func (a *Agent) Close() error { + e := Event{ + Error: ErrAgentClosed, + } + a.mux.Lock() + if a.closed { + a.mux.Unlock() + return ErrAgentClosed + } + for _, t := range a.transactions { + e.TransactionID = t.id + a.handler(e) + } + a.transactions = nil + a.closed = true + a.handler = nil + a.mux.Unlock() + return nil +} + +type transactionID [TransactionIDSize]byte diff --git a/vendor/github.com/pion/stun/attributes.go b/vendor/github.com/pion/stun/attributes.go new file mode 100644 index 000000000..8a1aa214c --- /dev/null +++ b/vendor/github.com/pion/stun/attributes.go @@ -0,0 +1,254 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "fmt" +) + +// Attributes is list of message attributes. +type Attributes []RawAttribute + +// Get returns first attribute from list by the type. +// If attribute is present the RawAttribute is returned and the +// boolean is true. Otherwise the returned RawAttribute will be +// empty and boolean will be false. +func (a Attributes) Get(t AttrType) (RawAttribute, bool) { + for _, candidate := range a { + if candidate.Type == t { + return candidate, true + } + } + return RawAttribute{}, false +} + +// AttrType is attribute type. +type AttrType uint16 + +// Required returns true if type is from comprehension-required range (0x0000-0x7FFF). +func (t AttrType) Required() bool { + return t <= 0x7FFF +} + +// Optional returns true if type is from comprehension-optional range (0x8000-0xFFFF). +func (t AttrType) Optional() bool { + return t >= 0x8000 +} + +// Attributes from comprehension-required range (0x0000-0x7FFF). +const ( + AttrMappedAddress AttrType = 0x0001 // MAPPED-ADDRESS + AttrUsername AttrType = 0x0006 // USERNAME + AttrMessageIntegrity AttrType = 0x0008 // MESSAGE-INTEGRITY + AttrErrorCode AttrType = 0x0009 // ERROR-CODE + AttrUnknownAttributes AttrType = 0x000A // UNKNOWN-ATTRIBUTES + AttrRealm AttrType = 0x0014 // REALM + AttrNonce AttrType = 0x0015 // NONCE + AttrXORMappedAddress AttrType = 0x0020 // XOR-MAPPED-ADDRESS +) + +// Attributes from comprehension-optional range (0x8000-0xFFFF). +const ( + AttrSoftware AttrType = 0x8022 // SOFTWARE + AttrAlternateServer AttrType = 0x8023 // ALTERNATE-SERVER + AttrFingerprint AttrType = 0x8028 // FINGERPRINT +) + +// Attributes from RFC 5245 ICE. +const ( + AttrPriority AttrType = 0x0024 // PRIORITY + AttrUseCandidate AttrType = 0x0025 // USE-CANDIDATE + AttrICEControlled AttrType = 0x8029 // ICE-CONTROLLED + AttrICEControlling AttrType = 0x802A // ICE-CONTROLLING +) + +// Attributes from RFC 5766 TURN. +const ( + AttrChannelNumber AttrType = 0x000C // CHANNEL-NUMBER + AttrLifetime AttrType = 0x000D // LIFETIME + AttrXORPeerAddress AttrType = 0x0012 // XOR-PEER-ADDRESS + AttrData AttrType = 0x0013 // DATA + AttrXORRelayedAddress AttrType = 0x0016 // XOR-RELAYED-ADDRESS + AttrEvenPort AttrType = 0x0018 // EVEN-PORT + AttrRequestedTransport AttrType = 0x0019 // REQUESTED-TRANSPORT + AttrDontFragment AttrType = 0x001A // DONT-FRAGMENT + AttrReservationToken AttrType = 0x0022 // RESERVATION-TOKEN +) + +// Attributes from RFC 5780 NAT Behavior Discovery +const ( + AttrChangeRequest AttrType = 0x0003 // CHANGE-REQUEST + AttrPadding AttrType = 0x0026 // PADDING + AttrResponsePort AttrType = 0x0027 // RESPONSE-PORT + AttrCacheTimeout AttrType = 0x8027 // CACHE-TIMEOUT + AttrResponseOrigin AttrType = 0x802b // RESPONSE-ORIGIN + AttrOtherAddress AttrType = 0x802C // OTHER-ADDRESS +) + +// Attributes from RFC 3489, removed by RFC 5389, +// +// but still used by RFC5389-implementing software like Vovida.org, reTURNServer, etc. +const ( + AttrSourceAddress AttrType = 0x0004 // SOURCE-ADDRESS + AttrChangedAddress AttrType = 0x0005 // CHANGED-ADDRESS +) + +// Attributes from RFC 6062 TURN Extensions for TCP Allocations. +const ( + AttrConnectionID AttrType = 0x002a // CONNECTION-ID +) + +// Attributes from RFC 6156 TURN IPv6. +const ( + AttrRequestedAddressFamily AttrType = 0x0017 // REQUESTED-ADDRESS-FAMILY +) + +// Attributes from An Origin Attribute for the STUN Protocol. +const ( + AttrOrigin AttrType = 0x802F +) + +// Attributes from RFC 8489 STUN. +const ( + AttrMessageIntegritySHA256 AttrType = 0x001C // MESSAGE-INTEGRITY-SHA256 + AttrPasswordAlgorithm AttrType = 0x001D // PASSWORD-ALGORITHM + AttrUserhash AttrType = 0x001E // USERHASH + AttrPasswordAlgorithms AttrType = 0x8002 // PASSWORD-ALGORITHMS + AttrAlternateDomain AttrType = 0x8003 // ALTERNATE-DOMAIN +) + +// Value returns uint16 representation of attribute type. +func (t AttrType) Value() uint16 { + return uint16(t) +} + +func attrNames() map[AttrType]string { + return map[AttrType]string{ + AttrMappedAddress: "MAPPED-ADDRESS", + AttrUsername: "USERNAME", + AttrErrorCode: "ERROR-CODE", + AttrMessageIntegrity: "MESSAGE-INTEGRITY", + AttrUnknownAttributes: "UNKNOWN-ATTRIBUTES", + AttrRealm: "REALM", + AttrNonce: "NONCE", + AttrXORMappedAddress: "XOR-MAPPED-ADDRESS", + AttrSoftware: "SOFTWARE", + AttrAlternateServer: "ALTERNATE-SERVER", + AttrFingerprint: "FINGERPRINT", + AttrPriority: "PRIORITY", + AttrUseCandidate: "USE-CANDIDATE", + AttrICEControlled: "ICE-CONTROLLED", + AttrICEControlling: "ICE-CONTROLLING", + AttrChannelNumber: "CHANNEL-NUMBER", + AttrLifetime: "LIFETIME", + AttrXORPeerAddress: "XOR-PEER-ADDRESS", + AttrData: "DATA", + AttrXORRelayedAddress: "XOR-RELAYED-ADDRESS", + AttrEvenPort: "EVEN-PORT", + AttrRequestedTransport: "REQUESTED-TRANSPORT", + AttrDontFragment: "DONT-FRAGMENT", + AttrReservationToken: "RESERVATION-TOKEN", + AttrConnectionID: "CONNECTION-ID", + AttrRequestedAddressFamily: "REQUESTED-ADDRESS-FAMILY", + AttrMessageIntegritySHA256: "MESSAGE-INTEGRITY-SHA256", + AttrPasswordAlgorithm: "PASSWORD-ALGORITHM", + AttrUserhash: "USERHASH", + AttrPasswordAlgorithms: "PASSWORD-ALGORITHMS", + AttrAlternateDomain: "ALTERNATE-DOMAIN", + } +} + +func (t AttrType) String() string { + s, ok := attrNames()[t] + if !ok { + // Just return hex representation of unknown attribute type. + return fmt.Sprintf("0x%x", uint16(t)) + } + return s +} + +// RawAttribute is a Type-Length-Value (TLV) object that +// can be added to a STUN message. Attributes are divided into two +// types: comprehension-required and comprehension-optional. STUN +// agents can safely ignore comprehension-optional attributes they +// don't understand, but cannot successfully process a message if it +// contains comprehension-required attributes that are not +// understood. +type RawAttribute struct { + Type AttrType + Length uint16 // ignored while encoding + Value []byte +} + +// AddTo implements Setter, adding attribute as a.Type with a.Value and ignoring +// the Length field. +func (a RawAttribute) AddTo(m *Message) error { + m.Add(a.Type, a.Value) + return nil +} + +// Equal returns true if a == b. +func (a RawAttribute) Equal(b RawAttribute) bool { + if a.Type != b.Type { + return false + } + if a.Length != b.Length { + return false + } + if len(b.Value) != len(a.Value) { + return false + } + for i, v := range a.Value { + if b.Value[i] != v { + return false + } + } + return true +} + +func (a RawAttribute) String() string { + return fmt.Sprintf("%s: 0x%x", a.Type, a.Value) +} + +// ErrAttributeNotFound means that attribute with provided attribute +// type does not exist in message. +var ErrAttributeNotFound = errors.New("attribute not found") + +// Get returns byte slice that represents attribute value, +// if there is no attribute with such type, +// ErrAttributeNotFound is returned. +func (m *Message) Get(t AttrType) ([]byte, error) { + v, ok := m.Attributes.Get(t) + if !ok { + return nil, ErrAttributeNotFound + } + return v.Value, nil +} + +// STUN aligns attributes on 32-bit boundaries, attributes whose content +// is not a multiple of 4 bytes are padded with 1, 2, or 3 bytes of +// padding so that its value contains a multiple of 4 bytes. The +// padding bits are ignored, and may be any value. +// +// https://tools.ietf.org/html/rfc5389#section-15 +const padding = 4 + +func nearestPaddedValueLength(l int) int { + n := padding * (l / padding) + if n < l { + n += padding + } + return n +} + +// This method converts uint16 vlue to AttrType. If it finds an old attribute +// type value, it also translates it to the new value to enable backward +// compatibility. (See: https://github.com/pion/stun/issues/21) +func compatAttrType(val uint16) AttrType { + if val == 0x8020 { // draft-ietf-behave-rfc3489bis-02, MS-TURN + return AttrXORMappedAddress // new: 0x0020 (from draft-ietf-behave-rfc3489bis-03 on) + } + return AttrType(val) +} diff --git a/vendor/github.com/pion/stun/attributes_debug.go b/vendor/github.com/pion/stun/attributes_debug.go new file mode 100644 index 000000000..836d79f13 --- /dev/null +++ b/vendor/github.com/pion/stun/attributes_debug.go @@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build debug +// +build debug + +package stun + +import "fmt" + +// AttrOverflowErr occurs when len(v) > Max. +type AttrOverflowErr struct { + Type AttrType + Max int + Got int +} + +func (e AttrOverflowErr) Error() string { + return fmt.Sprintf("incorrect length of %s attribute: %d exceeds maximum %d", + e.Type, e.Got, e.Max, + ) +} + +// AttrLengthErr means that length for attribute is invalid. +type AttrLengthErr struct { + Attr AttrType + Got int + Expected int +} + +func (e AttrLengthErr) Error() string { + return fmt.Sprintf("incorrect length of %s attribute: got %d, expected %d", + e.Attr, + e.Got, + e.Expected, + ) +} diff --git a/vendor/github.com/pion/stun/checks.go b/vendor/github.com/pion/stun/checks.go new file mode 100644 index 000000000..6b678a06b --- /dev/null +++ b/vendor/github.com/pion/stun/checks.go @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build !debug +// +build !debug + +package stun + +import ( + "errors" + + "github.com/pion/stun/internal/hmac" +) + +// CheckSize returns ErrAttrSizeInvalid if got is not equal to expected. +func CheckSize(_ AttrType, got, expected int) error { + if got == expected { + return nil + } + return ErrAttributeSizeInvalid +} + +func checkHMAC(got, expected []byte) error { + if hmac.Equal(got, expected) { + return nil + } + return ErrIntegrityMismatch +} + +func checkFingerprint(got, expected uint32) error { + if got == expected { + return nil + } + return ErrFingerprintMismatch +} + +// IsAttrSizeInvalid returns true if error means that attribute size is invalid. +func IsAttrSizeInvalid(err error) bool { + return errors.Is(err, ErrAttributeSizeInvalid) +} + +// CheckOverflow returns ErrAttributeSizeOverflow if got is bigger that max. +func CheckOverflow(_ AttrType, got, max int) error { + if got <= max { + return nil + } + return ErrAttributeSizeOverflow +} + +// IsAttrSizeOverflow returns true if error means that attribute size is too big. +func IsAttrSizeOverflow(err error) bool { + return errors.Is(err, ErrAttributeSizeOverflow) +} diff --git a/vendor/github.com/pion/stun/checks_debug.go b/vendor/github.com/pion/stun/checks_debug.go new file mode 100644 index 000000000..0b5c67c83 --- /dev/null +++ b/vendor/github.com/pion/stun/checks_debug.go @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build debug +// +build debug + +package stun + +import "github.com/pion/stun/internal/hmac" + +// CheckSize returns *AttrLengthError if got is not equal to expected. +func CheckSize(a AttrType, got, expected int) error { + if got == expected { + return nil + } + return &AttrLengthErr{ + Got: got, + Expected: expected, + Attr: a, + } +} + +func checkHMAC(got, expected []byte) error { + if hmac.Equal(got, expected) { + return nil + } + return &IntegrityErr{ + Expected: expected, + Actual: got, + } +} + +func checkFingerprint(got, expected uint32) error { + if got == expected { + return nil + } + return &CRCMismatch{ + Actual: got, + Expected: expected, + } +} + +// IsAttrSizeInvalid returns true if error means that attribute size is invalid. +func IsAttrSizeInvalid(err error) bool { + _, ok := err.(*AttrLengthErr) + return ok +} + +// CheckOverflow returns *AttrOverflowErr if got is bigger that max. +func CheckOverflow(t AttrType, got, max int) error { + if got <= max { + return nil + } + return &AttrOverflowErr{ + Type: t, + Got: got, + Max: max, + } +} + +// IsAttrSizeOverflow returns true if error means that attribute size is too big. +func IsAttrSizeOverflow(err error) bool { + _, ok := err.(*AttrOverflowErr) + return ok +} diff --git a/vendor/github.com/pion/stun/client.go b/vendor/github.com/pion/stun/client.go new file mode 100644 index 000000000..5d02e51dc --- /dev/null +++ b/vendor/github.com/pion/stun/client.go @@ -0,0 +1,722 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "crypto/tls" + "errors" + "fmt" + "io" + "log" + "net" + "runtime" + "strconv" + "sync" + "sync/atomic" + "time" + + "github.com/pion/dtls/v2" + "github.com/pion/transport/v2" + "github.com/pion/transport/v2/stdnet" +) + +// ErrUnsupportedURI is an error thrown if the user passes an unsupported STUN or TURN URI +var ErrUnsupportedURI = fmt.Errorf("invalid schema or transport") + +// Dial connects to the address on the named network and then +// initializes Client on that connection, returning error if any. +func Dial(network, address string) (*Client, error) { + conn, err := net.Dial(network, address) + if err != nil { + return nil, err + } + return NewClient(conn) +} + +// DialConfig is used to pass configuration to DialURI() +type DialConfig struct { + DTLSConfig dtls.Config + TLSConfig tls.Config + + Net transport.Net +} + +// DialURI connect to the STUN/TURN URI and then +// initializes Client on that connection, returning error if any. +func DialURI(uri *URI, cfg *DialConfig) (*Client, error) { + var conn Connection + var err error + + nw := cfg.Net + if nw == nil { + nw, err = stdnet.NewNet() + if err != nil { + return nil, fmt.Errorf("failed to create net: %w", err) + } + } + + addr := net.JoinHostPort(uri.Host, strconv.Itoa(uri.Port)) + + switch { + case uri.Scheme == SchemeTypeSTUN: + if conn, err = nw.Dial("udp", addr); err != nil { + return nil, fmt.Errorf("failed to listen: %w", err) + } + + case uri.Scheme == SchemeTypeTURN: + network := "udp" //nolint:goconst + if uri.Proto == ProtoTypeTCP { + network = "tcp" //nolint:goconst + } + + if conn, err = nw.Dial(network, addr); err != nil { + return nil, fmt.Errorf("failed to dial: %w", err) + } + + case uri.Scheme == SchemeTypeTURNS && uri.Proto == ProtoTypeUDP: + dtlsCfg := cfg.DTLSConfig // Copy + dtlsCfg.ServerName = uri.Host + + udpConn, err := nw.Dial("udp", addr) + if err != nil { + return nil, fmt.Errorf("failed to dial: %w", err) + } + + if conn, err = dtls.Client(udpConn, &dtlsCfg); err != nil { + return nil, fmt.Errorf("failed to connect to '%s': %w", addr, err) + } + + case (uri.Scheme == SchemeTypeTURNS || uri.Scheme == SchemeTypeSTUNS) && uri.Proto == ProtoTypeTCP: + tlsCfg := cfg.TLSConfig //nolint:govet + tlsCfg.ServerName = uri.Host + + tcpConn, err := nw.Dial("tcp", addr) + if err != nil { + return nil, fmt.Errorf("failed to dial: %w", err) + } + + conn = tls.Client(tcpConn, &tlsCfg) + + default: + return nil, ErrUnsupportedURI + } + + return NewClient(conn) +} + +// ErrNoConnection means that ClientOptions.Connection is nil. +var ErrNoConnection = errors.New("no connection provided") + +// ClientOption sets some client option. +type ClientOption func(c *Client) + +// WithHandler sets client handler which is called if Agent emits the Event +// with TransactionID that is not currently registered by Client. +// Useful for handling Data indications from TURN server. +func WithHandler(h Handler) ClientOption { + return func(c *Client) { + c.handler = h + } +} + +// WithRTO sets client RTO as defined in STUN RFC. +func WithRTO(rto time.Duration) ClientOption { + return func(c *Client) { + c.rto = int64(rto) + } +} + +// WithClock sets Clock of client, the source of current time. +// Also clock is passed to default collector if set. +func WithClock(clock Clock) ClientOption { + return func(c *Client) { + c.clock = clock + } +} + +// WithTimeoutRate sets RTO timer minimum resolution. +func WithTimeoutRate(d time.Duration) ClientOption { + return func(c *Client) { + c.rtoRate = d + } +} + +// WithAgent sets client STUN agent. +// +// Defaults to agent implementation in current package, +// see agent.go. +func WithAgent(a ClientAgent) ClientOption { + return func(c *Client) { + c.a = a + } +} + +// WithCollector rests client timeout collector, the implementation +// of ticker which calls function on each tick. +func WithCollector(coll Collector) ClientOption { + return func(c *Client) { + c.collector = coll + } +} + +// WithNoConnClose prevents client from closing underlying connection when +// the Close() method is called. +func WithNoConnClose() ClientOption { + return func(c *Client) { + c.closeConn = false + } +} + +// WithNoRetransmit disables retransmissions and sets RTO to +// defaultMaxAttempts * defaultRTO which will be effectively time out +// if not set. +// +// Useful for TCP connections where transport handles RTO. +func WithNoRetransmit(c *Client) { + c.maxAttempts = 0 + if c.rto == 0 { + c.rto = defaultMaxAttempts * int64(defaultRTO) + } +} + +const ( + defaultTimeoutRate = time.Millisecond * 5 + defaultRTO = time.Millisecond * 300 + defaultMaxAttempts = 7 +) + +// NewClient initializes new Client from provided options, +// starting internal goroutines and using default options fields +// if necessary. Call Close method after using Client to close conn and +// release resources. +// +// The conn will be closed on Close call. Use WithNoConnClose option to +// prevent that. +// +// Note that user should handle the protocol multiplexing, client does not +// provide any API for it, so if you need to read application data, wrap the +// connection with your (de-)multiplexer and pass the wrapper as conn. +func NewClient(conn Connection, options ...ClientOption) (*Client, error) { + c := &Client{ + close: make(chan struct{}), + c: conn, + clock: systemClock(), + rto: int64(defaultRTO), + rtoRate: defaultTimeoutRate, + t: make(map[transactionID]*clientTransaction, 100), + maxAttempts: defaultMaxAttempts, + closeConn: true, + } + for _, o := range options { + o(c) + } + if c.c == nil { + return nil, ErrNoConnection + } + if c.a == nil { + c.a = NewAgent(nil) + } + if err := c.a.SetHandler(c.handleAgentCallback); err != nil { + return nil, err + } + if c.collector == nil { + c.collector = &tickerCollector{ + close: make(chan struct{}), + clock: c.clock, + } + } + if err := c.collector.Start(c.rtoRate, func(t time.Time) { + closedOrPanic(c.a.Collect(t)) + }); err != nil { + return nil, err + } + c.wg.Add(1) + go c.readUntilClosed() + runtime.SetFinalizer(c, clientFinalizer) + return c, nil +} + +func clientFinalizer(c *Client) { + if c == nil { + return + } + err := c.Close() + if errors.Is(err, ErrClientClosed) { + return + } + if err == nil { + log.Println("client: called finalizer on non-closed client") // nolint + return + } + log.Println("client: called finalizer on non-closed client:", err) // nolint +} + +// Connection wraps Reader, Writer and Closer interfaces. +type Connection interface { + io.Reader + io.Writer + io.Closer +} + +// ClientAgent is Agent implementation that is used by Client to +// process transactions. +type ClientAgent interface { + Process(*Message) error + Close() error + Start(id [TransactionIDSize]byte, deadline time.Time) error + Stop(id [TransactionIDSize]byte) error + Collect(time.Time) error + SetHandler(h Handler) error +} + +// Client simulates "connection" to STUN server. +type Client struct { + rto int64 // time.Duration + a ClientAgent + c Connection + close chan struct{} + rtoRate time.Duration + maxAttempts int32 + closed bool + closeConn bool // should call c.Close() while closing + wg sync.WaitGroup + clock Clock + handler Handler + collector Collector + t map[transactionID]*clientTransaction + + // mux guards closed and t + mux sync.RWMutex +} + +// clientTransaction represents transaction in progress. +// If transaction is succeed or failed, f will be called +// provided by event. +// Concurrent access is invalid. +type clientTransaction struct { + id transactionID + attempt int32 + calls int32 + h Handler + start time.Time + rto time.Duration + raw []byte +} + +func (t *clientTransaction) handle(e Event) { + if atomic.AddInt32(&t.calls, 1) == 1 { + t.h(e) + } +} + +var clientTransactionPool = &sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + return &clientTransaction{ + raw: make([]byte, 1500), + } + }, +} + +func acquireClientTransaction() *clientTransaction { + return clientTransactionPool.Get().(*clientTransaction) //nolint:forcetypeassert +} + +func putClientTransaction(t *clientTransaction) { + t.raw = t.raw[:0] + t.start = time.Time{} + t.attempt = 0 + t.id = transactionID{} + clientTransactionPool.Put(t) +} + +func (t *clientTransaction) nextTimeout(now time.Time) time.Time { + return now.Add(time.Duration(t.attempt+1) * t.rto) +} + +// start registers transaction. +// +// Could return ErrClientClosed, ErrTransactionExists. +func (c *Client) start(t *clientTransaction) error { + c.mux.Lock() + defer c.mux.Unlock() + if c.closed { + return ErrClientClosed + } + _, exists := c.t[t.id] + if exists { + return ErrTransactionExists + } + c.t[t.id] = t + return nil +} + +// Clock abstracts the source of current time. +type Clock interface { + Now() time.Time +} + +type systemClockService struct{} + +func (systemClockService) Now() time.Time { return time.Now() } + +func systemClock() systemClockService { + return systemClockService{} +} + +// SetRTO sets current RTO value. +func (c *Client) SetRTO(rto time.Duration) { + atomic.StoreInt64(&c.rto, int64(rto)) +} + +// StopErr occurs when Client fails to stop transaction while +// processing error. +// +//nolint:errname +type StopErr struct { + Err error // value returned by Stop() + Cause error // error that caused Stop() call +} + +func (e StopErr) Error() string { + return fmt.Sprintf("error while stopping due to %s: %s", sprintErr(e.Cause), sprintErr(e.Err)) +} + +// CloseErr indicates client close failure. +// +//nolint:errname +type CloseErr struct { + AgentErr error + ConnectionErr error +} + +func sprintErr(err error) string { + if err == nil { + return "" //nolint:goconst + } + return err.Error() +} + +func (c CloseErr) Error() string { + return fmt.Sprintf("failed to close: %s (connection), %s (agent)", sprintErr(c.ConnectionErr), sprintErr(c.AgentErr)) +} + +func (c *Client) readUntilClosed() { + defer c.wg.Done() + m := new(Message) + m.Raw = make([]byte, 1024) + for { + select { + case <-c.close: + return + default: + } + _, err := m.ReadFrom(c.c) + if err == nil { + if pErr := c.a.Process(m); errors.Is(pErr, ErrAgentClosed) { + return + } + } + } +} + +func closedOrPanic(err error) { + if err == nil || errors.Is(err, ErrAgentClosed) { + return + } + panic(err) //nolint +} + +type tickerCollector struct { + close chan struct{} + wg sync.WaitGroup + clock Clock +} + +// Collector calls function f with constant rate. +// +// The simple Collector is ticker which calls function on each tick. +type Collector interface { + Start(rate time.Duration, f func(now time.Time)) error + Close() error +} + +func (a *tickerCollector) Start(rate time.Duration, f func(now time.Time)) error { + t := time.NewTicker(rate) + a.wg.Add(1) + go func() { + defer a.wg.Done() + for { + select { + case <-a.close: + t.Stop() + return + case <-t.C: + f(a.clock.Now()) + } + } + }() + return nil +} + +func (a *tickerCollector) Close() error { + close(a.close) + a.wg.Wait() + return nil +} + +// ErrClientClosed indicates that client is closed. +var ErrClientClosed = errors.New("client is closed") + +// Close stops internal connection and agent, returning CloseErr on error. +func (c *Client) Close() error { + if err := c.checkInit(); err != nil { + return err + } + c.mux.Lock() + if c.closed { + c.mux.Unlock() + return ErrClientClosed + } + c.closed = true + c.mux.Unlock() + if closeErr := c.collector.Close(); closeErr != nil { + return closeErr + } + var connErr error + agentErr := c.a.Close() + if c.closeConn { + connErr = c.c.Close() + } + close(c.close) + c.wg.Wait() + if agentErr == nil && connErr == nil { + return nil + } + return CloseErr{ + AgentErr: agentErr, + ConnectionErr: connErr, + } +} + +// Indicate sends indication m to server. Shorthand to Start call +// with zero deadline and callback. +func (c *Client) Indicate(m *Message) error { + return c.Start(m, nil) +} + +// callbackWaitHandler blocks on wait() call until callback is called. +type callbackWaitHandler struct { + handler Handler + callback func(event Event) + cond *sync.Cond + processed bool +} + +func (s *callbackWaitHandler) HandleEvent(e Event) { + s.cond.L.Lock() + if s.callback == nil { + panic("s.callback is nil") //nolint + } + s.callback(e) + s.processed = true + s.cond.Broadcast() + s.cond.L.Unlock() +} + +func (s *callbackWaitHandler) wait() { + s.cond.L.Lock() + for !s.processed { + s.cond.Wait() + } + s.processed = false + s.callback = nil + s.cond.L.Unlock() +} + +func (s *callbackWaitHandler) setCallback(f func(event Event)) { + if f == nil { + panic("f is nil") //nolint + } + s.cond.L.Lock() + s.callback = f + if s.handler == nil { + s.handler = s.HandleEvent + } + s.cond.L.Unlock() +} + +var callbackWaitHandlerPool = sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + return &callbackWaitHandler{ + cond: sync.NewCond(new(sync.Mutex)), + } + }, +} + +// ErrClientNotInitialized means that client connection or agent is nil. +var ErrClientNotInitialized = errors.New("client not initialized") + +func (c *Client) checkInit() error { + if c == nil || c.c == nil || c.a == nil || c.close == nil { + return ErrClientNotInitialized + } + return nil +} + +// Do is Start wrapper that waits until callback is called. If no callback +// provided, Indicate is called instead. +// +// Do has cpu overhead due to blocking, see BenchmarkClient_Do. +// Use Start method for less overhead. +func (c *Client) Do(m *Message, f func(Event)) error { + if err := c.checkInit(); err != nil { + return err + } + if f == nil { + return c.Indicate(m) + } + h := callbackWaitHandlerPool.Get().(*callbackWaitHandler) //nolint:forcetypeassert + h.setCallback(f) + defer func() { + callbackWaitHandlerPool.Put(h) + }() + if err := c.Start(m, h.handler); err != nil { + return err + } + h.wait() + return nil +} + +func (c *Client) delete(id transactionID) { + c.mux.Lock() + if c.t != nil { + delete(c.t, id) + } + c.mux.Unlock() +} + +type buffer struct { + buf []byte +} + +var bufferPool = &sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + return &buffer{buf: make([]byte, 2048)} + }, +} + +func (c *Client) handleAgentCallback(e Event) { + c.mux.Lock() + if c.closed { + c.mux.Unlock() + return + } + t, found := c.t[e.TransactionID] + if found { + delete(c.t, t.id) + } + c.mux.Unlock() + if !found { + if c.handler != nil && !errors.Is(e.Error, ErrTransactionStopped) { + c.handler(e) + } + // Ignoring. + return + } + if atomic.LoadInt32(&c.maxAttempts) <= t.attempt || e.Error == nil { + // Transaction completed. + t.handle(e) + putClientTransaction(t) + return + } + // Doing re-transmission. + t.attempt++ + b := bufferPool.Get().(*buffer) //nolint:forcetypeassert + b.buf = b.buf[:copy(b.buf[:cap(b.buf)], t.raw)] + defer bufferPool.Put(b) + var ( + now = c.clock.Now() + timeOut = t.nextTimeout(now) + id = t.id + ) + // Starting client transaction. + if startErr := c.start(t); startErr != nil { + c.delete(id) + e.Error = startErr + t.handle(e) + putClientTransaction(t) + return + } + // Starting agent transaction. + if startErr := c.a.Start(id, timeOut); startErr != nil { + c.delete(id) + e.Error = startErr + t.handle(e) + putClientTransaction(t) + return + } + // Writing message to connection again. + _, writeErr := c.c.Write(b.buf) + if writeErr != nil { + c.delete(id) + e.Error = writeErr + // Stopping agent transaction instead of waiting until it's deadline. + // This will call handleAgentCallback with "ErrTransactionStopped" error + // which will be ignored. + if stopErr := c.a.Stop(id); stopErr != nil { + // Failed to stop agent transaction. Wrapping the error in StopError. + e.Error = StopErr{ + Err: stopErr, + Cause: writeErr, + } + } + t.handle(e) + putClientTransaction(t) + return + } +} + +// Start starts transaction (if h set) and writes message to server, handler +// is called asynchronously. +func (c *Client) Start(m *Message, h Handler) error { + if err := c.checkInit(); err != nil { + return err + } + c.mux.RLock() + closed := c.closed + c.mux.RUnlock() + if closed { + return ErrClientClosed + } + if h != nil { + // Starting transaction only if h is set. Useful for indications. + t := acquireClientTransaction() + t.id = m.TransactionID + t.start = c.clock.Now() + t.h = h + t.rto = time.Duration(atomic.LoadInt64(&c.rto)) + t.attempt = 0 + t.raw = append(t.raw[:0], m.Raw...) + t.calls = 0 + d := t.nextTimeout(t.start) + if err := c.start(t); err != nil { + return err + } + if err := c.a.Start(m.TransactionID, d); err != nil { + return err + } + } + _, err := m.WriteTo(c.c) + if err != nil && h != nil { + c.delete(m.TransactionID) + // Stopping transaction instead of waiting until deadline. + if stopErr := c.a.Stop(m.TransactionID); stopErr != nil { + return StopErr{ + Err: stopErr, + Cause: err, + } + } + } + return err +} diff --git a/vendor/github.com/pion/stun/codecov.yml b/vendor/github.com/pion/stun/codecov.yml new file mode 100644 index 000000000..263e4d45c --- /dev/null +++ b/vendor/github.com/pion/stun/codecov.yml @@ -0,0 +1,22 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +coverage: + status: + project: + default: + # Allow decreasing 2% of total coverage to avoid noise. + threshold: 2% + patch: + default: + target: 70% + only_pulls: true + +ignore: + - "examples/*" + - "examples/**/*" diff --git a/vendor/github.com/pion/stun/errorcode.go b/vendor/github.com/pion/stun/errorcode.go new file mode 100644 index 000000000..c852eed69 --- /dev/null +++ b/vendor/github.com/pion/stun/errorcode.go @@ -0,0 +1,162 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "fmt" + "io" +) + +// ErrorCodeAttribute represents ERROR-CODE attribute. +// +// RFC 5389 Section 15.6 +type ErrorCodeAttribute struct { + Code ErrorCode + Reason []byte +} + +func (c ErrorCodeAttribute) String() string { + return fmt.Sprintf("%d: %s", c.Code, c.Reason) +} + +// constants for ERROR-CODE encoding. +const ( + errorCodeReasonStart = 4 + errorCodeClassByte = 2 + errorCodeNumberByte = 3 + errorCodeReasonMaxB = 763 + errorCodeModulo = 100 +) + +// AddTo adds ERROR-CODE to m. +func (c ErrorCodeAttribute) AddTo(m *Message) error { + value := make([]byte, 0, errorCodeReasonStart+errorCodeReasonMaxB) + if err := CheckOverflow(AttrErrorCode, + len(c.Reason)+errorCodeReasonStart, + errorCodeReasonMaxB+errorCodeReasonStart, + ); err != nil { + return err + } + value = value[:errorCodeReasonStart+len(c.Reason)] + number := byte(c.Code % errorCodeModulo) // error code modulo 100 + class := byte(c.Code / errorCodeModulo) // hundred digit + value[errorCodeClassByte] = class + value[errorCodeNumberByte] = number + copy(value[errorCodeReasonStart:], c.Reason) + m.Add(AttrErrorCode, value) + return nil +} + +// GetFrom decodes ERROR-CODE from m. Reason is valid until m.Raw is valid. +func (c *ErrorCodeAttribute) GetFrom(m *Message) error { + v, err := m.Get(AttrErrorCode) + if err != nil { + return err + } + if len(v) < errorCodeReasonStart { + return io.ErrUnexpectedEOF + } + var ( + class = uint16(v[errorCodeClassByte]) + number = uint16(v[errorCodeNumberByte]) + code = int(class*errorCodeModulo + number) + ) + c.Code = ErrorCode(code) + c.Reason = v[errorCodeReasonStart:] + return nil +} + +// ErrorCode is code for ERROR-CODE attribute. +type ErrorCode int + +// ErrNoDefaultReason means that default reason for provided error code +// is not defined in RFC. +var ErrNoDefaultReason = errors.New("no default reason for ErrorCode") + +// AddTo adds ERROR-CODE with default reason to m. If there +// is no default reason, returns ErrNoDefaultReason. +func (c ErrorCode) AddTo(m *Message) error { + reason := errorReasons[c] + if reason == nil { + return ErrNoDefaultReason + } + a := &ErrorCodeAttribute{ + Code: c, + Reason: reason, + } + return a.AddTo(m) +} + +// Possible error codes. +const ( + CodeTryAlternate ErrorCode = 300 + CodeBadRequest ErrorCode = 400 + CodeUnauthorized ErrorCode = 401 + CodeUnknownAttribute ErrorCode = 420 + CodeStaleNonce ErrorCode = 438 + CodeRoleConflict ErrorCode = 487 + CodeServerError ErrorCode = 500 +) + +// DEPRECATED constants. +const ( + // DEPRECATED, use CodeUnauthorized. + CodeUnauthorised = CodeUnauthorized +) + +// Error codes from RFC 5766. +// +// RFC 5766 Section 15 +const ( + CodeForbidden ErrorCode = 403 // Forbidden + CodeAllocMismatch ErrorCode = 437 // Allocation Mismatch + CodeWrongCredentials ErrorCode = 441 // Wrong Credentials + CodeUnsupportedTransProto ErrorCode = 442 // Unsupported Transport Protocol + CodeAllocQuotaReached ErrorCode = 486 // Allocation Quota Reached + CodeInsufficientCapacity ErrorCode = 508 // Insufficient Capacity +) + +// Error codes from RFC 6062. +// +// RFC 6062 Section 6.3 +const ( + CodeConnAlreadyExists ErrorCode = 446 + CodeConnTimeoutOrFailure ErrorCode = 447 +) + +// Error codes from RFC 6156. +// +// RFC 6156 Section 10.2 +const ( + CodeAddrFamilyNotSupported ErrorCode = 440 // Address Family not Supported + CodePeerAddrFamilyMismatch ErrorCode = 443 // Peer Address Family Mismatch +) + +//nolint:gochecknoglobals +var errorReasons = map[ErrorCode][]byte{ + CodeTryAlternate: []byte("Try Alternate"), + CodeBadRequest: []byte("Bad Request"), + CodeUnauthorized: []byte("Unauthorized"), + CodeUnknownAttribute: []byte("Unknown Attribute"), + CodeStaleNonce: []byte("Stale Nonce"), + CodeServerError: []byte("Server Error"), + CodeRoleConflict: []byte("Role Conflict"), + + // RFC 5766. + CodeForbidden: []byte("Forbidden"), + CodeAllocMismatch: []byte("Allocation Mismatch"), + CodeWrongCredentials: []byte("Wrong Credentials"), + CodeUnsupportedTransProto: []byte("Unsupported Transport Protocol"), + CodeAllocQuotaReached: []byte("Allocation Quota Reached"), + CodeInsufficientCapacity: []byte("Insufficient Capacity"), + + // RFC 6062. + CodeConnAlreadyExists: []byte("Connection Already Exists"), + CodeConnTimeoutOrFailure: []byte("Connection Timeout or Failure"), + + // RFC 6156. + CodeAddrFamilyNotSupported: []byte("Address Family not Supported"), + CodePeerAddrFamilyMismatch: []byte("Peer Address Family Mismatch"), +} diff --git a/vendor/github.com/pion/stun/errors.go b/vendor/github.com/pion/stun/errors.go new file mode 100644 index 000000000..d5f59edd6 --- /dev/null +++ b/vendor/github.com/pion/stun/errors.go @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import "errors" + +// DecodeErr records an error and place when it is occurred. +// +//nolint:errname +type DecodeErr struct { + Place DecodeErrPlace + Message string +} + +// IsInvalidCookie returns true if error means that magic cookie +// value is invalid. +func (e DecodeErr) IsInvalidCookie() bool { + return e.Place == DecodeErrPlace{"message", "cookie"} +} + +// IsPlaceParent reports if error place parent is p. +func (e DecodeErr) IsPlaceParent(p string) bool { + return e.Place.Parent == p +} + +// IsPlaceChildren reports if error place children is c. +func (e DecodeErr) IsPlaceChildren(c string) bool { + return e.Place.Children == c +} + +// IsPlace reports if error place is p. +func (e DecodeErr) IsPlace(p DecodeErrPlace) bool { + return e.Place == p +} + +// DecodeErrPlace records a place where error is occurred. +type DecodeErrPlace struct { + Parent string + Children string +} + +func (p DecodeErrPlace) String() string { + return p.Parent + "/" + p.Children +} + +func (e DecodeErr) Error() string { + return "BadFormat for " + e.Place.String() + ": " + e.Message +} + +func newDecodeErr(parent, children, message string) *DecodeErr { + return &DecodeErr{ + Place: DecodeErrPlace{Parent: parent, Children: children}, + Message: message, + } +} + +func newAttrDecodeErr(children, message string) *DecodeErr { + return newDecodeErr("attribute", children, message) +} + +// ErrAttributeSizeInvalid means that decoded attribute size is invalid. +var ErrAttributeSizeInvalid = errors.New("attribute size is invalid") + +// ErrAttributeSizeOverflow means that decoded attribute size is too big. +var ErrAttributeSizeOverflow = errors.New("attribute size overflow") diff --git a/vendor/github.com/pion/stun/fingerprint.go b/vendor/github.com/pion/stun/fingerprint.go new file mode 100644 index 000000000..b4126d267 --- /dev/null +++ b/vendor/github.com/pion/stun/fingerprint.go @@ -0,0 +1,70 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "hash/crc32" +) + +// FingerprintAttr represents FINGERPRINT attribute. +// +// RFC 5389 Section 15.5 +type FingerprintAttr struct{} + +// ErrFingerprintMismatch means that computed fingerprint differs from expected. +var ErrFingerprintMismatch = errors.New("fingerprint check failed") + +// Fingerprint is shorthand for FingerprintAttr. +// +// Example: +// +// m := New() +// Fingerprint.AddTo(m) +var Fingerprint FingerprintAttr //nolint:gochecknoglobals + +const ( + fingerprintXORValue uint32 = 0x5354554e //nolint:staticcheck + fingerprintSize = 4 // 32 bit +) + +// FingerprintValue returns CRC-32 of b XOR-ed by 0x5354554e. +// +// The value of the attribute is computed as the CRC-32 of the STUN message +// up to (but excluding) the FINGERPRINT attribute itself, XOR'ed with +// the 32-bit value 0x5354554e (the XOR helps in cases where an +// application packet is also using CRC-32 in it). +func FingerprintValue(b []byte) uint32 { + return crc32.ChecksumIEEE(b) ^ fingerprintXORValue // XOR +} + +// AddTo adds fingerprint to message. +func (FingerprintAttr) AddTo(m *Message) error { + l := m.Length + // length in header should include size of fingerprint attribute + m.Length += fingerprintSize + attributeHeaderSize // increasing length + m.WriteLength() // writing Length to Raw + b := make([]byte, fingerprintSize) + val := FingerprintValue(m.Raw) + bin.PutUint32(b, val) + m.Length = l + m.Add(AttrFingerprint, b) + return nil +} + +// Check reads fingerprint value from m and checks it, returning error if any. +// Can return *AttrLengthErr, ErrAttributeNotFound, and *CRCMismatch. +func (FingerprintAttr) Check(m *Message) error { + b, err := m.Get(AttrFingerprint) + if err != nil { + return err + } + if err = CheckSize(AttrFingerprint, len(b), fingerprintSize); err != nil { + return err + } + val := bin.Uint32(b) + attrStart := len(m.Raw) - (fingerprintSize + attributeHeaderSize) + expected := FingerprintValue(m.Raw[:attrStart]) + return checkFingerprint(val, expected) +} diff --git a/vendor/github.com/pion/stun/fingerprint_debug.go b/vendor/github.com/pion/stun/fingerprint_debug.go new file mode 100644 index 000000000..0e3471db8 --- /dev/null +++ b/vendor/github.com/pion/stun/fingerprint_debug.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build debug +// +build debug + +package stun + +import "fmt" + +// CRCMismatch represents CRC check error. +type CRCMismatch struct { + Expected uint32 + Actual uint32 +} + +func (m CRCMismatch) Error() string { + return fmt.Sprintf("CRC mismatch: %x (expected) != %x (actual)", + m.Expected, + m.Actual, + ) +} diff --git a/vendor/github.com/pion/stun/helpers.go b/vendor/github.com/pion/stun/helpers.go new file mode 100644 index 000000000..d4056503c --- /dev/null +++ b/vendor/github.com/pion/stun/helpers.go @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +// Interfaces that are implemented by message attributes, shorthands for them, +// or helpers for message fields as type or transaction id. +type ( + // Setter sets *Message attribute. + Setter interface { + AddTo(m *Message) error + } + // Getter parses attribute from *Message. + Getter interface { + GetFrom(m *Message) error + } + // Checker checks *Message attribute. + Checker interface { + Check(m *Message) error + } +) + +// Build resets message and applies setters to it in batch, returning on +// first error. To prevent allocations, pass pointers to values. +// +// Example: +// +// var ( +// t = BindingRequest +// username = NewUsername("username") +// nonce = NewNonce("nonce") +// realm = NewRealm("example.org") +// ) +// m := new(Message) +// m.Build(t, username, nonce, realm) // 4 allocations +// m.Build(&t, &username, &nonce, &realm) // 0 allocations +// +// See BenchmarkBuildOverhead. +func (m *Message) Build(setters ...Setter) error { + m.Reset() + m.WriteHeader() + for _, s := range setters { + if err := s.AddTo(m); err != nil { + return err + } + } + return nil +} + +// Check applies checkers to message in batch, returning on first error. +func (m *Message) Check(checkers ...Checker) error { + for _, c := range checkers { + if err := c.Check(m); err != nil { + return err + } + } + return nil +} + +// Parse applies getters to message in batch, returning on first error. +func (m *Message) Parse(getters ...Getter) error { + for _, c := range getters { + if err := c.GetFrom(m); err != nil { + return err + } + } + return nil +} + +// MustBuild wraps Build call and panics on error. +func MustBuild(setters ...Setter) *Message { + m, err := Build(setters...) + if err != nil { + panic(err) //nolint + } + return m +} + +// Build wraps Message.Build method. +func Build(setters ...Setter) (*Message, error) { + m := new(Message) + if err := m.Build(setters...); err != nil { + return nil, err + } + return m, nil +} + +// ForEach is helper that iterates over message attributes allowing to call +// Getter in f callback to get all attributes of type t and returning on first +// f error. +// +// The m.Get method inside f will be returning next attribute on each f call. +// Does not error if there are no results. +func (m *Message) ForEach(t AttrType, f func(m *Message) error) error { + attrs := m.Attributes + defer func() { + m.Attributes = attrs + }() + for i, a := range attrs { + if a.Type != t { + continue + } + m.Attributes = attrs[i:] + if err := f(m); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/pion/stun/integrity.go b/vendor/github.com/pion/stun/integrity.go new file mode 100644 index 000000000..0fee0b075 --- /dev/null +++ b/vendor/github.com/pion/stun/integrity.go @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( //nolint:gci + "crypto/md5" //nolint:gosec + "crypto/sha1" //nolint:gosec + "errors" + "fmt" + "strings" + + "github.com/pion/stun/internal/hmac" +) + +// separator for credentials. +const credentialsSep = ":" + +// NewLongTermIntegrity returns new MessageIntegrity with key for long-term +// credentials. Password, username, and realm must be SASL-prepared. +func NewLongTermIntegrity(username, realm, password string) MessageIntegrity { + k := strings.Join([]string{username, realm, password}, credentialsSep) + h := md5.New() //nolint:gosec + fmt.Fprint(h, k) + return MessageIntegrity(h.Sum(nil)) +} + +// NewShortTermIntegrity returns new MessageIntegrity with key for short-term +// credentials. Password must be SASL-prepared. +func NewShortTermIntegrity(password string) MessageIntegrity { + return MessageIntegrity(password) +} + +// MessageIntegrity represents MESSAGE-INTEGRITY attribute. +// +// AddTo and Check methods are using zero-allocation version of hmac, see +// newHMAC function and internal/hmac/pool.go. +// +// RFC 5389 Section 15.4 +type MessageIntegrity []byte + +func newHMAC(key, message, buf []byte) []byte { + mac := hmac.AcquireSHA1(key) + writeOrPanic(mac, message) + defer hmac.PutSHA1(mac) + return mac.Sum(buf) +} + +func (i MessageIntegrity) String() string { + return fmt.Sprintf("KEY: 0x%x", []byte(i)) +} + +const messageIntegritySize = 20 + +// ErrFingerprintBeforeIntegrity means that FINGERPRINT attribute is already in +// message, so MESSAGE-INTEGRITY attribute cannot be added. +var ErrFingerprintBeforeIntegrity = errors.New("FINGERPRINT before MESSAGE-INTEGRITY attribute") + +// AddTo adds MESSAGE-INTEGRITY attribute to message. +// +// CPU costly, see BenchmarkMessageIntegrity_AddTo. +func (i MessageIntegrity) AddTo(m *Message) error { + for _, a := range m.Attributes { + // Message should not contain FINGERPRINT attribute + // before MESSAGE-INTEGRITY. + if a.Type == AttrFingerprint { + return ErrFingerprintBeforeIntegrity + } + } + // The text used as input to HMAC is the STUN message, + // including the header, up to and including the attribute preceding the + // MESSAGE-INTEGRITY attribute. + length := m.Length + // Adjusting m.Length to contain MESSAGE-INTEGRITY TLV. + m.Length += messageIntegritySize + attributeHeaderSize + m.WriteLength() // writing length to m.Raw + v := newHMAC(i, m.Raw, m.Raw[len(m.Raw):]) // calculating HMAC for adjusted m.Raw + m.Length = length // changing m.Length back + + // Copy hmac value to temporary variable to protect it from resetting + // while processing m.Add call. + vBuf := make([]byte, sha1.Size) + copy(vBuf, v) + + m.Add(AttrMessageIntegrity, vBuf) + return nil +} + +// ErrIntegrityMismatch means that computed HMAC differs from expected. +var ErrIntegrityMismatch = errors.New("integrity check failed") + +// Check checks MESSAGE-INTEGRITY attribute. +// +// CPU costly, see BenchmarkMessageIntegrity_Check. +func (i MessageIntegrity) Check(m *Message) error { + v, err := m.Get(AttrMessageIntegrity) + if err != nil { + return err + } + + // Adjusting length in header to match m.Raw that was + // used when computing HMAC. + var ( + length = m.Length + afterIntegrity = false + sizeReduced int + ) + for _, a := range m.Attributes { + if afterIntegrity { + sizeReduced += nearestPaddedValueLength(int(a.Length)) + sizeReduced += attributeHeaderSize + } + if a.Type == AttrMessageIntegrity { + afterIntegrity = true + } + } + m.Length -= uint32(sizeReduced) + m.WriteLength() + // startOfHMAC should be first byte of integrity attribute. + startOfHMAC := messageHeaderSize + m.Length - (attributeHeaderSize + messageIntegritySize) + b := m.Raw[:startOfHMAC] // data before integrity attribute + expected := newHMAC(i, b, m.Raw[len(m.Raw):]) + m.Length = length + m.WriteLength() // writing length back + return checkHMAC(v, expected) +} diff --git a/vendor/github.com/pion/stun/integrity_debug.go b/vendor/github.com/pion/stun/integrity_debug.go new file mode 100644 index 000000000..27fd0e275 --- /dev/null +++ b/vendor/github.com/pion/stun/integrity_debug.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build debug +// +build debug + +package stun + +import "fmt" + +// IntegrityErr occurs when computed HMAC differs from expected. +type IntegrityErr struct { + Expected []byte + Actual []byte +} + +func (i *IntegrityErr) Error() string { + return fmt.Sprintf( + "Integrity check failed: 0x%x (expected) !- 0x%x (actual)", + i.Expected, i.Actual, + ) +} diff --git a/vendor/github.com/pion/stun/internal/hmac/hmac.go b/vendor/github.com/pion/stun/internal/hmac/hmac.go new file mode 100644 index 000000000..b4db5c996 --- /dev/null +++ b/vendor/github.com/pion/stun/internal/hmac/hmac.go @@ -0,0 +1,156 @@ +// SPDX-FileCopyrightText: 2009 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +/* +Package hmac implements the Keyed-Hash Message Authentication Code (HMAC) as +defined in U.S. Federal Information Processing Standards Publication 198. +An HMAC is a cryptographic hash that uses a key to sign a message. +The receiver verifies the hash by recomputing it using the same key. + +Receivers should be careful to use Equal to compare MACs in order to avoid +timing side-channels: + + // ValidMAC reports whether messageMAC is a valid HMAC tag for message. + func ValidMAC(message, messageMAC, key []byte) bool { + mac := hmac.New(sha256.New, key) + mac.Write(message) + expectedMAC := mac.Sum(nil) + return hmac.Equal(messageMAC, expectedMAC) + } +*/ +package hmac + +import ( + "crypto/subtle" + "hash" +) + +// FIPS 198-1: +// https://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf + +// key is zero padded to the block size of the hash function +// ipad = 0x36 byte repeated for key length +// opad = 0x5c byte repeated for key length +// hmac = H([key ^ opad] H([key ^ ipad] text)) + +// Marshalable is the combination of encoding.BinaryMarshaler and +// encoding.BinaryUnmarshaler. Their method definitions are repeated here to +// avoid a dependency on the encoding package. +type marshalable interface { + MarshalBinary() ([]byte, error) + UnmarshalBinary([]byte) error +} + +type hmac struct { + opad, ipad []byte + outer, inner hash.Hash + + // If marshaled is true, then opad and ipad do not contain a padded + // copy of the key, but rather the marshaled state of outer/inner after + // opad/ipad has been fed into it. + marshaled bool +} + +func (h *hmac) Sum(in []byte) []byte { + origLen := len(in) + in = h.inner.Sum(in) + + if h.marshaled { + if err := h.outer.(marshalable).UnmarshalBinary(h.opad); err != nil { //nolint:forcetypeassert + panic(err) //nolint + } + } else { + h.outer.Reset() + h.outer.Write(h.opad) //nolint:errcheck,gosec + } + h.outer.Write(in[origLen:]) //nolint:errcheck,gosec + return h.outer.Sum(in[:origLen]) +} + +func (h *hmac) Write(p []byte) (n int, err error) { + return h.inner.Write(p) +} + +func (h *hmac) Size() int { return h.outer.Size() } +func (h *hmac) BlockSize() int { return h.inner.BlockSize() } + +func (h *hmac) Reset() { + if h.marshaled { + if err := h.inner.(marshalable).UnmarshalBinary(h.ipad); err != nil { //nolint:forcetypeassert + panic(err) //nolint + } + return + } + + h.inner.Reset() + h.inner.Write(h.ipad) //nolint:errcheck,gosec + + // If the underlying hash is marshalable, we can save some time by + // saving a copy of the hash state now, and restoring it on future + // calls to Reset and Sum instead of writing ipad/opad every time. + // + // If either hash is unmarshalable for whatever reason, + // it's safe to bail out here. + marshalableInner, innerOK := h.inner.(marshalable) + if !innerOK { + return + } + marshalableOuter, outerOK := h.outer.(marshalable) + if !outerOK { + return + } + + imarshal, err := marshalableInner.MarshalBinary() + if err != nil { + return + } + + h.outer.Reset() + h.outer.Write(h.opad) //nolint:errcheck,gosec + omarshal, err := marshalableOuter.MarshalBinary() + if err != nil { + return + } + + // Marshaling succeeded; save the marshaled state for later + h.ipad = imarshal + h.opad = omarshal + h.marshaled = true +} + +// New returns a new HMAC hash using the given hash.Hash type and key. +// Note that unlike other hash implementations in the standard library, +// the returned Hash does not implement encoding.BinaryMarshaler +// or encoding.BinaryUnmarshaler. +func New(h func() hash.Hash, key []byte) hash.Hash { + hm := new(hmac) + hm.outer = h() + hm.inner = h() + blocksize := hm.inner.BlockSize() + hm.ipad = make([]byte, blocksize) + hm.opad = make([]byte, blocksize) + if len(key) > blocksize { + // If key is too big, hash it. + hm.outer.Write(key) //nolint:errcheck,gosec + key = hm.outer.Sum(nil) + } + copy(hm.ipad, key) + copy(hm.opad, key) + for i := range hm.ipad { + hm.ipad[i] ^= 0x36 + } + for i := range hm.opad { + hm.opad[i] ^= 0x5c + } + hm.inner.Write(hm.ipad) //nolint:errcheck,gosec + + return hm +} + +// Equal compares two MACs for equality without leaking timing information. +func Equal(mac1, mac2 []byte) bool { + // We don't have to be constant time if the lengths of the MACs are + // different as that suggests that a completely different hash function + // was used. + return subtle.ConstantTimeCompare(mac1, mac2) == 1 +} diff --git a/vendor/github.com/pion/stun/internal/hmac/pool.go b/vendor/github.com/pion/stun/internal/hmac/pool.go new file mode 100644 index 000000000..d2ac14afa --- /dev/null +++ b/vendor/github.com/pion/stun/internal/hmac/pool.go @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package hmac + +import ( //nolint:gci + "crypto/sha1" //nolint:gosec + "crypto/sha256" + "hash" + "sync" +) + +func (h *hmac) resetTo(key []byte) { + h.outer.Reset() + h.inner.Reset() + blocksize := h.inner.BlockSize() + + // Reset size and zero of ipad and opad. + h.ipad = append(h.ipad[:0], make([]byte, blocksize)...) + h.opad = append(h.opad[:0], make([]byte, blocksize)...) + + if len(key) > blocksize { + // If key is too big, hash it. + h.outer.Write(key) //nolint:errcheck,gosec + key = h.outer.Sum(nil) + } + copy(h.ipad, key) + copy(h.opad, key) + for i := range h.ipad { + h.ipad[i] ^= 0x36 + } + for i := range h.opad { + h.opad[i] ^= 0x5c + } + h.inner.Write(h.ipad) //nolint:errcheck,gosec + + h.marshaled = false +} + +var hmacSHA1Pool = &sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + h := New(sha1.New, make([]byte, sha1.BlockSize)) + return h + }, +} + +// AcquireSHA1 returns new HMAC from pool. +func AcquireSHA1(key []byte) hash.Hash { + h := hmacSHA1Pool.Get().(*hmac) //nolint:forcetypeassert + assertHMACSize(h, sha1.Size, sha1.BlockSize) + h.resetTo(key) + return h +} + +// PutSHA1 puts h to pool. +func PutSHA1(h hash.Hash) { + hm := h.(*hmac) //nolint:forcetypeassert + assertHMACSize(hm, sha1.Size, sha1.BlockSize) + hmacSHA1Pool.Put(hm) +} + +var hmacSHA256Pool = &sync.Pool{ //nolint:gochecknoglobals + New: func() interface{} { + h := New(sha256.New, make([]byte, sha256.BlockSize)) + return h + }, +} + +// AcquireSHA256 returns new HMAC from SHA256 pool. +func AcquireSHA256(key []byte) hash.Hash { + h := hmacSHA256Pool.Get().(*hmac) //nolint:forcetypeassert + assertHMACSize(h, sha256.Size, sha256.BlockSize) + h.resetTo(key) + return h +} + +// PutSHA256 puts h to SHA256 pool. +func PutSHA256(h hash.Hash) { + hm := h.(*hmac) //nolint:forcetypeassert + assertHMACSize(hm, sha256.Size, sha256.BlockSize) + hmacSHA256Pool.Put(hm) +} + +// assertHMACSize panics if h.size != size or h.blocksize != blocksize. +// +// Put and Acquire functions are internal functions to project, so +// checking it via such assert is optimal. +func assertHMACSize(h *hmac, size, blocksize int) { //nolint:unparam + if h.Size() != size || h.BlockSize() != blocksize { + panic("BUG: hmac size invalid") //nolint + } +} diff --git a/vendor/github.com/pion/stun/internal/hmac/vendor.sh b/vendor/github.com/pion/stun/internal/hmac/vendor.sh new file mode 100644 index 000000000..190d2b9b7 --- /dev/null +++ b/vendor/github.com/pion/stun/internal/hmac/vendor.sh @@ -0,0 +1,7 @@ +#!/bin/env bash + +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +cp -v $GOROOT/src/crypto/hmac/{hmac,hmac_test}.go . +git diff {hmac,hmac_test}.go diff --git a/vendor/github.com/pion/stun/message.go b/vendor/github.com/pion/stun/message.go new file mode 100644 index 000000000..6a828d68b --- /dev/null +++ b/vendor/github.com/pion/stun/message.go @@ -0,0 +1,622 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "crypto/rand" + "encoding/base64" + "errors" + "fmt" + "io" +) + +const ( + // magicCookie is fixed value that aids in distinguishing STUN packets + // from packets of other protocols when STUN is multiplexed with those + // other protocols on the same Port. + // + // The magic cookie field MUST contain the fixed value 0x2112A442 in + // network byte order. + // + // Defined in "STUN Message Structure", section 6. + magicCookie = 0x2112A442 + attributeHeaderSize = 4 + messageHeaderSize = 20 + + // TransactionIDSize is length of transaction id array (in bytes). + TransactionIDSize = 12 // 96 bit +) + +// NewTransactionID returns new random transaction ID using crypto/rand +// as source. +func NewTransactionID() (b [TransactionIDSize]byte) { + readFullOrPanic(rand.Reader, b[:]) + return b +} + +// IsMessage returns true if b looks like STUN message. +// Useful for multiplexing. IsMessage does not guarantee +// that decoding will be successful. +func IsMessage(b []byte) bool { + return len(b) >= messageHeaderSize && bin.Uint32(b[4:8]) == magicCookie +} + +// New returns *Message with pre-allocated Raw. +func New() *Message { + const defaultRawCapacity = 120 + return &Message{ + Raw: make([]byte, messageHeaderSize, defaultRawCapacity), + } +} + +// ErrDecodeToNil occurs on Decode(data, nil) call. +var ErrDecodeToNil = errors.New("attempt to decode to nil message") + +// Decode decodes Message from data to m, returning error if any. +func Decode(data []byte, m *Message) error { + if m == nil { + return ErrDecodeToNil + } + m.Raw = append(m.Raw[:0], data...) + return m.Decode() +} + +// Message represents a single STUN packet. It uses aggressive internal +// buffering to enable zero-allocation encoding and decoding, +// so there are some usage constraints: +// +// Message, its fields, results of m.Get or any attribute a.GetFrom +// are valid only until Message.Raw is not modified. +type Message struct { + Type MessageType + Length uint32 // len(Raw) not including header + TransactionID [TransactionIDSize]byte + Attributes Attributes + Raw []byte +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (m Message) MarshalBinary() (data []byte, err error) { + // We can't return m.Raw, allocation is expected by implicit interface + // contract induced by other implementations. + b := make([]byte, len(m.Raw)) + copy(b, m.Raw) + return b, nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +func (m *Message) UnmarshalBinary(data []byte) error { + // We can't retain data, copy is expected by interface contract. + m.Raw = append(m.Raw[:0], data...) + return m.Decode() +} + +// GobEncode implements the gob.GobEncoder interface. +func (m Message) GobEncode() ([]byte, error) { + return m.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface. +func (m *Message) GobDecode(data []byte) error { + return m.UnmarshalBinary(data) +} + +// AddTo sets b.TransactionID to m.TransactionID. +// +// Implements Setter to aid in crafting responses. +func (m *Message) AddTo(b *Message) error { + b.TransactionID = m.TransactionID + b.WriteTransactionID() + return nil +} + +// NewTransactionID sets m.TransactionID to random value from crypto/rand +// and returns error if any. +func (m *Message) NewTransactionID() error { + _, err := io.ReadFull(rand.Reader, m.TransactionID[:]) + if err == nil { + m.WriteTransactionID() + } + return err +} + +func (m *Message) String() string { + tID := base64.StdEncoding.EncodeToString(m.TransactionID[:]) + aInfo := "" + for k, a := range m.Attributes { + aInfo += fmt.Sprintf("attr%d=%s ", k, a.Type) + } + return fmt.Sprintf("%s l=%d attrs=%d id=%s, %s", m.Type, m.Length, len(m.Attributes), tID, aInfo) +} + +// Reset resets Message, attributes and underlying buffer length. +func (m *Message) Reset() { + m.Raw = m.Raw[:0] + m.Length = 0 + m.Attributes = m.Attributes[:0] +} + +// grow ensures that internal buffer has n length. +func (m *Message) grow(n int) { + if len(m.Raw) >= n { + return + } + if cap(m.Raw) >= n { + m.Raw = m.Raw[:n] + return + } + m.Raw = append(m.Raw, make([]byte, n-len(m.Raw))...) +} + +// Add appends new attribute to message. Not goroutine-safe. +// +// Value of attribute is copied to internal buffer so +// it is safe to reuse v. +func (m *Message) Add(t AttrType, v []byte) { + // Allocating buffer for TLV (type-length-value). + // T = t, L = len(v), V = v. + // m.Raw will look like: + // [0:20] <- message header + // [20:20+m.Length] <- existing message attributes + // [20+m.Length:20+m.Length+len(v) + 4] <- allocated buffer for new TLV + // [first:last] <- same as previous + // [0 1|2 3|4 4 + len(v)] <- mapping for allocated buffer + // T L V + allocSize := attributeHeaderSize + len(v) // ~ len(TLV) = len(TL) + len(V) + first := messageHeaderSize + int(m.Length) // first byte number + last := first + allocSize // last byte number + m.grow(last) // growing cap(Raw) to fit TLV + m.Raw = m.Raw[:last] // now len(Raw) = last + m.Length += uint32(allocSize) // rendering length change + + // Sub-slicing internal buffer to simplify encoding. + buf := m.Raw[first:last] // slice for TLV + value := buf[attributeHeaderSize:] // slice for V + attr := RawAttribute{ + Type: t, // T + Length: uint16(len(v)), // L + Value: value, // V + } + + // Encoding attribute TLV to allocated buffer. + bin.PutUint16(buf[0:2], attr.Type.Value()) // T + bin.PutUint16(buf[2:4], attr.Length) // L + copy(value, v) // V + + // Checking that attribute value needs padding. + if attr.Length%padding != 0 { + // Performing padding. + bytesToAdd := nearestPaddedValueLength(len(v)) - len(v) + last += bytesToAdd + m.grow(last) + // setting all padding bytes to zero + // to prevent data leak from previous + // data in next bytesToAdd bytes + buf = m.Raw[last-bytesToAdd : last] + for i := range buf { + buf[i] = 0 + } + m.Raw = m.Raw[:last] // increasing buffer length + m.Length += uint32(bytesToAdd) // rendering length change + } + m.Attributes = append(m.Attributes, attr) + m.WriteLength() +} + +func attrSliceEqual(a, b Attributes) bool { + for _, attr := range a { + found := false + for _, attrB := range b { + if attrB.Type != attr.Type { + continue + } + if attrB.Equal(attr) { + found = true + break + } + } + if !found { + return false + } + } + return true +} + +func attrEqual(a, b Attributes) bool { + if a == nil && b == nil { + return true + } + if a == nil || b == nil { + return false + } + if len(a) != len(b) { + return false + } + if !attrSliceEqual(a, b) { + return false + } + if !attrSliceEqual(b, a) { + return false + } + return true +} + +// Equal returns true if Message b equals to m. +// Ignores m.Raw. +func (m *Message) Equal(b *Message) bool { + if m == nil && b == nil { + return true + } + if m == nil || b == nil { + return false + } + if m.Type != b.Type { + return false + } + if m.TransactionID != b.TransactionID { + return false + } + if m.Length != b.Length { + return false + } + if !attrEqual(m.Attributes, b.Attributes) { + return false + } + return true +} + +// WriteLength writes m.Length to m.Raw. +func (m *Message) WriteLength() { + m.grow(4) + bin.PutUint16(m.Raw[2:4], uint16(m.Length)) +} + +// WriteHeader writes header to underlying buffer. Not goroutine-safe. +func (m *Message) WriteHeader() { + m.grow(messageHeaderSize) + _ = m.Raw[:messageHeaderSize] // early bounds check to guarantee safety of writes below + + m.WriteType() + m.WriteLength() + bin.PutUint32(m.Raw[4:8], magicCookie) // magic cookie + copy(m.Raw[8:messageHeaderSize], m.TransactionID[:]) // transaction ID +} + +// WriteTransactionID writes m.TransactionID to m.Raw. +func (m *Message) WriteTransactionID() { + copy(m.Raw[8:messageHeaderSize], m.TransactionID[:]) // transaction ID +} + +// WriteAttributes encodes all m.Attributes to m. +func (m *Message) WriteAttributes() { + attributes := m.Attributes + m.Attributes = attributes[:0] + for _, a := range attributes { + m.Add(a.Type, a.Value) + } + m.Attributes = attributes +} + +// WriteType writes m.Type to m.Raw. +func (m *Message) WriteType() { + m.grow(2) + bin.PutUint16(m.Raw[0:2], m.Type.Value()) // message type +} + +// SetType sets m.Type and writes it to m.Raw. +func (m *Message) SetType(t MessageType) { + m.Type = t + m.WriteType() +} + +// Encode re-encodes message into m.Raw. +func (m *Message) Encode() { + m.Raw = m.Raw[:0] + m.WriteHeader() + m.Length = 0 + m.WriteAttributes() +} + +// WriteTo implements WriterTo via calling Write(m.Raw) on w and returning +// call result. +func (m *Message) WriteTo(w io.Writer) (int64, error) { + n, err := w.Write(m.Raw) + return int64(n), err +} + +// ReadFrom implements ReaderFrom. Reads message from r into m.Raw, +// Decodes it and return error if any. If m.Raw is too small, will return +// ErrUnexpectedEOF, ErrUnexpectedHeaderEOF or *DecodeErr. +// +// Can return *DecodeErr while decoding too. +func (m *Message) ReadFrom(r io.Reader) (int64, error) { + tBuf := m.Raw[:cap(m.Raw)] + var ( + n int + err error + ) + if n, err = r.Read(tBuf); err != nil { + return int64(n), err + } + m.Raw = tBuf[:n] + return int64(n), m.Decode() +} + +// ErrUnexpectedHeaderEOF means that there were not enough bytes in +// m.Raw to read header. +var ErrUnexpectedHeaderEOF = errors.New("unexpected EOF: not enough bytes to read header") + +// Decode decodes m.Raw into m. +func (m *Message) Decode() error { + // decoding message header + buf := m.Raw + if len(buf) < messageHeaderSize { + return ErrUnexpectedHeaderEOF + } + var ( + t = bin.Uint16(buf[0:2]) // first 2 bytes + size = int(bin.Uint16(buf[2:4])) // second 2 bytes + cookie = bin.Uint32(buf[4:8]) // last 4 bytes + fullSize = messageHeaderSize + size // len(m.Raw) + ) + if cookie != magicCookie { + msg := fmt.Sprintf("%x is invalid magic cookie (should be %x)", cookie, magicCookie) + return newDecodeErr("message", "cookie", msg) + } + if len(buf) < fullSize { + msg := fmt.Sprintf("buffer length %d is less than %d (expected message size)", len(buf), fullSize) + return newAttrDecodeErr("message", msg) + } + // saving header data + m.Type.ReadValue(t) + m.Length = uint32(size) + copy(m.TransactionID[:], buf[8:messageHeaderSize]) + + m.Attributes = m.Attributes[:0] + var ( + offset = 0 + b = buf[messageHeaderSize:fullSize] + ) + for offset < size { + // checking that we have enough bytes to read header + if len(b) < attributeHeaderSize { + msg := fmt.Sprintf("buffer length %d is less than %d (expected header size)", len(b), attributeHeaderSize) + return newAttrDecodeErr("header", msg) + } + var ( + a = RawAttribute{ + Type: compatAttrType(bin.Uint16(b[0:2])), // first 2 bytes + Length: bin.Uint16(b[2:4]), // second 2 bytes + } + aL = int(a.Length) // attribute length + aBuffL = nearestPaddedValueLength(aL) // expected buffer length (with padding) + ) + b = b[attributeHeaderSize:] // slicing again to simplify value read + offset += attributeHeaderSize + if len(b) < aBuffL { // checking size + msg := fmt.Sprintf("buffer length %d is less than %d (expected value size for %s)", len(b), aBuffL, a.Type) + return newAttrDecodeErr("value", msg) + } + a.Value = b[:aL] + offset += aBuffL + b = b[aBuffL:] + + m.Attributes = append(m.Attributes, a) + } + return nil +} + +// Write decodes message and return error if any. +// +// Any error is unrecoverable, but message could be partially decoded. +func (m *Message) Write(tBuf []byte) (int, error) { + m.Raw = append(m.Raw[:0], tBuf...) + return len(tBuf), m.Decode() +} + +// CloneTo clones m to b securing any further m mutations. +func (m *Message) CloneTo(b *Message) error { + b.Raw = append(b.Raw[:0], m.Raw...) + return b.Decode() +} + +// MessageClass is 8-bit representation of 2-bit class of STUN Message Class. +type MessageClass byte + +// Possible values for message class in STUN Message Type. +const ( + ClassRequest MessageClass = 0x00 // 0b00 + ClassIndication MessageClass = 0x01 // 0b01 + ClassSuccessResponse MessageClass = 0x02 // 0b10 + ClassErrorResponse MessageClass = 0x03 // 0b11 +) + +// Common STUN message types. +var ( + // Binding request message type. + BindingRequest = NewType(MethodBinding, ClassRequest) //nolint:gochecknoglobals + // Binding success response message type + BindingSuccess = NewType(MethodBinding, ClassSuccessResponse) //nolint:gochecknoglobals + // Binding error response message type. + BindingError = NewType(MethodBinding, ClassErrorResponse) //nolint:gochecknoglobals +) + +func (c MessageClass) String() string { + switch c { + case ClassRequest: + return "request" + case ClassIndication: + return "indication" + case ClassSuccessResponse: + return "success response" + case ClassErrorResponse: + return "error response" + default: + panic("unknown message class") //nolint + } +} + +// Method is uint16 representation of 12-bit STUN method. +type Method uint16 + +// Possible methods for STUN Message. +const ( + MethodBinding Method = 0x001 + MethodAllocate Method = 0x003 + MethodRefresh Method = 0x004 + MethodSend Method = 0x006 + MethodData Method = 0x007 + MethodCreatePermission Method = 0x008 + MethodChannelBind Method = 0x009 +) + +// Methods from RFC 6062. +const ( + MethodConnect Method = 0x000a + MethodConnectionBind Method = 0x000b + MethodConnectionAttempt Method = 0x000c +) + +func methodName() map[Method]string { + return map[Method]string{ + MethodBinding: "Binding", + MethodAllocate: "Allocate", + MethodRefresh: "Refresh", + MethodSend: "Send", + MethodData: "Data", + MethodCreatePermission: "CreatePermission", + MethodChannelBind: "ChannelBind", + + // RFC 6062. + MethodConnect: "Connect", + MethodConnectionBind: "ConnectionBind", + MethodConnectionAttempt: "ConnectionAttempt", + } +} + +func (m Method) String() string { + s, ok := methodName()[m] + if !ok { + // Falling back to hex representation. + s = fmt.Sprintf("0x%x", uint16(m)) + } + return s +} + +// MessageType is STUN Message Type Field. +type MessageType struct { + Method Method // e.g. binding + Class MessageClass // e.g. request +} + +// AddTo sets m type to t. +func (t MessageType) AddTo(m *Message) error { + m.SetType(t) + return nil +} + +// NewType returns new message type with provided method and class. +func NewType(method Method, class MessageClass) MessageType { + return MessageType{ + Method: method, + Class: class, + } +} + +const ( + methodABits = 0xf // 0b0000000000001111 + methodBBits = 0x70 // 0b0000000001110000 + methodDBits = 0xf80 // 0b0000111110000000 + + methodBShift = 1 + methodDShift = 2 + + firstBit = 0x1 + secondBit = 0x2 + + c0Bit = firstBit + c1Bit = secondBit + + classC0Shift = 4 + classC1Shift = 7 +) + +// Value returns bit representation of messageType. +func (t MessageType) Value() uint16 { + // 0 1 + // 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + // +--+--+-+-+-+-+-+-+-+-+-+-+-+-+ + // |M |M |M|M|M|C|M|M|M|C|M|M|M|M| + // |11|10|9|8|7|1|6|5|4|0|3|2|1|0| + // +--+--+-+-+-+-+-+-+-+-+-+-+-+-+ + // Figure 3: Format of STUN Message Type Field + + // Warning: Abandon all hope ye who enter here. + // Splitting M into A(M0-M3), B(M4-M6), D(M7-M11). + m := uint16(t.Method) + a := m & methodABits // A = M * 0b0000000000001111 (right 4 bits) + b := m & methodBBits // B = M * 0b0000000001110000 (3 bits after A) + d := m & methodDBits // D = M * 0b0000111110000000 (5 bits after B) + + // Shifting to add "holes" for C0 (at 4 bit) and C1 (8 bit). + m = a + (b << methodBShift) + (d << methodDShift) + + // C0 is zero bit of C, C1 is first bit. + // C0 = C * 0b01, C1 = (C * 0b10) >> 1 + // Ct = C0 << 4 + C1 << 8. + // Optimizations: "((C * 0b10) >> 1) << 8" as "(C * 0b10) << 7" + // We need C0 shifted by 4, and C1 by 8 to fit "11" and "7" positions + // (see figure 3). + c := uint16(t.Class) + c0 := (c & c0Bit) << classC0Shift + c1 := (c & c1Bit) << classC1Shift + class := c0 + c1 + + return m + class +} + +// ReadValue decodes uint16 into MessageType. +func (t *MessageType) ReadValue(v uint16) { + // Decoding class. + // We are taking first bit from v >> 4 and second from v >> 7. + c0 := (v >> classC0Shift) & c0Bit + c1 := (v >> classC1Shift) & c1Bit + class := c0 + c1 + t.Class = MessageClass(class) + + // Decoding method. + a := v & methodABits // A(M0-M3) + b := (v >> methodBShift) & methodBBits // B(M4-M6) + d := (v >> methodDShift) & methodDBits // D(M7-M11) + m := a + b + d + t.Method = Method(m) +} + +func (t MessageType) String() string { + return fmt.Sprintf("%s %s", t.Method, t.Class) +} + +// Contains return true if message contain t attribute. +func (m *Message) Contains(t AttrType) bool { + for _, a := range m.Attributes { + if a.Type == t { + return true + } + } + return false +} + +type transactionIDValueSetter [TransactionIDSize]byte + +// NewTransactionIDSetter returns new Setter that sets message transaction id +// to provided value. +func NewTransactionIDSetter(value [TransactionIDSize]byte) Setter { + return transactionIDValueSetter(value) +} + +func (t transactionIDValueSetter) AddTo(m *Message) error { + m.TransactionID = t + m.WriteTransactionID() + return nil +} diff --git a/vendor/github.com/pion/stun/renovate.json b/vendor/github.com/pion/stun/renovate.json new file mode 100644 index 000000000..f1bb98c6a --- /dev/null +++ b/vendor/github.com/pion/stun/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>pion/renovate-config" + ] +} diff --git a/vendor/github.com/pion/stun/stun.go b/vendor/github.com/pion/stun/stun.go new file mode 100644 index 000000000..3a7954fd0 --- /dev/null +++ b/vendor/github.com/pion/stun/stun.go @@ -0,0 +1,54 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package stun implements Session Traversal Utilities for NAT (STUN) RFC 5389. +// +// The stun package is intended to use by package that implements extension +// to STUN (e.g. TURN) or client/server applications. +// +// Most methods are designed to be zero allocations. If it is not enough, +// low-level methods are available. On other hand, there are helpers that +// reduce code repeat. +// +// See examples for Message for basic usage, or https://github.com/pion/turn +// package for example of stun extension implementation. +package stun + +import ( + "encoding/binary" + "io" +) + +// bin is shorthand to binary.BigEndian. +var bin = binary.BigEndian //nolint:gochecknoglobals + +func readFullOrPanic(r io.Reader, v []byte) int { + n, err := io.ReadFull(r, v) + if err != nil { + panic(err) //nolint + } + return n +} + +func writeOrPanic(w io.Writer, v []byte) int { + n, err := w.Write(v) + if err != nil { + panic(err) //nolint + } + return n +} + +// IANA assigned ports for "stun" protocol. +const ( + DefaultPort = 3478 + DefaultTLSPort = 5349 +) + +type transactionIDSetter struct{} + +func (transactionIDSetter) AddTo(m *Message) error { + return m.NewTransactionID() +} + +// TransactionID is Setter for m.TransactionID. +var TransactionID Setter = transactionIDSetter{} //nolint:gochecknoglobals diff --git a/vendor/github.com/pion/stun/textattrs.go b/vendor/github.com/pion/stun/textattrs.go new file mode 100644 index 000000000..a98915a6b --- /dev/null +++ b/vendor/github.com/pion/stun/textattrs.go @@ -0,0 +1,132 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +// NewUsername returns Username with provided value. +func NewUsername(username string) Username { + return Username(username) +} + +// Username represents USERNAME attribute. +// +// RFC 5389 Section 15.3 +type Username []byte + +func (u Username) String() string { + return string(u) +} + +const maxUsernameB = 513 + +// AddTo adds USERNAME attribute to message. +func (u Username) AddTo(m *Message) error { + return TextAttribute(u).AddToAs(m, AttrUsername, maxUsernameB) +} + +// GetFrom gets USERNAME from message. +func (u *Username) GetFrom(m *Message) error { + return (*TextAttribute)(u).GetFromAs(m, AttrUsername) +} + +// NewRealm returns Realm with provided value. +// Must be SASL-prepared. +func NewRealm(realm string) Realm { + return Realm(realm) +} + +// Realm represents REALM attribute. +// +// RFC 5389 Section 15.7 +type Realm []byte + +func (n Realm) String() string { + return string(n) +} + +const maxRealmB = 763 + +// AddTo adds NONCE to message. +func (n Realm) AddTo(m *Message) error { + return TextAttribute(n).AddToAs(m, AttrRealm, maxRealmB) +} + +// GetFrom gets REALM from message. +func (n *Realm) GetFrom(m *Message) error { + return (*TextAttribute)(n).GetFromAs(m, AttrRealm) +} + +const softwareRawMaxB = 763 + +// Software is SOFTWARE attribute. +// +// RFC 5389 Section 15.10 +type Software []byte + +func (s Software) String() string { + return string(s) +} + +// NewSoftware returns *Software from string. +func NewSoftware(software string) Software { + return Software(software) +} + +// AddTo adds Software attribute to m. +func (s Software) AddTo(m *Message) error { + return TextAttribute(s).AddToAs(m, AttrSoftware, softwareRawMaxB) +} + +// GetFrom decodes Software from m. +func (s *Software) GetFrom(m *Message) error { + return (*TextAttribute)(s).GetFromAs(m, AttrSoftware) +} + +// Nonce represents NONCE attribute. +// +// RFC 5389 Section 15.8 +type Nonce []byte + +// NewNonce returns new Nonce from string. +func NewNonce(nonce string) Nonce { + return Nonce(nonce) +} + +func (n Nonce) String() string { + return string(n) +} + +const maxNonceB = 763 + +// AddTo adds NONCE to message. +func (n Nonce) AddTo(m *Message) error { + return TextAttribute(n).AddToAs(m, AttrNonce, maxNonceB) +} + +// GetFrom gets NONCE from message. +func (n *Nonce) GetFrom(m *Message) error { + return (*TextAttribute)(n).GetFromAs(m, AttrNonce) +} + +// TextAttribute is helper for adding and getting text attributes. +type TextAttribute []byte + +// AddToAs adds attribute with type t to m, checking maximum length. If maxLen +// is less than 0, no check is performed. +func (v TextAttribute) AddToAs(m *Message, t AttrType, maxLen int) error { + if err := CheckOverflow(t, len(v), maxLen); err != nil { + return err + } + m.Add(t, v) + return nil +} + +// GetFromAs gets t attribute from m and appends its value to reseted v. +func (v *TextAttribute) GetFromAs(m *Message, t AttrType) error { + a, err := m.Get(t) + if err != nil { + return err + } + *v = a + return nil +} diff --git a/vendor/github.com/pion/stun/uattrs.go b/vendor/github.com/pion/stun/uattrs.go new file mode 100644 index 000000000..8b85d8a7a --- /dev/null +++ b/vendor/github.com/pion/stun/uattrs.go @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import "errors" + +// UnknownAttributes represents UNKNOWN-ATTRIBUTES attribute. +// +// RFC 5389 Section 15.9 +type UnknownAttributes []AttrType + +func (a UnknownAttributes) String() string { + s := "" + if len(a) == 0 { + return "" + } + last := len(a) - 1 + for i, t := range a { + s += t.String() + if i != last { + s += ", " + } + } + return s +} + +// type size is 16 bit. +const attrTypeSize = 4 + +// AddTo adds UNKNOWN-ATTRIBUTES attribute to message. +func (a UnknownAttributes) AddTo(m *Message) error { + v := make([]byte, 0, attrTypeSize*20) // 20 should be enough + // If len(a.Types) > 20, there will be allocations. + for i, t := range a { + v = append(v, 0, 0, 0, 0) // 4 times by 0 (16 bits) + first := attrTypeSize * i + last := first + attrTypeSize + bin.PutUint16(v[first:last], t.Value()) + } + m.Add(AttrUnknownAttributes, v) + return nil +} + +// ErrBadUnknownAttrsSize means that UNKNOWN-ATTRIBUTES attribute value +// has invalid length. +var ErrBadUnknownAttrsSize = errors.New("bad UNKNOWN-ATTRIBUTES size") + +// GetFrom parses UNKNOWN-ATTRIBUTES from message. +func (a *UnknownAttributes) GetFrom(m *Message) error { + v, err := m.Get(AttrUnknownAttributes) + if err != nil { + return err + } + if len(v)%attrTypeSize != 0 { + return ErrBadUnknownAttrsSize + } + *a = (*a)[:0] + first := 0 + for first < len(v) { + last := first + attrTypeSize + *a = append(*a, AttrType(bin.Uint16(v[first:last]))) + first = last + } + return nil +} diff --git a/vendor/github.com/pion/stun/uri.go b/vendor/github.com/pion/stun/uri.go new file mode 100644 index 000000000..b9dab691f --- /dev/null +++ b/vendor/github.com/pion/stun/uri.go @@ -0,0 +1,257 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "net" + "net/url" + "strconv" +) + +var ( + // ErrUnknownType indicates an error with Unknown info. + ErrUnknownType = errors.New("Unknown") + + // ErrSchemeType indicates the scheme type could not be parsed. + ErrSchemeType = errors.New("unknown scheme type") + + // ErrSTUNQuery indicates query arguments are provided in a STUN URL. + ErrSTUNQuery = errors.New("queries not supported in stun address") + + // ErrInvalidQuery indicates an malformed query is provided. + ErrInvalidQuery = errors.New("invalid query") + + // ErrHost indicates malformed hostname is provided. + ErrHost = errors.New("invalid hostname") + + // ErrPort indicates malformed port is provided. + ErrPort = errors.New("invalid port") + + // ErrProtoType indicates an unsupported transport type was provided. + ErrProtoType = errors.New("invalid transport protocol type") +) + +// SchemeType indicates the type of server used in the ice.URL structure. +type SchemeType int + +const ( + // SchemeTypeUnknown indicates an unknown or unsupported scheme. + SchemeTypeUnknown SchemeType = iota + + // SchemeTypeSTUN indicates the URL represents a STUN server. + SchemeTypeSTUN + + // SchemeTypeSTUNS indicates the URL represents a STUNS (secure) server. + SchemeTypeSTUNS + + // SchemeTypeTURN indicates the URL represents a TURN server. + SchemeTypeTURN + + // SchemeTypeTURNS indicates the URL represents a TURNS (secure) server. + SchemeTypeTURNS +) + +// NewSchemeType defines a procedure for creating a new SchemeType from a raw +// string naming the scheme type. +func NewSchemeType(raw string) SchemeType { + switch raw { + case "stun": + return SchemeTypeSTUN + case "stuns": + return SchemeTypeSTUNS + case "turn": + return SchemeTypeTURN + case "turns": + return SchemeTypeTURNS + default: + return SchemeTypeUnknown + } +} + +func (t SchemeType) String() string { + switch t { + case SchemeTypeSTUN: + return "stun" + case SchemeTypeSTUNS: + return "stuns" + case SchemeTypeTURN: + return "turn" + case SchemeTypeTURNS: + return "turns" + default: + return ErrUnknownType.Error() + } +} + +// ProtoType indicates the transport protocol type that is used in the ice.URL +// structure. +type ProtoType int + +const ( + // ProtoTypeUnknown indicates an unknown or unsupported protocol. + ProtoTypeUnknown ProtoType = iota + + // ProtoTypeUDP indicates the URL uses a UDP transport. + ProtoTypeUDP + + // ProtoTypeTCP indicates the URL uses a TCP transport. + ProtoTypeTCP +) + +// NewProtoType defines a procedure for creating a new ProtoType from a raw +// string naming the transport protocol type. +func NewProtoType(raw string) ProtoType { + switch raw { + case "udp": + return ProtoTypeUDP + case "tcp": + return ProtoTypeTCP + default: + return ProtoTypeUnknown + } +} + +func (t ProtoType) String() string { + switch t { + case ProtoTypeUDP: + return "udp" + case ProtoTypeTCP: + return "tcp" + default: + return ErrUnknownType.Error() + } +} + +// URI represents a STUN (rfc7064) or TURN (rfc7065) URI +type URI struct { + Scheme SchemeType + Host string + Port int + Username string + Password string + Proto ProtoType +} + +// ParseURI parses a STUN or TURN urls following the ABNF syntax described in +// https://tools.ietf.org/html/rfc7064 and https://tools.ietf.org/html/rfc7065 +// respectively. +func ParseURI(raw string) (*URI, error) { //nolint:gocognit + rawParts, err := url.Parse(raw) + if err != nil { + return nil, err + } + + var u URI + u.Scheme = NewSchemeType(rawParts.Scheme) + if u.Scheme == SchemeTypeUnknown { + return nil, ErrSchemeType + } + + var rawPort string + if u.Host, rawPort, err = net.SplitHostPort(rawParts.Opaque); err != nil { + var e *net.AddrError + if errors.As(err, &e) { + if e.Err == "missing port in address" { + nextRawURL := u.Scheme.String() + ":" + rawParts.Opaque + switch { + case u.Scheme == SchemeTypeSTUN || u.Scheme == SchemeTypeTURN: + nextRawURL += ":3478" + if rawParts.RawQuery != "" { + nextRawURL += "?" + rawParts.RawQuery + } + return ParseURI(nextRawURL) + case u.Scheme == SchemeTypeSTUNS || u.Scheme == SchemeTypeTURNS: + nextRawURL += ":5349" + if rawParts.RawQuery != "" { + nextRawURL += "?" + rawParts.RawQuery + } + return ParseURI(nextRawURL) + } + } + } + return nil, err + } + + if u.Host == "" { + return nil, ErrHost + } + + if u.Port, err = strconv.Atoi(rawPort); err != nil { + return nil, ErrPort + } + + switch u.Scheme { + case SchemeTypeSTUN: + qArgs, err := url.ParseQuery(rawParts.RawQuery) + if err != nil || len(qArgs) > 0 { + return nil, ErrSTUNQuery + } + u.Proto = ProtoTypeUDP + case SchemeTypeSTUNS: + qArgs, err := url.ParseQuery(rawParts.RawQuery) + if err != nil || len(qArgs) > 0 { + return nil, ErrSTUNQuery + } + u.Proto = ProtoTypeTCP + case SchemeTypeTURN: + proto, err := parseProto(rawParts.RawQuery) + if err != nil { + return nil, err + } + + u.Proto = proto + if u.Proto == ProtoTypeUnknown { + u.Proto = ProtoTypeUDP + } + case SchemeTypeTURNS: + proto, err := parseProto(rawParts.RawQuery) + if err != nil { + return nil, err + } + + u.Proto = proto + if u.Proto == ProtoTypeUnknown { + u.Proto = ProtoTypeTCP + } + + case SchemeTypeUnknown: + } + + return &u, nil +} + +func parseProto(raw string) (ProtoType, error) { + qArgs, err := url.ParseQuery(raw) + if err != nil || len(qArgs) > 1 { + return ProtoTypeUnknown, ErrInvalidQuery + } + + var proto ProtoType + if rawProto := qArgs.Get("transport"); rawProto != "" { + if proto = NewProtoType(rawProto); proto == ProtoType(0) { + return ProtoTypeUnknown, ErrProtoType + } + return proto, nil + } + + if len(qArgs) > 0 { + return ProtoTypeUnknown, ErrInvalidQuery + } + + return proto, nil +} + +func (u URI) String() string { + rawURL := u.Scheme.String() + ":" + net.JoinHostPort(u.Host, strconv.Itoa(u.Port)) + if u.Scheme == SchemeTypeTURN || u.Scheme == SchemeTypeTURNS { + rawURL += "?transport=" + u.Proto.String() + } + return rawURL +} + +// IsSecure returns whether the this URL's scheme describes secure scheme or not. +func (u URI) IsSecure() bool { + return u.Scheme == SchemeTypeSTUNS || u.Scheme == SchemeTypeTURNS +} diff --git a/vendor/github.com/pion/stun/xoraddr.go b/vendor/github.com/pion/stun/xoraddr.go new file mode 100644 index 000000000..fc423be86 --- /dev/null +++ b/vendor/github.com/pion/stun/xoraddr.go @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package stun + +import ( + "errors" + "fmt" + "io" + "net" + "strconv" + + "github.com/pion/transport/v2/utils/xor" +) + +const ( + familyIPv4 uint16 = 0x01 + familyIPv6 uint16 = 0x02 +) + +// XORMappedAddress implements XOR-MAPPED-ADDRESS attribute. +// +// RFC 5389 Section 15.2 +type XORMappedAddress struct { + IP net.IP + Port int +} + +func (a XORMappedAddress) String() string { + return net.JoinHostPort(a.IP.String(), strconv.Itoa(a.Port)) +} + +// isIPv4 returns true if ip with len of net.IPv6Len seems to be ipv4. +func isIPv4(ip net.IP) bool { + // Optimized for performance. Copied from net.IP.To4. + return isZeros(ip[0:10]) && ip[10] == 0xff && ip[11] == 0xff +} + +// Is p all zeros? +func isZeros(p net.IP) bool { + for i := 0; i < len(p); i++ { + if p[i] != 0 { + return false + } + } + return true +} + +// ErrBadIPLength means that len(IP) is not net.{IPv6len,IPv4len}. +var ErrBadIPLength = errors.New("invalid length of IP value") + +// AddToAs adds XOR-MAPPED-ADDRESS value to m as t attribute. +func (a XORMappedAddress) AddToAs(m *Message, t AttrType) error { + var ( + family = familyIPv4 + ip = a.IP + ) + if len(a.IP) == net.IPv6len { + if isIPv4(ip) { + ip = ip[12:16] // like in ip.To4() + } else { + family = familyIPv6 + } + } else if len(ip) != net.IPv4len { + return ErrBadIPLength + } + value := make([]byte, 32+128) + value[0] = 0 // first 8 bits are zeroes + xorValue := make([]byte, net.IPv6len) + copy(xorValue[4:], m.TransactionID[:]) + bin.PutUint32(xorValue[0:4], magicCookie) + bin.PutUint16(value[0:2], family) + bin.PutUint16(value[2:4], uint16(a.Port^magicCookie>>16)) + xor.XorBytes(value[4:4+len(ip)], ip, xorValue) + m.Add(t, value[:4+len(ip)]) + return nil +} + +// AddTo adds XOR-MAPPED-ADDRESS to m. Can return ErrBadIPLength +// if len(a.IP) is invalid. +func (a XORMappedAddress) AddTo(m *Message) error { + return a.AddToAs(m, AttrXORMappedAddress) +} + +// GetFromAs decodes XOR-MAPPED-ADDRESS attribute value in message +// getting it as for t type. +func (a *XORMappedAddress) GetFromAs(m *Message, t AttrType) error { + v, err := m.Get(t) + if err != nil { + return err + } + family := bin.Uint16(v[0:2]) + if family != familyIPv6 && family != familyIPv4 { + return newDecodeErr("xor-mapped address", "family", + fmt.Sprintf("bad value %d", family), + ) + } + ipLen := net.IPv4len + if family == familyIPv6 { + ipLen = net.IPv6len + } + // Ensuring len(a.IP) == ipLen and reusing a.IP. + if len(a.IP) < ipLen { + a.IP = a.IP[:cap(a.IP)] + for len(a.IP) < ipLen { + a.IP = append(a.IP, 0) + } + } + a.IP = a.IP[:ipLen] + for i := range a.IP { + a.IP[i] = 0 + } + if len(v) <= 4 { + return io.ErrUnexpectedEOF + } + if err := CheckOverflow(t, len(v[4:]), len(a.IP)); err != nil { + return err + } + a.Port = int(bin.Uint16(v[2:4])) ^ (magicCookie >> 16) + xorValue := make([]byte, 4+TransactionIDSize) + bin.PutUint32(xorValue[0:4], magicCookie) + copy(xorValue[4:], m.TransactionID[:]) + xor.XorBytes(a.IP, v[4:], xorValue) + return nil +} + +// GetFrom decodes XOR-MAPPED-ADDRESS attribute in message and returns +// error if any. While decoding, a.IP is reused if possible and can be +// rendered to invalid state (e.g. if a.IP was set to IPv6 and then +// IPv4 value were decoded into it), be careful. +// +// Example: +// +// expectedIP := net.ParseIP("213.141.156.236") +// expectedIP.String() // 213.141.156.236, 16 bytes, first 12 of them are zeroes +// expectedPort := 21254 +// addr := &XORMappedAddress{ +// IP: expectedIP, +// Port: expectedPort, +// } +// // addr were added to message that is decoded as newMessage +// // ... +// +// addr.GetFrom(newMessage) +// addr.IP.String() // 213.141.156.236, net.IPv4Len +// expectedIP.String() // d58d:9cec::ffff:d58d:9cec, 16 bytes, first 4 are IPv4 +// // now we have len(expectedIP) = 16 and len(addr.IP) = 4. +func (a *XORMappedAddress) GetFrom(m *Message) error { + return a.GetFromAs(m, AttrXORMappedAddress) +} diff --git a/vendor/github.com/pion/transport/v2/.gitignore b/vendor/github.com/pion/transport/v2/.gitignore new file mode 100644 index 000000000..6e2f206a9 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/.gitignore @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +### JetBrains IDE ### +##################### +.idea/ + +### Emacs Temporary Files ### +############################# +*~ + +### Folders ### +############### +bin/ +vendor/ +node_modules/ + +### Files ### +############# +*.ivf +*.ogg +tags +cover.out +*.sw[poe] +*.wasm +examples/sfu-ws/cert.pem +examples/sfu-ws/key.pem +wasm_exec.js diff --git a/vendor/github.com/pion/transport/v2/.golangci.yml b/vendor/github.com/pion/transport/v2/.golangci.yml new file mode 100644 index 000000000..4e3eddf42 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/.golangci.yml @@ -0,0 +1,137 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +linters-settings: + govet: + check-shadowing: true + misspell: + locale: US + exhaustive: + default-signifies-exhaustive: true + gomodguard: + blocked: + modules: + - github.com/pkg/errors: + recommendations: + - errors + forbidigo: + forbid: + - ^fmt.Print(f|ln)?$ + - ^log.(Panic|Fatal|Print)(f|ln)?$ + - ^os.Exit$ + - ^panic$ + - ^print(ln)?$ + +linters: + enable: + - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences + - bodyclose # checks whether HTTP response body is closed successfully + - contextcheck # check the function whether use a non-inherited context + - decorder # check declaration order and count of types, constants, variables and functions + - depguard # Go linter that checks if package imports are in a list of acceptable packages + - dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted. + - errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - exhaustive # check exhaustiveness of enum switch statements + - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - forcetypeassert # finds forced type assertions + - gci # Gci control golang package import order and make it always deterministic. + - gochecknoglobals # Checks that no globals are present in Go code + - gochecknoinits # Checks that no init functions are present in Go code + - gocognit # Computes and checks the cognitive complexity of functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # The most opinionated Go source code linter + - godox # Tool for detection of FIXME, TODO and other comment keywords + - goerr113 # Golang linter to check the errors handling expressions + - gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + - gofumpt # Gofumpt checks whether code was gofumpt-ed. + - goheader # Checks is file header matches to pattern + - goimports # Goimports does everything that gofmt does. Additionally it checks unused imports + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. + - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. + - goprintffuncname # Checks that printf-like functions are named with `f` at the end + - gosec # Inspects source code for security problems + - gosimple # Linter for Go source code that specializes in simplifying a code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - grouper # An analyzer to analyze expression groups. + - importas # Enforces consistent import aliases + - ineffassign # Detects when assignments to existing variables are not used + - misspell # Finds commonly misspelled English words in comments + - nakedret # Finds naked returns in functions greater than a specified function length + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - predeclared # find code that shadows one of Go's predeclared identifiers + - revive # golint replacement, finds style mistakes + - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks + - stylecheck # Stylecheck is a replacement for golint + - tagliatelle # Checks the struct tags. + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - unconvert # Remove unnecessary type conversions + - unparam # Reports unused function parameters + - unused # Checks Go code for unused constants, variables, functions and types + - wastedassign # wastedassign finds wasted assignment statements + - whitespace # Tool for detection of leading and trailing whitespace + disable: + - containedctx # containedctx is a linter that detects struct contained context.Context field + - cyclop # checks function and package cyclomatic complexity + - exhaustivestruct # Checks if all struct's fields are initialized + - funlen # Tool for detection of long functions + - gocyclo # Computes and checks the cyclomatic complexity of functions + - godot # Check if comments end in a period + - gomnd # An analyzer to detect magic numbers. + - ifshort # Checks that your code uses short syntax for if-statements whenever possible + - ireturn # Accept Interfaces, Return Concrete Types + - lll # Reports long lines + - maintidx # maintidx measures the maintainability index of each function. + - makezero # Finds slice declarations with non-zero initial length + - maligned # Tool to detect Go structs that would take less memory if their fields were sorted + - nestif # Reports deeply nested if statements + - nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity + - nolintlint # Reports ill-formed or insufficient nolint directives + - paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test + - prealloc # Finds slice declarations that could potentially be preallocated + - promlinter # Check Prometheus metrics naming via promlint + - rowserrcheck # checks whether Err of rows is checked successfully + - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. + - testpackage # linter that makes you use a separate _test package + - thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # checks that the length of a variable's name matches its scope + - wrapcheck # Checks that errors returned from external packages are wrapped + - wsl # Whitespace Linter - Forces you to use empty lines! + +issues: + exclude-use-default: false + exclude-rules: + # Allow complex tests, better to be self contained + - path: _test\.go + linters: + - gocognit + - forbidigo + + # Allow complex main function in examples + - path: examples + text: "of func `main` is high" + linters: + - gocognit + + # Allow forbidden identifiers in examples + - path: examples + linters: + - forbidigo + + # Allow forbidden identifiers in CLI commands + - path: cmd + linters: + - forbidigo + +run: + skip-dirs-use-default: false diff --git a/vendor/github.com/pion/transport/v2/.goreleaser.yml b/vendor/github.com/pion/transport/v2/.goreleaser.yml new file mode 100644 index 000000000..30093e9d6 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/.goreleaser.yml @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +builds: +- skip: true diff --git a/vendor/github.com/pion/transport/v2/AUTHORS.txt b/vendor/github.com/pion/transport/v2/AUTHORS.txt new file mode 100644 index 000000000..b595c41c5 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/AUTHORS.txt @@ -0,0 +1,29 @@ +# Thank you to everyone that made Pion possible. If you are interested in contributing +# we would love to have you https://github.com/pion/webrtc/wiki/Contributing +# +# This file is auto generated, using git to list all individuals contributors. +# see https://github.com/pion/.goassets/blob/master/scripts/generate-authors.sh for the scripting +Adrian Cable +Atsushi Watanabe +backkem +cnderrauber +Daniel Mangum +Hugo Arregui +Jeremiah Millay +Jozef Kralik +Juliusz Chroboczek +Luke Curley +Mathis Engelbart +OrlandoCo +Sean DuBois +Sean DuBois +Sean DuBois +Sean DuBois +Steffen Vogel +Winlin +Woodrow Douglass +Yutaka Takeda +ZHENK + +# List of contributors not appearing in Git history + diff --git a/vendor/github.com/pion/transport/v2/LICENSE b/vendor/github.com/pion/transport/v2/LICENSE new file mode 100644 index 000000000..491caf6b0 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2023 The Pion community + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/pion/transport/v2/README.md b/vendor/github.com/pion/transport/v2/README.md new file mode 100644 index 000000000..b604b104d --- /dev/null +++ b/vendor/github.com/pion/transport/v2/README.md @@ -0,0 +1,34 @@ +

+
+ Pion Transport +
+

+

Transport testing for Pion

+

+ Pion transport + Slack Widget +
+ GitHub Workflow Status + Go Reference + Coverage Status + Go Report Card + License: MIT +

+
+ +### Roadmap +The library is used as a part of our WebRTC implementation. Please refer to that [roadmap](https://github.com/pion/webrtc/issues/9) to track our major milestones. + +### Community +Pion has an active community on the [Slack](https://pion.ly/slack). + +Follow the [Pion Twitter](https://twitter.com/_pion) for project updates and important WebRTC news. + +We are always looking to support **your projects**. Please reach out if you have something to build! +If you need commercial support or don't want to use public methods you can contact us at [team@pion.ly](mailto:team@pion.ly) + +### Contributing +Check out the [contributing wiki](https://github.com/pion/webrtc/wiki/Contributing) to join the group of amazing people making this project possible: [AUTHORS.txt](./AUTHORS.txt) + +### License +MIT License - see [LICENSE](LICENSE) for full text diff --git a/vendor/github.com/pion/transport/v2/codecov.yml b/vendor/github.com/pion/transport/v2/codecov.yml new file mode 100644 index 000000000..263e4d45c --- /dev/null +++ b/vendor/github.com/pion/transport/v2/codecov.yml @@ -0,0 +1,22 @@ +# +# DO NOT EDIT THIS FILE +# +# It is automatically copied from https://github.com/pion/.goassets repository. +# +# SPDX-FileCopyrightText: 2023 The Pion community +# SPDX-License-Identifier: MIT + +coverage: + status: + project: + default: + # Allow decreasing 2% of total coverage to avoid noise. + threshold: 2% + patch: + default: + target: 70% + only_pulls: true + +ignore: + - "examples/*" + - "examples/**/*" diff --git a/vendor/github.com/pion/transport/v2/connctx/connctx.go b/vendor/github.com/pion/transport/v2/connctx/connctx.go new file mode 100644 index 000000000..4869b9c2e --- /dev/null +++ b/vendor/github.com/pion/transport/v2/connctx/connctx.go @@ -0,0 +1,177 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package connctx wraps net.Conn using context.Context. +// +// Deprecated: use netctx instead. +package connctx + +import ( + "context" + "errors" + "io" + "net" + "sync" + "sync/atomic" + "time" +) + +// ErrClosing is returned on Write to closed connection. +var ErrClosing = errors.New("use of closed network connection") + +// Reader is an interface for context controlled reader. +type Reader interface { + ReadContext(context.Context, []byte) (int, error) +} + +// Writer is an interface for context controlled writer. +type Writer interface { + WriteContext(context.Context, []byte) (int, error) +} + +// ReadWriter is a composite of ReadWriter. +type ReadWriter interface { + Reader + Writer +} + +// ConnCtx is a wrapper of net.Conn using context.Context. +type ConnCtx interface { + Reader + Writer + io.Closer + LocalAddr() net.Addr + RemoteAddr() net.Addr + Conn() net.Conn +} + +type connCtx struct { + nextConn net.Conn + closed chan struct{} + closeOnce sync.Once + readMu sync.Mutex + writeMu sync.Mutex +} + +var veryOld = time.Unix(0, 1) //nolint:gochecknoglobals + +// New creates a new ConnCtx wrapping given net.Conn. +func New(conn net.Conn) ConnCtx { + c := &connCtx{ + nextConn: conn, + closed: make(chan struct{}), + } + return c +} + +func (c *connCtx) ReadContext(ctx context.Context, b []byte) (int, error) { + c.readMu.Lock() + defer c.readMu.Unlock() + + select { + case <-c.closed: + return 0, io.EOF + default: + } + + done := make(chan struct{}) + var wg sync.WaitGroup + var errSetDeadline atomic.Value + wg.Add(1) + go func() { + defer wg.Done() + select { + case <-ctx.Done(): + // context canceled + if err := c.nextConn.SetReadDeadline(veryOld); err != nil { + errSetDeadline.Store(err) + return + } + <-done + if err := c.nextConn.SetReadDeadline(time.Time{}); err != nil { + errSetDeadline.Store(err) + } + case <-done: + } + }() + + n, err := c.nextConn.Read(b) + + close(done) + wg.Wait() + if e := ctx.Err(); e != nil && n == 0 { + err = e + } + if err2, ok := errSetDeadline.Load().(error); ok && err == nil && err2 != nil { + err = err2 + } + return n, err +} + +func (c *connCtx) WriteContext(ctx context.Context, b []byte) (int, error) { + c.writeMu.Lock() + defer c.writeMu.Unlock() + + select { + case <-c.closed: + return 0, ErrClosing + default: + } + + done := make(chan struct{}) + var wg sync.WaitGroup + var errSetDeadline atomic.Value + wg.Add(1) + go func() { + defer wg.Done() + select { + case <-ctx.Done(): + // context canceled + if err := c.nextConn.SetWriteDeadline(veryOld); err != nil { + errSetDeadline.Store(err) + return + } + <-done + if err := c.nextConn.SetWriteDeadline(time.Time{}); err != nil { + errSetDeadline.Store(err) + } + case <-done: + } + }() + + n, err := c.nextConn.Write(b) + + close(done) + wg.Wait() + if e := ctx.Err(); e != nil && n == 0 { + err = e + } + if err2, ok := errSetDeadline.Load().(error); ok && err == nil && err2 != nil { + err = err2 + } + return n, err +} + +func (c *connCtx) Close() error { + err := c.nextConn.Close() + c.closeOnce.Do(func() { + c.writeMu.Lock() + c.readMu.Lock() + close(c.closed) + c.readMu.Unlock() + c.writeMu.Unlock() + }) + return err +} + +func (c *connCtx) LocalAddr() net.Addr { + return c.nextConn.LocalAddr() +} + +func (c *connCtx) RemoteAddr() net.Addr { + return c.nextConn.RemoteAddr() +} + +func (c *connCtx) Conn() net.Conn { + return c.nextConn +} diff --git a/vendor/github.com/pion/transport/v2/connctx/pipe.go b/vendor/github.com/pion/transport/v2/connctx/pipe.go new file mode 100644 index 000000000..96b802e43 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/connctx/pipe.go @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package connctx + +import ( + "net" +) + +// Pipe creates piped pair of ConnCtx. +func Pipe() (ConnCtx, ConnCtx) { + ca, cb := net.Pipe() + return New(ca), New(cb) +} diff --git a/vendor/github.com/pion/transport/v2/deadline/deadline.go b/vendor/github.com/pion/transport/v2/deadline/deadline.go new file mode 100644 index 000000000..abd39f06d --- /dev/null +++ b/vendor/github.com/pion/transport/v2/deadline/deadline.go @@ -0,0 +1,117 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package deadline provides deadline timer used to implement +// net.Conn compatible connection +package deadline + +import ( + "context" + "sync" + "time" +) + +// Deadline signals updatable deadline timer. +// Also, it implements context.Context. +type Deadline struct { + exceeded chan struct{} + stop chan struct{} + stopped chan bool + deadline time.Time + mu sync.RWMutex +} + +// New creates new deadline timer. +func New() *Deadline { + d := &Deadline{ + exceeded: make(chan struct{}), + stop: make(chan struct{}), + stopped: make(chan bool, 1), + } + d.stopped <- true + return d +} + +// Set new deadline. Zero value means no deadline. +func (d *Deadline) Set(t time.Time) { + d.mu.Lock() + defer d.mu.Unlock() + + d.deadline = t + + close(d.stop) + + select { + case <-d.exceeded: + d.exceeded = make(chan struct{}) + default: + stopped := <-d.stopped + if !stopped { + d.exceeded = make(chan struct{}) + } + } + d.stop = make(chan struct{}) + d.stopped = make(chan bool, 1) + + if t.IsZero() { + d.stopped <- true + return + } + + if dur := time.Until(t); dur > 0 { + exceeded := d.exceeded + stopped := d.stopped + go func() { + timer := time.NewTimer(dur) + select { + case <-timer.C: + close(exceeded) + stopped <- false + case <-d.stop: + if !timer.Stop() { + <-timer.C + } + stopped <- true + } + }() + return + } + + close(d.exceeded) + d.stopped <- false +} + +// Done receives deadline signal. +func (d *Deadline) Done() <-chan struct{} { + d.mu.RLock() + defer d.mu.RUnlock() + return d.exceeded +} + +// Err returns context.DeadlineExceeded if the deadline is exceeded. +// Otherwise, it returns nil. +func (d *Deadline) Err() error { + d.mu.RLock() + defer d.mu.RUnlock() + select { + case <-d.exceeded: + return context.DeadlineExceeded + default: + return nil + } +} + +// Deadline returns current deadline. +func (d *Deadline) Deadline() (time.Time, bool) { + d.mu.RLock() + defer d.mu.RUnlock() + if d.deadline.IsZero() { + return d.deadline, false + } + return d.deadline, true +} + +// Value returns nil. +func (d *Deadline) Value(interface{}) interface{} { + return nil +} diff --git a/vendor/github.com/pion/transport/v2/net.go b/vendor/github.com/pion/transport/v2/net.go new file mode 100644 index 000000000..86d3468f7 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/net.go @@ -0,0 +1,418 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package transport implements various networking related +// functions used throughout the Pion modules. +package transport + +import ( + "errors" + "io" + "net" + "time" +) + +var ( + // ErrNoAddressAssigned ... + ErrNoAddressAssigned = errors.New("no address assigned") + // ErrNotSupported ... + ErrNotSupported = errors.New("not supported yey") + // ErrInterfaceNotFound ... + ErrInterfaceNotFound = errors.New("interface not found") + // ErrNotUDPAddress ... + ErrNotUDPAddress = errors.New("not a UDP address") +) + +// Net is an interface providing common networking functions which are +// similar to the functions provided by standard net package. +type Net interface { + // ListenPacket announces on the local network address. + // + // The network must be "udp", "udp4", "udp6", "unixgram", or an IP + // transport. The IP transports are "ip", "ip4", or "ip6" followed by + // a colon and a literal protocol number or a protocol name, as in + // "ip:1" or "ip:icmp". + // + // For UDP and IP networks, if the host in the address parameter is + // empty or a literal unspecified IP address, ListenPacket listens on + // all available IP addresses of the local system except multicast IP + // addresses. + // To only use IPv4, use network "udp4" or "ip4:proto". + // The address can use a host name, but this is not recommended, + // because it will create a listener for at most one of the host's IP + // addresses. + // If the port in the address parameter is empty or "0", as in + // "127.0.0.1:" or "[::1]:0", a port number is automatically chosen. + // The LocalAddr method of PacketConn can be used to discover the + // chosen port. + // + // See func Dial for a description of the network and address + // parameters. + // + // ListenPacket uses context.Background internally; to specify the context, use + // ListenConfig.ListenPacket. + ListenPacket(network string, address string) (net.PacketConn, error) + + // ListenUDP acts like ListenPacket for UDP networks. + // + // The network must be a UDP network name; see func Dial for details. + // + // If the IP field of laddr is nil or an unspecified IP address, + // ListenUDP listens on all available IP addresses of the local system + // except multicast IP addresses. + // If the Port field of laddr is 0, a port number is automatically + // chosen. + ListenUDP(network string, locAddr *net.UDPAddr) (UDPConn, error) + + // ListenTCP acts like Listen for TCP networks. + // + // The network must be a TCP network name; see func Dial for details. + // + // If the IP field of laddr is nil or an unspecified IP address, + // ListenTCP listens on all available unicast and anycast IP addresses + // of the local system. + // If the Port field of laddr is 0, a port number is automatically + // chosen. + ListenTCP(network string, laddr *net.TCPAddr) (TCPListener, error) + + // Dial connects to the address on the named network. + // + // Known networks are "tcp", "tcp4" (IPv4-only), "tcp6" (IPv6-only), + // "udp", "udp4" (IPv4-only), "udp6" (IPv6-only), "ip", "ip4" + // (IPv4-only), "ip6" (IPv6-only), "unix", "unixgram" and + // "unixpacket". + // + // For TCP and UDP networks, the address has the form "host:port". + // The host must be a literal IP address, or a host name that can be + // resolved to IP addresses. + // The port must be a literal port number or a service name. + // If the host is a literal IPv6 address it must be enclosed in square + // brackets, as in "[2001:db8::1]:80" or "[fe80::1%zone]:80". + // The zone specifies the scope of the literal IPv6 address as defined + // in RFC 4007. + // The functions JoinHostPort and SplitHostPort manipulate a pair of + // host and port in this form. + // When using TCP, and the host resolves to multiple IP addresses, + // Dial will try each IP address in order until one succeeds. + // + // Examples: + // + // Dial("tcp", "golang.org:http") + // Dial("tcp", "192.0.2.1:http") + // Dial("tcp", "198.51.100.1:80") + // Dial("udp", "[2001:db8::1]:domain") + // Dial("udp", "[fe80::1%lo0]:53") + // Dial("tcp", ":80") + // + // For IP networks, the network must be "ip", "ip4" or "ip6" followed + // by a colon and a literal protocol number or a protocol name, and + // the address has the form "host". The host must be a literal IP + // address or a literal IPv6 address with zone. + // It depends on each operating system how the operating system + // behaves with a non-well known protocol number such as "0" or "255". + // + // Examples: + // + // Dial("ip4:1", "192.0.2.1") + // Dial("ip6:ipv6-icmp", "2001:db8::1") + // Dial("ip6:58", "fe80::1%lo0") + // + // For TCP, UDP and IP networks, if the host is empty or a literal + // unspecified IP address, as in ":80", "0.0.0.0:80" or "[::]:80" for + // TCP and UDP, "", "0.0.0.0" or "::" for IP, the local system is + // assumed. + // + // For Unix networks, the address must be a file system path. + Dial(network, address string) (net.Conn, error) + + // DialUDP acts like Dial for UDP networks. + // + // The network must be a UDP network name; see func Dial for details. + // + // If laddr is nil, a local address is automatically chosen. + // If the IP field of raddr is nil or an unspecified IP address, the + // local system is assumed. + DialUDP(network string, laddr, raddr *net.UDPAddr) (UDPConn, error) + + // DialTCP acts like Dial for TCP networks. + // + // The network must be a TCP network name; see func Dial for details. + // + // If laddr is nil, a local address is automatically chosen. + // If the IP field of raddr is nil or an unspecified IP address, the + // local system is assumed. + DialTCP(network string, laddr, raddr *net.TCPAddr) (TCPConn, error) + + // ResolveIPAddr returns an address of IP end point. + // + // The network must be an IP network name. + // + // If the host in the address parameter is not a literal IP address, + // ResolveIPAddr resolves the address to an address of IP end point. + // Otherwise, it parses the address as a literal IP address. + // The address parameter can use a host name, but this is not + // recommended, because it will return at most one of the host name's + // IP addresses. + // + // See func Dial for a description of the network and address + // parameters. + ResolveIPAddr(network, address string) (*net.IPAddr, error) + + // ResolveUDPAddr returns an address of UDP end point. + // + // The network must be a UDP network name. + // + // If the host in the address parameter is not a literal IP address or + // the port is not a literal port number, ResolveUDPAddr resolves the + // address to an address of UDP end point. + // Otherwise, it parses the address as a pair of literal IP address + // and port number. + // The address parameter can use a host name, but this is not + // recommended, because it will return at most one of the host name's + // IP addresses. + // + // See func Dial for a description of the network and address + // parameters. + ResolveUDPAddr(network, address string) (*net.UDPAddr, error) + + // ResolveTCPAddr returns an address of TCP end point. + // + // The network must be a TCP network name. + // + // If the host in the address parameter is not a literal IP address or + // the port is not a literal port number, ResolveTCPAddr resolves the + // address to an address of TCP end point. + // Otherwise, it parses the address as a pair of literal IP address + // and port number. + // The address parameter can use a host name, but this is not + // recommended, because it will return at most one of the host name's + // IP addresses. + // + // See func Dial for a description of the network and address + // parameters. + ResolveTCPAddr(network, address string) (*net.TCPAddr, error) + + // Interfaces returns a list of the system's network interfaces. + Interfaces() ([]*Interface, error) + + // InterfaceByIndex returns the interface specified by index. + // + // On Solaris, it returns one of the logical network interfaces + // sharing the logical data link; for more precision use + // InterfaceByName. + InterfaceByIndex(index int) (*Interface, error) + + // InterfaceByName returns the interface specified by name. + InterfaceByName(name string) (*Interface, error) + + // The following functions are extensions to Go's standard net package + + CreateDialer(dialer *net.Dialer) Dialer +} + +// Dialer is identical to net.Dialer excepts that its methods +// (Dial, DialContext) are overridden to use the Net interface. +// Use vnet.CreateDialer() to create an instance of this Dialer. +type Dialer interface { + Dial(network, address string) (net.Conn, error) +} + +// UDPConn is packet-oriented connection for UDP. +type UDPConn interface { + // Close closes the connection. + // Any blocked Read or Write operations will be unblocked and return errors. + Close() error + + // LocalAddr returns the local network address, if known. + LocalAddr() net.Addr + + // RemoteAddr returns the remote network address, if known. + RemoteAddr() net.Addr + + // SetDeadline sets the read and write deadlines associated + // with the connection. It is equivalent to calling both + // SetReadDeadline and SetWriteDeadline. + // + // A deadline is an absolute time after which I/O operations + // fail instead of blocking. The deadline applies to all future + // and pending I/O, not just the immediately following call to + // Read or Write. After a deadline has been exceeded, the + // connection can be refreshed by setting a deadline in the future. + // + // If the deadline is exceeded a call to Read or Write or to other + // I/O methods will return an error that wraps os.ErrDeadlineExceeded. + // This can be tested using errors.Is(err, os.ErrDeadlineExceeded). + // The error's Timeout method will return true, but note that there + // are other possible errors for which the Timeout method will + // return true even if the deadline has not been exceeded. + // + // An idle timeout can be implemented by repeatedly extending + // the deadline after successful Read or Write calls. + // + // A zero value for t means I/O operations will not time out. + SetDeadline(t time.Time) error + + // SetReadDeadline sets the deadline for future Read calls + // and any currently-blocked Read call. + // A zero value for t means Read will not time out. + SetReadDeadline(t time.Time) error + + // SetWriteDeadline sets the deadline for future Write calls + // and any currently-blocked Write call. + // Even if write times out, it may return n > 0, indicating that + // some of the data was successfully written. + // A zero value for t means Write will not time out. + SetWriteDeadline(t time.Time) error + + // SetReadBuffer sets the size of the operating system's + // receive buffer associated with the connection. + SetReadBuffer(bytes int) error + + // SetWriteBuffer sets the size of the operating system's + // transmit buffer associated with the connection. + SetWriteBuffer(bytes int) error + + // Read reads data from the connection. + // Read can be made to time out and return an error after a fixed + // time limit; see SetDeadline and SetReadDeadline. + Read(b []byte) (n int, err error) + + // ReadFrom reads a packet from the connection, + // copying the payload into p. It returns the number of + // bytes copied into p and the return address that + // was on the packet. + // It returns the number of bytes read (0 <= n <= len(p)) + // and any error encountered. Callers should always process + // the n > 0 bytes returned before considering the error err. + // ReadFrom can be made to time out and return an error after a + // fixed time limit; see SetDeadline and SetReadDeadline. + ReadFrom(p []byte) (n int, addr net.Addr, err error) + + // ReadFromUDP acts like ReadFrom but returns a UDPAddr. + ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) + + // ReadMsgUDP reads a message from c, copying the payload into b and + // the associated out-of-band data into oob. It returns the number of + // bytes copied into b, the number of bytes copied into oob, the flags + // that were set on the message and the source address of the message. + // + // The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be + // used to manipulate IP-level socket options in oob. + ReadMsgUDP(b, oob []byte) (n, oobn, flags int, addr *net.UDPAddr, err error) + + // Write writes data to the connection. + // Write can be made to time out and return an error after a fixed + // time limit; see SetDeadline and SetWriteDeadline. + Write(b []byte) (n int, err error) + + // WriteTo writes a packet with payload p to addr. + // WriteTo can be made to time out and return an Error after a + // fixed time limit; see SetDeadline and SetWriteDeadline. + // On packet-oriented connections, write timeouts are rare. + WriteTo(p []byte, addr net.Addr) (n int, err error) + + // WriteToUDP acts like WriteTo but takes a UDPAddr. + WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) + + // WriteMsgUDP writes a message to addr via c if c isn't connected, or + // to c's remote address if c is connected (in which case addr must be + // nil). The payload is copied from b and the associated out-of-band + // data is copied from oob. It returns the number of payload and + // out-of-band bytes written. + // + // The packages golang.org/x/net/ipv4 and golang.org/x/net/ipv6 can be + // used to manipulate IP-level socket options in oob. + WriteMsgUDP(b, oob []byte, addr *net.UDPAddr) (n, oobn int, err error) +} + +// TCPConn is an interface for TCP network connections. +type TCPConn interface { + net.Conn + + // CloseRead shuts down the reading side of the TCP connection. + // Most callers should just use Close. + CloseRead() error + + // CloseWrite shuts down the writing side of the TCP connection. + // Most callers should just use Close. + CloseWrite() error + + // ReadFrom implements the io.ReaderFrom ReadFrom method. + ReadFrom(r io.Reader) (int64, error) + + // SetLinger sets the behavior of Close on a connection which still + // has data waiting to be sent or to be acknowledged. + // + // If sec < 0 (the default), the operating system finishes sending the + // data in the background. + // + // If sec == 0, the operating system discards any unsent or + // unacknowledged data. + // + // If sec > 0, the data is sent in the background as with sec < 0. On + // some operating systems after sec seconds have elapsed any remaining + // unsent data may be discarded. + SetLinger(sec int) error + + // SetKeepAlive sets whether the operating system should send + // keep-alive messages on the connection. + SetKeepAlive(keepalive bool) error + + // SetKeepAlivePeriod sets period between keep-alives. + SetKeepAlivePeriod(d time.Duration) error + + // SetNoDelay controls whether the operating system should delay + // packet transmission in hopes of sending fewer packets (Nagle's + // algorithm). The default is true (no delay), meaning that data is + // sent as soon as possible after a Write. + SetNoDelay(noDelay bool) error + + // SetWriteBuffer sets the size of the operating system's + // transmit buffer associated with the connection. + SetWriteBuffer(bytes int) error + + // SetReadBuffer sets the size of the operating system's + // receive buffer associated with the connection. + SetReadBuffer(bytes int) error +} + +// TCPListener is a TCP network listener. Clients should typically +// use variables of type Listener instead of assuming TCP. +type TCPListener interface { + net.Listener + + // AcceptTCP accepts the next incoming call and returns the new + // connection. + AcceptTCP() (TCPConn, error) + + // SetDeadline sets the deadline associated with the listener. + // A zero time value disables the deadline. + SetDeadline(t time.Time) error +} + +// Interface wraps a standard net.Interfaces and its assigned addresses +type Interface struct { + net.Interface + addrs []net.Addr +} + +// NewInterface creates a new interface based of a standard net.Interface +func NewInterface(ifc net.Interface) *Interface { + return &Interface{ + Interface: ifc, + addrs: nil, + } +} + +// AddAddress adds a new address to the interface +func (ifc *Interface) AddAddress(addr net.Addr) { + ifc.addrs = append(ifc.addrs, addr) +} + +// Addrs returns a slice of configured addresses on the interface +func (ifc *Interface) Addrs() ([]net.Addr, error) { + if len(ifc.addrs) == 0 { + return nil, ErrNoAddressAssigned + } + return ifc.addrs, nil +} diff --git a/vendor/github.com/pion/transport/v2/packetio/buffer.go b/vendor/github.com/pion/transport/v2/packetio/buffer.go new file mode 100644 index 000000000..2d46d796a --- /dev/null +++ b/vendor/github.com/pion/transport/v2/packetio/buffer.go @@ -0,0 +1,351 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package packetio provides packet buffer +package packetio + +import ( + "errors" + "io" + "sync" + "time" + + "github.com/pion/transport/v2/deadline" +) + +var errPacketTooBig = errors.New("packet too big") + +// BufferPacketType allow the Buffer to know which packet protocol is writing. +type BufferPacketType int + +const ( + // RTPBufferPacket indicates the Buffer that is handling RTP packets + RTPBufferPacket BufferPacketType = 1 + // RTCPBufferPacket indicates the Buffer that is handling RTCP packets + RTCPBufferPacket BufferPacketType = 2 +) + +// Buffer allows writing packets to an intermediate buffer, which can then be read form. +// This is verify similar to bytes.Buffer but avoids combining multiple writes into a single read. +type Buffer struct { + mutex sync.Mutex + + // this is a circular buffer. If head <= tail, then the useful + // data is in the interval [head, tail[. If tail < head, then + // the useful data is the union of [head, len[ and [0, tail[. + // In order to avoid ambiguity when head = tail, we always leave + // an unused byte in the buffer. + data []byte + head, tail int + + notify chan struct{} // non-nil when we have blocked readers + closed bool + + count int + limitCount, limitSize int + + readDeadline *deadline.Deadline +} + +const ( + minSize = 2048 + cutoffSize = 128 * 1024 + maxSize = 4 * 1024 * 1024 +) + +// NewBuffer creates a new Buffer. +func NewBuffer() *Buffer { + return &Buffer{ + readDeadline: deadline.New(), + } +} + +// available returns true if the buffer is large enough to fit a packet +// of the given size, taking overhead into account. +func (b *Buffer) available(size int) bool { + available := b.head - b.tail + if available <= 0 { + available += len(b.data) + } + // we interpret head=tail as empty, so always keep a byte free + if size+2+1 > available { + return false + } + + return true +} + +// grow increases the size of the buffer. If it returns nil, then the +// buffer has been grown. It returns ErrFull if hits a limit. +func (b *Buffer) grow() error { + var newSize int + if len(b.data) < cutoffSize { + newSize = 2 * len(b.data) + } else { + newSize = 5 * len(b.data) / 4 + } + if newSize < minSize { + newSize = minSize + } + if (b.limitSize <= 0 || sizeHardLimit) && newSize > maxSize { + newSize = maxSize + } + + // one byte slack + if b.limitSize > 0 && newSize > b.limitSize+1 { + newSize = b.limitSize + 1 + } + + if newSize <= len(b.data) { + return ErrFull + } + + newData := make([]byte, newSize) + + var n int + if b.head <= b.tail { + // data was contiguous + n = copy(newData, b.data[b.head:b.tail]) + } else { + // data was discontinuous + n = copy(newData, b.data[b.head:]) + n += copy(newData[n:], b.data[:b.tail]) + } + b.head = 0 + b.tail = n + b.data = newData + + return nil +} + +// Write appends a copy of the packet data to the buffer. +// Returns ErrFull if the packet doesn't fit. +// +// Note that the packet size is limited to 65536 bytes since v0.11.0 due to the internal data structure. +func (b *Buffer) Write(packet []byte) (int, error) { + if len(packet) >= 0x10000 { + return 0, errPacketTooBig + } + + b.mutex.Lock() + + if b.closed { + b.mutex.Unlock() + return 0, io.ErrClosedPipe + } + + if (b.limitCount > 0 && b.count >= b.limitCount) || + (b.limitSize > 0 && b.size()+2+len(packet) > b.limitSize) { + b.mutex.Unlock() + return 0, ErrFull + } + + // grow the buffer until the packet fits + for !b.available(len(packet)) { + err := b.grow() + if err != nil { + b.mutex.Unlock() + return 0, err + } + } + + var notify chan struct{} + if b.notify != nil { + // Prepare to notify readers, but only + // actually do it after we release the lock. + notify = b.notify + b.notify = nil + } + + // store the length of the packet + b.data[b.tail] = uint8(len(packet) >> 8) + b.tail++ + if b.tail >= len(b.data) { + b.tail = 0 + } + b.data[b.tail] = uint8(len(packet)) + b.tail++ + if b.tail >= len(b.data) { + b.tail = 0 + } + + // store the packet + n := copy(b.data[b.tail:], packet) + b.tail += n + if b.tail >= len(b.data) { + // we reached the end, wrap around + m := copy(b.data, packet[n:]) + b.tail = m + } + b.count++ + b.mutex.Unlock() + + if notify != nil { + close(notify) + } + + return len(packet), nil +} + +// Read populates the given byte slice, returning the number of bytes read. +// Blocks until data is available or the buffer is closed. +// Returns io.ErrShortBuffer is the packet is too small to copy the Write. +// Returns io.EOF if the buffer is closed. +func (b *Buffer) Read(packet []byte) (n int, err error) { //nolint:gocognit + // Return immediately if the deadline is already exceeded. + select { + case <-b.readDeadline.Done(): + return 0, &netError{ErrTimeout, true, true} + default: + } + + for { + b.mutex.Lock() + + if b.head != b.tail { + // decode the packet size + n1 := b.data[b.head] + b.head++ + if b.head >= len(b.data) { + b.head = 0 + } + n2 := b.data[b.head] + b.head++ + if b.head >= len(b.data) { + b.head = 0 + } + count := int((uint16(n1) << 8) | uint16(n2)) + + // determine the number of bytes we'll actually copy + copied := count + if copied > len(packet) { + copied = len(packet) + } + + // copy the data + if b.head+copied < len(b.data) { + copy(packet, b.data[b.head:b.head+copied]) + } else { + k := copy(packet, b.data[b.head:]) + copy(packet[k:], b.data[:copied-k]) + } + + // advance head, discarding any data that wasn't copied + b.head += count + if b.head >= len(b.data) { + b.head -= len(b.data) + } + + if b.head == b.tail { + // the buffer is empty, reset to beginning + // in order to improve cache locality. + b.head = 0 + b.tail = 0 + } + + b.count-- + + b.mutex.Unlock() + + if copied < count { + return copied, io.ErrShortBuffer + } + return copied, nil + } + + if b.closed { + b.mutex.Unlock() + return 0, io.EOF + } + + if b.notify == nil { + b.notify = make(chan struct{}) + } + notify := b.notify + b.mutex.Unlock() + + select { + case <-b.readDeadline.Done(): + return 0, &netError{ErrTimeout, true, true} + case <-notify: + } + } +} + +// Close the buffer, unblocking any pending reads. +// Data in the buffer can still be read, Read will return io.EOF only when empty. +func (b *Buffer) Close() (err error) { + b.mutex.Lock() + + if b.closed { + b.mutex.Unlock() + return nil + } + + notify := b.notify + b.notify = nil + b.closed = true + + b.mutex.Unlock() + + if notify != nil { + close(notify) + } + + return nil +} + +// Count returns the number of packets in the buffer. +func (b *Buffer) Count() int { + b.mutex.Lock() + defer b.mutex.Unlock() + return b.count +} + +// SetLimitCount controls the maximum number of packets that can be buffered. +// Causes Write to return ErrFull when this limit is reached. +// A zero value will disable this limit. +func (b *Buffer) SetLimitCount(limit int) { + b.mutex.Lock() + defer b.mutex.Unlock() + + b.limitCount = limit +} + +// Size returns the total byte size of packets in the buffer, including +// a small amount of administrative overhead. +func (b *Buffer) Size() int { + b.mutex.Lock() + defer b.mutex.Unlock() + + return b.size() +} + +func (b *Buffer) size() int { + size := b.tail - b.head + if size < 0 { + size += len(b.data) + } + return size +} + +// SetLimitSize controls the maximum number of bytes that can be buffered. +// Causes Write to return ErrFull when this limit is reached. +// A zero value means 4MB since v0.11.0. +// +// User can set packetioSizeHardLimit build tag to enable 4MB hard limit. +// When packetioSizeHardLimit build tag is set, SetLimitSize exceeding +// the hard limit will be silently discarded. +func (b *Buffer) SetLimitSize(limit int) { + b.mutex.Lock() + defer b.mutex.Unlock() + + b.limitSize = limit +} + +// SetReadDeadline sets the deadline for the Read operation. +// Setting to zero means no deadline. +func (b *Buffer) SetReadDeadline(t time.Time) error { + b.readDeadline.Set(t) + return nil +} diff --git a/vendor/github.com/pion/transport/v2/packetio/errors.go b/vendor/github.com/pion/transport/v2/packetio/errors.go new file mode 100644 index 000000000..4974a10b5 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/packetio/errors.go @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package packetio + +import ( + "errors" +) + +// netError implements net.Error +type netError struct { + error + timeout, temporary bool +} + +func (e *netError) Timeout() bool { + return e.timeout +} + +func (e *netError) Temporary() bool { + return e.temporary +} + +var ( + // ErrFull is returned when the buffer has hit the configured limits. + ErrFull = errors.New("packetio.Buffer is full, discarding write") + + // ErrTimeout is returned when a deadline has expired + ErrTimeout = errors.New("i/o timeout") +) diff --git a/vendor/github.com/pion/transport/v2/packetio/hardlimit.go b/vendor/github.com/pion/transport/v2/packetio/hardlimit.go new file mode 100644 index 000000000..8058e47fa --- /dev/null +++ b/vendor/github.com/pion/transport/v2/packetio/hardlimit.go @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build packetioSizeHardlimit +// +build packetioSizeHardlimit + +package packetio + +const sizeHardLimit = true diff --git a/vendor/github.com/pion/transport/v2/packetio/no_hardlimit.go b/vendor/github.com/pion/transport/v2/packetio/no_hardlimit.go new file mode 100644 index 000000000..a59e25957 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/packetio/no_hardlimit.go @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +//go:build !packetioSizeHardlimit +// +build !packetioSizeHardlimit + +package packetio + +const sizeHardLimit = false diff --git a/vendor/github.com/pion/transport/v2/renovate.json b/vendor/github.com/pion/transport/v2/renovate.json new file mode 100644 index 000000000..f1bb98c6a --- /dev/null +++ b/vendor/github.com/pion/transport/v2/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "github>pion/renovate-config" + ] +} diff --git a/vendor/github.com/pion/transport/v2/replaydetector/fixedbig.go b/vendor/github.com/pion/transport/v2/replaydetector/fixedbig.go new file mode 100644 index 000000000..80cb6b305 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/replaydetector/fixedbig.go @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package replaydetector + +import ( + "fmt" +) + +// fixedBigInt is the fix-sized multi-word integer. +type fixedBigInt struct { + bits []uint64 + n uint + msbMask uint64 +} + +// newFixedBigInt creates a new fix-sized multi-word int. +func newFixedBigInt(n uint) *fixedBigInt { + chunkSize := (n + 63) / 64 + if chunkSize == 0 { + chunkSize = 1 + } + return &fixedBigInt{ + bits: make([]uint64, chunkSize), + n: n, + msbMask: (1 << (64 - n%64)) - 1, + } +} + +// Lsh is the left shift operation. +func (s *fixedBigInt) Lsh(n uint) { + if n == 0 { + return + } + nChunk := int(n / 64) + nN := n % 64 + + for i := len(s.bits) - 1; i >= 0; i-- { + var carry uint64 + if i-nChunk >= 0 { + carry = s.bits[i-nChunk] << nN + if i-nChunk-1 >= 0 { + carry |= s.bits[i-nChunk-1] >> (64 - nN) + } + } + s.bits[i] = (s.bits[i] << n) | carry + } + s.bits[len(s.bits)-1] &= s.msbMask +} + +// Bit returns i-th bit of the fixedBigInt. +func (s *fixedBigInt) Bit(i uint) uint { + if i >= s.n { + return 0 + } + chunk := i / 64 + pos := i % 64 + if s.bits[chunk]&(1<= s.n { + return + } + chunk := i / 64 + pos := i % 64 + s.bits[chunk] |= 1 << pos +} + +// String returns string representation of fixedBigInt. +func (s *fixedBigInt) String() string { + var out string + for i := len(s.bits) - 1; i >= 0; i-- { + out += fmt.Sprintf("%016X", s.bits[i]) + } + return out +} diff --git a/vendor/github.com/pion/transport/v2/replaydetector/replaydetector.go b/vendor/github.com/pion/transport/v2/replaydetector/replaydetector.go new file mode 100644 index 000000000..4358d8f3b --- /dev/null +++ b/vendor/github.com/pion/transport/v2/replaydetector/replaydetector.go @@ -0,0 +1,119 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package replaydetector provides packet replay detection algorithm. +package replaydetector + +// ReplayDetector is the interface of sequence replay detector. +type ReplayDetector interface { + // Check returns true if given sequence number is not replayed. + // Call accept() to mark the packet is received properly. + Check(seq uint64) (accept func(), ok bool) +} + +type slidingWindowDetector struct { + latestSeq uint64 + maxSeq uint64 + windowSize uint + mask *fixedBigInt +} + +// New creates ReplayDetector. +// Created ReplayDetector doesn't allow wrapping. +// It can handle monotonically increasing sequence number up to +// full 64bit number. It is suitable for DTLS replay protection. +func New(windowSize uint, maxSeq uint64) ReplayDetector { + return &slidingWindowDetector{ + maxSeq: maxSeq, + windowSize: windowSize, + mask: newFixedBigInt(windowSize), + } +} + +func (d *slidingWindowDetector) Check(seq uint64) (accept func(), ok bool) { + if seq > d.maxSeq { + // Exceeded upper limit. + return func() {}, false + } + + if seq <= d.latestSeq { + if d.latestSeq >= uint64(d.windowSize)+seq { + return func() {}, false + } + if d.mask.Bit(uint(d.latestSeq-seq)) != 0 { + // The sequence number is duplicated. + return func() {}, false + } + } + + return func() { + if seq > d.latestSeq { + // Update the head of the window. + d.mask.Lsh(uint(seq - d.latestSeq)) + d.latestSeq = seq + } + diff := (d.latestSeq - seq) % d.maxSeq + d.mask.SetBit(uint(diff)) + }, true +} + +// WithWrap creates ReplayDetector allowing sequence wrapping. +// This is suitable for short bit width counter like SRTP and SRTCP. +func WithWrap(windowSize uint, maxSeq uint64) ReplayDetector { + return &wrappedSlidingWindowDetector{ + maxSeq: maxSeq, + windowSize: windowSize, + mask: newFixedBigInt(windowSize), + } +} + +type wrappedSlidingWindowDetector struct { + latestSeq uint64 + maxSeq uint64 + windowSize uint + mask *fixedBigInt + init bool +} + +func (d *wrappedSlidingWindowDetector) Check(seq uint64) (accept func(), ok bool) { + if seq > d.maxSeq { + // Exceeded upper limit. + return func() {}, false + } + if !d.init { + if seq != 0 { + d.latestSeq = seq - 1 + } else { + d.latestSeq = d.maxSeq + } + d.init = true + } + + diff := int64(d.latestSeq) - int64(seq) + // Wrap the number. + if diff > int64(d.maxSeq)/2 { + diff -= int64(d.maxSeq + 1) + } else if diff <= -int64(d.maxSeq)/2 { + diff += int64(d.maxSeq + 1) + } + + if diff >= int64(d.windowSize) { + // Too old. + return func() {}, false + } + if diff >= 0 { + if d.mask.Bit(uint(diff)) != 0 { + // The sequence number is duplicated. + return func() {}, false + } + } + + return func() { + if diff < 0 { + // Update the head of the window. + d.mask.Lsh(uint(-diff)) + d.latestSeq = seq + } + d.mask.SetBit(uint(d.latestSeq - seq)) + }, true +} diff --git a/vendor/github.com/pion/transport/v2/stdnet/net.go b/vendor/github.com/pion/transport/v2/stdnet/net.go new file mode 100644 index 000000000..fa4753b51 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/stdnet/net.go @@ -0,0 +1,167 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package stdnet implements the transport.Net interface +// using methods from Go's standard net package. +package stdnet + +import ( + "fmt" + "net" + + "github.com/pion/transport/v2" +) + +const ( + lo0String = "lo0String" + udpString = "udp" +) + +// Net is an implementation of the net.Net interface +// based on functions of the standard net package. +type Net struct { + interfaces []*transport.Interface +} + +// NewNet creates a new StdNet instance. +func NewNet() (*Net, error) { + n := &Net{} + + return n, n.UpdateInterfaces() +} + +// Compile-time assertion +var _ transport.Net = &Net{} + +// UpdateInterfaces updates the internal list of network interfaces +// and associated addresses. +func (n *Net) UpdateInterfaces() error { + ifs := []*transport.Interface{} + + oifs, err := net.Interfaces() + if err != nil { + return err + } + + for _, oif := range oifs { + ifc := transport.NewInterface(oif) + + addrs, err := oif.Addrs() + if err != nil { + return err + } + + for _, addr := range addrs { + ifc.AddAddress(addr) + } + + ifs = append(ifs, ifc) + } + + n.interfaces = ifs + + return nil +} + +// Interfaces returns a slice of interfaces which are available on the +// system +func (n *Net) Interfaces() ([]*transport.Interface, error) { + return n.interfaces, nil +} + +// InterfaceByIndex returns the interface specified by index. +// +// On Solaris, it returns one of the logical network interfaces +// sharing the logical data link; for more precision use +// InterfaceByName. +func (n *Net) InterfaceByIndex(index int) (*transport.Interface, error) { + for _, ifc := range n.interfaces { + if ifc.Index == index { + return ifc, nil + } + } + + return nil, fmt.Errorf("%w: index=%d", transport.ErrInterfaceNotFound, index) +} + +// InterfaceByName returns the interface specified by name. +func (n *Net) InterfaceByName(name string) (*transport.Interface, error) { + for _, ifc := range n.interfaces { + if ifc.Name == name { + return ifc, nil + } + } + + return nil, fmt.Errorf("%w: %s", transport.ErrInterfaceNotFound, name) +} + +// ListenPacket announces on the local network address. +func (n *Net) ListenPacket(network string, address string) (net.PacketConn, error) { + return net.ListenPacket(network, address) +} + +// ListenUDP acts like ListenPacket for UDP networks. +func (n *Net) ListenUDP(network string, locAddr *net.UDPAddr) (transport.UDPConn, error) { + return net.ListenUDP(network, locAddr) +} + +// Dial connects to the address on the named network. +func (n *Net) Dial(network, address string) (net.Conn, error) { + return net.Dial(network, address) +} + +// DialUDP acts like Dial for UDP networks. +func (n *Net) DialUDP(network string, laddr, raddr *net.UDPAddr) (transport.UDPConn, error) { + return net.DialUDP(network, laddr, raddr) +} + +// ResolveIPAddr returns an address of IP end point. +func (n *Net) ResolveIPAddr(network, address string) (*net.IPAddr, error) { + return net.ResolveIPAddr(network, address) +} + +// ResolveUDPAddr returns an address of UDP end point. +func (n *Net) ResolveUDPAddr(network, address string) (*net.UDPAddr, error) { + return net.ResolveUDPAddr(network, address) +} + +// ResolveTCPAddr returns an address of TCP end point. +func (n *Net) ResolveTCPAddr(network, address string) (*net.TCPAddr, error) { + return net.ResolveTCPAddr(network, address) +} + +// DialTCP acts like Dial for TCP networks. +func (n *Net) DialTCP(network string, laddr, raddr *net.TCPAddr) (transport.TCPConn, error) { + return net.DialTCP(network, laddr, raddr) +} + +// ListenTCP acts like Listen for TCP networks. +func (n *Net) ListenTCP(network string, laddr *net.TCPAddr) (transport.TCPListener, error) { + l, err := net.ListenTCP(network, laddr) + if err != nil { + return nil, err + } + + return tcpListener{l}, nil +} + +type tcpListener struct { + *net.TCPListener +} + +func (l tcpListener) AcceptTCP() (transport.TCPConn, error) { + return l.TCPListener.AcceptTCP() +} + +type stdDialer struct { + *net.Dialer +} + +func (d stdDialer) Dial(network, address string) (net.Conn, error) { + return d.Dialer.Dial(network, address) +} + +// CreateDialer creates an instance of vnet.Dialer +func (n *Net) CreateDialer(d *net.Dialer) transport.Dialer { + return stdDialer{d} +} diff --git a/vendor/github.com/pion/transport/v2/udp/batchconn.go b/vendor/github.com/pion/transport/v2/udp/batchconn.go new file mode 100644 index 000000000..b01be25e5 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/udp/batchconn.go @@ -0,0 +1,171 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package udp + +import ( + "io" + "net" + "runtime" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +// BatchWriter represents conn can write messages in batch +type BatchWriter interface { + WriteBatch(ms []ipv4.Message, flags int) (int, error) +} + +// BatchReader represents conn can read messages in batch +type BatchReader interface { + ReadBatch(msg []ipv4.Message, flags int) (int, error) +} + +// BatchPacketConn represents conn can read/write messages in batch +type BatchPacketConn interface { + BatchWriter + BatchReader + io.Closer +} + +// BatchConn uses ipv4/v6.NewPacketConn to wrap a net.PacketConn to write/read messages in batch, +// only available in linux. In other platform, it will use single Write/Read as same as net.Conn. +type BatchConn struct { + net.PacketConn + + batchConn BatchPacketConn + + batchWriteMutex sync.Mutex + batchWriteMessages []ipv4.Message + batchWritePos int + batchWriteLast time.Time + + batchWriteSize int + batchWriteInterval time.Duration + + closed atomic.Bool +} + +// NewBatchConn creates a *BatchConn from net.PacketConn with batch configs. +func NewBatchConn(conn net.PacketConn, batchWriteSize int, batchWriteInterval time.Duration) *BatchConn { + bc := &BatchConn{ + PacketConn: conn, + batchWriteLast: time.Now(), + batchWriteInterval: batchWriteInterval, + batchWriteSize: batchWriteSize, + batchWriteMessages: make([]ipv4.Message, batchWriteSize), + } + for i := range bc.batchWriteMessages { + bc.batchWriteMessages[i].Buffers = [][]byte{make([]byte, sendMTU)} + } + + // batch write only supports linux + if runtime.GOOS == "linux" { + if pc4 := ipv4.NewPacketConn(conn); pc4 != nil { + bc.batchConn = pc4 + } else if pc6 := ipv6.NewPacketConn(conn); pc6 != nil { + bc.batchConn = pc6 + } + } + + if bc.batchConn != nil { + go func() { + writeTicker := time.NewTicker(batchWriteInterval / 2) + defer writeTicker.Stop() + + for !bc.closed.Load() { + <-writeTicker.C + bc.batchWriteMutex.Lock() + if bc.batchWritePos > 0 && time.Since(bc.batchWriteLast) >= bc.batchWriteInterval { + _ = bc.flush() + } + bc.batchWriteMutex.Unlock() + } + }() + } + + return bc +} + +// Close batchConn and the underlying PacketConn +func (c *BatchConn) Close() error { + c.closed.Store(true) + c.batchWriteMutex.Lock() + if c.batchWritePos > 0 { + _ = c.flush() + } + c.batchWriteMutex.Unlock() + if c.batchConn != nil { + return c.batchConn.Close() + } + return c.PacketConn.Close() +} + +// WriteTo write message to an UDPAddr, addr should be nil if it is a connected socket. +func (c *BatchConn) WriteTo(b []byte, addr net.Addr) (int, error) { + if c.batchConn == nil { + return c.PacketConn.WriteTo(b, addr) + } + return c.enqueueMessage(b, addr) +} + +func (c *BatchConn) enqueueMessage(buf []byte, raddr net.Addr) (int, error) { + var err error + c.batchWriteMutex.Lock() + defer c.batchWriteMutex.Unlock() + + msg := &c.batchWriteMessages[c.batchWritePos] + // reset buffers + msg.Buffers = msg.Buffers[:1] + msg.Buffers[0] = msg.Buffers[0][:cap(msg.Buffers[0])] + + c.batchWritePos++ + if raddr != nil { + msg.Addr = raddr + } + if n := copy(msg.Buffers[0], buf); n < len(buf) { + extraBuffer := make([]byte, len(buf)-n) + copy(extraBuffer, buf[n:]) + msg.Buffers = append(msg.Buffers, extraBuffer) + } else { + msg.Buffers[0] = msg.Buffers[0][:n] + } + if c.batchWritePos == c.batchWriteSize { + err = c.flush() + } + return len(buf), err +} + +// ReadBatch reads messages in batch, return length of message readed and error. +func (c *BatchConn) ReadBatch(msgs []ipv4.Message, flags int) (int, error) { + if c.batchConn == nil { + n, addr, err := c.PacketConn.ReadFrom(msgs[0].Buffers[0]) + if err == nil { + msgs[0].N = n + msgs[0].Addr = addr + return 1, nil + } + return 0, err + } + return c.batchConn.ReadBatch(msgs, flags) +} + +func (c *BatchConn) flush() error { + var writeErr error + var txN int + for txN < c.batchWritePos { + n, err := c.batchConn.WriteBatch(c.batchWriteMessages[txN:c.batchWritePos], 0) + if err != nil { + writeErr = err + break + } + txN += n + } + c.batchWritePos = 0 + c.batchWriteLast = time.Now() + return writeErr +} diff --git a/vendor/github.com/pion/transport/v2/udp/conn.go b/vendor/github.com/pion/transport/v2/udp/conn.go new file mode 100644 index 000000000..e2378f882 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/udp/conn.go @@ -0,0 +1,389 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +// Package udp provides a connection-oriented listener over a UDP PacketConn +package udp + +import ( + "context" + "errors" + "net" + "sync" + "sync/atomic" + "time" + + "github.com/pion/transport/v2/deadline" + "github.com/pion/transport/v2/packetio" + "golang.org/x/net/ipv4" +) + +const ( + receiveMTU = 8192 + sendMTU = 1500 + defaultListenBacklog = 128 // same as Linux default +) + +// Typed errors +var ( + ErrClosedListener = errors.New("udp: listener closed") + ErrListenQueueExceeded = errors.New("udp: listen queue exceeded") + ErrInvalidBatchConfig = errors.New("udp: invalid batch config") +) + +// listener augments a connection-oriented Listener over a UDP PacketConn +type listener struct { + pConn net.PacketConn + + readBatchSize int + + accepting atomic.Value // bool + acceptCh chan *Conn + doneCh chan struct{} + doneOnce sync.Once + acceptFilter func([]byte) bool + + connLock sync.Mutex + conns map[string]*Conn + connWG *sync.WaitGroup + + readWG sync.WaitGroup + errClose atomic.Value // error + + readDoneCh chan struct{} + errRead atomic.Value // error +} + +// Accept waits for and returns the next connection to the listener. +func (l *listener) Accept() (net.Conn, error) { + select { + case c := <-l.acceptCh: + l.connWG.Add(1) + return c, nil + + case <-l.readDoneCh: + err, _ := l.errRead.Load().(error) + return nil, err + + case <-l.doneCh: + return nil, ErrClosedListener + } +} + +// Close closes the listener. +// Any blocked Accept operations will be unblocked and return errors. +func (l *listener) Close() error { + var err error + l.doneOnce.Do(func() { + l.accepting.Store(false) + close(l.doneCh) + + l.connLock.Lock() + // Close unaccepted connections + lclose: + for { + select { + case c := <-l.acceptCh: + close(c.doneCh) + delete(l.conns, c.rAddr.String()) + + default: + break lclose + } + } + nConns := len(l.conns) + l.connLock.Unlock() + + l.connWG.Done() + + if nConns == 0 { + // Wait if this is the final connection + l.readWG.Wait() + if errClose, ok := l.errClose.Load().(error); ok { + err = errClose + } + } else { + err = nil + } + }) + + return err +} + +// Addr returns the listener's network address. +func (l *listener) Addr() net.Addr { + return l.pConn.LocalAddr() +} + +// BatchIOConfig indicates config to batch read/write packets, +// it will use ReadBatch/WriteBatch to improve throughput for UDP. +type BatchIOConfig struct { + Enable bool + // ReadBatchSize indicates the maximum number of packets to be read in one batch, a batch size less than 2 means + // disable read batch. + ReadBatchSize int + // WriteBatchSize indicates the maximum number of packets to be written in one batch + WriteBatchSize int + // WriteBatchInterval indicates the maximum interval to wait before writing packets in one batch + // small interval will reduce latency/jitter, but increase the io count. + WriteBatchInterval time.Duration +} + +// ListenConfig stores options for listening to an address. +type ListenConfig struct { + // Backlog defines the maximum length of the queue of pending + // connections. It is equivalent of the backlog argument of + // POSIX listen function. + // If a connection request arrives when the queue is full, + // the request will be silently discarded, unlike TCP. + // Set zero to use default value 128 which is same as Linux default. + Backlog int + + // AcceptFilter determines whether the new conn should be made for + // the incoming packet. If not set, any packet creates new conn. + AcceptFilter func([]byte) bool + + // ReadBufferSize sets the size of the operating system's + // receive buffer associated with the listener. + ReadBufferSize int + + // WriteBufferSize sets the size of the operating system's + // send buffer associated with the connection. + WriteBufferSize int + + Batch BatchIOConfig +} + +// Listen creates a new listener based on the ListenConfig. +func (lc *ListenConfig) Listen(network string, laddr *net.UDPAddr) (net.Listener, error) { + if lc.Backlog == 0 { + lc.Backlog = defaultListenBacklog + } + + if lc.Batch.Enable && (lc.Batch.WriteBatchSize <= 0 || lc.Batch.WriteBatchInterval <= 0) { + return nil, ErrInvalidBatchConfig + } + + conn, err := net.ListenUDP(network, laddr) + if err != nil { + return nil, err + } + + if lc.ReadBufferSize > 0 { + _ = conn.SetReadBuffer(lc.ReadBufferSize) + } + if lc.WriteBufferSize > 0 { + _ = conn.SetWriteBuffer(lc.WriteBufferSize) + } + + l := &listener{ + pConn: conn, + acceptCh: make(chan *Conn, lc.Backlog), + conns: make(map[string]*Conn), + doneCh: make(chan struct{}), + acceptFilter: lc.AcceptFilter, + connWG: &sync.WaitGroup{}, + readDoneCh: make(chan struct{}), + } + + if lc.Batch.Enable { + l.pConn = NewBatchConn(conn, lc.Batch.WriteBatchSize, lc.Batch.WriteBatchInterval) + l.readBatchSize = lc.Batch.ReadBatchSize + } + + l.accepting.Store(true) + l.connWG.Add(1) + l.readWG.Add(2) // wait readLoop and Close execution routine + + go l.readLoop() + go func() { + l.connWG.Wait() + if err := l.pConn.Close(); err != nil { + l.errClose.Store(err) + } + l.readWG.Done() + }() + + return l, nil +} + +// Listen creates a new listener using default ListenConfig. +func Listen(network string, laddr *net.UDPAddr) (net.Listener, error) { + return (&ListenConfig{}).Listen(network, laddr) +} + +// readLoop has to tasks: +// 1. Dispatching incoming packets to the correct Conn. +// It can therefore not be ended until all Conns are closed. +// 2. Creating a new Conn when receiving from a new remote. +func (l *listener) readLoop() { + defer l.readWG.Done() + defer close(l.readDoneCh) + + if br, ok := l.pConn.(BatchReader); ok && l.readBatchSize > 1 { + l.readBatch(br) + } else { + l.read() + } +} + +func (l *listener) readBatch(br BatchReader) { + msgs := make([]ipv4.Message, l.readBatchSize) + for i := range msgs { + msg := &msgs[i] + msg.Buffers = [][]byte{make([]byte, receiveMTU)} + msg.OOB = make([]byte, 40) + } + for { + n, err := br.ReadBatch(msgs, 0) + if err != nil { + l.errRead.Store(err) + return + } + for i := 0; i < n; i++ { + l.dispatchMsg(msgs[i].Addr, msgs[i].Buffers[0][:msgs[i].N]) + } + } +} + +func (l *listener) read() { + buf := make([]byte, receiveMTU) + for { + n, raddr, err := l.pConn.ReadFrom(buf) + if err != nil { + l.errRead.Store(err) + return + } + l.dispatchMsg(raddr, buf[:n]) + } +} + +func (l *listener) dispatchMsg(addr net.Addr, buf []byte) { + conn, ok, err := l.getConn(addr, buf) + if err != nil { + return + } + if ok { + _, _ = conn.buffer.Write(buf) + } +} + +func (l *listener) getConn(raddr net.Addr, buf []byte) (*Conn, bool, error) { + l.connLock.Lock() + defer l.connLock.Unlock() + conn, ok := l.conns[raddr.String()] + if !ok { + if isAccepting, ok := l.accepting.Load().(bool); !isAccepting || !ok { + return nil, false, ErrClosedListener + } + if l.acceptFilter != nil { + if !l.acceptFilter(buf) { + return nil, false, nil + } + } + conn = l.newConn(raddr) + select { + case l.acceptCh <- conn: + l.conns[raddr.String()] = conn + default: + return nil, false, ErrListenQueueExceeded + } + } + return conn, true, nil +} + +// Conn augments a connection-oriented connection over a UDP PacketConn +type Conn struct { + listener *listener + + rAddr net.Addr + + buffer *packetio.Buffer + + doneCh chan struct{} + doneOnce sync.Once + + writeDeadline *deadline.Deadline +} + +func (l *listener) newConn(rAddr net.Addr) *Conn { + return &Conn{ + listener: l, + rAddr: rAddr, + buffer: packetio.NewBuffer(), + doneCh: make(chan struct{}), + writeDeadline: deadline.New(), + } +} + +// Read reads from c into p +func (c *Conn) Read(p []byte) (int, error) { + return c.buffer.Read(p) +} + +// Write writes len(p) bytes from p to the DTLS connection +func (c *Conn) Write(p []byte) (n int, err error) { + select { + case <-c.writeDeadline.Done(): + return 0, context.DeadlineExceeded + default: + } + return c.listener.pConn.WriteTo(p, c.rAddr) +} + +// Close closes the conn and releases any Read calls +func (c *Conn) Close() error { + var err error + c.doneOnce.Do(func() { + c.listener.connWG.Done() + close(c.doneCh) + c.listener.connLock.Lock() + delete(c.listener.conns, c.rAddr.String()) + nConns := len(c.listener.conns) + c.listener.connLock.Unlock() + + if isAccepting, ok := c.listener.accepting.Load().(bool); nConns == 0 && !isAccepting && ok { + // Wait if this is the final connection + c.listener.readWG.Wait() + if errClose, ok := c.listener.errClose.Load().(error); ok { + err = errClose + } + } else { + err = nil + } + + if errBuf := c.buffer.Close(); errBuf != nil && err == nil { + err = errBuf + } + }) + + return err +} + +// LocalAddr implements net.Conn.LocalAddr +func (c *Conn) LocalAddr() net.Addr { + return c.listener.pConn.LocalAddr() +} + +// RemoteAddr implements net.Conn.RemoteAddr +func (c *Conn) RemoteAddr() net.Addr { + return c.rAddr +} + +// SetDeadline implements net.Conn.SetDeadline +func (c *Conn) SetDeadline(t time.Time) error { + c.writeDeadline.Set(t) + return c.SetReadDeadline(t) +} + +// SetReadDeadline implements net.Conn.SetDeadline +func (c *Conn) SetReadDeadline(t time.Time) error { + return c.buffer.SetReadDeadline(t) +} + +// SetWriteDeadline implements net.Conn.SetDeadline +func (c *Conn) SetWriteDeadline(t time.Time) error { + c.writeDeadline.Set(t) + // Write deadline of underlying connection should not be changed + // since the connection can be shared. + return nil +} diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.go b/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.go new file mode 100644 index 000000000..ded8e0d35 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2018 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//go:build !gccgo +// +build !gccgo + +// Package xor provides utility functions used by other Pion +// packages. AMD64 arch. +package xor + +// XorBytes xors the bytes in a and b. The destination should have enough +// space, otherwise xorBytes will panic. Returns the number of bytes xor'd. +// +//revive:disable-next-line +func XorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + _ = dst[n-1] + xorBytesSSE2(&dst[0], &a[0], &b[0], n) // amd64 must have SSE2 + return n +} + +//go:noescape +func xorBytesSSE2(dst, a, b *byte, n int) diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.s b/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.s new file mode 100644 index 000000000..f66ac95a2 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_amd64.s @@ -0,0 +1,56 @@ +// SPDX-FileCopyrightText: 2018 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +// go:build !gccgo +// +build !gccgo + +#include "textflag.h" + +// func xorBytesSSE2(dst, a, b *byte, n int) +TEXT ·xorBytesSSE2(SB), NOSPLIT, $0 + MOVQ dst+0(FP), BX + MOVQ a+8(FP), SI + MOVQ b+16(FP), CX + MOVQ n+24(FP), DX + TESTQ $15, DX // AND 15 & len, if not zero jump to not_aligned. + JNZ not_aligned + +aligned: + MOVQ $0, AX // position in slices + +loop16b: + MOVOU (SI)(AX*1), X0 // XOR 16byte forwards. + MOVOU (CX)(AX*1), X1 + PXOR X1, X0 + MOVOU X0, (BX)(AX*1) + ADDQ $16, AX + CMPQ DX, AX + JNE loop16b + RET + +loop_1b: + SUBQ $1, DX // XOR 1byte backwards. + MOVB (SI)(DX*1), DI + MOVB (CX)(DX*1), AX + XORB AX, DI + MOVB DI, (BX)(DX*1) + TESTQ $7, DX // AND 7 & len, if not zero jump to loop_1b. + JNZ loop_1b + CMPQ DX, $0 // if len is 0, ret. + JE ret + TESTQ $15, DX // AND 15 & len, if zero jump to aligned. + JZ aligned + +not_aligned: + TESTQ $7, DX // AND $7 & len, if not zero jump to loop_1b. + JNE loop_1b + SUBQ $8, DX // XOR 8bytes backwards. + MOVQ (SI)(DX*1), DI + MOVQ (CX)(DX*1), AX + XORQ AX, DI + MOVQ DI, (BX)(DX*1) + CMPQ DX, $16 // if len is greater or equal 16 here, it must be aligned. + JGE aligned + +ret: + RET diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.go b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.go new file mode 100644 index 000000000..25d6b72d8 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.go @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2022 The Pion community +// SPDX-License-Identifier: MIT + +//go:build !gccgo +// +build !gccgo + +// Package xor provides utility functions used by other Pion +// packages. ARM arch. +package xor + +import ( + "unsafe" + + "golang.org/x/sys/cpu" +) + +const wordSize = int(unsafe.Sizeof(uintptr(0))) // nolint:gosec +var hasNEON = cpu.ARM.HasNEON // nolint:gochecknoglobals + +func isAligned(a *byte) bool { + return uintptr(unsafe.Pointer(a))%uintptr(wordSize) == 0 +} + +// XorBytes xors the bytes in a and b. The destination should have enough +// space, otherwise xorBytes will panic. Returns the number of bytes xor'd. +// +//revive:disable-next-line +func XorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + // make sure dst has enough space + _ = dst[n-1] + + if hasNEON { + xorBytesNEON32(&dst[0], &a[0], &b[0], n) + } else if isAligned(&dst[0]) && isAligned(&a[0]) && isAligned(&b[0]) { + xorBytesARM32(&dst[0], &a[0], &b[0], n) + } else { + safeXORBytes(dst, a, b, n) + } + return n +} + +// n needs to be smaller or equal than the length of a and b. +func safeXORBytes(dst, a, b []byte, n int) { + for i := 0; i < n; i++ { + dst[i] = a[i] ^ b[i] + } +} + +//go:noescape +func xorBytesARM32(dst, a, b *byte, n int) + +//go:noescape +func xorBytesNEON32(dst, a, b *byte, n int) diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.s b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.s new file mode 100644 index 000000000..5e52a2d64 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm.s @@ -0,0 +1,116 @@ +// SPDX-FileCopyrightText: 2022 The Pion community +// SPDX-License-Identifier: MIT + +// go:build !gccgo +// +build !gccgo + +#include "textflag.h" + +// func xorBytesARM32(dst, a, b *byte, n int) +TEXT ·xorBytesARM32(SB), NOSPLIT|NOFRAME, $0 + MOVW dst+0(FP), R0 + MOVW a+4(FP), R1 + MOVW b+8(FP), R2 + MOVW n+12(FP), R3 + CMP $4, R3 + BLT less_than4 + +loop_4: + MOVW.P 4(R1), R4 + MOVW.P 4(R2), R5 + EOR R4, R5, R5 + MOVW.P R5, 4(R0) + + SUB $4, R3 + CMP $4, R3 + BGE loop_4 + +less_than4: + CMP $2, R3 + BLT less_than2 + MOVH.P 2(R1), R4 + MOVH.P 2(R2), R5 + EOR R4, R5, R5 + MOVH.P R5, 2(R0) + + SUB $2, R3 + +less_than2: + CMP $0, R3 + BEQ end + MOVB (R1), R4 + MOVB (R2), R5 + EOR R4, R5, R5 + MOVB R5, (R0) +end: + RET + +// func xorBytesNEON32(dst, a, b *byte, n int) +TEXT ·xorBytesNEON32(SB), NOSPLIT|NOFRAME, $0 + MOVW dst+0(FP), R0 + MOVW a+4(FP), R1 + MOVW b+8(FP), R2 + MOVW n+12(FP), R3 + CMP $32, R3 + BLT less_than32 + +loop_32: + WORD $0xF421020D // vld1.u8 {q0, q1}, [r1]! + WORD $0xF422420D // vld1.u8 {q2, q3}, [r2]! + WORD $0xF3004154 // veor q2, q0, q2 + WORD $0xF3026156 // veor q3, q1, q3 + WORD $0xF400420D // vst1.u8 {q2, q3}, [r0]! + + SUB $32, R3 + CMP $32, R3 + BGE loop_32 + +less_than32: + CMP $16, R3 + BLT less_than16 + WORD $0xF4210A0D // vld1.u8 q0, [r1]! + WORD $0xF4222A0D // vld1.u8 q1, [r2]! + WORD $0xF3002152 // veor q1, q0, q1 + WORD $0xF4002A0D // vst1.u8 {q1}, [r0]! + + SUB $16, R3 + +less_than16: + CMP $8, R3 + BLT less_than8 + WORD $0xF421070D // vld1.u8 d0, [r1]! + WORD $0xF422170D // vld1.u8 d1, [r2]! + WORD $0xF3001111 // veor d1, d0, d1 + WORD $0xF400170D // vst1.u8 {d1}, [r0]! + + SUB $8, R3 + +less_than8: + CMP $4, R3 + BLT less_than4 + MOVW.P 4(R1), R4 + MOVW.P 4(R2), R5 + EOR R4, R5, R5 + MOVW.P R5, 4(R0) + + SUB $4, R3 + +less_than4: + CMP $2, R3 + BLT less_than2 + MOVH.P 2(R1), R4 + MOVH.P 2(R2), R5 + EOR R4, R5, R5 + MOVH.P R5, 2(R0) + + SUB $2, R3 + +less_than2: + CMP $0, R3 + BEQ end + MOVB (R1), R4 + MOVB (R2), R5 + EOR R4, R5, R5 + MOVB R5, (R0) +end: + RET diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.go b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.go new file mode 100644 index 000000000..7002ab7c9 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.go @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2020 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//go:build !gccgo +// +build !gccgo + +// Package xor provides utility functions used by other Pion +// packages. ARM64 arch. +package xor + +// XorBytes xors the bytes in a and b. The destination should have enough +// space, otherwise xorBytes will panic. Returns the number of bytes xor'd. +// +//revive:disable-next-line +func XorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + // make sure dst has enough space + _ = dst[n-1] + + xorBytesARM64(&dst[0], &a[0], &b[0], n) + return n +} + +//go:noescape +func xorBytesARM64(dst, a, b *byte, n int) diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.s b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.s new file mode 100644 index 000000000..0b82d0992 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_arm64.s @@ -0,0 +1,69 @@ +// SPDX-FileCopyrightText: 2020 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//go:build !gccgo +// +build !gccgo + +#include "textflag.h" + +// func xorBytesARM64(dst, a, b *byte, n int) +TEXT ·xorBytesARM64(SB), NOSPLIT|NOFRAME, $0 + MOVD dst+0(FP), R0 + MOVD a+8(FP), R1 + MOVD b+16(FP), R2 + MOVD n+24(FP), R3 + CMP $64, R3 + BLT tail +loop_64: + VLD1.P 64(R1), [V0.B16, V1.B16, V2.B16, V3.B16] + VLD1.P 64(R2), [V4.B16, V5.B16, V6.B16, V7.B16] + VEOR V0.B16, V4.B16, V4.B16 + VEOR V1.B16, V5.B16, V5.B16 + VEOR V2.B16, V6.B16, V6.B16 + VEOR V3.B16, V7.B16, V7.B16 + VST1.P [V4.B16, V5.B16, V6.B16, V7.B16], 64(R0) + SUBS $64, R3 + CMP $64, R3 + BGE loop_64 +tail: + // quick end + CBZ R3, end + TBZ $5, R3, less_than32 + VLD1.P 32(R1), [V0.B16, V1.B16] + VLD1.P 32(R2), [V2.B16, V3.B16] + VEOR V0.B16, V2.B16, V2.B16 + VEOR V1.B16, V3.B16, V3.B16 + VST1.P [V2.B16, V3.B16], 32(R0) +less_than32: + TBZ $4, R3, less_than16 + LDP.P 16(R1), (R11, R12) + LDP.P 16(R2), (R13, R14) + EOR R11, R13, R13 + EOR R12, R14, R14 + STP.P (R13, R14), 16(R0) +less_than16: + TBZ $3, R3, less_than8 + MOVD.P 8(R1), R11 + MOVD.P 8(R2), R12 + EOR R11, R12, R12 + MOVD.P R12, 8(R0) +less_than8: + TBZ $2, R3, less_than4 + MOVWU.P 4(R1), R13 + MOVWU.P 4(R2), R14 + EORW R13, R14, R14 + MOVWU.P R14, 4(R0) +less_than4: + TBZ $1, R3, less_than2 + MOVHU.P 2(R1), R15 + MOVHU.P 2(R2), R16 + EORW R15, R16, R16 + MOVHU.P R16, 2(R0) +less_than2: + TBZ $0, R3, end + MOVBU (R1), R17 + MOVBU (R2), R19 + EORW R17, R19, R19 + MOVBU R19, (R0) +end: + RET diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_generic.go b/vendor/github.com/pion/transport/v2/utils/xor/xor_generic.go new file mode 100644 index 000000000..967fed33a --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_generic.go @@ -0,0 +1,78 @@ +// SPDX-FileCopyrightText: 2013 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause +// SPDX-FileCopyrightText: 2022 The Pion community +// SPDX-License-Identifier: MIT + +//go:build (!amd64 && !ppc64 && !ppc64le && !arm64 && !arm) || gccgo +// +build !amd64,!ppc64,!ppc64le,!arm64,!arm gccgo + +// Package xor provides utility functions used by other Pion +// packages. Generic arch. +package xor + +import ( + "runtime" + "unsafe" +) + +const ( + wordSize = int(unsafe.Sizeof(uintptr(0))) // nolint:gosec + supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x" // nolint:gochecknoglobals +) + +func isAligned(a *byte) bool { + return uintptr(unsafe.Pointer(a))%uintptr(wordSize) == 0 +} + +// XorBytes xors the bytes in a and b. The destination should have enough +// space, otherwise xorBytes will panic. Returns the number of bytes xor'd. +// +//revive:disable-next-line +func XorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + + switch { + case supportsUnaligned: + fastXORBytes(dst, a, b, n) + case isAligned(&dst[0]) && isAligned(&a[0]) && isAligned(&b[0]): + fastXORBytes(dst, a, b, n) + default: + safeXORBytes(dst, a, b, n) + } + return n +} + +// fastXORBytes xors in bulk. It only works on architectures that +// support unaligned read/writes. +// n needs to be smaller or equal than the length of a and b. +func fastXORBytes(dst, a, b []byte, n int) { + // Assert dst has enough space + _ = dst[n-1] + + w := n / wordSize + if w > 0 { + dw := *(*[]uintptr)(unsafe.Pointer(&dst)) // nolint:gosec + aw := *(*[]uintptr)(unsafe.Pointer(&a)) // nolint:gosec + bw := *(*[]uintptr)(unsafe.Pointer(&b)) // nolint:gosec + for i := 0; i < w; i++ { + dw[i] = aw[i] ^ bw[i] + } + } + + for i := (n - n%wordSize); i < n; i++ { + dst[i] = a[i] ^ b[i] + } +} + +// n needs to be smaller or equal than the length of a and b. +func safeXORBytes(dst, a, b []byte, n int) { + for i := 0; i < n; i++ { + dst[i] = a[i] ^ b[i] + } +} diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.go b/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.go new file mode 100644 index 000000000..bcc5926c4 --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.go @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2018 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//go:build (ppc64 && !gccgo) || (ppc64le && !gccgo) +// +build ppc64,!gccgo ppc64le,!gccgo + +// Package xor provides utility functions used by other Pion +// packages. PPC64 arch. +package xor + +// XorBytes xors the bytes in a and b. The destination should have enough +// space, otherwise xorBytes will panic. Returns the number of bytes xor'd. +// +//revive:disable-next-line +func XorBytes(dst, a, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + if n == 0 { + return 0 + } + _ = dst[n-1] + xorBytesVSX(&dst[0], &a[0], &b[0], n) + return n +} + +//go:noescape +func xorBytesVSX(dst, a, b *byte, n int) diff --git a/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.s b/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.s new file mode 100644 index 000000000..22763535f --- /dev/null +++ b/vendor/github.com/pion/transport/v2/utils/xor/xor_ppc64x.s @@ -0,0 +1,87 @@ +// SPDX-FileCopyrightText: 2018 The Go Authors. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//go:build (ppc64 && !gccgo) || (ppc64le && !gccgo) +//+build ppc64,!gccgo ppc64le,!gccgo + +#include "textflag.h" + +// func xorBytesVSX(dst, a, b *byte, n int) +TEXT ·xorBytesVSX(SB), NOSPLIT, $0 + MOVD dst+0(FP), R3 // R3 = dst + MOVD a+8(FP), R4 // R4 = a + MOVD b+16(FP), R5 // R5 = b + MOVD n+24(FP), R6 // R6 = n + + CMPU R6, $32, CR7 // Check if n ≥ 32 bytes + MOVD R0, R8 // R8 = index + CMPU R6, $8, CR6 // Check if 8 ≤ n < 32 bytes + BLT CR6, small // Smaller than 8 + BLT CR7, xor16 // Case for 16 ≤ n < 32 bytes + + // Case for n ≥ 32 bytes +preloop32: + SRD $5, R6, R7 // Setup loop counter + MOVD R7, CTR + MOVD $16, R10 + ANDCC $31, R6, R9 // Check for tailing bytes for later +loop32: + LXVD2X (R4)(R8), VS32 // VS32 = a[i,...,i+15] + LXVD2X (R4)(R10), VS34 + LXVD2X (R5)(R8), VS33 // VS33 = b[i,...,i+15] + LXVD2X (R5)(R10), VS35 + XXLXOR VS32, VS33, VS32 // VS34 = a[] ^ b[] + XXLXOR VS34, VS35, VS34 + STXVD2X VS32, (R3)(R8) // Store to dst + STXVD2X VS34, (R3)(R10) + ADD $32, R8 // Update index + ADD $32, R10 + BC 16, 0, loop32 // bdnz loop16 + + BEQ CR0, done + + MOVD R9, R6 + CMP R6, $8 + BLT small +xor16: + CMP R6, $16 + BLT xor8 + LXVD2X (R4)(R8), VS32 + LXVD2X (R5)(R8), VS33 + XXLXOR VS32, VS33, VS32 + STXVD2X VS32, (R3)(R8) + ADD $16, R8 + ADD $-16, R6 + CMP R6, $8 + BLT small +xor8: + // Case for 8 ≤ n < 16 bytes + MOVD (R4)(R8), R14 // R14 = a[i,...,i+7] + MOVD (R5)(R8), R15 // R15 = b[i,...,i+7] + XOR R14, R15, R16 // R16 = a[] ^ b[] + SUB $8, R6 // n = n - 8 + MOVD R16, (R3)(R8) // Store to dst + ADD $8, R8 + + // Check if we're finished + CMP R6, R0 + BGT small + RET + + // Case for n < 8 bytes and tailing bytes from the + // previous cases. +small: + CMP R6, R0 + BEQ done + MOVD R6, CTR // Setup loop counter + +loop: + MOVBZ (R4)(R8), R14 // R14 = a[i] + MOVBZ (R5)(R8), R15 // R15 = b[i] + XOR R14, R15, R16 // R16 = a[i] ^ b[i] + MOVB R16, (R3)(R8) // Store to dst + ADD $1, R8 + BC 16, 0, loop // bdnz loop + +done: + RET diff --git a/vendor/github.com/refraction-networking/conjure/LICENSE b/vendor/github.com/refraction-networking/conjure/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/refraction-networking/conjure/pkg/client/assets/assets.go b/vendor/github.com/refraction-networking/conjure/pkg/client/assets/assets.go new file mode 100644 index 000000000..7090bec69 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/client/assets/assets.go @@ -0,0 +1,459 @@ +package assets + +import ( + "crypto/rand" + "encoding/binary" + "encoding/hex" + mrand "math/rand" + "net" + "os" + "path" + "strings" + "sync" + + ps "github.com/refraction-networking/conjure/pkg/phantoms" + "github.com/refraction-networking/conjure/pkg/station/log" + pb "github.com/refraction-networking/conjure/proto" + + "google.golang.org/protobuf/proto" +) + +const ( + timeoutMax = 30000 + timeoutMin = 20000 + + sendLimitMax = 15614 + sendLimitMin = 14400 +) + +type assets struct { + sync.RWMutex + path string + + config *pb.ClientConf + + filenameClientConf string + + socksAddr string +} + +// could reset this internally to refresh assets and avoid woes of singleton testing +var assetsInstance *assets +var assetsOnce sync.Once + +// Assets is an access point to asset managing singleton. +// First access to singleton sets path. Assets(), if called +// before SetAssetsDir() sets path to "./assets/" +func Assets() *assets { + var err error + _initAssets := func() { err = initAssets("./assets/") } + assetsOnce.Do(_initAssets) + if err != nil { + log.Warnf("error getting assets: %v", err) + } + return assetsInstance +} + +// AssetsSetDir sets the directory to read assets from. +// Functionally equivalent to Assets() after initialization, unless dir changes. +func AssetsSetDir(dir string) (*assets, error) { + var err error + _initAssets := func() { err = initAssets(dir) } + if assetsInstance != nil { + assetsInstance.Lock() + defer assetsInstance.Unlock() + if dir != assetsInstance.path { + + if _, err := os.Stat(dir); err != nil { + log.Warnf("Assets path unchanged %v.\n", err) + return assetsInstance, err + } + log.Warnf("Assets path changed %s->%s. (Re)initializing", assetsInstance.path, dir) + assetsInstance.path = dir + err = assetsInstance.readConfigs() + return assetsInstance, err + } + } + assetsOnce.Do(_initAssets) + return assetsInstance, err +} + +func getDefaultKey() []byte { + keyStr := "a1cb97be697c5ed5aefd78ffa4db7e68101024603511e40a89951bc158807177" + key := make([]byte, hex.DecodedLen(len(keyStr))) + _, _ = hex.Decode(key, []byte(keyStr)) + return key +} + +func getDefaultTapdanceKey() []byte { + keyStr := "515868be7f45ab6f310afed4b229b7a479fc9fde553dea4ccdb369ab1899e70c" + key := make([]byte, hex.DecodedLen(len(keyStr))) + _, _ = hex.Decode(key, []byte(keyStr)) + return key +} + +func initAssets(path string) error { + var defaultDecoys = []*pb.TLSDecoySpec{ + pb.InitTLSDecoySpec("192.122.190.104", "tapdance1.freeaeskey.xyz"), + pb.InitTLSDecoySpec("192.122.190.105", "tapdance2.freeaeskey.xyz"), + pb.InitTLSDecoySpec("192.122.190.106", "tapdance3.freeaeskey.xyz"), + } + + defaultKey := getDefaultTapdanceKey() + defaultConjureKey := getDefaultKey() + + defualtKeyType := pb.KeyType_AES_GCM_128 + defaultPubKey := pb.PubKey{Key: defaultKey, Type: &defualtKeyType} + defaultConjurePubKey := pb.PubKey{Key: defaultConjureKey, Type: &defualtKeyType} + + defaultGeneration := uint32(1) + defaultDecoyList := pb.DecoyList{TlsDecoys: defaultDecoys} + defaultDnsRegDomain := "r.refraction.network" + defaultDnsRegDohUrl := "https://1.1.1.1/dns-query" + defaultStunServer := "stun.voip.blackberry.com:3478" + defaultDnsRegPubkey := getDefaultKey() + defaultDnsRegUtlsDistribution := "3*Firefox_65,1*Firefox_63,1*iOS_12_1" + defaultDnsRegMethod := pb.DnsRegMethod_DOH + + defaultDnsRegConf := pb.DnsRegConf{ + DnsRegMethod: &defaultDnsRegMethod, + Target: &defaultDnsRegDohUrl, + Domain: &defaultDnsRegDomain, + Pubkey: defaultDnsRegPubkey, + UtlsDistribution: &defaultDnsRegUtlsDistribution, + StunServer: &defaultStunServer, + } + + defaultClientConf := pb.ClientConf{ + DecoyList: &defaultDecoyList, + DefaultPubkey: &defaultPubKey, + ConjurePubkey: &defaultConjurePubKey, + Generation: &defaultGeneration, + DnsRegConf: &defaultDnsRegConf, + } + + assetsInstance = &assets{ + path: path, + config: &defaultClientConf, + filenameClientConf: "ClientConf", + socksAddr: "", + } + err := assetsInstance.readConfigs() + return err +} + +func (a *assets) GetAssetsDir() string { + a.RLock() + defer a.RUnlock() + return a.path +} + +func (a *assets) GetDNSRegConf() *pb.DnsRegConf { + a.RLock() + defer a.RUnlock() + return a.config.DnsRegConf +} + +func (a *assets) readConfigs() error { + readClientConf := func(filename string) error { + buf, err := os.ReadFile(filename) + if err != nil { + return err + } + clientConf := &pb.ClientConf{} + err = proto.Unmarshal(buf, clientConf) + if err != nil { + return err + } + a.config = clientConf + return nil + } + + var err error + log.Infoln("Assets: reading from folder " + a.path) + + // Parse ClientConf for Decoys and Phantoms List + clientConfFilename := path.Join(a.path, a.filenameClientConf) + err = readClientConf(clientConfFilename) + if err != nil { + log.Warn("Assets: failed to read ClientConf file: " + err.Error()) + } else { + log.Infof("Client config %d successfully read from %s", a.config.GetGeneration(), clientConfFilename) + } + + return err +} + +// Picks random decoy, returns Server Name Indication and addr in format ipv4:port +func (a *assets) GetDecoyAddress() (sni string, addr string) { + a.RLock() + defer a.RUnlock() + + decoys := a.config.GetDecoyList().GetTlsDecoys() + if len(decoys) == 0 { + return "", "" + } + decoyIndex := getRandInt(0, len(decoys)-1) + ip := make(net.IP, 4) + binary.BigEndian.PutUint32(ip, decoys[decoyIndex].GetIpv4Addr()) + //[TODO]{priority:winter-break}: what checks need to be done, and what's guaranteed? + addr = ip.To4().String() + ":443" + sni = decoys[decoyIndex].GetHostname() + return +} + +// Get all Decoys from ClientConf +func (a *assets) GetAllDecoys() []*pb.TLSDecoySpec { + return a.config.GetDecoyList().GetTlsDecoys() +} + +// Get all Decoys from ClientConf that have an IPv6 address +func (a *assets) GetV6Decoys() []*pb.TLSDecoySpec { + v6Decoys := make([]*pb.TLSDecoySpec, 0) + allDecoys := a.config.GetDecoyList().GetTlsDecoys() + + for _, decoy := range allDecoys { + if decoy.GetIpv6Addr() != nil { + v6Decoys = append(v6Decoys, decoy) + } + } + + return v6Decoys +} + +// Get all Decoys from ClientConf that have an IPv6 address +func (a *assets) GetV4Decoys() []*pb.TLSDecoySpec { + v6Decoys := make([]*pb.TLSDecoySpec, 0) + allDecoys := a.config.GetDecoyList().GetTlsDecoys() + + for _, decoy := range allDecoys { + if decoy.GetIpv4Addr() != 0 { + v6Decoys = append(v6Decoys, decoy) + } + } + + return v6Decoys +} + +// GetDecoy - Gets random DecoySpec +func (a *assets) GetDecoy() *pb.TLSDecoySpec { + a.RLock() + defer a.RUnlock() + + decoys := a.config.GetDecoyList().GetTlsDecoys() + chosenDecoy := &pb.TLSDecoySpec{} + if len(decoys) == 0 { + return chosenDecoy + } + decoyIndex := getRandInt(0, len(decoys)-1) + chosenDecoy = decoys[decoyIndex] + + //[TODO]{priority:soon} stop enforcing values >= defaults. + // Fix ackhole instead + // No value checks when using + if chosenDecoy.GetTimeout() < timeoutMin { + timeout := uint32(timeoutMax) + chosenDecoy.Timeout = &timeout + } + if chosenDecoy.GetTcpwin() < sendLimitMin { + tcpWin := uint32(sendLimitMax) + chosenDecoy.Tcpwin = &tcpWin + } + return chosenDecoy +} + +// GetDecoy - Gets random IPv6 DecoySpec +func (a *assets) GetV6Decoy() *pb.TLSDecoySpec { + a.RLock() + defer a.RUnlock() + + decoys := a.GetV6Decoys() + chosenDecoy := &pb.TLSDecoySpec{} + if len(decoys) == 0 { + return chosenDecoy + } + decoyIndex := getRandInt(0, len(decoys)-1) + chosenDecoy = decoys[decoyIndex] + + // No enforcing TCPWIN etc. values because this is conjure only + return chosenDecoy +} + +func (a *assets) GetPubkey() *[32]byte { + a.RLock() + defer a.RUnlock() + + var pKey [32]byte + copy(pKey[:], a.config.GetDefaultPubkey().GetKey()[:]) + return &pKey +} + +func (a *assets) GetConjurePubkey() *[32]byte { + a.RLock() + defer a.RUnlock() + + var pKey [32]byte + copy(pKey[:], a.config.GetConjurePubkey().GetKey()[:]) + return &pKey +} + +func (a *assets) GetGeneration() uint32 { + a.RLock() + defer a.RUnlock() + + return a.config.GetGeneration() +} + +// Set ClientConf generation and store config to disk +func (a *assets) SetGeneration(gen uint32) (err error) { + a.Lock() + defer a.Unlock() + + copyGen := gen + a.config.Generation = ©Gen + err = a.saveClientConf() + return +} + +// Set Public key and store config to disk +func (a *assets) SetPubkey(pubkey *pb.PubKey) (err error) { + a.Lock() + defer a.Unlock() + + a.config.DefaultPubkey = pubkey + err = a.saveClientConf() + return +} + +// Set ClientConf and store config to disk - if an error occurs (parse error or +// write to file error) the error will be logged and the update will be aborted. +func (a *assets) SetClientConf(conf *pb.ClientConf) (err error) { + a.Lock() + defer a.Unlock() + + origConf := a.config + a.config = conf + err = a.saveClientConf() + if err != nil { + a.config = origConf + } + return +} + +// Not goroutine-safe, use at your own risk +func (a *assets) GetClientConfPtr() *pb.ClientConf { + return a.config +} + +// Overwrite currently used decoys and store config to disk +func (a *assets) SetDecoys(decoys []*pb.TLSDecoySpec) (err error) { + a.Lock() + defer a.Unlock() + + if a.config.DecoyList == nil { + a.config.DecoyList = &pb.DecoyList{} + } + a.config.DecoyList.TlsDecoys = decoys + err = a.saveClientConf() + return +} + +// Checks if decoy is in currently used ClientConf decoys list +func (a *assets) IsDecoyInList(decoy *pb.TLSDecoySpec) bool { + ipv4str := decoy.GetIpAddrStr() + hostname := decoy.GetHostname() + a.RLock() + defer a.RUnlock() + for _, d := range a.config.GetDecoyList().GetTlsDecoys() { + if strings.Compare(d.GetHostname(), hostname) == 0 && + strings.Compare(d.GetIpAddrStr(), ipv4str) == 0 { + return true + } + } + return false +} + +func (a *assets) saveClientConf() error { + buf, err := proto.Marshal(a.config) + if err != nil { + return err + } + filename := path.Join(a.path, a.filenameClientConf) + tmpFilename := path.Join(a.path, "."+a.filenameClientConf+"."+getRandString(5)+".tmp") + err = os.WriteFile(tmpFilename, buf[:], 0644) + if err != nil { + return err + } + + return os.Rename(tmpFilename, filename) +} + +// SetStatsSocksAddr - Provide a socks address for reporting stats from the client in the form "addr:port" +func (a *assets) SetStatsSocksAddr(addr string) { + a.socksAddr = addr +} + +// GetPhantomSubnets - +func (a *assets) GetPhantomSubnets() *pb.PhantomSubnetsList { + a.RLock() + defer a.RUnlock() + + if a.config == nil { + return ps.GetDefaultPhantomSubnets() + } + + if phantomSubnetsList := a.config.GetPhantomSubnetsList(); phantomSubnetsList != nil { + return phantomSubnetsList + } + + return ps.GetDefaultPhantomSubnets() +} + +// SetPhantomSubnets - +func (a *assets) SetPhantomSubnets(subnetConf *pb.PhantomSubnetsList) error { + a.Lock() + defer a.Unlock() + + if a.config == nil { + a.config = &pb.ClientConf{} + } + + a.config.PhantomSubnetsList = subnetConf + + err := a.saveClientConf() + return err +} + +// Tries to get crypto random int in range [min, max] +// In case of crypto failure -- return insecure pseudorandom +func getRandInt(min int, max int) int { + // I can't believe Golang is making me do that + // Flashback to awful C/C++ libraries + diff := max - min + if diff < 0 { + // r.logger.Warningf("getRandInt(): max is less than min") + min = max + diff *= -1 + } else if diff == 0 { + return min + } + var v int64 + err := binary.Read(rand.Reader, binary.LittleEndian, &v) + if v < 0 { + v *= -1 + } + if err != nil { + // r.logger.Warningf("Unable to securely get getRandInt(): " + err.Error()) + v = mrand.Int63() + } + return min + int(v%int64(diff+1)) +} + +func getRandString(length int) string { + const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + randString := make([]byte, length) + for i := range randString { + randString[i] = alphabet[getRandInt(0, len(alphabet)-1)] + } + return string(randString) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/core/core.go b/vendor/github.com/refraction-networking/conjure/pkg/core/core.go new file mode 100644 index 000000000..6fa5fefb0 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/core/core.go @@ -0,0 +1,45 @@ +package core + +const ( + // PhantomSelectionMinGeneration + PhantomSelectionMinGeneration uint = 1 + + // PhantomHkdfMinVersion indicates the first version in which the Phantom selection was based on HKDF + PhantomHkdfMinVersion uint = 2 + + // RandomizeDstPortMinVersion is the earliest client library version ID that supports destination port randomization + RandomizeDstPortMinVersion uint = 3 + + // SharedKeysRefactorMinVersion + SharedKeysRefactorMinVersion uint = 4 +) + +// CurrentClientLibraryVersion returns the current client library version used +// for feature compatibility support between client and server. Currently I +// don't intend to connect this to the library tag version in any way. +// +// When adding new client versions comment out older versions and add new +// version below with a description of the reason for the new version. +func CurrentClientLibraryVersion() uint32 { + // Registration refactor extricates some (Decoy) registrar specific keys out of the shared + // keys object, changing the keys that get generated based on client version. + // https://github.com/refraction-networking/gotapdance/pull/131 + // https://github.com/refraction-networking/conjure/pull/202 + return 4 + + // // Support for randomizing destination port for phantom connection + // // https://github.com/refraction-networking/gotapdance/pull/108 + // return 3 + + // // Selection algorithm update - Oct 27, 2022 -- Phantom selection version rework again to use + // // hkdf for actual uniform distribution across phantom subnets. + // // https://github.com/refraction-networking/conjure/pull/145 + // return 2 + + // // Initial inclusion of client version - added due to update in phantom + // // selection algorithm that is not backwards compatible to older clients. + // return 1 + + // // No client version indicates any client before this change. + // return 0 +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/core/interfaces/interfaces.go b/vendor/github.com/refraction-networking/conjure/pkg/core/interfaces/interfaces.go new file mode 100644 index 000000000..2a658a86f --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/core/interfaces/interfaces.go @@ -0,0 +1,105 @@ +package interfaces + +import ( + "context" + "io" + "net" + + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +type dialFunc = func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) + +// Transport provides a generic interface for utilities that allow the client to dial and connect to +// a phantom address when creating a Conjure connection. +type Transport interface { + // Name returns a string identifier for the Transport for logging + Name() string + // String returns a string identifier for the Transport for logging (including string formatters) + String() string + + // ID provides an identifier that will be sent to the conjure station during the registration so + // that the station knows what transport to expect connecting to the chosen phantom. + ID() pb.TransportType + + // GetParams returns a generic protobuf with any parameters from both the registration and the + // transport. + GetParams() (proto.Message, error) + + // ParseParams gives the specific transport an option to parse a generic object into parameters + // provided by the station in the registration response during registration. + ParseParams(data *anypb.Any) (any, error) + + // SetParams allows the caller to set parameters associated with the transport, returning an + // error if the provided generic message is not compatible. + SetParams(any) error + + // SetSessionParams allows the session to apply updated params that are only used within an + // individual dial, returning an error if the provided generic message is not compatible. the + // variadic bool parameter is used to indicate whether the client should sanity check the params + // or just apply them. This is useful in cases where the registrar may provide options to the + // client that it is able to handle, but are outside of the clients sanity checks. (see prefix + // transport for an example) + SetSessionParams(incoming *anypb.Any, unchecked ...bool) error + + // Prepare lets the transport use the dialer to prepare. This is called before GetParams to let the + // transport prepare stuff such as nat traversal. + Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error + + // GetDstPort returns the destination port that the client should open the phantom connection with. + GetDstPort(seed []byte) (uint16, error) + + // PrepareKeys provides an opportunity for the transport to integrate the station public key + // as well as bytes from the deterministic random generator associated with the registration + // that this ClientTransport is attached to. + PrepareKeys(pubkey [32]byte, sharedSecret []byte, dRand io.Reader) error +} + +type WrappingTransport interface { + Transport + + // Connect returns a net.Conn connection given a context and ConjureReg + WrapConn(conn net.Conn) (net.Conn, error) +} + +type ConnectingTransport interface { + Transport + + WrapDial(dialer dialFunc) (dialFunc, error) + + DisableRegDelay() bool +} + +// Overrides makes it possible to treat an array of overrides as a single override note that the +// subsequent overrides are not aware of those that come before so they may end up undoing their +// changes. +type Overrides []RegOverride + +// Override implements the RegOverride interface. +func (o Overrides) Override(reg *pb.C2SWrapper, randReader io.Reader) error { + var err error + for _, override := range o { + err = override.Override(reg, randReader) + if err != nil { + return err + } + } + return nil +} + +// RegOverride provides a generic way for the station to mutate an incoming registration before +// handing it off to the stations or returning it to the client as part of the RegResponse protobuf. +type RegOverride interface { + Override(*pb.C2SWrapper, io.Reader) error +} + +// DNAT used by the station side DTLS transport implementation to warm up the DNAT table such that +// we are able to handle incoming client connections. +type DNAT interface { + AddEntry(clientAddr *net.IP, clientPort uint16, phantomIP *net.IP, phantomPort uint16) error +} + +// DnatBuilder function type alias for building a DNAT object +type DnatBuilder func() (DNAT, error) diff --git a/vendor/github.com/refraction-networking/conjure/pkg/core/keys.go b/vendor/github.com/refraction-networking/conjure/pkg/core/keys.go new file mode 100644 index 000000000..316951db7 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/core/keys.go @@ -0,0 +1,125 @@ +package core + +import ( + "crypto/hmac" + "crypto/rand" + "crypto/sha256" + "errors" + "io" + "strconv" + + pb "github.com/refraction-networking/conjure/proto" + "github.com/refraction-networking/ed25519/extra25519" + + "golang.org/x/crypto/curve25519" + "golang.org/x/crypto/hkdf" +) + +// ConjureSharedKeys contains keys that the station is required to keep. +type ConjureSharedKeys struct { + SharedSecret []byte + ConjureSeed []byte + + TransportReader io.Reader + TransportKeys interface{} +} + +// ConjureHMAC implements the hmak that can then be used for further hkdf key generation +func ConjureHMAC(key []byte, str string) []byte { + hash := hmac.New(sha256.New, key) + hash.Write([]byte(str)) + return hash.Sum(nil) +} + +// takes Station's Public Key +// returns Shared Secret, and Eligator Representative +func generateEligatorTransformedKey(stationPubkey []byte) ([]byte, []byte, error) { + if len(stationPubkey) != 32 { + return nil, nil, errors.New("Unexpected station pubkey length. Expected: 32." + + " Received: " + strconv.Itoa(len(stationPubkey)) + ".") + } + var sharedSecret, clientPrivate, clientPublic, representative [32]byte + for ok := false; !ok; { + var sliceKeyPrivate []byte = clientPrivate[:] + _, err := rand.Read(sliceKeyPrivate) + if err != nil { + return nil, nil, err + } + + ok = extra25519.ScalarBaseMult(&clientPublic, &representative, &clientPrivate) + } + var stationPubkeyByte32 [32]byte + copy(stationPubkeyByte32[:], stationPubkey) + s, err := curve25519.X25519(clientPrivate[:], stationPubkeyByte32[:]) + if err != nil { + return nil, nil, err + } + copy(sharedSecret[:], s[:]) + + // extra25519.ScalarBaseMult does not randomize most significant bit(sign of y_coord?) + // Other implementations of elligator may have up to 2 non-random bits. + // Here we randomize the bit, expecting it to be flipped back to 0 on station + randByte := make([]byte, 1) + _, err = rand.Read(randByte) + if err != nil { + return nil, nil, err + } + representative[31] |= (0xC0 & randByte[0]) + return sharedSecret[:], representative[:], nil +} + +// GenSharedKeys generates the keys requires to form a Conjure connection based on the SharedSecret +func GenSharedKeys(clientLibVer uint, sharedSecret []byte, tt pb.TransportType) (ConjureSharedKeys, error) { + var err error + cjHkdf := hkdf.New(sha256.New, sharedSecret, []byte("conjureconjureconjureconjure"), nil) + keys := ConjureSharedKeys{ + SharedSecret: sharedSecret, + ConjureSeed: make([]byte, 16), + } + + if clientLibVer < SharedKeysRefactorMinVersion { + l := 16 + 12 + 16 + 12 + 48 + buf := make([]byte, l) + // In older versions of the client these keys are not used by the station, but the bytes are + // drawn from the HKDF so we must do the same to ensure backwards compatible key generation. + // https://github.com/refraction-networking/conjure/pull/202 + if n, err := cjHkdf.Read(buf); err != nil || n != l { + return keys, err + } + } + if _, err := cjHkdf.Read(keys.ConjureSeed); err != nil { + return keys, err + } + + keys.TransportReader = cjHkdf + + return keys, err +} + +type SharedKeys struct { + SharedSecret, Representative []byte + ConjureSeed []byte + Reader io.Reader +} + +var conjureGeneralHkdfSalt = []byte("conjureconjureconjureconjure") + +func GenerateClientSharedKeys(pubkey [32]byte) (*SharedKeys, error) { + sharedSecret, representative, err := generateEligatorTransformedKey(pubkey[:]) + if err != nil { + return nil, err + } + + cjHkdf := hkdf.New(sha256.New, sharedSecret, conjureGeneralHkdfSalt, nil) + keys := &SharedKeys{ + SharedSecret: sharedSecret, + Representative: representative, + ConjureSeed: make([]byte, 16), + Reader: cjHkdf, + } + + if _, err := cjHkdf.Read(keys.ConjureSeed); err != nil { + return keys, err + } + return keys, err +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/config.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/config.go new file mode 100644 index 000000000..df24e09c7 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/config.go @@ -0,0 +1,18 @@ +package dtls + +import "net" + +type Config struct { + PSK []byte + SCTP SCTPType + Unordered bool + LogAuthFail func(*net.IP) + LogOther func(*net.IP) +} + +type SCTPType int + +const ( + ServerAccept SCTPType = iota + ClientOpen +) diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/dial.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/dial.go new file mode 100644 index 000000000..ade39c7d6 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/dial.go @@ -0,0 +1,83 @@ +package dtls + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "net" + + "github.com/pion/dtls/v2" + "github.com/pion/dtls/v2/pkg/protocol/handshake" +) + +// Dial creates a DTLS connection to the given network address using the given shared secret +func Dial(remoteAddr *net.UDPAddr, config *Config) (net.Conn, error) { + return DialWithContext(context.Background(), remoteAddr, config) +} + +// DialWithContext like Dial, but includes context for cancellation and timeouts. +func DialWithContext(ctx context.Context, remoteAddr *net.UDPAddr, config *Config) (net.Conn, error) { + conn, err := net.DialUDP("udp", nil, remoteAddr) + if err != nil { + return nil, err + } + + return ClientWithContext(ctx, conn, config) +} + +// Client establishes a DTLS connection using an existing connection and a seed. +func Client(conn net.Conn, config *Config) (net.Conn, error) { + return ClientWithContext(context.Background(), conn, config) +} + +// DialWithContext creates a DTLS connection to the given network address using the given shared secret +func ClientWithContext(ctx context.Context, conn net.Conn, config *Config) (net.Conn, error) { + clientCert, serverCert, err := certsFromSeed(config.PSK) + + if err != nil { + return nil, fmt.Errorf("error generating certs: %v", err) + } + + clientHelloRandom, err := clientHelloRandomFromSeed(config.PSK) + if err != nil { + return nil, fmt.Errorf("error generating client hello random: %v", err) + } + + verifyServerCertificate := func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { + if len(rawCerts) != 1 { + return fmt.Errorf("expected 1 peer certificate, got %v", len(rawCerts)) + } + + err := verifyCert(rawCerts[0], serverCert.Certificate[0]) + if err != nil { + return fmt.Errorf("error verifying server certificate: %v", err) + } + + return nil + } + + // Prepare the configuration of the DTLS connection + dtlsConf := &dtls.Config{ + Certificates: []tls.Certificate{*clientCert}, + ExtendedMasterSecret: dtls.RequireExtendedMasterSecret, + CustomClientHelloRandom: func() [handshake.RandomBytesLength]byte { return clientHelloRandom }, + + // We use VerifyPeerCertificate to authenticate the peer's certificate. This is necessary as Go's non-deterministic ECDSA signatures and hash comparison method for self-signed certificates can cause verification failure. + InsecureSkipVerify: true, + VerifyPeerCertificate: verifyServerCertificate, + } + + dtlsConn, err := dtls.ClientWithContext(ctx, conn, dtlsConf) + + if err != nil { + return nil, fmt.Errorf("error creating dtls connection: %v", err) + } + + wrappedConn, err := wrapSCTP(dtlsConn, config) + if err != nil { + return nil, err + } + + return wrappedConn, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go new file mode 100644 index 000000000..23bc9a1eb --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go @@ -0,0 +1,123 @@ +package dtls + +import ( + "bytes" + "net" + "sync/atomic" + "time" +) + +var maxMessageSize = 65535 + +type hbConn struct { + conn net.Conn + recvCh chan errBytes + waiting uint32 + hb []byte + timeout time.Duration +} + +type errBytes struct { + b []byte + err error +} + +// heartbeatServer listens for heartbeat over conn with config +func heartbeatServer(conn net.Conn, config *heartbeatConfig) (net.Conn, error) { + conf := validate(config) + + c := &hbConn{conn: conn, + recvCh: make(chan errBytes), + timeout: conf.Interval, + hb: conf.Heartbeat, + } + + atomic.StoreUint32(&c.waiting, 2) + + go c.recvLoop() + go c.hbLoop() + + return c, nil +} + +func (c *hbConn) hbLoop() { + for { + if atomic.LoadUint32(&c.waiting) == 0 { + c.conn.Close() + return + } + + atomic.StoreUint32(&c.waiting, 0) + time.Sleep(c.timeout) + } + +} + +func (c *hbConn) recvLoop() { + for { + // create a buffer to hold your data + buffer := make([]byte, maxMessageSize) + + n, err := c.conn.Read(buffer) + + if bytes.Equal(c.hb, buffer[:n]) { + atomic.AddUint32(&c.waiting, 1) + continue + } + + c.recvCh <- errBytes{buffer[:n], err} + } + +} + +func (c *hbConn) Close() error { + return c.conn.Close() +} + +func (c *hbConn) Write(b []byte) (n int, err error) { + return c.conn.Write(b) +} + +func (c *hbConn) Read(b []byte) (n int, err error) { + readBytes := <-c.recvCh + copy(b, readBytes.b) + + return len(readBytes.b), readBytes.err +} + +func (c *hbConn) LocalAddr() net.Addr { + return c.conn.LocalAddr() +} + +func (c *hbConn) RemoteAddr() net.Addr { + return c.conn.RemoteAddr() +} + +func (c *hbConn) SetDeadline(t time.Time) error { + return c.conn.SetDeadline(t) +} + +func (c *hbConn) SetReadDeadline(t time.Time) error { + return c.conn.SetReadDeadline(t) +} + +func (c *hbConn) SetWriteDeadline(t time.Time) error { + return c.conn.SetWriteDeadline(t) +} + +// heartbeatClient sends heartbeats over conn with config +func heartbeatClient(conn net.Conn, config *heartbeatConfig) error { + conf := validate(config) + go func() { + for { + _, err := conn.Write(conf.Heartbeat) + if err != nil { + return + } + + time.Sleep(conf.Interval / 2) + } + + }() + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeatConfig.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeatConfig.go new file mode 100644 index 000000000..ffef47cc5 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeatConfig.go @@ -0,0 +1,34 @@ +package dtls + +import "time" + +type heartbeatConfig struct { + + // Heartbeat is the payload to sent as the heartbeat + Heartbeat []byte + + // Interval is the checking interval of each heartbeat + Interval time.Duration +} + +func validate(conf *heartbeatConfig) heartbeatConfig { + if conf == nil { + return defaultConfig + } + c := *conf + + if c.Interval == 0 { + c.Interval = defaultConfig.Interval + } + + if c.Heartbeat == nil { + c.Heartbeat = defaultConfig.Heartbeat + } + + return c +} + +var defaultConfig = heartbeatConfig{ + Heartbeat: []byte("6v3jyM521GkBo1lsMyVLcRyzdZ7FKEM3"), + Interval: 30 * time.Second, +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go new file mode 100644 index 000000000..31753f4c4 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go @@ -0,0 +1,265 @@ +// SPDX-FileCopyrightText: 2023 The Pion community +// SPDX-License-Identifier: MIT + +package dtls + +import ( + "context" + "crypto/rand" + "crypto/tls" + "errors" + "fmt" + "net" + "sync" + + "github.com/pion/dtls/v2" + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "github.com/pion/transport/v2/udp" +) + +// Listen creates a listener and starts listening +func Listen(network string, laddr *net.UDPAddr, config *Config) (*Listener, error) { + lc := udp.ListenConfig{} + parent, err := lc.Listen(network, laddr) + if err != nil { + return nil, err + } + + return NewListener(parent, config) +} + +func (l *Listener) acceptLoop() { + // Prepare the configuration of the DTLS connection + config := &dtls.Config{ + ExtendedMasterSecret: dtls.RequireExtendedMasterSecret, + ClientAuth: dtls.RequireAnyClientCert, + GetCertificate: l.getCertificateFromClientHello, + VerifyConnection: l.verifyConnection, + InsecureSkipVerifyHello: true, + } + + for { + c, err := l.parent.Accept() + if err != nil { + continue + } + + go func() { + newDTLSConn, err := dtls.Server(c, config) + if err != nil { + switch addr := c.RemoteAddr().(type) { + case *net.UDPAddr: + l.logIP(err, &addr.IP) + case *net.TCPAddr: + l.logIP(err, &addr.IP) + case *net.IPAddr: + l.logIP(err, &addr.IP) + } + + return + } + + connState := newDTLSConn.ConnectionState() + connID := connState.RemoteRandomBytes() + + l.connMapMutex.RLock() + defer l.connMapMutex.RUnlock() + + acceptCh, ok := l.connMap[connID] + + if !ok { + return + } + + acceptCh <- newDTLSConn + }() + } +} + +func (l *Listener) logIP(err error, ip *net.IP) { + var terr *dtls.TemporaryError + if errors.As(err, &terr) { + l.logOther(ip) + } + l.logAuthFail(ip) +} + +// NewListener creates a DTLS listener which accepts connections from an inner Listener. +func NewListener(inner net.Listener, config *Config) (*Listener, error) { + // the default cert is only used for checking avaliable cipher suites + defaultCert, err := randomCertificate() + if err != nil { + return nil, fmt.Errorf("error generating default random cert: %v", err) + } + + newDTLSListner := Listener{ + parent: inner, + connMap: map[[handshake.RandomBytesLength]byte](chan net.Conn){}, + connToCert: map[[handshake.RandomBytesLength]byte]*certPair{}, + defaultCert: defaultCert, + logAuthFail: config.LogAuthFail, + logOther: config.LogOther, + } + + go newDTLSListner.acceptLoop() + + return &newDTLSListner, nil +} + +// Listener represents a DTLS Listener +type Listener struct { + parent net.Listener + connMap map[[handshake.RandomBytesLength]byte](chan net.Conn) + connMapMutex sync.RWMutex + connToCert map[[handshake.RandomBytesLength]byte]*certPair + connToCertMutex sync.RWMutex + defaultCert *tls.Certificate + logAuthFail func(*net.IP) + logOther func(*net.IP) +} + +// Close closes the listener. +// Any blocked Accept operations will be unblocked and return errors. +// Already Accepted connections are not closed. +func (l *Listener) Close() error { + return l.parent.Close() +} + +// Addr returns the listener's network address. +func (l *Listener) Addr() net.Addr { + return l.parent.Addr() +} + +func (l *Listener) verifyConnection(state *dtls.State) error { + + certs, ok := l.connToCert[state.RemoteRandomBytes()] + if !ok { + return fmt.Errorf("no matching certificate found with client hello random") + } + + if len(state.PeerCertificates) != 1 { + return fmt.Errorf("expected 1 peer certificate, got %v", len(state.PeerCertificates)) + } + + err := verifyCert(state.PeerCertificates[0], certs.clientCert.Certificate[0]) + if err != nil { + return fmt.Errorf("error verifying peer certificate: %v", err) + } + + return nil +} + +// Accept accepts a connection with shared secret +func (l *Listener) Accept(config *Config) (net.Conn, error) { + // Call the new function with a background context + return l.AcceptWithContext(context.Background(), config) +} + +// AcceptWithContext accepts a connection with shared secret, with a context +func (l *Listener) AcceptWithContext(ctx context.Context, config *Config) (net.Conn, error) { + clientCert, serverCert, err := certsFromSeed(config.PSK) + if err != nil { + return &dtls.Conn{}, fmt.Errorf("error generating certificatess from seed: %v", err) + } + + connID, err := clientHelloRandomFromSeed(config.PSK) + if err != nil { + return &dtls.Conn{}, err + } + + err = l.registerCert(connID, clientCert, serverCert) + if err != nil { + return nil, fmt.Errorf("error registering cert: %v", err) + } + defer l.removeCert(connID) + + connCh, err := l.registerChannel(connID) + if err != nil { + return nil, fmt.Errorf("error registering channel: %v", err) + } + defer l.removeChannel(connID) + + select { + case conn := <-connCh: + wrappedConn, err := wrapSCTP(conn, config) + if err != nil { + return nil, err + } + return wrappedConn, nil + case <-ctx.Done(): + return nil, ctx.Err() + } +} + +func (l *Listener) registerCert(connID [handshake.RandomBytesLength]byte, clientCert, serverCert *tls.Certificate) error { + l.connToCertMutex.Lock() + defer l.connToCertMutex.Unlock() + + if l.connToCert[connID] != nil { + return fmt.Errorf("seed already registered") + } + + l.connToCert[connID] = &certPair{clientCert: clientCert, serverCert: serverCert} + return nil +} + +func (l *Listener) removeCert(connID [handshake.RandomBytesLength]byte) { + l.connToCertMutex.Lock() + defer l.connToCertMutex.Unlock() + delete(l.connToCert, connID) +} + +func (l *Listener) registerChannel(connID [handshake.RandomBytesLength]byte) (<-chan net.Conn, error) { + l.connMapMutex.Lock() + defer l.connMapMutex.Unlock() + + if l.connMap[connID] != nil { + return nil, fmt.Errorf("seed already registered") + } + + connChan := make(chan net.Conn) + l.connMap[connID] = connChan + + return connChan, nil +} + +func (l *Listener) removeChannel(connID [handshake.RandomBytesLength]byte) { + l.connMapMutex.Lock() + defer l.connMapMutex.Unlock() + + delete(l.connMap, connID) +} + +func (l *Listener) getCertificateFromClientHello(clientHello *dtls.ClientHelloInfo) (*tls.Certificate, error) { + // This function is sometimes called by the dtls library to get the availiable ciphersuites, + // respond with a default certificate with the availible ciphersuites + if clientHello.CipherSuites == nil { + return l.defaultCert, nil + } + + l.connToCertMutex.RLock() + defer l.connToCertMutex.RUnlock() + + certs, ok := l.connToCert[clientHello.RandomBytes] + + if !ok { + // Respond with random server certificate if not registered, will reject client cert later during handshake + randomCert, err := randomCertificate() + if err != nil { + return nil, fmt.Errorf("failed to generate random certificate: %v", err) + } + + return randomCert, nil + } + + return certs.serverCert, nil +} + +func randomCertificate() (*tls.Certificate, error) { + seedBytes := []byte{} + _, err := rand.Read(seedBytes) + if err != nil { + return nil, err + } + return newCertificate(seedBytes) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/not1reader.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/not1reader.go new file mode 100644 index 000000000..37d72a2eb --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/not1reader.go @@ -0,0 +1,19 @@ +package dtls + +import ( + "io" +) + +type Not1Reader struct { + r io.Reader +} + +func (n1r *Not1Reader) Read(p []byte) (n int, err error) { + + if len(p) == 1 { + // err = io.EOF + return 1, nil + } + + return n1r.r.Read(p) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go new file mode 100644 index 000000000..b0f01fe2d --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go @@ -0,0 +1,259 @@ +package dtls + +import ( + "fmt" + "net" + "sync" + "time" + + "github.com/pion/logging" + "github.com/pion/sctp" +) + +// SCTPConn implements the net.Conn interface using sctp stream and DTLS conn +// +// SCTPConn buffers incoming SCTP messages, allowing the caller to use +// SCTPConn as a TCP-like bytes stream net.Conn, with reads smaller than +// individual message sizes. +type SCTPConn struct { + stream *sctp.Stream + conn net.Conn + maxMessageSize uint64 + + closeOnce sync.Once + closed chan struct{} + + write chan struct{} + + writeMutex sync.Mutex + + readMutex sync.Mutex + readBuffer []byte + readOffset int + readLength int + readErr error +} + +// Limit for write flow control. This value should provide good performance +// while also strictly limiting sctp.Conn packet buffer sizes on +// limited-memory environments, such as iOS network extensions. +const ( + writeMaxBufferedAmount uint64 = 256 * 1024 +) + +func newSCTPConn(stream *sctp.Stream, conn net.Conn, maxMessageSize uint64) *SCTPConn { + + s := &SCTPConn{ + stream: stream, + conn: conn, + maxMessageSize: maxMessageSize, + closed: make(chan struct{}), + write: make(chan struct{}, 1), + readBuffer: make([]byte, maxMessageSize), + } + + // Initialize write flow control, without which the underlying sctp.Client + // may buffer an unbounded number of outbound packets, potentially + // exceeding process memory limits, if the rate of write calls exceeds + // the rate of sending packets. See: + // + // - https://github.com/pion/webrtc/tree/master/examples/data-channels-flow-control#when-do-we-need-it + // - https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/commit/ea01c92cf1a9a13c1058b377ec547b43dfc164e1 + + stream.SetBufferedAmountLowThreshold(writeMaxBufferedAmount / 2) + stream.OnBufferedAmountLow(func() { + select { + case s.write <- struct{}{}: + default: + } + }) + + return s +} + +func (s *SCTPConn) Close() error { + + // Unblock any write blocked due to flow control. + + s.closeOnce.Do(func() { close(s.closed) }) + + err := s.stream.Close() + if err != nil { + return err + } + return s.conn.Close() +} + +func (s *SCTPConn) Write(b []byte) (int, error) { + + writeLen := uint64(len(b)) + + // Skip 0-byte writes, which are normally a no-op on a TCP-like net.Conn. + // pion/sctp should skip 0-byte writes, and it appears that it doesn't + // enqueue any packets, but it does increment a sequence number + // (see links). Testing indicates that the underlying connection stalls + // after a 0-byte write. + // + // - https://github.com/pion/sctp/blob/v1.8.8/stream.go#L254-L278 + // - https://github.com/pion/sctp/blob/v1.8.8/stream.go#L280-L336 + + if writeLen == 0 { + return 0, nil + } + + // Fail if the write exceeds the maximum buffered amount (taking into + // consideration that a write will proceed as long as at most + // writeMaxBufferedAmount/2 bytes are already buffered). In this case, + // SCTPConn will not behave the same as a TCP-like net.Conn, which has no + // such limit, but this limit is not likely to be hit in practise. + + if writeLen > writeMaxBufferedAmount/2 { + return 0, fmt.Errorf("write limit exceeded") + } + + // Perform write flow control. If the current amount of buffered send + // packets exceeds the limit, block until the amount drops or the conn is + // closed. + + s.writeMutex.Lock() + defer s.writeMutex.Unlock() + if s.stream.BufferedAmount()+writeLen > writeMaxBufferedAmount { + select { + case <-s.closed: + return 0, fmt.Errorf("closed") + case <-s.write: + } + } + + return s.stream.Write(b) +} + +func (s *SCTPConn) Read(b []byte) (int, error) { + + // As SCTP is a message stream and not a byte stream, sctp.Stream.Read + // will fail with "short buffer" if SCTPConn.Read is invoked with a read + // buffer smaller than the next read message. To accomodate callers + // expecting TCP-like byte stream behavior, where each read can be for as + // little as 1 byte, buffer each read message to support shorter reads. + // + // As per https://pkg.go.dev/io#Reader, bytes read are returned even when + // the underlying read returns an error; the error value is stored and + // returned with the read call that consumes the last byte of the message. + + s.readMutex.Lock() + defer s.readMutex.Unlock() + + if s.readOffset == s.readLength { + + // Bypass the intermediate buffer if the caller provides a + // sufficiently large read buffer. + if uint64(len(b)) >= s.maxMessageSize { + return s.stream.Read(b) + } + + n, err := s.stream.Read(s.readBuffer) + s.readOffset = 0 + s.readLength = n + s.readErr = err + } + + n := copy(b, s.readBuffer[s.readOffset:s.readLength]) + s.readOffset += n + + var err error + if s.readOffset == s.readLength { + err = s.readErr + } + + return n, err +} + +func (s *SCTPConn) LocalAddr() net.Addr { + return s.conn.LocalAddr() +} + +func (s *SCTPConn) RemoteAddr() net.Addr { + return s.conn.RemoteAddr() +} + +func (s *SCTPConn) SetDeadline(t time.Time) error { + return s.conn.SetDeadline(t) +} + +func (s *SCTPConn) SetWriteDeadline(t time.Time) error { + return s.conn.SetWriteDeadline(t) +} + +func (s *SCTPConn) SetReadDeadline(t time.Time) error { + return s.stream.SetReadDeadline(t) +} + +func openSCTP(conn net.Conn, unordered bool) (net.Conn, error) { + // Start SCTP + sctpConf := sctp.Config{ + NetConn: conn, + LoggerFactory: logging.NewDefaultLoggerFactory(), + } + + sctpClient, err := sctp.Client(sctpConf) + + if err != nil { + return nil, fmt.Errorf("error creating sctp client: %v", err) + } + + sctpStream, err := sctpClient.OpenStream(0, sctp.PayloadTypeWebRTCString) + + if err != nil { + return nil, fmt.Errorf("error setting up stream: %v", err) + } + + sctpStream.SetReliabilityParams(unordered, sctp.ReliabilityTypeReliable, 0) + + sctpConn := newSCTPConn(sctpStream, conn, uint64(sctpClient.MaxMessageSize())) + + err = heartbeatClient(sctpConn, &heartbeatConfig{Interval: 10 * time.Second}) + if err != nil { + return nil, fmt.Errorf("error opening heartbeat client: %v", err) + } + + return sctpConn, nil +} + +func acceptSCTP(conn net.Conn, unordered bool) (net.Conn, error) { + + // Start SCTP over DTLS connection + sctpConfig := sctp.Config{ + NetConn: conn, + LoggerFactory: logging.NewDefaultLoggerFactory(), + } + + sctpServer, err := sctp.Server(sctpConfig) + if err != nil { + return nil, err + } + + sctpStream, err := sctpServer.AcceptStream() + if err != nil { + return nil, err + } + + sctpStream.SetReliabilityParams(unordered, sctp.ReliabilityTypeReliable, 0) + + sctpConn := newSCTPConn(sctpStream, conn, uint64(sctpServer.MaxMessageSize())) + + heartbeatConn, err := heartbeatServer(sctpConn, nil) + if err != nil { + return nil, fmt.Errorf("error starting heartbeat server: %v", err) + } + + return heartbeatConn, nil + +} + +func wrapSCTP(conn net.Conn, config *Config) (net.Conn, error) { + if config.SCTP == ServerAccept { + return acceptSCTP(conn, config.Unordered) + } + + return openSCTP(conn, config.Unordered) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go new file mode 100644 index 000000000..4caee99e8 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go @@ -0,0 +1,124 @@ +package dtls + +//Adapted from https://github.com/gaukas/seed2sdp/blob/master/dtlsCertificate.go + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/hex" + "fmt" + "io" + "math/big" + "time" + + "github.com/pion/dtls/v2/pkg/protocol/handshake" + "golang.org/x/crypto/hkdf" +) + +func clientHelloRandomFromSeed(seed []byte) ([handshake.RandomBytesLength]byte, error) { + randSource := hkdf.New(sha256.New, seed, nil, nil) + randomBytes := [handshake.RandomBytesLength]byte{} + + _, err := io.ReadFull(randSource, randomBytes[:]) + if err != nil { + return [handshake.RandomBytesLength]byte{}, err + } + + return randomBytes, nil +} + +// getPrivkey creates ECDSA private key used in DTLS Certificates +func getPrivkey(seed []byte) (*ecdsa.PrivateKey, error) { + randSource := hkdf.New(sha256.New, seed, nil, nil) + + privkey, err := ecdsa.GenerateKey(elliptic.P256(), &Not1Reader{r: randSource}) + if err != nil { + return &ecdsa.PrivateKey{}, err + } + return privkey, nil +} + +// getX509Tpl creates x509 template for x509 Certificates generation used in DTLS Certificates. +func getX509Tpl(seed []byte) (*x509.Certificate, error) { + randSource := hkdf.New(sha256.New, seed, nil, nil) + + maxBigInt := new(big.Int) + maxBigInt.Exp(big.NewInt(2), big.NewInt(130), nil).Sub(maxBigInt, big.NewInt(1)) + serialNumber, err := rand.Int(randSource, maxBigInt) + if err != nil { + return &x509.Certificate{}, err + } + + // Make the Certificate valid from UTC today till next month. + utcNow := time.Now().UTC() + validFrom := time.Date(utcNow.Year(), utcNow.Month(), utcNow.Day(), 0, 0, 0, 0, time.UTC) + validUntil := validFrom.AddDate(0, 1, 0) + + // random CN + cnBytes := make([]byte, 8) + _, err = io.ReadFull(randSource, cnBytes) + if err != nil { + return &x509.Certificate{}, fmt.Errorf("failed to generate common name: %w", err) + } + cn := hex.EncodeToString(cnBytes) + + return &x509.Certificate{ + ExtKeyUsage: []x509.ExtKeyUsage{ + x509.ExtKeyUsageClientAuth, + x509.ExtKeyUsageServerAuth, + }, + BasicConstraintsValid: true, + NotBefore: validFrom, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + NotAfter: validUntil, + SerialNumber: serialNumber, + SignatureAlgorithm: x509.ECDSAWithSHA256, + Version: 2, + Subject: pkix.Name{CommonName: cn}, + DNSNames: []string{cn}, + IsCA: true, + }, nil +} + +func newCertificate(seed []byte) (*tls.Certificate, error) { + privkey, err := getPrivkey(seed) + if err != nil { + return &tls.Certificate{}, err + } + + tpl, err := getX509Tpl(seed) + if err != nil { + return &tls.Certificate{}, err + } + + randSource := hkdf.New(sha256.New, seed, nil, nil) + + certDER, err := x509.CreateCertificate(randSource, tpl, tpl, privkey.Public(), privkey) + if err != nil { + return &tls.Certificate{}, err + } + + return &tls.Certificate{ + Certificate: [][]byte{certDER}, + PrivateKey: privkey, + }, nil +} + +func certsFromSeed(seed []byte) (*tls.Certificate, *tls.Certificate, error) { + clientCert, err := newCertificate(seed) + if err != nil { + return &tls.Certificate{}, &tls.Certificate{}, fmt.Errorf("error generate cert: %v", err) + } + + // serverCert, err := newCertificate(seed) + // if err != nil { + // return &tls.Certificate{}, &tls.Certificate{}, fmt.Errorf("error generate cert: %v", err) + // } + + return clientCert, clientCert, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/server.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/server.go new file mode 100644 index 000000000..82a4b2c20 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/server.go @@ -0,0 +1,80 @@ +package dtls + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "net" + + "github.com/pion/dtls/v2" +) + +type certPair struct { + clientCert *tls.Certificate + serverCert *tls.Certificate +} + +// Server establishes DTLS connection on the given conn using the sharedSecert +func Server(conn net.Conn, config *Config) (net.Conn, error) { + return ServerWithContext(context.Background(), conn, config) +} + +// ServerWithContext establishes DTLS connection on the given conn using the sharedSecert and context +func ServerWithContext(ctx context.Context, conn net.Conn, config *Config) (net.Conn, error) { + + clientCert, serverCert, err := certsFromSeed(config.PSK) + if err != nil { + return nil, fmt.Errorf("error generating certificatess from seed: %v", err) + } + + VerifyPeerCertificate := func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { + + err := verifyCert(rawCerts[0], clientCert.Certificate[0]) + if err != nil { + return fmt.Errorf("error verifying peer certificate: %v", err) + } + + return nil + } + + dtlsConf := &dtls.Config{ + ExtendedMasterSecret: dtls.RequireExtendedMasterSecret, + ClientAuth: dtls.RequireAnyClientCert, + Certificates: []tls.Certificate{*serverCert}, + VerifyPeerCertificate: VerifyPeerCertificate, + InsecureSkipVerifyHello: true, + } + + dtlsConn, err := dtls.ServerWithContext(ctx, conn, dtlsConf) + if err != nil { + return nil, err + } + + wrappedConn, err := wrapSCTP(dtlsConn, config) + if err != nil { + return nil, err + } + + return wrappedConn, nil +} + +func verifyCert(cert, correct []byte) error { + incommingCert, err := x509.ParseCertificate(cert) + if err != nil { + return fmt.Errorf("error parsing peer certificate: %v", err) + } + + correctCert, err := x509.ParseCertificate(correct) + if err != nil { + return fmt.Errorf("error parsing correct certificate: %v", err) + } + + correctCert.KeyUsage = x509.KeyUsageCertSign // CheckSignature have requirements for the KeyUsage field + err = incommingCert.CheckSignatureFrom(correctCert) + if err != nil { + return fmt.Errorf("error verifying certificate signature: %v", err) + } + + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/phantoms/compat.go b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/compat.go new file mode 100644 index 000000000..32a6d6a8e --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/compat.go @@ -0,0 +1,244 @@ +package phantoms + +import ( + "encoding/binary" + "errors" + "fmt" + "math/big" + mrand "math/rand" + "net" + "time" + + wr "github.com/mroth/weightedrand" + pb "github.com/refraction-networking/conjure/proto" +) + +// getSubnetsVarint - return EITHER all subnet strings as one composite array if +// we are selecting unweighted, or return the array associated with the (seed) +// selected array of subnet strings based on the associated weights +// +// Used by Client version 0 and 1 +func (sc *SubnetConfig) getSubnetsVarint(seed []byte, weighted bool) ([]*phantomNet, error) { + + if weighted { + // seed random with hkdf derived seed provided by client + seedInt, n := binary.Varint(seed) + if n == 0 { + return nil, fmt.Errorf("failed to seed random for weighted rand") + } + + // nolint:staticcheck // here for backwards compatibility with clients + mrand.Seed(seedInt) + + choices := make([]wr.Choice, 0, len(sc.WeightedSubnets)) + for _, cjSubnet := range sc.WeightedSubnets { + cjSubnet := cjSubnet // copy loop ptr + choices = append(choices, wr.Choice{Item: cjSubnet, Weight: uint(cjSubnet.GetWeight())}) + } + c, err := wr.NewChooser(choices...) + if err != nil { + return nil, err + } + + return parseSubnets(c.Pick().(*pb.PhantomSubnets)) + + } + + // Use unweighted config for subnets, concat all into one array and return. + out := []*phantomNet{} + for _, cjSubnet := range sc.WeightedSubnets { + nets, err := parseSubnets(cjSubnet) + if err != nil { + return nil, fmt.Errorf("error parsing subnet: %v", err) + } + out = append(out, nets...) + } + + return out, nil +} + +// selectPhantomImplVarint - select an ip address from the list of subnets +// associated with the specified generation by constructing a set of start and +// end values for the high and low values in each allocation. The random number +// is then bound between the global min and max of that set. This ensures that +// addresses are chosen based on the number of addresses in the subnet. +func selectPhantomImplVarint(seed []byte, subnets []*phantomNet) (*PhantomIP, error) { + type idNet struct { + min, max big.Int + net *phantomNet + } + var idNets []idNet + + // Compose a list of ID Nets with min, max and network associated and count + // the total number of available addresses. + addressTotal := big.NewInt(0) + for _, _net := range subnets { + netMaskOnes, _ := _net.Mask.Size() + if ipv4net := _net.IP.To4(); ipv4net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(32-netMaskOnes)), nil)) + _idNet.max.Sub(addressTotal, big.NewInt(1)) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else if ipv6net := _net.IP.To16(); ipv6net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(128-netMaskOnes)), nil)) + _idNet.max.Sub(addressTotal, big.NewInt(1)) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else { + return nil, fmt.Errorf("failed to parse %v", _net) + } + } + + // If the total number of addresses is 0 something has gone wrong + if addressTotal.Cmp(big.NewInt(0)) <= 0 { + return nil, ErrLegacyAddrSelectBug + } + + // Pick a value using the seed in the range of between 0 and the total + // number of addresses. + id := &big.Int{} + id.SetBytes(seed) + if id.Cmp(addressTotal) >= 0 { + id.Mod(id, addressTotal) + } + + // Find the network (ID net) that contains our random value and select a + // random address from that subnet. + // min >= id%total >= max + var result *PhantomIP + for _, _idNet := range idNets { + // fmt.Printf("tot:%s, seed%%tot:%s id cmp max: %d, id cmp min: %d %s\n", addressTotal.String(), id, _idNet.max.Cmp(id), _idNet.min.Cmp(id), _idNet.net.String()) + if _idNet.max.Cmp(id) >= 0 && _idNet.min.Cmp(id) <= 0 { + res, err := SelectAddrFromSubnet(seed, _idNet.net.IPNet) + if err != nil { + return nil, fmt.Errorf("failed to chose IP address: %v", err) + } + + result = &PhantomIP{ip: &res, supportRandomPort: _idNet.net.supportRandomPort} + } + } + + // We want to make it so this CANNOT happen + if result == nil { + return nil, errors.New("nil result should not be possible") + } + return result, nil +} + +// selectPhantomImplV0 implements support for the legacy (buggy) client phantom +// address selection algorithm. +func selectPhantomImplV0(seed []byte, subnets []*phantomNet) (*PhantomIP, error) { + + addressTotal := big.NewInt(0) + + type idNet struct { + min, max big.Int + net *phantomNet + } + var idNets []idNet + + for _, _net := range subnets { + netMaskOnes, _ := _net.Mask.Size() + if ipv4net := _net.IP.To4(); ipv4net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(32-netMaskOnes)), nil)) + addressTotal.Sub(addressTotal, big.NewInt(1)) + _idNet.max.Set(addressTotal) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else if ipv6net := _net.IP.To16(); ipv6net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(128-netMaskOnes)), nil)) + addressTotal.Sub(addressTotal, big.NewInt(1)) + _idNet.max.Set(addressTotal) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else { + return nil, fmt.Errorf("failed to parse %v", _net) + } + } + + if addressTotal.Cmp(big.NewInt(0)) <= 0 { + return nil, ErrLegacyMissingAddrs + } + + id := &big.Int{} + id.SetBytes(seed) + if id.Cmp(addressTotal) > 0 { + id.Mod(id, addressTotal) + } + + var result *PhantomIP + for _, _idNet := range idNets { + if _idNet.max.Cmp(id) >= 0 && _idNet.min.Cmp(id) == -1 { + res, err := SelectAddrFromSubnet(seed, _idNet.net.IPNet) + if err != nil { + return nil, fmt.Errorf("failed to chose IP address: %v", err) + } + result = &PhantomIP{ip: &res, supportRandomPort: _idNet.net.supportRandomPort} + } + } + if result == nil { + return nil, ErrLegacyV0SelectionBug + } + return result, nil +} + +// SelectAddrFromSubnet - given a seed and a CIDR block choose an address. +// +// This is done by generating a seeded random bytes up to the length of the full +// address then using the net mask to zero out any bytes that are already +// specified by the CIDR block. Tde masked random value is then added to the +// cidr block base giving the final randomly selected address. +func SelectAddrFromSubnet(seed []byte, net1 *net.IPNet) (net.IP, error) { + bits, addrLen := net1.Mask.Size() + + ipBigInt := &big.Int{} + if v4net := net1.IP.To4(); v4net != nil { + ipBigInt.SetBytes(net1.IP.To4()) + } else if v6net := net1.IP.To16(); v6net != nil { + ipBigInt.SetBytes(net1.IP.To16()) + } + + seedInt, n := binary.Varint(seed) + if n == 0 { + return nil, fmt.Errorf("failed to create seed ") + } + + // nolint:staticcheck // here for backwards compatibility with clients + mrand.Seed(seedInt) + randBytes := make([]byte, addrLen/8) + + // nolint:staticcheck // here for backwards compatibility with clients + _, err := mrand.Read(randBytes) + if err != nil { + return nil, err + } + randBigInt := &big.Int{} + randBigInt.SetBytes(randBytes) + + mask := make([]byte, addrLen/8) + for i := 0; i < addrLen/8; i++ { + mask[i] = 0xff + } + maskBigInt := &big.Int{} + maskBigInt.SetBytes(mask) + maskBigInt.Rsh(maskBigInt, uint(bits)) + + randBigInt.And(randBigInt, maskBigInt) + ipBigInt.Add(ipBigInt, randBigInt) + + return net.IP(ipBigInt.Bytes()), nil +} + +func init() { + // NOTE: math/rand is only used for backwards compatibility. + // nolint:staticcheck + mrand.Seed(time.Now().UnixNano()) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantom_selector.go b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantom_selector.go new file mode 100644 index 000000000..066a1e783 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantom_selector.go @@ -0,0 +1,189 @@ +package phantoms + +import ( + "crypto/rand" + "crypto/sha256" + "errors" + "fmt" + "math/big" + "net" + "sort" + + pb "github.com/refraction-networking/conjure/proto" + "golang.org/x/crypto/hkdf" +) + +var ( + // ErrLegacyAddrSelectBug indicates that we have hit a corner case in a legacy address selection + // algorithm that causes phantom address selection to fail. + ErrLegacyAddrSelectBug = errors.New("no valid addresses specified") + ErrLegacyMissingAddrs = errors.New("No valid addresses specified") + ErrLegacyV0SelectionBug = errors.New("let's rewrite the phantom address selector") + + // ErrMissingAddrs indicates that no subnets were provided with addresses to select from. This + // is only valid for phantomHkdfMinVersion and newer. + ErrMissingAddrs = errors.New("no valid addresses specified to select") +) + +// getSubnetsHkdf returns EITHER all subnet strings as one composite array if +// we are selecting unweighted, or return the array associated with the (seed) +// selected array of subnet strings based on the associated weights. Random +// values are seeded using an hkdf function to prevent biases introduced by +// math/rand and varint. +// +// Used by Client version 2+ +func getSubnetsHkdf(sc genericSubnetConfig, seed []byte, weighted bool) ([]*phantomNet, error) { + + weightedSubnets := sc.GetWeightedSubnets() + if weightedSubnets == nil { + return []*phantomNet{}, nil + } + + if weighted { + choices := make([]*pb.PhantomSubnets, 0, len(weightedSubnets)) + + totWeight := int64(0) + for _, cjSubnet := range weightedSubnets { + cjSubnet := cjSubnet // copy loop ptr + weight := cjSubnet.GetWeight() + subnets := cjSubnet.GetSubnets() + if subnets == nil { + continue + } + + totWeight += int64(weight) + choices = append(choices, cjSubnet) + } + + // Sort choices ascending + sort.Slice(choices, func(i, j int) bool { + return choices[i].GetWeight() < choices[j].GetWeight() + }) + + // Naive method: get random int, subtract from weights until you are < 0 + hkdfReader := hkdf.New(sha256.New, seed, nil, []byte("phantom-select-subnet")) + totWeightBig := big.NewInt(totWeight) + rndBig, err := rand.Int(hkdfReader, totWeightBig) + if err != nil { + return nil, err + } + + // Decrement rnd by each weight until it's < 0 + rnd := rndBig.Int64() + for _, choice := range choices { + rnd -= int64(choice.GetWeight()) + if rnd < 0 { + return parseSubnets(choice) + } + } + + } + + // Use unweighted config for subnets, concat all into one array and return. + out := []*phantomNet{} + for _, cjSubnet := range weightedSubnets { + nets, err := parseSubnets(cjSubnet) + if err != nil { + return nil, fmt.Errorf("error parsing subnet: %v", err) + } + out = append(out, nets...) + } + + return out, nil +} + +func selectPhantomImplHkdf(seed []byte, subnets []*phantomNet) (*PhantomIP, error) { + type idNet struct { + min, max big.Int + net *phantomNet + } + var idNets []idNet + + // Compose a list of ID Nets with min, max and network associated and count + // the total number of available addresses. + addressTotal := big.NewInt(0) + for _, _net := range subnets { + netMaskOnes, _ := _net.Mask.Size() + if ipv4net := _net.IP.To4(); ipv4net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(32-netMaskOnes)), nil)) + _idNet.max.Sub(addressTotal, big.NewInt(1)) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else if ipv6net := _net.IP.To16(); ipv6net != nil { + _idNet := idNet{} + _idNet.min.Set(addressTotal) + addressTotal.Add(addressTotal, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(128-netMaskOnes)), nil)) + _idNet.max.Sub(addressTotal, big.NewInt(1)) + _idNet.net = _net + idNets = append(idNets, _idNet) + } else { + return nil, fmt.Errorf("failed to parse %v", _net) + } + } + + // If the total number of addresses is 0 something has gone wrong + if addressTotal.Cmp(big.NewInt(0)) <= 0 { + return nil, ErrMissingAddrs + } + + // Pick a value using the seed in the range of between 0 and the total + // number of addresses. + hkdfReader := hkdf.New(sha256.New, seed, nil, []byte("phantom-addr-id")) + id, err := rand.Int(hkdfReader, addressTotal) + if err != nil { + return nil, err + } + + // Find the network (ID net) that contains our random value and select a + // random address from that subnet. + // min >= id%total >= max + var result *PhantomIP + for _, _idNet := range idNets { + // fmt.Printf("tot:%s, seed%%tot:%s id cmp max: %d, id cmp min: %d %s\n", addressTotal.String(), id, _idNet.max.Cmp(id), _idNet.min.Cmp(id), _idNet.net.String()) + if _idNet.max.Cmp(id) >= 0 && _idNet.min.Cmp(id) <= 0 { + + var offset big.Int + offset.Sub(id, &_idNet.min) + result, err = selectAddrFromSubnetOffset(_idNet.net, &offset) + if err != nil { + return nil, fmt.Errorf("failed to chose IP address: %v", err) + } + } + } + + // We want to make it so this CANNOT happen + if result == nil { + return nil, errors.New("nil result should not be possible") + } + return result, nil +} + +// selectAddrFromSubnetOffset given a CIDR block and offset, return the net.IP +// +// Version 2: HKDF-based +func selectAddrFromSubnetOffset(net1 *phantomNet, offset *big.Int) (*PhantomIP, error) { + bits, addrLen := net1.Mask.Size() + + // Compute network size (e.g. an ipv4 /24 is 2^(32-24) + var netSize big.Int + netSize.Exp(big.NewInt(2), big.NewInt(int64(addrLen-bits)), nil) + + // Check that offset is within this subnet + if netSize.Cmp(offset) <= 0 { + return nil, errors.New("offset too big for subnet") + } + + ipBigInt := &big.Int{} + if v4net := net1.IP.To4(); v4net != nil { + ipBigInt.SetBytes(net1.IP.To4()) + } else if v6net := net1.IP.To16(); v6net != nil { + ipBigInt.SetBytes(net1.IP.To16()) + } + + ipBigInt.Add(ipBigInt, offset) + ip := net.IP(ipBigInt.Bytes()) + + return &PhantomIP{ip: &ip, supportRandomPort: net1.supportRandomPort}, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantoms.go b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantoms.go new file mode 100644 index 000000000..7d64c717f --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/phantoms.go @@ -0,0 +1,173 @@ +package phantoms + +import ( + "fmt" + "net" + + pb "github.com/refraction-networking/conjure/proto" +) + +type phantomNet struct { + *net.IPNet + supportRandomPort bool +} + +func (p *phantomNet) SupportRandomPort() bool { + return p.supportRandomPort +} + +type genericSubnetConfig interface { + GetWeightedSubnets() []*pb.PhantomSubnets +} + +// getSubnets - return EITHER all subnet strings as one composite array if we are +// selecting unweighted, or return the array associated with the (seed) selected +// array of subnet strings based on the associated weights +func getSubnets(sc genericSubnetConfig, seed []byte, weighted bool) ([]*phantomNet, error) { + return getSubnetsHkdf(sc, seed, weighted) +} + +// SubnetFilter - Filter IP subnets based on whatever to prevent specific subnets from +// +// inclusion in choice. See v4Only and v6Only for reference. +type SubnetFilter func([]*phantomNet) ([]*phantomNet, error) + +// V4Only - a functor for transforming the subnet list to only include IPv4 subnets +func V4Only(obj []*phantomNet) ([]*phantomNet, error) { + out := []*phantomNet{} + + for _, _net := range obj { + if ipv4net := _net.IP.To4(); ipv4net != nil { + out = append(out, _net) + } + } + return out, nil +} + +// V6Only - a functor for transforming the subnet list to only include IPv6 subnets +func V6Only(obj []*phantomNet) ([]*phantomNet, error) { + out := []*phantomNet{} + + for _, _net := range obj { + if _net.IP == nil { + continue + } + if net := _net.IP.To4(); net != nil { + continue + } + out = append(out, _net) + } + return out, nil +} + +func parseSubnets(phantomSubnet *pb.PhantomSubnets) ([]*phantomNet, error) { + subnets := []*phantomNet{} + + if len(phantomSubnet.GetSubnets()) == 0 { + return nil, fmt.Errorf("parseSubnets - no subnets provided") + } + + for _, strNet := range phantomSubnet.GetSubnets() { + parsedNet, err := parseSubnet(strNet) + if err != nil { + return nil, err + } + + subnets = append(subnets, &phantomNet{IPNet: parsedNet, supportRandomPort: phantomSubnet.GetRandomizeDstPort()}) + } + + return subnets, nil +} + +func parseSubnet(phantomSubnet string) (*net.IPNet, error) { + _, parsedNet, err := net.ParseCIDR(phantomSubnet) + if err != nil { + return nil, err + } + if parsedNet == nil { + return nil, fmt.Errorf("failed to parse %v as subnet", parsedNet) + } + + return parsedNet, nil +} + +// selectIPAddr selects an ip address from the list of subnets associated +// with the specified generation by constructing a set of start and end values +// for the high and low values in each allocation. The random number is then +// bound between the global min and max of that set. This ensures that +// addresses are chosen based on the number of addresses in the subnet. +func selectIPAddr(seed []byte, subnets []*phantomNet) (*PhantomIP, error) { + return selectPhantomImplHkdf(seed, subnets) +} + +// SelectPhantom - select one phantom IP address based on shared secret +func SelectPhantom(seed []byte, subnetsList *pb.PhantomSubnetsList, transform SubnetFilter, weighted bool) (*PhantomIP, error) { + + s, err := getSubnets(subnetsList, seed, weighted) + if err != nil { + return nil, fmt.Errorf("failed to parse subnets: %v", err) + } + + if transform != nil { + s, err = transform(s) + if err != nil { + return nil, err + } + } + + return selectIPAddr(seed, s) +} + +// SelectPhantomUnweighted - select one phantom IP address based on shared secret +func SelectPhantomUnweighted(seed []byte, subnets *pb.PhantomSubnetsList, transform SubnetFilter) (*PhantomIP, error) { + return SelectPhantom(seed, subnets, transform, false) +} + +// SelectPhantomWeighted - select one phantom IP address based on shared secret +func SelectPhantomWeighted(seed []byte, subnets *pb.PhantomSubnetsList, transform SubnetFilter) (*PhantomIP, error) { + return SelectPhantom(seed, subnets, transform, true) +} + +// GetDefaultPhantomSubnets implements the +func GetDefaultPhantomSubnets() *pb.PhantomSubnetsList { + var w1 = uint32(9.0) + var w2 = uint32(1.0) + return &pb.PhantomSubnetsList{ + WeightedSubnets: []*pb.PhantomSubnets{ + { + Weight: &w1, + Subnets: []string{"192.122.190.0/24", "2001:48a8:687f:1::/64"}, + }, + { + Weight: &w2, + Subnets: []string{"141.219.0.0/16", "35.8.0.0/16"}, + }, + }, + } +} + +// GetUnweightedSubnetList returns the list of subnets provided by the protobuf. Convenience +// function to not have to export getSubnets() or parseSubnets() +func GetUnweightedSubnetList(subnetsList *pb.PhantomSubnetsList) ([]*phantomNet, error) { + return getSubnets(subnetsList, nil, false) +} + +func IP(ip net.IP, supportRandomPort bool) *PhantomIP { + return &PhantomIP{ip: &ip, supportRandomPort: supportRandomPort} +} + +// type alias to make embedding unexported +// nolint:unused +type ip = net.IP +type PhantomIP struct { + *ip + supportRandomPort bool +} + +func (p *PhantomIP) SupportRandomPort() bool { + return p.supportRandomPort +} + +func (p *PhantomIP) IP() *net.IP { + return p.ip +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/phantoms/station_phantoms.go b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/station_phantoms.go new file mode 100644 index 000000000..ebdb8d6b7 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/phantoms/station_phantoms.go @@ -0,0 +1,193 @@ +package phantoms + +import ( + "fmt" + "os" + "strconv" + + toml "github.com/pelletier/go-toml" + "github.com/refraction-networking/conjure/pkg/core" + pb "github.com/refraction-networking/conjure/proto" +) + +// SubnetConfig - Configuration of subnets for Conjure to choose a Phantom out of. +type SubnetConfig struct { + WeightedSubnets []*pb.PhantomSubnets +} + +func (sc *SubnetConfig) GetWeightedSubnets() []*pb.PhantomSubnets { + return sc.WeightedSubnets +} + +// PhantomIPSelector - Object for tracking current generation to SubnetConfig Mapping. +type PhantomIPSelector struct { + Networks map[uint]*SubnetConfig +} + +// type shim because github.com/pelletier/go-toml doesn't allow for integer value keys to maps so +// we have to parse them ourselves. :( +type phantomIPSelectorInternal struct { + Networks map[string]*SubnetConfig +} + +// NewPhantomIPSelector - create object currently populated with a static map of +// generation number to SubnetConfig, but this may be loaded dynamically in the +// future. +func NewPhantomIPSelector() (*PhantomIPSelector, error) { + return GetPhantomSubnetSelector() +} + +// GetPhantomSubnetSelector gets the location of the configuration file from an +// environment variable and returns the parsed configuration. +func GetPhantomSubnetSelector() (*PhantomIPSelector, error) { + return SubnetsFromTomlFile(os.Getenv("PHANTOM_SUBNET_LOCATION")) +} + +// SubnetsFromTomlFile takes a path and parses the toml config file +func SubnetsFromTomlFile(path string) (*PhantomIPSelector, error) { + + tree, err := toml.LoadFile(path) + if err != nil { + return nil, fmt.Errorf("error opening configuration file: %v", err) + } + + var pss = &PhantomIPSelector{ + Networks: make(map[uint]*SubnetConfig), + } + // shim because github.com/pelletier/go-toml doesn't allow for integer value keys to maps so + // we have to parse them ourselves. :( + var phantomSelectorSet = &phantomIPSelectorInternal{} + err = tree.Unmarshal(phantomSelectorSet) + if err != nil { + return nil, fmt.Errorf("error unmarshalling configuration file: %v", err) + } + + for gen, set := range phantomSelectorSet.Networks { + g, err := strconv.Atoi(gen) + if err != nil { + return nil, err + } + // fmt.Printf("[GetPhantomSubnetSelector] adding %d, %+v\n", g, set) + pss.AddGeneration(g, set) + } + + return pss, nil +} + +// GetSubnetsByGeneration - provide a generation index. If the generation exists +// the associated SubnetConfig is returned. If it is not defined the default +// subnets are returned. +func (p *PhantomIPSelector) GetSubnetsByGeneration(generation uint) *SubnetConfig { + if subnets, ok := p.Networks[generation]; ok { + return subnets + } + + // No Default subnets provided if the generation is not known + return nil +} + +// AddGeneration - add a subnet config as a new new generation, if the requested +// generation index is taken then it uses (and returns) the next available +// number. +func (p *PhantomIPSelector) AddGeneration(gen int, subnets *SubnetConfig) uint { + + ugen := uint(gen) + + if gen == -1 || p.IsTakenGeneration(ugen) { + ugen = p.newGenerationIndex() + } + + p.Networks[ugen] = subnets + return ugen +} + +func (p *PhantomIPSelector) newGenerationIndex() uint { + maxGen := uint(0) + for k := range p.Networks { + if k > maxGen { + maxGen = k + } + } + return maxGen + 1 +} + +// IsTakenGeneration - check if the generation index is already in use. +func (p *PhantomIPSelector) IsTakenGeneration(gen uint) bool { + if _, ok := p.Networks[gen]; ok { + return true + } + return false +} + +// RemoveGeneration - remove a generation from the mapping +func (p *PhantomIPSelector) RemoveGeneration(generation uint) bool { + p.Networks[generation] = nil + return true +} + +// UpdateGeneration - Update the subnet list associated with a specific generation +func (p *PhantomIPSelector) UpdateGeneration(generation uint, subnets *SubnetConfig) bool { + p.Networks[generation] = subnets + return true +} + +// Select - select an ip address from the list of subnets associated with the specified generation +func (p *PhantomIPSelector) Select(seed []byte, generation uint, clientLibVer uint, v6Support bool) (*PhantomIP, error) { + genConfig := p.GetSubnetsByGeneration(generation) + if genConfig == nil { + return nil, fmt.Errorf("generation number not recognized") + } + + genSubnets, err := subnetsByVersion(seed, clientLibVer, genConfig) + if err != nil { + return nil, err + } + + if v6Support { + genSubnets, err = V6Only(genSubnets) + if err != nil { + return nil, err + } + } else { + genSubnets, err = V4Only(genSubnets) + if err != nil { + return nil, err + } + } + + // handle legacy clientLibVersions for selecting phantoms. + if clientLibVer < core.PhantomSelectionMinGeneration { + // Version 0 + ip, err := selectPhantomImplV0(seed, genSubnets) + if err != nil { + return nil, err + } + return ip, nil + } else if clientLibVer < core.PhantomHkdfMinVersion { + // Version 1 + ip, err := selectPhantomImplVarint(seed, genSubnets) + if err != nil { + return nil, err + } + return ip, nil + } + + // Version 2+ + ip, err := selectPhantomImplHkdf(seed, genSubnets) + if err != nil { + return nil, err + } + return ip, nil +} + +func subnetsByVersion(seed []byte, clientLibVer uint, genConfig *SubnetConfig) ([]*phantomNet, error) { + + if clientLibVer < core.PhantomHkdfMinVersion { + // Version 0 or 1 + return genConfig.getSubnetsVarint(seed, true) + } else { + // Version 2 + return getSubnetsHkdf(genConfig, seed, true) + } + +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/decoy-registrar.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/decoy-registrar.go new file mode 100644 index 000000000..c7152671b --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/decoy-registrar.go @@ -0,0 +1,441 @@ +package decoy + +import ( + "context" + "crypto/sha256" + "fmt" + "math/big" + "net" + "sync" + "time" + + "github.com/refraction-networking/conjure/pkg/client/assets" + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/registrars/lib" + pb "github.com/refraction-networking/conjure/proto" + tls "github.com/refraction-networking/utls" + "golang.org/x/crypto/hkdf" + + // td imports assets, RegError, generateHTTPRequestBeginning + td "github.com/refraction-networking/gotapdance/tapdance" + + "github.com/sirupsen/logrus" +) + +// deadline to establish TCP connection to decoy - magic numbers chosen arbitrarily to prevent +// distribution from aligning directly with second boundaries. These are intentionally short as TCP +// establishment is one round trip and we do not want to block our dial any longer than we +// absolutely have to to ensure that at least one TCP connection to a decoy could be established. +const deadlineTCPtoDecoyMin = 1931 +const deadlineTCPtoDecoyMax = 4013 + +// Fixed-Size-Payload has a 1 byte flags field. +// bit 0 (1 << 7) determines if flow is bidirectional(0) or upload-only(1) +// bit 1 (1 << 6) enables dark-decoys +// bits 2-5 are unassigned +// bit 6 determines whether PROXY-protocol-formatted string will be sent +// bit 7 (1 << 0) signals to use TypeLen outer proto +var ( + tdFlagUploadOnly = uint8(1 << 7) + // tdFlagDarkDecoy = uint8(1 << 6) + tdFlagProxyHeader = uint8(1 << 1) + tdFlagUseTIL = uint8(1 << 0) +) + +var default_flags = tdFlagUseTIL + +type DialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) + +type DecoyRegistrar struct { + + // dialContext is a custom dialer to use when establishing TCP connections + // to decoys. When nil, Dialer.dialContex will be used. + dialContext DialFunc + + logger logrus.FieldLogger + + // Only used for testing. Always false otherwise. + insecureSkipVerify bool + + // Fields taken from ConjureReg struct + m sync.Mutex + stats *pb.SessionStats + onceTCP sync.Once + onceTLS sync.Once + + // add Width, sharedKeys necessary stuff (2nd line in struct except ConjureSeed) + // Keys + fspKey, fspIv, vspKey, vspIv []byte + + Width uint + + ClientHelloID tls.ClientHelloID +} + +func NewDecoyRegistrar() *DecoyRegistrar { + return &DecoyRegistrar{ + logger: td.Logger(), + ClientHelloID: tls.HelloChrome_62, + Width: 5, + } +} + +// NewDecoyRegistrarWithDialer returns a decoy registrar with custom dialer. +// +// Deprecated: Set dialer in tapdace.Dialer.DialerWithLaddr instead. +func NewDecoyRegistrarWithDialer(dialer DialFunc) *DecoyRegistrar { + return &DecoyRegistrar{ + dialContext: dialer, + logger: td.Logger(), + ClientHelloID: tls.HelloChrome_62, + Width: 5, + } +} + +// setTCPToDecoy takes in a value for the measured RTT, if the value is greater +// than 1.5 seconds (1500 ms) then that value will be used to limit the RTT +// used in future delay calculations. +func (r *DecoyRegistrar) setTCPToDecoy(tcprtt *uint32) { + r.m.Lock() + defer r.m.Unlock() + + if r.stats == nil { + r.stats = &pb.SessionStats{} + } + + var maxRTT uint32 = 1500 + + if *tcprtt > maxRTT { + tcprtt = &maxRTT + } + + r.stats.TcpToDecoy = tcprtt +} + +func (r *DecoyRegistrar) setTLSToDecoy(tlsrtt *uint32) { + r.m.Lock() + defer r.m.Unlock() + + var maxRTT uint32 = 1500 + + if r.stats == nil { + r.stats = &pb.SessionStats{} + } + + if *tlsrtt > maxRTT { + tlsrtt = &maxRTT + } + + r.stats.TlsToDecoy = tlsrtt +} + +var conjureGeneralHkdfSalt = []byte("conjureconjureconjureconjure") + +// PrepareRegKeys prepares key materials specific to the registrar +func (r *DecoyRegistrar) PrepareRegKeys(stationPubkey [32]byte, sessionSecret []byte) error { + + reader := hkdf.New(sha256.New, sessionSecret, conjureGeneralHkdfSalt, nil) + + r.fspKey = make([]byte, 16) + r.fspIv = make([]byte, 12) + r.vspKey = make([]byte, 16) + r.vspIv = make([]byte, 12) + + if _, err := reader.Read(r.fspKey); err != nil { + return err + } + if _, err := reader.Read(r.fspIv); err != nil { + return err + } + if _, err := reader.Read(r.vspKey); err != nil { + return err + } + if _, err := reader.Read(r.vspIv); err != nil { + return err + } + + return nil +} + +// getRandomDurationByRTT returns a random duration between min and max in milliseconds adding base. +func (r *DecoyRegistrar) getRandomDurationByRTT(base, min, max int) time.Duration { + addon := getRandInt(min, max) / 1000 // why this min and max??? + rtt := rttInt(r.getTcpToDecoy()) + return time.Millisecond * time.Duration(base+rtt*addon) +} + +func (r *DecoyRegistrar) getTcpToDecoy() uint32 { + if r == nil { + return 0 + } + r.m.Lock() + defer r.m.Unlock() + if r.stats != nil { + return r.stats.GetTcpToDecoy() + } + return 0 +} + +func (r *DecoyRegistrar) createTLSConn(dialConn net.Conn, address string, hostname string, deadline time.Time) (*tls.UConn, error) { + var err error + //[reference] TLS to Decoy + config := tls.Config{ServerName: hostname, InsecureSkipVerify: r.insecureSkipVerify} + if config.ServerName == "" { + // if SNI is unset -- try IP + config.ServerName, _, err = net.SplitHostPort(address) + if err != nil { + return nil, err + } + // Logger().Debugf("%v SNI was nil. Setting it to %v ", r.sessionIDStr, config.ServerName) + } + //[TODO]{priority:medium} parroting Chrome 62 ClientHello -- parrot newer. + tlsConn := tls.UClient(dialConn, &config, r.ClientHelloID) + + err = tlsConn.BuildHandshakeState() + if err != nil { + return nil, err + } + err = tlsConn.MarshalClientHello() + if err != nil { + return nil, err + } + + err = tlsConn.SetDeadline(deadline) + if err != nil { + return nil, err + } + + err = tlsConn.Handshake() + if err != nil { + return nil, err + } + + return tlsConn, nil +} + +func (r *DecoyRegistrar) createRequest(tlsConn *tls.UConn, decoy *pb.TLSDecoySpec, cjSession *td.ConjureSession) ([]byte, error) { + //[reference] generate and encrypt variable size payload + vsp, err := generateVSP(cjSession) + if err != nil { + return nil, err + } + if len(vsp) > int(^uint16(0)) { + return nil, fmt.Errorf("Variable-Size Payload exceeds %v", ^uint16(0)) + } + encryptedVsp, err := aesGcmEncrypt(vsp, r.vspKey, r.vspIv) + if err != nil { + return nil, err + } + + //[reference] generate and encrypt fixed size payload + fsp := generateFSP(uint16(len(encryptedVsp))) + encryptedFsp, err := aesGcmEncrypt(fsp, r.fspKey, r.fspIv) + if err != nil { + return nil, err + } + + var tag []byte // tag will be base-64 style encoded + tag = append(encryptedVsp, cjSession.Keys.Representative...) + tag = append(tag, encryptedFsp...) + + httpRequest := generateHTTPRequestBeginning(decoy.GetHostname()) + keystreamOffset := len(httpRequest) + keystreamSize := (len(tag)/3+1)*4 + keystreamOffset // we can't use first 2 bits of every byte + wholeKeystream, err := tlsConn.GetOutKeystream(keystreamSize) + if err != nil { + return nil, err + } + keystreamAtTag := wholeKeystream[keystreamOffset:] + httpRequest = append(httpRequest, reverseEncrypt(tag, keystreamAtTag)...) + httpRequest = append(httpRequest, []byte("\r\n\r\n")...) + return httpRequest, nil +} + +// Register initiates the decoy registrar to connect and send the multiple registration requests +// to the various decoys. +func (r *DecoyRegistrar) Register(cjSession *td.ConjureSession, ctx context.Context) (*td.ConjureReg, error) { + logger := r.logger.WithFields(logrus.Fields{"type": "unidirectional", "sessionID": cjSession.IDString()}) + + logger.Debugf("Registering V4 and V6 via DecoyRegistrar") + + reg, _, err := cjSession.UnidirectionalRegData(ctx, pb.RegistrationSource_Detector.Enum()) + if err != nil { + logger.Errorf("Failed to prepare registration data: %v", err) + return nil, lib.ErrRegFailed + } + + // Choose N (width) decoys from decoylist + decoys, err := selectDecoys(cjSession.Keys.SharedSecret, cjSession.V6Support.Include(), r.Width) + if err != nil { + logger.Warnf("failed to select decoys: %v", err) + return nil, err + } + + if r.dialContext != nil { + reg.Dialer = r.dialContext + } + + // //[TODO]{priority:later} How to pass context to multiple registration goroutines? + if ctx == nil { + ctx = context.Background() + } + + width := uint(len(decoys)) + if width < r.Width { + logger.Warnf("Using width %v (default %v)", width, r.Width) + } + + //[reference] Send registrations to each decoy + dialErrors := make(chan error, width) + for _, decoy := range decoys { + logger.Debugf("\tSending Reg: %v, %v", decoy.GetHostname(), decoy.GetIpAddrStr()) + //decoyAddr := decoy.GetIpAddrStr() + go r.Send(ctx, cjSession, decoy, dialErrors) + } + + //[reference] Dial errors happen immediately so block until all N dials complete + var unreachableCount uint = 0 + for err := range dialErrors { + if err != nil { + logger.Debugf("%v", err) + if dialErr, ok := err.(td.RegError); ok && dialErr.Code() == td.Unreachable { + // If we failed because ipv6 network was unreachable try v4 only. + unreachableCount++ + if unreachableCount < width { + continue + } else { + break + } + } + } + //[reference] if we succeed or fail for any other reason then the network is reachable and we can continue + break + } + + //[reference] if ALL fail to dial return error (retry in parent if ipv6 unreachable) + if unreachableCount == width { + logger.Debugf("NETWORK UNREACHABLE") + return nil, td.NewRegError(td.Unreachable, "All decoys failed to register -- Dial Unreachable") + } + + // randomized sleeping here to break the intraflow signal + toSleep := r.getRandomDurationByRTT(3000, 212, 3449) + logger.Debugf("Successfully sent registrations, sleeping for: %v", toSleep) + lib.SleepWithContext(ctx, toSleep) + + return reg, nil +} + +func (r *DecoyRegistrar) Send(ctx context.Context, cjSession *td.ConjureSession, decoy *pb.TLSDecoySpec, dialError chan error) { + + deadline, deadlineAlreadySet := ctx.Deadline() + if !deadlineAlreadySet { + deadline = time.Now().Add(getRandomDuration(deadlineTCPtoDecoyMin, deadlineTCPtoDecoyMax)) + } + childCtx, childCancelFunc := context.WithDeadline(ctx, deadline) + defer childCancelFunc() + + //[reference] TCP to decoy + tcpToDecoyStartTs := time.Now() + + //[Note] decoy.GetIpAddrStr() will get only v4 addr if a decoy has both + dialConn, err := cjSession.Dialer(childCtx, "tcp", "", decoy.GetIpAddrStr()) + + setTCPRtt := func() { + r.setTCPToDecoy(durationToU32ptrMs(time.Since(tcpToDecoyStartTs))) + } + r.onceTCP.Do(setTCPRtt) + if err != nil { + if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "connect: network is unreachable" { + dialError <- td.NewRegError(td.Unreachable, err.Error()) + return + } + dialError <- err + return + } + + //[reference] connection stats tracking + rtt := rttInt(uint32(time.Since(tcpToDecoyStartTs).Milliseconds())) + delay := getRandomDuration(1061*rtt*2, 1953*rtt*3) //[TODO]{priority:@sfrolov} why these values?? + TLSDeadline := time.Now().Add(delay) + + tlsToDecoyStartTs := time.Now() + tlsConn, err := r.createTLSConn(dialConn, decoy.GetIpAddrStr(), decoy.GetHostname(), TLSDeadline) + if err != nil { + dialConn.Close() + msg := fmt.Sprintf("%v - %v createConn: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) + dialError <- td.NewRegError(td.TLSError, msg) + return + } + + setTLSRtt := func() { + r.setTLSToDecoy(durationToU32ptrMs(time.Since(tlsToDecoyStartTs))) + } + r.onceTLS.Do(setTLSRtt) + + //[reference] Create the HTTP request for the registration + httpRequest, err := r.createRequest(tlsConn, decoy, cjSession) + if err != nil { + msg := fmt.Sprintf("%v - %v createReq: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) + dialError <- td.NewRegError(td.TLSError, msg) + return + } + + //[reference] Write reg into conn + _, err = tlsConn.Write(httpRequest) + if err != nil { + // This will not get printed because it is executed in a goroutine. + // Logger().Errorf("%v - %v Could not send Conjure registration request, error: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) + tlsConn.Close() + msg := fmt.Sprintf("%v - %v Write: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) + dialError <- td.NewRegError(td.TLSError, msg) + return + } + + dialError <- nil + readAndClose(dialConn, time.Second*15) +} + +const ( + v4 uint = iota + v6 + both +) + +// SelectDecoys - Get an array of `width` decoys to be used for registration +func selectDecoys(sharedSecret []byte, version uint, width uint) ([]*pb.TLSDecoySpec, error) { + + //[reference] prune to v6 only decoys if useV6 is true + var allDecoys []*pb.TLSDecoySpec + switch version { + case v6: + allDecoys = assets.Assets().GetV6Decoys() + case v4: + allDecoys = assets.Assets().GetV4Decoys() + case both: + allDecoys = assets.Assets().GetAllDecoys() + default: + allDecoys = assets.Assets().GetAllDecoys() + } + + if len(allDecoys) == 0 { + return nil, fmt.Errorf("no decoys") + } + + decoys := make([]*pb.TLSDecoySpec, width) + numDecoys := big.NewInt(int64(len(allDecoys))) + hmacInt := new(big.Int) + idx := new(big.Int) + + //[reference] select decoys + for i := uint(0); i < width; i++ { + macString := fmt.Sprintf("registrationdecoy%d", i) + hmac := core.ConjureHMAC(sharedSecret, macString) + hmacInt = hmacInt.SetBytes(hmac[:8]) + hmacInt.SetBytes(hmac) + hmacInt.Abs(hmacInt) + idx.Mod(hmacInt, numDecoys) + decoys[i] = allDecoys[int(idx.Int64())] + } + return decoys, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/utils.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/utils.go new file mode 100644 index 000000000..452ee8f00 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar/utils.go @@ -0,0 +1,284 @@ +package decoy + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/binary" + "fmt" + mrand "math/rand" + "net" + "strings" + "time" + + "github.com/refraction-networking/conjure/pkg/client/assets" + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/station/log" + pb "github.com/refraction-networking/conjure/proto" + td "github.com/refraction-networking/gotapdance/tapdance" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +// utils.go contains functions needed for the decoy-registrar specifically +// that do not have a ConjureReg, ConjureSession, DecoyRegistrar, etc receiver. +// Most functions are taken from gotapdance/tapdance/utils.go + +// The key argument should be the AES key, either 16 or 32 bytes +// to select AES-128 or AES-256. +func aesGcmEncrypt(plaintext []byte, key []byte, iv []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + aesGcmCipher, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + return aesGcmCipher.Seal(nil, iv, plaintext, nil), nil +} + +// Tries to get crypto random int in range [min, max] +// In case of crypto failure -- return insecure pseudorandom +func getRandInt(min int, max int) int { + // I can't believe Golang is making me do that + // Flashback to awful C/C++ libraries + diff := max - min + if diff < 0 { + // r.logger.Warningf("getRandInt(): max is less than min") + min = max + diff *= -1 + } else if diff == 0 { + return min + } + var v int64 + err := binary.Read(rand.Reader, binary.LittleEndian, &v) + if v < 0 { + v *= -1 + } + if err != nil { + // r.logger.Warningf("Unable to securely get getRandInt(): " + err.Error()) + v = mrand.Int63() + } + return min + int(v%int64(diff+1)) +} + +// returns random duration between min and max in milliseconds +func getRandomDuration(min int, max int) time.Duration { + return time.Millisecond * time.Duration(getRandInt(min, max)) +} + +// Converts provided duration to raw milliseconds. +// Returns a pointer to u32, because protobuf wants pointers. +// Max valid input duration (that fits into uint32): 49.71 days. +func durationToU32ptrMs(d time.Duration) *uint32 { + i := uint32(d.Milliseconds()) + return &i +} + +func rttInt(millis uint32) int { + defaultValue := 300 + if millis == 0 { + return defaultValue + } + return int(millis) +} + +func generateFSP(espSize uint16) []byte { + buf := make([]byte, 6) + binary.BigEndian.PutUint16(buf[0:2], espSize) + + return buf +} + +// generates HTTP request, that is ready to have tag prepended to it +func generateHTTPRequestBeginning(decoyHostname string) []byte { + sharedHeaders := `Host: ` + decoyHostname + + "\nUser-Agent: TapDance/1.2 (+https://refraction.network/info)" + httpTag := fmt.Sprintf(`GET / HTTP/1.1 +%s +X-Ignore: %s`, sharedHeaders, getRandPadding(7, maxInt(612-len(sharedHeaders), 7), 10)) + return []byte(strings.Replace(httpTag, "\n", "\r\n", -1)) +} + +// Get padding of length [minLen, maxLen). +// Distributed in pseudogaussian style. +// Padded using symbol '#'. Known plaintext attacks, anyone? +func getRandPadding(minLen int, maxLen int, smoothness int) string { + paddingLen := 0 + for j := 0; j < smoothness; j++ { + paddingLen += getRandInt(minLen, maxLen) + } + paddingLen = paddingLen / smoothness + + return strings.Repeat("#", paddingLen) +} + +func maxInt(a, b int) int { + if a > b { + return a + } + return b +} + +func reverseEncrypt(ciphertext []byte, keyStream []byte) []byte { + var plaintext string + // our plaintext can be antyhing where x & 0xc0 == 0x40 + // i.e. 64-127 in ascii (@, A-Z, [\]^_`, a-z, {|}~ DEL) + // This means that we are allowed to choose the last 6 bits + // of each byte in the ciphertext arbitrarily; the upper 2 + // bits will have to be 01, so that our plaintext ends up + // in the desired range. + var ka, kb, kc, kd byte // key stream bytes + var ca, cb, cc, cd byte // ciphertext bytes + var pa, pb, pc, pd byte // plaintext bytes + var sa, sb, sc byte // secret bytes + + var tagIdx, keystreamIdx int + + for tagIdx < len(ciphertext) { + ka = keyStream[keystreamIdx] + kb = keyStream[keystreamIdx+1] + kc = keyStream[keystreamIdx+2] + kd = keyStream[keystreamIdx+3] + keystreamIdx += 4 + + // read 3 bytes + sa = ciphertext[tagIdx] + sb = ciphertext[tagIdx+1] + sc = ciphertext[tagIdx+2] + tagIdx += 3 + + // figure out what plaintext needs to be in base64 encode + ca = (ka & 0xc0) | ((sa & 0xfc) >> 2) // 6 bits sa + cb = (kb & 0xc0) | (((sa & 0x03) << 4) | ((sb & 0xf0) >> 4)) // 2 bits sa, 4 bits sb + cc = (kc & 0xc0) | (((sb & 0x0f) << 2) | ((sc & 0xc0) >> 6)) // 4 bits sb, 2 bits sc + cd = (kd & 0xc0) | (sc & 0x3f) // 6 bits sc + + // Xor with key_stream, and add on 0x40 so it's in range of allowed + pa = (ca ^ ka) + 0x40 + pb = (cb ^ kb) + 0x40 + pc = (cc ^ kc) + 0x40 + pd = (cd ^ kd) + 0x40 + + plaintext += string(pa) + plaintext += string(pb) + plaintext += string(pc) + plaintext += string(pd) + } + return []byte(plaintext) +} + +func readAndClose(c net.Conn, readDeadline time.Duration) { + tinyBuf := []byte{0} + err := c.SetReadDeadline(time.Now().Add(readDeadline)) + if err != nil { + return + } + _, err = c.Read(tinyBuf) + if err != nil { + return + } + c.Close() +} + +// Below are functions adapted from tapdance/conjure.go that originally had receiver of +// type *ConjureReg. For now, we can pass the *ConjureSession to work with and avoid any +// receiver, but eventually we may want to change the receiver type to *ConjureSession, +// or use type alias to another name so we can define functions with that receiver here. + +func getPbTransportParams(cjSession *td.ConjureSession) (*anypb.Any, error) { + var m proto.Message + m, err := cjSession.Transport.GetParams() + if err != nil { + return nil, err + } else if m == nil { + return nil, nil + } + return anypb.New(m) +} + +func generateVSP(cjSession *td.ConjureSession) ([]byte, error) { + c2s, err := generateClientToStation(cjSession) + if err != nil { + return nil, err + } + //[reference] Marshal ClientToStation protobuf + return proto.Marshal(c2s) +} + +func generateClientToStation(cjSession *td.ConjureSession) (*pb.ClientToStation, error) { + if cjSession == nil { + return nil, fmt.Errorf("cannot generate C2S with nil session") + } + var covert *string + if len(cjSession.CovertAddress) > 0 { + //[TODO]{priority:medium} this isn't the correct place to deal with signaling to the station + //transition = pb.C2S_Transition_C2S_SESSION_COVERT_INIT + covert = &cjSession.CovertAddress + } + + //[reference] Generate ClientToStation protobuf + // transition := pb.C2S_Transition_C2S_SESSION_INIT + currentGen := assets.Assets().GetGeneration() + currentLibVer := core.CurrentClientLibraryVersion() + + if cjSession.Transport == nil { + return nil, fmt.Errorf("nil transport not allowed") + } + transport := cjSession.Transport.ID() + + transportParams, err := getPbTransportParams(cjSession) + if err != nil { + log.Debugf("%s failed to marshal transport parameters ", cjSession.IDString()) + } + // remove type url to save space for DNS registration + // for server side changes see https://github.com/refraction-networking/conjure/pull/163 + transportParams.TypeUrl = "" + + initProto := &pb.ClientToStation{ + ClientLibVersion: ¤tLibVer, + CovertAddress: covert, + DecoyListGeneration: ¤tGen, + V6Support: cjSession.GetV6Support(), + V4Support: cjSession.GetV4Support(), + Transport: &transport, + Flags: generateFlags(cjSession), + TransportParams: transportParams, + + DisableRegistrarOverrides: &cjSession.DisableRegistrarOverrides, + + //[TODO]{priority:medium} specify width in C2S because different width might + // be useful in different regions (constant for now.) + } + + // phantomSNI field no longer supported + // if len(reg.phantomSNI) > 0 { + // initProto.MaskedDecoyServerName = ®.phantomSNI + // } + + for (proto.Size(initProto)+td.AES_GCM_TAG_SIZE)%3 != 0 { + initProto.Padding = append(initProto.Padding, byte(0)) + } + + return initProto, nil +} + +func generateFlags(cjSession *td.ConjureSession) *pb.RegistrationFlags { + flags := &pb.RegistrationFlags{} + mask := default_flags + if cjSession.UseProxyHeader { + mask |= tdFlagProxyHeader + } + + uploadOnly := mask&tdFlagUploadOnly == tdFlagUploadOnly + proxy := mask&tdFlagProxyHeader == tdFlagProxyHeader + til := mask&tdFlagUseTIL == tdFlagUseTIL + + flags.UploadOnly = &uploadOnly + flags.ProxyHeader = &proxy + flags.Use_TIL = &til + + return flags +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns/dns.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns/dns.go new file mode 100644 index 000000000..bad1649b8 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns/dns.go @@ -0,0 +1,616 @@ +// Package dns deals with encoding and decoding DNS wire format. +package dns + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "strings" +) + +// The maximum number of DNS name compression pointers we are willing to follow. +// Without something like this, infinite loops are possible. +const compressionPointerLimit = 10 + +var ( + // ErrZeroLengthLabel is the error returned for names that contain a + // zero-length label, like "example..com". + ErrZeroLengthLabel = errors.New("name contains a zero-length label") + + // ErrLabelTooLong is the error returned for labels that are longer than + // 63 octets. + ErrLabelTooLong = errors.New("name contains a label longer than 63 octets") + + // ErrNameTooLong is the error returned for names whose encoded + // representation is longer than 255 octets. + ErrNameTooLong = errors.New("name is longer than 255 octets (try using a shorter base domain?)") + + // ErrReservedLabelType is the error returned when reading a label type + // prefix whose two most significant bits are not 00 or 11. + ErrReservedLabelType = errors.New("reserved label type") + + // ErrTooManyPointers is the error returned when reading a compressed + // name that has too many compression pointers. + ErrTooManyPointers = errors.New("too many compression pointers") + + // ErrTrailingBytes is the error returned when bytes remain in the parse + // buffer after parsing a message. + ErrTrailingBytes = errors.New("trailing bytes after message") + + // ErrIntegerOverflow is the error returned when trying to encode an + // integer greater than 65535 into a 16-bit field. + ErrIntegerOverflow = errors.New("integer overflow") +) + +const ( + // https://tools.ietf.org/html/rfc1035#section-3.2.2 + RRTypeTXT = 16 + // https://tools.ietf.org/html/rfc6891#section-6.1.1 + RRTypeOPT = 41 + + // https://tools.ietf.org/html/rfc1035#section-3.2.4 + ClassIN = 1 + + // https://tools.ietf.org/html/rfc1035#section-4.1.1 + RcodeNoError = 0 // a.k.a. NOERROR + RcodeFormatError = 1 // a.k.a. FORMERR + RcodeNameError = 3 // a.k.a. NXDOMAIN + RcodeNotImplemented = 4 // a.k.a. NOTIMPL + // https://tools.ietf.org/html/rfc6891#section-9 + ExtendedRcodeBadVers = 16 // a.k.a. BADVERS +) + +// Name represents a domain name, a sequence of labels each of which is 63 +// octets or less in length. +// +// https://tools.ietf.org/html/rfc1035#section-3.1 +type Name [][]byte + +// NewName returns a Name from a slice of labels, after checking the labels for +// validity. Does not include a zero-length label at the end of the slice. +func NewName(labels [][]byte) (Name, error) { + name := Name(labels) + // https://tools.ietf.org/html/rfc1035#section-2.3.4 + // Various objects and parameters in the DNS have size limits. + // labels 63 octets or less + // names 255 octets or less + for _, label := range labels { + if len(label) == 0 { + return nil, ErrZeroLengthLabel + } + if len(label) > 63 { + return nil, ErrLabelTooLong + } + } + // Check the total length. + builder := newMessageBuilder() + err := builder.WriteName(name) + if err != nil { + return name, err + } + if len(builder.Bytes()) > 255 { + return nil, fmt.Errorf("%w, current length: %v", ErrNameTooLong, len(builder.Bytes())) + } + return name, nil +} + +// ParseName returns a new Name from a string of labels separated by dots, after +// checking the name for validity. A single dot at the end of the string is +// ignored. +func ParseName(s string) (Name, error) { + b := bytes.TrimSuffix([]byte(s), []byte(".")) + if len(b) == 0 { + // bytes.Split(b, ".") would return [""] in this case + return NewName([][]byte{}) + } else { + return NewName(bytes.Split(b, []byte("."))) + } +} + +// String returns a reversible string representation of name. Labels are +// separated by dots, and any bytes in a label that are outside the set +// [0-9A-Za-z-] are replaced with a \xXX hex escape sequence. +func (name Name) String() string { + if len(name) == 0 { + return "." + } + + var buf strings.Builder + for i, label := range name { + if i > 0 { + buf.WriteByte('.') + } + for _, b := range label { + if b == '-' || + ('0' <= b && b <= '9') || + ('A' <= b && b <= 'Z') || + ('a' <= b && b <= 'z') { + buf.WriteByte(b) + } else { + fmt.Fprintf(&buf, "\\x%02x", b) + } + } + } + return buf.String() +} + +// TrimSuffix returns a Name with the given suffix removed, if it was present. +// The second return value indicates whether the suffix was present. If the +// suffix was not present, the first return value is nil. +func (name Name) TrimSuffix(suffix Name) (Name, bool) { + if len(name) < len(suffix) { + return nil, false + } + split := len(name) - len(suffix) + fore, aft := name[:split], name[split:] + for i := 0; i < len(aft); i++ { + if !bytes.Equal(bytes.ToLower(aft[i]), bytes.ToLower(suffix[i])) { + return nil, false + } + } + return fore, true +} + +// Message represents a DNS message. +// +// https://tools.ietf.org/html/rfc1035#section-4.1 +type Message struct { + ID uint16 + Flags uint16 + + Question []Question + Answer []RR + Authority []RR + Additional []RR +} + +// Opcode extracts the OPCODE part of the Flags field. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.1 +func (message *Message) Opcode() uint16 { + return (message.Flags >> 11) & 0xf +} + +// Rcode extracts the RCODE part of the Flags field. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.1 +func (message *Message) Rcode() uint16 { + return message.Flags & 0x000f +} + +// Question represents an entry in the question section of a message. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.2 +type Question struct { + Name Name + Type uint16 + Class uint16 +} + +// RR represents a resource record. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.3 +type RR struct { + Name Name + Type uint16 + Class uint16 + TTL uint32 + Data []byte +} + +// readName parses a DNS name from r. It leaves r positioned just after the +// parsed name. +func readName(r io.ReadSeeker) (Name, error) { + var labels [][]byte + // We limit the number of compression pointers we are willing to follow. + numPointers := 0 + // If we followed any compression pointers, we must finally seek to just + // past the first pointer. + var seekTo int64 +loop: + for { + var labelType byte + err := binary.Read(r, binary.BigEndian, &labelType) + if err != nil { + return nil, err + } + + switch labelType & 0xc0 { + case 0x00: + // This is an ordinary label. + // https://tools.ietf.org/html/rfc1035#section-3.1 + length := int(labelType & 0x3f) + if length == 0 { + break loop + } + label := make([]byte, length) + _, err := io.ReadFull(r, label) + if err != nil { + return nil, err + } + labels = append(labels, label) + case 0xc0: + // This is a compression pointer. + // https://tools.ietf.org/html/rfc1035#section-4.1.4 + upper := labelType & 0x3f + var lower byte + err := binary.Read(r, binary.BigEndian, &lower) + if err != nil { + return nil, err + } + offset := (uint16(upper) << 8) | uint16(lower) + + if numPointers == 0 { + // The first time we encounter a pointer, + // remember our position so we can seek back to + // it when done. + seekTo, err = r.Seek(0, io.SeekCurrent) + if err != nil { + return nil, err + } + } + numPointers++ + if numPointers > compressionPointerLimit { + return nil, ErrTooManyPointers + } + + // Follow the pointer and continue. + _, err = r.Seek(int64(offset), io.SeekStart) + if err != nil { + return nil, err + } + default: + // "The 10 and 01 combinations are reserved for future + // use." + return nil, ErrReservedLabelType + } + } + // If we followed any pointers, then seek back to just after the first + // one. + if numPointers > 0 { + _, err := r.Seek(seekTo, io.SeekStart) + if err != nil { + return nil, err + } + } + return NewName(labels) +} + +// readQuestion parses one entry from the Question section. It leaves r +// positioned just after the parsed entry. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.2 +func readQuestion(r io.ReadSeeker) (Question, error) { + var question Question + var err error + question.Name, err = readName(r) + if err != nil { + return question, err + } + for _, ptr := range []*uint16{&question.Type, &question.Class} { + err := binary.Read(r, binary.BigEndian, ptr) + if err != nil { + return question, err + } + } + + return question, nil +} + +// readRR parses one resource record. It leaves r positioned just after the +// parsed resource record. +// +// https://tools.ietf.org/html/rfc1035#section-4.1.3 +func readRR(r io.ReadSeeker) (RR, error) { + var rr RR + var err error + rr.Name, err = readName(r) + if err != nil { + return rr, err + } + for _, ptr := range []*uint16{&rr.Type, &rr.Class} { + err := binary.Read(r, binary.BigEndian, ptr) + if err != nil { + return rr, err + } + } + err = binary.Read(r, binary.BigEndian, &rr.TTL) + if err != nil { + return rr, err + } + var rdLength uint16 + err = binary.Read(r, binary.BigEndian, &rdLength) + if err != nil { + return rr, err + } + rr.Data = make([]byte, rdLength) + _, err = io.ReadFull(r, rr.Data) + if err != nil { + return rr, err + } + + return rr, nil +} + +// readMessage parses a complete DNS message. It leaves r positioned just after +// the parsed message. +func readMessage(r io.ReadSeeker) (Message, error) { + var message Message + + // Header section + // https://tools.ietf.org/html/rfc1035#section-4.1.1 + var qdCount, anCount, nsCount, arCount uint16 + for _, ptr := range []*uint16{ + &message.ID, &message.Flags, + &qdCount, &anCount, &nsCount, &arCount, + } { + err := binary.Read(r, binary.BigEndian, ptr) + if err != nil { + return message, err + } + } + + // Question section + // https://tools.ietf.org/html/rfc1035#section-4.1.2 + for i := 0; i < int(qdCount); i++ { + question, err := readQuestion(r) + if err != nil { + return message, err + } + message.Question = append(message.Question, question) + } + + // Answer, Authority, and Additional sections + // https://tools.ietf.org/html/rfc1035#section-4.1.3 + for _, rec := range []struct { + ptr *[]RR + count uint16 + }{ + {&message.Answer, anCount}, + {&message.Authority, nsCount}, + {&message.Additional, arCount}, + } { + for i := 0; i < int(rec.count); i++ { + rr, err := readRR(r) + if err != nil { + return message, err + } + *rec.ptr = append(*rec.ptr, rr) + } + } + + return message, nil +} + +// MessageFromWireFormat parses a message from buf and returns a Message object. +// It returns ErrTrailingBytes if there are bytes remaining in buf after parsing +// is done. +func MessageFromWireFormat(buf []byte) (Message, error) { + r := bytes.NewReader(buf) + message, err := readMessage(r) + if err == io.EOF { + err = io.ErrUnexpectedEOF + } else if err == nil { + // Check for trailing bytes. + _, err = r.ReadByte() + if err == io.EOF { + err = nil + } else if err == nil { + err = ErrTrailingBytes + } + } + return message, err +} + +// messageBuilder manages the state of serializing a DNS message. Its main +// function is to keep track of names already written for the purpose of name +// compression. +type messageBuilder struct { + w bytes.Buffer + nameCache map[string]int +} + +// newMessageBuilder creates a new messageBuilder with an empty name cache. +func newMessageBuilder() *messageBuilder { + return &messageBuilder{ + nameCache: make(map[string]int), + } +} + +// Bytes returns the serialized DNS message as a slice of bytes. +func (builder *messageBuilder) Bytes() []byte { + return builder.w.Bytes() +} + +// WriteName appends name to the in-progress messageBuilder, employing +// compression pointers to previously written names if possible. +func (builder *messageBuilder) WriteName(name Name) error { + // https://tools.ietf.org/html/rfc1035#section-3.1 + for i := range name { + // Has this suffix already been encoded in the message? + if ptr, ok := builder.nameCache[name[i:].String()]; ok && ptr&0x3fff == ptr { + // If so, we can write a compression pointer. + return binary.Write(&builder.w, binary.BigEndian, uint16(0xc000|ptr)) + } + // Not cached; we must encode this label verbatim. Store a cache + // entry pointing to the beginning of it. + builder.nameCache[name[i:].String()] = builder.w.Len() + length := len(name[i]) + if length == 0 || length > 63 { + panic(length) + } + err := builder.w.WriteByte(byte(length)) + if err != nil { + return err + } + _, err = builder.w.Write(name[i]) + if err != nil { + return err + } + } + return builder.w.WriteByte(0) +} + +// WriteQuestion appends a Question section entry to the in-progress +// messageBuilder. +func (builder *messageBuilder) WriteQuestion(question *Question) error { + // https://tools.ietf.org/html/rfc1035#section-4.1.2 + err := builder.WriteName(question.Name) + if err != nil { + return err + } + err = binary.Write(&builder.w, binary.BigEndian, question.Type) + if err != nil { + return err + } + return binary.Write(&builder.w, binary.BigEndian, question.Class) +} + +// WriteRR appends a resource record to the in-progress messageBuilder. It +// returns ErrIntegerOverflow if the length of rr.Data does not fit in 16 bits. +func (builder *messageBuilder) WriteRR(rr *RR) error { + // https://tools.ietf.org/html/rfc1035#section-4.1.3 + err := builder.WriteName(rr.Name) + if err != nil { + return err + } + err = binary.Write(&builder.w, binary.BigEndian, rr.Type) + if err != nil { + return err + } + err = binary.Write(&builder.w, binary.BigEndian, rr.Class) + if err != nil { + return err + } + err = binary.Write(&builder.w, binary.BigEndian, rr.TTL) + if err != nil { + return err + } + rdLength := uint16(len(rr.Data)) + if int(rdLength) != len(rr.Data) { + return ErrIntegerOverflow + } + err = binary.Write(&builder.w, binary.BigEndian, rdLength) + if err != nil { + return err + } + _, err = builder.w.Write(rr.Data) + return err +} + +// WriteMessage appends a complete DNS message to the in-progress +// messageBuilder. It returns ErrIntegerOverflow if the number of entries in any +// section, or the length of the data in any resource record, does not fit in 16 +// bits. +func (builder *messageBuilder) WriteMessage(message *Message) error { + // Header section + // https://tools.ietf.org/html/rfc1035#section-4.1.1 + err := binary.Write(&builder.w, binary.BigEndian, message.ID) + if err != nil { + return err + } + err = binary.Write(&builder.w, binary.BigEndian, message.Flags) + if err != nil { + return err + } + for _, count := range []int{ + len(message.Question), + len(message.Answer), + len(message.Authority), + len(message.Additional), + } { + count16 := uint16(count) + if int(count16) != count { + return ErrIntegerOverflow + } + err = binary.Write(&builder.w, binary.BigEndian, count16) + if err != nil { + return err + } + } + + // Question section + // https://tools.ietf.org/html/rfc1035#section-4.1.2 + for _, question := range message.Question { + err := builder.WriteQuestion(&question) + if err != nil { + return err + } + } + + // Answer, Authority, and Additional sections + // https://tools.ietf.org/html/rfc1035#section-4.1.3 + for _, rrs := range [][]RR{message.Answer, message.Authority, message.Additional} { + for _, rr := range rrs { + err := builder.WriteRR(&rr) + if err != nil { + return err + } + } + } + + return nil +} + +// WireFormat encodes a Message as a slice of bytes in DNS wire format. It +// returns ErrIntegerOverflow if the number of entries in any section, or the +// length of the data in any resource record, does not fit in 16 bits. +func (message *Message) WireFormat() ([]byte, error) { + builder := newMessageBuilder() + err := builder.WriteMessage(message) + if err != nil { + return nil, err + } + return builder.Bytes(), nil +} + +// DecodeRDataTXT decodes TXT-DATA (as found in the RDATA for a resource record +// with TYPE=TXT) as a raw byte slice, by concatenating all the +// s it contains. +// +// https://tools.ietf.org/html/rfc1035#section-3.3.14 +func DecodeRDataTXT(p []byte) ([]byte, error) { + var buf bytes.Buffer + for { + if len(p) == 0 { + return nil, io.ErrUnexpectedEOF + } + n := int(p[0]) + p = p[1:] + if len(p) < n { + return nil, io.ErrUnexpectedEOF + } + buf.Write(p[:n]) + p = p[n:] + if len(p) == 0 { + break + } + } + return buf.Bytes(), nil +} + +// EncodeRDataTXT encodes a slice of bytes as TXT-DATA, as appropriate for the +// RDATA of a resource record with TYPE=TXT. No length restriction is enforced +// here; that must be checked at a higher level. +// +// https://tools.ietf.org/html/rfc1035#section-3.3.14 +func EncodeRDataTXT(p []byte) []byte { + // https://tools.ietf.org/html/rfc1035#section-3.3 + // https://tools.ietf.org/html/rfc1035#section-3.3.14 + // TXT data is a sequence of one or more s, where + // is a length octet followed by that number of + // octets. + var buf bytes.Buffer + for len(p) > 255 { + buf.WriteByte(255) + buf.Write(p[:255]) + p = p[255:] + } + // Must write here, even if len(p) == 0, because it's "*one or more* + // s". + buf.WriteByte(byte(len(p))) + buf.Write(p) + return buf.Bytes() +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption/encryption.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption/encryption.go new file mode 100644 index 000000000..04c3dd7d7 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption/encryption.go @@ -0,0 +1,84 @@ +package encryption + +import ( + "bufio" + "crypto/ed25519" + "crypto/rand" + "encoding/hex" + "fmt" + "io" + "strings" + + "github.com/flynn/noise" + "golang.org/x/crypto/curve25519" +) + +const ( + KeyLen = 32 +) + +// cipherSuite represents 25519_ChaChaPoly_BLAKE2s. +var cipherSuite = noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, noise.HashBLAKE2s) + +// NewConfig instantiates configuration settings that are common to clients and +// servers. +func NewConfig() noise.Config { + return noise.Config{ + CipherSuite: cipherSuite, + Pattern: noise.HandshakeN, + } +} + +// ReadKey reads a hex-encoded key from r. r must consist of a single line, with +// or without a '\n' line terminator. The line must consist of KeyLen +// hex-encoded bytes. +func ReadKey(r io.Reader) ([]byte, error) { + br := bufio.NewReader(io.LimitReader(r, 100)) + line, err := br.ReadString('\n') + if err == io.EOF { + err = nil + } + if err == nil { + // Check that we're at EOF. + _, err = br.ReadByte() + if err == io.EOF { + err = nil + } else if err == nil { + err = fmt.Errorf("file contains more than one line") + } + } + if err != nil { + return nil, err + } + line = strings.TrimSuffix(line, "\n") + return DecodeKey(line) +} + +// DecodeKey decodes a hex-encoded private or public key. +func DecodeKey(s string) ([]byte, error) { + key, err := hex.DecodeString(s) + if err == nil && len(key) != KeyLen { + err = fmt.Errorf("length is %d, expected %d", len(key), KeyLen) + } + return key, err +} + +// GeneratePrivkey generates a private key. The corresponding public key can be +// derived using PubkeyFromPrivkey. +func GeneratePrivkey() ([]byte, error) { + pair, err := noise.DH25519.GenerateKeypair(rand.Reader) + return pair.Private, err +} + +// PubkeyFromPrivkey returns the public key that corresponds to privkey. +func PubkeyFromPrivkey(privkey []byte) []byte { + if len(privkey) == ed25519.PrivateKeySize { + return privkey[ed25519.PublicKeySize:] + } + + pubkey, err := curve25519.X25519(privkey, curve25519.Basepoint) + if err != nil { + panic(err) + } + return pubkey +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat/msgformat.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat/msgformat.go new file mode 100644 index 000000000..d418e726e --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat/msgformat.go @@ -0,0 +1,46 @@ +package msgformat + +import ( + "encoding/binary" + "errors" +) + +// Add length prefix to message +func AddRequestFormat(p []byte) ([]byte, error) { + length := uint8(len(p)) + prefixed := append([]byte{length}, p...) + return prefixed, nil +} + +// Remove the length prefix +func RemoveRequestFormat(p []byte) ([]byte, error) { + if len(p) < 1 { + return nil, errors.New("invalid message length") + } + length := int(uint8(p[0])) + if 1+length > len(p) { + return nil, errors.New("invalid message length") + } + return p[1 : 1+length], nil +} + +// Add length prefix to response, using uint16 instad of uint8 for larger payload +func AddResponseFormat(p []byte) ([]byte, error) { + length := uint16(len(p)) + b := make([]byte, 2) + binary.BigEndian.PutUint16(b, length) + prefixed := append(b, p...) + return prefixed, nil +} + +// Remove the length prefix +func RemoveResponseFormat(p []byte) ([]byte, error) { + if len(p) < 2 { + return nil, errors.New("invalid message length") + } + length := int(binary.BigEndian.Uint16(p[0:2])) + if 2+length > len(p) { + return nil, errors.New("invalid message length") + } + return p[2 : 2+length], nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/clientid.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/clientid.go new file mode 100644 index 000000000..d19fca3d5 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/clientid.go @@ -0,0 +1,28 @@ +package queuepacketconn + +import ( + "crypto/rand" + "encoding/hex" +) + +// ClientID is an abstract identifier that binds together all the communications +// belonging to a single client session, even though those communications may +// arrive from multiple IP addresses or over multiple lower-level connections. +// It plays the same role that an (IP address, port number) tuple plays in a +// net.UDPConn: it's the return address pertaining to a long-lived abstract +// client session. The client attaches its ClientID to each of its +// communications, enabling the server to disambiguate requests among its many +// clients. ClientID implements the net.Addr interface. +type ClientID [8]byte + +func NewClientID() ClientID { + var id ClientID + _, err := rand.Read(id[:]) + if err != nil { + panic(err) + } + return id +} + +func (id ClientID) Network() string { return "clientid" } +func (id ClientID) String() string { return hex.EncodeToString(id[:]) } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/consts.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/consts.go new file mode 100644 index 000000000..a4782445f --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/consts.go @@ -0,0 +1,22 @@ +// Package queuepacketconn is facilities for embedding packet-based reliability +// protocols inside other protocols. +// +// https://github.com/net4people/bbs/issues/9 +package queuepacketconn + +import "errors" + +// QueueSize is the size of send and receive queues in QueuePacketConn and +// RemoteMap. +const QueueSize = 128 + +var errClosedPacketConn = errors.New("operation on closed connection") +var errNotImplemented = errors.New("not implemented") + +// DummyAddr is a placeholder net.Addr, for when a programming interface +// requires a net.Addr but there is none relevant. All DummyAddrs compare equal +// to each other. +type DummyAddr struct{} + +func (addr DummyAddr) Network() string { return "dummy" } +func (addr DummyAddr) String() string { return "dummy" } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/queuepacketconn.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/queuepacketconn.go new file mode 100644 index 000000000..0552d3fb1 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn/queuepacketconn.go @@ -0,0 +1,163 @@ +package queuepacketconn + +import ( + "fmt" + "net" + "sync" + "sync/atomic" + "time" + + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap" +) + +// taggedPacket is a combination of a []byte and a net.Addr, encapsulating the +// return type of PacketConn.ReadFrom. +type taggedPacket struct { + P []byte + Addr net.Addr +} + +// QueuePacketConn implements net.PacketConn by storing queues of packets. There +// is one incoming queue (where packets are additionally tagged by the source +// address of the peer that sent them). There are many outgoing queues, one for +// each remote peer address that has been recently seen. The QueueIncoming +// method inserts a packet into the incoming queue, to eventually be returned by +// ReadFrom. WriteTo inserts a packet into an address-specific outgoing queue, +// which can later by accessed through the OutgoingQueue method. +type QueuePacketConn struct { + remotes *remotemap.RemoteMap + localAddr net.Addr + recvQueue chan taggedPacket + closeOnce sync.Once + closed chan struct{} + // What error to return when the QueuePacketConn is closed. + err atomic.Value +} + +// NewQueuePacketConn makes a new QueuePacketConn, set to track recent peers +// for at least a duration of timeout. +func NewQueuePacketConn(localAddr net.Addr, timeout time.Duration) *QueuePacketConn { + return &QueuePacketConn{ + remotes: remotemap.NewRemoteMap(timeout), + localAddr: localAddr, + recvQueue: make(chan taggedPacket, QueueSize), + closed: make(chan struct{}), + } +} + +// QueueIncoming queues and incoming packet and its source address, to be +// returned in a future call to ReadFrom. +func (c *QueuePacketConn) QueueIncoming(p []byte, addr net.Addr) { + select { + case <-c.closed: + // If we're closed, silently drop it. + return + default: + } + // Copy the slice so that the caller may reuse it. + buf := make([]byte, len(p)) + copy(buf, p) + select { + case c.recvQueue <- taggedPacket{buf, addr}: + default: + // Drop the incoming packet if the receive queue is full. + } +} + +// OutgoingQueue returns the queue of outgoing packets corresponding to addr, +// creating it if necessary. The contents of the queue will be packets that are +// written to the address in question using WriteTo. +func (c *QueuePacketConn) OutgoingQueue(addr net.Addr) <-chan []byte { + return c.remotes.Chan(addr) +} + +// ReadFrom returns a packet and address previously stored by QueueIncoming. +func (c *QueuePacketConn) ReadFrom(p []byte) (int, net.Addr, error) { + select { + case <-c.closed: + return 0, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Addr: c.LocalAddr(), Err: c.err.Load().(error)} + default: + } + select { + case <-c.closed: + return 0, nil, &net.OpError{Op: "read", Net: c.LocalAddr().Network(), Addr: c.LocalAddr(), Err: c.err.Load().(error)} + case packet := <-c.recvQueue: + return copy(p, packet.P), packet.Addr, nil + } +} + +// Read calls ReadFrom to read a packet. Created to implement net.Conn interface. +// Should be only used by stream-oriented transports (DoH, DoT), will return error if this is not the case. +func (c *QueuePacketConn) Read(b []byte) (int, error) { + n, remoteAddr, err := c.ReadFrom(b) + if remoteAddr.String() != "dummy" { + return 0, fmt.Errorf("use of Read on packet-oriented transport") + } + + return n, err +} + +// WriteTo queues an outgoing packet for the given address. The queue can later +// be retrieved using the OutgoingQueue method. +func (c *QueuePacketConn) WriteTo(p []byte, addr net.Addr) (int, error) { + select { + case <-c.closed: + return 0, &net.OpError{Op: "write", Net: c.LocalAddr().Network(), Addr: c.LocalAddr(), Err: c.err.Load().(error)} + default: + } + // Copy the slice so that the caller may reuse it. + buf := make([]byte, len(p)) + copy(buf, p) + select { + case c.remotes.Chan(addr) <- buf: + return len(buf), nil + default: + // Drop the outgoing packet if the send queue is full. + return len(buf), nil + } +} + +// Write calls WriteTo to read a packet. Created to implement net.Conn interface. +// This should be only used by stream-oriented transports (DoH, DoT). +func (c *QueuePacketConn) Write(b []byte) (int, error) { + return c.WriteTo(b, DummyAddr{}) +} + +// closeWithError unblocks pending operations and makes future operations fail +// with the given error. If err is nil, it becomes errClosedPacketConn. +func (c *QueuePacketConn) closeWithError(err error) error { + var newlyClosed bool + c.closeOnce.Do(func() { + newlyClosed = true + // Store the error to be returned by future PacketConn + // operations. + if err == nil { + err = errClosedPacketConn + } + c.err.Store(err) + close(c.closed) + }) + if !newlyClosed { + return &net.OpError{Op: "close", Net: c.LocalAddr().Network(), Addr: c.LocalAddr(), Err: c.err.Load().(error)} + } + return nil +} + +// Close unblocks pending operations and makes future operations fail with a +// "closed connection" error. +func (c *QueuePacketConn) Close() error { + return c.closeWithError(nil) +} + +// RemoteAddr returns a stub addr. Created to implement net.Conn interface. +// This should be only used by stream-oriented transports (DoH, DoT). +func (c *QueuePacketConn) RemoteAddr() net.Addr { + return DummyAddr{} +} + +// LocalAddr returns the localAddr value that was passed to NewQueuePacketConn. +func (c *QueuePacketConn) LocalAddr() net.Addr { return c.localAddr } + +func (c *QueuePacketConn) SetDeadline(t time.Time) error { return errNotImplemented } +func (c *QueuePacketConn) SetReadDeadline(t time.Time) error { return errNotImplemented } +func (c *QueuePacketConn) SetWriteDeadline(t time.Time) error { return errNotImplemented } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap/remotemap.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap/remotemap.go new file mode 100644 index 000000000..82b6c9076 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap/remotemap.go @@ -0,0 +1,152 @@ +package remotemap + +import ( + "container/heap" + "net" + "sync" + "time" +) + +const QueueSize = 128 + +// remoteRecord is a record of a recently seen remote peer, with the time it was +// last seen and queues of outgoing packets. +type remoteRecord struct { + Addr net.Addr + LastSeen time.Time + Chan chan []byte +} + +// RemoteMap manages a mapping of live remote peers, keyed by address, to their +// respective send queues. Each peer has two queues: a send queue, and a +// receive queue. +// RemoteMap's functions are safe to call from multiple goroutines. +type RemoteMap struct { + // We use an inner structure to avoid exposing public heap.Interface + // functions to users of remoteMap. + inner remoteMapInner + // Synchronizes access to inner. + lock sync.Mutex +} + +// NewRemoteMap creates a RemoteMap that expires peers after a timeout. +// +// If the timeout is 0, peers never expire. +func NewRemoteMap(timeout time.Duration) *RemoteMap { + m := &RemoteMap{ + inner: remoteMapInner{ + byAge: make([]*remoteRecord, 0), + byAddr: make(map[string]int), + }, + } + if timeout > 0 { + go func() { + for { + time.Sleep(timeout / 2) + now := time.Now() + m.lock.Lock() + m.inner.removeExpired(now, timeout) + m.lock.Unlock() + } + }() + } + return m +} + +// Returns the send channel corresponding to addr and indicates whether it is a new channel +func (m *RemoteMap) GetChan(addr net.Addr) (chan []byte, bool) { + m.lock.Lock() + defer m.lock.Unlock() + record, isNewAddr := m.inner.Lookup(addr, time.Now()) + return record.Chan, isNewAddr +} + +// Get Channel corresponding to addr +func (m *RemoteMap) Chan(addr net.Addr) chan []byte { + rv, _ := m.GetChan(addr) + return rv +} + +// remoteMapInner is the inner type of RemoteMap, implementing heap.Interface. +// byAge is the backing store, a heap ordered by LastSeen time, to facilitate +// expiring old records. byAddr is a map from addresses to heap indices, to +// allow looking up by address. Unlike RemoteMap, remoteMapInner requires +// external synchonization. +type remoteMapInner struct { + byAge []*remoteRecord + byAddr map[string]int +} + +// removeExpired removes all records whose LastSeen timestamp is more than +// timeout in the past. +func (inner *remoteMapInner) removeExpired(now time.Time, timeout time.Duration) { + for len(inner.byAge) > 0 && now.Sub(inner.byAge[0].LastSeen) >= timeout { + record := heap.Pop(inner).(*remoteRecord) + close(record.Chan) + } +} + +// Lookup finds the existing record corresponding to addr, or creates a new +// one if none exists yet. It updates the record's LastSeen time and returns the +// record. +func (inner *remoteMapInner) Lookup(addr net.Addr, now time.Time) (*remoteRecord, bool) { + var record *remoteRecord + i, ok := inner.byAddr[addr.String()] + if ok { + // Found one, update its LastSeen. + record = inner.byAge[i] + record.LastSeen = now + heap.Fix(inner, i) + } else { + // Not found, create a new one. + record = &remoteRecord{ + Addr: addr, + LastSeen: now, + Chan: make(chan []byte, QueueSize), + } + heap.Push(inner, record) + return record, true + } + return record, false +} + +// heap.Interface for remoteMapInner. + +func (inner *remoteMapInner) Len() int { + if len(inner.byAge) != len(inner.byAddr) { + panic("inconsistent remoteMap") + } + return len(inner.byAge) +} + +func (inner *remoteMapInner) Less(i, j int) bool { + return inner.byAge[i].LastSeen.Before(inner.byAge[j].LastSeen) +} + +func (inner *remoteMapInner) Swap(i, j int) { + inner.byAge[i], inner.byAge[j] = inner.byAge[j], inner.byAge[i] + inner.byAddr[inner.byAge[i].Addr.String()] = i + inner.byAddr[inner.byAge[j].Addr.String()] = j +} + +func (inner *remoteMapInner) Push(x interface{}) { + record := x.(*remoteRecord) + if _, ok := inner.byAddr[record.Addr.String()]; ok { + panic("duplicate address in remoteMap") + } + // Insert into byAddr map. + inner.byAddr[record.Addr.String()] = len(inner.byAge) + // Insert into byAge slice. + inner.byAge = append(inner.byAge, record) +} + +func (inner *remoteMapInner) Pop() interface{} { + n := len(inner.byAddr) + // Remove from byAge slice. + record := inner.byAge[n-1] + inner.byAge[n-1] = nil + inner.byAge = inner.byAge[:n-1] + // Remove from byAddr map. + delete(inner.byAddr, record.Addr.String()) + return record +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/config.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/config.go new file mode 100644 index 000000000..5d78c55df --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/config.go @@ -0,0 +1,63 @@ +package requester + +import ( + "fmt" + "net" +) + +type Config struct { + // TransportMethod is the transport method to be used + TransportMethod TransportMethodType + + // Target is the target addr/url for the recursive DNS server used + Target string + + // Domain is the base domain for the DNS request that the responder is authoritative for + BaseDomain string + + // Pubkey is the public key for the listening responder + Pubkey []byte + + // UtlsDistribution allows utls distribution to be specified for the utls connection used during DoH and DoT + UtlsDistribution string + + // DialTransport allows for a custom dialer to be used for the underlying TCP/UDP transport + DialTransport dialFunc +} + +// TransportMethodType declares the transport method to be used +type TransportMethodType int + +const ( + DoH TransportMethodType = iota + DoT + UDP +) + +func defaultDialTransport() dialFunc { + dialer := net.Dialer{} + return dialer.DialContext +} + +func (c *Config) dialTransport() dialFunc { + if c.DialTransport == nil { + return defaultDialTransport() + } + return c.DialTransport +} + +func validateConfig(config *Config) error { + if config == nil { + return fmt.Errorf("no config provided") + } + + if config.Target == "" { + return fmt.Errorf("no target configured") + } + + if config.BaseDomain == "" { + return fmt.Errorf("no base domain configured") + } + + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/dns.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/dns.go new file mode 100644 index 000000000..9d3ef6fd6 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/dns.go @@ -0,0 +1,216 @@ +package requester + +import ( + "bytes" + "crypto/rand" + "encoding/base32" + "encoding/binary" + "log" + "net" + + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn" +) + +// base32Encoding is a base32 encoding without padding. +var base32Encoding = base32.StdEncoding.WithPadding(base32.NoPadding) + +// DNSPacketConn provides a packet-sending and -receiving interface over various +// forms of DNS. It handles the details of how packets and padding are encoded +// as a DNS name in the Question section of an upstream query, and as a TXT RR +// in downstream responses. +// +// DNSPacketConn does not handle the mechanics of actually sending and receiving +// encoded DNS messages. That is rather the responsibility of some other +// net.PacketConn such as net.UDPConn, HTTPPacketConn, or TLSPacketConn, one of +// which must be provided to NewDNSPacketConn. +type DNSPacketConn struct { + domain dns.Name + // QueuePacketConn is the direct receiver of ReadFrom and WriteTo calls. + // recvLoop and sendLoop take the messages out of the receive and send + // queues and actually put them on the network. + *queuepacketconn.QueuePacketConn +} + +// NewDNSPacketConn creates a new DNSPacketConn. transport, through its WriteTo +// and ReadFrom methods, handles the actual sending and receiving the DNS +// messages encoded by DNSPacketConn. addr is the address to be passed to +// transport.WriteTo whenever a message needs to be sent. +func NewDNSPacketConn(transport net.Conn, addr net.Addr, domain dns.Name) *DNSPacketConn { + // Generate a new random ClientID. + c := &DNSPacketConn{ + domain: domain, + QueuePacketConn: queuepacketconn.NewQueuePacketConn(queuepacketconn.DummyAddr{}, 0), + } + go func() { + err := c.recvLoop(transport) + if err != nil { + log.Printf("recvLoop: %v", err) + } + }() + go func() { + err := c.sendLoop(transport, addr) + if err != nil { + log.Printf("sendLoop: %v", err) + } + }() + return c +} + +// dnsResponsePayload extracts the downstream payload of a DNS response, encoded +// into the RDATA of a TXT RR. It returns nil if the message doesn't pass format +// checks, or if the name in its Question entry is not a subdomain of domain. +func dnsResponsePayload(resp *dns.Message, domain dns.Name) []byte { + if resp.Flags&0x8000 != 0x8000 { + // QR != 1, this is not a response. + return nil + } + if resp.Flags&0x000f != dns.RcodeNoError { + return nil + } + + if len(resp.Answer) != 1 { + return nil + } + answer := resp.Answer[0] + + _, ok := answer.Name.TrimSuffix(domain) + if !ok { + // Not the name we are expecting. + return nil + } + + if answer.Type != dns.RRTypeTXT { + // We only support TYPE == TXT. + return nil + } + payload, err := dns.DecodeRDataTXT(answer.Data) + if err != nil { + return nil + } + + return payload +} + +// recvLoop repeatedly calls transport.ReadFrom to receive a DNS message, +// extracts its payload and breaks it into packets, and stores the packets in a +// queue to be returned from a future call to c.ReadFrom. +func (c *DNSPacketConn) recvLoop(transport net.Conn) error { + for { + var buf [4096]byte + n, err := transport.Read(buf[:]) + if err != nil { + if err, ok := err.(net.Error); ok { + log.Printf("ReadFrom error: %v", err) + continue + } + return err + } + + // Got a response. Try to parse it as a DNS message. + resp, err := dns.MessageFromWireFormat(buf[:n]) + if err != nil { + log.Printf("MessageFromWireFormat: %v", err) + continue + } + + payload := dnsResponsePayload(&resp, c.domain) + + c.QueuePacketConn.QueueIncoming(payload, transport.RemoteAddr()) + } +} + +// chunks breaks p into non-empty subslices of at most n bytes, greedily so that +// only final subslice has length < n. +func chunks(p []byte, n int) [][]byte { + var result [][]byte + for len(p) > 0 { + sz := len(p) + if sz > n { + sz = n + } + result = append(result, p[:sz]) + p = p[sz:] + } + return result +} + +// send sends p as a single packet encoded into a DNS query, using +// transport.WriteTo(query, addr). The length of p must be less than 224 bytes. +// +// 0. Start with the raw packet contents. +// supercalifragilisticexpialidocious +// 1. Base32-encode, without padding and in lower case. +// ingesrkokreujy6zumkse43vobsxey3bnruwm4tbm5uwy2ltoruwgzlyobuwc3djmrxwg2lpovzq +// 2. Break into labels of at most 63 octets. +// ingesrkokreujy6zumkse43vobsxey3bnruwm4tbm5uwy2ltoruwgzlyobuwc3d.jmrxwg2lpovzq +// 3. Append the domain. +// ingesrkokreujy6zumkse43vobsxey3bnruwm4tbm5uwy2ltoruwgzlyobuwc3d.jmrxwg2lpovzq.t.example.com +func (c *DNSPacketConn) send(transport net.Conn, p []byte) error { + encoded := make([]byte, base32Encoding.EncodedLen(len(p))) + base32Encoding.Encode(encoded, p) + encoded = bytes.ToLower(encoded) + labels := chunks(encoded, 63) + labels = append(labels, c.domain...) + name, err := dns.NewName(labels) + if err != nil { + return err + } + + var id uint16 + err = binary.Read(rand.Reader, binary.BigEndian, &id) + if err != nil { + return err + } + + query := &dns.Message{ + ID: id, + Flags: 0x0100, // QR = 0, RD = 1 + Question: []dns.Question{ + { + Name: name, + Type: dns.RRTypeTXT, + Class: dns.ClassIN, + }, + }, + // EDNS(0) + Additional: []dns.RR{ + { + Name: dns.Name{}, + Type: dns.RRTypeOPT, + Class: 4096, // requester's UDP payload size + TTL: 0, // extended RCODE and flags + Data: []byte{}, + }, + }, + } + buf, err := query.WireFormat() + if err != nil { + return err + } + + _, err = transport.Write(buf) + return err +} + +// sendLoop takes packets that have been written using c.WriteTo, and sends them +// on the network using send. It also does polling with empty packets when +// requested by pollChan or after a timeout. +func (c *DNSPacketConn) sendLoop(transport net.Conn, addr net.Addr) error { + for { + var p []byte + outgoing := c.QueuePacketConn.OutgoingQueue(addr) + // Prioritize sending an actual data packet from outgoing. Only + // consider a poll when outgoing is empty. + p = <-outgoing + + // Unlike in the server, in the client we assume that because + // the data capacity of queries is so limited, it's not worth + // trying to send more than one packet per query. + err := c.send(transport, p) + if err != nil { + log.Printf("send: %v", err) + continue + } + } +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/http.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/http.go new file mode 100644 index 000000000..e9b0667d0 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/http.go @@ -0,0 +1,175 @@ +package requester + +import ( + "bytes" + "fmt" + "io" + "log" + "net/http" + "strconv" + "sync" + "time" + + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn" +) + +// A default Retry-After delay to use when there is no explicit Retry-After +// header in an HTTP response. +const defaultRetryAfter = 10 * time.Second + +// HTTPPacketConn is an HTTP-based transport for DNS messages, used for DNS over +// HTTPS (DoH). Its WriteTo and ReadFrom methods exchange DNS messages over HTTP +// requests and responses. +// +// HTTPPacketConn deals only with already formatted DNS messages. It does not +// handle encoding information into the messages. That is rather the +// responsibility of DNSPacketConn. +// +// https://tools.ietf.org/html/rfc8484 +type HTTPPacketConn struct { + // client is the http.Client used to make requests. We use this instead + // of http.DefaultClient in order to support setting a timeout and a + // uTLS fingerprint. + client *http.Client + + // urlString is the URL to which HTTP requests will be sent, for example + // "https://doh.example/dns-query". + urlString string + + // notBefore, if not zero, is a time before which we may not send any + // queries; queries are buffered or dropped until that time. notBefore + // is set when we get a 429 Too Many Requests HTTP response or other + // unexpected status code that causes us to need to slow down. It is set + // according to the Retry-After header if available, otherwise it is set + // to defaultRetryAfter in the future. notBeforeLock controls access to + // notBefore. + notBefore time.Time + notBeforeLock sync.RWMutex + + // QueuePacketConn is the direct receiver of ReadFrom and WriteTo calls. + // sendLoop, via send, removes messages from the outgoing queue that + // were placed there by WriteTo, and inserts messages into the incoming + // queue to be returned from ReadFrom. + *queuepacketconn.QueuePacketConn +} + +// NewHTTPPacketConn creates a new HTTPPacketConn configured to use the HTTP +// server at urlString as a DNS over HTTP resolver. client is the http.Client +// that will be used to make requests. urlString should include any necessary +// path components; e.g., "/dns-query". numSenders is the number of concurrent +// sender-receiver goroutines to run. +func NewHTTPPacketConn(rt http.RoundTripper, urlString string, numSenders int) (*HTTPPacketConn, error) { + c := &HTTPPacketConn{ + client: &http.Client{ + Transport: rt, + Timeout: 1 * time.Minute, + }, + urlString: urlString, + QueuePacketConn: queuepacketconn.NewQueuePacketConn(queuepacketconn.DummyAddr{}, 0), + } + for i := 0; i < numSenders; i++ { + go c.sendLoop() + } + return c, nil +} + +// send sends a message in an HTTP request, and queues the body HTTP response to +// be returned from a future call to ReadFrom. +func (c *HTTPPacketConn) send(p []byte) error { + req, err := http.NewRequest("POST", c.urlString, bytes.NewReader(p)) + if err != nil { + return err + } + req.Header.Set("Accept", "application/dns-message") + req.Header.Set("Content-Type", "application/dns-message") + req.Header.Set("User-Agent", "") // Disable default "Go-http-client/1.1". + resp, err := c.client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + if ct := resp.Header.Get("Content-Type"); ct != "application/dns-message" { + return fmt.Errorf("unknown HTTP response Content-Type %+q", ct) + } + body, err := io.ReadAll(io.LimitReader(resp.Body, 64000)) + if err == nil { + c.QueuePacketConn.QueueIncoming(body, queuepacketconn.DummyAddr{}) + } + // Ignore err != nil; don't report an error if we at least + // managed to send. + default: + // We primarily are thinking of 429 Too Many Requests here, but + // any other unexpected response codes will also cause us to + // rate-limit ourselves and emit a log message. + // https://developers.google.com/speed/public-dns/docs/doh/#errors + now := time.Now() + var retryAfter time.Time + if value := resp.Header.Get("Retry-After"); value != "" { + var err error + retryAfter, err = parseRetryAfter(value, now) + if err != nil { + log.Printf("cannot parse Retry-After value %+q", value) + } + } + if retryAfter.IsZero() { + // Supply a default. + retryAfter = now.Add(defaultRetryAfter) + } + if retryAfter.Before(now) { + log.Printf("got %+q, but Retry-After is %v in the past", + resp.Status, now.Sub(retryAfter)) + } else { + c.notBeforeLock.Lock() + if retryAfter.Before(c.notBefore) { + log.Printf("got %+q, but Retry-After is %v earlier than already received Retry-After", + resp.Status, c.notBefore.Sub(retryAfter)) + } else { + log.Printf("got %+q; ceasing sending for %v", + resp.Status, retryAfter.Sub(now)) + c.notBefore = retryAfter + } + c.notBeforeLock.Unlock() + } + } + + return nil +} + +// sendLoop loops over the contents of the outgoing queue and passes them to +// send. It drops packets while c.notBefore is in the future. +func (c *HTTPPacketConn) sendLoop() { + for p := range c.QueuePacketConn.OutgoingQueue(queuepacketconn.DummyAddr{}) { + // Stop sending while we are rate-limiting ourselves (as a + // result of a Retry-After response header, for example). + c.notBeforeLock.RLock() + notBefore := c.notBefore + c.notBeforeLock.RUnlock() + if wait := time.Until(notBefore); wait > 0 { + // Drop it. + continue + } + + err := c.send(p) + if err != nil { + log.Printf("sendLoop: %v", err) + } + } +} + +// parseRetryAfter parses the value of a Retry-After header as an absolute +// time.Time. +func parseRetryAfter(value string, now time.Time) (time.Time, error) { + // May be a date string or an integer number of seconds. + // https://tools.ietf.org/html/rfc7231#section-7.1.3 + if t, err := http.ParseTime(value); err == nil { + return t, nil + } + i, err := strconv.ParseUint(value, 10, 32) + if err != nil { + return time.Time{}, err + } + return now.Add(time.Duration(i) * time.Second), nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/requester.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/requester.go new file mode 100644 index 000000000..e8272e686 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/requester.go @@ -0,0 +1,274 @@ +package requester + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + + "github.com/flynn/noise" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn" + utls "github.com/refraction-networking/utls" +) + +type dialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) + +type Requester struct { + // transport is the underlying transport used for the dns request + transport net.PacketConn + // dialTransport is used for constructing the transport on the first request + // this allows us to not dial anything until the first request, while avoid storing + // a lot of internal state in Requester + dialTransport func(dialer dialFunc) (net.PacketConn, error) + + // dialer is the dialer to be used for the underlying TCP/UDP transport + dialer dialFunc + + // remote address + remoteAddr net.Addr + + // server public key + pubkey []byte +} + +// New Requester using DoT as transport +func dialDoT(dotaddr string, utlsDistribution string, dialTransport dialFunc) (net.Conn, error) { + utlsClientHelloID, err := sampleUTLSDistribution(utlsDistribution) + if err != nil { + return nil, err + } + + var dialTLSContext func(ctx context.Context, network, addr string) (net.Conn, error) + if utlsClientHelloID == nil { + dialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + conn, err := dialTransport(ctx, network, addr) + if err != nil { + return nil, err + } + return tls.Client(conn, &tls.Config{}), nil + } + } else { + dialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + return utlsDialContext(ctx, network, addr, nil, utlsClientHelloID, dialTransport) + } + } + dotconn, err := NewTLSPacketConn(dotaddr, dialTLSContext) + if err != nil { + return nil, err + } + + return dotconn, nil +} + +// New Requester using DoH as transport +func dialDoH(dohurl string, utlsDistribution string, dialTransport dialFunc) (net.Conn, error) { + utlsClientHelloID, err := sampleUTLSDistribution(utlsDistribution) + if err != nil { + return nil, err + } + + var rt http.RoundTripper + if utlsClientHelloID == nil { + transport := http.DefaultTransport.(*http.Transport).Clone() + // Disable DefaultTransport's default Proxy = + // ProxyFromEnvironment setting, for conformity + // with utlsRoundTripper and with DoT mode, + // which do not take a proxy from the + // environment. + transport.DialContext = dialTransport + transport.Proxy = nil + rt = transport + } else { + rt = NewUTLSRoundTripper(nil, utlsClientHelloID, dialTransport) + } + + dohconn, err := NewHTTPPacketConn(rt, dohurl, 32) + if err != nil { + return nil, err + } + + return dohconn, nil +} + +// New Requester using UDP as transport +func dialUDP(remoteAddr string, dialContext dialFunc) (net.Conn, error) { + udpConn, err := dialContext(context.Background(), "udp", remoteAddr) + if err != nil { + return nil, fmt.Errorf("error dialing udp connection: %v", err) + } + + return udpConn, nil +} + +func resolveAddr(config *Config) (net.Addr, error) { + switch config.TransportMethod { + case DoH, DoT: + return queuepacketconn.DummyAddr{}, nil + case UDP: + addr, err := net.ResolveUDPAddr("udp", config.Target) + if err != nil { + return nil, fmt.Errorf("error resolving UDP addr: %v", err) + } + return addr, nil + } + + return nil, fmt.Errorf("invalid transport type configured") +} + +func NewRequester(config *Config) (*Requester, error) { + err := validateConfig(config) + if err != nil { + return nil, fmt.Errorf("error validaing config: %v", err) + } + + baseDomain, err := dns.ParseName(config.BaseDomain) + if err != nil { + return nil, fmt.Errorf("error parsing domain: %v", err) + } + + addr, err := resolveAddr(config) + if err != nil { + return nil, fmt.Errorf("error resolving addr from config: %v", err) + } + + dialTransport := func(dialer dialFunc) (net.PacketConn, error) { + switch config.TransportMethod { + case DoT: + conn, err := dialDoT(config.Target, config.UtlsDistribution, dialer) + if err != nil { + return nil, fmt.Errorf("error dialing DoT connection: %v", err) + } + + return NewDNSPacketConn(conn, addr, baseDomain), nil + case DoH: + conn, err := dialDoH(config.Target, config.UtlsDistribution, dialer) + if err != nil { + return nil, fmt.Errorf("error dialing DoH connection: %v", err) + } + + return NewDNSPacketConn(conn, addr, baseDomain), nil + case UDP: + conn, err := dialUDP(config.Target, dialer) + if err != nil { + return nil, fmt.Errorf("error dialing UDP connection: %v", err) + } + + return NewDNSPacketConn(conn, addr, baseDomain), nil + } + + return nil, fmt.Errorf("invalid transport type configured") + } + + return &Requester{ + dialTransport: dialTransport, + dialer: config.dialTransport(), + remoteAddr: addr, + pubkey: config.Pubkey, + }, nil +} + +// Send the payload together with noise handshake, returns noise recvCipher for decrypting response +func (r *Requester) sendHandshake(payload []byte) (*noise.CipherState, *noise.CipherState, error) { + config := encryption.NewConfig() + config.Initiator = true + config.PeerStatic = r.pubkey + handshakeState, err := noise.NewHandshakeState(config) + if err != nil { + return nil, nil, err + } + msgToSend, recvCipher, sendCipher, err := handshakeState.WriteMessage(nil, payload) + if err != nil { + return nil, nil, err + } + msgToSend, err = msgformat.AddRequestFormat([]byte(msgToSend)) + if err != nil { + return nil, nil, err + } + _, err = r.transport.WriteTo(msgToSend, r.remoteAddr) + if err != nil { + return nil, nil, err + } + return recvCipher, sendCipher, nil +} + +// SetDialer sets a custom dialer for the underlying TCP/UDP transport +func (r *Requester) SetDialer(dialer dialFunc) error { + if dialer == nil { + return fmt.Errorf("no dialer provided") + } + + r.dialer = dialer + return nil +} + +func (r *Requester) RequestAndRecv(sendBytes []byte) ([]byte, error) { + if r.transport == nil { + transport, err := r.dialTransport(r.dialer) + if err != nil { + return nil, fmt.Errorf("error dialing transport: %v", err) + } + + r.transport = transport + } + + recvCipher, _, err := r.sendHandshake(sendBytes) + if err != nil { + return nil, err + } + + var recvBuf [4096]byte + for { + _, recvAddr, err := r.transport.ReadFrom(recvBuf[:]) + if err != nil { + return nil, err + } + if recvAddr.String() == r.remoteAddr.String() { + break + } + } + + encryptedBuf, err := msgformat.RemoveResponseFormat(recvBuf[:]) + if err != nil { + return nil, err + } + + recvBytes, err := recvCipher.Decrypt(nil, nil, encryptedBuf) + if err != nil { + return nil, err + } + + return recvBytes, nil +} + +func (r *Requester) Close() error { + return r.transport.Close() +} + +// sampleUTLSDistribution parses a weighted uTLS Client Hello ID distribution +// string of the form "3*Firefox,2*Chrome,1*iOS", matches each label to a +// utls.ClientHelloID from utlsClientHelloIDMap, and randomly samples one +// utls.ClientHelloID from the distribution. +func sampleUTLSDistribution(spec string) (*utls.ClientHelloID, error) { + weights, labels, err := parseWeightedList(spec) + if err != nil { + return nil, err + } + ids := make([]*utls.ClientHelloID, 0, len(labels)) + for _, label := range labels { + var id *utls.ClientHelloID + if label == "none" { + id = nil + } else { + id = utlsLookup(label) + if id == nil { + return nil, fmt.Errorf("unknown TLS fingerprint %q", label) + } + } + ids = append(ids, id) + } + return ids[sampleWeighted(weights)], nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/tls.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/tls.go new file mode 100644 index 000000000..727811f71 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/tls.go @@ -0,0 +1,134 @@ +package requester + +import ( + "bufio" + "context" + "encoding/binary" + "io" + "log" + "net" + "sync" + "time" + + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn" +) + +const dialTimeout = 30 * time.Second + +// TLSPacketConn is a TLS- and TCP-based transport for DNS messages, used for +// DNS over TLS (DoT). Its WriteTo and ReadFrom methods exchange DNS messages +// over a TLS channel, prefixing each message with a two-octet length field as +// in DNS over TCP. +// +// TLSPacketConn deals only with already formatted DNS messages. It does not +// handle encoding information into the messages. That is rather the +// responsibility of DNSPacketConn. +// +// https://tools.ietf.org/html/rfc7858 +type TLSPacketConn struct { + // QueuePacketConn is the direct receiver of ReadFrom and WriteTo calls. + // recvLoop and sendLoop take the messages out of the receive and send + // queues and actually put them on the network. + *queuepacketconn.QueuePacketConn +} + +// NewTLSPacketConn creates a new TLSPacketConn configured to use the TLS +// server at addr as a DNS over TLS resolver. It maintains a TLS connection to +// the resolver, reconnecting as necessary. It closes the connection if any +// reconnection attempt fails. +func NewTLSPacketConn(addr string, dialTLSContext func(ctx context.Context, network, addr string) (net.Conn, error)) (*TLSPacketConn, error) { + dial := func() (net.Conn, error) { + ctx, cancel := context.WithTimeout(context.Background(), dialTimeout) + defer cancel() + return dialTLSContext(ctx, "tcp", addr) + } + // We maintain one TLS connection at a time, redialing it whenever it + // becomes disconnected. We do the first dial here, outside the + // goroutine, so that any immediate and permanent connection errors are + // reported directly to the caller of NewTLSPacketConn. + conn, err := dial() + if err != nil { + return nil, err + } + c := &TLSPacketConn{ + QueuePacketConn: queuepacketconn.NewQueuePacketConn(queuepacketconn.DummyAddr{}, 0), + } + go func() { + defer c.Close() + for { + var wg sync.WaitGroup + wg.Add(2) + go func() { + err := c.recvLoop(conn) + if err != nil { + log.Printf("recvLoop: %v", err) + } + wg.Done() + }() + go func() { + err := c.sendLoop(conn) + if err != nil { + log.Printf("sendLoop: %v", err) + } + wg.Done() + }() + wg.Wait() + conn.Close() + + // Whenever the TLS connection dies, redial a new one. + conn, err = dial() + if err != nil { + log.Printf("dial tls: %v", err) + break + } + } + }() + return c, nil +} + +// recvLoop reads length-prefixed messages from conn and passes them to the +// incoming queue. +func (c *TLSPacketConn) recvLoop(conn net.Conn) error { + br := bufio.NewReader(conn) + for { + var length uint16 + err := binary.Read(br, binary.BigEndian, &length) + if err != nil { + if err == io.EOF { + err = nil + } + return err + } + p := make([]byte, int(length)) + _, err = io.ReadFull(br, p) + if err != nil { + return err + } + c.QueuePacketConn.QueueIncoming(p, queuepacketconn.DummyAddr{}) + } +} + +// sendLoop reads messages from the outgoing queue and writes them, +// length-prefixed, to conn. +func (c *TLSPacketConn) sendLoop(conn net.Conn) error { + bw := bufio.NewWriter(conn) + for p := range c.QueuePacketConn.OutgoingQueue(queuepacketconn.DummyAddr{}) { + length := uint16(len(p)) + if int(length) != len(p) { + panic(len(p)) + } + err := binary.Write(bw, binary.BigEndian, &length) + if err != nil { + return err + } + _, err = bw.Write(p) + if err != nil { + return err + } + err = bw.Flush() + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/utls.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/utls.go new file mode 100644 index 000000000..26d00e3e4 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/utls.go @@ -0,0 +1,270 @@ +package requester + +// Support code for TLS camouflage using uTLS. + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "sync" + + utls "github.com/refraction-networking/utls" + "golang.org/x/net/http2" +) + +// utlsClientHelloIDMap is a correspondence between human-readable labels and +// supported utls.ClientHelloIDs. +var utlsClientHelloIDMap = []struct { + Label string + ID *utls.ClientHelloID +}{ + {"Firefox", &utls.HelloFirefox_Auto}, + {"Firefox_55", &utls.HelloFirefox_55}, + {"Firefox_56", &utls.HelloFirefox_56}, + {"Firefox_63", &utls.HelloFirefox_63}, + {"Firefox_65", &utls.HelloFirefox_65}, + {"Chrome", &utls.HelloChrome_Auto}, + {"Chrome_58", &utls.HelloChrome_58}, + {"Chrome_62", &utls.HelloChrome_62}, + {"Chrome_70", &utls.HelloChrome_70}, + {"Chrome_72", &utls.HelloChrome_72}, + {"Chrome_83", &utls.HelloChrome_83}, + {"iOS", &utls.HelloIOS_Auto}, + {"iOS_11_1", &utls.HelloIOS_11_1}, + {"iOS_12_1", &utls.HelloIOS_12_1}, +} + +// utlsLookup returns a *utls.ClientHelloID from utlsClientHelloIDMap by a +// case-insensitive label match, or nil if there is no match. +func utlsLookup(label string) *utls.ClientHelloID { + for _, entry := range utlsClientHelloIDMap { + if strings.EqualFold(label, entry.Label) { + return entry.ID + } + } + return nil +} + +// utlsDialContext connects to the given network address and initiates a TLS +// handshake with the provided ClientHelloID, and returns the resulting TLS +// connection. +func utlsDialContext(ctx context.Context, network, addr string, config *utls.Config, id *utls.ClientHelloID, tcpDialContex func(context.Context, string, string) (net.Conn, error)) (*utls.UConn, error) { + // Set the SNI from addr, if not already set. + if config == nil { + config = &utls.Config{} + } + if config.ServerName == "" { + config = config.Clone() + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + config.ServerName = host + } + conn, err := tcpDialContex(ctx, network, addr) + if err != nil { + return nil, err + } + uconn := utls.UClient(conn, config, *id) + // Manually remove the SNI if it contains an IP address. + // https://github.com/refraction-networking/utls/issues/96 + if net.ParseIP(config.ServerName) != nil { + err := uconn.RemoveSNIExtension() + if err != nil { + uconn.Close() + return nil, err + } + } + // We must call Handshake before returning, or else the UConn may not + // actually use the selected ClientHelloID. It depends on whether a Read + // or a Write happens first. If a Read happens first, the connection + // will use the normal crypto/tls fingerprint. If a Write happens first, + // it will use the selected fingerprint as expected. + // https://github.com/refraction-networking/utls/issues/75 + err = uconn.Handshake() + if err != nil { + uconn.Close() + return nil, err + } + return uconn, nil +} + +// The goal of utlsRoundTripper is: provide an http.RoundTripper abstraction +// that retains the features of http.Transport (e.g., persistent connections and +// HTTP/2 support), while making TLS connections using uTLS in place of +// crypto/tls. The challenge is: while http.Transport provides a DialTLSContext +// hook, setting it to non-nil disables automatic HTTP/2 support in the client. +// Most of the uTLS fingerprints contain an ALPN extension containing "h2"; +// i.e., they declare support for HTTP/2. If the server also supports HTTP/2, +// then uTLS may negotiate an HTTP/2 connection without the http.Transport +// knowing it, which leads to an HTTP/1.1 client speaking to an HTTP/2 server, a +// protocol error. +// +// The code here uses an idea adapted from meek_lite in obfs4proxy: +// https://gitlab.com/yawning/obfs4/commit/4d453dab2120082b00bf6e63ab4aaeeda6b8d8a3 +// Instead of setting DialTLSContext on an http.Transport and exposing it +// directly, we expose a wrapper type, utlsRoundTripper, which contains within +// it either an http.Transport or an http2.Transport. The first time a caller +// calls RoundTrip on the wrapper, we initiate a uTLS connection +// (bootstrapConn), then peek at the ALPN-negotiated protocol: if "h2", create +// an internal http2.Transport; otherwise, create an internal http.Transport. In +// either case, set DialTLSContext (or DialTLS for http2.Transport) on the +// created Transport to a function that dials using uTLS. As a special case, the +// first time the DialTLS callback is called, it reuses bootstrapConn (the one +// made to peek at the ALPN), rather than make a new connection. +// +// Subsequent calls to RoundTripper on the wrapper just pass the requests though +// the previously created http.Transport or http2.Transport. We assume that in +// future RoundTrips, the ALPN-negotiated protocol will remain the same as it +// was in the initial RoundTrip. At this point it is the http.Transport or +// http2.Transport calling DialTLSContext, not us, so we cannot dynamically swap +// the underlying transport based on the ALPN. +// +// https://bugs.torproject.org/tpo/anti-censorship/pluggable-transports/meek/29077 +// https://github.com/refraction-networking/utls/issues/16 + +// utlsRoundTripper is an http.RoundTripper that uses uTLS (with a specified +// ClientHelloID) to make TLS connections. +// +// Can only be reused among servers which negotiate the same ALPN. +type utlsRoundTripper struct { + clientHelloID *utls.ClientHelloID + config *utls.Config + innerLock sync.Mutex + inner http.RoundTripper + tcpDialContext func(ctx context.Context, network, addr string) (net.Conn, error) +} + +// NewUTLSRoundTripper creates a utlsRoundTripper with the given TLS +// configuration and ClientHelloID. +func NewUTLSRoundTripper(config *utls.Config, id *utls.ClientHelloID, tcpDialContext func(ctx context.Context, network, addr string) (net.Conn, error)) *utlsRoundTripper { + return &utlsRoundTripper{ + clientHelloID: id, + config: config, + tcpDialContext: tcpDialContext, + // inner will be set in the first call to RoundTrip. + } +} + +func (rt *utlsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + switch req.URL.Scheme { + case "http": + // If http, don't invoke uTLS; just pass it to an ordinary http.Transport. + transport := http.DefaultTransport.(*http.Transport).Clone() + transport.DialContext = rt.tcpDialContext + return transport.RoundTrip(req) + case "https": + default: + return nil, fmt.Errorf("unsupported URL scheme %q", req.URL.Scheme) + } + + var err error + rt.innerLock.Lock() + if rt.inner == nil { + // On the first call, make an http.Transport or http2.Transport + // as appropriate. + rt.inner, err = makeRoundTripper(req, rt.config, rt.clientHelloID, rt.tcpDialContext) + } + rt.innerLock.Unlock() + if err != nil { + return nil, err + } + + // Forward the request to the inner http.Transport or http2.Transport. + return rt.inner.RoundTrip(req) +} + +// makeRoundTripper makes a bootstrap TLS configuration using the given TLS +// configuration and ClientHelloID, and creates an http.Transport or +// http2.Transport, depending on the negotated ALPN. The Transport is set up to +// make future TLS connections using the same TLS configuration and +// ClientHelloID. +func makeRoundTripper(req *http.Request, config *utls.Config, id *utls.ClientHelloID, tcpDialContext func(ctx context.Context, network, addr string) (net.Conn, error)) (http.RoundTripper, error) { + addr, err := addrForDial(req.URL) + if err != nil { + return nil, err + } + + bootstrapConn, err := utlsDialContext(req.Context(), "tcp", addr, config, id, tcpDialContext) + if err != nil { + return nil, err + } + + // Peek at the ALPN-negotiated protocol. + protocol := bootstrapConn.ConnectionState().NegotiatedProtocol + + // Protects bootstrapConn. + var lock sync.Mutex + // This is the callback for future dials done by the inner + // http.Transport or http2.Transport. + dialTLSContext := func(ctx context.Context, network, addr string) (net.Conn, error) { + lock.Lock() + defer lock.Unlock() + + // On the first dial, reuse bootstrapConn. + if bootstrapConn != nil { + uconn := bootstrapConn + bootstrapConn = nil + return uconn, nil + } + + // Later dials make a new connection. + uconn, err := utlsDialContext(ctx, "tcp", addr, config, id, tcpDialContext) + if err != nil { + return nil, err + } + if uconn.ConnectionState().NegotiatedProtocol != protocol { + return nil, fmt.Errorf("unexpected switch from ALPN %q to %q", + protocol, uconn.ConnectionState().NegotiatedProtocol) + } + + return uconn, nil + } + + // Construct an http.Transport or http2.Transport depending on ALPN. + switch protocol { + case http2.NextProtoTLS: + // Unfortunately http2.Transport does not expose the same + // configuration options as http.Transport with regard to + // timeouts, etc., so we are at the mercy of the defaults. + // https://github.com/golang/go/issues/16581 + return &http2.Transport{ + DialTLS: func(network, addr string, _ *tls.Config) (net.Conn, error) { + // Ignore the *tls.Config parameter; use our + // static config instead. + return dialTLSContext(context.Background(), network, addr) + }, + }, nil + default: + // With http.Transport, copy important default fields from + // http.DefaultTransport, such as TLSHandshakeTimeout and + // IdleConnTimeout, before overriding DialTLSContext. + tr := http.DefaultTransport.(*http.Transport).Clone() + tr.DialTLSContext = dialTLSContext + return tr, nil + } +} + +// addrForDial extracts a host:port address from a URL, suitable for dialing. +func addrForDial(url *url.URL) (string, error) { + host := url.Hostname() + // net/http would use golang.org/x/net/idna here, to convert a possible + // internationalized domain name to ASCII. + port := url.Port() + if port == "" { + // No port? Use the default for the scheme. + switch url.Scheme { + case "http": + port = "80" + case "https": + port = "443" + default: + return "", fmt.Errorf("unsupported URL scheme %q", url.Scheme) + } + } + return net.JoinHostPort(host, port), nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/weightedlist.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/weightedlist.go new file mode 100644 index 000000000..45d2a5d9f --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester/weightedlist.go @@ -0,0 +1,201 @@ +package requester + +// Random selection from weighted distributions, and strings for specifying such +// distributions. + +import ( + cryptorand "crypto/rand" + "encoding/binary" + "fmt" + mathrand "math/rand" + "strconv" + "strings" +) + +// parseWeightedList parses a list of text labels with optional numeric weights, +// and returns parallel slices of weights and labels. If a weight is omitted for +// a label, the weight is 1. +// +// An example weighted list string is "2*apple,orange,10*cookie". This example +// results in the slices [2, 1, 10] and ["apple", "orange", "cookie"]. +// Bytes may be escaped by backslashes. +// +// list ::= entry ("," entry)* +// entry ::= (weight "*")? label +func parseWeightedList(s string) ([]uint32, []string, error) { + const ( + kindEOF = iota + kindComma + kindAsterisk + kindText + kindError + ) + type token struct { + Kind int + Text string + } + + var i int + // nextToken incrementally consumes s and returns tokens. + nextToken := func() token { + if !(i < len(s)) { + return token{Kind: kindEOF} + } + if s[i] == ',' { + i++ + return token{Kind: kindComma} + } + if s[i] == '*' { + i++ + return token{Kind: kindAsterisk} + } + var text strings.Builder + for i < len(s) && s[i] != ',' && s[i] != '*' { + if s[i] == '\\' { + i++ + if !(i < len(s)) { + return token{Kind: kindError, Text: fmt.Sprintf("%q at end of string", s[i])} + } + } + text.WriteByte(s[i]) + i++ + } + return token{Kind: kindText, Text: text.String()} + } + peekToken := func() token { + saved := i + t := nextToken() + i = saved + return t + } + + const ( + stateBeginEntry = iota + stateLabel + stateEndEntry + stateDone + stateUnexpected + ) + + var weights []uint32 + var labels []string + var weightString, label string + var t token + for state := stateBeginEntry; state != stateDone; { + switch state { + // Beginning of a new entry (at the beginning of the input or + // after a comma). + case stateBeginEntry: + t = nextToken() + switch t.Kind { + case kindText: + // If the next token is an asterisk, this text + // represents a weight; otherwise it represents + // a label (with a weight of "1"). + switch peekToken().Kind { + case kindAsterisk: + nextToken() // Consume the asterisk token. + weightString = t.Text + state = stateLabel + default: + weightString = "1" + label = t.Text + state = stateEndEntry + } + default: + state = stateUnexpected + } + // weightString is assigned and we have seen an asterisk, now + // expect a text label. + case stateLabel: + t = nextToken() + switch t.Kind { + case kindText: + label = t.Text + state = stateEndEntry + default: + state = stateUnexpected + } + // weightString and label are assigned, now emit the entry and + // expect a comma or EOF. + case stateEndEntry: + w, err := strconv.ParseUint(weightString, 10, 32) + if err != nil { + return nil, nil, err + } + weights = append(weights, uint32(w)) + labels = append(labels, label) + t = nextToken() + switch t.Kind { + case kindEOF: + state = stateDone + case kindComma: + state = stateBeginEntry + default: + state = stateUnexpected + } + case stateUnexpected: + if t.Kind == kindError { + return nil, nil, fmt.Errorf("%s", t.Text) + } else { + var ttext string + switch t.Kind { + case kindEOF: + ttext = "end of string" + case kindComma: + ttext = "\",\"" + case kindAsterisk: + ttext = "\"*\"" + case kindText: + ttext = fmt.Sprintf("%+q", t.Text) + } + return nil, nil, fmt.Errorf("unexpected %s", ttext) + } + default: + panic(state) + } + } + + return weights, labels, nil +} + +// cryptoSource is a math/rand Source that reads from the crypto/rand Reader. +// The Seed method does not affect the sequence of numbers returned from the +// Int63 method. +type cryptoSource struct{} + +func (s cryptoSource) Seed(_ int64) {} + +func (s cryptoSource) Int63() int64 { + var n int64 + err := binary.Read(cryptorand.Reader, binary.BigEndian, &n) + if err != nil { + panic(err) + } + n &= (1 << 63) - 1 + return n +} + +// sampleWeighted returns the index of a randomly selected element of the +// weights slice, weighted by the values stored in the slice. Panics if +// the sum of the weights is zero or does not fit in an int64. +func sampleWeighted(weights []uint32) int { + var sum int64 = 0 + for _, w := range weights { + sum += int64(w) + if sum < int64(w) { + panic("weights overflow") + } + } + if sum == 0 { + panic("total weight is zero") + } + r := uint64(mathrand.New(&cryptoSource{}).Int63n(sum)) + for i, w := range weights { + if r < uint64(w) { + return i + } + r -= uint64(w) + } + panic("impossible") +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/lib/registrars.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/lib/registrars.go new file mode 100644 index 000000000..e5cb655d7 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/lib/registrars.go @@ -0,0 +1,22 @@ +package lib + +import ( + "context" + "errors" + "time" +) + +// registrars.go provides functionality used across different registrars + +var ( + ErrRegFailed = errors.New("registration failed") +) + +func SleepWithContext(ctx context.Context, duration time.Duration) { + timer := time.NewTimer(duration) + defer timer.Stop() + select { + case <-timer.C: + case <-ctx.Done(): + } +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/api-registrar.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/api-registrar.go new file mode 100644 index 000000000..282016fb1 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/api-registrar.go @@ -0,0 +1,241 @@ +package registration + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + "strconv" + "time" + + "github.com/refraction-networking/conjure/pkg/registrars/lib" + pb "github.com/refraction-networking/conjure/proto" + "github.com/refraction-networking/gotapdance/tapdance" + "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" +) + +// APIRegistrar implements a registration strategy using a centralized REST API to create +// registrations. Only the Endpoint need be specified; the remaining fields are valid with their +// zero values and provide the opportunity for additional control over the process. +type APIRegistrar struct { + // endpoint to use in registration request + endpoint string + + // HTTP client to use in request + client *http.Client + + // Wether registrations should be bidirectional + bidirectional bool + + // Length of time to delay after confirming successful + // registration before attempting a connection, + // allowing for propagation throughout the stations. + connectionDelay time.Duration + + // Maximum number of retries before giving up + maxRetries int + + // A secondary registration method to use on failure. + // Because the API registration can give us definite + // indication of a failure to register, this can be + // used as a "backup" in the case of the API being + // down or being blocked. + // + // If this field is nil, no secondary registration will + // be attempted. If it is non-nil, after failing to register + // (retrying MaxRetries times) we will fall back to + // the Register method on this field. + secondaryRegistrar tapdance.Registrar + + // Logger to use. + logger logrus.FieldLogger +} + +func NewAPIRegistrar(config *Config) (*APIRegistrar, error) { + return &APIRegistrar{ + endpoint: config.Target, + bidirectional: config.Bidirectional, + connectionDelay: config.Delay, + maxRetries: config.MaxRetries, + secondaryRegistrar: config.SecondaryRegistrar, + client: config.HTTPClient, + logger: tapdance.Logger().WithField("registrar", "API"), + }, nil +} + +// PrepareRegKeys prepares key materials specific to the registrar +func (r *APIRegistrar) PrepareRegKeys(stationPubkey [32]byte, sessionSecret []byte) error { + + return nil +} + +// registerUnidirectional sends unidirectional registration data to the registration server +func (r *APIRegistrar) registerUnidirectional(cjSession *tapdance.ConjureSession, ctx context.Context) (*tapdance.ConjureReg, error) { + logger := r.logger.WithFields(logrus.Fields{"type": "unidirectional", "sessionID": cjSession.IDString()}) + + reg, protoPayload, err := cjSession.UnidirectionalRegData(ctx, pb.RegistrationSource_API.Enum()) + if err != nil { + logger.Errorf("Failed to prepare registration data: %v", err) + return nil, lib.ErrRegFailed + } + + payload, err := proto.Marshal(protoPayload) + if err != nil { + logger.Errorf("failed to marshal ClientToStation payload: %v", err) + return nil, lib.ErrRegFailed + } + + r.setHTTPClient(reg) + + for tries := 0; tries < r.maxRetries+1; tries++ { + logger := logger.WithField("attempt", strconv.Itoa(tries+1)+"/"+strconv.Itoa(r.maxRetries+1)) + err = r.executeHTTPRequest(ctx, payload, logger) + if err != nil { + logger.Warnf("error in registration attempt: %v", err) + continue + } + logger.Debugf("registration succeeded") + return reg, nil + } + + // If we make it here, we failed API registration + logger.WithField("attempts", r.maxRetries+1).Warnf("all registration attempt(s) failed") + + if r.secondaryRegistrar != nil { + logger.Debugf("trying secondary registration method") + return r.secondaryRegistrar.Register(cjSession, ctx) + } + + return nil, lib.ErrRegFailed +} + +// registerBidirectional sends bidirectional registration data to the registration server and reads the response +func (r *APIRegistrar) registerBidirectional(cjSession *tapdance.ConjureSession, ctx context.Context) (*tapdance.ConjureReg, error) { + logger := r.logger.WithFields(logrus.Fields{"type": "bidirectional", "sessionID": cjSession.IDString()}) + + reg, protoPayload, err := cjSession.BidirectionalRegData(ctx, pb.RegistrationSource_BidirectionalAPI.Enum()) + if err != nil { + logger.Errorf("Failed to prepare registration data: %v", err) + return nil, lib.ErrRegFailed + } + + payload, err := proto.Marshal(protoPayload) + if err != nil { + logger.Errorf("failed to marshal ClientToStation payload: %v", err) + return nil, lib.ErrRegFailed + } + + r.setHTTPClient(reg) + + for tries := 0; tries < r.maxRetries+1; tries++ { + logger := logger.WithField("attempt", strconv.Itoa(tries+1)+"/"+strconv.Itoa(r.maxRetries+1)) + + regResp, err := r.executeHTTPRequestBidirectional(ctx, payload, logger) + if err != nil { + logger.Warnf("error in registration attempt: %v", err) + continue + } + + err = reg.UnpackRegResp(regResp) + if err != nil { + return nil, err + } + + return reg, nil + } + + // If we make it here, we failed API registration + logger.WithField("attempts", r.maxRetries+1).Warnf("all registration attempt(s) failed") + + if r.secondaryRegistrar != nil { + logger.Debugf("trying secondary registration method") + return r.secondaryRegistrar.Register(cjSession, ctx) + } + + return nil, lib.ErrRegFailed +} + +func (r *APIRegistrar) setHTTPClient(reg *tapdance.ConjureReg) { + if r.client == nil { + // Transports should ideally be re-used for TCP connection pooling, + // but each registration is most likely making precisely one request, + // or if it's making more than one, is most likely due to an underlying + // connection issue rather than an application-level error anyways. + t := http.DefaultTransport.(*http.Transport).Clone() + t.DialContext = reg.Dialer + r.client = &http.Client{Transport: t} + } +} + +func (r APIRegistrar) Register(cjSession *tapdance.ConjureSession, ctx context.Context) (*tapdance.ConjureReg, error) { + defer lib.SleepWithContext(ctx, r.connectionDelay) + if r.bidirectional { + return r.registerBidirectional(cjSession, ctx) + } + + return r.registerUnidirectional(cjSession, ctx) + +} + +func (r APIRegistrar) executeHTTPRequest(ctx context.Context, payload []byte, logger logrus.FieldLogger) error { + req, err := http.NewRequestWithContext(ctx, "POST", r.endpoint, bytes.NewReader(payload)) + if err != nil { + logger.Warnf("failed to create HTTP request to registration endpoint %s: %v", r.endpoint, err) + return err + } + + resp, err := r.client.Do(req) + if err != nil { + logger.Warnf("failed to do HTTP request to registration endpoint %s: %v", r.endpoint, err) + return err + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + // logger.Warnf("got non-success response code %d from registration endpoint %v", resp.StatusCode, r.endpoint) + return fmt.Errorf("non-success response code %d on %s", resp.StatusCode, r.endpoint) + } + + return nil +} + +func (r APIRegistrar) executeHTTPRequestBidirectional(ctx context.Context, payload []byte, logger logrus.FieldLogger) (*pb.RegistrationResponse, error) { + // Create an instance of the ConjureReg struct to return; this will hold the updated phantom4 and phantom6 addresses received from registrar response + regResp := &pb.RegistrationResponse{} + // Make new HTTP request with given context, registrar, and paylaod + req, err := http.NewRequestWithContext(ctx, "POST", r.endpoint, bytes.NewReader(payload)) + if err != nil { + logger.Warnf("%v failed to create HTTP request to registration endpoint %s: %v", r.endpoint, err) + return regResp, err + } + + resp, err := r.client.Do(req) + if err != nil { + logger.Warnf("%v failed to do HTTP request to registration endpoint %s: %v", r.endpoint, err) + return regResp, err + } + defer resp.Body.Close() + + // Check that the HTTP request returned a success code + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + // logger.Warnf("got non-success response code %d from registration endpoint %v", resp.StatusCode, r.endpoint) + return regResp, fmt.Errorf("non-success response code %d on %s", resp.StatusCode, r.endpoint) + } + + // Read the HTTP response body into []bytes + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + logger.Warnf("error in serializing Registration Response protobuf in bytes: %v", err) + return regResp, err + } + + // Unmarshal response body into Registration Response protobuf + if err = proto.Unmarshal(bodyBytes, regResp); err != nil { + logger.Warnf("error in storing Registration Response protobuf: %v", err) + return regResp, err + } + + return regResp, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/config.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/config.go new file mode 100644 index 000000000..75dec8ac8 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/config.go @@ -0,0 +1,68 @@ +package registration + +import ( + "fmt" + "net/http" + "time" + + "github.com/refraction-networking/gotapdance/tapdance" +) + +type Config struct { + // DNSTransportMethod is the transport method to be used in the DNS registrar + DNSTransportMethod DNSTransportMethodType + + // Target is the target registration addr/url + Target string + + // BaseDomain is the base domain for the DNS request that the responder is authoritative for in the DNS registrar + BaseDomain string + + // Pubkey is the public key for the listening DNS registration server + Pubkey []byte + + // UTLSDistribution allows utls distribution to be specified for the utls connection used during DoH and DoT in the DNS registrar + UTLSDistribution string + + // MaxRetries is the max number of retries a registrar will attempt + MaxRetries int + + // Delay is the delay duration between retries + // + // Deprecated: Use tapdance.Dialer.RegDelay instead. + Delay time.Duration + + // STUNAddr is the address of STUN server used to determine the client's IPv4 address for the DNS registrar + STUNAddr string + + // Bidirectional sets wether the registrar should be bidirectional or unidirectional + Bidirectional bool + + // SecondaryRegistrar is the secondary registrar to use when the main one fails + SecondaryRegistrar tapdance.Registrar + + // HTTPClient is the HTTP client to use for the API registrar + HTTPClient *http.Client +} + +// DNSTransportMethodType declares the DNS transport method to be used +type DNSTransportMethodType int + +const ( + DoH DNSTransportMethodType = iota + DoT + UDP +) + +//nolint:unused +func validateConfig(config *Config) error { + if config == nil { + return fmt.Errorf("no config provided") + } + + if config.Target == "" { + return fmt.Errorf("no target configured") + } + + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/decoy-registrar.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/decoy-registrar.go new file mode 100644 index 000000000..b7e2a632e --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/decoy-registrar.go @@ -0,0 +1,17 @@ +package registration + +import ( + dr "github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar" +) + +// NewDecoyRegistrar returns a decoy registrar.. +func NewDecoyRegistrar() *dr.DecoyRegistrar { + return dr.NewDecoyRegistrar() +} + +// NewDecoyRegistrarWithDialer returns a decoy registrar with custom dialer. +// +// Deprecated: Set dialer in tapdace.Dialer.DialerWithLaddr instead. +func NewDecoyRegistrarWithDialer(dialer dr.DialFunc) *dr.DecoyRegistrar { + return dr.NewDecoyRegistrarWithDialer(dialer) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/dns-registrar.go b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/dns-registrar.go new file mode 100644 index 000000000..58cbaacbf --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/registrars/registration/dns-registrar.go @@ -0,0 +1,237 @@ +package registration + +import ( + "context" + "errors" + "fmt" + "net" + "strconv" + "time" + + "github.com/pion/stun" + "github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester" + "github.com/refraction-networking/conjure/pkg/registrars/lib" + pb "github.com/refraction-networking/conjure/proto" + "github.com/refraction-networking/gotapdance/tapdance" + "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" +) + +type DNSRegistrar struct { + req *requester.Requester + maxRetries int + connectionDelay time.Duration + bidirectional bool + ip []byte + logger logrus.FieldLogger +} + +func createRequester(config *Config) (*requester.Requester, error) { + switch config.DNSTransportMethod { + case UDP: + return requester.NewRequester(&requester.Config{ + TransportMethod: requester.UDP, + Target: config.Target, + BaseDomain: config.BaseDomain, + Pubkey: config.Pubkey, + }) + case DoT: + return requester.NewRequester(&requester.Config{ + TransportMethod: requester.DoT, + UtlsDistribution: config.UTLSDistribution, + Target: config.Target, + BaseDomain: config.BaseDomain, + Pubkey: config.Pubkey, + }) + case DoH: + return requester.NewRequester(&requester.Config{ + TransportMethod: requester.DoH, + UtlsDistribution: config.UTLSDistribution, + Target: config.Target, + BaseDomain: config.BaseDomain, + Pubkey: config.Pubkey, + }) + } + + return nil, fmt.Errorf("invalid DNS transport method") +} + +// NewDNSRegistrar creates a DNSRegistrar from config +func NewDNSRegistrar(config *Config) (*DNSRegistrar, error) { + req, err := createRequester(config) + if err != nil { + return nil, fmt.Errorf("error creating requester: %v", err) + } + + ip, err := getPublicIp(config.STUNAddr) + if err != nil { + return nil, fmt.Errorf("failed to get public IP: %v", err) + } + + return &DNSRegistrar{ + req: req, + ip: ip, + maxRetries: config.MaxRetries, + bidirectional: config.Bidirectional, + connectionDelay: config.Delay, + logger: tapdance.Logger().WithField("registrar", "DNS"), + }, nil +} + +// registerUnidirectional sends unidirectional registration data to the registration server +func (r *DNSRegistrar) registerUnidirectional(ctx context.Context, cjSession *tapdance.ConjureSession) (*tapdance.ConjureReg, error) { + logger := r.logger.WithFields(logrus.Fields{"type": "unidirectional", "sessionID": cjSession.IDString()}) + + reg, protoPayload, err := cjSession.UnidirectionalRegData(ctx, pb.RegistrationSource_DNS.Enum()) + if err != nil { + logger.Errorf("Failed to prepare registration data: %v", err) + return nil, lib.ErrRegFailed + } + + if reg.Dialer != nil { + err := r.req.SetDialer(reg.Dialer) + if err != nil { + return nil, fmt.Errorf("failed to set dialer to requester: %v", err) + } + } + + protoPayload.RegistrationAddress = r.ip + + payload, err := proto.Marshal(protoPayload) + if err != nil { + logger.Errorf("failed to marshal ClientToStation payload: %v", err) + return nil, lib.ErrRegFailed + } + + logger.Debugf("DNS payload length: %d", len(payload)) + + for i := 0; i < r.maxRetries+1; i++ { + logger := logger.WithField("attempt", strconv.Itoa(i+1)+"/"+strconv.Itoa(r.maxRetries)) + _, err := r.req.RequestAndRecv(payload) + if err != nil { + logger.Warnf("error in registration attempt: %v", err) + continue + } + + // for unidirectional registration, do not check for response and immediatly return + logger.Debugf("registration succeeded") + return reg, nil + } + + logger.WithField("maxTries", r.maxRetries).Warnf("all registration attempt(s) failed") + + return nil, lib.ErrRegFailed + +} + +// registerBidirectional sends bidirectional registration data to the registration server and reads the response +func (r *DNSRegistrar) registerBidirectional(ctx context.Context, cjSession *tapdance.ConjureSession) (*tapdance.ConjureReg, error) { + logger := r.logger.WithFields(logrus.Fields{"type": "bidirectional", "sessionID": cjSession.IDString()}) + + reg, protoPayload, err := cjSession.BidirectionalRegData(ctx, pb.RegistrationSource_BidirectionalDNS.Enum()) + if err != nil { + logger.Errorf("Failed to prepare registration data: %v", err) + return nil, lib.ErrRegFailed + } + + if reg.Dialer != nil { + err := r.req.SetDialer(reg.Dialer) + if err != nil { + return nil, fmt.Errorf("failed to set dialer to requester: %v", err) + } + } + + protoPayload.RegistrationAddress = r.ip + + payload, err := proto.Marshal(protoPayload) + if err != nil { + logger.Errorf("failed to marshal ClientToStation payload: %v", err) + return nil, lib.ErrRegFailed + } + + logger.Debugf("DNS payload length: %d", len(payload)) + + for i := 0; i < r.maxRetries+1; i++ { + logger := logger.WithField("attempt", strconv.Itoa(i+1)+"/"+strconv.Itoa(r.maxRetries)) + + bdResponse, err := r.req.RequestAndRecv(payload) + if err != nil { + logger.Warnf("error in sending request to DNS registrar: %v", err) + continue + } + + dnsResp := &pb.DnsResponse{} + err = proto.Unmarshal(bdResponse, dnsResp) + if err != nil { + logger.Warnf("error in storing Registrtion Response protobuf: %v", err) + continue + } + if !dnsResp.GetSuccess() { + logger.Warnf("registrar indicates that registration failed") + continue + } + if dnsResp.GetClientconfOutdated() { + logger.Warnf("registrar indicates that ClinetConf is outdated") + } + + err = reg.UnpackRegResp(dnsResp.GetBidirectionalResponse()) + if err != nil { + logger.Warnf("failed to unpack registration response: %v", err) + continue + } + return reg, nil + } + + logger.WithField("maxTries", r.maxRetries).Warnf("all registration attemps failed") + + return nil, lib.ErrRegFailed +} + +// Register prepares and sends the registration request. +func (r *DNSRegistrar) Register(cjSession *tapdance.ConjureSession, ctx context.Context) (*tapdance.ConjureReg, error) { + defer lib.SleepWithContext(ctx, r.connectionDelay) + + if r.bidirectional { + return r.registerBidirectional(ctx, cjSession) + } + return r.registerUnidirectional(ctx, cjSession) +} + +func getPublicIp(server string) ([]byte, error) { + + c, err := stun.Dial("udp4", server) + if err != nil { + return nil, errors.New("Failed to connect to STUN server: " + err.Error()) + } + + message := stun.MustBuild(stun.TransactionID, stun.BindingRequest) + + ip := net.IP{} + + err = c.Do(message, func(res stun.Event) { + if res.Error != nil { + err = res.Error + return + } + + var xorAddr stun.XORMappedAddress + err = xorAddr.GetFrom(res.Message) + if err != nil { + return + } + + ip = xorAddr.IP + }) + + if err != nil { + err = errors.New("Failed to get IP address from STUN: " + err.Error()) + } + + return ip.To4(), nil +} + +// PrepareRegKeys prepares key materials specific to the registrar +func (r *DNSRegistrar) PrepareRegKeys(stationPubkey [32]byte, sessionSecret []byte) error { + + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/station/log/logger.go b/vendor/github.com/refraction-networking/conjure/pkg/station/log/logger.go new file mode 100644 index 000000000..2744f38ca --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/station/log/logger.go @@ -0,0 +1,378 @@ +package log + +// Log is a custom wrapper around the default golang logging library that allows use of helper +// functions that implement logging levels. +// +// This exists because I don't want to modify the logging format of our existing log lines (i.e +// remove prefixes or modify timestamp) but I need to add logging level verbosity to clean up the +// things that we are logging. This should support all of the functionality of the default logging +// library PLUS log level functions. This should be a drop in replacement for the golang log library +// as all of the existing functionality is supported as of writing. + +import ( + "fmt" + "io" + "log" + "strings" +) + +// Level provides a step of level that can be provided to indicate different +// logging verbosity +type Level int + +const ( + // UnknownLevel indicates and unrecognized logging level + UnknownLevel Level = -1 + + // TraceLevel provides the most verbose logging + TraceLevel Level = iota + + // DebugLevel provides verbose logging beyond regular function + DebugLevel + + // WarnLevel provides slightly more verbose logging + WarnLevel + + // ErrorLevel provides a "normal production" logging level + ErrorLevel + + // InfoLevel provides only informational logging that would typically be written to stdout + InfoLevel +) + +var levelStrings = map[string]Level{ + "trace": TraceLevel, + "debug": DebugLevel, + "warn": WarnLevel, + "error": ErrorLevel, + "info": InfoLevel, +} + +var level = ErrorLevel + +// SetLevel Sets the log level for the log package function calls, +func SetLevel(l Level) { + level = l +} + +// ParseLevel takes a string and returns the equivalent log Level struct. +func ParseLevel(levelStr string) (Level, error) { + lowerLevelStr := strings.ToLower(levelStr) + for name, l := range levelStrings { + if lowerLevelStr == name { + return l, nil + } + } + return UnknownLevel, fmt.Errorf("unknown logging level string provided: \"%s\"", levelStr) +} + +// Fatal is equivalent to Print() followed by a call to os.Exit(1). +func Fatal(v ...interface{}) { + log.Fatal(v...) +} + +// Fatalf is equivalent to Printf() followed by a call to os.Exit(1). +func Fatalf(format string, v ...interface{}) { + log.Fatalf(format, v...) +} + +// Fatalln is equivalent to Println() followed by a call to os.Exit(1). +func Fatalln(v ...interface{}) { + log.Fatalln(v...) +} + +// Flags returns the output flags for the standard logger. The flag bits are Ldate, Ltime, and so on. +func Flags() int { + return log.Flags() +} + +// Output writes the output for a logging event. The string s contains the text to print after the +// prefix specified by the flags of the Logger. A newline is appended if the last character of s is +// not already a newline. Calldepth is the count of the number of frames to skip when computing the +// file name and line number if Llongfile or Lshortfile is set; a value of 1 will print the details +// for the caller of Output. +func Output(calldepth int, s string) error { + return log.Output(calldepth, s) +} + +// Panic is equivalent to Print() followed by a call to panic(). +func Panic(v ...interface{}) { + log.Panic(v...) +} + +// Panicf is equivalent to Printf() followed by a call to panic(). +func Panicf(format string, v ...interface{}) { + log.Panicf(format, v...) +} + +// Panicln is equivalent to Println() followed by a call to panic(). +func Panicln(v ...interface{}) { + log.Panicln(v...) +} + +// Prefix returns the output prefix for the standard logger. +func Prefix() string { + return log.Prefix() +} + +// Print calls Output to print to the standard logger. Arguments are handled in the manner of fmt.Print. +func Print(v ...interface{}) { + log.Print(v...) +} + +// Printf calls Output to print to the standard logger. Arguments are handled in the manner of fmt.Printf. +func Printf(format string, v ...interface{}) { + log.Printf(format, v...) +} + +// Println calls Output to print to the standard logger. Arguments are handled in the manner of fmt.Println. +func Println(v ...interface{}) { + log.Println(v...) +} + +// SetFlags sets the output flags for the standard logger. The flag bits are Ldate, Ltime, and so on. +func SetFlags(flag int) { + log.SetFlags(flag) +} + +// SetOutput sets the output destination for the standard logger. +func SetOutput(w io.Writer) { + log.SetOutput(w) +} + +// SetPrefix sets the output prefix for the standard logger. +func SetPrefix(prefix string) { + log.SetPrefix(prefix) +} + +// Writer returns the output destination for the standard logger. +func Writer() io.Writer { + return log.Writer() +} + +// Trace provides the most verbose logging - wraps Print +func Trace(v ...interface{}) { + if level <= TraceLevel { + log.Print(v...) + } +} + +// Traceln provides the most verbose logging - wraps Println +func Traceln(v ...interface{}) { + if level <= TraceLevel { + log.Println(v...) + } +} + +// Tracef provides the most verbose logging - wraps Printf +func Tracef(format string, v ...interface{}) { + if level <= TraceLevel { + log.Printf(format, v...) + } +} + +// Debug provides verbose logging beyond regular function - wraps Print +func Debug(v ...interface{}) { + if level <= DebugLevel { + log.Print(v...) + } +} + +// Debugln provides verbose logging beyond regular function - wraps Println +func Debugln(v ...interface{}) { + if level <= DebugLevel { + log.Println(v...) + } +} + +// Debugf provides verbose logging beyond regular function - wraps Printf +func Debugf(format string, v ...interface{}) { + if level <= DebugLevel { + log.Printf(format, v...) + } +} + +// Warn provides slightly more verbose logging - wraps Print +func Warn(v ...interface{}) { + if level <= WarnLevel { + log.Print(v...) + } +} + +// Warnln provides slightly more verbose logging- wraps Println +func Warnln(v ...interface{}) { + if level <= WarnLevel { + log.Println(v...) + } +} + +// Warnf provides slightly more verbose logging - wraps Printf +func Warnf(format string, v ...interface{}) { + if level <= WarnLevel { + log.Printf(format, v...) + } +} + +// Error provides a "normal production" logging level - wraps Print +func Error(v ...interface{}) { + if level <= ErrorLevel { + log.Print(v...) + } +} + +// Errorln provides a "normal production" logging level - wraps Println +func Errorln(v ...interface{}) { + if level <= ErrorLevel { + log.Println(v...) + } +} + +// Errorf provides a "normal production" logging level - wraps Printf +func Errorf(format string, v ...interface{}) { + if level <= ErrorLevel { + log.Printf(format, v...) + } +} + +// Info provides only informational logging that would typically be written to stdout - wraps Print +func Info(v ...interface{}) { + if level <= InfoLevel { + log.Print(v...) + } +} + +// Infoln provides only informational logging that would typically be written to stdout - wraps Println +func Infoln(v ...interface{}) { + if level <= InfoLevel { + log.Println(v...) + } +} + +// Infof provides only informational logging that would typically be written to stdout - wraps Printf +func Infof(format string, v ...interface{}) { + if level <= InfoLevel { + log.Printf(format, v...) + } +} + +// Logger wraps the default golang log package Logger struct so that we can still +// use its functionality and formatting while adding Log Level controls +type Logger struct { + *log.Logger + level Level +} + +// New returns a new logger struct. +func New(out io.Writer, prefix string, flag int) *Logger { + return &Logger{Logger: log.New(out, prefix, flag), level: level} +} + +// SetLevel Sets the log level for the log package function calls, +func (l *Logger) SetLevel(ll Level) { + l.level = ll +} + +// Trace provides the most verbose logging - wraps Print +func (l *Logger) Trace(v ...interface{}) { + if l.level <= TraceLevel { + l.Print(v...) + } +} + +// Traceln provides the most verbose logging - wraps Println +func (l *Logger) Traceln(v ...interface{}) { + if l.level <= TraceLevel { + l.Println(v...) + } +} + +// Tracef provides the most verbose logging - wraps Printf +func (l *Logger) Tracef(format string, v ...interface{}) { + if l.level <= TraceLevel { + l.Printf(format, v...) + } +} + +// Debug provides verbose logging beyond regular function - wraps Print +func (l *Logger) Debug(v ...interface{}) { + if l.level <= DebugLevel { + l.Print(v...) + } +} + +// Debugln provides verbose logging beyond regular function - wraps Println +func (l *Logger) Debugln(v ...interface{}) { + if l.level <= DebugLevel { + l.Println(v...) + } +} + +// Debugf provides verbose logging beyond regular function - wraps Printf +func (l *Logger) Debugf(format string, v ...interface{}) { + if l.level <= DebugLevel { + l.Printf(format, v...) + } +} + +// Warn provides slightly more verbose logging - wraps Print +func (l *Logger) Warn(v ...interface{}) { + if l.level <= WarnLevel { + l.Print(v...) + } +} + +// Warnln provides slightly more verbose logging- wraps Println +func (l *Logger) Warnln(v ...interface{}) { + if l.level <= WarnLevel { + l.Println(v...) + } +} + +// Warnf provides slightly more verbose logging - wraps Printf +func (l *Logger) Warnf(format string, v ...interface{}) { + if l.level <= WarnLevel { + l.Printf(format, v...) + } +} + +// Error provides a "normal production" logging level - wraps Print +func (l *Logger) Error(v ...interface{}) { + if l.level <= ErrorLevel { + l.Print(v...) + } +} + +// Errorln provides a "normal production" logging level - wraps Println +func (l *Logger) Errorln(v ...interface{}) { + if l.level <= ErrorLevel { + l.Println(v...) + } +} + +// Errorf provides a "normal production" logging level - wraps Printf +func (l *Logger) Errorf(format string, v ...interface{}) { + if l.level <= ErrorLevel { + l.Printf(format, v...) + } +} + +// Info provides only informational logging that would typically be written to stdout - wraps Print +func (l *Logger) Info(v ...interface{}) { + if l.level <= InfoLevel { + l.Print(v...) + } +} + +// Infoln provides only informational logging that would typically be written to stdout - wraps Println +func (l *Logger) Infoln(v ...interface{}) { + if l.level <= InfoLevel { + l.Println(v...) + } +} + +// Infof provides only informational logging that would typically be written to stdout - wraps Printf +func (l *Logger) Infof(format string, v ...interface{}) { + if l.level <= InfoLevel { + l.Printf(format, v...) + } +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/anypb_nourl.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/anypb_nourl.go new file mode 100644 index 000000000..1e38e55b2 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/anypb_nourl.go @@ -0,0 +1,35 @@ +package transports + +import ( + "fmt" + "strings" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/anypb" +) + +// UnmarshalAnypbTo unmarshals the src anypb to dst without reading the src type url. +// Used to unmarshal TransportParams in the registration message for saving space from +// the type url so that the registration payload is small enough for the DNS registrar. +func UnmarshalAnypbTo(src *anypb.Any, dst protoreflect.ProtoMessage) error { + if src == nil { + // if a nil parameters source object is passed to us the result will also be nil and no + // error will be returned. + return nil + } + + expected, err := anypb.New(dst) + if err != nil { + return fmt.Errorf("error reading src type: %v", err) + } + + src.TypeUrl = strings.ReplaceAll(src.TypeUrl, "tapdance.", "proto.") + + if src.TypeUrl != "" && src.TypeUrl != expected.TypeUrl { + return fmt.Errorf("incorrect non-empty TypeUrl: %v != %v", src.TypeUrl, expected.TypeUrl) + } + + src.TypeUrl = expected.TypeUrl + return anypb.UnmarshalTo(src, dst, proto.UnmarshalOptions{}) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/client/transports.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/client/transports.go new file mode 100644 index 000000000..ded6d0e55 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/client/transports.go @@ -0,0 +1,141 @@ +package transports + +import ( + "errors" + + cj "github.com/refraction-networking/conjure/pkg/core/interfaces" + "github.com/refraction-networking/conjure/pkg/transports/connecting/dtls" + "github.com/refraction-networking/conjure/pkg/transports/wrapping/min" + "github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4" + "github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix" + pb "github.com/refraction-networking/conjure/proto" +) + +// These track a builder function instead of an instance because ClientTransports with a pointer +// receiver will return a pointer over and over. +var transportsByName map[string]func() cj.Transport = make(map[string]func() cj.Transport) +var transportsByID map[pb.TransportType]func() cj.Transport = make(map[pb.TransportType]func() cj.Transport) + +var ( + // ErrAlreadyRegistered error when registering a transport that matches + // an already registered ID or name. + ErrAlreadyRegistered = errors.New("transport already registered") + + // ErrUnknownTransport provided id or name does npt match any enabled + // transport. + ErrUnknownTransport = errors.New("unknown transport") +) + +// New returns a new Transport +func New(name string) (cj.Transport, error) { + builder, ok := transportsByName[name] + if !ok { + return nil, ErrUnknownTransport + } + + return builder(), nil +} + +// NewWithParamsByID returns a new Transport by Type ID, if one exists, and attempts to set the +// parameters provided. +func NewWithParamsByID(id pb.TransportType, params any) (cj.Transport, error) { + builder, ok := transportsByID[id] + if !ok { + return nil, ErrUnknownTransport + } + + transport := builder() + err := transport.SetParams(params) + return transport, err +} + +// NewWithParams returns a new Transport and attempts to set the parameters provided +func NewWithParams(name string, params any) (cj.Transport, error) { + builder, ok := transportsByName[name] + if !ok { + return nil, ErrUnknownTransport + } + + transport := builder() + err := transport.SetParams(params) + return transport, err +} + +// GetTransportByName returns transport by name +func GetTransportByName(name string) (cj.Transport, bool) { + builder, ok := transportsByName[name] + if !ok { + return nil, ok + } + + return builder(), true +} + +// GetTransportByID returns transport by name +func GetTransportByID(id pb.TransportType) (cj.Transport, bool) { + builder, ok := transportsByID[id] + if !ok { + return nil, ok + } + + return builder(), true +} + +var defaultTransportBuilders = []func() cj.Transport{ + func() cj.Transport { return &min.ClientTransport{} }, + func() cj.Transport { return &obfs4.ClientTransport{} }, + func() cj.Transport { return &prefix.ClientTransport{} }, + func() cj.Transport { return &dtls.ClientTransport{} }, +} + +// AddTransport adds new transport +func AddTransport(build func() cj.Transport) error { + t := build() + if t == nil { + return ErrUnknownTransport + } + name := t.Name() + id := t.ID() + + if _, ok := transportsByName[name]; ok { + return ErrAlreadyRegistered + } else if _, ok := transportsByID[id]; ok { + return ErrAlreadyRegistered + } + + transportsByName[name] = build + transportsByID[id] = build + return nil +} + +// EnableDefaultTransports initializes the library with default transports +func EnableDefaultTransports() error { + var err error + for _, builder := range defaultTransportBuilders { + + err = AddTransport(builder) + if err != nil { + return err + } + } + + return nil +} + +func init() { + err := EnableDefaultTransports() + if err != nil { + panic(err) + } +} + +func ConfigFromTransportType(transportType pb.TransportType, randomizePortDefault bool) (cj.Transport, error) { + switch transportType { + case pb.TransportType_Min: + return &min.ClientTransport{Parameters: &pb.GenericTransportParams{RandomizeDstPort: &randomizePortDefault}}, nil + case pb.TransportType_Obfs4: + return &obfs4.ClientTransport{Parameters: &pb.GenericTransportParams{RandomizeDstPort: &randomizePortDefault}}, nil + default: + return nil, errors.New("unknown transport by TransportType try using TransportConfig") + } +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go new file mode 100644 index 000000000..5264d94f0 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go @@ -0,0 +1,316 @@ +package dtls + +import ( + "context" + "fmt" + "io" + "net" + "sync" + "time" + + "github.com/refraction-networking/conjure/pkg/dtls" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +type dialFunc = func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) + +const ( + // port range boundaries for min when randomizing + portRangeMin = 1024 + portRangeMax = 65535 + defaultPort = 443 + defaultSTUNServer = "stun.l.google.com:19302" + defaultListenTime = 5 * time.Second +) + +// ClientTransport implements the client side transport interface for the DTLS transport. The +// significant difference is that there is an instance of this structure per client session, where +// the station side Transport struct has one instance to be re-used for all sessions. +type ClientTransport struct { + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. + Parameters *pb.DTLSTransportParams + // SessionParams are fields that will be used for the current session only + sessionParams *pb.DTLSTransportParams + + privAddr4 *net.UDPAddr + pubAddr4 *net.UDPAddr + privAddr6 *net.UDPAddr + pubAddr6 *net.UDPAddr + psk []byte + stunServer string + disableIRWorkaround bool + listenTimeout *time.Duration +} + +type ClientConfig struct { + // STUNServer is the address of the stun server to use + STUNServer string + + // DisableIRWorkaround disables sending an empty packet to workaround DTLS blocking in IR + // + // In Iran, blocking seems to happen by matching the first packet in a "flow" against DTLS packet format and blocking if it matches. + // If the first packet is anything else packets are permitted. UDP dst port does not seem to change this. + DisableIRWorkaround bool + + // ListenTimeout is the duration to listen for the DTLS handshake sent by station. After this duration, the + // client will initiate the handshake instead in case there are NAT issues preventing the station from reaching + // the client. + ListenTimeout *time.Duration +} + +// Name returns a string identifier for the Transport for logging +func (*ClientTransport) Name() string { + return "dtls" +} + +// String returns a string identifier for the Transport for logging (including string formatters) +func (*ClientTransport) String() string { + return "dtls" +} + +// ID provides an identifier that will be sent to the conjure station during the registration so +// that the station knows what transport to expect connecting to the chosen phantom. +func (*ClientTransport) ID() pb.TransportType { + return pb.TransportType_DTLS +} + +// GetParams returns a generic protobuf with any parameters from both the registration and the +// transport. +func (t *ClientTransport) GetParams() (proto.Message, error) { + return t.sessionParams, nil +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + switch params := p.(type) { + case *pb.GenericTransportParams: + if t.sessionParams == nil { + t.sessionParams = &pb.DTLSTransportParams{} + } + + t.sessionParams.RandomizeDstPort = proto.Bool(params.GetRandomizeDstPort()) + case *pb.DTLSTransportParams: + // make a copy of params so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(params).(*pb.DTLSTransportParams) + } + + return nil +} + +// SetParams allows the caller to set parameters associated with the transport, returning an +// error if the provided generic message is not compatible. +func (t *ClientTransport) SetParams(p any) error { + switch params := p.(type) { + case *pb.GenericTransportParams: + if t.Parameters == nil { + t.Parameters = &pb.DTLSTransportParams{} + } + + t.Parameters.RandomizeDstPort = proto.Bool(params.GetRandomizeDstPort()) + case *pb.DTLSTransportParams: + // make a copy of params so that we don't modify the original during an active session. + t.Parameters = proto.Clone(params).(*pb.DTLSTransportParams) + case *ClientConfig: + t.stunServer = params.STUNServer + t.disableIRWorkaround = params.DisableIRWorkaround + t.listenTimeout = params.ListenTimeout + } + + return nil +} + +// Prepare lets the transport use the dialer to prepare. This is called before GetParams to let the +// transport prepare stuff such as nat traversal. +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + if t.stunServer == "" { + t.stunServer = defaultSTUNServer + } + + var privAddr4 *net.UDPAddr + var pubAddr4 *net.UDPAddr + var privAddr6 *net.UDPAddr + var pubAddr6 *net.UDPAddr + var err4 error + var err6 error + + if t.Parameters == nil { + t.Parameters = &pb.DTLSTransportParams{} + } + t.sessionParams = proto.Clone(t.Parameters).(*pb.DTLSTransportParams) + + wg := sync.WaitGroup{} + wg.Add(2) + + go func() { + privAddr4, pubAddr4, err4 = publicAddr(ctx, "udp4", t.stunServer, dialer) + wg.Done() + }() + + go func() { + privAddr6, pubAddr6, err6 = publicAddr(ctx, "udp6", t.stunServer, dialer) + wg.Done() + }() + + wg.Wait() + + if err4 != nil && err6 != nil { + return fmt.Errorf("error getting v4 public address: %v; error getting v6 public address: %v", err4, err6) + } + + if err4 == nil { + t.privAddr4 = privAddr4 + t.pubAddr4 = pubAddr4 + t.sessionParams.SrcAddr4 = &pb.Addr{IP: pubAddr4.IP.To4(), Port: proto.Uint32(uint32(pubAddr4.Port))} + } + if err6 == nil { + t.privAddr6 = privAddr6 + t.pubAddr6 = pubAddr6 + t.sessionParams.SrcAddr6 = &pb.Addr{IP: pubAddr6.IP.To16(), Port: proto.Uint32(uint32(pubAddr6.Port))} + } + + return nil +} + +func (*ClientTransport) DisableRegDelay() bool { + return true +} + +// GetDstPort returns the destination port that the client should open the phantom connection to +func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { + if t.sessionParams == nil || !t.sessionParams.GetRandomizeDstPort() { + return defaultPort, nil + } + + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) +} + +func (t *ClientTransport) WrapDial(dialer dialFunc) (dialFunc, error) { + dtlsDialer := func(ctx context.Context, network, localAddr, address string) (net.Conn, error) { + // Create a context that will automatically cancel after 5 seconds or when the existing context is cancelled, whichever comes first. + timeout := t.listenTimeout + if timeout == nil { + time := defaultListenTime + timeout = &time + } + ctxtimeout, cancel := context.WithTimeout(ctx, *timeout) + defer cancel() + + conn, errListen := t.listen(ctxtimeout, dialer, address) + if errListen != nil { + // fallback to dial + conn, errDial := t.dial(ctx, dialer, address) + if errDial != nil { + return nil, fmt.Errorf("error listening: %v, error dialing: %v", errListen, errDial) + } + + return conn, nil + } + + return conn, nil + } + + return dtlsDialer, nil +} + +func (t *ClientTransport) listen(ctx context.Context, dialer dialFunc, address string) (net.Conn, error) { + is4, err := addrIsV4(address) + if err != nil { + return nil, fmt.Errorf("error checking remote address ip version: %v", err) + } + + if is4 { + return t.listenWithLaddr(ctx, dialer, t.privAddr4, address) + } + + return t.listenWithLaddr(ctx, dialer, t.privAddr6, address) +} + +func addrIsV4(address string) (bool, error) { + addr, err := net.ResolveUDPAddr("", address) + if err != nil { + return false, err + } + + return addr.IP.To4() != nil, nil +} + +func (t *ClientTransport) listenWithLaddr(ctx context.Context, dialer dialFunc, laddr *net.UDPAddr, address string) (net.Conn, error) { + + if t.disableIRWorkaround { + err := openUDPLimitTTL(ctx, laddr.String(), address, dialer) + if err != nil { + return nil, fmt.Errorf("error opening UDP port from gateway: %v", err) + } + } else { + err := openUDP(ctx, laddr.String(), address, dialer) + if err != nil { + return nil, fmt.Errorf("error opening UDP port from gateway: %v", err) + } + } + + udpConn, err := dialer(ctx, "udp", laddr.String(), address) + if err != nil { + return nil, fmt.Errorf("error dialing udp: %v", err) + } + + conn, err := dtls.ServerWithContext(ctx, udpConn, &dtls.Config{PSK: t.psk, SCTP: dtls.ClientOpen}) + if err != nil { + return nil, fmt.Errorf("error listening for phantom: %v", err) + } + + return conn, err +} + +func (t *ClientTransport) dial(ctx context.Context, dialer dialFunc, address string) (net.Conn, error) { + udpConn, err := dialer(ctx, "udp", "", address) + if err != nil { + return nil, fmt.Errorf("error dialing udp: %v", err) + } + + if !t.disableIRWorkaround { + err := sendPacket(ctx, udpConn) + if err != nil { + return nil, err + } + } + + conn, err := dtls.ClientWithContext(ctx, udpConn, &dtls.Config{PSK: t.psk, SCTP: dtls.ClientOpen}) + if err != nil { + return nil, fmt.Errorf("error dialing as client: %v", err) + } + + return conn, err +} + +// PrepareKeys provides an opportunity for the transport to integrate the station public key +// as well as bytes from the deterministic random generator associated with the registration +// that this ClientTransport is attached t +func (t *ClientTransport) PrepareKeys(pubkey [32]byte, sharedSecret []byte, dRand io.Reader) error { + t.psk = sharedSecret + return nil +} + +// ParseParams gives the specific transport an option to parse a generic object into parameters +// provided by the station in the registration response during registration. +func (ClientTransport) ParseParams(*anypb.Any) (any, error) { + return nil, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/dtls.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/dtls.go new file mode 100644 index 000000000..de7511c0a --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/dtls.go @@ -0,0 +1,191 @@ +package dtls + +import ( + "context" + "fmt" + "net" + "strings" + + "github.com/libp2p/go-reuseport" + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/core/interfaces" + "github.com/refraction-networking/conjure/pkg/dtls" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +const listenPort = 41245 + +type Transport struct { + DNAT interfaces.DNAT + dtlsListener *dtls.Listener + logDialSuccess func(*net.IP) + logListenSuccess func(*net.IP) +} + +// Name returns name of the transport +func (Transport) Name() string { + return "dtls" +} + +// LogPrefix returns log prefix of the transport +func (Transport) LogPrefix() string { + return "DTLS" +} + +// GetIdentifier returns an identifier unique a registration +func (Transport) GetIdentifier(reg transports.Registration) string { + return string(core.ConjureHMAC(reg.SharedSecret(), "dtlsTrasportHMACString")) +} + +// NewTransport creates a new dtls transport +func NewTransport(logAuthFail, logOtherFail, logDialSuccess, logListenSuccess func(*net.IP), buildDnat interfaces.DnatBuilder) (*Transport, error) { + addr := &net.UDPAddr{Port: listenPort} + + listener, err := dtls.Listen("udp", addr, &dtls.Config{LogAuthFail: logAuthFail, LogOther: logAuthFail}) + if err != nil { + return nil, fmt.Errorf("error creating dtls listner: %v", err) + } + + dnat, err := buildDnat() + + if err != nil { + return nil, fmt.Errorf("error connecting to tun device for DNAT: %v", err) + } + + return &Transport{ + DNAT: dnat, + dtlsListener: listener, + logDialSuccess: logDialSuccess, + logListenSuccess: logListenSuccess, + }, nil +} + +// Connect takes a registraion and returns a dtls Conn connected to the client +func (t *Transport) Connect(ctx context.Context, reg transports.Registration) (net.Conn, error) { + if reg.TransportType() != pb.TransportType_DTLS { + return nil, transports.ErrNotTransport + } + + params, ok := reg.TransportParams().(*pb.DTLSTransportParams) + if !ok { + return nil, fmt.Errorf("transport params is not *pb.DTLSTransportParams") + } + + connCh := make(chan net.Conn, 2) + errCh := make(chan error, 2) + + go func() { + + is4 := reg.PhantomIP().To4() != nil + + clientAddr := &net.UDPAddr{} + + if is4 { + clientAddr = &net.UDPAddr{IP: params.SrcAddr4.GetIP(), Port: int(params.SrcAddr4.GetPort())} + } else { + clientAddr = &net.UDPAddr{IP: params.SrcAddr6.GetIP(), Port: int(params.SrcAddr6.GetPort())} + } + + err := t.DNAT.AddEntry(&clientAddr.IP, uint16(clientAddr.Port), reg.PhantomIP(), reg.GetDstPort()) + if err != nil { + errCh <- fmt.Errorf("error adding DNAT entry: %v", err) + return + } + + // reuseport checks for local address and distinguishes between v4 and v6 + laddr := &net.UDPAddr{} + if is4 { + laddr = &net.UDPAddr{IP: net.ParseIP("0.0.0.0"), Port: listenPort} + } else { + laddr = &net.UDPAddr{IP: net.ParseIP("[::]"), Port: listenPort} + } + + udpConn, err := reuseport.Dial("udp", laddr.String(), clientAddr.String()) + if err != nil { + errCh <- fmt.Errorf("error connecting to dtls client: %v", err) + return + } + + dtlsConn, err := dtls.ClientWithContext(ctx, udpConn, &dtls.Config{PSK: reg.SharedSecret(), SCTP: dtls.ServerAccept, Unordered: params.GetUnordered()}) + if err != nil { + errCh <- fmt.Errorf("error connecting to dtls client: %v", err) + return + } + t.logDialSuccess(&clientAddr.IP) + + connCh <- dtlsConn + }() + + go func() { + conn, err := t.dtlsListener.AcceptWithContext(ctx, &dtls.Config{PSK: reg.SharedSecret(), SCTP: dtls.ServerAccept, Unordered: params.GetUnordered()}) + if err != nil { + errCh <- fmt.Errorf("error accepting dtls connection from secret: %v", err) + return + } + logip := net.ParseIP(reg.GetRegistrationAddress()) + t.logListenSuccess(&logip) + + connCh <- conn + }() + + var errs []error + for i := 0; i < 2; i++ { + select { + case conn := <-connCh: + if conn != nil { + return conn, nil // success, so return the connection + } + case err := <-errCh: + if err != nil { // store the error + errs = append(errs, err) + } + } + } + + // combine errors into a single error + var combinedErr error + if len(errs) > 0 { + errStrings := make([]string, len(errs)) + for i, err := range errs { + errStrings[i] = err.Error() + } + combinedErr = fmt.Errorf(strings.Join(errStrings, "; ")) + } + + return nil, combinedErr // if we reached here, both attempts failed +} + +func (Transport) GetDstPort(libVersion uint, seed []byte, params any) (uint16, error) { + if params == nil { + return defaultPort, nil + } + + dtlsParams, ok := params.(*pb.DTLSTransportParams) + if !ok { + return 0, fmt.Errorf("bad parameters provided") + } + + if dtlsParams.GetRandomizeDstPort() { + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) + } + + return defaultPort, nil +} + +func (Transport) GetProto() pb.IPProto { + return pb.IPProto_Udp +} + +func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) { + var m = &pb.DTLSTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// ParamStrings returns an array of tag string that will be added to tunStats when a proxy +// session is closed. For now, no params of interest. +func (t Transport) ParamStrings(p any) []string { + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go new file mode 100644 index 000000000..8860316b2 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go @@ -0,0 +1,147 @@ +package dtls + +import ( + "context" + "fmt" + "net" + "os" + "syscall" + "time" + + "github.com/pion/stun" +) + +const ttl = 5 +const defaultTTL = 64 + +type fileConn interface { + File() (*os.File, error) +} + +func openUDP(ctx context.Context, laddr, addr string, dialer dialFunc) error { + conn, err := dialer(ctx, "udp", laddr, addr) + if err != nil { + return err + } + defer conn.Close() + + return sendPacket(ctx, conn) +} + +func sendPacket(ctx context.Context, conn net.Conn) error { + _, err := conn.Write([]byte("")) + if err != nil { + return err + } + + return nil +} + +func openUDPLimitTTL(ctx context.Context, laddr, addr string, dialer dialFunc) error { + // Create a UDP connection + conn, err := dialer(ctx, "udp", laddr, addr) + if err != nil { + return err + } + defer conn.Close() + + fileConn, ok := conn.(fileConn) + if !ok { + return fmt.Errorf("dialed conn does not implement File()") + } + + // Get the file descriptor + fd, err := fileConn.File() + if err != nil { + return err + } + defer fd.Close() + + // Set the TTL + err = syscall.SetsockoptInt(int(fd.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, ttl) + if err != nil { + return err + } + + // Write data to the connection + _, err = conn.Write([]byte("")) + if err != nil { + return err + } + + // reset TTL + err = syscall.SetsockoptInt(int(fd.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, defaultTTL) + if err != nil { + return err + } + + // No error + return nil +} + +func publicAddr(ctx context.Context, network string, stunServer string, dialer dialFunc) (privateAddr *net.UDPAddr, publicAddr *net.UDPAddr, err error) { + + udpConn, err := dialer(ctx, network, "", stunServer) + if err != nil { + return nil, nil, fmt.Errorf("error connecting to STUN server: %v", err) + } + defer udpConn.Close() + + localAddr, err := net.ResolveUDPAddr(udpConn.LocalAddr().Network(), udpConn.LocalAddr().String()) + if err != nil { + return nil, nil, fmt.Errorf("error resolving local address: %v", err) + } + + pubAddr, err := doSTUN(ctx, udpConn) + if err != nil { + return nil, nil, err + } + + return localAddr, pubAddr, nil +} + +func doSTUN(ctx context.Context, udpConn net.Conn) (*net.UDPAddr, error) { + + client, err := stun.NewClient(udpConn) + if err != nil { + return nil, fmt.Errorf("error creating STUN client: %v", err) + } + + message := stun.MustBuild(stun.TransactionID, stun.BindingRequest) + + var xorAddr stun.XORMappedAddress + + doneCh := make(chan error, 1) + + err = client.Start(message, func(res stun.Event) { + if res.Error != nil { + doneCh <- res.Error + return + } + + resErr := xorAddr.GetFrom(res.Message) + doneCh <- resErr + }) + + if err != nil { + return nil, fmt.Errorf("error getting address from STUN: %v", err) + } + + defer client.Close() + if deadline, ok := ctx.Deadline(); ok { + timer := time.AfterFunc(time.Until(deadline), func() { client.Close() }) + defer timer.Stop() + } + + select { + case err := <-doneCh: + if err != nil { + return nil, fmt.Errorf("error during client: %v", err) + } + case <-ctx.Done(): + return nil, fmt.Errorf("timeout: %v", ctx.Err()) + } + + return &net.UDPAddr{IP: xorAddr.IP, Port: xorAddr.Port}, nil + +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/obfuscate.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/obfuscate.go new file mode 100644 index 000000000..edada3f31 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/obfuscate.go @@ -0,0 +1,287 @@ +package transports + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha256" + "errors" + "fmt" + "strconv" + + "github.com/refraction-networking/ed25519/extra25519" + "golang.org/x/crypto/curve25519" +) + +// Obfuscator provides an interface for obfuscating the tags that are sent by transports in order to +// indicate their knowledge of the shared secret to the station. +type Obfuscator interface { + // Take the plain text and perform an obfuscation to make it distinguishable to the station + Obfuscate(plaintext []byte, stationPubkey []byte) ([]byte, error) + + // Take a cipher text and de-obfuscate to make it usable by the station + TryReveal(cipherText []byte, privateKey [32]byte) ([]byte, error) +} + +// GCMObfuscator implements the Obfuscator interface using ECDHE and AES GCM. Prevents tag re-use. +type GCMObfuscator struct{} + +// TryReveal for GCMObfuscator expects a ciphertext object where the first 32 bytes is an elligator +// encoded public key with which the server can derive an ECDHE shared secret. This secret is then +// used to decrypt and authenticate the remainder of the plaintext using AES GCM. +func (GCMObfuscator) TryReveal(ciphertext []byte, privateKey [32]byte) ([]byte, error) { + if len(ciphertext) < 48 { + return nil, ErrPublicKeyLen + } + + var representative, clientPubkey [32]byte + copy(representative[:], ciphertext[:32]) + representative[31] &= 0x3F + extra25519.RepresentativeToPublicKey(&clientPubkey, &representative) + + sharedSecret, err := curve25519.X25519(privateKey[:], clientPubkey[:]) + if err != nil { + return nil, err + } + + stationPubkeyHash := sha256.Sum256(sharedSecret[:]) + aesKey := stationPubkeyHash[:16] + aesIvTag := stationPubkeyHash[16:28] + + block, err := aes.NewCipher(aesKey) + if err != nil { + return nil, err + } + // return block.Decrypt(nil, aesIvTag, cipherText[32:]) + + aesgcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + return aesgcm.Open(nil, aesIvTag, ciphertext[32:], nil) +} + +// Obfuscate for GCMObfuscator derives a shared key using ECDHE an then encrypts the plaintext under +// that key using AES GCM. The elligator representative for the clients public key is prepended +// to the returned byte array. This means that the result length will likely be: +// +// 32 + len(plaintext) + 16 +// +// [elligator encoded client Pub][Ciphertext + Auth tag] +func (GCMObfuscator) Obfuscate(plainText []byte, stationPubkey []byte) ([]byte, error) { + if len(stationPubkey) != 32 { + return nil, fmt.Errorf("%w, received: %d", ErrPublicKeyLen, len(stationPubkey)) + } + var clientPrivate, clientPublic, representative [32]byte + var sharedSecret []byte + for ok := false; !ok; { + var sliceKeyPrivate []byte = clientPrivate[:] + _, err := rand.Read(sliceKeyPrivate) + if err != nil { + return nil, err + } + + ok = extra25519.ScalarBaseMult(&clientPublic, &representative, &clientPrivate) + } + + sharedSecret, err := curve25519.X25519(clientPrivate[:], stationPubkey) + if err != nil { + return nil, err + } + + // extra25519.ScalarBaseMult does not randomize most significant bit(sign of y_coord?) + // Other implementations of elligator may have up to 2 non-random bits. + // Here we randomize the bit, expecting it to be flipped back to 0 on station + randByte := make([]byte, 1) + _, err = rand.Read(randByte) + if err != nil { + return nil, err + } + representative[31] |= (0xC0 & randByte[0]) + + tagBuf := new(bytes.Buffer) // What we have to encrypt with the shared secret using AES + tagBuf.Write(representative[:]) + + stationPubkeyHash := sha256.Sum256(sharedSecret[:]) + aesKey := stationPubkeyHash[:16] + aesIvTag := stationPubkeyHash[16:28] // 12 bytes for plaintext nonce + + cipherText, err := aesGcmEncrypt(plainText, aesKey, aesIvTag) + if err != nil { + return nil, err + } + + tagBuf.Write(cipherText) + tag := tagBuf.Bytes() + + return tag, nil +} + +// CTRObfuscator implements the Obfuscator interface using ECDHE and AES CTR. Prevents tag re-use. +type CTRObfuscator struct{} + +// TryReveal for CTRObfuscator expects a ciphertext object where the first 32 bytes is an elligator +// encoded public key with which the server can derive an ECDHE shared secret. This secret is then +// used to decrypt the remainder of the plaintext using AES CTR. +func (CTRObfuscator) TryReveal(ciphertext []byte, privateKey [32]byte) ([]byte, error) { + if len(ciphertext) < 32 { + return nil, ErrPublicKeyLen + } + + var representative, clientPubkey [32]byte + copy(representative[:], ciphertext[:32]) + representative[31] &= 0x3F + extra25519.RepresentativeToPublicKey(&clientPubkey, &representative) + + sharedSecret, err := curve25519.X25519(privateKey[:], clientPubkey[:]) + if err != nil { + return nil, err + } + + stationPubkeyHash := sha256.Sum256(sharedSecret[:]) + aesKey := stationPubkeyHash[:16] + aesIvTag := stationPubkeyHash[16:32] + + return aesCTR(ciphertext[32:], aesKey, aesIvTag) +} + +// Obfuscate for CTRObfuscator derives a shared key using ECDHE an then encrypts the plaintext under +// that key using AES CTR. The elligator representative for the clients public key is prepended +// to the returned byte array. This means that the result length will likely be: +// +// 32 + len(plaintext) +// +// [elligator encoded client Pub][Ciphertext] +func (CTRObfuscator) Obfuscate(plainText []byte, stationPubkey []byte) ([]byte, error) { + if len(stationPubkey) != 32 { + return nil, errors.New("Unexpected station pubkey length. Expected: 32." + + " Received: " + strconv.Itoa(len(stationPubkey)) + ".") + } + var clientPrivate, clientPublic, representative [32]byte + var sharedSecret []byte + for ok := false; !ok; { + var sliceKeyPrivate []byte = clientPrivate[:] + _, err := rand.Read(sliceKeyPrivate) + if err != nil { + return nil, err + } + + ok = extra25519.ScalarBaseMult(&clientPublic, &representative, &clientPrivate) + } + + sharedSecret, err := curve25519.X25519(clientPrivate[:], stationPubkey) + if err != nil { + return nil, err + } + + // extra25519.ScalarBaseMult does not randomize most significant bit(sign of y_coord?) + // Other implementations of elligator may have up to 2 non-random bits. + // Here we randomize the bit, expecting it to be flipped back to 0 on station + randByte := make([]byte, 1) + _, err = rand.Read(randByte) + if err != nil { + return nil, err + } + representative[31] |= (0xC0 & randByte[0]) + + tagBuf := new(bytes.Buffer) // What we have to encrypt with the shared secret using AES + tagBuf.Write(representative[:]) + + stationPubkeyHash := sha256.Sum256(sharedSecret[:]) + aesKey := stationPubkeyHash[:16] + aesIvTag := stationPubkeyHash[16:32] // 16 bytes for CTR IV + + cipherText, err := aesCTR(plainText, aesKey, aesIvTag) + if err != nil { + return nil, err + } + + tagBuf.Write(cipherText) + tag := tagBuf.Bytes() + + return tag, nil +} + +// XORObfuscator implements the Obfuscator interface for no modification the provided tag / +// plaintext / ciphertext. Will NOT prevent tag re-use if a registration is re-used. +type XORObfuscator struct{} + +// TryReveal for XORObfuscator just returns the provided ciphertext without modification +func (XORObfuscator) TryReveal(cipherText []byte, privateKey [32]byte) ([]byte, error) { + if len(cipherText)%2 != 0 || len(cipherText) == 0 { + return nil, errors.New("Unexpected message with even length") + } + + n := len(cipherText) / 2 + out := make([]byte, n) + for i, b := range cipherText[:n] { + out[i] = b ^ cipherText[n+i] + } + return out, nil +} + +// Obfuscate for XORObfuscator just returns the provided plaintext without modification +func (XORObfuscator) Obfuscate(plainText []byte, stationPubkey []byte) ([]byte, error) { + lp := len(plainText) + if lp == 0 { + return []byte{}, nil + } + out := make([]byte, lp*2) + + randByte := make([]byte, lp) + _, err := rand.Read(randByte) + if err != nil { + return nil, err + } + + for i, b := range randByte { + out[i] = b + out[lp+i] = b ^ plainText[i] + } + + return out, nil +} + +// NilObfuscator implements the Obfuscator interface for no modification the provided tag / +// plaintext / ciphertext. Will NOT prevent tag re-use if a registration is re-used. +type NilObfuscator struct{} + +// TryReveal for NilObfuscator just returns the provided ciphertext without modification +func (NilObfuscator) TryReveal(cipherText []byte, privateKey [32]byte) ([]byte, error) { + return cipherText, nil +} + +// Obfuscate for NilObfuscator just returns the provided plaintext without modification +func (NilObfuscator) Obfuscate(plainText []byte, stationPubkey []byte) ([]byte, error) { + return plainText, nil +} + +// The key argument should be the AES key, either 16 or 32 bytes +// to select AES-128 or AES-256. +func aesGcmEncrypt(plaintext []byte, key []byte, iv []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + aesGcmCipher, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + return aesGcmCipher.Seal(nil, iv, plaintext, nil), nil +} + +func aesCTR(in []byte, key []byte, iv []byte) ([]byte, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + out := make([]byte, len(in)) + stream := cipher.NewCTR(block, iv) + stream.XORKeyStream(out, in) + + return out, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/registration.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/registration.go new file mode 100644 index 000000000..096991640 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/registration.go @@ -0,0 +1,28 @@ +package transports + +import ( + "io" + "net" + + pb "github.com/refraction-networking/conjure/proto" +) + +// Registration provides an abstraction around station tracked registrations. +type Registration interface { + SharedSecret() []byte + GetRegistrationAddress() string + GetDstPort() uint16 + PhantomIP() *net.IP + + // Transport management functions + TransportType() pb.TransportType + TransportParams() any + SetTransportKeys(interface{}) error + TransportKeys() interface{} + TransportReader() io.Reader +} + +// RegManager provides an abstraction for the RegistrationManager which tracks registrations. +type RegManager interface { + GetRegistrations(phantomAddr net.IP) map[string]Registration +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go new file mode 100644 index 000000000..0f2acc823 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go @@ -0,0 +1,65 @@ +package transports + +import ( + "crypto/rand" + "crypto/sha256" + "errors" + "io" + "math/big" + "net" + + "golang.org/x/crypto/hkdf" +) + +var ( + // ErrTryAgain is returned by transports when it is inconclusive with the current amount of data + // whether the transport exists in the connection. + ErrTryAgain = errors.New("not enough information to determine transport") + + // ErrNotTransport is returned by transports when they + // can conclusively determine that the connection does not + // contain this transport. The caller shouldn't retry + // with this transport. + ErrNotTransport = errors.New("connection does not contain transport") + + // ErrTransportNotSupported is returned when a transport is unable to service one or more of the + // required functions because the clientLibVersion is to old and the transport is not backward + // compatible to that version. + ErrTransportNotSupported = errors.New("Transport not supported ") + + // ErrPublicKeyLen is returned when the length of the provided public key is incorrect for + // ed25519. + ErrPublicKeyLen = errors.New("Unexpected station pubkey length. Expected: 32B") +) + +// PrefixConn allows arbitrary readers to serve as the data source of a net.Conn. This allows us to +// consume data from the socket while later making it available again (for things like handshakes). +type PrefixConn struct { + net.Conn + r io.Reader +} + +func (pc PrefixConn) Read(p []byte) (int, error) { + return pc.r.Read(p) +} + +// PrependToConn creates a PrefixConn which allows arbitrary readers to serve as +// the data source of a net.Conn. +func PrependToConn(c net.Conn, r io.Reader) PrefixConn { + return PrefixConn{Conn: c, r: io.MultiReader(r, c)} +} + +// PortSelectorRange provides a generic and basic way to return a seeded port +// selection function that uses a custom range. +func PortSelectorRange(min, max int64, seed []byte) (uint16, error) { + + // Naive Method. Get random in port range. + hkdfReader := hkdf.New(sha256.New, seed, nil, []byte("phantom-select-dst-port")) + port, err := rand.Int(hkdfReader, big.NewInt(max-min)) + if err != nil { + return 0, nil + } + + port.Add(port, big.NewInt(min)) + return uint16(port.Uint64()), nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/client.go new file mode 100644 index 000000000..a60bf868b --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/client.go @@ -0,0 +1,144 @@ +package min + +import ( + "context" + "fmt" + "io" + "net" + + core "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +// ClientTransport implements the client side transport interface for the Min transport. The +// significant difference is that there is an instance of this structure per client session, where +// the station side Transport struct has one instance to be re-used for all sessions. +type ClientTransport struct { + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. + Parameters *pb.GenericTransportParams + // SessionParams are fields that will be used for the current session only + sessionParams *pb.GenericTransportParams + + connectTag []byte +} + +// Name returns a string identifier for the Transport for logging +func (*ClientTransport) Name() string { + return "min" +} + +// String returns a string identifier for the Transport for logging (including string formatters) +func (*ClientTransport) String() string { + return "min" +} + +// ID provides an identifier that will be sent to the conjure station during the registration so +// that the station knows what transport to expect connecting to the chosen phantom. +func (*ClientTransport) ID() pb.TransportType { + return pb.TransportType_Min +} + +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + return nil +} + +// GetParams returns a generic protobuf with any parameters from both the registration and the +// transport. +func (t *ClientTransport) GetParams() (proto.Message, error) { + return t.sessionParams, nil +} + +// ParseParams gives the specific transport an option to parse a generic object into parameters +// provided by the station in the registration response during registration. +func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + var m = &pb.GenericTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + if t.sessionParams == nil { + if t.Parameters == nil { + t.Parameters = &pb.GenericTransportParams{} + } + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + } + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + if p == nil { + return nil + } + + t.sessionParams = proto.Clone(p.(*pb.GenericTransportParams)).(*pb.GenericTransportParams) + return nil +} + +// SetParams allows the caller to set parameters associated with the transport, returning an +// error if the provided generic message is not compatible. +func (t *ClientTransport) SetParams(p any) error { + var parsedParams *pb.GenericTransportParams + if params, ok := p.(*pb.GenericTransportParams); ok { + // make a copy of params so that we don't modify the original during an active session. + parsedParams = proto.Clone(params).(*pb.GenericTransportParams) + } else if p == nil { + parsedParams = &pb.GenericTransportParams{} + parsedParams.RandomizeDstPort = proto.Bool(true) + } else { + return fmt.Errorf("unable to parse params") + } + t.Parameters = parsedParams + return nil +} + +// GetDstPort returns the destination port that the client should open the phantom connection to +func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { + if t.sessionParams == nil || !t.sessionParams.GetRandomizeDstPort() { + return 443, nil + } + + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) +} + +// WrapConn creates the connection to the phantom address negotiated in the registration phase of +// Conjure connection establishment. +func (t *ClientTransport) WrapConn(conn net.Conn) (net.Conn, error) { + // Send hmac(seed, str) bytes to indicate to station (min transport) generated during Prepare(...) + _, err := conn.Write(t.connectTag) + if err != nil { + return nil, err + } + return conn, nil +} + +// PrepareKeys provides an opportunity for the transport to integrate the station public key +// as well as bytes from the deterministic random generator associated with the registration +// that this ClientTransport is attached t +func (t *ClientTransport) PrepareKeys(pubkey [32]byte, sharedSecret []byte, dRand io.Reader) error { + t.connectTag = core.ConjureHMAC(sharedSecret, hmacString) + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/min.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/min.go new file mode 100644 index 000000000..68193bfaa --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/min/min.go @@ -0,0 +1,130 @@ +package min + +import ( + "bytes" + "fmt" + "net" + + core "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +const ( + // Earliest client library version ID that supports destination port randomization + randomizeDstPortMinVersion uint = 3 + + // port range boundaries for min when randomizing + portRangeMin = 1024 + portRangeMax = 65535 +) + +const ( + minTagLength = 32 + + // This is a misspelling that cannot be changed without also adding checks for client Library + // version otherwise the min transport will not be backwards compatible. + hmacString = "MinTrasportHMACString" +) + +// Transport provides a struct implementing the Transport, WrappingTransport, +// PortRandomizingTransport, and FixedPortTransport interfaces. +type Transport struct{} + +// Name returns the human-friendly name of the transport, implementing the +// Transport interface.. +func (Transport) Name() string { return "MinTransport" } + +// LogPrefix returns the prefix used when including this transport in logs, +// implementing the Transport interface. +func (Transport) LogPrefix() string { return "MIN" } + +// GetIdentifier takes in a registration and returns an identifier for it. This +// identifier should be unique for each registration on a given phantom; +// registrations on different phantoms can have the same identifier. +func (Transport) GetIdentifier(d transports.Registration) string { + return string(core.ConjureHMAC(d.SharedSecret(), hmacString)) +} + +// GetProto returns the next layer protocol that the transport uses. Implements +// the Transport interface. +func (Transport) GetProto() pb.IPProto { + return pb.IPProto_Tcp +} + +// ParseParams gives the specific transport an option to parse a generic object +// into parameters provided by the client during registration. +func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + // For backwards compatibility we create a generic transport params object + // for transports that existed before the transportParams fields existed. + if libVersion < randomizeDstPortMinVersion { + f := false + return &pb.GenericTransportParams{ + RandomizeDstPort: &f, + }, nil + } + + var m = &pb.GenericTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// ParamStrings returns an array of tag string that will be added to tunStats when a proxy +// session is closed. For now, no params of interest. +func (t Transport) ParamStrings(p any) []string { + return nil +} + +// WrapConnection attempts to wrap the given connection in the transport. It +// takes the information gathered so far on the connection in data, attempts to +// identify itself, and if it positively identifies itself wraps the connection +// in the transport, returning a connection that's ready to be used by others. +// +// If the returned error is nil or non-nil and non-{ transports.ErrTryAgain, +// transports.ErrNotTransport }, the caller may no longer use data or conn. +func (Transport) WrapConnection(data *bytes.Buffer, c net.Conn, originalDst net.IP, regManager transports.RegManager) (transports.Registration, net.Conn, error) { + if data.Len() < minTagLength { + return nil, nil, transports.ErrTryAgain + } + + hmacID := data.String()[:minTagLength] + reg, ok := regManager.GetRegistrations(originalDst)[hmacID] + if !ok { + return nil, nil, transports.ErrNotTransport + } + + // We don't want the first 32 bytes + data.Next(minTagLength) + + return reg, transports.PrependToConn(c, data), nil +} + +// GetDstPort Given the library version, a seed, and a generic object +// containing parameters the transport should be able to return the +// destination port that a clients phantom connection will attempt to reach +func (Transport) GetDstPort(libVersion uint, seed []byte, params any) (uint16, error) { + + if libVersion < randomizeDstPortMinVersion { + return 443, nil + } + + if params == nil { + return 443, nil + } + + parameters, ok := params.(*pb.GenericTransportParams) + if !ok { + return 0, fmt.Errorf("bad parameters provided") + } + + if parameters.GetRandomizeDstPort() { + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) + } + + return 443, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/client.go new file mode 100644 index 000000000..c1ff76ee3 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/client.go @@ -0,0 +1,164 @@ +package obfs4 + +import ( + "context" + "fmt" + "io" + "net" + + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "github.com/refraction-networking/obfs4/transports/obfs4" + + pt "gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +// ClientTransport implements the client side transport interface for the Min transport. The +// significant difference is that there is an instance of this structure per client session, where +// the station side Transport struct has one instance to be re-used for all sessions. +type ClientTransport struct { + // Parameters are fields that will be shared with the station in the registration. This object + // should be considered immutable after initialization otherwise changes will persist across + // subsequent dials. + Parameters *pb.GenericTransportParams + // SessionParams are fields that will be used for the current session only + sessionParams *pb.GenericTransportParams + + keys Obfs4Keys +} + +// Name returns a string identifier for the Transport for logging +func (*ClientTransport) Name() string { + return "obfs4" +} + +// String returns a string identifier for the Transport for logging (including string formatters) +func (*ClientTransport) String() string { + return "obfs4" +} + +// ID provides an identifier that will be sent to the conjure station during the registration so +// that the station knows what transport to expect connecting to the chosen phantom. +func (*ClientTransport) ID() pb.TransportType { + return pb.TransportType_Obfs4 +} + +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + return nil +} + +// GetParams returns a generic protobuf with any parameters from both the registration and the +// transport. +func (t *ClientTransport) GetParams() (proto.Message, error) { + return t.sessionParams, nil +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + if incoming == nil { + return nil + } + + if t.sessionParams == nil { + if t.Parameters == nil { + t.Parameters = &pb.GenericTransportParams{} + } + // make a fresh copy of the parameters so that we don't modify the original during an active session. + t.sessionParams = proto.Clone(t.Parameters).(*pb.GenericTransportParams) + } + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + if p == nil { + return nil + } + + t.sessionParams = proto.Clone(p.(*pb.GenericTransportParams)).(*pb.GenericTransportParams) + return nil +} + +// SetParams allows the caller to set parameters associated with the transport, returning an +// error if the provided generic message is not compatible. +func (t *ClientTransport) SetParams(p any) error { + var parsedParams *pb.GenericTransportParams + if params, ok := p.(*pb.GenericTransportParams); ok { + // make a copy of params so that we don't modify the original during an active session. + parsedParams = proto.Clone(params).(*pb.GenericTransportParams) + } else if p == nil { + parsedParams = &pb.GenericTransportParams{} + parsedParams.RandomizeDstPort = proto.Bool(true) + } else { + return fmt.Errorf("unable to parse params") + } + t.Parameters = parsedParams + return nil +} + +// ParseParams gives the specific transport an option to parse a generic object into parameters +// provided by the station in the registration response during registration. +func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + var m = &pb.GenericTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// GetDstPort returns the destination port that the client should open the phantom connection to +func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { + if t.sessionParams == nil || !t.sessionParams.GetRandomizeDstPort() { + return 443, nil + } + + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) +} + +// WrapConn creates the connection to the phantom address negotiated in the registration phase of +// Conjure connection establishment. +func (t ClientTransport) WrapConn(conn net.Conn) (net.Conn, error) { + obfsTransport := obfs4.Transport{} + args := pt.Args{} + + args.Add("node-id", t.keys.NodeID.Hex()) + args.Add("public-key", t.keys.PublicKey.Hex()) + args.Add("iat-mode", "1") + + c, err := obfsTransport.ClientFactory("") + if err != nil { + return nil, fmt.Errorf("failed to create client factory") + } + + parsedArgs, err := c.ParseArgs(&args) + if err != nil { + return nil, fmt.Errorf("failed to parse obfs4 args") + } + + d := func(network, address string) (net.Conn, error) { + return conn, nil + } + + return c.Dial("tcp", "", d, parsedArgs) +} + +func (t *ClientTransport) PrepareKeys(pubkey [32]byte, sharedSecret []byte, dRand io.Reader) error { + // Generate shared keys + var err error + t.keys, err = generateObfs4Keys(dRand) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/keys.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/keys.go new file mode 100644 index 000000000..d787be87a --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/keys.go @@ -0,0 +1,40 @@ +package obfs4 + +import ( + "io" + + "github.com/refraction-networking/obfs4/common/ntor" + "golang.org/x/crypto/curve25519" +) + +type Obfs4Keys struct { + PrivateKey *ntor.PrivateKey + PublicKey *ntor.PublicKey + NodeID *ntor.NodeID +} + +func generateObfs4Keys(rand io.Reader) (Obfs4Keys, error) { + keys := Obfs4Keys{ + PrivateKey: new(ntor.PrivateKey), + PublicKey: new(ntor.PublicKey), + NodeID: new(ntor.NodeID), + } + + _, err := rand.Read(keys.PrivateKey[:]) + if err != nil { + return keys, err + } + + keys.PrivateKey[0] &= 248 + keys.PrivateKey[31] &= 127 + keys.PrivateKey[31] |= 64 + + pub, err := curve25519.X25519(keys.PrivateKey[:], curve25519.Basepoint) + if err != nil { + return keys, err + } + copy(keys.PublicKey[:], pub) + + _, err = rand.Read(keys.NodeID[:]) + return keys, err +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4.go new file mode 100644 index 000000000..a5da39d0d --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4.go @@ -0,0 +1,222 @@ +package obfs4 + +import ( + "bytes" + "fmt" + "net" + + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "github.com/refraction-networking/obfs4/common/drbg" + "github.com/refraction-networking/obfs4/common/ntor" + "github.com/refraction-networking/obfs4/transports/obfs4" + + pt "gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib" + "google.golang.org/protobuf/types/known/anypb" +) + +const ( + // Earliest client library version ID that supports destination port randomization + randomizeDstPortMinVersion uint = 3 + + // port range boundaries for min when randomizing + portRangeMin = 22 + portRangeMax = 65535 +) + +// Transport implements the station Transport interface for the obfs4 transport +type Transport struct{} + +// Name implements the station Transport interface +func (Transport) Name() string { return "obfs4" } + +// LogPrefix implements the station Transport interface +func (Transport) LogPrefix() string { return "OBFS4" } + +// GetIdentifier implements the station Transport interface +func (Transport) GetIdentifier(r transports.Registration) string { + if r == nil { + return "" + } else if r.TransportKeys() == nil { + keys, err := generateObfs4Keys(r.TransportReader()) + if err != nil { + return "" + } + err = r.SetTransportKeys(keys) + if err != nil { + return "" + } + } + obfs4Keys, ok := r.TransportKeys().(Obfs4Keys) + if !ok { + return "" + } + return string(obfs4Keys.PublicKey.Bytes()[:]) + string(obfs4Keys.NodeID.Bytes()[:]) +} + +// GetProto returns the next layer protocol that the transport uses. Implements +// the Transport interface. +func (Transport) GetProto() pb.IPProto { + return pb.IPProto_Tcp +} + +// ParseParams gives the specific transport an option to parse a generic object +// into parameters provided by the client during registration. +func (Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + // For backwards compatibility we create a generic transport params object + // for transports that existed before the transportParams fields existed. + if libVersion < randomizeDstPortMinVersion { + f := false + return &pb.GenericTransportParams{ + RandomizeDstPort: &f, + }, nil + } + + var m = &pb.GenericTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// ParamStrings returns an array of tag string that will be added to tunStats when a proxy +// session is closed. For now, no params of interest. +func (t Transport) ParamStrings(p any) []string { + return nil +} + +// WrapConnection implements the station Transport interface +func (Transport) WrapConnection(data *bytes.Buffer, c net.Conn, phantom net.IP, regManager transports.RegManager) (transports.Registration, net.Conn, error) { + if data.Len() < ClientMinHandshakeLength { + return nil, nil, transports.ErrTryAgain + } + + var representative ntor.Representative + copy(representative[:ntor.RepresentativeLength], data.Bytes()[:ntor.RepresentativeLength]) + + for _, r := range getObfs4Registrations(regManager, phantom) { + if r == nil { + return nil, nil, fmt.Errorf("broken registration") + } else if r.TransportKeys() == nil { + keys, err := generateObfs4Keys(r.TransportReader()) + if err != nil { + return nil, nil, fmt.Errorf("Failed to generate obfs4 keys: %w", err) + } + err = r.SetTransportKeys(keys) + if err != nil { + return nil, nil, fmt.Errorf("Failed to set obfs4 keys: %w", err) + } + } + obfs4Keys, ok := r.TransportKeys().(Obfs4Keys) + if !ok { + return nil, nil, fmt.Errorf("Incorrect Key Type") + } + + mark := generateMark(obfs4Keys.NodeID, obfs4Keys.PublicKey, &representative) + pos := findMarkMac(mark, data.Bytes(), ntor.RepresentativeLength+ClientMinPadLength, MaxHandshakeLength, true) + if pos == -1 { + continue + } + + // We found the mark in the client handshake! We found our registration! + args := pt.Args{} + args.Add("node-id", obfs4Keys.NodeID.Hex()) + args.Add("private-key", obfs4Keys.PrivateKey.Hex()) + seed, err := drbg.NewSeed() + if err != nil { + return nil, nil, fmt.Errorf("failed to create DRBG seed: %w", err) + } + args.Add("drbg-seed", seed.Hex()) + + t := &obfs4.Transport{} + + factory, err := t.ServerFactory("", &args) + if err != nil { + return nil, nil, fmt.Errorf("failed to create server factory: %w", err) + } + + mc := transports.PrependToConn(c, data) + wrapped, err := factory.WrapConn(mc) + + return r, wrapped, err + } + + // If we read more than min handshake len, but less than max and didn't find + // the mark get more bytes until we have reached the max handshake length. + // If we have reached the max handshake len and didn't find it return NotTransport + if data.Len() < MaxHandshakeLength { + return nil, nil, transports.ErrTryAgain + } + + // The only time we'll make it here is if there are no obfs4 registrations + // for the given phantom. + return nil, nil, transports.ErrNotTransport +} + +// This function makes the assumption that any identifier with length 52 is an obfs4 registration. +// This may not be strictly true, but any other identifier will simply fail to form a connection and +// should be harmless. +func getObfs4Registrations(regManager transports.RegManager, darkDecoyAddr net.IP) []transports.Registration { + var regs []transports.Registration + + for identifier, r := range regManager.GetRegistrations(darkDecoyAddr) { + if len(identifier) == ntor.PublicKeyLength+ntor.NodeIDLength { + regs = append(regs, r) + } + } + + return regs +} + +// GetDstPort Given the library version, a seed, and a generic object +// containing parameters the transport should be able to return the +// destination port that a clients phantom connection will attempt to reach +func (Transport) GetDstPort(libVersion uint, seed []byte, params any) (uint16, error) { + + if libVersion < randomizeDstPortMinVersion { + return 443, nil + } + + if params == nil { + return 443, nil + } + + parameters, ok := params.(*pb.GenericTransportParams) + if !ok { + return 0, fmt.Errorf("bad parameters provided") + } + + if parameters.GetRandomizeDstPort() { + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) + } + + return 443, nil +} + +// func generateObfs4Keys(rand io.Reader) (core.Obfs4Keys, error) { +// keys := Obfs4Keys{ +// PrivateKey: new(ntor.PrivateKey), +// PublicKey: new(ntor.PublicKey), +// NodeID: new(ntor.NodeID), +// } + +// _, err := rand.Read(keys.PrivateKey[:]) +// if err != nil { +// return keys, err +// } + +// keys.PrivateKey[0] &= 248 +// keys.PrivateKey[31] &= 127 +// keys.PrivateKey[31] |= 64 + +// pub, err := curve25519.X25519(keys.PrivateKey[:], curve25519.Basepoint) +// if err != nil { +// return keys, err +// } +// copy(keys.PublicKey[:], pub) + +// _, err = rand.Read(keys.NodeID[:]) +// return keys, err +// } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4_license.txt b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4_license.txt new file mode 100644 index 000000000..c4cbc013b --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/obfs4_license.txt @@ -0,0 +1,57 @@ +Copyright (c) 2014, Yawning Angel +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +============================================================================== + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/utils.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/utils.go new file mode 100644 index 000000000..e60fff5ce --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4/utils.go @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2014, Yawning Angel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +// I brought this in mostly for the constants and findMarkMac. + +package obfs4 + +import ( + "bytes" + "crypto/hmac" + "crypto/sha256" + "fmt" + + "github.com/refraction-networking/obfs4/common/drbg" + "github.com/refraction-networking/obfs4/common/ntor" + "github.com/refraction-networking/obfs4/transports/obfs4/framing" +) + +const ( + MaxHandshakeLength = 8192 + + ClientMinPadLength = (ServerMinHandshakeLength + InlineSeedFrameLength) - + ClientMinHandshakeLength + ClientMaxPadLength = MaxHandshakeLength - ClientMinHandshakeLength + ClientMinHandshakeLength = ntor.RepresentativeLength + MarkLength + MacLength + + ServerMinPadLength = 0 + ServerMaxPadLength = MaxHandshakeLength - (ServerMinHandshakeLength + + InlineSeedFrameLength) + ServerMinHandshakeLength = ntor.RepresentativeLength + ntor.AuthLength + + MarkLength + MacLength + + MarkLength = sha256.Size / 2 + MacLength = sha256.Size / 2 + + PacketOverhead = 2 + 1 + SeedPacketPayloadLength = drbg.SeedLength + + InlineSeedFrameLength = framing.FrameOverhead + PacketOverhead + SeedPacketPayloadLength +) + +func generateMark(nodeID *ntor.NodeID, pubkey *ntor.PublicKey, representative *ntor.Representative) []byte { + h := hmac.New(sha256.New, append(pubkey.Bytes()[:], nodeID.Bytes()[:]...)) + h.Write(representative.Bytes()[:]) + sum := h.Sum(nil)[:MarkLength] + return sum +} + +func findMarkMac(mark, buf []byte, startPos, maxPos int, fromTail bool) (pos int) { + if len(mark) != MarkLength { + panic(fmt.Sprintf("BUG: Invalid mark length: %d", len(mark))) + } + + endPos := len(buf) + if startPos > len(buf) { + return -1 + } + if endPos > maxPos { + endPos = maxPos + } + if endPos-startPos < MarkLength+MacLength { + return -1 + } + + if fromTail { + // The server can optimize the search process by only examining the + // tail of the buffer. The client can't send valid data past M_C | + // MAC_C as it does not have the server's public key yet. + pos = endPos - (MarkLength + MacLength) + if !hmac.Equal(buf[pos:pos+MarkLength], mark) { + return -1 + } + + return + } + + // The client has to actually do a substring search since the server can + // and will send payload trailing the response. + pos = bytes.Index(buf[startPos:endPos], mark) + if pos == -1 { + return -1 + } + + // Ensure that there is enough trailing data for the MAC. + if startPos+pos+MarkLength+MacLength > endPos { + return -1 + } + + // Return the index relative to the start of the slice. + pos += startPos + return +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/README.md b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/README.md new file mode 100644 index 000000000..4f4941268 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/README.md @@ -0,0 +1,155 @@ + +# Prefix Transport + +**TLDR** - This transport allows up to prepend conjure connections with bytes that look like the +initialization of other protocols. This can help to circumvent blocking in some areas and better +understand censorship regimes, but is generally a short term solution. + +The `Prefix_Min` transport is a strictly improved version of the existing `Min` transport and we +suggest migration. + +## Description + +This package implements the prefix transport for the conjure refraction-networking system. The +prefix transport operates in much the same way as the min transport, sending a tag in the fist +packet signalling to the station that the flow has knowledge of a secret shared with the station by +a previous registration. + +### Integrating the Prefix Transport + +Though the client dialer allows the use of TrasnportType for compatibility reasons, the prefix +transport requires use of the newer Client Transport interface (`TransportConfig` in the dialer) +which is implemented by the `prefix.ClientTransport` object. + +Usage Example: + +```go +// basic - default prefix is Random. +t := transports.NewWithParams("prefix", nil) + +dialer = &tapdanceDialer{TransportConfig: t} +conn, err := dialer.Dial("tcp", "1.1.1.1:443") +// ... +``` + +```go +// Options included +var prefixID int32 = prefix.OpenSSH2 +var randomizePhantomPort = true +var flushPolicy = prefix.FlushAfterTag + +params = &pb.PrefixTransportParams{ + RandomizeDstPort: &randomizePhantomPort, + PrefixId: &prefixID + CustomFlushPolicy: &flushPolicy +} + +t, err := transports.NewWithParams("prefix", params) +if err != nil { + panic(err) +} + +dialer = &tapdanceDialer{ TransportConfig: t} +conn, err := dialer.Dial("tcp", "1.1.1.1:443") +// ... +``` + +### Prefixes Supported by Default + +All Prefixes include an obfuscated tag that indicates to the station that this is in fact a +registered client and shared the registration identifier as a secure value obfuscated to uniform +random. + +- `Min` - minimum prefix prepends no bytes other than obfuscated tag, similar to + the existing [Min + transport](https://github.com/refraction-networking/conjure/tree/master/pkg/transports/wrapping/min) +- `GetLong` - Plain text HTTP 1.1 GET Header for a root path +- `PostLong` - Plain text HTTP 1.1 POST Header for a root path +- `HTTPResp` - Plain text HTTP 1.1 Response Header with a 200 (success) return code +- `TLSClientHello` - TLS ClientHello header up to random field +- `TLSServerHello` - TLS ServerHello header up to random field +- `TLSAlertWarning` - TLS header indicating a fatal alert +- `TLSAlertFatal` - TLS header indicating a fatal alert +- `DNSOverTCP` - DNS over TCP header +- `OpenSSH2` - OpenSSH banner header version 8.9.p1 + +### Ports + +Prefixes have default ports associated with them, but also allow port randomization. In the prefix +Transport specifically the parameter to control that is `RandomizeDstPort`. If this is not set, then +the connection will set the port to the the fixed port associated with the chosen prefix (e.g. TLS +prefixes will use 443, HTTP will use 80, etc.). If Randomize is selected, the port is chosen from a +destination port randomly from the range [1024 - 65535]. + +### Prefix Write Buffer Flush + +Given that the prefix support is intended to be relatively flexible wrt. the way that prefixes can +be expressed we have added a parameter to give the user basic control over the places where the +write buffer gets flushed. Each existing prefix haa a default flush policy that makes the most sense +for the individual prefix. + +Currently there are only two positions where potential flushes will be inserted, after the prefix +and/or after the obfuscated tag. + +```txt +[prefix_bytes] | | [obfuscated_tag] | | [client bytes .... -> ] + ^ ^ + maybe flush maybe flush +``` + +Currently the default policy for the existing (partial packet) prefixes is no added flushes. +However, for different prefixes in the future (e.g a complete TLS ClientHello packet) it would make +sense to flush after the prefix. + +### :warning: Sharp Edges :warning: + +In general this transport will not properly mimic the protocols that are sent as a prefix and should +not be expected to do so. + +**Comparing the [Min transport](https://github.com/refraction-networking/conjure/tree/master/pkg/transports/wrapping/min) and the min prefix** + +The min transport is designed to send a uniform random encoding of the client`s session identifier +before the initial packet in a connection. Howveer, on reconnect the same value is sent for the +session identifier. Meaning that connections made by re-using registrations will always start with +the same 32 bytes. + +In contrast the Min prefix uses a 64 byte obfuscated tag that will be random on every connection, +even when re-using a registration. Beyond this the tag encoding scheme is built to be modular, and +capable of supporting new obfuscation techniques as necessary in the future. Currently obfuscation +is done by deriving a shared key using ECDHE an then encrypts the plaintext under that key using +AES CTR. The elligator representative for the clients public key is prepended to the returned byte +array. This means that the result length will likely be: `32 + len(plaintext)`. + +```txt +// Min Transport +[32B elligator encoded session indicator] + +// Min Prefix +[32B elligator encoded client ECDHE Pub] [32B session indicator] + +``` + +## Adding a Prefix / Bidirectional Registration Prefix Overrides + +TODO: :construction: In order to add a prefix ... + +## :construction: Road-Map + +Planned Features + +- [X] **Randomization** - indicate segments of the prefix to be filled from a random source. + +- [ ] **Server Side Prefix Override From File** - file format shared between station and Reg server + describing available prefixes outside of defaults. + +These features are not necessarily planned or landing imminently, they are simply things that would +be nice to have. + +- [ ] **TagEncodings** - Allow the tag to (by prefix configuration) be encoded using an encoder + expected by the station, Base64 for example. + +- [ ] **StreamEncodings** - Allow the Stream of client bytes to (by configuration) encoded / + encrypted using a scheme expected by the station, AES or Base64 for example. + +- [ ] **Prefix Revocation** - If there is a prefix that is known to be blocked and we don't want + clients to use it, but we still want them to roll a random prefix, how do we do this? diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go new file mode 100644 index 000000000..79f039372 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go @@ -0,0 +1,505 @@ +package prefix + +import ( + "bufio" + "context" + "crypto/rand" + "fmt" + "io" + "math/big" + "net" + + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +// ClientTransport implements the client side transport interface for the Min transport. The +// significant difference is that there is an instance of this structure per client session, where +// the station side Transport struct has one instance to be re-used for all sessions. +// +// External libraries must set parameters through SetParams using PrefixTransportParams. +type ClientTransport struct { + parameters *pb.PrefixTransportParams + sessionParams *pb.PrefixTransportParams + + // // state tracks fields internal to the registrar that survive for the lifetime + // // of the transport session without being shared - i.e. local derived keys. + // state any + + Prefix Prefix + TagObfuscator transports.Obfuscator + + connectTag []byte + stationPublicKey [32]byte +} + +const ( + // DefaultFlush uses the flush pattern defined by the chosen prefix + DefaultFlush int32 = iota + // NoAddedFlush no flushes when writing prefix and tag + NoAddedFlush + // FlushAfterPrefix flush after the prefix before the tag (if possible), but not after tag + // before client data is sent over the connection + FlushAfterPrefix +) + +// ClientParams are parameters available to a calling library to configure the Prefix transport +// outside of the specific Prefix +type ClientParams struct { + RandomizeDstPort bool + FlushPolicy int32 + PrefixID int32 +} + +func (c *ClientParams) String() string { + return fmt.Sprintf("RandomizeDstPort: %t, FlushPolicy: %d, Prefix: %d", c.RandomizeDstPort, c.FlushPolicy, c.PrefixID) +} + +func (c *ClientParams) GetParams() any { + return c +} + +// Prefix struct used by, selected by, or given to the client. This interface allows for non-uniform +// behavior like a rand prefix for example. +type Prefix interface { + Bytes() []byte + FlushPolicy() int32 + ID() PrefixID + DstPort([]byte) uint16 +} + +// DefaultPrefixes provides the prefixes supported by default for use when by the client. +var DefaultPrefixes = map[PrefixID]Prefix{} + +// Name returns the human-friendly name of the transport, implementing the Transport interface. +func (t *ClientTransport) Name() string { + if t.Prefix == nil { + return "prefix" + } + return "prefix_" + t.Prefix.ID().Name() +} + +// String returns a string identifier for the Transport for logging (including string formatters) +func (t *ClientTransport) String() string { + return t.Name() +} + +// ID provides an identifier that will be sent to the conjure station during the registration so +// that the station knows what transport to expect connecting to the chosen phantom. +func (*ClientTransport) ID() pb.TransportType { + return pb.TransportType_Prefix +} + +// Prepare lets the transport use the dialer to prepare. This is called before GetParams to let the +// transport prepare stuff such as nat traversal. +func (t *ClientTransport) Prepare(ctx context.Context, dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) error { + t.debug("prepare-b") + defer t.debug("prepare-e") + if t.parameters == nil { + t.parameters = proto.Clone(defaultParams()).(*pb.PrefixTransportParams) + if t.Prefix != nil { + t.parameters.PrefixId = proto.Int32(int32(t.Prefix.ID())) + } else { + t.Prefix = DefaultPrefixes[PrefixID(t.parameters.GetPrefixId())] + } + } + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + + // If the user set random Prefix ID in the immutable params then we need to pick a random prefix + // for the sessions. + if t.sessionParams.GetPrefixId() == int32(Rand) { + newPrefix, err := pickRandomPrefix(rand.Reader) + if err != nil { + return err + } + + t.Prefix = newPrefix + t.sessionParams.PrefixId = proto.Int32(int32(newPrefix.ID())) + } + + return nil +} + +// GetParams returns a generic protobuf with any parameters from both the registration and the +// transport. +func (t *ClientTransport) GetParams() (proto.Message, error) { + if t == nil { + return nil, ErrBadParams + } + + if t.Prefix == nil { + return nil, fmt.Errorf("%w: empty or invalid Prefix provided", ErrBadParams) + } + + if t.sessionParams == nil { + if t.parameters != nil { + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } else { + t.sessionParams = defaultParams() + } + } + return t.sessionParams, nil +} + +// ParseParams gives the specific transport an option to parse a generic object into parameters +// provided by the station in the registration response during registration. +func (t ClientTransport) ParseParams(data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + var m = &pb.PrefixTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + return m, err +} + +// DefaultParams returns the default parameters for the transport +func DefaultParams() *ClientParams { + return &ClientParams{ + RandomizeDstPort: false, + FlushPolicy: DefaultFlush, + PrefixID: int32(Min), + } +} + +// defaultParams returns the internal default parameters for the transport +func defaultParams() *pb.PrefixTransportParams { + return &pb.PrefixTransportParams{ + PrefixId: proto.Int32(int32(Min)), + RandomizeDstPort: proto.Bool(false), + CustomFlushPolicy: proto.Int32(DefaultFlush), + } +} + +// SetSessionParams allows the session to apply updated params that are only used within an +// individual dial, returning an error if the provided generic message is not compatible. the +// variadic bool parameter is used to indicate whether the client should sanity check the params +// or just apply them. This is useful in cases where the registrar may provide options to the +// client that it is able to handle, but are outside of the clients sanity checks. (see prefix +// transport for an example) +func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...bool) error { + t.debug("setsessionparams-b") + defer t.debug("setsessionparams-e") + if incoming == nil { + return nil + } + + p, err := t.ParseParams(incoming) + if err != nil { + return err + } + + var prefixParams *pb.PrefixTransportParams + switch px := p.(type) { + case *pb.GenericTransportParams: + if t.sessionParams == nil { + if t.parameters == nil { + t.sessionParams = proto.Clone(defaultParams()).(*pb.PrefixTransportParams) + } else { + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } + } + t.sessionParams.RandomizeDstPort = proto.Bool(p.(*pb.GenericTransportParams).GetRandomizeDstPort()) + return nil + case *pb.PrefixTransportParams: + // make a copy of params so that we don't modify the original during an active session. + prefixParams = proto.Clone(px).(*pb.PrefixTransportParams) + } + + if prefixParams == nil { + return fmt.Errorf("%w, nil params", ErrBadParams) + } + + if len(unchecked) != 0 && unchecked[0] { + // Overwrite the prefix bytes and type without checking the default set. This is used for + // RegResponse where the registrar may override the chosen prefix with a prefix outside of + // the prefixes that the client known about. + t.sessionParams = prefixParams + t.Prefix = &clientPrefix{ + bytes: prefixParams.GetPrefix(), + id: PrefixID(prefixParams.GetPrefixId()), + flushPolicy: prefixParams.GetCustomFlushPolicy(), + } + + return nil + } + + if prefix, ok := DefaultPrefixes[PrefixID(prefixParams.GetPrefixId())]; ok { + t.Prefix = prefix + t.sessionParams = proto.Clone(prefixParams).(*pb.PrefixTransportParams) + + // clear the prefix if it was set. this is used only when we don't have a known prefix + t.sessionParams.Prefix = []byte{} + return nil + } + + if prefixParams.GetPrefixId() == int32(Rand) { + newPrefix, err := pickRandomPrefix(rand.Reader) + if err != nil { + return err + } + + t.Prefix = newPrefix + + if t.sessionParams == nil { + if t.parameters != nil { + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } else { + t.parameters = proto.Clone(defaultParams()).(*pb.PrefixTransportParams) + } + } + + t.sessionParams.PrefixId = proto.Int32(int32(t.Prefix.ID())) + t.sessionParams.RandomizeDstPort = proto.Bool(prefixParams.GetRandomizeDstPort()) + + return nil + } + + return ErrUnknownPrefix +} + +// SetParams allows the caller to set parameters associated with the transport, returning an +// error if the provided generic message is not compatible or the parameters are otherwise invalid +func (t *ClientTransport) SetParams(p any) error { + t.debug("setparams-b") + defer t.debug("setparams-e") + if genericParams, ok := p.(*pb.GenericTransportParams); ok { + // If the parameters are nil, set them to the default otherwise leave them alone so that + // this can be used to override the RandomizeDstPort parameter for phantoms that do not + // support it. HOWEVER, THAT WILL PERSIST if the Params are re-used. + if t.parameters == nil { + t.parameters = defaultParams() + } + t.parameters.RandomizeDstPort = proto.Bool(genericParams.GetRandomizeDstPort()) + return nil + } + + var prefixParams *pb.PrefixTransportParams + if clientParams, ok := p.(*pb.PrefixTransportParams); ok { + // make a copy of params so that we don't modify the original during an active session. + prefixParams = proto.Clone(clientParams).(*pb.PrefixTransportParams) + } else if clientParams, ok := p.(*ClientParams); ok { + prefixParams = &pb.PrefixTransportParams{ + PrefixId: proto.Int32(clientParams.PrefixID), + CustomFlushPolicy: proto.Int32(clientParams.FlushPolicy), + RandomizeDstPort: proto.Bool(clientParams.RandomizeDstPort), + } + } else if clientParams, ok := p.(ClientParams); ok { + prefixParams = &pb.PrefixTransportParams{ + PrefixId: proto.Int32(clientParams.PrefixID), + CustomFlushPolicy: proto.Int32(clientParams.FlushPolicy), + RandomizeDstPort: proto.Bool(clientParams.RandomizeDstPort), + } + } else if p == nil { + prefixParams = defaultParams() + if t.Prefix != nil { + prefixParams.PrefixId = proto.Int32(int32(t.Prefix.ID())) + } else { + t.Prefix = DefaultPrefixes[PrefixID(t.parameters.GetPrefixId())] + } + } else { + return fmt.Errorf("%w, incorrect param type", ErrBadParams) + } + + if prefixParams == nil { + return fmt.Errorf("%w, nil params", ErrBadParams) + } + + // Parameters set by user SetParams must either be random or known Prefix ID. + if prefix, ok := DefaultPrefixes[PrefixID(prefixParams.GetPrefixId())]; ok { + t.Prefix = prefix + t.parameters = prefixParams + + // clear the prefix if it was set. this is used for RegResponse only. + t.parameters.Prefix = []byte{} + return nil + } else if prefixParams.GetPrefixId() == int32(Rand) { + + newPrefix, err := pickRandomPrefix(rand.Reader) + if err != nil { + return err + } + + t.Prefix = newPrefix + t.parameters = prefixParams + // t.parameters.PrefixId = proto.Int32(int32(Rand)) + return nil + } + + return ErrUnknownPrefix +} + +// GetDstPort returns the destination port that the client should open the phantom connection to +func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { + t.debug("getdstport-b") + defer t.debug("getdstport-e") + + if t == nil { + return 0, ErrBadParams + } + + if t.Prefix == nil { + return 0, fmt.Errorf("%w: empty or invalid Prefix provided", ErrBadParams) + } + + prefixID := t.Prefix.ID() + + if prefixID == Rand { + return 0, fmt.Errorf("%w: use SetParams or FromID if using Rand prefix", ErrUnknownPrefix) + } + + if t.sessionParams == nil { + p := int32(prefixID) + t.sessionParams = &pb.PrefixTransportParams{PrefixId: &p} + } + + if t.sessionParams.GetRandomizeDstPort() { + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) + } + + return t.Prefix.DstPort(seed), nil +} + +// PrepareKeys provides an opportunity for the transport to integrate the station public key +// as well as bytes from the deterministic random generator associated with the registration +// that this ClientTransport is attached to. +func (t *ClientTransport) PrepareKeys(pubkey [32]byte, sharedSecret []byte, hkdf io.Reader) error { + t.connectTag = core.ConjureHMAC(sharedSecret, "PrefixTransportHMACString") + t.stationPublicKey = pubkey + return nil +} + +// WrapConn gives the transport the opportunity to perform a handshake and wrap / transform the +// incoming and outgoing bytes send by the implementing client. +func (t *ClientTransport) WrapConn(conn net.Conn) (net.Conn, error) { + if t.Prefix == nil { + return nil, ErrBadParams + } + + if t.TagObfuscator == nil { + t.TagObfuscator = transports.CTRObfuscator{} + } + + if t.sessionParams == nil { + if t.parameters == nil { + t.sessionParams = defaultParams() + } + t.sessionParams = proto.Clone(t.parameters).(*pb.PrefixTransportParams) + } + + obfuscatedID, err := t.TagObfuscator.Obfuscate(t.connectTag, t.stationPublicKey[:]) + if err != nil { + return nil, err + } + + w := bufio.NewWriter(conn) + + var msg []byte = t.Prefix.Bytes() + + if _, err := w.Write(msg); err != nil { + return nil, err + } + + // Maybe flush based on prefix spec and client param override + switch t.sessionParams.GetCustomFlushPolicy() { + case NoAddedFlush: + break + case FlushAfterPrefix: + w.Flush() + case DefaultFlush: + fallthrough + default: + switch t.Prefix.FlushPolicy() { + case NoAddedFlush: + break + case FlushAfterPrefix: + w.Flush() + case DefaultFlush: + fallthrough + default: + } + } + + n, err := w.Write(obfuscatedID) + if err != nil { + return nil, err + } else if n != len(obfuscatedID) { + return nil, fmt.Errorf("failed to write all bytes of obfuscated ID") + } + + // We are **REQUIRED** to flush here otherwise the prefix and tag will not be written into + // the wrapped net.Conn So FlushAfterTag does not make much sense. + w.Flush() + return conn, nil +} + +// --- + +type clientPrefix struct { + bytes []byte + id PrefixID + port uint16 + flushPolicy int32 + + // // Function allowing encoding / transformation of obfuscated ID bytes after they have been + // // obfuscated. Examples - base64 encode, padding + // [FUTURE WORK] + // tagEncode() func([]byte) ([]byte, int, error) + + // // Function allowing encoding / transformation of stream bytes after they have been. Examples + // // - base64 encode, padding + // [FUTURE WORK] + // streamEncode() func([]byte) ([]byte, int, error) +} + +func (c *clientPrefix) Bytes() []byte { + return c.bytes +} + +func (c *clientPrefix) ID() PrefixID { + return c.id +} + +func (c *clientPrefix) DstPort([]byte) uint16 { + return c.port +} + +func (c *clientPrefix) FlushPolicy() int32 { + return c.flushPolicy +} + +// --- + +// TryFromID returns a Prefix based on the Prefix ID. This is useful for non-static prefixes like the +// random prefix +func TryFromID(id PrefixID) (Prefix, error) { + + if len(DefaultPrefixes) == 0 || id < Rand || int(id) > len(DefaultPrefixes) { + return nil, ErrUnknownPrefix + } + + if id == Rand { + return pickRandomPrefix(rand.Reader) + } + + return DefaultPrefixes[id], nil +} + +func pickRandomPrefix(r io.Reader) (Prefix, error) { + var n = big.NewInt(int64(len(DefaultPrefixes))) + i, err := rand.Int(r, n) + if err != nil { + return nil, err + } + + return DefaultPrefixes[PrefixID(i.Int64())], nil +} + +func (t *ClientTransport) debug(s string) { + if false { + fmt.Printf("%s - %+v\n\t%+v\n\t%+v\n", s, t.Prefix, t.parameters, t.sessionParams) + } +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/prefix.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/prefix.go new file mode 100644 index 000000000..414153d5f --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/prefix.go @@ -0,0 +1,454 @@ +package prefix + +import ( + "bytes" + "errors" + "fmt" + "net" + + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/transports" + pb "github.com/refraction-networking/conjure/proto" + "google.golang.org/protobuf/types/known/anypb" +) + +const ( + // Earliest client library version ID that supports destination port randomization + randomizeDstPortMinVersion uint = 3 + + // port range boundaries for prefix transport when randomizing + portRangeMin = 1024 + portRangeMax = 65535 +) + +const minTagLength = 64 + +// const minTagLengthBase64 = 88 + +// prefix provides the elements required for independent prefixes to be usable as part of the +// transport used by the server specifically. +type prefix struct { + // // Regular expression to match + // *regexp.Regexp + + // // Function allowing decode / transformation of obfuscated ID bytes before attempting to + // // de-obfuscate them. Example - base64 decode. + // // [FUTURE WORK] + // tagDecode func([]byte) ([]byte, int, error) + + // // Function allowing decode / transformation stream bytes before attempting to forward them. + // // Example - base64 decode. + // // [FUTURE WORK] + // streamDecode func([]byte) ([]byte, int, error) + + // Static string to match to rule out protocols without using a regex. + StaticMatch []byte + + // Offset in a byte array where we expect the identifier to start. + Offset int + + // Minimum length to guarantee we have received the whole identifier + // (i.e. return ErrTryAgain) + MinLen int + + // Maximum length after which we can rule out prefix if we have not found a known identifier + // (i.e. return ErrNotTransport) + MaxLen int + + // Minimum client library version that supports this prefix + MinVer uint + + // Default DST Port for this prefix. We are not bound by client_lib_version (yet) so we can set the + // default destination port for each prefix individually + DefaultDstPort uint16 + + // Flush Indicates whether the client is expected to flush the write buffer after the prefix + // before writing the tag. This would allow the whole first packet to be a prefix (with no tag). + Flush int32 +} + +// PrefixID provide an integer Identifier for each individual prefixes allowing clients to indicate +// to the station the prefix they intend to connect with. +type PrefixID int + +const ( + Rand PrefixID = -1 + iota + Min + GetLong + PostLong + HTTPResp + TLSClientHello + TLSServerHello + TLSAlertWarning + TLSAlertFatal + DNSOverTCP + OpenSSH2 + + // GetShortBase64 +) + +var ( + // ErrUnknownPrefix indicates that the provided Prefix ID is unknown to the transport object. + ErrUnknownPrefix = errors.New("unknown / unsupported prefix") + + // ErrBadParams indicates that the parameters provided to a call on the server side do not make + // sense in the context that they are provided and the registration will be ignored. + ErrBadParams = errors.New("bad parameters provided") + + // ErrIncorrectPrefix indicates that tryFindRegistration found a valid registration based on + // the obfuscated tag, however the prefix that it matched was not the prefix indicated in the + // registration. + ErrIncorrectPrefix = errors.New("found connection for unexpected prefix") + + // ErrIncorrectTransport indicates that tryFindRegistration found a valid registration based on + // the obfuscated tag, however the prefix that it matched was not the prefix indicated in the + // registration. + ErrIncorrectTransport = errors.New("found registration w/ incorrect transport type") +) + +// Name returns the human-friendly name of the prefix. +func (id PrefixID) Name() string { + switch id { + case Min: + return "Min" + case GetLong: + return "GetLong" + case PostLong: + return "PostLong" + case HTTPResp: + return "HTTPResp" + case TLSClientHello: + return "TLSClientHello" + case TLSServerHello: + return "TLSServerHello" + case TLSAlertWarning: + return "TLSAlertWarning" + case TLSAlertFatal: + return "TLSAlertFatal" + case DNSOverTCP: + return "DNSOverTCP" + case OpenSSH2: + return "OpenSSH2" + + // case GetShort: + // return "GetShort" + default: + return "other" + } +} + +// defaultPrefixes provides the prefixes supported by default for use when +// initializing the prefix transport. +var defaultPrefixes = map[PrefixID]prefix{ + //Min - Empty prefix + Min: {[]byte{}, 0, minTagLength, minTagLength, randomizeDstPortMinVersion, 443, NoAddedFlush}, + // HTTP GET + GetLong: {[]byte("GET / HTTP/1.1\r\n"), 16, 16 + minTagLength, 16 + minTagLength, randomizeDstPortMinVersion, 80, NoAddedFlush}, + // HTTP POST + PostLong: {[]byte("POST / HTTP/1.1\r\n"), 17, 17 + minTagLength, 17 + minTagLength, randomizeDstPortMinVersion, 80, NoAddedFlush}, + // HTTP Response + HTTPResp: {[]byte("HTTP/1.1 200\r\n"), 14, 14 + minTagLength, 14 + minTagLength, randomizeDstPortMinVersion, 80, NoAddedFlush}, + // TLS Client Hello + TLSClientHello: {[]byte("\x16\x03\x03\x40\x00\x01"), 6, 6 + minTagLength, 6 + minTagLength, randomizeDstPortMinVersion, 443, NoAddedFlush}, + // TLS Server Hello + TLSServerHello: {[]byte("\x16\x03\x03\x40\x00\x02\r\n"), 8, 8 + minTagLength, 8 + minTagLength, randomizeDstPortMinVersion, 443, NoAddedFlush}, + // TLS Alert Warning + TLSAlertWarning: {[]byte("\x15\x03\x01\x00\x02"), 5, 5 + minTagLength, 5 + minTagLength, randomizeDstPortMinVersion, 443, NoAddedFlush}, + // TLS Alert Fatal + TLSAlertFatal: {[]byte("\x15\x03\x02\x00\x02"), 5, 5 + minTagLength, 5 + minTagLength, randomizeDstPortMinVersion, 443, NoAddedFlush}, + // DNS over TCP + DNSOverTCP: {[]byte("\x05\xDC\x5F\xE0\x01\x20"), 6, 6 + minTagLength, 6 + minTagLength, randomizeDstPortMinVersion, 53, NoAddedFlush}, + // SSH-2.0-OpenSSH_8.9p1 + OpenSSH2: {[]byte("SSH-2.0-OpenSSH_8.9p1"), 21, 21 + minTagLength, 21 + minTagLength, randomizeDstPortMinVersion, 22, NoAddedFlush}, + + // // HTTP GET base64 in url min tag length 88 because 64 bytes base64 encoded should be length 88 + // GetShort: {base64TagDecode, []byte("GET /"), 5, 5 + 88, 5 + 88, randomizeDstPortMinVersion}, +} + +// Transport provides a struct implementing the Transport, WrappingTransport, +// PortRandomizingTransport, and FixedPortTransport interfaces. +type Transport struct { + SupportedPrefixes map[PrefixID]prefix + TagObfuscator transports.Obfuscator + Privkey [32]byte +} + +// Name returns the human-friendly name of the transport, implementing the +// Transport interface.. +func (Transport) Name() string { return "PrefixTransport" } + +// LogPrefix returns the prefix used when including this transport in logs, +// implementing the Transport interface. +func (Transport) LogPrefix() string { return "PREF" } + +// GetIdentifier takes in a registration and returns an identifier for it. This +// identifier should be unique for each registration on a given phantom; +// registrations on different phantoms can have the same identifier. +func (Transport) GetIdentifier(d transports.Registration) string { + return string(core.ConjureHMAC(d.SharedSecret(), "PrefixTransportHMACString")) +} + +// GetProto returns the next layer protocol that the transport uses. Implements +// the Transport interface. +func (Transport) GetProto() pb.IPProto { + return pb.IPProto_Tcp +} + +// ParseParams gives the specific transport an option to parse a generic object into parameters +// provided by the client during registration. This Transport was written after RandomizeDstPort was +// added, so it should not be usable by clients who don't support destination port randomization. +func (t Transport) ParseParams(libVersion uint, data *anypb.Any) (any, error) { + if data == nil { + return nil, nil + } + + if libVersion < randomizeDstPortMinVersion { + return nil, fmt.Errorf("client couldn't support this transport") + } + + var m = &pb.PrefixTransportParams{} + err := transports.UnmarshalAnypbTo(data, m) + + // Check if this is a prefix that we know how to parse, if not, drop the registration because + // we will be unable to pick up. + if _, ok := t.SupportedPrefixes[PrefixID(m.GetPrefixId())]; !ok { + return nil, fmt.Errorf("%w: %d", ErrUnknownPrefix, m.GetPrefixId()) + } + + return m, err +} + +// ParamStrings returns an array of tag string that will be added to tunStats when a proxy session +// is closed. +func (t Transport) ParamStrings(p any) []string { + params, ok := p.(*pb.PrefixTransportParams) + if !ok { + return nil + } + + out := []string{PrefixID(params.GetPrefixId()).Name()} + + return out +} + +// GetDstPort Given the library version, a seed, and a generic object +// containing parameters the transport should be able to return the +// destination port that a clients phantom connection will attempt to reach +func (t Transport) GetDstPort(libVersion uint, seed []byte, params any) (uint16, error) { + + if libVersion < randomizeDstPortMinVersion { + return 0, fmt.Errorf("client couldn't support this transport") + } + parameters, ok := params.(*pb.PrefixTransportParams) + if !ok { + return 0, fmt.Errorf("%w: incorrect type", ErrBadParams) + } + + if parameters == nil { + return 0, fmt.Errorf("%w: nil params", ErrBadParams) + } + + prefix := parameters.GetPrefixId() + p, ok := t.SupportedPrefixes[PrefixID(prefix)] + if !ok { + return 0, ErrUnknownPrefix + } + + if parameters.GetRandomizeDstPort() { + return transports.PortSelectorRange(portRangeMin, portRangeMax, seed) + } + + return p.DefaultDstPort, nil +} + +// WrapConnection attempts to wrap the given connection in the transport. It +// takes the information gathered so far on the connection in data, attempts to +// identify itself, and if it positively identifies itself wraps the connection +// in the transport, returning a connection that's ready to be used by others. +// +// If the returned error is nil or non-nil and non-{ transports.ErrTryAgain, +// transports.ErrNotTransport }, the caller may no longer use data or conn. +func (t Transport) WrapConnection(data *bytes.Buffer, c net.Conn, originalDst net.IP, regManager transports.RegManager) (transports.Registration, net.Conn, error) { + if data.Len() < minTagLength { + return nil, nil, transports.ErrTryAgain + } + + reg, err := t.tryFindReg(data, originalDst, regManager) + if err != nil { + return nil, nil, err + } + + return reg, transports.PrependToConn(c, data), nil +} + +func (t Transport) tryFindReg(data *bytes.Buffer, originalDst net.IP, regManager transports.RegManager) (transports.Registration, error) { + if data.Len() == 0 { + return nil, transports.ErrTryAgain + } + + var eWrongPrefix error = nil + err := transports.ErrNotTransport + for id, prefix := range t.SupportedPrefixes { + if len(prefix.StaticMatch) > 0 { + matchLen := min(len(prefix.StaticMatch), data.Len()) + if !bytes.Equal(prefix.StaticMatch[:matchLen], data.Bytes()[:matchLen]) { + continue + } + } + + if data.Len() < prefix.MinLen { + // the data we have received matched at least one static prefix, but was not long + // enough to extract the tag - go back and read more, continue checking if any + // of the other prefixes match. If not we want to indicate to read more, not + // give up because we may receive the rest of the match. + err = transports.ErrTryAgain + continue + } + + if data.Len() < prefix.Offset+minTagLength && data.Len() < prefix.MaxLen { + err = transports.ErrTryAgain + continue + } else if data.Len() < prefix.MaxLen { + continue + } + + var obfuscatedID []byte + var forwardBy = minTagLength + // var errN error + // if prefix.fn != nil { + // obfuscatedID, forwardBy, errN = prefix.tagDecode(data.Bytes()[prefix.Offset:]) + // if errN != nil || len(obfuscatedID) != minTagLength { + // continue + // } + // } else { + obfuscatedID = data.Bytes()[prefix.Offset : prefix.Offset+minTagLength] + // } + + hmacID, err := t.TagObfuscator.TryReveal(obfuscatedID, t.Privkey) + if err != nil || hmacID == nil { + continue + } + + reg, ok := regManager.GetRegistrations(originalDst)[string(hmacID)] + if !ok { + continue + } + + if reg.TransportType() != pb.TransportType_Prefix { + return nil, ErrIncorrectTransport + } else if params, ok := reg.TransportParams().(*pb.PrefixTransportParams); ok { + if params == nil || params.GetPrefixId() != int32(id) { + // If the registration we found has no params specified (invalid and shouldn't have + // been ingested) or if the prefix ID does not match the expected prefix, set the + // err to return if we can't match any other prefixes. + eWrongPrefix = fmt.Errorf("%w: e %d != %d", ErrIncorrectPrefix, params.GetPrefixId(), id) + continue + } + } + + // We don't want to forward the prefix or Tag bytes, but if any message + // remains we do want to forward it. + data.Next(prefix.Offset + forwardBy) + + return reg, nil + } + + if errors.Is(err, transports.ErrNotTransport) && errors.Is(eWrongPrefix, ErrIncorrectPrefix) { + // If we found a match and it was the only one that matched (i.e. none of the other prefixes + // could possibly match even if we read more bytes). Then something went wrong and the + // client is attempting to connect with the wrong prefix. + return nil, ErrIncorrectPrefix + } + + return nil, err +} + +// New Given a private key this builds the server side transport with an EMPTY set of supported +// prefixes. The optional filepath specifies a file from which to read extra prefixes. If provided +// only the first variadic string will be used to attempt to parse prefixes. There can be no +// colliding PrefixIDs - within the file first defined takes precedence. +func New(privkey [32]byte, filepath ...string) (*Transport, error) { + var prefixes map[PrefixID]prefix = make(map[PrefixID]prefix) + var err error + if len(filepath) > 0 && filepath[0] != "" { + prefixes, err = tryParsePrefixes(filepath[0]) + if err != nil { + return nil, err + } + } + return &Transport{ + Privkey: privkey, + SupportedPrefixes: prefixes, + TagObfuscator: transports.CTRObfuscator{}, + }, nil +} + +// Default Given a private key this builds the server side transport with the DEFAULT set of supported +// prefixes. The optional filepath specifies a file from which to read extra prefixes. +// If provided only the first variadic string will be used to attempt to parse prefixes. There can +// be no colliding PrefixIDs - file defined prefixes take precedent over defaults, and within the +// file first defined takes precedence. +func Default(privkey [32]byte, filepath ...string) (*Transport, error) { + t, err := New(privkey, filepath...) + if err != nil { + return nil, err + } + + for k, v := range defaultPrefixes { + if _, ok := t.SupportedPrefixes[k]; !ok { + t.SupportedPrefixes[k] = v + } + } + return t, nil +} + +// DefaultSet builds a hollow version of the transport with the DEFAULT set of supported +// prefixes. This is useful in instances where we just need to check whether the prefix ID is known, +// not actually handle any major operations (tryFindReg / WrapConn) +func DefaultSet() *Transport { + var prefixes map[PrefixID]prefix = make(map[PrefixID]prefix) + for k, v := range defaultPrefixes { + if _, ok := prefixes[k]; !ok { + prefixes[k] = v + } + } + return &Transport{ + SupportedPrefixes: prefixes, + } +} + +func tryParsePrefixes(filepath string) (map[PrefixID]prefix, error) { + return nil, nil +} + +func applyDefaultPrefixes() { + // if at any point we need to do init on the prefixes (i.e compiling regular expressions) it + // should happen here. + for ID, p := range defaultPrefixes { + DefaultPrefixes[ID] = &clientPrefix{p.StaticMatch, ID, p.DefaultDstPort, p.Flush} + } +} + +func init() { + applyDefaultPrefixes() +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +// func base64TagDecode(encoded []byte) ([]byte, int, error) { +// if len(encoded) < minTagLengthBase64 { +// return nil, 0, fmt.Errorf("not enough to decode") +// } +// buf := make([]byte, minTagLengthBase64) +// n, err := base64.StdEncoding.Decode(buf, encoded[:minTagLengthBase64]) +// if err != nil { +// return nil, 0, err +// } + +// return buf[:n], minTagLengthBase64, nil +// } diff --git a/vendor/github.com/refraction-networking/conjure/proto/Makefile b/vendor/github.com/refraction-networking/conjure/proto/Makefile new file mode 100644 index 000000000..9a24fd375 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/proto/Makefile @@ -0,0 +1,24 @@ +# Makefile for generating the language-specific protobuf modules + +PROTOC = protoc + +SRC = signalling.proto + +GO_OUT = signalling.pb.go +RUST_OUT = signalling.rs +PYTHON_OUT = signalling_pb2.py +RUST_OUT_PATH = ../src/$(RUST_OUT) + +default: $(RUST_OUT_PATH) $(GO_OUT) + +$(GO_OUT): $(SRC) + $(PROTOC) $(SRC) --go_out . --go_opt=M"signalling.proto=./;proto" signalling.proto + +$(RUST_OUT_PATH): $(SRC) + $(PROTOC) $(SRC) --rust_out . && cp $(RUST_OUT) $(RUST_OUT_PATH) + +$(PYTHON_OUT): $(SRC) + $(PROTOC) -I . --python_out=. $(SRC) + +clean: + rm -f $(GO_OUT) $(RUST_OUT) $(RUST_OUT_PATH) $(PYTHON_OUT) diff --git a/vendor/github.com/refraction-networking/conjure/proto/README.txt b/vendor/github.com/refraction-networking/conjure/proto/README.txt new file mode 100644 index 000000000..132f5e43d --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/proto/README.txt @@ -0,0 +1,23 @@ + +protobuf specification for the messages from the station to the client +that tell the client which decoys to try to use, and the parameters +for those decoys. + +The protobufs do not entirely describe the client<==>station protocol: these +protobufs are nested within a very primitive protocol. This outer protocol is +identical for both client=>station and station=>client. It consists of a +sequence of messages, each of which can be one of two types: raw app data (what +used to be MSG_DATA) or protobuf (StationToClient or ClientToStation, as +appropriate). There is no setup/teardown, just the messages. + +The outer protocol is: +Each message is a 16-bit net-order int "TL" (type+len), followed by a data blob. +If TL is negative, the blob is pure app data, with length abs(TL). +If TL is positive, the blob is a protobuf, with length TL. +If TL is 0, then read the following 4 bytes. Those 4 bytes are a net-order u32. + This u32 is the length of the blob, which begins after this u32. + The blob is a protobuf. + +We need this outer protocol because protobufs don't delimit themselves. This +outer protocol should never, ever change, given the flexibility of protobufs. +That's why we're willing to do funky stuff to optimize to the last bit. diff --git a/vendor/github.com/refraction-networking/gotapdance/protobuf/extensions.go b/vendor/github.com/refraction-networking/conjure/proto/extensions.go similarity index 98% rename from vendor/github.com/refraction-networking/gotapdance/protobuf/extensions.go rename to vendor/github.com/refraction-networking/conjure/proto/extensions.go index 1c708af65..331e4421d 100644 --- a/vendor/github.com/refraction-networking/gotapdance/protobuf/extensions.go +++ b/vendor/github.com/refraction-networking/conjure/proto/extensions.go @@ -1,4 +1,4 @@ -package tdproto +package proto // Package tdproto, in addition to generated functions, has some manual extensions. diff --git a/vendor/github.com/refraction-networking/conjure/proto/mod.rs b/vendor/github.com/refraction-networking/conjure/proto/mod.rs new file mode 100644 index 000000000..1680ba76e --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/proto/mod.rs @@ -0,0 +1,3 @@ +// @generated + +pub mod signalling; diff --git a/vendor/github.com/refraction-networking/conjure/proto/signalling.pb.go b/vendor/github.com/refraction-networking/conjure/proto/signalling.pb.go new file mode 100644 index 000000000..95441d053 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/proto/signalling.pb.go @@ -0,0 +1,3162 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v4.24.2 +// source: signalling.proto + +// TODO: We're using proto2 because it's the default on Ubuntu 16.04. +// At some point we will want to migrate to proto3, but we are not +// using any proto3 features yet. + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type KeyType int32 + +const ( + KeyType_AES_GCM_128 KeyType = 90 + KeyType_AES_GCM_256 KeyType = 91 // not supported atm +) + +// Enum value maps for KeyType. +var ( + KeyType_name = map[int32]string{ + 90: "AES_GCM_128", + 91: "AES_GCM_256", + } + KeyType_value = map[string]int32{ + "AES_GCM_128": 90, + "AES_GCM_256": 91, + } +) + +func (x KeyType) Enum() *KeyType { + p := new(KeyType) + *p = x + return p +} + +func (x KeyType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (KeyType) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[0].Descriptor() +} + +func (KeyType) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[0] +} + +func (x KeyType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *KeyType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = KeyType(num) + return nil +} + +// Deprecated: Use KeyType.Descriptor instead. +func (KeyType) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{0} +} + +type DnsRegMethod int32 + +const ( + DnsRegMethod_UDP DnsRegMethod = 1 + DnsRegMethod_DOT DnsRegMethod = 2 + DnsRegMethod_DOH DnsRegMethod = 3 +) + +// Enum value maps for DnsRegMethod. +var ( + DnsRegMethod_name = map[int32]string{ + 1: "UDP", + 2: "DOT", + 3: "DOH", + } + DnsRegMethod_value = map[string]int32{ + "UDP": 1, + "DOT": 2, + "DOH": 3, + } +) + +func (x DnsRegMethod) Enum() *DnsRegMethod { + p := new(DnsRegMethod) + *p = x + return p +} + +func (x DnsRegMethod) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DnsRegMethod) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[1].Descriptor() +} + +func (DnsRegMethod) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[1] +} + +func (x DnsRegMethod) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *DnsRegMethod) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = DnsRegMethod(num) + return nil +} + +// Deprecated: Use DnsRegMethod.Descriptor instead. +func (DnsRegMethod) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{1} +} + +// State transitions of the client +type C2S_Transition int32 + +const ( + C2S_Transition_C2S_NO_CHANGE C2S_Transition = 0 + C2S_Transition_C2S_SESSION_INIT C2S_Transition = 1 // connect me to squid + C2S_Transition_C2S_SESSION_COVERT_INIT C2S_Transition = 11 // connect me to provided covert + C2S_Transition_C2S_EXPECT_RECONNECT C2S_Transition = 2 + C2S_Transition_C2S_SESSION_CLOSE C2S_Transition = 3 + C2S_Transition_C2S_YIELD_UPLOAD C2S_Transition = 4 + C2S_Transition_C2S_ACQUIRE_UPLOAD C2S_Transition = 5 + C2S_Transition_C2S_EXPECT_UPLOADONLY_RECONN C2S_Transition = 6 + C2S_Transition_C2S_ERROR C2S_Transition = 255 +) + +// Enum value maps for C2S_Transition. +var ( + C2S_Transition_name = map[int32]string{ + 0: "C2S_NO_CHANGE", + 1: "C2S_SESSION_INIT", + 11: "C2S_SESSION_COVERT_INIT", + 2: "C2S_EXPECT_RECONNECT", + 3: "C2S_SESSION_CLOSE", + 4: "C2S_YIELD_UPLOAD", + 5: "C2S_ACQUIRE_UPLOAD", + 6: "C2S_EXPECT_UPLOADONLY_RECONN", + 255: "C2S_ERROR", + } + C2S_Transition_value = map[string]int32{ + "C2S_NO_CHANGE": 0, + "C2S_SESSION_INIT": 1, + "C2S_SESSION_COVERT_INIT": 11, + "C2S_EXPECT_RECONNECT": 2, + "C2S_SESSION_CLOSE": 3, + "C2S_YIELD_UPLOAD": 4, + "C2S_ACQUIRE_UPLOAD": 5, + "C2S_EXPECT_UPLOADONLY_RECONN": 6, + "C2S_ERROR": 255, + } +) + +func (x C2S_Transition) Enum() *C2S_Transition { + p := new(C2S_Transition) + *p = x + return p +} + +func (x C2S_Transition) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (C2S_Transition) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[2].Descriptor() +} + +func (C2S_Transition) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[2] +} + +func (x C2S_Transition) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *C2S_Transition) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = C2S_Transition(num) + return nil +} + +// Deprecated: Use C2S_Transition.Descriptor instead. +func (C2S_Transition) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{2} +} + +// State transitions of the server +type S2C_Transition int32 + +const ( + S2C_Transition_S2C_NO_CHANGE S2C_Transition = 0 + S2C_Transition_S2C_SESSION_INIT S2C_Transition = 1 // connected to squid + S2C_Transition_S2C_SESSION_COVERT_INIT S2C_Transition = 11 // connected to covert host + S2C_Transition_S2C_CONFIRM_RECONNECT S2C_Transition = 2 + S2C_Transition_S2C_SESSION_CLOSE S2C_Transition = 3 + // TODO should probably also allow EXPECT_RECONNECT here, for DittoTap + S2C_Transition_S2C_ERROR S2C_Transition = 255 +) + +// Enum value maps for S2C_Transition. +var ( + S2C_Transition_name = map[int32]string{ + 0: "S2C_NO_CHANGE", + 1: "S2C_SESSION_INIT", + 11: "S2C_SESSION_COVERT_INIT", + 2: "S2C_CONFIRM_RECONNECT", + 3: "S2C_SESSION_CLOSE", + 255: "S2C_ERROR", + } + S2C_Transition_value = map[string]int32{ + "S2C_NO_CHANGE": 0, + "S2C_SESSION_INIT": 1, + "S2C_SESSION_COVERT_INIT": 11, + "S2C_CONFIRM_RECONNECT": 2, + "S2C_SESSION_CLOSE": 3, + "S2C_ERROR": 255, + } +) + +func (x S2C_Transition) Enum() *S2C_Transition { + p := new(S2C_Transition) + *p = x + return p +} + +func (x S2C_Transition) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (S2C_Transition) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[3].Descriptor() +} + +func (S2C_Transition) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[3] +} + +func (x S2C_Transition) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *S2C_Transition) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = S2C_Transition(num) + return nil +} + +// Deprecated: Use S2C_Transition.Descriptor instead. +func (S2C_Transition) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{3} +} + +// Should accompany all S2C_ERROR messages. +type ErrorReasonS2C int32 + +const ( + ErrorReasonS2C_NO_ERROR ErrorReasonS2C = 0 + ErrorReasonS2C_COVERT_STREAM ErrorReasonS2C = 1 // Squid TCP connection broke + ErrorReasonS2C_CLIENT_REPORTED ErrorReasonS2C = 2 // You told me something was wrong, client + ErrorReasonS2C_CLIENT_PROTOCOL ErrorReasonS2C = 3 // You messed up, client (e.g. sent a bad protobuf) + ErrorReasonS2C_STATION_INTERNAL ErrorReasonS2C = 4 // I broke + ErrorReasonS2C_DECOY_OVERLOAD ErrorReasonS2C = 5 // Everything's fine, but don't use this decoy right now + ErrorReasonS2C_CLIENT_STREAM ErrorReasonS2C = 100 // My stream to you broke. (This is impossible to send) + ErrorReasonS2C_CLIENT_TIMEOUT ErrorReasonS2C = 101 // You never came back. (This is impossible to send) +) + +// Enum value maps for ErrorReasonS2C. +var ( + ErrorReasonS2C_name = map[int32]string{ + 0: "NO_ERROR", + 1: "COVERT_STREAM", + 2: "CLIENT_REPORTED", + 3: "CLIENT_PROTOCOL", + 4: "STATION_INTERNAL", + 5: "DECOY_OVERLOAD", + 100: "CLIENT_STREAM", + 101: "CLIENT_TIMEOUT", + } + ErrorReasonS2C_value = map[string]int32{ + "NO_ERROR": 0, + "COVERT_STREAM": 1, + "CLIENT_REPORTED": 2, + "CLIENT_PROTOCOL": 3, + "STATION_INTERNAL": 4, + "DECOY_OVERLOAD": 5, + "CLIENT_STREAM": 100, + "CLIENT_TIMEOUT": 101, + } +) + +func (x ErrorReasonS2C) Enum() *ErrorReasonS2C { + p := new(ErrorReasonS2C) + *p = x + return p +} + +func (x ErrorReasonS2C) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ErrorReasonS2C) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[4].Descriptor() +} + +func (ErrorReasonS2C) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[4] +} + +func (x ErrorReasonS2C) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ErrorReasonS2C) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ErrorReasonS2C(num) + return nil +} + +// Deprecated: Use ErrorReasonS2C.Descriptor instead. +func (ErrorReasonS2C) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{4} +} + +type TransportType int32 + +const ( + TransportType_Null TransportType = 0 + TransportType_Min TransportType = 1 // Send a 32-byte HMAC id to let the station distinguish registrations to same host + TransportType_Obfs4 TransportType = 2 + TransportType_DTLS TransportType = 3 // UDP transport: DTLS + TransportType_Prefix TransportType = 4 // dynamic prefix transport (and updated Min) + TransportType_uTLS TransportType = 5 // uTLS based transport + TransportType_Format TransportType = 6 // Formatting transport - format first, format all + TransportType_WASM TransportType = 7 // WebAssembly + TransportType_FTE TransportType = 8 // Format transforming encryption + TransportType_Quic TransportType = 9 // quic transport? + TransportType_Webrtc TransportType = 99 // UDP transport: WebRTC DataChannel +) + +// Enum value maps for TransportType. +var ( + TransportType_name = map[int32]string{ + 0: "Null", + 1: "Min", + 2: "Obfs4", + 3: "DTLS", + 4: "Prefix", + 5: "uTLS", + 6: "Format", + 7: "WASM", + 8: "FTE", + 9: "Quic", + 99: "Webrtc", + } + TransportType_value = map[string]int32{ + "Null": 0, + "Min": 1, + "Obfs4": 2, + "DTLS": 3, + "Prefix": 4, + "uTLS": 5, + "Format": 6, + "WASM": 7, + "FTE": 8, + "Quic": 9, + "Webrtc": 99, + } +) + +func (x TransportType) Enum() *TransportType { + p := new(TransportType) + *p = x + return p +} + +func (x TransportType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TransportType) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[5].Descriptor() +} + +func (TransportType) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[5] +} + +func (x TransportType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *TransportType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = TransportType(num) + return nil +} + +// Deprecated: Use TransportType.Descriptor instead. +func (TransportType) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{5} +} + +type RegistrationSource int32 + +const ( + RegistrationSource_Unspecified RegistrationSource = 0 + RegistrationSource_Detector RegistrationSource = 1 + RegistrationSource_API RegistrationSource = 2 + RegistrationSource_DetectorPrescan RegistrationSource = 3 + RegistrationSource_BidirectionalAPI RegistrationSource = 4 + RegistrationSource_DNS RegistrationSource = 5 + RegistrationSource_BidirectionalDNS RegistrationSource = 6 +) + +// Enum value maps for RegistrationSource. +var ( + RegistrationSource_name = map[int32]string{ + 0: "Unspecified", + 1: "Detector", + 2: "API", + 3: "DetectorPrescan", + 4: "BidirectionalAPI", + 5: "DNS", + 6: "BidirectionalDNS", + } + RegistrationSource_value = map[string]int32{ + "Unspecified": 0, + "Detector": 1, + "API": 2, + "DetectorPrescan": 3, + "BidirectionalAPI": 4, + "DNS": 5, + "BidirectionalDNS": 6, + } +) + +func (x RegistrationSource) Enum() *RegistrationSource { + p := new(RegistrationSource) + *p = x + return p +} + +func (x RegistrationSource) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RegistrationSource) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[6].Descriptor() +} + +func (RegistrationSource) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[6] +} + +func (x RegistrationSource) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *RegistrationSource) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = RegistrationSource(num) + return nil +} + +// Deprecated: Use RegistrationSource.Descriptor instead. +func (RegistrationSource) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{6} +} + +type StationOperations int32 + +const ( + StationOperations_Unknown StationOperations = 0 + StationOperations_New StationOperations = 1 + StationOperations_Update StationOperations = 2 + StationOperations_Clear StationOperations = 3 +) + +// Enum value maps for StationOperations. +var ( + StationOperations_name = map[int32]string{ + 0: "Unknown", + 1: "New", + 2: "Update", + 3: "Clear", + } + StationOperations_value = map[string]int32{ + "Unknown": 0, + "New": 1, + "Update": 2, + "Clear": 3, + } +) + +func (x StationOperations) Enum() *StationOperations { + p := new(StationOperations) + *p = x + return p +} + +func (x StationOperations) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StationOperations) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[7].Descriptor() +} + +func (StationOperations) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[7] +} + +func (x StationOperations) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *StationOperations) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = StationOperations(num) + return nil +} + +// Deprecated: Use StationOperations.Descriptor instead. +func (StationOperations) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{7} +} + +type IPProto int32 + +const ( + IPProto_Unk IPProto = 0 + IPProto_Tcp IPProto = 1 + IPProto_Udp IPProto = 2 +) + +// Enum value maps for IPProto. +var ( + IPProto_name = map[int32]string{ + 0: "Unk", + 1: "Tcp", + 2: "Udp", + } + IPProto_value = map[string]int32{ + "Unk": 0, + "Tcp": 1, + "Udp": 2, + } +) + +func (x IPProto) Enum() *IPProto { + p := new(IPProto) + *p = x + return p +} + +func (x IPProto) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IPProto) Descriptor() protoreflect.EnumDescriptor { + return file_signalling_proto_enumTypes[8].Descriptor() +} + +func (IPProto) Type() protoreflect.EnumType { + return &file_signalling_proto_enumTypes[8] +} + +func (x IPProto) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *IPProto) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = IPProto(num) + return nil +} + +// Deprecated: Use IPProto.Descriptor instead. +func (IPProto) EnumDescriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{8} +} + +type PubKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A public key, as used by the station. + Key []byte `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + Type *KeyType `protobuf:"varint,2,opt,name=type,enum=proto.KeyType" json:"type,omitempty"` +} + +func (x *PubKey) Reset() { + *x = PubKey{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PubKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PubKey) ProtoMessage() {} + +func (x *PubKey) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PubKey.ProtoReflect.Descriptor instead. +func (*PubKey) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{0} +} + +func (x *PubKey) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +func (x *PubKey) GetType() KeyType { + if x != nil && x.Type != nil { + return *x.Type + } + return KeyType_AES_GCM_128 +} + +type TLSDecoySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The hostname/SNI to use for this host + // + // The hostname is the only required field, although other + // fields are expected to be present in most cases. + Hostname *string `protobuf:"bytes,1,opt,name=hostname" json:"hostname,omitempty"` + // The 32-bit ipv4 address, in network byte order + // + // If the IPv4 address is absent, then it may be resolved via + // DNS by the client, or the client may discard this decoy spec + // if local DNS is untrusted, or the service may be multihomed. + Ipv4Addr *uint32 `protobuf:"fixed32,2,opt,name=ipv4addr" json:"ipv4addr,omitempty"` + // The 128-bit ipv6 address, in network byte order + Ipv6Addr []byte `protobuf:"bytes,6,opt,name=ipv6addr" json:"ipv6addr,omitempty"` + // The Tapdance station public key to use when contacting this + // decoy + // + // If omitted, the default station public key (if any) is used. + Pubkey *PubKey `protobuf:"bytes,3,opt,name=pubkey" json:"pubkey,omitempty"` + // The maximum duration, in milliseconds, to maintain an open + // connection to this decoy (because the decoy may close the + // connection itself after this length of time) + // + // If omitted, a default of 30,000 milliseconds is assumed. + Timeout *uint32 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` + // The maximum TCP window size to attempt to use for this decoy. + // + // If omitted, a default of 15360 is assumed. + // + // TODO: the default is based on the current heuristic of only + // using decoys that permit windows of 15KB or larger. If this + // heuristic changes, then this default doesn't make sense. + Tcpwin *uint32 `protobuf:"varint,5,opt,name=tcpwin" json:"tcpwin,omitempty"` +} + +func (x *TLSDecoySpec) Reset() { + *x = TLSDecoySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TLSDecoySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TLSDecoySpec) ProtoMessage() {} + +func (x *TLSDecoySpec) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TLSDecoySpec.ProtoReflect.Descriptor instead. +func (*TLSDecoySpec) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{1} +} + +func (x *TLSDecoySpec) GetHostname() string { + if x != nil && x.Hostname != nil { + return *x.Hostname + } + return "" +} + +func (x *TLSDecoySpec) GetIpv4Addr() uint32 { + if x != nil && x.Ipv4Addr != nil { + return *x.Ipv4Addr + } + return 0 +} + +func (x *TLSDecoySpec) GetIpv6Addr() []byte { + if x != nil { + return x.Ipv6Addr + } + return nil +} + +func (x *TLSDecoySpec) GetPubkey() *PubKey { + if x != nil { + return x.Pubkey + } + return nil +} + +func (x *TLSDecoySpec) GetTimeout() uint32 { + if x != nil && x.Timeout != nil { + return *x.Timeout + } + return 0 +} + +func (x *TLSDecoySpec) GetTcpwin() uint32 { + if x != nil && x.Tcpwin != nil { + return *x.Tcpwin + } + return 0 +} + +type ClientConf struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DecoyList *DecoyList `protobuf:"bytes,1,opt,name=decoy_list,json=decoyList" json:"decoy_list,omitempty"` + Generation *uint32 `protobuf:"varint,2,opt,name=generation" json:"generation,omitempty"` + DefaultPubkey *PubKey `protobuf:"bytes,3,opt,name=default_pubkey,json=defaultPubkey" json:"default_pubkey,omitempty"` + PhantomSubnetsList *PhantomSubnetsList `protobuf:"bytes,4,opt,name=phantom_subnets_list,json=phantomSubnetsList" json:"phantom_subnets_list,omitempty"` + ConjurePubkey *PubKey `protobuf:"bytes,5,opt,name=conjure_pubkey,json=conjurePubkey" json:"conjure_pubkey,omitempty"` + DnsRegConf *DnsRegConf `protobuf:"bytes,6,opt,name=dns_reg_conf,json=dnsRegConf" json:"dns_reg_conf,omitempty"` +} + +func (x *ClientConf) Reset() { + *x = ClientConf{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientConf) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientConf) ProtoMessage() {} + +func (x *ClientConf) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientConf.ProtoReflect.Descriptor instead. +func (*ClientConf) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{2} +} + +func (x *ClientConf) GetDecoyList() *DecoyList { + if x != nil { + return x.DecoyList + } + return nil +} + +func (x *ClientConf) GetGeneration() uint32 { + if x != nil && x.Generation != nil { + return *x.Generation + } + return 0 +} + +func (x *ClientConf) GetDefaultPubkey() *PubKey { + if x != nil { + return x.DefaultPubkey + } + return nil +} + +func (x *ClientConf) GetPhantomSubnetsList() *PhantomSubnetsList { + if x != nil { + return x.PhantomSubnetsList + } + return nil +} + +func (x *ClientConf) GetConjurePubkey() *PubKey { + if x != nil { + return x.ConjurePubkey + } + return nil +} + +func (x *ClientConf) GetDnsRegConf() *DnsRegConf { + if x != nil { + return x.DnsRegConf + } + return nil +} + +// Configuration for DNS registrar +type DnsRegConf struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DnsRegMethod *DnsRegMethod `protobuf:"varint,1,req,name=dns_reg_method,json=dnsRegMethod,enum=proto.DnsRegMethod" json:"dns_reg_method,omitempty"` + Target *string `protobuf:"bytes,2,opt,name=target" json:"target,omitempty"` + Domain *string `protobuf:"bytes,3,req,name=domain" json:"domain,omitempty"` + Pubkey []byte `protobuf:"bytes,4,opt,name=pubkey" json:"pubkey,omitempty"` + UtlsDistribution *string `protobuf:"bytes,5,opt,name=utls_distribution,json=utlsDistribution" json:"utls_distribution,omitempty"` + StunServer *string `protobuf:"bytes,6,opt,name=stun_server,json=stunServer" json:"stun_server,omitempty"` +} + +func (x *DnsRegConf) Reset() { + *x = DnsRegConf{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DnsRegConf) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DnsRegConf) ProtoMessage() {} + +func (x *DnsRegConf) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DnsRegConf.ProtoReflect.Descriptor instead. +func (*DnsRegConf) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{3} +} + +func (x *DnsRegConf) GetDnsRegMethod() DnsRegMethod { + if x != nil && x.DnsRegMethod != nil { + return *x.DnsRegMethod + } + return DnsRegMethod_UDP +} + +func (x *DnsRegConf) GetTarget() string { + if x != nil && x.Target != nil { + return *x.Target + } + return "" +} + +func (x *DnsRegConf) GetDomain() string { + if x != nil && x.Domain != nil { + return *x.Domain + } + return "" +} + +func (x *DnsRegConf) GetPubkey() []byte { + if x != nil { + return x.Pubkey + } + return nil +} + +func (x *DnsRegConf) GetUtlsDistribution() string { + if x != nil && x.UtlsDistribution != nil { + return *x.UtlsDistribution + } + return "" +} + +func (x *DnsRegConf) GetStunServer() string { + if x != nil && x.StunServer != nil { + return *x.StunServer + } + return "" +} + +type DecoyList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TlsDecoys []*TLSDecoySpec `protobuf:"bytes,1,rep,name=tls_decoys,json=tlsDecoys" json:"tls_decoys,omitempty"` +} + +func (x *DecoyList) Reset() { + *x = DecoyList{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DecoyList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DecoyList) ProtoMessage() {} + +func (x *DecoyList) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DecoyList.ProtoReflect.Descriptor instead. +func (*DecoyList) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{4} +} + +func (x *DecoyList) GetTlsDecoys() []*TLSDecoySpec { + if x != nil { + return x.TlsDecoys + } + return nil +} + +type PhantomSubnetsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WeightedSubnets []*PhantomSubnets `protobuf:"bytes,1,rep,name=weighted_subnets,json=weightedSubnets" json:"weighted_subnets,omitempty"` +} + +func (x *PhantomSubnetsList) Reset() { + *x = PhantomSubnetsList{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PhantomSubnetsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PhantomSubnetsList) ProtoMessage() {} + +func (x *PhantomSubnetsList) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PhantomSubnetsList.ProtoReflect.Descriptor instead. +func (*PhantomSubnetsList) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{5} +} + +func (x *PhantomSubnetsList) GetWeightedSubnets() []*PhantomSubnets { + if x != nil { + return x.WeightedSubnets + } + return nil +} + +type PhantomSubnets struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Weight *uint32 `protobuf:"varint,1,opt,name=weight" json:"weight,omitempty"` + Subnets []string `protobuf:"bytes,2,rep,name=subnets" json:"subnets,omitempty"` + RandomizeDstPort *bool `protobuf:"varint,3,opt,name=randomize_dst_port,json=randomizeDstPort" json:"randomize_dst_port,omitempty"` +} + +func (x *PhantomSubnets) Reset() { + *x = PhantomSubnets{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PhantomSubnets) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PhantomSubnets) ProtoMessage() {} + +func (x *PhantomSubnets) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PhantomSubnets.ProtoReflect.Descriptor instead. +func (*PhantomSubnets) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{6} +} + +func (x *PhantomSubnets) GetWeight() uint32 { + if x != nil && x.Weight != nil { + return *x.Weight + } + return 0 +} + +func (x *PhantomSubnets) GetSubnets() []string { + if x != nil { + return x.Subnets + } + return nil +} + +func (x *PhantomSubnets) GetRandomizeDstPort() bool { + if x != nil && x.RandomizeDstPort != nil { + return *x.RandomizeDstPort + } + return false +} + +// Deflated ICE Candidate by seed2sdp package +type WebRTCICECandidate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // IP is represented in its 16-byte form + IpUpper *uint64 `protobuf:"varint,1,req,name=ip_upper,json=ipUpper" json:"ip_upper,omitempty"` + IpLower *uint64 `protobuf:"varint,2,req,name=ip_lower,json=ipLower" json:"ip_lower,omitempty"` + // Composed info includes port, tcptype (unset if not tcp), candidate type (host, srflx, prflx), protocol (TCP/UDP), and component (RTP/RTCP) + ComposedInfo *uint32 `protobuf:"varint,3,req,name=composed_info,json=composedInfo" json:"composed_info,omitempty"` +} + +func (x *WebRTCICECandidate) Reset() { + *x = WebRTCICECandidate{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WebRTCICECandidate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WebRTCICECandidate) ProtoMessage() {} + +func (x *WebRTCICECandidate) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WebRTCICECandidate.ProtoReflect.Descriptor instead. +func (*WebRTCICECandidate) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{7} +} + +func (x *WebRTCICECandidate) GetIpUpper() uint64 { + if x != nil && x.IpUpper != nil { + return *x.IpUpper + } + return 0 +} + +func (x *WebRTCICECandidate) GetIpLower() uint64 { + if x != nil && x.IpLower != nil { + return *x.IpLower + } + return 0 +} + +func (x *WebRTCICECandidate) GetComposedInfo() uint32 { + if x != nil && x.ComposedInfo != nil { + return *x.ComposedInfo + } + return 0 +} + +// Deflated SDP for WebRTC by seed2sdp package +type WebRTCSDP struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *uint32 `protobuf:"varint,1,req,name=type" json:"type,omitempty"` + Candidates []*WebRTCICECandidate `protobuf:"bytes,2,rep,name=candidates" json:"candidates,omitempty"` // there could be multiple candidates +} + +func (x *WebRTCSDP) Reset() { + *x = WebRTCSDP{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WebRTCSDP) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WebRTCSDP) ProtoMessage() {} + +func (x *WebRTCSDP) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WebRTCSDP.ProtoReflect.Descriptor instead. +func (*WebRTCSDP) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{8} +} + +func (x *WebRTCSDP) GetType() uint32 { + if x != nil && x.Type != nil { + return *x.Type + } + return 0 +} + +func (x *WebRTCSDP) GetCandidates() []*WebRTCICECandidate { + if x != nil { + return x.Candidates + } + return nil +} + +// WebRTCSignal includes a deflated SDP and a seed +type WebRTCSignal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seed *string `protobuf:"bytes,1,req,name=seed" json:"seed,omitempty"` + Sdp *WebRTCSDP `protobuf:"bytes,2,req,name=sdp" json:"sdp,omitempty"` +} + +func (x *WebRTCSignal) Reset() { + *x = WebRTCSignal{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WebRTCSignal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WebRTCSignal) ProtoMessage() {} + +func (x *WebRTCSignal) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WebRTCSignal.ProtoReflect.Descriptor instead. +func (*WebRTCSignal) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{9} +} + +func (x *WebRTCSignal) GetSeed() string { + if x != nil && x.Seed != nil { + return *x.Seed + } + return "" +} + +func (x *WebRTCSignal) GetSdp() *WebRTCSDP { + if x != nil { + return x.Sdp + } + return nil +} + +type Addr struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IP []byte `protobuf:"bytes,1,opt,name=IP" json:"IP,omitempty"` + Port *uint32 `protobuf:"varint,2,opt,name=Port" json:"Port,omitempty"` +} + +func (x *Addr) Reset() { + *x = Addr{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Addr) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Addr) ProtoMessage() {} + +func (x *Addr) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Addr.ProtoReflect.Descriptor instead. +func (*Addr) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{10} +} + +func (x *Addr) GetIP() []byte { + if x != nil { + return x.IP + } + return nil +} + +func (x *Addr) GetPort() uint32 { + if x != nil && x.Port != nil { + return *x.Port + } + return 0 +} + +type DTLSTransportParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SrcAddr4 *Addr `protobuf:"bytes,1,opt,name=src_addr4,json=srcAddr4" json:"src_addr4,omitempty"` + SrcAddr6 *Addr `protobuf:"bytes,2,opt,name=src_addr6,json=srcAddr6" json:"src_addr6,omitempty"` + RandomizeDstPort *bool `protobuf:"varint,3,opt,name=randomize_dst_port,json=randomizeDstPort" json:"randomize_dst_port,omitempty"` + // Unordered sets the reliability of the DTLS stream to unordered + Unordered *bool `protobuf:"varint,4,opt,name=unordered" json:"unordered,omitempty"` +} + +func (x *DTLSTransportParams) Reset() { + *x = DTLSTransportParams{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DTLSTransportParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DTLSTransportParams) ProtoMessage() {} + +func (x *DTLSTransportParams) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DTLSTransportParams.ProtoReflect.Descriptor instead. +func (*DTLSTransportParams) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{11} +} + +func (x *DTLSTransportParams) GetSrcAddr4() *Addr { + if x != nil { + return x.SrcAddr4 + } + return nil +} + +func (x *DTLSTransportParams) GetSrcAddr6() *Addr { + if x != nil { + return x.SrcAddr6 + } + return nil +} + +func (x *DTLSTransportParams) GetRandomizeDstPort() bool { + if x != nil && x.RandomizeDstPort != nil { + return *x.RandomizeDstPort + } + return false +} + +func (x *DTLSTransportParams) GetUnordered() bool { + if x != nil && x.Unordered != nil { + return *x.Unordered + } + return false +} + +type StationToClient struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Should accompany (at least) SESSION_INIT and CONFIRM_RECONNECT. + ProtocolVersion *uint32 `protobuf:"varint,1,opt,name=protocol_version,json=protocolVersion" json:"protocol_version,omitempty"` + // There might be a state transition. May be absent; absence should be + // treated identically to NO_CHANGE. + StateTransition *S2C_Transition `protobuf:"varint,2,opt,name=state_transition,json=stateTransition,enum=proto.S2C_Transition" json:"state_transition,omitempty"` + // The station can send client config info piggybacked + // on any message, as it sees fit + ConfigInfo *ClientConf `protobuf:"bytes,3,opt,name=config_info,json=configInfo" json:"config_info,omitempty"` + // If state_transition == S2C_ERROR, this field is the explanation. + ErrReason *ErrorReasonS2C `protobuf:"varint,4,opt,name=err_reason,json=errReason,enum=proto.ErrorReasonS2C" json:"err_reason,omitempty"` + // Signals client to stop connecting for following amount of seconds + TmpBackoff *uint32 `protobuf:"varint,5,opt,name=tmp_backoff,json=tmpBackoff" json:"tmp_backoff,omitempty"` + // Sent in SESSION_INIT, identifies the station that picked up + StationId *string `protobuf:"bytes,6,opt,name=station_id,json=stationId" json:"station_id,omitempty"` + // Random-sized junk to defeat packet size fingerprinting. + Padding []byte `protobuf:"bytes,100,opt,name=padding" json:"padding,omitempty"` +} + +func (x *StationToClient) Reset() { + *x = StationToClient{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StationToClient) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StationToClient) ProtoMessage() {} + +func (x *StationToClient) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StationToClient.ProtoReflect.Descriptor instead. +func (*StationToClient) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{12} +} + +func (x *StationToClient) GetProtocolVersion() uint32 { + if x != nil && x.ProtocolVersion != nil { + return *x.ProtocolVersion + } + return 0 +} + +func (x *StationToClient) GetStateTransition() S2C_Transition { + if x != nil && x.StateTransition != nil { + return *x.StateTransition + } + return S2C_Transition_S2C_NO_CHANGE +} + +func (x *StationToClient) GetConfigInfo() *ClientConf { + if x != nil { + return x.ConfigInfo + } + return nil +} + +func (x *StationToClient) GetErrReason() ErrorReasonS2C { + if x != nil && x.ErrReason != nil { + return *x.ErrReason + } + return ErrorReasonS2C_NO_ERROR +} + +func (x *StationToClient) GetTmpBackoff() uint32 { + if x != nil && x.TmpBackoff != nil { + return *x.TmpBackoff + } + return 0 +} + +func (x *StationToClient) GetStationId() string { + if x != nil && x.StationId != nil { + return *x.StationId + } + return "" +} + +func (x *StationToClient) GetPadding() []byte { + if x != nil { + return x.Padding + } + return nil +} + +type RegistrationFlags struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UploadOnly *bool `protobuf:"varint,1,opt,name=upload_only,json=uploadOnly" json:"upload_only,omitempty"` + DarkDecoy *bool `protobuf:"varint,2,opt,name=dark_decoy,json=darkDecoy" json:"dark_decoy,omitempty"` + ProxyHeader *bool `protobuf:"varint,3,opt,name=proxy_header,json=proxyHeader" json:"proxy_header,omitempty"` + Use_TIL *bool `protobuf:"varint,4,opt,name=use_TIL,json=useTIL" json:"use_TIL,omitempty"` + Prescanned *bool `protobuf:"varint,5,opt,name=prescanned" json:"prescanned,omitempty"` +} + +func (x *RegistrationFlags) Reset() { + *x = RegistrationFlags{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegistrationFlags) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegistrationFlags) ProtoMessage() {} + +func (x *RegistrationFlags) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegistrationFlags.ProtoReflect.Descriptor instead. +func (*RegistrationFlags) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{13} +} + +func (x *RegistrationFlags) GetUploadOnly() bool { + if x != nil && x.UploadOnly != nil { + return *x.UploadOnly + } + return false +} + +func (x *RegistrationFlags) GetDarkDecoy() bool { + if x != nil && x.DarkDecoy != nil { + return *x.DarkDecoy + } + return false +} + +func (x *RegistrationFlags) GetProxyHeader() bool { + if x != nil && x.ProxyHeader != nil { + return *x.ProxyHeader + } + return false +} + +func (x *RegistrationFlags) GetUse_TIL() bool { + if x != nil && x.Use_TIL != nil { + return *x.Use_TIL + } + return false +} + +func (x *RegistrationFlags) GetPrescanned() bool { + if x != nil && x.Prescanned != nil { + return *x.Prescanned + } + return false +} + +type ClientToStation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProtocolVersion *uint32 `protobuf:"varint,1,opt,name=protocol_version,json=protocolVersion" json:"protocol_version,omitempty"` + // The client reports its decoy list's version number here, which the + // station can use to decide whether to send an updated one. The station + // should always send a list if this field is set to 0. + DecoyListGeneration *uint32 `protobuf:"varint,2,opt,name=decoy_list_generation,json=decoyListGeneration" json:"decoy_list_generation,omitempty"` + StateTransition *C2S_Transition `protobuf:"varint,3,opt,name=state_transition,json=stateTransition,enum=proto.C2S_Transition" json:"state_transition,omitempty"` + // The position in the overall session's upload sequence where the current + // YIELD=>ACQUIRE switchover is happening. + UploadSync *uint64 `protobuf:"varint,4,opt,name=upload_sync,json=uploadSync" json:"upload_sync,omitempty"` + // High level client library version used for indicating feature support, or + // lack therof. + ClientLibVersion *uint32 `protobuf:"varint,5,opt,name=client_lib_version,json=clientLibVersion" json:"client_lib_version,omitempty"` + // Indicates whether the client will allow the registrar to provide alternative parameters that + // may work better in substitute for the deterministically selected parameters. This only works + // for bidirectional registration methods where the client receives a RegistrationResponse. + DisableRegistrarOverrides *bool `protobuf:"varint,6,opt,name=disable_registrar_overrides,json=disableRegistrarOverrides" json:"disable_registrar_overrides,omitempty"` + // List of decoys that client have unsuccessfully tried in current session. + // Could be sent in chunks + FailedDecoys []string `protobuf:"bytes,10,rep,name=failed_decoys,json=failedDecoys" json:"failed_decoys,omitempty"` + Stats *SessionStats `protobuf:"bytes,11,opt,name=stats" json:"stats,omitempty"` + // NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy + Transport *TransportType `protobuf:"varint,12,opt,name=transport,enum=proto.TransportType" json:"transport,omitempty"` + TransportParams *anypb.Any `protobuf:"bytes,13,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + // Station is only required to check this variable during session initialization. + // If set, station must facilitate connection to said target by itself, i.e. write into squid + // socket an HTTP/SOCKS/any other connection request. + // covert_address must have exactly one ':' colon, that separates host (literal IP address or + // resolvable hostname) and port + // TODO: make it required for initialization, and stop connecting any client straight to squid? + CovertAddress *string `protobuf:"bytes,20,opt,name=covert_address,json=covertAddress" json:"covert_address,omitempty"` + // Used in dark decoys to signal which dark decoy it will connect to. + MaskedDecoyServerName *string `protobuf:"bytes,21,opt,name=masked_decoy_server_name,json=maskedDecoyServerName" json:"masked_decoy_server_name,omitempty"` + // Used to indicate to server if client is registering v4, v6 or both + V6Support *bool `protobuf:"varint,22,opt,name=v6_support,json=v6Support" json:"v6_support,omitempty"` + V4Support *bool `protobuf:"varint,23,opt,name=v4_support,json=v4Support" json:"v4_support,omitempty"` + // A collection of optional flags for the registration. + Flags *RegistrationFlags `protobuf:"bytes,24,opt,name=flags" json:"flags,omitempty"` + // Transport Extensions + // TODO(jmwample) - move to WebRTC specific transport params protobuf message. + WebrtcSignal *WebRTCSignal `protobuf:"bytes,31,opt,name=webrtc_signal,json=webrtcSignal" json:"webrtc_signal,omitempty"` + // Random-sized junk to defeat packet size fingerprinting. + Padding []byte `protobuf:"bytes,100,opt,name=padding" json:"padding,omitempty"` +} + +func (x *ClientToStation) Reset() { + *x = ClientToStation{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientToStation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientToStation) ProtoMessage() {} + +func (x *ClientToStation) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientToStation.ProtoReflect.Descriptor instead. +func (*ClientToStation) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{14} +} + +func (x *ClientToStation) GetProtocolVersion() uint32 { + if x != nil && x.ProtocolVersion != nil { + return *x.ProtocolVersion + } + return 0 +} + +func (x *ClientToStation) GetDecoyListGeneration() uint32 { + if x != nil && x.DecoyListGeneration != nil { + return *x.DecoyListGeneration + } + return 0 +} + +func (x *ClientToStation) GetStateTransition() C2S_Transition { + if x != nil && x.StateTransition != nil { + return *x.StateTransition + } + return C2S_Transition_C2S_NO_CHANGE +} + +func (x *ClientToStation) GetUploadSync() uint64 { + if x != nil && x.UploadSync != nil { + return *x.UploadSync + } + return 0 +} + +func (x *ClientToStation) GetClientLibVersion() uint32 { + if x != nil && x.ClientLibVersion != nil { + return *x.ClientLibVersion + } + return 0 +} + +func (x *ClientToStation) GetDisableRegistrarOverrides() bool { + if x != nil && x.DisableRegistrarOverrides != nil { + return *x.DisableRegistrarOverrides + } + return false +} + +func (x *ClientToStation) GetFailedDecoys() []string { + if x != nil { + return x.FailedDecoys + } + return nil +} + +func (x *ClientToStation) GetStats() *SessionStats { + if x != nil { + return x.Stats + } + return nil +} + +func (x *ClientToStation) GetTransport() TransportType { + if x != nil && x.Transport != nil { + return *x.Transport + } + return TransportType_Null +} + +func (x *ClientToStation) GetTransportParams() *anypb.Any { + if x != nil { + return x.TransportParams + } + return nil +} + +func (x *ClientToStation) GetCovertAddress() string { + if x != nil && x.CovertAddress != nil { + return *x.CovertAddress + } + return "" +} + +func (x *ClientToStation) GetMaskedDecoyServerName() string { + if x != nil && x.MaskedDecoyServerName != nil { + return *x.MaskedDecoyServerName + } + return "" +} + +func (x *ClientToStation) GetV6Support() bool { + if x != nil && x.V6Support != nil { + return *x.V6Support + } + return false +} + +func (x *ClientToStation) GetV4Support() bool { + if x != nil && x.V4Support != nil { + return *x.V4Support + } + return false +} + +func (x *ClientToStation) GetFlags() *RegistrationFlags { + if x != nil { + return x.Flags + } + return nil +} + +func (x *ClientToStation) GetWebrtcSignal() *WebRTCSignal { + if x != nil { + return x.WebrtcSignal + } + return nil +} + +func (x *ClientToStation) GetPadding() []byte { + if x != nil { + return x.Padding + } + return nil +} + +type PrefixTransportParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Prefix Identifier + PrefixId *int32 `protobuf:"varint,1,opt,name=prefix_id,json=prefixId" json:"prefix_id,omitempty"` + // Prefix bytes (optional - usually sent from station to client as override if allowed by C2S) + // as the station cannot take this into account when attempting to identify a connection. + Prefix []byte `protobuf:"bytes,2,opt,name=prefix" json:"prefix,omitempty"` + CustomFlushPolicy *int32 `protobuf:"varint,3,opt,name=custom_flush_policy,json=customFlushPolicy" json:"custom_flush_policy,omitempty"` + // Indicates whether the client has elected to use destination port randomization. Should be + // checked against selected transport to ensure that destination port randomization is + // supported. + RandomizeDstPort *bool `protobuf:"varint,13,opt,name=randomize_dst_port,json=randomizeDstPort" json:"randomize_dst_port,omitempty"` +} + +func (x *PrefixTransportParams) Reset() { + *x = PrefixTransportParams{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PrefixTransportParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrefixTransportParams) ProtoMessage() {} + +func (x *PrefixTransportParams) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PrefixTransportParams.ProtoReflect.Descriptor instead. +func (*PrefixTransportParams) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{15} +} + +func (x *PrefixTransportParams) GetPrefixId() int32 { + if x != nil && x.PrefixId != nil { + return *x.PrefixId + } + return 0 +} + +func (x *PrefixTransportParams) GetPrefix() []byte { + if x != nil { + return x.Prefix + } + return nil +} + +func (x *PrefixTransportParams) GetCustomFlushPolicy() int32 { + if x != nil && x.CustomFlushPolicy != nil { + return *x.CustomFlushPolicy + } + return 0 +} + +func (x *PrefixTransportParams) GetRandomizeDstPort() bool { + if x != nil && x.RandomizeDstPort != nil { + return *x.RandomizeDstPort + } + return false +} + +type GenericTransportParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates whether the client has elected to use destination port randomization. Should be + // checked against selected transport to ensure that destination port randomization is + // supported. + RandomizeDstPort *bool `protobuf:"varint,13,opt,name=randomize_dst_port,json=randomizeDstPort" json:"randomize_dst_port,omitempty"` +} + +func (x *GenericTransportParams) Reset() { + *x = GenericTransportParams{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericTransportParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericTransportParams) ProtoMessage() {} + +func (x *GenericTransportParams) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericTransportParams.ProtoReflect.Descriptor instead. +func (*GenericTransportParams) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{16} +} + +func (x *GenericTransportParams) GetRandomizeDstPort() bool { + if x != nil && x.RandomizeDstPort != nil { + return *x.RandomizeDstPort + } + return false +} + +type C2SWrapper struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SharedSecret []byte `protobuf:"bytes,1,opt,name=shared_secret,json=sharedSecret" json:"shared_secret,omitempty"` + RegistrationPayload *ClientToStation `protobuf:"bytes,3,opt,name=registration_payload,json=registrationPayload" json:"registration_payload,omitempty"` + RegistrationSource *RegistrationSource `protobuf:"varint,4,opt,name=registration_source,json=registrationSource,enum=proto.RegistrationSource" json:"registration_source,omitempty"` + // client source address when receiving a registration + RegistrationAddress []byte `protobuf:"bytes,6,opt,name=registration_address,json=registrationAddress" json:"registration_address,omitempty"` + // Decoy address used when registering over Decoy registrar + DecoyAddress []byte `protobuf:"bytes,7,opt,name=decoy_address,json=decoyAddress" json:"decoy_address,omitempty"` + // The next three fields allow an independent registrar (trusted by a station w/ a zmq keypair) to + // share the registration overrides that it assigned to the client with the station(s). + // Registration Respose is here to allow a parsed object with direct access to the fields within. + // RegRespBytes provides a serialized verion of the Registration response so that the signature of + // the Bidirectional registrar can be validated before a station applies any overrides present in + // the Registration Response. + // + // If you are reading this in the future and you want to extend the functionality here it might + // make sense to make the RegistrationResponse that is sent to the client a distinct message from + // the one that gets sent to the stations. + RegistrationResponse *RegistrationResponse `protobuf:"bytes,8,opt,name=registration_response,json=registrationResponse" json:"registration_response,omitempty"` + RegRespBytes []byte `protobuf:"bytes,9,opt,name=RegRespBytes" json:"RegRespBytes,omitempty"` + RegRespSignature []byte `protobuf:"bytes,10,opt,name=RegRespSignature" json:"RegRespSignature,omitempty"` +} + +func (x *C2SWrapper) Reset() { + *x = C2SWrapper{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *C2SWrapper) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*C2SWrapper) ProtoMessage() {} + +func (x *C2SWrapper) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use C2SWrapper.ProtoReflect.Descriptor instead. +func (*C2SWrapper) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{17} +} + +func (x *C2SWrapper) GetSharedSecret() []byte { + if x != nil { + return x.SharedSecret + } + return nil +} + +func (x *C2SWrapper) GetRegistrationPayload() *ClientToStation { + if x != nil { + return x.RegistrationPayload + } + return nil +} + +func (x *C2SWrapper) GetRegistrationSource() RegistrationSource { + if x != nil && x.RegistrationSource != nil { + return *x.RegistrationSource + } + return RegistrationSource_Unspecified +} + +func (x *C2SWrapper) GetRegistrationAddress() []byte { + if x != nil { + return x.RegistrationAddress + } + return nil +} + +func (x *C2SWrapper) GetDecoyAddress() []byte { + if x != nil { + return x.DecoyAddress + } + return nil +} + +func (x *C2SWrapper) GetRegistrationResponse() *RegistrationResponse { + if x != nil { + return x.RegistrationResponse + } + return nil +} + +func (x *C2SWrapper) GetRegRespBytes() []byte { + if x != nil { + return x.RegRespBytes + } + return nil +} + +func (x *C2SWrapper) GetRegRespSignature() []byte { + if x != nil { + return x.RegRespSignature + } + return nil +} + +type SessionStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedDecoysAmount *uint32 `protobuf:"varint,20,opt,name=failed_decoys_amount,json=failedDecoysAmount" json:"failed_decoys_amount,omitempty"` // how many decoys were tried before success + // Applicable to whole session: + TotalTimeToConnect *uint32 `protobuf:"varint,31,opt,name=total_time_to_connect,json=totalTimeToConnect" json:"total_time_to_connect,omitempty"` // includes failed attempts + // Last (i.e. successful) decoy: + RttToStation *uint32 `protobuf:"varint,33,opt,name=rtt_to_station,json=rttToStation" json:"rtt_to_station,omitempty"` // measured during initial handshake + TlsToDecoy *uint32 `protobuf:"varint,38,opt,name=tls_to_decoy,json=tlsToDecoy" json:"tls_to_decoy,omitempty"` // includes tcp to decoy + TcpToDecoy *uint32 `protobuf:"varint,39,opt,name=tcp_to_decoy,json=tcpToDecoy" json:"tcp_to_decoy,omitempty"` // measured when establishing tcp connection to decot +} + +func (x *SessionStats) Reset() { + *x = SessionStats{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SessionStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SessionStats) ProtoMessage() {} + +func (x *SessionStats) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SessionStats.ProtoReflect.Descriptor instead. +func (*SessionStats) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{18} +} + +func (x *SessionStats) GetFailedDecoysAmount() uint32 { + if x != nil && x.FailedDecoysAmount != nil { + return *x.FailedDecoysAmount + } + return 0 +} + +func (x *SessionStats) GetTotalTimeToConnect() uint32 { + if x != nil && x.TotalTimeToConnect != nil { + return *x.TotalTimeToConnect + } + return 0 +} + +func (x *SessionStats) GetRttToStation() uint32 { + if x != nil && x.RttToStation != nil { + return *x.RttToStation + } + return 0 +} + +func (x *SessionStats) GetTlsToDecoy() uint32 { + if x != nil && x.TlsToDecoy != nil { + return *x.TlsToDecoy + } + return 0 +} + +func (x *SessionStats) GetTcpToDecoy() uint32 { + if x != nil && x.TcpToDecoy != nil { + return *x.TcpToDecoy + } + return 0 +} + +type StationToDetector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PhantomIp *string `protobuf:"bytes,1,opt,name=phantom_ip,json=phantomIp" json:"phantom_ip,omitempty"` + ClientIp *string `protobuf:"bytes,2,opt,name=client_ip,json=clientIp" json:"client_ip,omitempty"` + TimeoutNs *uint64 `protobuf:"varint,3,opt,name=timeout_ns,json=timeoutNs" json:"timeout_ns,omitempty"` + Operation *StationOperations `protobuf:"varint,4,opt,name=operation,enum=proto.StationOperations" json:"operation,omitempty"` + DstPort *uint32 `protobuf:"varint,10,opt,name=dst_port,json=dstPort" json:"dst_port,omitempty"` + SrcPort *uint32 `protobuf:"varint,11,opt,name=src_port,json=srcPort" json:"src_port,omitempty"` + Proto *IPProto `protobuf:"varint,12,opt,name=proto,enum=proto.IPProto" json:"proto,omitempty"` +} + +func (x *StationToDetector) Reset() { + *x = StationToDetector{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StationToDetector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StationToDetector) ProtoMessage() {} + +func (x *StationToDetector) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StationToDetector.ProtoReflect.Descriptor instead. +func (*StationToDetector) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{19} +} + +func (x *StationToDetector) GetPhantomIp() string { + if x != nil && x.PhantomIp != nil { + return *x.PhantomIp + } + return "" +} + +func (x *StationToDetector) GetClientIp() string { + if x != nil && x.ClientIp != nil { + return *x.ClientIp + } + return "" +} + +func (x *StationToDetector) GetTimeoutNs() uint64 { + if x != nil && x.TimeoutNs != nil { + return *x.TimeoutNs + } + return 0 +} + +func (x *StationToDetector) GetOperation() StationOperations { + if x != nil && x.Operation != nil { + return *x.Operation + } + return StationOperations_Unknown +} + +func (x *StationToDetector) GetDstPort() uint32 { + if x != nil && x.DstPort != nil { + return *x.DstPort + } + return 0 +} + +func (x *StationToDetector) GetSrcPort() uint32 { + if x != nil && x.SrcPort != nil { + return *x.SrcPort + } + return 0 +} + +func (x *StationToDetector) GetProto() IPProto { + if x != nil && x.Proto != nil { + return *x.Proto + } + return IPProto_Unk +} + +// Adding message response from Station to Client for bidirectional API +type RegistrationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ipv4Addr *uint32 `protobuf:"fixed32,1,opt,name=ipv4addr" json:"ipv4addr,omitempty"` + // The 128-bit ipv6 address, in network byte order + Ipv6Addr []byte `protobuf:"bytes,2,opt,name=ipv6addr" json:"ipv6addr,omitempty"` + // Respond with randomized port + DstPort *uint32 `protobuf:"varint,3,opt,name=dst_port,json=dstPort" json:"dst_port,omitempty"` + // Future: station provides client with secret, want chanel present + // Leave null for now + ServerRandom []byte `protobuf:"bytes,4,opt,name=serverRandom" json:"serverRandom,omitempty"` + // If registration wrong, populate this error string + Error *string `protobuf:"bytes,5,opt,name=error" json:"error,omitempty"` + // ClientConf field (optional) + ClientConf *ClientConf `protobuf:"bytes,6,opt,name=clientConf" json:"clientConf,omitempty"` + // Transport Params to if `allow_registrar_overrides` is set. + TransportParams *anypb.Any `protobuf:"bytes,10,opt,name=transport_params,json=transportParams" json:"transport_params,omitempty"` + // PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + // handle phantom connections to randomized ports. + PhantomsSupportPortRand *bool `protobuf:"varint,11,opt,name=phantoms_support_port_rand,json=phantomsSupportPortRand" json:"phantoms_support_port_rand,omitempty"` +} + +func (x *RegistrationResponse) Reset() { + *x = RegistrationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegistrationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegistrationResponse) ProtoMessage() {} + +func (x *RegistrationResponse) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegistrationResponse.ProtoReflect.Descriptor instead. +func (*RegistrationResponse) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{20} +} + +func (x *RegistrationResponse) GetIpv4Addr() uint32 { + if x != nil && x.Ipv4Addr != nil { + return *x.Ipv4Addr + } + return 0 +} + +func (x *RegistrationResponse) GetIpv6Addr() []byte { + if x != nil { + return x.Ipv6Addr + } + return nil +} + +func (x *RegistrationResponse) GetDstPort() uint32 { + if x != nil && x.DstPort != nil { + return *x.DstPort + } + return 0 +} + +func (x *RegistrationResponse) GetServerRandom() []byte { + if x != nil { + return x.ServerRandom + } + return nil +} + +func (x *RegistrationResponse) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" +} + +func (x *RegistrationResponse) GetClientConf() *ClientConf { + if x != nil { + return x.ClientConf + } + return nil +} + +func (x *RegistrationResponse) GetTransportParams() *anypb.Any { + if x != nil { + return x.TransportParams + } + return nil +} + +func (x *RegistrationResponse) GetPhantomsSupportPortRand() bool { + if x != nil && x.PhantomsSupportPortRand != nil { + return *x.PhantomsSupportPortRand + } + return false +} + +// response from dns +type DnsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success *bool `protobuf:"varint,1,opt,name=success" json:"success,omitempty"` + ClientconfOutdated *bool `protobuf:"varint,2,opt,name=clientconf_outdated,json=clientconfOutdated" json:"clientconf_outdated,omitempty"` + BidirectionalResponse *RegistrationResponse `protobuf:"bytes,3,opt,name=bidirectional_response,json=bidirectionalResponse" json:"bidirectional_response,omitempty"` +} + +func (x *DnsResponse) Reset() { + *x = DnsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_signalling_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DnsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DnsResponse) ProtoMessage() {} + +func (x *DnsResponse) ProtoReflect() protoreflect.Message { + mi := &file_signalling_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DnsResponse.ProtoReflect.Descriptor instead. +func (*DnsResponse) Descriptor() ([]byte, []int) { + return file_signalling_proto_rawDescGZIP(), []int{21} +} + +func (x *DnsResponse) GetSuccess() bool { + if x != nil && x.Success != nil { + return *x.Success + } + return false +} + +func (x *DnsResponse) GetClientconfOutdated() bool { + if x != nil && x.ClientconfOutdated != nil { + return *x.ClientconfOutdated + } + return false +} + +func (x *DnsResponse) GetBidirectionalResponse() *RegistrationResponse { + if x != nil { + return x.BidirectionalResponse + } + return nil +} + +var File_signalling_proto protoreflect.FileDescriptor + +var file_signalling_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3e, 0x0a, 0x06, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x22, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x0c, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x63, 0x6f, + 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x07, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, + 0x08, 0x69, 0x70, 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x69, 0x70, 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x63, + 0x70, 0x77, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x63, 0x70, 0x77, + 0x69, 0x6e, 0x22, 0xcb, 0x02, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x65, + 0x63, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x4b, 0x0a, 0x14, 0x70, 0x68, 0x61, 0x6e, + 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, + 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x12, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x72, 0x65, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x6a, 0x75, 0x72, 0x65, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x0c, 0x64, + 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x67, + 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x0a, 0x64, 0x6e, 0x73, 0x52, 0x65, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x22, 0xdd, 0x01, 0x0a, 0x0a, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x12, + 0x39, 0x0a, 0x0e, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x67, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x44, 0x6e, 0x73, 0x52, 0x65, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0c, 0x64, 0x6e, + 0x73, 0x52, 0x65, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x02, + 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x74, 0x6c, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x75, + 0x74, 0x6c, 0x73, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x75, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x22, 0x3f, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x0a, + 0x0a, 0x74, 0x6c, 0x73, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x63, + 0x6f, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x74, 0x6c, 0x73, 0x44, 0x65, 0x63, 0x6f, 0x79, + 0x73, 0x22, 0x56, 0x0a, 0x12, 0x50, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, + 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x10, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x68, 0x61, 0x6e, 0x74, 0x6f, + 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x0f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x64, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x22, 0x70, 0x0a, 0x0e, 0x50, 0x68, 0x61, + 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x6f, 0x0a, 0x12, 0x57, + 0x65, 0x62, 0x52, 0x54, 0x43, 0x49, 0x43, 0x45, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x70, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x04, 0x52, 0x07, 0x69, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, + 0x69, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x07, + 0x69, 0x70, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x73, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5a, 0x0a, 0x09, + 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, 0x53, 0x44, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, + 0x49, 0x43, 0x45, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x61, + 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x0c, 0x57, 0x65, 0x62, 0x52, + 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x03, + 0x73, 0x64, 0x70, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, 0x53, 0x44, 0x50, 0x52, 0x03, 0x73, 0x64, 0x70, + 0x22, 0x2a, 0x0a, 0x04, 0x41, 0x64, 0x64, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x49, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xb5, 0x01, 0x0a, + 0x13, 0x44, 0x54, 0x4c, 0x53, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x09, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x34, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x41, 0x64, 0x64, 0x72, 0x52, 0x08, 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x34, 0x12, 0x28, + 0x0a, 0x09, 0x73, 0x72, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x52, 0x08, + 0x73, 0x72, 0x63, 0x41, 0x64, 0x64, 0x72, 0x36, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x44, + 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x75, 0x6e, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x22, 0xc2, 0x02, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x6f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x32, 0x43, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x34, 0x0a, 0x0a, 0x65, 0x72, 0x72, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x53, 0x32, 0x43, 0x52, 0x09, 0x65, 0x72, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x6d, 0x70, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6d, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x72, 0x6b, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x64, 0x61, 0x72, 0x6b, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x5f, 0x54, 0x49, 0x4c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x73, 0x65, 0x54, 0x49, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x70, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x22, 0xa8, 0x06, 0x0a, 0x0f, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x65, + 0x63, 0x6f, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x64, 0x65, 0x63, 0x6f, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, + 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x43, 0x32, 0x53, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x79, 0x6e, + 0x63, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x62, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x3e, 0x0a, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x61, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x61, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, + 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x44, 0x65, + 0x63, 0x6f, 0x79, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x32, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x3f, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6d, + 0x61, 0x73, 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6d, + 0x61, 0x73, 0x6b, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x36, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x76, 0x36, 0x53, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x34, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x76, 0x34, 0x53, 0x75, 0x70, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x61, + 0x67, 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x77, 0x65, 0x62, 0x72, 0x74, 0x63, 0x5f, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x0c, + 0x77, 0x65, 0x62, 0x72, 0x74, 0x63, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xaa, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, + 0x7a, 0x65, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x44, 0x73, 0x74, 0x50, + 0x6f, 0x72, 0x74, 0x22, 0x46, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x44, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xc2, 0x03, 0x0a, 0x0a, + 0x43, 0x32, 0x53, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x49, 0x0a, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x4a, 0x0a, 0x13, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x63, + 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x50, + 0x0a, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x14, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x52, 0x65, 0x73, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x67, 0x52, 0x65, 0x73, 0x70, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x52, 0x65, 0x73, 0x70, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, + 0x52, 0x65, 0x67, 0x52, 0x65, 0x73, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0xdd, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, + 0x79, 0x73, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x12, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x74, 0x74, 0x5f, 0x74, 0x6f, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x72, 0x74, 0x74, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0c, + 0x74, 0x6c, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x26, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6c, 0x73, 0x54, 0x6f, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x12, 0x20, + 0x0a, 0x0c, 0x74, 0x63, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x63, 0x70, 0x54, 0x6f, 0x44, 0x65, 0x63, 0x6f, 0x79, + 0x22, 0x82, 0x02, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, + 0x6d, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x68, 0x61, 0x6e, + 0x74, 0x6f, 0x6d, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4e, + 0x73, 0x12, 0x36, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x72, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x24, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x50, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, + 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, + 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x69, 0x70, + 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x73, 0x74, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x0a, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x3f, + 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x3b, 0x0a, 0x1a, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x17, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x73, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x22, 0xac, 0x01, 0x0a, + 0x0b, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x6f, 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x6f, 0x6e, 0x66, 0x4f, + 0x75, 0x74, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x16, 0x62, 0x69, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x15, 0x62, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x2b, 0x0a, 0x07, 0x4b, + 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x47, 0x43, + 0x4d, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x5a, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x47, + 0x43, 0x4d, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x5b, 0x2a, 0x29, 0x0a, 0x0c, 0x44, 0x6e, 0x73, 0x52, + 0x65, 0x67, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4f, + 0x48, 0x10, 0x03, 0x2a, 0xe7, 0x01, 0x0a, 0x0e, 0x43, 0x32, 0x53, 0x5f, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x32, 0x53, 0x5f, 0x4e, 0x4f, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x32, 0x53, + 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, + 0x1b, 0x0a, 0x17, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, + 0x43, 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, + 0x4e, 0x45, 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, + 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, + 0x10, 0x43, 0x32, 0x53, 0x5f, 0x59, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, + 0x44, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x32, 0x53, 0x5f, 0x41, 0x43, 0x51, 0x55, 0x49, + 0x52, 0x45, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x43, + 0x32, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, + 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x06, 0x12, 0x0e, 0x0a, + 0x09, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0x98, 0x01, + 0x0a, 0x0e, 0x53, 0x32, 0x43, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x32, 0x43, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, + 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x32, 0x43, + 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, + 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x32, 0x43, 0x5f, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x52, 0x4d, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, + 0x02, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x09, 0x53, 0x32, 0x43, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0xac, 0x01, 0x0a, 0x0e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x32, 0x43, 0x12, 0x0c, 0x0a, 0x08, 0x4e, + 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, + 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x44, 0x45, 0x43, 0x4f, 0x59, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, + 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, + 0x4d, 0x10, 0x64, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, + 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x65, 0x2a, 0x82, 0x01, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x75, 0x6c, + 0x6c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x4f, 0x62, 0x66, 0x73, 0x34, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x54, 0x4c, 0x53, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x04, 0x12, 0x08, 0x0a, + 0x04, 0x75, 0x54, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x53, 0x4d, 0x10, 0x07, 0x12, 0x07, 0x0a, + 0x03, 0x46, 0x54, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x51, 0x75, 0x69, 0x63, 0x10, 0x09, + 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x72, 0x74, 0x63, 0x10, 0x63, 0x2a, 0x86, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x50, 0x49, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x41, 0x50, 0x49, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x05, 0x12, + 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x44, 0x4e, 0x53, 0x10, 0x06, 0x2a, 0x40, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x65, 0x77, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, + 0x43, 0x6c, 0x65, 0x61, 0x72, 0x10, 0x03, 0x2a, 0x24, 0x0a, 0x07, 0x49, 0x50, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x6e, 0x6b, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, + 0x63, 0x70, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x64, 0x70, 0x10, 0x02, +} + +var ( + file_signalling_proto_rawDescOnce sync.Once + file_signalling_proto_rawDescData = file_signalling_proto_rawDesc +) + +func file_signalling_proto_rawDescGZIP() []byte { + file_signalling_proto_rawDescOnce.Do(func() { + file_signalling_proto_rawDescData = protoimpl.X.CompressGZIP(file_signalling_proto_rawDescData) + }) + return file_signalling_proto_rawDescData +} + +var file_signalling_proto_enumTypes = make([]protoimpl.EnumInfo, 9) +var file_signalling_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_signalling_proto_goTypes = []interface{}{ + (KeyType)(0), // 0: proto.KeyType + (DnsRegMethod)(0), // 1: proto.DnsRegMethod + (C2S_Transition)(0), // 2: proto.C2S_Transition + (S2C_Transition)(0), // 3: proto.S2C_Transition + (ErrorReasonS2C)(0), // 4: proto.ErrorReasonS2C + (TransportType)(0), // 5: proto.TransportType + (RegistrationSource)(0), // 6: proto.RegistrationSource + (StationOperations)(0), // 7: proto.StationOperations + (IPProto)(0), // 8: proto.IPProto + (*PubKey)(nil), // 9: proto.PubKey + (*TLSDecoySpec)(nil), // 10: proto.TLSDecoySpec + (*ClientConf)(nil), // 11: proto.ClientConf + (*DnsRegConf)(nil), // 12: proto.DnsRegConf + (*DecoyList)(nil), // 13: proto.DecoyList + (*PhantomSubnetsList)(nil), // 14: proto.PhantomSubnetsList + (*PhantomSubnets)(nil), // 15: proto.PhantomSubnets + (*WebRTCICECandidate)(nil), // 16: proto.WebRTCICECandidate + (*WebRTCSDP)(nil), // 17: proto.WebRTCSDP + (*WebRTCSignal)(nil), // 18: proto.WebRTCSignal + (*Addr)(nil), // 19: proto.Addr + (*DTLSTransportParams)(nil), // 20: proto.DTLSTransportParams + (*StationToClient)(nil), // 21: proto.StationToClient + (*RegistrationFlags)(nil), // 22: proto.RegistrationFlags + (*ClientToStation)(nil), // 23: proto.ClientToStation + (*PrefixTransportParams)(nil), // 24: proto.PrefixTransportParams + (*GenericTransportParams)(nil), // 25: proto.GenericTransportParams + (*C2SWrapper)(nil), // 26: proto.C2SWrapper + (*SessionStats)(nil), // 27: proto.SessionStats + (*StationToDetector)(nil), // 28: proto.StationToDetector + (*RegistrationResponse)(nil), // 29: proto.RegistrationResponse + (*DnsResponse)(nil), // 30: proto.DnsResponse + (*anypb.Any)(nil), // 31: google.protobuf.Any +} +var file_signalling_proto_depIdxs = []int32{ + 0, // 0: proto.PubKey.type:type_name -> proto.KeyType + 9, // 1: proto.TLSDecoySpec.pubkey:type_name -> proto.PubKey + 13, // 2: proto.ClientConf.decoy_list:type_name -> proto.DecoyList + 9, // 3: proto.ClientConf.default_pubkey:type_name -> proto.PubKey + 14, // 4: proto.ClientConf.phantom_subnets_list:type_name -> proto.PhantomSubnetsList + 9, // 5: proto.ClientConf.conjure_pubkey:type_name -> proto.PubKey + 12, // 6: proto.ClientConf.dns_reg_conf:type_name -> proto.DnsRegConf + 1, // 7: proto.DnsRegConf.dns_reg_method:type_name -> proto.DnsRegMethod + 10, // 8: proto.DecoyList.tls_decoys:type_name -> proto.TLSDecoySpec + 15, // 9: proto.PhantomSubnetsList.weighted_subnets:type_name -> proto.PhantomSubnets + 16, // 10: proto.WebRTCSDP.candidates:type_name -> proto.WebRTCICECandidate + 17, // 11: proto.WebRTCSignal.sdp:type_name -> proto.WebRTCSDP + 19, // 12: proto.DTLSTransportParams.src_addr4:type_name -> proto.Addr + 19, // 13: proto.DTLSTransportParams.src_addr6:type_name -> proto.Addr + 3, // 14: proto.StationToClient.state_transition:type_name -> proto.S2C_Transition + 11, // 15: proto.StationToClient.config_info:type_name -> proto.ClientConf + 4, // 16: proto.StationToClient.err_reason:type_name -> proto.ErrorReasonS2C + 2, // 17: proto.ClientToStation.state_transition:type_name -> proto.C2S_Transition + 27, // 18: proto.ClientToStation.stats:type_name -> proto.SessionStats + 5, // 19: proto.ClientToStation.transport:type_name -> proto.TransportType + 31, // 20: proto.ClientToStation.transport_params:type_name -> google.protobuf.Any + 22, // 21: proto.ClientToStation.flags:type_name -> proto.RegistrationFlags + 18, // 22: proto.ClientToStation.webrtc_signal:type_name -> proto.WebRTCSignal + 23, // 23: proto.C2SWrapper.registration_payload:type_name -> proto.ClientToStation + 6, // 24: proto.C2SWrapper.registration_source:type_name -> proto.RegistrationSource + 29, // 25: proto.C2SWrapper.registration_response:type_name -> proto.RegistrationResponse + 7, // 26: proto.StationToDetector.operation:type_name -> proto.StationOperations + 8, // 27: proto.StationToDetector.proto:type_name -> proto.IPProto + 11, // 28: proto.RegistrationResponse.clientConf:type_name -> proto.ClientConf + 31, // 29: proto.RegistrationResponse.transport_params:type_name -> google.protobuf.Any + 29, // 30: proto.DnsResponse.bidirectional_response:type_name -> proto.RegistrationResponse + 31, // [31:31] is the sub-list for method output_type + 31, // [31:31] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name +} + +func init() { file_signalling_proto_init() } +func file_signalling_proto_init() { + if File_signalling_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_signalling_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PubKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TLSDecoySpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientConf); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DnsRegConf); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DecoyList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PhantomSubnetsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PhantomSubnets); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WebRTCICECandidate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WebRTCSDP); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WebRTCSignal); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Addr); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DTLSTransportParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StationToClient); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegistrationFlags); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientToStation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PrefixTransportParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericTransportParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*C2SWrapper); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SessionStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StationToDetector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegistrationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_signalling_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DnsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_signalling_proto_rawDesc, + NumEnums: 9, + NumMessages: 22, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_signalling_proto_goTypes, + DependencyIndexes: file_signalling_proto_depIdxs, + EnumInfos: file_signalling_proto_enumTypes, + MessageInfos: file_signalling_proto_msgTypes, + }.Build() + File_signalling_proto = out.File + file_signalling_proto_rawDesc = nil + file_signalling_proto_goTypes = nil + file_signalling_proto_depIdxs = nil +} diff --git a/vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.proto b/vendor/github.com/refraction-networking/conjure/proto/signalling.proto similarity index 68% rename from vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.proto rename to vendor/github.com/refraction-networking/conjure/proto/signalling.proto index c4130893d..1870e0f49 100644 --- a/vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.proto +++ b/vendor/github.com/refraction-networking/conjure/proto/signalling.proto @@ -4,7 +4,9 @@ syntax = "proto2"; // At some point we will want to migrate to proto3, but we are not // using any proto3 features yet. -package tapdance; +package proto; + +import "google/protobuf/any.proto"; enum KeyType { AES_GCM_128 = 90; @@ -85,6 +87,23 @@ message ClientConf { optional PubKey default_pubkey = 3; optional PhantomSubnetsList phantom_subnets_list = 4; optional PubKey conjure_pubkey = 5; + optional DnsRegConf dns_reg_conf = 6; +} + +// Configuration for DNS registrar +message DnsRegConf { + required DnsRegMethod dns_reg_method = 1; + optional string target = 2; + required string domain = 3; + optional bytes pubkey = 4; + optional string utls_distribution = 5; + optional string stun_server = 6; +} + +enum DnsRegMethod { + UDP = 1; + DOT = 2; + DOH = 3; } message DecoyList { @@ -98,6 +117,7 @@ message PhantomSubnetsList{ message PhantomSubnets{ optional uint32 weight = 1; repeated string subnets = 2; + optional bool randomize_dst_port = 3; } // State transitions of the client @@ -140,7 +160,14 @@ enum ErrorReasonS2C { enum TransportType { Null = 0; Min = 1; // Send a 32-byte HMAC id to let the station distinguish registrations to same host - Obfs4 = 2; // Not implemented yet? + Obfs4 = 2; + DTLS = 3; // UDP transport: DTLS + Prefix = 4; // dynamic prefix transport (and updated Min) + uTLS = 5; // uTLS based transport + Format = 6; // Formatting transport - format first, format all + WASM = 7; // WebAssembly + FTE = 8; // Format transforming encryption + Quic = 9; // quic transport? Webrtc = 99; // UDP transport: WebRTC DataChannel } @@ -155,7 +182,7 @@ message WebRTCICECandidate { // Deflated SDP for WebRTC by seed2sdp package message WebRTCSDP { - required uint32 type = 1; + required uint32 type = 1; repeated WebRTCICECandidate candidates = 2; // there could be multiple candidates } @@ -165,6 +192,19 @@ message WebRTCSignal { required WebRTCSDP sdp = 2; } +message Addr { + optional bytes IP = 1; + optional uint32 Port = 2; +} + +message DTLSTransportParams { + optional Addr src_addr4 = 1; + optional Addr src_addr6 = 2; + optional bool randomize_dst_port = 3; + // Unordered sets the reliability of the DTLS stream to unordered + optional bool unordered = 4; +} + message StationToClient { // Should accompany (at least) SESSION_INIT and CONFIRM_RECONNECT. optional uint32 protocol_version = 1; @@ -212,6 +252,14 @@ message ClientToStation { // YIELD=>ACQUIRE switchover is happening. optional uint64 upload_sync = 4; + // High level client library version used for indicating feature support, or + // lack therof. + optional uint32 client_lib_version = 5; + + // Indicates whether the client will allow the registrar to provide alternative parameters that + // may work better in substitute for the deterministically selected parameters. This only works + // for bidirectional registration methods where the client receives a RegistrationResponse. + optional bool disable_registrar_overrides = 6; // List of decoys that client have unsuccessfully tried in current session. // Could be sent in chunks @@ -222,6 +270,8 @@ message ClientToStation { // NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy optional TransportType transport = 12; + optional google.protobuf.Any transport_params = 13; + // Station is only required to check this variable during session initialization. // If set, station must facilitate connection to said target by itself, i.e. write into squid // socket an HTTP/SOCKS/any other connection request. @@ -241,24 +291,54 @@ message ClientToStation { optional RegistrationFlags flags = 24; // Transport Extensions + // TODO(jmwample) - move to WebRTC specific transport params protobuf message. optional WebRTCSignal webrtc_signal = 31; - + // Random-sized junk to defeat packet size fingerprinting. optional bytes padding = 100; } +message PrefixTransportParams { + // Prefix Identifier + optional int32 prefix_id = 1; + + // Prefix bytes (optional - usually sent from station to client as override if allowed by C2S) + // as the station cannot take this into account when attempting to identify a connection. + optional bytes prefix = 2; + optional int32 custom_flush_policy = 3; + + // // potential future fields + // obfuscator ID + // tagEncoder ID (¶ms?, e.g. format-base64 / padding) + // streamEncoder ID (¶ms?, e.g. foramat-base64 / padding) + + // Indicates whether the client has elected to use destination port randomization. Should be + // checked against selected transport to ensure that destination port randomization is + // supported. + optional bool randomize_dst_port = 13; +} + +message GenericTransportParams { + // Indicates whether the client has elected to use destination port randomization. Should be + // checked against selected transport to ensure that destination port randomization is + // supported. + optional bool randomize_dst_port = 13; +} + enum RegistrationSource { Unspecified = 0; Detector = 1; API = 2; DetectorPrescan = 3; BidirectionalAPI = 4; + DNS = 5; + BidirectionalDNS = 6; } message C2SWrapper { optional bytes shared_secret = 1; - optional ClientToStation registration_payload = 3; + optional ClientToStation registration_payload = 3; optional RegistrationSource registration_source = 4; // client source address when receiving a registration @@ -267,7 +347,21 @@ message C2SWrapper { // Decoy address used when registering over Decoy registrar optional bytes decoy_address = 7; + // The next three fields allow an independent registrar (trusted by a station w/ a zmq keypair) to + // share the registration overrides that it assigned to the client with the station(s). + // Registration Respose is here to allow a parsed object with direct access to the fields within. + // RegRespBytes provides a serialized verion of the Registration response so that the signature of + // the Bidirectional registrar can be validated before a station applies any overrides present in + // the Registration Response. + // + // If you are reading this in the future and you want to extend the functionality here it might + // make sense to make the RegistrationResponse that is sent to the client a distinct message from + // the one that gets sent to the stations. optional RegistrationResponse registration_response = 8; + optional bytes RegRespBytes = 9; + optional bytes RegRespSignature = 10; + + } message SessionStats { @@ -284,21 +378,40 @@ message SessionStats { optional uint32 tcp_to_decoy = 39; // measured when establishing tcp connection to decot } +enum StationOperations { + Unknown = 0; + New = 1; + Update = 2; + Clear = 3; +} + +enum IPProto { + Unk = 0; + Tcp = 1; + Udp = 2; +} + message StationToDetector { optional string phantom_ip = 1; optional string client_ip = 2; optional uint64 timeout_ns = 3; + + optional StationOperations operation = 4; + + optional uint32 dst_port = 10; + optional uint32 src_port = 11; + optional IPProto proto = 12; } -// Adding message response from Station to Client for birdirectional API +// Adding message response from Station to Client for bidirectional API message RegistrationResponse { optional fixed32 ipv4addr = 1; // The 128-bit ipv6 address, in network byte order optional bytes ipv6addr = 2; // Respond with randomized port - optional uint32 port = 3; + optional uint32 dst_port = 3; // Future: station provides client with secret, want chanel present // Leave null for now @@ -309,5 +422,18 @@ message RegistrationResponse { // ClientConf field (optional) optional ClientConf clientConf = 6; + + // Transport Params to if `allow_registrar_overrides` is set. + optional google.protobuf.Any transport_params = 10; + + // PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + // handle phantom connections to randomized ports. + optional bool phantoms_support_port_rand = 11; } +// response from dns +message DnsResponse { + optional bool success = 1; + optional bool clientconf_outdated = 2; + optional RegistrationResponse bidirectional_response = 3; +} diff --git a/vendor/github.com/refraction-networking/conjure/proto/signalling.rs b/vendor/github.com/refraction-networking/conjure/proto/signalling.rs new file mode 100644 index 000000000..f70cc7c10 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/proto/signalling.rs @@ -0,0 +1,7937 @@ +// This file is generated by rust-protobuf 3.2.0. Do not edit +// .proto file is parsed by protoc --rust-out=... +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_results)] +#![allow(unused_mut)] + +//! Generated file from `signalling.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0; + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.PubKey) +pub struct PubKey { + // message fields + /// A public key, as used by the station. + // @@protoc_insertion_point(field:proto.PubKey.key) + pub key: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.PubKey.type) + pub type_: ::std::option::Option<::protobuf::EnumOrUnknown>, + // special fields + // @@protoc_insertion_point(special_field:proto.PubKey.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a PubKey { + fn default() -> &'a PubKey { + ::default_instance() + } +} + +impl PubKey { + pub fn new() -> PubKey { + ::std::default::Default::default() + } + + // optional bytes key = 1; + + pub fn key(&self) -> &[u8] { + match self.key.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_key(&mut self) { + self.key = ::std::option::Option::None; + } + + pub fn has_key(&self) -> bool { + self.key.is_some() + } + + // Param is passed by value, moved + pub fn set_key(&mut self, v: ::std::vec::Vec) { + self.key = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_key(&mut self) -> &mut ::std::vec::Vec { + if self.key.is_none() { + self.key = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.key.as_mut().unwrap() + } + + // Take field + pub fn take_key(&mut self) -> ::std::vec::Vec { + self.key.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional .proto.KeyType type = 2; + + pub fn type_(&self) -> KeyType { + match self.type_ { + Some(e) => e.enum_value_or(KeyType::AES_GCM_128), + None => KeyType::AES_GCM_128, + } + } + + pub fn clear_type_(&mut self) { + self.type_ = ::std::option::Option::None; + } + + pub fn has_type(&self) -> bool { + self.type_.is_some() + } + + // Param is passed by value, moved + pub fn set_type(&mut self, v: KeyType) { + self.type_ = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "key", + |m: &PubKey| { &m.key }, + |m: &mut PubKey| { &mut m.key }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "type", + |m: &PubKey| { &m.type_ }, + |m: &mut PubKey| { &mut m.type_ }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "PubKey", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for PubKey { + const NAME: &'static str = "PubKey"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.key = ::std::option::Option::Some(is.read_bytes()?); + }, + 16 => { + self.type_ = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.key.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.type_ { + my_size += ::protobuf::rt::int32_size(2, v.value()); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.key.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.type_ { + os.write_enum(2, ::protobuf::EnumOrUnknown::value(&v))?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> PubKey { + PubKey::new() + } + + fn clear(&mut self) { + self.key = ::std::option::Option::None; + self.type_ = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static PubKey { + static instance: PubKey = PubKey { + key: ::std::option::Option::None, + type_: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for PubKey { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("PubKey").unwrap()).clone() + } +} + +impl ::std::fmt::Display for PubKey { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for PubKey { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.TLSDecoySpec) +pub struct TLSDecoySpec { + // message fields + /// The hostname/SNI to use for this host + /// + /// The hostname is the only required field, although other + /// fields are expected to be present in most cases. + // @@protoc_insertion_point(field:proto.TLSDecoySpec.hostname) + pub hostname: ::std::option::Option<::std::string::String>, + /// The 32-bit ipv4 address, in network byte order + /// + /// If the IPv4 address is absent, then it may be resolved via + /// DNS by the client, or the client may discard this decoy spec + /// if local DNS is untrusted, or the service may be multihomed. + // @@protoc_insertion_point(field:proto.TLSDecoySpec.ipv4addr) + pub ipv4addr: ::std::option::Option, + /// The 128-bit ipv6 address, in network byte order + // @@protoc_insertion_point(field:proto.TLSDecoySpec.ipv6addr) + pub ipv6addr: ::std::option::Option<::std::vec::Vec>, + /// The Tapdance station public key to use when contacting this + /// decoy + /// + /// If omitted, the default station public key (if any) is used. + // @@protoc_insertion_point(field:proto.TLSDecoySpec.pubkey) + pub pubkey: ::protobuf::MessageField, + /// The maximum duration, in milliseconds, to maintain an open + /// connection to this decoy (because the decoy may close the + /// connection itself after this length of time) + /// + /// If omitted, a default of 30,000 milliseconds is assumed. + // @@protoc_insertion_point(field:proto.TLSDecoySpec.timeout) + pub timeout: ::std::option::Option, + /// The maximum TCP window size to attempt to use for this decoy. + /// + /// If omitted, a default of 15360 is assumed. + /// + /// TODO: the default is based on the current heuristic of only + /// using decoys that permit windows of 15KB or larger. If this + /// heuristic changes, then this default doesn't make sense. + // @@protoc_insertion_point(field:proto.TLSDecoySpec.tcpwin) + pub tcpwin: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.TLSDecoySpec.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a TLSDecoySpec { + fn default() -> &'a TLSDecoySpec { + ::default_instance() + } +} + +impl TLSDecoySpec { + pub fn new() -> TLSDecoySpec { + ::std::default::Default::default() + } + + // optional string hostname = 1; + + pub fn hostname(&self) -> &str { + match self.hostname.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_hostname(&mut self) { + self.hostname = ::std::option::Option::None; + } + + pub fn has_hostname(&self) -> bool { + self.hostname.is_some() + } + + // Param is passed by value, moved + pub fn set_hostname(&mut self, v: ::std::string::String) { + self.hostname = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_hostname(&mut self) -> &mut ::std::string::String { + if self.hostname.is_none() { + self.hostname = ::std::option::Option::Some(::std::string::String::new()); + } + self.hostname.as_mut().unwrap() + } + + // Take field + pub fn take_hostname(&mut self) -> ::std::string::String { + self.hostname.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional fixed32 ipv4addr = 2; + + pub fn ipv4addr(&self) -> u32 { + self.ipv4addr.unwrap_or(0) + } + + pub fn clear_ipv4addr(&mut self) { + self.ipv4addr = ::std::option::Option::None; + } + + pub fn has_ipv4addr(&self) -> bool { + self.ipv4addr.is_some() + } + + // Param is passed by value, moved + pub fn set_ipv4addr(&mut self, v: u32) { + self.ipv4addr = ::std::option::Option::Some(v); + } + + // optional bytes ipv6addr = 6; + + pub fn ipv6addr(&self) -> &[u8] { + match self.ipv6addr.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_ipv6addr(&mut self) { + self.ipv6addr = ::std::option::Option::None; + } + + pub fn has_ipv6addr(&self) -> bool { + self.ipv6addr.is_some() + } + + // Param is passed by value, moved + pub fn set_ipv6addr(&mut self, v: ::std::vec::Vec) { + self.ipv6addr = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_ipv6addr(&mut self) -> &mut ::std::vec::Vec { + if self.ipv6addr.is_none() { + self.ipv6addr = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.ipv6addr.as_mut().unwrap() + } + + // Take field + pub fn take_ipv6addr(&mut self) -> ::std::vec::Vec { + self.ipv6addr.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional uint32 timeout = 4; + + pub fn timeout(&self) -> u32 { + self.timeout.unwrap_or(0) + } + + pub fn clear_timeout(&mut self) { + self.timeout = ::std::option::Option::None; + } + + pub fn has_timeout(&self) -> bool { + self.timeout.is_some() + } + + // Param is passed by value, moved + pub fn set_timeout(&mut self, v: u32) { + self.timeout = ::std::option::Option::Some(v); + } + + // optional uint32 tcpwin = 5; + + pub fn tcpwin(&self) -> u32 { + self.tcpwin.unwrap_or(0) + } + + pub fn clear_tcpwin(&mut self) { + self.tcpwin = ::std::option::Option::None; + } + + pub fn has_tcpwin(&self) -> bool { + self.tcpwin.is_some() + } + + // Param is passed by value, moved + pub fn set_tcpwin(&mut self, v: u32) { + self.tcpwin = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(6); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "hostname", + |m: &TLSDecoySpec| { &m.hostname }, + |m: &mut TLSDecoySpec| { &mut m.hostname }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ipv4addr", + |m: &TLSDecoySpec| { &m.ipv4addr }, + |m: &mut TLSDecoySpec| { &mut m.ipv4addr }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ipv6addr", + |m: &TLSDecoySpec| { &m.ipv6addr }, + |m: &mut TLSDecoySpec| { &mut m.ipv6addr }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PubKey>( + "pubkey", + |m: &TLSDecoySpec| { &m.pubkey }, + |m: &mut TLSDecoySpec| { &mut m.pubkey }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "timeout", + |m: &TLSDecoySpec| { &m.timeout }, + |m: &mut TLSDecoySpec| { &mut m.timeout }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "tcpwin", + |m: &TLSDecoySpec| { &m.tcpwin }, + |m: &mut TLSDecoySpec| { &mut m.tcpwin }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "TLSDecoySpec", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for TLSDecoySpec { + const NAME: &'static str = "TLSDecoySpec"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.hostname = ::std::option::Option::Some(is.read_string()?); + }, + 21 => { + self.ipv4addr = ::std::option::Option::Some(is.read_fixed32()?); + }, + 50 => { + self.ipv6addr = ::std::option::Option::Some(is.read_bytes()?); + }, + 26 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.pubkey)?; + }, + 32 => { + self.timeout = ::std::option::Option::Some(is.read_uint32()?); + }, + 40 => { + self.tcpwin = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.hostname.as_ref() { + my_size += ::protobuf::rt::string_size(1, &v); + } + if let Some(v) = self.ipv4addr { + my_size += 1 + 4; + } + if let Some(v) = self.ipv6addr.as_ref() { + my_size += ::protobuf::rt::bytes_size(6, &v); + } + if let Some(v) = self.pubkey.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.timeout { + my_size += ::protobuf::rt::uint32_size(4, v); + } + if let Some(v) = self.tcpwin { + my_size += ::protobuf::rt::uint32_size(5, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.hostname.as_ref() { + os.write_string(1, v)?; + } + if let Some(v) = self.ipv4addr { + os.write_fixed32(2, v)?; + } + if let Some(v) = self.ipv6addr.as_ref() { + os.write_bytes(6, v)?; + } + if let Some(v) = self.pubkey.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?; + } + if let Some(v) = self.timeout { + os.write_uint32(4, v)?; + } + if let Some(v) = self.tcpwin { + os.write_uint32(5, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> TLSDecoySpec { + TLSDecoySpec::new() + } + + fn clear(&mut self) { + self.hostname = ::std::option::Option::None; + self.ipv4addr = ::std::option::Option::None; + self.ipv6addr = ::std::option::Option::None; + self.pubkey.clear(); + self.timeout = ::std::option::Option::None; + self.tcpwin = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static TLSDecoySpec { + static instance: TLSDecoySpec = TLSDecoySpec { + hostname: ::std::option::Option::None, + ipv4addr: ::std::option::Option::None, + ipv6addr: ::std::option::Option::None, + pubkey: ::protobuf::MessageField::none(), + timeout: ::std::option::Option::None, + tcpwin: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for TLSDecoySpec { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("TLSDecoySpec").unwrap()).clone() + } +} + +impl ::std::fmt::Display for TLSDecoySpec { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for TLSDecoySpec { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.ClientConf) +pub struct ClientConf { + // message fields + // @@protoc_insertion_point(field:proto.ClientConf.decoy_list) + pub decoy_list: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.ClientConf.generation) + pub generation: ::std::option::Option, + // @@protoc_insertion_point(field:proto.ClientConf.default_pubkey) + pub default_pubkey: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.ClientConf.phantom_subnets_list) + pub phantom_subnets_list: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.ClientConf.conjure_pubkey) + pub conjure_pubkey: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.ClientConf.dns_reg_conf) + pub dns_reg_conf: ::protobuf::MessageField, + // special fields + // @@protoc_insertion_point(special_field:proto.ClientConf.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a ClientConf { + fn default() -> &'a ClientConf { + ::default_instance() + } +} + +impl ClientConf { + pub fn new() -> ClientConf { + ::std::default::Default::default() + } + + // optional uint32 generation = 2; + + pub fn generation(&self) -> u32 { + self.generation.unwrap_or(0) + } + + pub fn clear_generation(&mut self) { + self.generation = ::std::option::Option::None; + } + + pub fn has_generation(&self) -> bool { + self.generation.is_some() + } + + // Param is passed by value, moved + pub fn set_generation(&mut self, v: u32) { + self.generation = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(6); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, DecoyList>( + "decoy_list", + |m: &ClientConf| { &m.decoy_list }, + |m: &mut ClientConf| { &mut m.decoy_list }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "generation", + |m: &ClientConf| { &m.generation }, + |m: &mut ClientConf| { &mut m.generation }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PubKey>( + "default_pubkey", + |m: &ClientConf| { &m.default_pubkey }, + |m: &mut ClientConf| { &mut m.default_pubkey }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PhantomSubnetsList>( + "phantom_subnets_list", + |m: &ClientConf| { &m.phantom_subnets_list }, + |m: &mut ClientConf| { &mut m.phantom_subnets_list }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, PubKey>( + "conjure_pubkey", + |m: &ClientConf| { &m.conjure_pubkey }, + |m: &mut ClientConf| { &mut m.conjure_pubkey }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, DnsRegConf>( + "dns_reg_conf", + |m: &ClientConf| { &m.dns_reg_conf }, + |m: &mut ClientConf| { &mut m.dns_reg_conf }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "ClientConf", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for ClientConf { + const NAME: &'static str = "ClientConf"; + + fn is_initialized(&self) -> bool { + for v in &self.decoy_list { + if !v.is_initialized() { + return false; + } + }; + for v in &self.default_pubkey { + if !v.is_initialized() { + return false; + } + }; + for v in &self.phantom_subnets_list { + if !v.is_initialized() { + return false; + } + }; + for v in &self.conjure_pubkey { + if !v.is_initialized() { + return false; + } + }; + for v in &self.dns_reg_conf { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.decoy_list)?; + }, + 16 => { + self.generation = ::std::option::Option::Some(is.read_uint32()?); + }, + 26 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.default_pubkey)?; + }, + 34 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.phantom_subnets_list)?; + }, + 42 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.conjure_pubkey)?; + }, + 50 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.dns_reg_conf)?; + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.decoy_list.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.generation { + my_size += ::protobuf::rt::uint32_size(2, v); + } + if let Some(v) = self.default_pubkey.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.phantom_subnets_list.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.conjure_pubkey.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.dns_reg_conf.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.decoy_list.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + } + if let Some(v) = self.generation { + os.write_uint32(2, v)?; + } + if let Some(v) = self.default_pubkey.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?; + } + if let Some(v) = self.phantom_subnets_list.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?; + } + if let Some(v) = self.conjure_pubkey.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(5, v, os)?; + } + if let Some(v) = self.dns_reg_conf.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(6, v, os)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> ClientConf { + ClientConf::new() + } + + fn clear(&mut self) { + self.decoy_list.clear(); + self.generation = ::std::option::Option::None; + self.default_pubkey.clear(); + self.phantom_subnets_list.clear(); + self.conjure_pubkey.clear(); + self.dns_reg_conf.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static ClientConf { + static instance: ClientConf = ClientConf { + decoy_list: ::protobuf::MessageField::none(), + generation: ::std::option::Option::None, + default_pubkey: ::protobuf::MessageField::none(), + phantom_subnets_list: ::protobuf::MessageField::none(), + conjure_pubkey: ::protobuf::MessageField::none(), + dns_reg_conf: ::protobuf::MessageField::none(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for ClientConf { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("ClientConf").unwrap()).clone() + } +} + +impl ::std::fmt::Display for ClientConf { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ClientConf { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// Configuration for DNS registrar +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.DnsRegConf) +pub struct DnsRegConf { + // message fields + // @@protoc_insertion_point(field:proto.DnsRegConf.dns_reg_method) + pub dns_reg_method: ::std::option::Option<::protobuf::EnumOrUnknown>, + // @@protoc_insertion_point(field:proto.DnsRegConf.target) + pub target: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.DnsRegConf.domain) + pub domain: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.DnsRegConf.pubkey) + pub pubkey: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.DnsRegConf.utls_distribution) + pub utls_distribution: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.DnsRegConf.stun_server) + pub stun_server: ::std::option::Option<::std::string::String>, + // special fields + // @@protoc_insertion_point(special_field:proto.DnsRegConf.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a DnsRegConf { + fn default() -> &'a DnsRegConf { + ::default_instance() + } +} + +impl DnsRegConf { + pub fn new() -> DnsRegConf { + ::std::default::Default::default() + } + + // required .proto.DnsRegMethod dns_reg_method = 1; + + pub fn dns_reg_method(&self) -> DnsRegMethod { + match self.dns_reg_method { + Some(e) => e.enum_value_or(DnsRegMethod::UDP), + None => DnsRegMethod::UDP, + } + } + + pub fn clear_dns_reg_method(&mut self) { + self.dns_reg_method = ::std::option::Option::None; + } + + pub fn has_dns_reg_method(&self) -> bool { + self.dns_reg_method.is_some() + } + + // Param is passed by value, moved + pub fn set_dns_reg_method(&mut self, v: DnsRegMethod) { + self.dns_reg_method = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional string target = 2; + + pub fn target(&self) -> &str { + match self.target.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_target(&mut self) { + self.target = ::std::option::Option::None; + } + + pub fn has_target(&self) -> bool { + self.target.is_some() + } + + // Param is passed by value, moved + pub fn set_target(&mut self, v: ::std::string::String) { + self.target = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_target(&mut self) -> &mut ::std::string::String { + if self.target.is_none() { + self.target = ::std::option::Option::Some(::std::string::String::new()); + } + self.target.as_mut().unwrap() + } + + // Take field + pub fn take_target(&mut self) -> ::std::string::String { + self.target.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // required string domain = 3; + + pub fn domain(&self) -> &str { + match self.domain.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_domain(&mut self) { + self.domain = ::std::option::Option::None; + } + + pub fn has_domain(&self) -> bool { + self.domain.is_some() + } + + // Param is passed by value, moved + pub fn set_domain(&mut self, v: ::std::string::String) { + self.domain = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_domain(&mut self) -> &mut ::std::string::String { + if self.domain.is_none() { + self.domain = ::std::option::Option::Some(::std::string::String::new()); + } + self.domain.as_mut().unwrap() + } + + // Take field + pub fn take_domain(&mut self) -> ::std::string::String { + self.domain.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional bytes pubkey = 4; + + pub fn pubkey(&self) -> &[u8] { + match self.pubkey.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_pubkey(&mut self) { + self.pubkey = ::std::option::Option::None; + } + + pub fn has_pubkey(&self) -> bool { + self.pubkey.is_some() + } + + // Param is passed by value, moved + pub fn set_pubkey(&mut self, v: ::std::vec::Vec) { + self.pubkey = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_pubkey(&mut self) -> &mut ::std::vec::Vec { + if self.pubkey.is_none() { + self.pubkey = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.pubkey.as_mut().unwrap() + } + + // Take field + pub fn take_pubkey(&mut self) -> ::std::vec::Vec { + self.pubkey.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional string utls_distribution = 5; + + pub fn utls_distribution(&self) -> &str { + match self.utls_distribution.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_utls_distribution(&mut self) { + self.utls_distribution = ::std::option::Option::None; + } + + pub fn has_utls_distribution(&self) -> bool { + self.utls_distribution.is_some() + } + + // Param is passed by value, moved + pub fn set_utls_distribution(&mut self, v: ::std::string::String) { + self.utls_distribution = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_utls_distribution(&mut self) -> &mut ::std::string::String { + if self.utls_distribution.is_none() { + self.utls_distribution = ::std::option::Option::Some(::std::string::String::new()); + } + self.utls_distribution.as_mut().unwrap() + } + + // Take field + pub fn take_utls_distribution(&mut self) -> ::std::string::String { + self.utls_distribution.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional string stun_server = 6; + + pub fn stun_server(&self) -> &str { + match self.stun_server.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_stun_server(&mut self) { + self.stun_server = ::std::option::Option::None; + } + + pub fn has_stun_server(&self) -> bool { + self.stun_server.is_some() + } + + // Param is passed by value, moved + pub fn set_stun_server(&mut self, v: ::std::string::String) { + self.stun_server = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_stun_server(&mut self) -> &mut ::std::string::String { + if self.stun_server.is_none() { + self.stun_server = ::std::option::Option::Some(::std::string::String::new()); + } + self.stun_server.as_mut().unwrap() + } + + // Take field + pub fn take_stun_server(&mut self) -> ::std::string::String { + self.stun_server.take().unwrap_or_else(|| ::std::string::String::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(6); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "dns_reg_method", + |m: &DnsRegConf| { &m.dns_reg_method }, + |m: &mut DnsRegConf| { &mut m.dns_reg_method }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "target", + |m: &DnsRegConf| { &m.target }, + |m: &mut DnsRegConf| { &mut m.target }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "domain", + |m: &DnsRegConf| { &m.domain }, + |m: &mut DnsRegConf| { &mut m.domain }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "pubkey", + |m: &DnsRegConf| { &m.pubkey }, + |m: &mut DnsRegConf| { &mut m.pubkey }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "utls_distribution", + |m: &DnsRegConf| { &m.utls_distribution }, + |m: &mut DnsRegConf| { &mut m.utls_distribution }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "stun_server", + |m: &DnsRegConf| { &m.stun_server }, + |m: &mut DnsRegConf| { &mut m.stun_server }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "DnsRegConf", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for DnsRegConf { + const NAME: &'static str = "DnsRegConf"; + + fn is_initialized(&self) -> bool { + if self.dns_reg_method.is_none() { + return false; + } + if self.domain.is_none() { + return false; + } + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.dns_reg_method = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 18 => { + self.target = ::std::option::Option::Some(is.read_string()?); + }, + 26 => { + self.domain = ::std::option::Option::Some(is.read_string()?); + }, + 34 => { + self.pubkey = ::std::option::Option::Some(is.read_bytes()?); + }, + 42 => { + self.utls_distribution = ::std::option::Option::Some(is.read_string()?); + }, + 50 => { + self.stun_server = ::std::option::Option::Some(is.read_string()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.dns_reg_method { + my_size += ::protobuf::rt::int32_size(1, v.value()); + } + if let Some(v) = self.target.as_ref() { + my_size += ::protobuf::rt::string_size(2, &v); + } + if let Some(v) = self.domain.as_ref() { + my_size += ::protobuf::rt::string_size(3, &v); + } + if let Some(v) = self.pubkey.as_ref() { + my_size += ::protobuf::rt::bytes_size(4, &v); + } + if let Some(v) = self.utls_distribution.as_ref() { + my_size += ::protobuf::rt::string_size(5, &v); + } + if let Some(v) = self.stun_server.as_ref() { + my_size += ::protobuf::rt::string_size(6, &v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.dns_reg_method { + os.write_enum(1, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.target.as_ref() { + os.write_string(2, v)?; + } + if let Some(v) = self.domain.as_ref() { + os.write_string(3, v)?; + } + if let Some(v) = self.pubkey.as_ref() { + os.write_bytes(4, v)?; + } + if let Some(v) = self.utls_distribution.as_ref() { + os.write_string(5, v)?; + } + if let Some(v) = self.stun_server.as_ref() { + os.write_string(6, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> DnsRegConf { + DnsRegConf::new() + } + + fn clear(&mut self) { + self.dns_reg_method = ::std::option::Option::None; + self.target = ::std::option::Option::None; + self.domain = ::std::option::Option::None; + self.pubkey = ::std::option::Option::None; + self.utls_distribution = ::std::option::Option::None; + self.stun_server = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static DnsRegConf { + static instance: DnsRegConf = DnsRegConf { + dns_reg_method: ::std::option::Option::None, + target: ::std::option::Option::None, + domain: ::std::option::Option::None, + pubkey: ::std::option::Option::None, + utls_distribution: ::std::option::Option::None, + stun_server: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for DnsRegConf { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("DnsRegConf").unwrap()).clone() + } +} + +impl ::std::fmt::Display for DnsRegConf { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DnsRegConf { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.DecoyList) +pub struct DecoyList { + // message fields + // @@protoc_insertion_point(field:proto.DecoyList.tls_decoys) + pub tls_decoys: ::std::vec::Vec, + // special fields + // @@protoc_insertion_point(special_field:proto.DecoyList.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a DecoyList { + fn default() -> &'a DecoyList { + ::default_instance() + } +} + +impl DecoyList { + pub fn new() -> DecoyList { + ::std::default::Default::default() + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(1); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( + "tls_decoys", + |m: &DecoyList| { &m.tls_decoys }, + |m: &mut DecoyList| { &mut m.tls_decoys }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "DecoyList", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for DecoyList { + const NAME: &'static str = "DecoyList"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.tls_decoys.push(is.read_message()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + for value in &self.tls_decoys { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + for v in &self.tls_decoys { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + }; + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> DecoyList { + DecoyList::new() + } + + fn clear(&mut self) { + self.tls_decoys.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static DecoyList { + static instance: DecoyList = DecoyList { + tls_decoys: ::std::vec::Vec::new(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for DecoyList { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("DecoyList").unwrap()).clone() + } +} + +impl ::std::fmt::Display for DecoyList { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DecoyList { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.PhantomSubnetsList) +pub struct PhantomSubnetsList { + // message fields + // @@protoc_insertion_point(field:proto.PhantomSubnetsList.weighted_subnets) + pub weighted_subnets: ::std::vec::Vec, + // special fields + // @@protoc_insertion_point(special_field:proto.PhantomSubnetsList.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a PhantomSubnetsList { + fn default() -> &'a PhantomSubnetsList { + ::default_instance() + } +} + +impl PhantomSubnetsList { + pub fn new() -> PhantomSubnetsList { + ::std::default::Default::default() + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(1); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( + "weighted_subnets", + |m: &PhantomSubnetsList| { &m.weighted_subnets }, + |m: &mut PhantomSubnetsList| { &mut m.weighted_subnets }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "PhantomSubnetsList", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for PhantomSubnetsList { + const NAME: &'static str = "PhantomSubnetsList"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.weighted_subnets.push(is.read_message()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + for value in &self.weighted_subnets { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + for v in &self.weighted_subnets { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + }; + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> PhantomSubnetsList { + PhantomSubnetsList::new() + } + + fn clear(&mut self) { + self.weighted_subnets.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static PhantomSubnetsList { + static instance: PhantomSubnetsList = PhantomSubnetsList { + weighted_subnets: ::std::vec::Vec::new(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for PhantomSubnetsList { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("PhantomSubnetsList").unwrap()).clone() + } +} + +impl ::std::fmt::Display for PhantomSubnetsList { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for PhantomSubnetsList { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.PhantomSubnets) +pub struct PhantomSubnets { + // message fields + // @@protoc_insertion_point(field:proto.PhantomSubnets.weight) + pub weight: ::std::option::Option, + // @@protoc_insertion_point(field:proto.PhantomSubnets.subnets) + pub subnets: ::std::vec::Vec<::std::string::String>, + // @@protoc_insertion_point(field:proto.PhantomSubnets.randomize_dst_port) + pub randomize_dst_port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.PhantomSubnets.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a PhantomSubnets { + fn default() -> &'a PhantomSubnets { + ::default_instance() + } +} + +impl PhantomSubnets { + pub fn new() -> PhantomSubnets { + ::std::default::Default::default() + } + + // optional uint32 weight = 1; + + pub fn weight(&self) -> u32 { + self.weight.unwrap_or(0) + } + + pub fn clear_weight(&mut self) { + self.weight = ::std::option::Option::None; + } + + pub fn has_weight(&self) -> bool { + self.weight.is_some() + } + + // Param is passed by value, moved + pub fn set_weight(&mut self, v: u32) { + self.weight = ::std::option::Option::Some(v); + } + + // optional bool randomize_dst_port = 3; + + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) + } + + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; + } + + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(3); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "weight", + |m: &PhantomSubnets| { &m.weight }, + |m: &mut PhantomSubnets| { &mut m.weight }, + )); + fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( + "subnets", + |m: &PhantomSubnets| { &m.subnets }, + |m: &mut PhantomSubnets| { &mut m.subnets }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "randomize_dst_port", + |m: &PhantomSubnets| { &m.randomize_dst_port }, + |m: &mut PhantomSubnets| { &mut m.randomize_dst_port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "PhantomSubnets", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for PhantomSubnets { + const NAME: &'static str = "PhantomSubnets"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.weight = ::std::option::Option::Some(is.read_uint32()?); + }, + 18 => { + self.subnets.push(is.read_string()?); + }, + 24 => { + self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.weight { + my_size += ::protobuf::rt::uint32_size(1, v); + } + for value in &self.subnets { + my_size += ::protobuf::rt::string_size(2, &value); + }; + if let Some(v) = self.randomize_dst_port { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.weight { + os.write_uint32(1, v)?; + } + for v in &self.subnets { + os.write_string(2, &v)?; + }; + if let Some(v) = self.randomize_dst_port { + os.write_bool(3, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> PhantomSubnets { + PhantomSubnets::new() + } + + fn clear(&mut self) { + self.weight = ::std::option::Option::None; + self.subnets.clear(); + self.randomize_dst_port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static PhantomSubnets { + static instance: PhantomSubnets = PhantomSubnets { + weight: ::std::option::Option::None, + subnets: ::std::vec::Vec::new(), + randomize_dst_port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for PhantomSubnets { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("PhantomSubnets").unwrap()).clone() + } +} + +impl ::std::fmt::Display for PhantomSubnets { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for PhantomSubnets { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// Deflated ICE Candidate by seed2sdp package +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.WebRTCICECandidate) +pub struct WebRTCICECandidate { + // message fields + /// IP is represented in its 16-byte form + // @@protoc_insertion_point(field:proto.WebRTCICECandidate.ip_upper) + pub ip_upper: ::std::option::Option, + // @@protoc_insertion_point(field:proto.WebRTCICECandidate.ip_lower) + pub ip_lower: ::std::option::Option, + /// Composed info includes port, tcptype (unset if not tcp), candidate type (host, srflx, prflx), protocol (TCP/UDP), and component (RTP/RTCP) + // @@protoc_insertion_point(field:proto.WebRTCICECandidate.composed_info) + pub composed_info: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.WebRTCICECandidate.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a WebRTCICECandidate { + fn default() -> &'a WebRTCICECandidate { + ::default_instance() + } +} + +impl WebRTCICECandidate { + pub fn new() -> WebRTCICECandidate { + ::std::default::Default::default() + } + + // required uint64 ip_upper = 1; + + pub fn ip_upper(&self) -> u64 { + self.ip_upper.unwrap_or(0) + } + + pub fn clear_ip_upper(&mut self) { + self.ip_upper = ::std::option::Option::None; + } + + pub fn has_ip_upper(&self) -> bool { + self.ip_upper.is_some() + } + + // Param is passed by value, moved + pub fn set_ip_upper(&mut self, v: u64) { + self.ip_upper = ::std::option::Option::Some(v); + } + + // required uint64 ip_lower = 2; + + pub fn ip_lower(&self) -> u64 { + self.ip_lower.unwrap_or(0) + } + + pub fn clear_ip_lower(&mut self) { + self.ip_lower = ::std::option::Option::None; + } + + pub fn has_ip_lower(&self) -> bool { + self.ip_lower.is_some() + } + + // Param is passed by value, moved + pub fn set_ip_lower(&mut self, v: u64) { + self.ip_lower = ::std::option::Option::Some(v); + } + + // required uint32 composed_info = 3; + + pub fn composed_info(&self) -> u32 { + self.composed_info.unwrap_or(0) + } + + pub fn clear_composed_info(&mut self) { + self.composed_info = ::std::option::Option::None; + } + + pub fn has_composed_info(&self) -> bool { + self.composed_info.is_some() + } + + // Param is passed by value, moved + pub fn set_composed_info(&mut self, v: u32) { + self.composed_info = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(3); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ip_upper", + |m: &WebRTCICECandidate| { &m.ip_upper }, + |m: &mut WebRTCICECandidate| { &mut m.ip_upper }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ip_lower", + |m: &WebRTCICECandidate| { &m.ip_lower }, + |m: &mut WebRTCICECandidate| { &mut m.ip_lower }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "composed_info", + |m: &WebRTCICECandidate| { &m.composed_info }, + |m: &mut WebRTCICECandidate| { &mut m.composed_info }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "WebRTCICECandidate", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for WebRTCICECandidate { + const NAME: &'static str = "WebRTCICECandidate"; + + fn is_initialized(&self) -> bool { + if self.ip_upper.is_none() { + return false; + } + if self.ip_lower.is_none() { + return false; + } + if self.composed_info.is_none() { + return false; + } + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.ip_upper = ::std::option::Option::Some(is.read_uint64()?); + }, + 16 => { + self.ip_lower = ::std::option::Option::Some(is.read_uint64()?); + }, + 24 => { + self.composed_info = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.ip_upper { + my_size += ::protobuf::rt::uint64_size(1, v); + } + if let Some(v) = self.ip_lower { + my_size += ::protobuf::rt::uint64_size(2, v); + } + if let Some(v) = self.composed_info { + my_size += ::protobuf::rt::uint32_size(3, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.ip_upper { + os.write_uint64(1, v)?; + } + if let Some(v) = self.ip_lower { + os.write_uint64(2, v)?; + } + if let Some(v) = self.composed_info { + os.write_uint32(3, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> WebRTCICECandidate { + WebRTCICECandidate::new() + } + + fn clear(&mut self) { + self.ip_upper = ::std::option::Option::None; + self.ip_lower = ::std::option::Option::None; + self.composed_info = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static WebRTCICECandidate { + static instance: WebRTCICECandidate = WebRTCICECandidate { + ip_upper: ::std::option::Option::None, + ip_lower: ::std::option::Option::None, + composed_info: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for WebRTCICECandidate { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("WebRTCICECandidate").unwrap()).clone() + } +} + +impl ::std::fmt::Display for WebRTCICECandidate { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for WebRTCICECandidate { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// Deflated SDP for WebRTC by seed2sdp package +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.WebRTCSDP) +pub struct WebRTCSDP { + // message fields + // @@protoc_insertion_point(field:proto.WebRTCSDP.type) + pub type_: ::std::option::Option, + // @@protoc_insertion_point(field:proto.WebRTCSDP.candidates) + pub candidates: ::std::vec::Vec, + // special fields + // @@protoc_insertion_point(special_field:proto.WebRTCSDP.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a WebRTCSDP { + fn default() -> &'a WebRTCSDP { + ::default_instance() + } +} + +impl WebRTCSDP { + pub fn new() -> WebRTCSDP { + ::std::default::Default::default() + } + + // required uint32 type = 1; + + pub fn type_(&self) -> u32 { + self.type_.unwrap_or(0) + } + + pub fn clear_type_(&mut self) { + self.type_ = ::std::option::Option::None; + } + + pub fn has_type(&self) -> bool { + self.type_.is_some() + } + + // Param is passed by value, moved + pub fn set_type(&mut self, v: u32) { + self.type_ = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "type", + |m: &WebRTCSDP| { &m.type_ }, + |m: &mut WebRTCSDP| { &mut m.type_ }, + )); + fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( + "candidates", + |m: &WebRTCSDP| { &m.candidates }, + |m: &mut WebRTCSDP| { &mut m.candidates }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "WebRTCSDP", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for WebRTCSDP { + const NAME: &'static str = "WebRTCSDP"; + + fn is_initialized(&self) -> bool { + if self.type_.is_none() { + return false; + } + for v in &self.candidates { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.type_ = ::std::option::Option::Some(is.read_uint32()?); + }, + 18 => { + self.candidates.push(is.read_message()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.type_ { + my_size += ::protobuf::rt::uint32_size(1, v); + } + for value in &self.candidates { + let len = value.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + }; + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.type_ { + os.write_uint32(1, v)?; + } + for v in &self.candidates { + ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?; + }; + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> WebRTCSDP { + WebRTCSDP::new() + } + + fn clear(&mut self) { + self.type_ = ::std::option::Option::None; + self.candidates.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static WebRTCSDP { + static instance: WebRTCSDP = WebRTCSDP { + type_: ::std::option::Option::None, + candidates: ::std::vec::Vec::new(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for WebRTCSDP { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("WebRTCSDP").unwrap()).clone() + } +} + +impl ::std::fmt::Display for WebRTCSDP { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for WebRTCSDP { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// WebRTCSignal includes a deflated SDP and a seed +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.WebRTCSignal) +pub struct WebRTCSignal { + // message fields + // @@protoc_insertion_point(field:proto.WebRTCSignal.seed) + pub seed: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.WebRTCSignal.sdp) + pub sdp: ::protobuf::MessageField, + // special fields + // @@protoc_insertion_point(special_field:proto.WebRTCSignal.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a WebRTCSignal { + fn default() -> &'a WebRTCSignal { + ::default_instance() + } +} + +impl WebRTCSignal { + pub fn new() -> WebRTCSignal { + ::std::default::Default::default() + } + + // required string seed = 1; + + pub fn seed(&self) -> &str { + match self.seed.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_seed(&mut self) { + self.seed = ::std::option::Option::None; + } + + pub fn has_seed(&self) -> bool { + self.seed.is_some() + } + + // Param is passed by value, moved + pub fn set_seed(&mut self, v: ::std::string::String) { + self.seed = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_seed(&mut self) -> &mut ::std::string::String { + if self.seed.is_none() { + self.seed = ::std::option::Option::Some(::std::string::String::new()); + } + self.seed.as_mut().unwrap() + } + + // Take field + pub fn take_seed(&mut self) -> ::std::string::String { + self.seed.take().unwrap_or_else(|| ::std::string::String::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "seed", + |m: &WebRTCSignal| { &m.seed }, + |m: &mut WebRTCSignal| { &mut m.seed }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, WebRTCSDP>( + "sdp", + |m: &WebRTCSignal| { &m.sdp }, + |m: &mut WebRTCSignal| { &mut m.sdp }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "WebRTCSignal", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for WebRTCSignal { + const NAME: &'static str = "WebRTCSignal"; + + fn is_initialized(&self) -> bool { + if self.seed.is_none() { + return false; + } + if self.sdp.is_none() { + return false; + } + for v in &self.sdp { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.seed = ::std::option::Option::Some(is.read_string()?); + }, + 18 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.sdp)?; + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.seed.as_ref() { + my_size += ::protobuf::rt::string_size(1, &v); + } + if let Some(v) = self.sdp.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.seed.as_ref() { + os.write_string(1, v)?; + } + if let Some(v) = self.sdp.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> WebRTCSignal { + WebRTCSignal::new() + } + + fn clear(&mut self) { + self.seed = ::std::option::Option::None; + self.sdp.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static WebRTCSignal { + static instance: WebRTCSignal = WebRTCSignal { + seed: ::std::option::Option::None, + sdp: ::protobuf::MessageField::none(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for WebRTCSignal { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("WebRTCSignal").unwrap()).clone() + } +} + +impl ::std::fmt::Display for WebRTCSignal { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for WebRTCSignal { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.Addr) +pub struct Addr { + // message fields + // @@protoc_insertion_point(field:proto.Addr.IP) + pub IP: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.Addr.Port) + pub Port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.Addr.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a Addr { + fn default() -> &'a Addr { + ::default_instance() + } +} + +impl Addr { + pub fn new() -> Addr { + ::std::default::Default::default() + } + + // optional bytes IP = 1; + + pub fn IP(&self) -> &[u8] { + match self.IP.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_IP(&mut self) { + self.IP = ::std::option::Option::None; + } + + pub fn has_IP(&self) -> bool { + self.IP.is_some() + } + + // Param is passed by value, moved + pub fn set_IP(&mut self, v: ::std::vec::Vec) { + self.IP = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_IP(&mut self) -> &mut ::std::vec::Vec { + if self.IP.is_none() { + self.IP = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.IP.as_mut().unwrap() + } + + // Take field + pub fn take_IP(&mut self) -> ::std::vec::Vec { + self.IP.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional uint32 Port = 2; + + pub fn Port(&self) -> u32 { + self.Port.unwrap_or(0) + } + + pub fn clear_Port(&mut self) { + self.Port = ::std::option::Option::None; + } + + pub fn has_Port(&self) -> bool { + self.Port.is_some() + } + + // Param is passed by value, moved + pub fn set_Port(&mut self, v: u32) { + self.Port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "IP", + |m: &Addr| { &m.IP }, + |m: &mut Addr| { &mut m.IP }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "Port", + |m: &Addr| { &m.Port }, + |m: &mut Addr| { &mut m.Port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "Addr", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for Addr { + const NAME: &'static str = "Addr"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.IP = ::std::option::Option::Some(is.read_bytes()?); + }, + 16 => { + self.Port = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.IP.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.Port { + my_size += ::protobuf::rt::uint32_size(2, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.IP.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.Port { + os.write_uint32(2, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> Addr { + Addr::new() + } + + fn clear(&mut self) { + self.IP = ::std::option::Option::None; + self.Port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static Addr { + static instance: Addr = Addr { + IP: ::std::option::Option::None, + Port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for Addr { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("Addr").unwrap()).clone() + } +} + +impl ::std::fmt::Display for Addr { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for Addr { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.DTLSTransportParams) +pub struct DTLSTransportParams { + // message fields + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr4) + pub src_addr4: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.src_addr6) + pub src_addr6: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.DTLSTransportParams.randomize_dst_port) + pub randomize_dst_port: ::std::option::Option, + /// Unordered sets the reliability of the DTLS stream to unordered + // @@protoc_insertion_point(field:proto.DTLSTransportParams.unordered) + pub unordered: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.DTLSTransportParams.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a DTLSTransportParams { + fn default() -> &'a DTLSTransportParams { + ::default_instance() + } +} + +impl DTLSTransportParams { + pub fn new() -> DTLSTransportParams { + ::std::default::Default::default() + } + + // optional bool randomize_dst_port = 3; + + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) + } + + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; + } + + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); + } + + // optional bool unordered = 4; + + pub fn unordered(&self) -> bool { + self.unordered.unwrap_or(false) + } + + pub fn clear_unordered(&mut self) { + self.unordered = ::std::option::Option::None; + } + + pub fn has_unordered(&self) -> bool { + self.unordered.is_some() + } + + // Param is passed by value, moved + pub fn set_unordered(&mut self, v: bool) { + self.unordered = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(4); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr4", + |m: &DTLSTransportParams| { &m.src_addr4 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr4 }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, Addr>( + "src_addr6", + |m: &DTLSTransportParams| { &m.src_addr6 }, + |m: &mut DTLSTransportParams| { &mut m.src_addr6 }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "randomize_dst_port", + |m: &DTLSTransportParams| { &m.randomize_dst_port }, + |m: &mut DTLSTransportParams| { &mut m.randomize_dst_port }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "unordered", + |m: &DTLSTransportParams| { &m.unordered }, + |m: &mut DTLSTransportParams| { &mut m.unordered }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "DTLSTransportParams", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for DTLSTransportParams { + const NAME: &'static str = "DTLSTransportParams"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr4)?; + }, + 18 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.src_addr6)?; + }, + 24 => { + self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); + }, + 32 => { + self.unordered = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.src_addr4.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.src_addr6.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.randomize_dst_port { + my_size += 1 + 1; + } + if let Some(v) = self.unordered { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.src_addr4.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?; + } + if let Some(v) = self.src_addr6.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(2, v, os)?; + } + if let Some(v) = self.randomize_dst_port { + os.write_bool(3, v)?; + } + if let Some(v) = self.unordered { + os.write_bool(4, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> DTLSTransportParams { + DTLSTransportParams::new() + } + + fn clear(&mut self) { + self.src_addr4.clear(); + self.src_addr6.clear(); + self.randomize_dst_port = ::std::option::Option::None; + self.unordered = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static DTLSTransportParams { + static instance: DTLSTransportParams = DTLSTransportParams { + src_addr4: ::protobuf::MessageField::none(), + src_addr6: ::protobuf::MessageField::none(), + randomize_dst_port: ::std::option::Option::None, + unordered: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for DTLSTransportParams { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("DTLSTransportParams").unwrap()).clone() + } +} + +impl ::std::fmt::Display for DTLSTransportParams { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DTLSTransportParams { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.StationToClient) +pub struct StationToClient { + // message fields + /// Should accompany (at least) SESSION_INIT and CONFIRM_RECONNECT. + // @@protoc_insertion_point(field:proto.StationToClient.protocol_version) + pub protocol_version: ::std::option::Option, + /// There might be a state transition. May be absent; absence should be + /// treated identically to NO_CHANGE. + // @@protoc_insertion_point(field:proto.StationToClient.state_transition) + pub state_transition: ::std::option::Option<::protobuf::EnumOrUnknown>, + /// The station can send client config info piggybacked + /// on any message, as it sees fit + // @@protoc_insertion_point(field:proto.StationToClient.config_info) + pub config_info: ::protobuf::MessageField, + /// If state_transition == S2C_ERROR, this field is the explanation. + // @@protoc_insertion_point(field:proto.StationToClient.err_reason) + pub err_reason: ::std::option::Option<::protobuf::EnumOrUnknown>, + /// Signals client to stop connecting for following amount of seconds + // @@protoc_insertion_point(field:proto.StationToClient.tmp_backoff) + pub tmp_backoff: ::std::option::Option, + /// Sent in SESSION_INIT, identifies the station that picked up + // @@protoc_insertion_point(field:proto.StationToClient.station_id) + pub station_id: ::std::option::Option<::std::string::String>, + /// Random-sized junk to defeat packet size fingerprinting. + // @@protoc_insertion_point(field:proto.StationToClient.padding) + pub padding: ::std::option::Option<::std::vec::Vec>, + // special fields + // @@protoc_insertion_point(special_field:proto.StationToClient.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a StationToClient { + fn default() -> &'a StationToClient { + ::default_instance() + } +} + +impl StationToClient { + pub fn new() -> StationToClient { + ::std::default::Default::default() + } + + // optional uint32 protocol_version = 1; + + pub fn protocol_version(&self) -> u32 { + self.protocol_version.unwrap_or(0) + } + + pub fn clear_protocol_version(&mut self) { + self.protocol_version = ::std::option::Option::None; + } + + pub fn has_protocol_version(&self) -> bool { + self.protocol_version.is_some() + } + + // Param is passed by value, moved + pub fn set_protocol_version(&mut self, v: u32) { + self.protocol_version = ::std::option::Option::Some(v); + } + + // optional .proto.S2C_Transition state_transition = 2; + + pub fn state_transition(&self) -> S2C_Transition { + match self.state_transition { + Some(e) => e.enum_value_or(S2C_Transition::S2C_NO_CHANGE), + None => S2C_Transition::S2C_NO_CHANGE, + } + } + + pub fn clear_state_transition(&mut self) { + self.state_transition = ::std::option::Option::None; + } + + pub fn has_state_transition(&self) -> bool { + self.state_transition.is_some() + } + + // Param is passed by value, moved + pub fn set_state_transition(&mut self, v: S2C_Transition) { + self.state_transition = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional .proto.ErrorReasonS2C err_reason = 4; + + pub fn err_reason(&self) -> ErrorReasonS2C { + match self.err_reason { + Some(e) => e.enum_value_or(ErrorReasonS2C::NO_ERROR), + None => ErrorReasonS2C::NO_ERROR, + } + } + + pub fn clear_err_reason(&mut self) { + self.err_reason = ::std::option::Option::None; + } + + pub fn has_err_reason(&self) -> bool { + self.err_reason.is_some() + } + + // Param is passed by value, moved + pub fn set_err_reason(&mut self, v: ErrorReasonS2C) { + self.err_reason = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional uint32 tmp_backoff = 5; + + pub fn tmp_backoff(&self) -> u32 { + self.tmp_backoff.unwrap_or(0) + } + + pub fn clear_tmp_backoff(&mut self) { + self.tmp_backoff = ::std::option::Option::None; + } + + pub fn has_tmp_backoff(&self) -> bool { + self.tmp_backoff.is_some() + } + + // Param is passed by value, moved + pub fn set_tmp_backoff(&mut self, v: u32) { + self.tmp_backoff = ::std::option::Option::Some(v); + } + + // optional string station_id = 6; + + pub fn station_id(&self) -> &str { + match self.station_id.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_station_id(&mut self) { + self.station_id = ::std::option::Option::None; + } + + pub fn has_station_id(&self) -> bool { + self.station_id.is_some() + } + + // Param is passed by value, moved + pub fn set_station_id(&mut self, v: ::std::string::String) { + self.station_id = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_station_id(&mut self) -> &mut ::std::string::String { + if self.station_id.is_none() { + self.station_id = ::std::option::Option::Some(::std::string::String::new()); + } + self.station_id.as_mut().unwrap() + } + + // Take field + pub fn take_station_id(&mut self) -> ::std::string::String { + self.station_id.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional bytes padding = 100; + + pub fn padding(&self) -> &[u8] { + match self.padding.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_padding(&mut self) { + self.padding = ::std::option::Option::None; + } + + pub fn has_padding(&self) -> bool { + self.padding.is_some() + } + + // Param is passed by value, moved + pub fn set_padding(&mut self, v: ::std::vec::Vec) { + self.padding = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_padding(&mut self) -> &mut ::std::vec::Vec { + if self.padding.is_none() { + self.padding = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.padding.as_mut().unwrap() + } + + // Take field + pub fn take_padding(&mut self) -> ::std::vec::Vec { + self.padding.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(7); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "protocol_version", + |m: &StationToClient| { &m.protocol_version }, + |m: &mut StationToClient| { &mut m.protocol_version }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "state_transition", + |m: &StationToClient| { &m.state_transition }, + |m: &mut StationToClient| { &mut m.state_transition }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ClientConf>( + "config_info", + |m: &StationToClient| { &m.config_info }, + |m: &mut StationToClient| { &mut m.config_info }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "err_reason", + |m: &StationToClient| { &m.err_reason }, + |m: &mut StationToClient| { &mut m.err_reason }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "tmp_backoff", + |m: &StationToClient| { &m.tmp_backoff }, + |m: &mut StationToClient| { &mut m.tmp_backoff }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "station_id", + |m: &StationToClient| { &m.station_id }, + |m: &mut StationToClient| { &mut m.station_id }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "padding", + |m: &StationToClient| { &m.padding }, + |m: &mut StationToClient| { &mut m.padding }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "StationToClient", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for StationToClient { + const NAME: &'static str = "StationToClient"; + + fn is_initialized(&self) -> bool { + for v in &self.config_info { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.protocol_version = ::std::option::Option::Some(is.read_uint32()?); + }, + 16 => { + self.state_transition = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 26 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.config_info)?; + }, + 32 => { + self.err_reason = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 40 => { + self.tmp_backoff = ::std::option::Option::Some(is.read_uint32()?); + }, + 50 => { + self.station_id = ::std::option::Option::Some(is.read_string()?); + }, + 802 => { + self.padding = ::std::option::Option::Some(is.read_bytes()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.protocol_version { + my_size += ::protobuf::rt::uint32_size(1, v); + } + if let Some(v) = self.state_transition { + my_size += ::protobuf::rt::int32_size(2, v.value()); + } + if let Some(v) = self.config_info.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.err_reason { + my_size += ::protobuf::rt::int32_size(4, v.value()); + } + if let Some(v) = self.tmp_backoff { + my_size += ::protobuf::rt::uint32_size(5, v); + } + if let Some(v) = self.station_id.as_ref() { + my_size += ::protobuf::rt::string_size(6, &v); + } + if let Some(v) = self.padding.as_ref() { + my_size += ::protobuf::rt::bytes_size(100, &v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.protocol_version { + os.write_uint32(1, v)?; + } + if let Some(v) = self.state_transition { + os.write_enum(2, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.config_info.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?; + } + if let Some(v) = self.err_reason { + os.write_enum(4, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.tmp_backoff { + os.write_uint32(5, v)?; + } + if let Some(v) = self.station_id.as_ref() { + os.write_string(6, v)?; + } + if let Some(v) = self.padding.as_ref() { + os.write_bytes(100, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> StationToClient { + StationToClient::new() + } + + fn clear(&mut self) { + self.protocol_version = ::std::option::Option::None; + self.state_transition = ::std::option::Option::None; + self.config_info.clear(); + self.err_reason = ::std::option::Option::None; + self.tmp_backoff = ::std::option::Option::None; + self.station_id = ::std::option::Option::None; + self.padding = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static StationToClient { + static instance: StationToClient = StationToClient { + protocol_version: ::std::option::Option::None, + state_transition: ::std::option::Option::None, + config_info: ::protobuf::MessageField::none(), + err_reason: ::std::option::Option::None, + tmp_backoff: ::std::option::Option::None, + station_id: ::std::option::Option::None, + padding: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for StationToClient { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("StationToClient").unwrap()).clone() + } +} + +impl ::std::fmt::Display for StationToClient { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for StationToClient { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.RegistrationFlags) +pub struct RegistrationFlags { + // message fields + // @@protoc_insertion_point(field:proto.RegistrationFlags.upload_only) + pub upload_only: ::std::option::Option, + // @@protoc_insertion_point(field:proto.RegistrationFlags.dark_decoy) + pub dark_decoy: ::std::option::Option, + // @@protoc_insertion_point(field:proto.RegistrationFlags.proxy_header) + pub proxy_header: ::std::option::Option, + // @@protoc_insertion_point(field:proto.RegistrationFlags.use_TIL) + pub use_TIL: ::std::option::Option, + // @@protoc_insertion_point(field:proto.RegistrationFlags.prescanned) + pub prescanned: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.RegistrationFlags.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a RegistrationFlags { + fn default() -> &'a RegistrationFlags { + ::default_instance() + } +} + +impl RegistrationFlags { + pub fn new() -> RegistrationFlags { + ::std::default::Default::default() + } + + // optional bool upload_only = 1; + + pub fn upload_only(&self) -> bool { + self.upload_only.unwrap_or(false) + } + + pub fn clear_upload_only(&mut self) { + self.upload_only = ::std::option::Option::None; + } + + pub fn has_upload_only(&self) -> bool { + self.upload_only.is_some() + } + + // Param is passed by value, moved + pub fn set_upload_only(&mut self, v: bool) { + self.upload_only = ::std::option::Option::Some(v); + } + + // optional bool dark_decoy = 2; + + pub fn dark_decoy(&self) -> bool { + self.dark_decoy.unwrap_or(false) + } + + pub fn clear_dark_decoy(&mut self) { + self.dark_decoy = ::std::option::Option::None; + } + + pub fn has_dark_decoy(&self) -> bool { + self.dark_decoy.is_some() + } + + // Param is passed by value, moved + pub fn set_dark_decoy(&mut self, v: bool) { + self.dark_decoy = ::std::option::Option::Some(v); + } + + // optional bool proxy_header = 3; + + pub fn proxy_header(&self) -> bool { + self.proxy_header.unwrap_or(false) + } + + pub fn clear_proxy_header(&mut self) { + self.proxy_header = ::std::option::Option::None; + } + + pub fn has_proxy_header(&self) -> bool { + self.proxy_header.is_some() + } + + // Param is passed by value, moved + pub fn set_proxy_header(&mut self, v: bool) { + self.proxy_header = ::std::option::Option::Some(v); + } + + // optional bool use_TIL = 4; + + pub fn use_TIL(&self) -> bool { + self.use_TIL.unwrap_or(false) + } + + pub fn clear_use_TIL(&mut self) { + self.use_TIL = ::std::option::Option::None; + } + + pub fn has_use_TIL(&self) -> bool { + self.use_TIL.is_some() + } + + // Param is passed by value, moved + pub fn set_use_TIL(&mut self, v: bool) { + self.use_TIL = ::std::option::Option::Some(v); + } + + // optional bool prescanned = 5; + + pub fn prescanned(&self) -> bool { + self.prescanned.unwrap_or(false) + } + + pub fn clear_prescanned(&mut self) { + self.prescanned = ::std::option::Option::None; + } + + pub fn has_prescanned(&self) -> bool { + self.prescanned.is_some() + } + + // Param is passed by value, moved + pub fn set_prescanned(&mut self, v: bool) { + self.prescanned = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(5); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "upload_only", + |m: &RegistrationFlags| { &m.upload_only }, + |m: &mut RegistrationFlags| { &mut m.upload_only }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "dark_decoy", + |m: &RegistrationFlags| { &m.dark_decoy }, + |m: &mut RegistrationFlags| { &mut m.dark_decoy }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "proxy_header", + |m: &RegistrationFlags| { &m.proxy_header }, + |m: &mut RegistrationFlags| { &mut m.proxy_header }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "use_TIL", + |m: &RegistrationFlags| { &m.use_TIL }, + |m: &mut RegistrationFlags| { &mut m.use_TIL }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "prescanned", + |m: &RegistrationFlags| { &m.prescanned }, + |m: &mut RegistrationFlags| { &mut m.prescanned }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "RegistrationFlags", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for RegistrationFlags { + const NAME: &'static str = "RegistrationFlags"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.upload_only = ::std::option::Option::Some(is.read_bool()?); + }, + 16 => { + self.dark_decoy = ::std::option::Option::Some(is.read_bool()?); + }, + 24 => { + self.proxy_header = ::std::option::Option::Some(is.read_bool()?); + }, + 32 => { + self.use_TIL = ::std::option::Option::Some(is.read_bool()?); + }, + 40 => { + self.prescanned = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.upload_only { + my_size += 1 + 1; + } + if let Some(v) = self.dark_decoy { + my_size += 1 + 1; + } + if let Some(v) = self.proxy_header { + my_size += 1 + 1; + } + if let Some(v) = self.use_TIL { + my_size += 1 + 1; + } + if let Some(v) = self.prescanned { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.upload_only { + os.write_bool(1, v)?; + } + if let Some(v) = self.dark_decoy { + os.write_bool(2, v)?; + } + if let Some(v) = self.proxy_header { + os.write_bool(3, v)?; + } + if let Some(v) = self.use_TIL { + os.write_bool(4, v)?; + } + if let Some(v) = self.prescanned { + os.write_bool(5, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> RegistrationFlags { + RegistrationFlags::new() + } + + fn clear(&mut self) { + self.upload_only = ::std::option::Option::None; + self.dark_decoy = ::std::option::Option::None; + self.proxy_header = ::std::option::Option::None; + self.use_TIL = ::std::option::Option::None; + self.prescanned = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static RegistrationFlags { + static instance: RegistrationFlags = RegistrationFlags { + upload_only: ::std::option::Option::None, + dark_decoy: ::std::option::Option::None, + proxy_header: ::std::option::Option::None, + use_TIL: ::std::option::Option::None, + prescanned: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for RegistrationFlags { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("RegistrationFlags").unwrap()).clone() + } +} + +impl ::std::fmt::Display for RegistrationFlags { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RegistrationFlags { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.ClientToStation) +pub struct ClientToStation { + // message fields + // @@protoc_insertion_point(field:proto.ClientToStation.protocol_version) + pub protocol_version: ::std::option::Option, + /// The client reports its decoy list's version number here, which the + /// station can use to decide whether to send an updated one. The station + /// should always send a list if this field is set to 0. + // @@protoc_insertion_point(field:proto.ClientToStation.decoy_list_generation) + pub decoy_list_generation: ::std::option::Option, + // @@protoc_insertion_point(field:proto.ClientToStation.state_transition) + pub state_transition: ::std::option::Option<::protobuf::EnumOrUnknown>, + /// The position in the overall session's upload sequence where the current + /// YIELD=>ACQUIRE switchover is happening. + // @@protoc_insertion_point(field:proto.ClientToStation.upload_sync) + pub upload_sync: ::std::option::Option, + /// High level client library version used for indicating feature support, or + /// lack therof. + // @@protoc_insertion_point(field:proto.ClientToStation.client_lib_version) + pub client_lib_version: ::std::option::Option, + /// Indicates whether the client will allow the registrar to provide alternative parameters that + /// may work better in substitute for the deterministically selected parameters. This only works + /// for bidirectional registration methods where the client receives a RegistrationResponse. + // @@protoc_insertion_point(field:proto.ClientToStation.disable_registrar_overrides) + pub disable_registrar_overrides: ::std::option::Option, + /// List of decoys that client have unsuccessfully tried in current session. + /// Could be sent in chunks + // @@protoc_insertion_point(field:proto.ClientToStation.failed_decoys) + pub failed_decoys: ::std::vec::Vec<::std::string::String>, + // @@protoc_insertion_point(field:proto.ClientToStation.stats) + pub stats: ::protobuf::MessageField, + /// NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy + // @@protoc_insertion_point(field:proto.ClientToStation.transport) + pub transport: ::std::option::Option<::protobuf::EnumOrUnknown>, + // @@protoc_insertion_point(field:proto.ClientToStation.transport_params) + pub transport_params: ::protobuf::MessageField<::protobuf::well_known_types::any::Any>, + /// Station is only required to check this variable during session initialization. + /// If set, station must facilitate connection to said target by itself, i.e. write into squid + /// socket an HTTP/SOCKS/any other connection request. + /// covert_address must have exactly one ':' colon, that separates host (literal IP address or + /// resolvable hostname) and port + /// TODO: make it required for initialization, and stop connecting any client straight to squid? + // @@protoc_insertion_point(field:proto.ClientToStation.covert_address) + pub covert_address: ::std::option::Option<::std::string::String>, + /// Used in dark decoys to signal which dark decoy it will connect to. + // @@protoc_insertion_point(field:proto.ClientToStation.masked_decoy_server_name) + pub masked_decoy_server_name: ::std::option::Option<::std::string::String>, + /// Used to indicate to server if client is registering v4, v6 or both + // @@protoc_insertion_point(field:proto.ClientToStation.v6_support) + pub v6_support: ::std::option::Option, + // @@protoc_insertion_point(field:proto.ClientToStation.v4_support) + pub v4_support: ::std::option::Option, + /// A collection of optional flags for the registration. + // @@protoc_insertion_point(field:proto.ClientToStation.flags) + pub flags: ::protobuf::MessageField, + /// Transport Extensions + /// TODO(jmwample) - move to WebRTC specific transport params protobuf message. + // @@protoc_insertion_point(field:proto.ClientToStation.webrtc_signal) + pub webrtc_signal: ::protobuf::MessageField, + /// Random-sized junk to defeat packet size fingerprinting. + // @@protoc_insertion_point(field:proto.ClientToStation.padding) + pub padding: ::std::option::Option<::std::vec::Vec>, + // special fields + // @@protoc_insertion_point(special_field:proto.ClientToStation.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a ClientToStation { + fn default() -> &'a ClientToStation { + ::default_instance() + } +} + +impl ClientToStation { + pub fn new() -> ClientToStation { + ::std::default::Default::default() + } + + // optional uint32 protocol_version = 1; + + pub fn protocol_version(&self) -> u32 { + self.protocol_version.unwrap_or(0) + } + + pub fn clear_protocol_version(&mut self) { + self.protocol_version = ::std::option::Option::None; + } + + pub fn has_protocol_version(&self) -> bool { + self.protocol_version.is_some() + } + + // Param is passed by value, moved + pub fn set_protocol_version(&mut self, v: u32) { + self.protocol_version = ::std::option::Option::Some(v); + } + + // optional uint32 decoy_list_generation = 2; + + pub fn decoy_list_generation(&self) -> u32 { + self.decoy_list_generation.unwrap_or(0) + } + + pub fn clear_decoy_list_generation(&mut self) { + self.decoy_list_generation = ::std::option::Option::None; + } + + pub fn has_decoy_list_generation(&self) -> bool { + self.decoy_list_generation.is_some() + } + + // Param is passed by value, moved + pub fn set_decoy_list_generation(&mut self, v: u32) { + self.decoy_list_generation = ::std::option::Option::Some(v); + } + + // optional .proto.C2S_Transition state_transition = 3; + + pub fn state_transition(&self) -> C2S_Transition { + match self.state_transition { + Some(e) => e.enum_value_or(C2S_Transition::C2S_NO_CHANGE), + None => C2S_Transition::C2S_NO_CHANGE, + } + } + + pub fn clear_state_transition(&mut self) { + self.state_transition = ::std::option::Option::None; + } + + pub fn has_state_transition(&self) -> bool { + self.state_transition.is_some() + } + + // Param is passed by value, moved + pub fn set_state_transition(&mut self, v: C2S_Transition) { + self.state_transition = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional uint64 upload_sync = 4; + + pub fn upload_sync(&self) -> u64 { + self.upload_sync.unwrap_or(0) + } + + pub fn clear_upload_sync(&mut self) { + self.upload_sync = ::std::option::Option::None; + } + + pub fn has_upload_sync(&self) -> bool { + self.upload_sync.is_some() + } + + // Param is passed by value, moved + pub fn set_upload_sync(&mut self, v: u64) { + self.upload_sync = ::std::option::Option::Some(v); + } + + // optional uint32 client_lib_version = 5; + + pub fn client_lib_version(&self) -> u32 { + self.client_lib_version.unwrap_or(0) + } + + pub fn clear_client_lib_version(&mut self) { + self.client_lib_version = ::std::option::Option::None; + } + + pub fn has_client_lib_version(&self) -> bool { + self.client_lib_version.is_some() + } + + // Param is passed by value, moved + pub fn set_client_lib_version(&mut self, v: u32) { + self.client_lib_version = ::std::option::Option::Some(v); + } + + // optional bool disable_registrar_overrides = 6; + + pub fn disable_registrar_overrides(&self) -> bool { + self.disable_registrar_overrides.unwrap_or(false) + } + + pub fn clear_disable_registrar_overrides(&mut self) { + self.disable_registrar_overrides = ::std::option::Option::None; + } + + pub fn has_disable_registrar_overrides(&self) -> bool { + self.disable_registrar_overrides.is_some() + } + + // Param is passed by value, moved + pub fn set_disable_registrar_overrides(&mut self, v: bool) { + self.disable_registrar_overrides = ::std::option::Option::Some(v); + } + + // optional .proto.TransportType transport = 12; + + pub fn transport(&self) -> TransportType { + match self.transport { + Some(e) => e.enum_value_or(TransportType::Null), + None => TransportType::Null, + } + } + + pub fn clear_transport(&mut self) { + self.transport = ::std::option::Option::None; + } + + pub fn has_transport(&self) -> bool { + self.transport.is_some() + } + + // Param is passed by value, moved + pub fn set_transport(&mut self, v: TransportType) { + self.transport = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional string covert_address = 20; + + pub fn covert_address(&self) -> &str { + match self.covert_address.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_covert_address(&mut self) { + self.covert_address = ::std::option::Option::None; + } + + pub fn has_covert_address(&self) -> bool { + self.covert_address.is_some() + } + + // Param is passed by value, moved + pub fn set_covert_address(&mut self, v: ::std::string::String) { + self.covert_address = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_covert_address(&mut self) -> &mut ::std::string::String { + if self.covert_address.is_none() { + self.covert_address = ::std::option::Option::Some(::std::string::String::new()); + } + self.covert_address.as_mut().unwrap() + } + + // Take field + pub fn take_covert_address(&mut self) -> ::std::string::String { + self.covert_address.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional string masked_decoy_server_name = 21; + + pub fn masked_decoy_server_name(&self) -> &str { + match self.masked_decoy_server_name.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_masked_decoy_server_name(&mut self) { + self.masked_decoy_server_name = ::std::option::Option::None; + } + + pub fn has_masked_decoy_server_name(&self) -> bool { + self.masked_decoy_server_name.is_some() + } + + // Param is passed by value, moved + pub fn set_masked_decoy_server_name(&mut self, v: ::std::string::String) { + self.masked_decoy_server_name = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_masked_decoy_server_name(&mut self) -> &mut ::std::string::String { + if self.masked_decoy_server_name.is_none() { + self.masked_decoy_server_name = ::std::option::Option::Some(::std::string::String::new()); + } + self.masked_decoy_server_name.as_mut().unwrap() + } + + // Take field + pub fn take_masked_decoy_server_name(&mut self) -> ::std::string::String { + self.masked_decoy_server_name.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional bool v6_support = 22; + + pub fn v6_support(&self) -> bool { + self.v6_support.unwrap_or(false) + } + + pub fn clear_v6_support(&mut self) { + self.v6_support = ::std::option::Option::None; + } + + pub fn has_v6_support(&self) -> bool { + self.v6_support.is_some() + } + + // Param is passed by value, moved + pub fn set_v6_support(&mut self, v: bool) { + self.v6_support = ::std::option::Option::Some(v); + } + + // optional bool v4_support = 23; + + pub fn v4_support(&self) -> bool { + self.v4_support.unwrap_or(false) + } + + pub fn clear_v4_support(&mut self) { + self.v4_support = ::std::option::Option::None; + } + + pub fn has_v4_support(&self) -> bool { + self.v4_support.is_some() + } + + // Param is passed by value, moved + pub fn set_v4_support(&mut self, v: bool) { + self.v4_support = ::std::option::Option::Some(v); + } + + // optional bytes padding = 100; + + pub fn padding(&self) -> &[u8] { + match self.padding.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_padding(&mut self) { + self.padding = ::std::option::Option::None; + } + + pub fn has_padding(&self) -> bool { + self.padding.is_some() + } + + // Param is passed by value, moved + pub fn set_padding(&mut self, v: ::std::vec::Vec) { + self.padding = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_padding(&mut self) -> &mut ::std::vec::Vec { + if self.padding.is_none() { + self.padding = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.padding.as_mut().unwrap() + } + + // Take field + pub fn take_padding(&mut self) -> ::std::vec::Vec { + self.padding.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(17); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "protocol_version", + |m: &ClientToStation| { &m.protocol_version }, + |m: &mut ClientToStation| { &mut m.protocol_version }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "decoy_list_generation", + |m: &ClientToStation| { &m.decoy_list_generation }, + |m: &mut ClientToStation| { &mut m.decoy_list_generation }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "state_transition", + |m: &ClientToStation| { &m.state_transition }, + |m: &mut ClientToStation| { &mut m.state_transition }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "upload_sync", + |m: &ClientToStation| { &m.upload_sync }, + |m: &mut ClientToStation| { &mut m.upload_sync }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "client_lib_version", + |m: &ClientToStation| { &m.client_lib_version }, + |m: &mut ClientToStation| { &mut m.client_lib_version }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "disable_registrar_overrides", + |m: &ClientToStation| { &m.disable_registrar_overrides }, + |m: &mut ClientToStation| { &mut m.disable_registrar_overrides }, + )); + fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( + "failed_decoys", + |m: &ClientToStation| { &m.failed_decoys }, + |m: &mut ClientToStation| { &mut m.failed_decoys }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, SessionStats>( + "stats", + |m: &ClientToStation| { &m.stats }, + |m: &mut ClientToStation| { &mut m.stats }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "transport", + |m: &ClientToStation| { &m.transport }, + |m: &mut ClientToStation| { &mut m.transport }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::any::Any>( + "transport_params", + |m: &ClientToStation| { &m.transport_params }, + |m: &mut ClientToStation| { &mut m.transport_params }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "covert_address", + |m: &ClientToStation| { &m.covert_address }, + |m: &mut ClientToStation| { &mut m.covert_address }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "masked_decoy_server_name", + |m: &ClientToStation| { &m.masked_decoy_server_name }, + |m: &mut ClientToStation| { &mut m.masked_decoy_server_name }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "v6_support", + |m: &ClientToStation| { &m.v6_support }, + |m: &mut ClientToStation| { &mut m.v6_support }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "v4_support", + |m: &ClientToStation| { &m.v4_support }, + |m: &mut ClientToStation| { &mut m.v4_support }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RegistrationFlags>( + "flags", + |m: &ClientToStation| { &m.flags }, + |m: &mut ClientToStation| { &mut m.flags }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, WebRTCSignal>( + "webrtc_signal", + |m: &ClientToStation| { &m.webrtc_signal }, + |m: &mut ClientToStation| { &mut m.webrtc_signal }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "padding", + |m: &ClientToStation| { &m.padding }, + |m: &mut ClientToStation| { &mut m.padding }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "ClientToStation", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for ClientToStation { + const NAME: &'static str = "ClientToStation"; + + fn is_initialized(&self) -> bool { + for v in &self.stats { + if !v.is_initialized() { + return false; + } + }; + for v in &self.transport_params { + if !v.is_initialized() { + return false; + } + }; + for v in &self.flags { + if !v.is_initialized() { + return false; + } + }; + for v in &self.webrtc_signal { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.protocol_version = ::std::option::Option::Some(is.read_uint32()?); + }, + 16 => { + self.decoy_list_generation = ::std::option::Option::Some(is.read_uint32()?); + }, + 24 => { + self.state_transition = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 32 => { + self.upload_sync = ::std::option::Option::Some(is.read_uint64()?); + }, + 40 => { + self.client_lib_version = ::std::option::Option::Some(is.read_uint32()?); + }, + 48 => { + self.disable_registrar_overrides = ::std::option::Option::Some(is.read_bool()?); + }, + 82 => { + self.failed_decoys.push(is.read_string()?); + }, + 90 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.stats)?; + }, + 96 => { + self.transport = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 106 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.transport_params)?; + }, + 162 => { + self.covert_address = ::std::option::Option::Some(is.read_string()?); + }, + 170 => { + self.masked_decoy_server_name = ::std::option::Option::Some(is.read_string()?); + }, + 176 => { + self.v6_support = ::std::option::Option::Some(is.read_bool()?); + }, + 184 => { + self.v4_support = ::std::option::Option::Some(is.read_bool()?); + }, + 194 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.flags)?; + }, + 250 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.webrtc_signal)?; + }, + 802 => { + self.padding = ::std::option::Option::Some(is.read_bytes()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.protocol_version { + my_size += ::protobuf::rt::uint32_size(1, v); + } + if let Some(v) = self.decoy_list_generation { + my_size += ::protobuf::rt::uint32_size(2, v); + } + if let Some(v) = self.state_transition { + my_size += ::protobuf::rt::int32_size(3, v.value()); + } + if let Some(v) = self.upload_sync { + my_size += ::protobuf::rt::uint64_size(4, v); + } + if let Some(v) = self.client_lib_version { + my_size += ::protobuf::rt::uint32_size(5, v); + } + if let Some(v) = self.disable_registrar_overrides { + my_size += 1 + 1; + } + for value in &self.failed_decoys { + my_size += ::protobuf::rt::string_size(10, &value); + }; + if let Some(v) = self.stats.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.transport { + my_size += ::protobuf::rt::int32_size(12, v.value()); + } + if let Some(v) = self.transport_params.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.covert_address.as_ref() { + my_size += ::protobuf::rt::string_size(20, &v); + } + if let Some(v) = self.masked_decoy_server_name.as_ref() { + my_size += ::protobuf::rt::string_size(21, &v); + } + if let Some(v) = self.v6_support { + my_size += 2 + 1; + } + if let Some(v) = self.v4_support { + my_size += 2 + 1; + } + if let Some(v) = self.flags.as_ref() { + let len = v.compute_size(); + my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.webrtc_signal.as_ref() { + let len = v.compute_size(); + my_size += 2 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.padding.as_ref() { + my_size += ::protobuf::rt::bytes_size(100, &v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.protocol_version { + os.write_uint32(1, v)?; + } + if let Some(v) = self.decoy_list_generation { + os.write_uint32(2, v)?; + } + if let Some(v) = self.state_transition { + os.write_enum(3, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.upload_sync { + os.write_uint64(4, v)?; + } + if let Some(v) = self.client_lib_version { + os.write_uint32(5, v)?; + } + if let Some(v) = self.disable_registrar_overrides { + os.write_bool(6, v)?; + } + for v in &self.failed_decoys { + os.write_string(10, &v)?; + }; + if let Some(v) = self.stats.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(11, v, os)?; + } + if let Some(v) = self.transport { + os.write_enum(12, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.transport_params.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(13, v, os)?; + } + if let Some(v) = self.covert_address.as_ref() { + os.write_string(20, v)?; + } + if let Some(v) = self.masked_decoy_server_name.as_ref() { + os.write_string(21, v)?; + } + if let Some(v) = self.v6_support { + os.write_bool(22, v)?; + } + if let Some(v) = self.v4_support { + os.write_bool(23, v)?; + } + if let Some(v) = self.flags.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(24, v, os)?; + } + if let Some(v) = self.webrtc_signal.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(31, v, os)?; + } + if let Some(v) = self.padding.as_ref() { + os.write_bytes(100, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> ClientToStation { + ClientToStation::new() + } + + fn clear(&mut self) { + self.protocol_version = ::std::option::Option::None; + self.decoy_list_generation = ::std::option::Option::None; + self.state_transition = ::std::option::Option::None; + self.upload_sync = ::std::option::Option::None; + self.client_lib_version = ::std::option::Option::None; + self.disable_registrar_overrides = ::std::option::Option::None; + self.failed_decoys.clear(); + self.stats.clear(); + self.transport = ::std::option::Option::None; + self.transport_params.clear(); + self.covert_address = ::std::option::Option::None; + self.masked_decoy_server_name = ::std::option::Option::None; + self.v6_support = ::std::option::Option::None; + self.v4_support = ::std::option::Option::None; + self.flags.clear(); + self.webrtc_signal.clear(); + self.padding = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static ClientToStation { + static instance: ClientToStation = ClientToStation { + protocol_version: ::std::option::Option::None, + decoy_list_generation: ::std::option::Option::None, + state_transition: ::std::option::Option::None, + upload_sync: ::std::option::Option::None, + client_lib_version: ::std::option::Option::None, + disable_registrar_overrides: ::std::option::Option::None, + failed_decoys: ::std::vec::Vec::new(), + stats: ::protobuf::MessageField::none(), + transport: ::std::option::Option::None, + transport_params: ::protobuf::MessageField::none(), + covert_address: ::std::option::Option::None, + masked_decoy_server_name: ::std::option::Option::None, + v6_support: ::std::option::Option::None, + v4_support: ::std::option::Option::None, + flags: ::protobuf::MessageField::none(), + webrtc_signal: ::protobuf::MessageField::none(), + padding: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for ClientToStation { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("ClientToStation").unwrap()).clone() + } +} + +impl ::std::fmt::Display for ClientToStation { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for ClientToStation { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.PrefixTransportParams) +pub struct PrefixTransportParams { + // message fields + /// Prefix Identifier + // @@protoc_insertion_point(field:proto.PrefixTransportParams.prefix_id) + pub prefix_id: ::std::option::Option, + /// Prefix bytes (optional - usually sent from station to client as override if allowed by C2S) + /// as the station cannot take this into account when attempting to identify a connection. + // @@protoc_insertion_point(field:proto.PrefixTransportParams.prefix) + pub prefix: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.PrefixTransportParams.custom_flush_policy) + pub custom_flush_policy: ::std::option::Option, + /// Indicates whether the client has elected to use destination port randomization. Should be + /// checked against selected transport to ensure that destination port randomization is + /// supported. + // @@protoc_insertion_point(field:proto.PrefixTransportParams.randomize_dst_port) + pub randomize_dst_port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.PrefixTransportParams.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a PrefixTransportParams { + fn default() -> &'a PrefixTransportParams { + ::default_instance() + } +} + +impl PrefixTransportParams { + pub fn new() -> PrefixTransportParams { + ::std::default::Default::default() + } + + // optional int32 prefix_id = 1; + + pub fn prefix_id(&self) -> i32 { + self.prefix_id.unwrap_or(0) + } + + pub fn clear_prefix_id(&mut self) { + self.prefix_id = ::std::option::Option::None; + } + + pub fn has_prefix_id(&self) -> bool { + self.prefix_id.is_some() + } + + // Param is passed by value, moved + pub fn set_prefix_id(&mut self, v: i32) { + self.prefix_id = ::std::option::Option::Some(v); + } + + // optional bytes prefix = 2; + + pub fn prefix(&self) -> &[u8] { + match self.prefix.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_prefix(&mut self) { + self.prefix = ::std::option::Option::None; + } + + pub fn has_prefix(&self) -> bool { + self.prefix.is_some() + } + + // Param is passed by value, moved + pub fn set_prefix(&mut self, v: ::std::vec::Vec) { + self.prefix = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_prefix(&mut self) -> &mut ::std::vec::Vec { + if self.prefix.is_none() { + self.prefix = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.prefix.as_mut().unwrap() + } + + // Take field + pub fn take_prefix(&mut self) -> ::std::vec::Vec { + self.prefix.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional int32 custom_flush_policy = 3; + + pub fn custom_flush_policy(&self) -> i32 { + self.custom_flush_policy.unwrap_or(0) + } + + pub fn clear_custom_flush_policy(&mut self) { + self.custom_flush_policy = ::std::option::Option::None; + } + + pub fn has_custom_flush_policy(&self) -> bool { + self.custom_flush_policy.is_some() + } + + // Param is passed by value, moved + pub fn set_custom_flush_policy(&mut self, v: i32) { + self.custom_flush_policy = ::std::option::Option::Some(v); + } + + // optional bool randomize_dst_port = 13; + + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) + } + + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; + } + + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(4); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "prefix_id", + |m: &PrefixTransportParams| { &m.prefix_id }, + |m: &mut PrefixTransportParams| { &mut m.prefix_id }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "prefix", + |m: &PrefixTransportParams| { &m.prefix }, + |m: &mut PrefixTransportParams| { &mut m.prefix }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "custom_flush_policy", + |m: &PrefixTransportParams| { &m.custom_flush_policy }, + |m: &mut PrefixTransportParams| { &mut m.custom_flush_policy }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "randomize_dst_port", + |m: &PrefixTransportParams| { &m.randomize_dst_port }, + |m: &mut PrefixTransportParams| { &mut m.randomize_dst_port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "PrefixTransportParams", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for PrefixTransportParams { + const NAME: &'static str = "PrefixTransportParams"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.prefix_id = ::std::option::Option::Some(is.read_int32()?); + }, + 18 => { + self.prefix = ::std::option::Option::Some(is.read_bytes()?); + }, + 24 => { + self.custom_flush_policy = ::std::option::Option::Some(is.read_int32()?); + }, + 104 => { + self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.prefix_id { + my_size += ::protobuf::rt::int32_size(1, v); + } + if let Some(v) = self.prefix.as_ref() { + my_size += ::protobuf::rt::bytes_size(2, &v); + } + if let Some(v) = self.custom_flush_policy { + my_size += ::protobuf::rt::int32_size(3, v); + } + if let Some(v) = self.randomize_dst_port { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.prefix_id { + os.write_int32(1, v)?; + } + if let Some(v) = self.prefix.as_ref() { + os.write_bytes(2, v)?; + } + if let Some(v) = self.custom_flush_policy { + os.write_int32(3, v)?; + } + if let Some(v) = self.randomize_dst_port { + os.write_bool(13, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> PrefixTransportParams { + PrefixTransportParams::new() + } + + fn clear(&mut self) { + self.prefix_id = ::std::option::Option::None; + self.prefix = ::std::option::Option::None; + self.custom_flush_policy = ::std::option::Option::None; + self.randomize_dst_port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static PrefixTransportParams { + static instance: PrefixTransportParams = PrefixTransportParams { + prefix_id: ::std::option::Option::None, + prefix: ::std::option::Option::None, + custom_flush_policy: ::std::option::Option::None, + randomize_dst_port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for PrefixTransportParams { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("PrefixTransportParams").unwrap()).clone() + } +} + +impl ::std::fmt::Display for PrefixTransportParams { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for PrefixTransportParams { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.GenericTransportParams) +pub struct GenericTransportParams { + // message fields + /// Indicates whether the client has elected to use destination port randomization. Should be + /// checked against selected transport to ensure that destination port randomization is + /// supported. + // @@protoc_insertion_point(field:proto.GenericTransportParams.randomize_dst_port) + pub randomize_dst_port: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.GenericTransportParams.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a GenericTransportParams { + fn default() -> &'a GenericTransportParams { + ::default_instance() + } +} + +impl GenericTransportParams { + pub fn new() -> GenericTransportParams { + ::std::default::Default::default() + } + + // optional bool randomize_dst_port = 13; + + pub fn randomize_dst_port(&self) -> bool { + self.randomize_dst_port.unwrap_or(false) + } + + pub fn clear_randomize_dst_port(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; + } + + pub fn has_randomize_dst_port(&self) -> bool { + self.randomize_dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_randomize_dst_port(&mut self, v: bool) { + self.randomize_dst_port = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(1); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "randomize_dst_port", + |m: &GenericTransportParams| { &m.randomize_dst_port }, + |m: &mut GenericTransportParams| { &mut m.randomize_dst_port }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "GenericTransportParams", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for GenericTransportParams { + const NAME: &'static str = "GenericTransportParams"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 104 => { + self.randomize_dst_port = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.randomize_dst_port { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.randomize_dst_port { + os.write_bool(13, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> GenericTransportParams { + GenericTransportParams::new() + } + + fn clear(&mut self) { + self.randomize_dst_port = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static GenericTransportParams { + static instance: GenericTransportParams = GenericTransportParams { + randomize_dst_port: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for GenericTransportParams { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("GenericTransportParams").unwrap()).clone() + } +} + +impl ::std::fmt::Display for GenericTransportParams { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for GenericTransportParams { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.C2SWrapper) +pub struct C2SWrapper { + // message fields + // @@protoc_insertion_point(field:proto.C2SWrapper.shared_secret) + pub shared_secret: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.C2SWrapper.registration_payload) + pub registration_payload: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.C2SWrapper.registration_source) + pub registration_source: ::std::option::Option<::protobuf::EnumOrUnknown>, + /// client source address when receiving a registration + // @@protoc_insertion_point(field:proto.C2SWrapper.registration_address) + pub registration_address: ::std::option::Option<::std::vec::Vec>, + /// Decoy address used when registering over Decoy registrar + // @@protoc_insertion_point(field:proto.C2SWrapper.decoy_address) + pub decoy_address: ::std::option::Option<::std::vec::Vec>, + /// The next three fields allow an independent registrar (trusted by a station w/ a zmq keypair) to + /// share the registration overrides that it assigned to the client with the station(s). + /// Registration Respose is here to allow a parsed object with direct access to the fields within. + /// RegRespBytes provides a serialized verion of the Registration response so that the signature of + /// the Bidirectional registrar can be validated before a station applies any overrides present in + /// the Registration Response. + /// + /// If you are reading this in the future and you want to extend the functionality here it might + /// make sense to make the RegistrationResponse that is sent to the client a distinct message from + /// the one that gets sent to the stations. + // @@protoc_insertion_point(field:proto.C2SWrapper.registration_response) + pub registration_response: ::protobuf::MessageField, + // @@protoc_insertion_point(field:proto.C2SWrapper.RegRespBytes) + pub RegRespBytes: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:proto.C2SWrapper.RegRespSignature) + pub RegRespSignature: ::std::option::Option<::std::vec::Vec>, + // special fields + // @@protoc_insertion_point(special_field:proto.C2SWrapper.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a C2SWrapper { + fn default() -> &'a C2SWrapper { + ::default_instance() + } +} + +impl C2SWrapper { + pub fn new() -> C2SWrapper { + ::std::default::Default::default() + } + + // optional bytes shared_secret = 1; + + pub fn shared_secret(&self) -> &[u8] { + match self.shared_secret.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_shared_secret(&mut self) { + self.shared_secret = ::std::option::Option::None; + } + + pub fn has_shared_secret(&self) -> bool { + self.shared_secret.is_some() + } + + // Param is passed by value, moved + pub fn set_shared_secret(&mut self, v: ::std::vec::Vec) { + self.shared_secret = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_shared_secret(&mut self) -> &mut ::std::vec::Vec { + if self.shared_secret.is_none() { + self.shared_secret = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.shared_secret.as_mut().unwrap() + } + + // Take field + pub fn take_shared_secret(&mut self) -> ::std::vec::Vec { + self.shared_secret.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional .proto.RegistrationSource registration_source = 4; + + pub fn registration_source(&self) -> RegistrationSource { + match self.registration_source { + Some(e) => e.enum_value_or(RegistrationSource::Unspecified), + None => RegistrationSource::Unspecified, + } + } + + pub fn clear_registration_source(&mut self) { + self.registration_source = ::std::option::Option::None; + } + + pub fn has_registration_source(&self) -> bool { + self.registration_source.is_some() + } + + // Param is passed by value, moved + pub fn set_registration_source(&mut self, v: RegistrationSource) { + self.registration_source = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional bytes registration_address = 6; + + pub fn registration_address(&self) -> &[u8] { + match self.registration_address.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_registration_address(&mut self) { + self.registration_address = ::std::option::Option::None; + } + + pub fn has_registration_address(&self) -> bool { + self.registration_address.is_some() + } + + // Param is passed by value, moved + pub fn set_registration_address(&mut self, v: ::std::vec::Vec) { + self.registration_address = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_registration_address(&mut self) -> &mut ::std::vec::Vec { + if self.registration_address.is_none() { + self.registration_address = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.registration_address.as_mut().unwrap() + } + + // Take field + pub fn take_registration_address(&mut self) -> ::std::vec::Vec { + self.registration_address.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional bytes decoy_address = 7; + + pub fn decoy_address(&self) -> &[u8] { + match self.decoy_address.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_decoy_address(&mut self) { + self.decoy_address = ::std::option::Option::None; + } + + pub fn has_decoy_address(&self) -> bool { + self.decoy_address.is_some() + } + + // Param is passed by value, moved + pub fn set_decoy_address(&mut self, v: ::std::vec::Vec) { + self.decoy_address = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_decoy_address(&mut self) -> &mut ::std::vec::Vec { + if self.decoy_address.is_none() { + self.decoy_address = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.decoy_address.as_mut().unwrap() + } + + // Take field + pub fn take_decoy_address(&mut self) -> ::std::vec::Vec { + self.decoy_address.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional bytes RegRespBytes = 9; + + pub fn RegRespBytes(&self) -> &[u8] { + match self.RegRespBytes.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_RegRespBytes(&mut self) { + self.RegRespBytes = ::std::option::Option::None; + } + + pub fn has_RegRespBytes(&self) -> bool { + self.RegRespBytes.is_some() + } + + // Param is passed by value, moved + pub fn set_RegRespBytes(&mut self, v: ::std::vec::Vec) { + self.RegRespBytes = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_RegRespBytes(&mut self) -> &mut ::std::vec::Vec { + if self.RegRespBytes.is_none() { + self.RegRespBytes = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.RegRespBytes.as_mut().unwrap() + } + + // Take field + pub fn take_RegRespBytes(&mut self) -> ::std::vec::Vec { + self.RegRespBytes.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional bytes RegRespSignature = 10; + + pub fn RegRespSignature(&self) -> &[u8] { + match self.RegRespSignature.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_RegRespSignature(&mut self) { + self.RegRespSignature = ::std::option::Option::None; + } + + pub fn has_RegRespSignature(&self) -> bool { + self.RegRespSignature.is_some() + } + + // Param is passed by value, moved + pub fn set_RegRespSignature(&mut self, v: ::std::vec::Vec) { + self.RegRespSignature = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_RegRespSignature(&mut self) -> &mut ::std::vec::Vec { + if self.RegRespSignature.is_none() { + self.RegRespSignature = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.RegRespSignature.as_mut().unwrap() + } + + // Take field + pub fn take_RegRespSignature(&mut self) -> ::std::vec::Vec { + self.RegRespSignature.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(8); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "shared_secret", + |m: &C2SWrapper| { &m.shared_secret }, + |m: &mut C2SWrapper| { &mut m.shared_secret }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ClientToStation>( + "registration_payload", + |m: &C2SWrapper| { &m.registration_payload }, + |m: &mut C2SWrapper| { &mut m.registration_payload }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "registration_source", + |m: &C2SWrapper| { &m.registration_source }, + |m: &mut C2SWrapper| { &mut m.registration_source }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "registration_address", + |m: &C2SWrapper| { &m.registration_address }, + |m: &mut C2SWrapper| { &mut m.registration_address }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "decoy_address", + |m: &C2SWrapper| { &m.decoy_address }, + |m: &mut C2SWrapper| { &mut m.decoy_address }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RegistrationResponse>( + "registration_response", + |m: &C2SWrapper| { &m.registration_response }, + |m: &mut C2SWrapper| { &mut m.registration_response }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "RegRespBytes", + |m: &C2SWrapper| { &m.RegRespBytes }, + |m: &mut C2SWrapper| { &mut m.RegRespBytes }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "RegRespSignature", + |m: &C2SWrapper| { &m.RegRespSignature }, + |m: &mut C2SWrapper| { &mut m.RegRespSignature }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "C2SWrapper", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for C2SWrapper { + const NAME: &'static str = "C2SWrapper"; + + fn is_initialized(&self) -> bool { + for v in &self.registration_payload { + if !v.is_initialized() { + return false; + } + }; + for v in &self.registration_response { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.shared_secret = ::std::option::Option::Some(is.read_bytes()?); + }, + 26 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.registration_payload)?; + }, + 32 => { + self.registration_source = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 50 => { + self.registration_address = ::std::option::Option::Some(is.read_bytes()?); + }, + 58 => { + self.decoy_address = ::std::option::Option::Some(is.read_bytes()?); + }, + 66 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.registration_response)?; + }, + 74 => { + self.RegRespBytes = ::std::option::Option::Some(is.read_bytes()?); + }, + 82 => { + self.RegRespSignature = ::std::option::Option::Some(is.read_bytes()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.shared_secret.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.registration_payload.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.registration_source { + my_size += ::protobuf::rt::int32_size(4, v.value()); + } + if let Some(v) = self.registration_address.as_ref() { + my_size += ::protobuf::rt::bytes_size(6, &v); + } + if let Some(v) = self.decoy_address.as_ref() { + my_size += ::protobuf::rt::bytes_size(7, &v); + } + if let Some(v) = self.registration_response.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.RegRespBytes.as_ref() { + my_size += ::protobuf::rt::bytes_size(9, &v); + } + if let Some(v) = self.RegRespSignature.as_ref() { + my_size += ::protobuf::rt::bytes_size(10, &v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.shared_secret.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.registration_payload.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?; + } + if let Some(v) = self.registration_source { + os.write_enum(4, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.registration_address.as_ref() { + os.write_bytes(6, v)?; + } + if let Some(v) = self.decoy_address.as_ref() { + os.write_bytes(7, v)?; + } + if let Some(v) = self.registration_response.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(8, v, os)?; + } + if let Some(v) = self.RegRespBytes.as_ref() { + os.write_bytes(9, v)?; + } + if let Some(v) = self.RegRespSignature.as_ref() { + os.write_bytes(10, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> C2SWrapper { + C2SWrapper::new() + } + + fn clear(&mut self) { + self.shared_secret = ::std::option::Option::None; + self.registration_payload.clear(); + self.registration_source = ::std::option::Option::None; + self.registration_address = ::std::option::Option::None; + self.decoy_address = ::std::option::Option::None; + self.registration_response.clear(); + self.RegRespBytes = ::std::option::Option::None; + self.RegRespSignature = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static C2SWrapper { + static instance: C2SWrapper = C2SWrapper { + shared_secret: ::std::option::Option::None, + registration_payload: ::protobuf::MessageField::none(), + registration_source: ::std::option::Option::None, + registration_address: ::std::option::Option::None, + decoy_address: ::std::option::Option::None, + registration_response: ::protobuf::MessageField::none(), + RegRespBytes: ::std::option::Option::None, + RegRespSignature: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for C2SWrapper { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("C2SWrapper").unwrap()).clone() + } +} + +impl ::std::fmt::Display for C2SWrapper { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for C2SWrapper { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.SessionStats) +pub struct SessionStats { + // message fields + // @@protoc_insertion_point(field:proto.SessionStats.failed_decoys_amount) + pub failed_decoys_amount: ::std::option::Option, + /// Applicable to whole session: + // @@protoc_insertion_point(field:proto.SessionStats.total_time_to_connect) + pub total_time_to_connect: ::std::option::Option, + /// Last (i.e. successful) decoy: + // @@protoc_insertion_point(field:proto.SessionStats.rtt_to_station) + pub rtt_to_station: ::std::option::Option, + // @@protoc_insertion_point(field:proto.SessionStats.tls_to_decoy) + pub tls_to_decoy: ::std::option::Option, + // @@protoc_insertion_point(field:proto.SessionStats.tcp_to_decoy) + pub tcp_to_decoy: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.SessionStats.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a SessionStats { + fn default() -> &'a SessionStats { + ::default_instance() + } +} + +impl SessionStats { + pub fn new() -> SessionStats { + ::std::default::Default::default() + } + + // optional uint32 failed_decoys_amount = 20; + + pub fn failed_decoys_amount(&self) -> u32 { + self.failed_decoys_amount.unwrap_or(0) + } + + pub fn clear_failed_decoys_amount(&mut self) { + self.failed_decoys_amount = ::std::option::Option::None; + } + + pub fn has_failed_decoys_amount(&self) -> bool { + self.failed_decoys_amount.is_some() + } + + // Param is passed by value, moved + pub fn set_failed_decoys_amount(&mut self, v: u32) { + self.failed_decoys_amount = ::std::option::Option::Some(v); + } + + // optional uint32 total_time_to_connect = 31; + + pub fn total_time_to_connect(&self) -> u32 { + self.total_time_to_connect.unwrap_or(0) + } + + pub fn clear_total_time_to_connect(&mut self) { + self.total_time_to_connect = ::std::option::Option::None; + } + + pub fn has_total_time_to_connect(&self) -> bool { + self.total_time_to_connect.is_some() + } + + // Param is passed by value, moved + pub fn set_total_time_to_connect(&mut self, v: u32) { + self.total_time_to_connect = ::std::option::Option::Some(v); + } + + // optional uint32 rtt_to_station = 33; + + pub fn rtt_to_station(&self) -> u32 { + self.rtt_to_station.unwrap_or(0) + } + + pub fn clear_rtt_to_station(&mut self) { + self.rtt_to_station = ::std::option::Option::None; + } + + pub fn has_rtt_to_station(&self) -> bool { + self.rtt_to_station.is_some() + } + + // Param is passed by value, moved + pub fn set_rtt_to_station(&mut self, v: u32) { + self.rtt_to_station = ::std::option::Option::Some(v); + } + + // optional uint32 tls_to_decoy = 38; + + pub fn tls_to_decoy(&self) -> u32 { + self.tls_to_decoy.unwrap_or(0) + } + + pub fn clear_tls_to_decoy(&mut self) { + self.tls_to_decoy = ::std::option::Option::None; + } + + pub fn has_tls_to_decoy(&self) -> bool { + self.tls_to_decoy.is_some() + } + + // Param is passed by value, moved + pub fn set_tls_to_decoy(&mut self, v: u32) { + self.tls_to_decoy = ::std::option::Option::Some(v); + } + + // optional uint32 tcp_to_decoy = 39; + + pub fn tcp_to_decoy(&self) -> u32 { + self.tcp_to_decoy.unwrap_or(0) + } + + pub fn clear_tcp_to_decoy(&mut self) { + self.tcp_to_decoy = ::std::option::Option::None; + } + + pub fn has_tcp_to_decoy(&self) -> bool { + self.tcp_to_decoy.is_some() + } + + // Param is passed by value, moved + pub fn set_tcp_to_decoy(&mut self, v: u32) { + self.tcp_to_decoy = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(5); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "failed_decoys_amount", + |m: &SessionStats| { &m.failed_decoys_amount }, + |m: &mut SessionStats| { &mut m.failed_decoys_amount }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "total_time_to_connect", + |m: &SessionStats| { &m.total_time_to_connect }, + |m: &mut SessionStats| { &mut m.total_time_to_connect }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "rtt_to_station", + |m: &SessionStats| { &m.rtt_to_station }, + |m: &mut SessionStats| { &mut m.rtt_to_station }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "tls_to_decoy", + |m: &SessionStats| { &m.tls_to_decoy }, + |m: &mut SessionStats| { &mut m.tls_to_decoy }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "tcp_to_decoy", + |m: &SessionStats| { &m.tcp_to_decoy }, + |m: &mut SessionStats| { &mut m.tcp_to_decoy }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "SessionStats", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for SessionStats { + const NAME: &'static str = "SessionStats"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 160 => { + self.failed_decoys_amount = ::std::option::Option::Some(is.read_uint32()?); + }, + 248 => { + self.total_time_to_connect = ::std::option::Option::Some(is.read_uint32()?); + }, + 264 => { + self.rtt_to_station = ::std::option::Option::Some(is.read_uint32()?); + }, + 304 => { + self.tls_to_decoy = ::std::option::Option::Some(is.read_uint32()?); + }, + 312 => { + self.tcp_to_decoy = ::std::option::Option::Some(is.read_uint32()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.failed_decoys_amount { + my_size += ::protobuf::rt::uint32_size(20, v); + } + if let Some(v) = self.total_time_to_connect { + my_size += ::protobuf::rt::uint32_size(31, v); + } + if let Some(v) = self.rtt_to_station { + my_size += ::protobuf::rt::uint32_size(33, v); + } + if let Some(v) = self.tls_to_decoy { + my_size += ::protobuf::rt::uint32_size(38, v); + } + if let Some(v) = self.tcp_to_decoy { + my_size += ::protobuf::rt::uint32_size(39, v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.failed_decoys_amount { + os.write_uint32(20, v)?; + } + if let Some(v) = self.total_time_to_connect { + os.write_uint32(31, v)?; + } + if let Some(v) = self.rtt_to_station { + os.write_uint32(33, v)?; + } + if let Some(v) = self.tls_to_decoy { + os.write_uint32(38, v)?; + } + if let Some(v) = self.tcp_to_decoy { + os.write_uint32(39, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> SessionStats { + SessionStats::new() + } + + fn clear(&mut self) { + self.failed_decoys_amount = ::std::option::Option::None; + self.total_time_to_connect = ::std::option::Option::None; + self.rtt_to_station = ::std::option::Option::None; + self.tls_to_decoy = ::std::option::Option::None; + self.tcp_to_decoy = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static SessionStats { + static instance: SessionStats = SessionStats { + failed_decoys_amount: ::std::option::Option::None, + total_time_to_connect: ::std::option::Option::None, + rtt_to_station: ::std::option::Option::None, + tls_to_decoy: ::std::option::Option::None, + tcp_to_decoy: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for SessionStats { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("SessionStats").unwrap()).clone() + } +} + +impl ::std::fmt::Display for SessionStats { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for SessionStats { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.StationToDetector) +pub struct StationToDetector { + // message fields + // @@protoc_insertion_point(field:proto.StationToDetector.phantom_ip) + pub phantom_ip: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.StationToDetector.client_ip) + pub client_ip: ::std::option::Option<::std::string::String>, + // @@protoc_insertion_point(field:proto.StationToDetector.timeout_ns) + pub timeout_ns: ::std::option::Option, + // @@protoc_insertion_point(field:proto.StationToDetector.operation) + pub operation: ::std::option::Option<::protobuf::EnumOrUnknown>, + // @@protoc_insertion_point(field:proto.StationToDetector.dst_port) + pub dst_port: ::std::option::Option, + // @@protoc_insertion_point(field:proto.StationToDetector.src_port) + pub src_port: ::std::option::Option, + // @@protoc_insertion_point(field:proto.StationToDetector.proto) + pub proto: ::std::option::Option<::protobuf::EnumOrUnknown>, + // special fields + // @@protoc_insertion_point(special_field:proto.StationToDetector.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a StationToDetector { + fn default() -> &'a StationToDetector { + ::default_instance() + } +} + +impl StationToDetector { + pub fn new() -> StationToDetector { + ::std::default::Default::default() + } + + // optional string phantom_ip = 1; + + pub fn phantom_ip(&self) -> &str { + match self.phantom_ip.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_phantom_ip(&mut self) { + self.phantom_ip = ::std::option::Option::None; + } + + pub fn has_phantom_ip(&self) -> bool { + self.phantom_ip.is_some() + } + + // Param is passed by value, moved + pub fn set_phantom_ip(&mut self, v: ::std::string::String) { + self.phantom_ip = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_phantom_ip(&mut self) -> &mut ::std::string::String { + if self.phantom_ip.is_none() { + self.phantom_ip = ::std::option::Option::Some(::std::string::String::new()); + } + self.phantom_ip.as_mut().unwrap() + } + + // Take field + pub fn take_phantom_ip(&mut self) -> ::std::string::String { + self.phantom_ip.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional string client_ip = 2; + + pub fn client_ip(&self) -> &str { + match self.client_ip.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_client_ip(&mut self) { + self.client_ip = ::std::option::Option::None; + } + + pub fn has_client_ip(&self) -> bool { + self.client_ip.is_some() + } + + // Param is passed by value, moved + pub fn set_client_ip(&mut self, v: ::std::string::String) { + self.client_ip = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_client_ip(&mut self) -> &mut ::std::string::String { + if self.client_ip.is_none() { + self.client_ip = ::std::option::Option::Some(::std::string::String::new()); + } + self.client_ip.as_mut().unwrap() + } + + // Take field + pub fn take_client_ip(&mut self) -> ::std::string::String { + self.client_ip.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional uint64 timeout_ns = 3; + + pub fn timeout_ns(&self) -> u64 { + self.timeout_ns.unwrap_or(0) + } + + pub fn clear_timeout_ns(&mut self) { + self.timeout_ns = ::std::option::Option::None; + } + + pub fn has_timeout_ns(&self) -> bool { + self.timeout_ns.is_some() + } + + // Param is passed by value, moved + pub fn set_timeout_ns(&mut self, v: u64) { + self.timeout_ns = ::std::option::Option::Some(v); + } + + // optional .proto.StationOperations operation = 4; + + pub fn operation(&self) -> StationOperations { + match self.operation { + Some(e) => e.enum_value_or(StationOperations::Unknown), + None => StationOperations::Unknown, + } + } + + pub fn clear_operation(&mut self) { + self.operation = ::std::option::Option::None; + } + + pub fn has_operation(&self) -> bool { + self.operation.is_some() + } + + // Param is passed by value, moved + pub fn set_operation(&mut self, v: StationOperations) { + self.operation = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + // optional uint32 dst_port = 10; + + pub fn dst_port(&self) -> u32 { + self.dst_port.unwrap_or(0) + } + + pub fn clear_dst_port(&mut self) { + self.dst_port = ::std::option::Option::None; + } + + pub fn has_dst_port(&self) -> bool { + self.dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_dst_port(&mut self, v: u32) { + self.dst_port = ::std::option::Option::Some(v); + } + + // optional uint32 src_port = 11; + + pub fn src_port(&self) -> u32 { + self.src_port.unwrap_or(0) + } + + pub fn clear_src_port(&mut self) { + self.src_port = ::std::option::Option::None; + } + + pub fn has_src_port(&self) -> bool { + self.src_port.is_some() + } + + // Param is passed by value, moved + pub fn set_src_port(&mut self, v: u32) { + self.src_port = ::std::option::Option::Some(v); + } + + // optional .proto.IPProto proto = 12; + + pub fn proto(&self) -> IPProto { + match self.proto { + Some(e) => e.enum_value_or(IPProto::Unk), + None => IPProto::Unk, + } + } + + pub fn clear_proto(&mut self) { + self.proto = ::std::option::Option::None; + } + + pub fn has_proto(&self) -> bool { + self.proto.is_some() + } + + // Param is passed by value, moved + pub fn set_proto(&mut self, v: IPProto) { + self.proto = ::std::option::Option::Some(::protobuf::EnumOrUnknown::new(v)); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(7); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "phantom_ip", + |m: &StationToDetector| { &m.phantom_ip }, + |m: &mut StationToDetector| { &mut m.phantom_ip }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "client_ip", + |m: &StationToDetector| { &m.client_ip }, + |m: &mut StationToDetector| { &mut m.client_ip }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "timeout_ns", + |m: &StationToDetector| { &m.timeout_ns }, + |m: &mut StationToDetector| { &mut m.timeout_ns }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "operation", + |m: &StationToDetector| { &m.operation }, + |m: &mut StationToDetector| { &mut m.operation }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "dst_port", + |m: &StationToDetector| { &m.dst_port }, + |m: &mut StationToDetector| { &mut m.dst_port }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "src_port", + |m: &StationToDetector| { &m.src_port }, + |m: &mut StationToDetector| { &mut m.src_port }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "proto", + |m: &StationToDetector| { &m.proto }, + |m: &mut StationToDetector| { &mut m.proto }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "StationToDetector", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for StationToDetector { + const NAME: &'static str = "StationToDetector"; + + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.phantom_ip = ::std::option::Option::Some(is.read_string()?); + }, + 18 => { + self.client_ip = ::std::option::Option::Some(is.read_string()?); + }, + 24 => { + self.timeout_ns = ::std::option::Option::Some(is.read_uint64()?); + }, + 32 => { + self.operation = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + 80 => { + self.dst_port = ::std::option::Option::Some(is.read_uint32()?); + }, + 88 => { + self.src_port = ::std::option::Option::Some(is.read_uint32()?); + }, + 96 => { + self.proto = ::std::option::Option::Some(is.read_enum_or_unknown()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.phantom_ip.as_ref() { + my_size += ::protobuf::rt::string_size(1, &v); + } + if let Some(v) = self.client_ip.as_ref() { + my_size += ::protobuf::rt::string_size(2, &v); + } + if let Some(v) = self.timeout_ns { + my_size += ::protobuf::rt::uint64_size(3, v); + } + if let Some(v) = self.operation { + my_size += ::protobuf::rt::int32_size(4, v.value()); + } + if let Some(v) = self.dst_port { + my_size += ::protobuf::rt::uint32_size(10, v); + } + if let Some(v) = self.src_port { + my_size += ::protobuf::rt::uint32_size(11, v); + } + if let Some(v) = self.proto { + my_size += ::protobuf::rt::int32_size(12, v.value()); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.phantom_ip.as_ref() { + os.write_string(1, v)?; + } + if let Some(v) = self.client_ip.as_ref() { + os.write_string(2, v)?; + } + if let Some(v) = self.timeout_ns { + os.write_uint64(3, v)?; + } + if let Some(v) = self.operation { + os.write_enum(4, ::protobuf::EnumOrUnknown::value(&v))?; + } + if let Some(v) = self.dst_port { + os.write_uint32(10, v)?; + } + if let Some(v) = self.src_port { + os.write_uint32(11, v)?; + } + if let Some(v) = self.proto { + os.write_enum(12, ::protobuf::EnumOrUnknown::value(&v))?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> StationToDetector { + StationToDetector::new() + } + + fn clear(&mut self) { + self.phantom_ip = ::std::option::Option::None; + self.client_ip = ::std::option::Option::None; + self.timeout_ns = ::std::option::Option::None; + self.operation = ::std::option::Option::None; + self.dst_port = ::std::option::Option::None; + self.src_port = ::std::option::Option::None; + self.proto = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static StationToDetector { + static instance: StationToDetector = StationToDetector { + phantom_ip: ::std::option::Option::None, + client_ip: ::std::option::Option::None, + timeout_ns: ::std::option::Option::None, + operation: ::std::option::Option::None, + dst_port: ::std::option::Option::None, + src_port: ::std::option::Option::None, + proto: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for StationToDetector { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("StationToDetector").unwrap()).clone() + } +} + +impl ::std::fmt::Display for StationToDetector { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for StationToDetector { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// Adding message response from Station to Client for bidirectional API +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.RegistrationResponse) +pub struct RegistrationResponse { + // message fields + // @@protoc_insertion_point(field:proto.RegistrationResponse.ipv4addr) + pub ipv4addr: ::std::option::Option, + /// The 128-bit ipv6 address, in network byte order + // @@protoc_insertion_point(field:proto.RegistrationResponse.ipv6addr) + pub ipv6addr: ::std::option::Option<::std::vec::Vec>, + /// Respond with randomized port + // @@protoc_insertion_point(field:proto.RegistrationResponse.dst_port) + pub dst_port: ::std::option::Option, + /// Future: station provides client with secret, want chanel present + /// Leave null for now + // @@protoc_insertion_point(field:proto.RegistrationResponse.serverRandom) + pub serverRandom: ::std::option::Option<::std::vec::Vec>, + /// If registration wrong, populate this error string + // @@protoc_insertion_point(field:proto.RegistrationResponse.error) + pub error: ::std::option::Option<::std::string::String>, + /// ClientConf field (optional) + // @@protoc_insertion_point(field:proto.RegistrationResponse.clientConf) + pub clientConf: ::protobuf::MessageField, + /// Transport Params to if `allow_registrar_overrides` is set. + // @@protoc_insertion_point(field:proto.RegistrationResponse.transport_params) + pub transport_params: ::protobuf::MessageField<::protobuf::well_known_types::any::Any>, + /// PhantomsSupportPortRand is a flag that indicates whether the selected phantoms are able to + /// handle phantom connections to randomized ports. + // @@protoc_insertion_point(field:proto.RegistrationResponse.phantoms_support_port_rand) + pub phantoms_support_port_rand: ::std::option::Option, + // special fields + // @@protoc_insertion_point(special_field:proto.RegistrationResponse.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a RegistrationResponse { + fn default() -> &'a RegistrationResponse { + ::default_instance() + } +} + +impl RegistrationResponse { + pub fn new() -> RegistrationResponse { + ::std::default::Default::default() + } + + // optional fixed32 ipv4addr = 1; + + pub fn ipv4addr(&self) -> u32 { + self.ipv4addr.unwrap_or(0) + } + + pub fn clear_ipv4addr(&mut self) { + self.ipv4addr = ::std::option::Option::None; + } + + pub fn has_ipv4addr(&self) -> bool { + self.ipv4addr.is_some() + } + + // Param is passed by value, moved + pub fn set_ipv4addr(&mut self, v: u32) { + self.ipv4addr = ::std::option::Option::Some(v); + } + + // optional bytes ipv6addr = 2; + + pub fn ipv6addr(&self) -> &[u8] { + match self.ipv6addr.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_ipv6addr(&mut self) { + self.ipv6addr = ::std::option::Option::None; + } + + pub fn has_ipv6addr(&self) -> bool { + self.ipv6addr.is_some() + } + + // Param is passed by value, moved + pub fn set_ipv6addr(&mut self, v: ::std::vec::Vec) { + self.ipv6addr = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_ipv6addr(&mut self) -> &mut ::std::vec::Vec { + if self.ipv6addr.is_none() { + self.ipv6addr = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.ipv6addr.as_mut().unwrap() + } + + // Take field + pub fn take_ipv6addr(&mut self) -> ::std::vec::Vec { + self.ipv6addr.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional uint32 dst_port = 3; + + pub fn dst_port(&self) -> u32 { + self.dst_port.unwrap_or(0) + } + + pub fn clear_dst_port(&mut self) { + self.dst_port = ::std::option::Option::None; + } + + pub fn has_dst_port(&self) -> bool { + self.dst_port.is_some() + } + + // Param is passed by value, moved + pub fn set_dst_port(&mut self, v: u32) { + self.dst_port = ::std::option::Option::Some(v); + } + + // optional bytes serverRandom = 4; + + pub fn serverRandom(&self) -> &[u8] { + match self.serverRandom.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_serverRandom(&mut self) { + self.serverRandom = ::std::option::Option::None; + } + + pub fn has_serverRandom(&self) -> bool { + self.serverRandom.is_some() + } + + // Param is passed by value, moved + pub fn set_serverRandom(&mut self, v: ::std::vec::Vec) { + self.serverRandom = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_serverRandom(&mut self) -> &mut ::std::vec::Vec { + if self.serverRandom.is_none() { + self.serverRandom = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.serverRandom.as_mut().unwrap() + } + + // Take field + pub fn take_serverRandom(&mut self) -> ::std::vec::Vec { + self.serverRandom.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // optional string error = 5; + + pub fn error(&self) -> &str { + match self.error.as_ref() { + Some(v) => v, + None => "", + } + } + + pub fn clear_error(&mut self) { + self.error = ::std::option::Option::None; + } + + pub fn has_error(&self) -> bool { + self.error.is_some() + } + + // Param is passed by value, moved + pub fn set_error(&mut self, v: ::std::string::String) { + self.error = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_error(&mut self) -> &mut ::std::string::String { + if self.error.is_none() { + self.error = ::std::option::Option::Some(::std::string::String::new()); + } + self.error.as_mut().unwrap() + } + + // Take field + pub fn take_error(&mut self) -> ::std::string::String { + self.error.take().unwrap_or_else(|| ::std::string::String::new()) + } + + // optional bool phantoms_support_port_rand = 11; + + pub fn phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.unwrap_or(false) + } + + pub fn clear_phantoms_support_port_rand(&mut self) { + self.phantoms_support_port_rand = ::std::option::Option::None; + } + + pub fn has_phantoms_support_port_rand(&self) -> bool { + self.phantoms_support_port_rand.is_some() + } + + // Param is passed by value, moved + pub fn set_phantoms_support_port_rand(&mut self, v: bool) { + self.phantoms_support_port_rand = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(8); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ipv4addr", + |m: &RegistrationResponse| { &m.ipv4addr }, + |m: &mut RegistrationResponse| { &mut m.ipv4addr }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "ipv6addr", + |m: &RegistrationResponse| { &m.ipv6addr }, + |m: &mut RegistrationResponse| { &mut m.ipv6addr }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "dst_port", + |m: &RegistrationResponse| { &m.dst_port }, + |m: &mut RegistrationResponse| { &mut m.dst_port }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "serverRandom", + |m: &RegistrationResponse| { &m.serverRandom }, + |m: &mut RegistrationResponse| { &mut m.serverRandom }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "error", + |m: &RegistrationResponse| { &m.error }, + |m: &mut RegistrationResponse| { &mut m.error }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ClientConf>( + "clientConf", + |m: &RegistrationResponse| { &m.clientConf }, + |m: &mut RegistrationResponse| { &mut m.clientConf }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::any::Any>( + "transport_params", + |m: &RegistrationResponse| { &m.transport_params }, + |m: &mut RegistrationResponse| { &mut m.transport_params }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "phantoms_support_port_rand", + |m: &RegistrationResponse| { &m.phantoms_support_port_rand }, + |m: &mut RegistrationResponse| { &mut m.phantoms_support_port_rand }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "RegistrationResponse", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for RegistrationResponse { + const NAME: &'static str = "RegistrationResponse"; + + fn is_initialized(&self) -> bool { + for v in &self.clientConf { + if !v.is_initialized() { + return false; + } + }; + for v in &self.transport_params { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 13 => { + self.ipv4addr = ::std::option::Option::Some(is.read_fixed32()?); + }, + 18 => { + self.ipv6addr = ::std::option::Option::Some(is.read_bytes()?); + }, + 24 => { + self.dst_port = ::std::option::Option::Some(is.read_uint32()?); + }, + 34 => { + self.serverRandom = ::std::option::Option::Some(is.read_bytes()?); + }, + 42 => { + self.error = ::std::option::Option::Some(is.read_string()?); + }, + 50 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.clientConf)?; + }, + 82 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.transport_params)?; + }, + 88 => { + self.phantoms_support_port_rand = ::std::option::Option::Some(is.read_bool()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.ipv4addr { + my_size += 1 + 4; + } + if let Some(v) = self.ipv6addr.as_ref() { + my_size += ::protobuf::rt::bytes_size(2, &v); + } + if let Some(v) = self.dst_port { + my_size += ::protobuf::rt::uint32_size(3, v); + } + if let Some(v) = self.serverRandom.as_ref() { + my_size += ::protobuf::rt::bytes_size(4, &v); + } + if let Some(v) = self.error.as_ref() { + my_size += ::protobuf::rt::string_size(5, &v); + } + if let Some(v) = self.clientConf.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.transport_params.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + if let Some(v) = self.phantoms_support_port_rand { + my_size += 1 + 1; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.ipv4addr { + os.write_fixed32(1, v)?; + } + if let Some(v) = self.ipv6addr.as_ref() { + os.write_bytes(2, v)?; + } + if let Some(v) = self.dst_port { + os.write_uint32(3, v)?; + } + if let Some(v) = self.serverRandom.as_ref() { + os.write_bytes(4, v)?; + } + if let Some(v) = self.error.as_ref() { + os.write_string(5, v)?; + } + if let Some(v) = self.clientConf.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(6, v, os)?; + } + if let Some(v) = self.transport_params.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?; + } + if let Some(v) = self.phantoms_support_port_rand { + os.write_bool(11, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> RegistrationResponse { + RegistrationResponse::new() + } + + fn clear(&mut self) { + self.ipv4addr = ::std::option::Option::None; + self.ipv6addr = ::std::option::Option::None; + self.dst_port = ::std::option::Option::None; + self.serverRandom = ::std::option::Option::None; + self.error = ::std::option::Option::None; + self.clientConf.clear(); + self.transport_params.clear(); + self.phantoms_support_port_rand = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static RegistrationResponse { + static instance: RegistrationResponse = RegistrationResponse { + ipv4addr: ::std::option::Option::None, + ipv6addr: ::std::option::Option::None, + dst_port: ::std::option::Option::None, + serverRandom: ::std::option::Option::None, + error: ::std::option::Option::None, + clientConf: ::protobuf::MessageField::none(), + transport_params: ::protobuf::MessageField::none(), + phantoms_support_port_rand: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for RegistrationResponse { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("RegistrationResponse").unwrap()).clone() + } +} + +impl ::std::fmt::Display for RegistrationResponse { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for RegistrationResponse { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +/// response from dns +#[derive(PartialEq,Clone,Default,Debug)] +// @@protoc_insertion_point(message:proto.DnsResponse) +pub struct DnsResponse { + // message fields + // @@protoc_insertion_point(field:proto.DnsResponse.success) + pub success: ::std::option::Option, + // @@protoc_insertion_point(field:proto.DnsResponse.clientconf_outdated) + pub clientconf_outdated: ::std::option::Option, + // @@protoc_insertion_point(field:proto.DnsResponse.bidirectional_response) + pub bidirectional_response: ::protobuf::MessageField, + // special fields + // @@protoc_insertion_point(special_field:proto.DnsResponse.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a DnsResponse { + fn default() -> &'a DnsResponse { + ::default_instance() + } +} + +impl DnsResponse { + pub fn new() -> DnsResponse { + ::std::default::Default::default() + } + + // optional bool success = 1; + + pub fn success(&self) -> bool { + self.success.unwrap_or(false) + } + + pub fn clear_success(&mut self) { + self.success = ::std::option::Option::None; + } + + pub fn has_success(&self) -> bool { + self.success.is_some() + } + + // Param is passed by value, moved + pub fn set_success(&mut self, v: bool) { + self.success = ::std::option::Option::Some(v); + } + + // optional bool clientconf_outdated = 2; + + pub fn clientconf_outdated(&self) -> bool { + self.clientconf_outdated.unwrap_or(false) + } + + pub fn clear_clientconf_outdated(&mut self) { + self.clientconf_outdated = ::std::option::Option::None; + } + + pub fn has_clientconf_outdated(&self) -> bool { + self.clientconf_outdated.is_some() + } + + // Param is passed by value, moved + pub fn set_clientconf_outdated(&mut self, v: bool) { + self.clientconf_outdated = ::std::option::Option::Some(v); + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(3); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "success", + |m: &DnsResponse| { &m.success }, + |m: &mut DnsResponse| { &mut m.success }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "clientconf_outdated", + |m: &DnsResponse| { &m.clientconf_outdated }, + |m: &mut DnsResponse| { &mut m.clientconf_outdated }, + )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, RegistrationResponse>( + "bidirectional_response", + |m: &DnsResponse| { &m.bidirectional_response }, + |m: &mut DnsResponse| { &mut m.bidirectional_response }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "DnsResponse", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for DnsResponse { + const NAME: &'static str = "DnsResponse"; + + fn is_initialized(&self) -> bool { + for v in &self.bidirectional_response { + if !v.is_initialized() { + return false; + } + }; + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 8 => { + self.success = ::std::option::Option::Some(is.read_bool()?); + }, + 16 => { + self.clientconf_outdated = ::std::option::Option::Some(is.read_bool()?); + }, + 26 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.bidirectional_response)?; + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.success { + my_size += 1 + 1; + } + if let Some(v) = self.clientconf_outdated { + my_size += 1 + 1; + } + if let Some(v) = self.bidirectional_response.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.success { + os.write_bool(1, v)?; + } + if let Some(v) = self.clientconf_outdated { + os.write_bool(2, v)?; + } + if let Some(v) = self.bidirectional_response.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> DnsResponse { + DnsResponse::new() + } + + fn clear(&mut self) { + self.success = ::std::option::Option::None; + self.clientconf_outdated = ::std::option::Option::None; + self.bidirectional_response.clear(); + self.special_fields.clear(); + } + + fn default_instance() -> &'static DnsResponse { + static instance: DnsResponse = DnsResponse { + success: ::std::option::Option::None, + clientconf_outdated: ::std::option::Option::None, + bidirectional_response: ::protobuf::MessageField::none(), + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for DnsResponse { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("DnsResponse").unwrap()).clone() + } +} + +impl ::std::fmt::Display for DnsResponse { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for DnsResponse { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.KeyType) +pub enum KeyType { + // @@protoc_insertion_point(enum_value:proto.KeyType.AES_GCM_128) + AES_GCM_128 = 90, + // @@protoc_insertion_point(enum_value:proto.KeyType.AES_GCM_256) + AES_GCM_256 = 91, +} + +impl ::protobuf::Enum for KeyType { + const NAME: &'static str = "KeyType"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 90 => ::std::option::Option::Some(KeyType::AES_GCM_128), + 91 => ::std::option::Option::Some(KeyType::AES_GCM_256), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [KeyType] = &[ + KeyType::AES_GCM_128, + KeyType::AES_GCM_256, + ]; +} + +impl ::protobuf::EnumFull for KeyType { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("KeyType").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + KeyType::AES_GCM_128 => 0, + KeyType::AES_GCM_256 => 1, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +// Note, `Default` is implemented although default value is not 0 +impl ::std::default::Default for KeyType { + fn default() -> Self { + KeyType::AES_GCM_128 + } +} + +impl KeyType { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("KeyType") + } +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.DnsRegMethod) +pub enum DnsRegMethod { + // @@protoc_insertion_point(enum_value:proto.DnsRegMethod.UDP) + UDP = 1, + // @@protoc_insertion_point(enum_value:proto.DnsRegMethod.DOT) + DOT = 2, + // @@protoc_insertion_point(enum_value:proto.DnsRegMethod.DOH) + DOH = 3, +} + +impl ::protobuf::Enum for DnsRegMethod { + const NAME: &'static str = "DnsRegMethod"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 1 => ::std::option::Option::Some(DnsRegMethod::UDP), + 2 => ::std::option::Option::Some(DnsRegMethod::DOT), + 3 => ::std::option::Option::Some(DnsRegMethod::DOH), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [DnsRegMethod] = &[ + DnsRegMethod::UDP, + DnsRegMethod::DOT, + DnsRegMethod::DOH, + ]; +} + +impl ::protobuf::EnumFull for DnsRegMethod { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("DnsRegMethod").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + DnsRegMethod::UDP => 0, + DnsRegMethod::DOT => 1, + DnsRegMethod::DOH => 2, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +// Note, `Default` is implemented although default value is not 0 +impl ::std::default::Default for DnsRegMethod { + fn default() -> Self { + DnsRegMethod::UDP + } +} + +impl DnsRegMethod { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("DnsRegMethod") + } +} + +/// State transitions of the client +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.C2S_Transition) +pub enum C2S_Transition { + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_NO_CHANGE) + C2S_NO_CHANGE = 0, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_SESSION_INIT) + C2S_SESSION_INIT = 1, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_SESSION_COVERT_INIT) + C2S_SESSION_COVERT_INIT = 11, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_EXPECT_RECONNECT) + C2S_EXPECT_RECONNECT = 2, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_SESSION_CLOSE) + C2S_SESSION_CLOSE = 3, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_YIELD_UPLOAD) + C2S_YIELD_UPLOAD = 4, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_ACQUIRE_UPLOAD) + C2S_ACQUIRE_UPLOAD = 5, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_EXPECT_UPLOADONLY_RECONN) + C2S_EXPECT_UPLOADONLY_RECONN = 6, + // @@protoc_insertion_point(enum_value:proto.C2S_Transition.C2S_ERROR) + C2S_ERROR = 255, +} + +impl ::protobuf::Enum for C2S_Transition { + const NAME: &'static str = "C2S_Transition"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(C2S_Transition::C2S_NO_CHANGE), + 1 => ::std::option::Option::Some(C2S_Transition::C2S_SESSION_INIT), + 11 => ::std::option::Option::Some(C2S_Transition::C2S_SESSION_COVERT_INIT), + 2 => ::std::option::Option::Some(C2S_Transition::C2S_EXPECT_RECONNECT), + 3 => ::std::option::Option::Some(C2S_Transition::C2S_SESSION_CLOSE), + 4 => ::std::option::Option::Some(C2S_Transition::C2S_YIELD_UPLOAD), + 5 => ::std::option::Option::Some(C2S_Transition::C2S_ACQUIRE_UPLOAD), + 6 => ::std::option::Option::Some(C2S_Transition::C2S_EXPECT_UPLOADONLY_RECONN), + 255 => ::std::option::Option::Some(C2S_Transition::C2S_ERROR), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [C2S_Transition] = &[ + C2S_Transition::C2S_NO_CHANGE, + C2S_Transition::C2S_SESSION_INIT, + C2S_Transition::C2S_SESSION_COVERT_INIT, + C2S_Transition::C2S_EXPECT_RECONNECT, + C2S_Transition::C2S_SESSION_CLOSE, + C2S_Transition::C2S_YIELD_UPLOAD, + C2S_Transition::C2S_ACQUIRE_UPLOAD, + C2S_Transition::C2S_EXPECT_UPLOADONLY_RECONN, + C2S_Transition::C2S_ERROR, + ]; +} + +impl ::protobuf::EnumFull for C2S_Transition { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("C2S_Transition").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + C2S_Transition::C2S_NO_CHANGE => 0, + C2S_Transition::C2S_SESSION_INIT => 1, + C2S_Transition::C2S_SESSION_COVERT_INIT => 2, + C2S_Transition::C2S_EXPECT_RECONNECT => 3, + C2S_Transition::C2S_SESSION_CLOSE => 4, + C2S_Transition::C2S_YIELD_UPLOAD => 5, + C2S_Transition::C2S_ACQUIRE_UPLOAD => 6, + C2S_Transition::C2S_EXPECT_UPLOADONLY_RECONN => 7, + C2S_Transition::C2S_ERROR => 8, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for C2S_Transition { + fn default() -> Self { + C2S_Transition::C2S_NO_CHANGE + } +} + +impl C2S_Transition { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("C2S_Transition") + } +} + +/// State transitions of the server +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.S2C_Transition) +pub enum S2C_Transition { + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_NO_CHANGE) + S2C_NO_CHANGE = 0, + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_SESSION_INIT) + S2C_SESSION_INIT = 1, + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_SESSION_COVERT_INIT) + S2C_SESSION_COVERT_INIT = 11, + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_CONFIRM_RECONNECT) + S2C_CONFIRM_RECONNECT = 2, + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_SESSION_CLOSE) + S2C_SESSION_CLOSE = 3, + // @@protoc_insertion_point(enum_value:proto.S2C_Transition.S2C_ERROR) + S2C_ERROR = 255, +} + +impl ::protobuf::Enum for S2C_Transition { + const NAME: &'static str = "S2C_Transition"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(S2C_Transition::S2C_NO_CHANGE), + 1 => ::std::option::Option::Some(S2C_Transition::S2C_SESSION_INIT), + 11 => ::std::option::Option::Some(S2C_Transition::S2C_SESSION_COVERT_INIT), + 2 => ::std::option::Option::Some(S2C_Transition::S2C_CONFIRM_RECONNECT), + 3 => ::std::option::Option::Some(S2C_Transition::S2C_SESSION_CLOSE), + 255 => ::std::option::Option::Some(S2C_Transition::S2C_ERROR), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [S2C_Transition] = &[ + S2C_Transition::S2C_NO_CHANGE, + S2C_Transition::S2C_SESSION_INIT, + S2C_Transition::S2C_SESSION_COVERT_INIT, + S2C_Transition::S2C_CONFIRM_RECONNECT, + S2C_Transition::S2C_SESSION_CLOSE, + S2C_Transition::S2C_ERROR, + ]; +} + +impl ::protobuf::EnumFull for S2C_Transition { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("S2C_Transition").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + S2C_Transition::S2C_NO_CHANGE => 0, + S2C_Transition::S2C_SESSION_INIT => 1, + S2C_Transition::S2C_SESSION_COVERT_INIT => 2, + S2C_Transition::S2C_CONFIRM_RECONNECT => 3, + S2C_Transition::S2C_SESSION_CLOSE => 4, + S2C_Transition::S2C_ERROR => 5, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for S2C_Transition { + fn default() -> Self { + S2C_Transition::S2C_NO_CHANGE + } +} + +impl S2C_Transition { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("S2C_Transition") + } +} + +/// Should accompany all S2C_ERROR messages. +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.ErrorReasonS2C) +pub enum ErrorReasonS2C { + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.NO_ERROR) + NO_ERROR = 0, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.COVERT_STREAM) + COVERT_STREAM = 1, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.CLIENT_REPORTED) + CLIENT_REPORTED = 2, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.CLIENT_PROTOCOL) + CLIENT_PROTOCOL = 3, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.STATION_INTERNAL) + STATION_INTERNAL = 4, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.DECOY_OVERLOAD) + DECOY_OVERLOAD = 5, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.CLIENT_STREAM) + CLIENT_STREAM = 100, + // @@protoc_insertion_point(enum_value:proto.ErrorReasonS2C.CLIENT_TIMEOUT) + CLIENT_TIMEOUT = 101, +} + +impl ::protobuf::Enum for ErrorReasonS2C { + const NAME: &'static str = "ErrorReasonS2C"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(ErrorReasonS2C::NO_ERROR), + 1 => ::std::option::Option::Some(ErrorReasonS2C::COVERT_STREAM), + 2 => ::std::option::Option::Some(ErrorReasonS2C::CLIENT_REPORTED), + 3 => ::std::option::Option::Some(ErrorReasonS2C::CLIENT_PROTOCOL), + 4 => ::std::option::Option::Some(ErrorReasonS2C::STATION_INTERNAL), + 5 => ::std::option::Option::Some(ErrorReasonS2C::DECOY_OVERLOAD), + 100 => ::std::option::Option::Some(ErrorReasonS2C::CLIENT_STREAM), + 101 => ::std::option::Option::Some(ErrorReasonS2C::CLIENT_TIMEOUT), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [ErrorReasonS2C] = &[ + ErrorReasonS2C::NO_ERROR, + ErrorReasonS2C::COVERT_STREAM, + ErrorReasonS2C::CLIENT_REPORTED, + ErrorReasonS2C::CLIENT_PROTOCOL, + ErrorReasonS2C::STATION_INTERNAL, + ErrorReasonS2C::DECOY_OVERLOAD, + ErrorReasonS2C::CLIENT_STREAM, + ErrorReasonS2C::CLIENT_TIMEOUT, + ]; +} + +impl ::protobuf::EnumFull for ErrorReasonS2C { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("ErrorReasonS2C").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + ErrorReasonS2C::NO_ERROR => 0, + ErrorReasonS2C::COVERT_STREAM => 1, + ErrorReasonS2C::CLIENT_REPORTED => 2, + ErrorReasonS2C::CLIENT_PROTOCOL => 3, + ErrorReasonS2C::STATION_INTERNAL => 4, + ErrorReasonS2C::DECOY_OVERLOAD => 5, + ErrorReasonS2C::CLIENT_STREAM => 6, + ErrorReasonS2C::CLIENT_TIMEOUT => 7, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for ErrorReasonS2C { + fn default() -> Self { + ErrorReasonS2C::NO_ERROR + } +} + +impl ErrorReasonS2C { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("ErrorReasonS2C") + } +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.TransportType) +pub enum TransportType { + // @@protoc_insertion_point(enum_value:proto.TransportType.Null) + Null = 0, + // @@protoc_insertion_point(enum_value:proto.TransportType.Min) + Min = 1, + // @@protoc_insertion_point(enum_value:proto.TransportType.Obfs4) + Obfs4 = 2, + // @@protoc_insertion_point(enum_value:proto.TransportType.DTLS) + DTLS = 3, + // @@protoc_insertion_point(enum_value:proto.TransportType.Prefix) + Prefix = 4, + // @@protoc_insertion_point(enum_value:proto.TransportType.uTLS) + uTLS = 5, + // @@protoc_insertion_point(enum_value:proto.TransportType.Format) + Format = 6, + // @@protoc_insertion_point(enum_value:proto.TransportType.WASM) + WASM = 7, + // @@protoc_insertion_point(enum_value:proto.TransportType.FTE) + FTE = 8, + // @@protoc_insertion_point(enum_value:proto.TransportType.Quic) + Quic = 9, + // @@protoc_insertion_point(enum_value:proto.TransportType.Webrtc) + Webrtc = 99, +} + +impl ::protobuf::Enum for TransportType { + const NAME: &'static str = "TransportType"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(TransportType::Null), + 1 => ::std::option::Option::Some(TransportType::Min), + 2 => ::std::option::Option::Some(TransportType::Obfs4), + 3 => ::std::option::Option::Some(TransportType::DTLS), + 4 => ::std::option::Option::Some(TransportType::Prefix), + 5 => ::std::option::Option::Some(TransportType::uTLS), + 6 => ::std::option::Option::Some(TransportType::Format), + 7 => ::std::option::Option::Some(TransportType::WASM), + 8 => ::std::option::Option::Some(TransportType::FTE), + 9 => ::std::option::Option::Some(TransportType::Quic), + 99 => ::std::option::Option::Some(TransportType::Webrtc), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [TransportType] = &[ + TransportType::Null, + TransportType::Min, + TransportType::Obfs4, + TransportType::DTLS, + TransportType::Prefix, + TransportType::uTLS, + TransportType::Format, + TransportType::WASM, + TransportType::FTE, + TransportType::Quic, + TransportType::Webrtc, + ]; +} + +impl ::protobuf::EnumFull for TransportType { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("TransportType").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = match self { + TransportType::Null => 0, + TransportType::Min => 1, + TransportType::Obfs4 => 2, + TransportType::DTLS => 3, + TransportType::Prefix => 4, + TransportType::uTLS => 5, + TransportType::Format => 6, + TransportType::WASM => 7, + TransportType::FTE => 8, + TransportType::Quic => 9, + TransportType::Webrtc => 10, + }; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for TransportType { + fn default() -> Self { + TransportType::Null + } +} + +impl TransportType { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("TransportType") + } +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.RegistrationSource) +pub enum RegistrationSource { + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.Unspecified) + Unspecified = 0, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.Detector) + Detector = 1, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.API) + API = 2, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.DetectorPrescan) + DetectorPrescan = 3, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.BidirectionalAPI) + BidirectionalAPI = 4, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.DNS) + DNS = 5, + // @@protoc_insertion_point(enum_value:proto.RegistrationSource.BidirectionalDNS) + BidirectionalDNS = 6, +} + +impl ::protobuf::Enum for RegistrationSource { + const NAME: &'static str = "RegistrationSource"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(RegistrationSource::Unspecified), + 1 => ::std::option::Option::Some(RegistrationSource::Detector), + 2 => ::std::option::Option::Some(RegistrationSource::API), + 3 => ::std::option::Option::Some(RegistrationSource::DetectorPrescan), + 4 => ::std::option::Option::Some(RegistrationSource::BidirectionalAPI), + 5 => ::std::option::Option::Some(RegistrationSource::DNS), + 6 => ::std::option::Option::Some(RegistrationSource::BidirectionalDNS), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [RegistrationSource] = &[ + RegistrationSource::Unspecified, + RegistrationSource::Detector, + RegistrationSource::API, + RegistrationSource::DetectorPrescan, + RegistrationSource::BidirectionalAPI, + RegistrationSource::DNS, + RegistrationSource::BidirectionalDNS, + ]; +} + +impl ::protobuf::EnumFull for RegistrationSource { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("RegistrationSource").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = *self as usize; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for RegistrationSource { + fn default() -> Self { + RegistrationSource::Unspecified + } +} + +impl RegistrationSource { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("RegistrationSource") + } +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.StationOperations) +pub enum StationOperations { + // @@protoc_insertion_point(enum_value:proto.StationOperations.Unknown) + Unknown = 0, + // @@protoc_insertion_point(enum_value:proto.StationOperations.New) + New = 1, + // @@protoc_insertion_point(enum_value:proto.StationOperations.Update) + Update = 2, + // @@protoc_insertion_point(enum_value:proto.StationOperations.Clear) + Clear = 3, +} + +impl ::protobuf::Enum for StationOperations { + const NAME: &'static str = "StationOperations"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(StationOperations::Unknown), + 1 => ::std::option::Option::Some(StationOperations::New), + 2 => ::std::option::Option::Some(StationOperations::Update), + 3 => ::std::option::Option::Some(StationOperations::Clear), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [StationOperations] = &[ + StationOperations::Unknown, + StationOperations::New, + StationOperations::Update, + StationOperations::Clear, + ]; +} + +impl ::protobuf::EnumFull for StationOperations { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("StationOperations").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = *self as usize; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for StationOperations { + fn default() -> Self { + StationOperations::Unknown + } +} + +impl StationOperations { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("StationOperations") + } +} + +#[derive(Clone,Copy,PartialEq,Eq,Debug,Hash)] +// @@protoc_insertion_point(enum:proto.IPProto) +pub enum IPProto { + // @@protoc_insertion_point(enum_value:proto.IPProto.Unk) + Unk = 0, + // @@protoc_insertion_point(enum_value:proto.IPProto.Tcp) + Tcp = 1, + // @@protoc_insertion_point(enum_value:proto.IPProto.Udp) + Udp = 2, +} + +impl ::protobuf::Enum for IPProto { + const NAME: &'static str = "IPProto"; + + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(IPProto::Unk), + 1 => ::std::option::Option::Some(IPProto::Tcp), + 2 => ::std::option::Option::Some(IPProto::Udp), + _ => ::std::option::Option::None + } + } + + const VALUES: &'static [IPProto] = &[ + IPProto::Unk, + IPProto::Tcp, + IPProto::Udp, + ]; +} + +impl ::protobuf::EnumFull for IPProto { + fn enum_descriptor() -> ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().enum_by_package_relative_name("IPProto").unwrap()).clone() + } + + fn descriptor(&self) -> ::protobuf::reflect::EnumValueDescriptor { + let index = *self as usize; + Self::enum_descriptor().value_by_index(index) + } +} + +impl ::std::default::Default for IPProto { + fn default() -> Self { + IPProto::Unk + } +} + +impl IPProto { + fn generated_enum_descriptor_data() -> ::protobuf::reflect::GeneratedEnumDescriptorData { + ::protobuf::reflect::GeneratedEnumDescriptorData::new::("IPProto") + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x10signalling.proto\x12\x05proto\x1a\x19google/protobuf/any.proto\">\ + \n\x06PubKey\x12\x10\n\x03key\x18\x01\x20\x01(\x0cR\x03key\x12\"\n\x04ty\ + pe\x18\x02\x20\x01(\x0e2\x0e.proto.KeyTypeR\x04type\"\xbb\x01\n\x0cTLSDe\ + coySpec\x12\x1a\n\x08hostname\x18\x01\x20\x01(\tR\x08hostname\x12\x1a\n\ + \x08ipv4addr\x18\x02\x20\x01(\x07R\x08ipv4addr\x12\x1a\n\x08ipv6addr\x18\ + \x06\x20\x01(\x0cR\x08ipv6addr\x12%\n\x06pubkey\x18\x03\x20\x01(\x0b2\r.\ + proto.PubKeyR\x06pubkey\x12\x18\n\x07timeout\x18\x04\x20\x01(\rR\x07time\ + out\x12\x16\n\x06tcpwin\x18\x05\x20\x01(\rR\x06tcpwin\"\xcb\x02\n\nClien\ + tConf\x12/\n\ndecoy_list\x18\x01\x20\x01(\x0b2\x10.proto.DecoyListR\tdec\ + oyList\x12\x1e\n\ngeneration\x18\x02\x20\x01(\rR\ngeneration\x124\n\x0ed\ + efault_pubkey\x18\x03\x20\x01(\x0b2\r.proto.PubKeyR\rdefaultPubkey\x12K\ + \n\x14phantom_subnets_list\x18\x04\x20\x01(\x0b2\x19.proto.PhantomSubnet\ + sListR\x12phantomSubnetsList\x124\n\x0econjure_pubkey\x18\x05\x20\x01(\ + \x0b2\r.proto.PubKeyR\rconjurePubkey\x123\n\x0cdns_reg_conf\x18\x06\x20\ + \x01(\x0b2\x11.proto.DnsRegConfR\ndnsRegConf\"\xdd\x01\n\nDnsRegConf\x12\ + 9\n\x0edns_reg_method\x18\x01\x20\x02(\x0e2\x13.proto.DnsRegMethodR\x0cd\ + nsRegMethod\x12\x16\n\x06target\x18\x02\x20\x01(\tR\x06target\x12\x16\n\ + \x06domain\x18\x03\x20\x02(\tR\x06domain\x12\x16\n\x06pubkey\x18\x04\x20\ + \x01(\x0cR\x06pubkey\x12+\n\x11utls_distribution\x18\x05\x20\x01(\tR\x10\ + utlsDistribution\x12\x1f\n\x0bstun_server\x18\x06\x20\x01(\tR\nstunServe\ + r\"?\n\tDecoyList\x122\n\ntls_decoys\x18\x01\x20\x03(\x0b2\x13.proto.TLS\ + DecoySpecR\ttlsDecoys\"V\n\x12PhantomSubnetsList\x12@\n\x10weighted_subn\ + ets\x18\x01\x20\x03(\x0b2\x15.proto.PhantomSubnetsR\x0fweightedSubnets\"\ + p\n\x0ePhantomSubnets\x12\x16\n\x06weight\x18\x01\x20\x01(\rR\x06weight\ + \x12\x18\n\x07subnets\x18\x02\x20\x03(\tR\x07subnets\x12,\n\x12randomize\ + _dst_port\x18\x03\x20\x01(\x08R\x10randomizeDstPort\"o\n\x12WebRTCICECan\ + didate\x12\x19\n\x08ip_upper\x18\x01\x20\x02(\x04R\x07ipUpper\x12\x19\n\ + \x08ip_lower\x18\x02\x20\x02(\x04R\x07ipLower\x12#\n\rcomposed_info\x18\ + \x03\x20\x02(\rR\x0ccomposedInfo\"Z\n\tWebRTCSDP\x12\x12\n\x04type\x18\ + \x01\x20\x02(\rR\x04type\x129\n\ncandidates\x18\x02\x20\x03(\x0b2\x19.pr\ + oto.WebRTCICECandidateR\ncandidates\"F\n\x0cWebRTCSignal\x12\x12\n\x04se\ + ed\x18\x01\x20\x02(\tR\x04seed\x12\"\n\x03sdp\x18\x02\x20\x02(\x0b2\x10.\ + proto.WebRTCSDPR\x03sdp\"*\n\x04Addr\x12\x0e\n\x02IP\x18\x01\x20\x01(\ + \x0cR\x02IP\x12\x12\n\x04Port\x18\x02\x20\x01(\rR\x04Port\"\xb5\x01\n\ + \x13DTLSTransportParams\x12(\n\tsrc_addr4\x18\x01\x20\x01(\x0b2\x0b.prot\ + o.AddrR\x08srcAddr4\x12(\n\tsrc_addr6\x18\x02\x20\x01(\x0b2\x0b.proto.Ad\ + drR\x08srcAddr6\x12,\n\x12randomize_dst_port\x18\x03\x20\x01(\x08R\x10ra\ + ndomizeDstPort\x12\x1c\n\tunordered\x18\x04\x20\x01(\x08R\tunordered\"\ + \xc2\x02\n\x0fStationToClient\x12)\n\x10protocol_version\x18\x01\x20\x01\ + (\rR\x0fprotocolVersion\x12@\n\x10state_transition\x18\x02\x20\x01(\x0e2\ + \x15.proto.S2C_TransitionR\x0fstateTransition\x122\n\x0bconfig_info\x18\ + \x03\x20\x01(\x0b2\x11.proto.ClientConfR\nconfigInfo\x124\n\nerr_reason\ + \x18\x04\x20\x01(\x0e2\x15.proto.ErrorReasonS2CR\terrReason\x12\x1f\n\ + \x0btmp_backoff\x18\x05\x20\x01(\rR\ntmpBackoff\x12\x1d\n\nstation_id\ + \x18\x06\x20\x01(\tR\tstationId\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\ + \x07padding\"\xaf\x01\n\x11RegistrationFlags\x12\x1f\n\x0bupload_only\ + \x18\x01\x20\x01(\x08R\nuploadOnly\x12\x1d\n\ndark_decoy\x18\x02\x20\x01\ + (\x08R\tdarkDecoy\x12!\n\x0cproxy_header\x18\x03\x20\x01(\x08R\x0bproxyH\ + eader\x12\x17\n\x07use_TIL\x18\x04\x20\x01(\x08R\x06useTIL\x12\x1e\n\npr\ + escanned\x18\x05\x20\x01(\x08R\nprescanned\"\xa8\x06\n\x0fClientToStatio\ + n\x12)\n\x10protocol_version\x18\x01\x20\x01(\rR\x0fprotocolVersion\x122\ + \n\x15decoy_list_generation\x18\x02\x20\x01(\rR\x13decoyListGeneration\ + \x12@\n\x10state_transition\x18\x03\x20\x01(\x0e2\x15.proto.C2S_Transiti\ + onR\x0fstateTransition\x12\x1f\n\x0bupload_sync\x18\x04\x20\x01(\x04R\nu\ + ploadSync\x12,\n\x12client_lib_version\x18\x05\x20\x01(\rR\x10clientLibV\ + ersion\x12>\n\x1bdisable_registrar_overrides\x18\x06\x20\x01(\x08R\x19di\ + sableRegistrarOverrides\x12#\n\rfailed_decoys\x18\n\x20\x03(\tR\x0cfaile\ + dDecoys\x12)\n\x05stats\x18\x0b\x20\x01(\x0b2\x13.proto.SessionStatsR\ + \x05stats\x122\n\ttransport\x18\x0c\x20\x01(\x0e2\x14.proto.TransportTyp\ + eR\ttransport\x12?\n\x10transport_params\x18\r\x20\x01(\x0b2\x14.google.\ + protobuf.AnyR\x0ftransportParams\x12%\n\x0ecovert_address\x18\x14\x20\ + \x01(\tR\rcovertAddress\x127\n\x18masked_decoy_server_name\x18\x15\x20\ + \x01(\tR\x15maskedDecoyServerName\x12\x1d\n\nv6_support\x18\x16\x20\x01(\ + \x08R\tv6Support\x12\x1d\n\nv4_support\x18\x17\x20\x01(\x08R\tv4Support\ + \x12.\n\x05flags\x18\x18\x20\x01(\x0b2\x18.proto.RegistrationFlagsR\x05f\ + lags\x128\n\rwebrtc_signal\x18\x1f\x20\x01(\x0b2\x13.proto.WebRTCSignalR\ + \x0cwebrtcSignal\x12\x18\n\x07padding\x18d\x20\x01(\x0cR\x07padding\"\ + \xaa\x01\n\x15PrefixTransportParams\x12\x1b\n\tprefix_id\x18\x01\x20\x01\ + (\x05R\x08prefixId\x12\x16\n\x06prefix\x18\x02\x20\x01(\x0cR\x06prefix\ + \x12.\n\x13custom_flush_policy\x18\x03\x20\x01(\x05R\x11customFlushPolic\ + y\x12,\n\x12randomize_dst_port\x18\r\x20\x01(\x08R\x10randomizeDstPort\"\ + F\n\x16GenericTransportParams\x12,\n\x12randomize_dst_port\x18\r\x20\x01\ + (\x08R\x10randomizeDstPort\"\xc2\x03\n\nC2SWrapper\x12#\n\rshared_secret\ + \x18\x01\x20\x01(\x0cR\x0csharedSecret\x12I\n\x14registration_payload\ + \x18\x03\x20\x01(\x0b2\x16.proto.ClientToStationR\x13registrationPayload\ + \x12J\n\x13registration_source\x18\x04\x20\x01(\x0e2\x19.proto.Registrat\ + ionSourceR\x12registrationSource\x121\n\x14registration_address\x18\x06\ + \x20\x01(\x0cR\x13registrationAddress\x12#\n\rdecoy_address\x18\x07\x20\ + \x01(\x0cR\x0cdecoyAddress\x12P\n\x15registration_response\x18\x08\x20\ + \x01(\x0b2\x1b.proto.RegistrationResponseR\x14registrationResponse\x12\"\ + \n\x0cRegRespBytes\x18\t\x20\x01(\x0cR\x0cRegRespBytes\x12*\n\x10RegResp\ + Signature\x18\n\x20\x01(\x0cR\x10RegRespSignature\"\xdd\x01\n\x0cSession\ + Stats\x120\n\x14failed_decoys_amount\x18\x14\x20\x01(\rR\x12failedDecoys\ + Amount\x121\n\x15total_time_to_connect\x18\x1f\x20\x01(\rR\x12totalTimeT\ + oConnect\x12$\n\x0ertt_to_station\x18!\x20\x01(\rR\x0crttToStation\x12\ + \x20\n\x0ctls_to_decoy\x18&\x20\x01(\rR\ntlsToDecoy\x12\x20\n\x0ctcp_to_\ + decoy\x18'\x20\x01(\rR\ntcpToDecoy\"\x82\x02\n\x11StationToDetector\x12\ + \x1d\n\nphantom_ip\x18\x01\x20\x01(\tR\tphantomIp\x12\x1b\n\tclient_ip\ + \x18\x02\x20\x01(\tR\x08clientIp\x12\x1d\n\ntimeout_ns\x18\x03\x20\x01(\ + \x04R\ttimeoutNs\x126\n\toperation\x18\x04\x20\x01(\x0e2\x18.proto.Stati\ + onOperationsR\toperation\x12\x19\n\x08dst_port\x18\n\x20\x01(\rR\x07dstP\ + ort\x12\x19\n\x08src_port\x18\x0b\x20\x01(\rR\x07srcPort\x12$\n\x05proto\ + \x18\x0c\x20\x01(\x0e2\x0e.proto.IPProtoR\x05proto\"\xd4\x02\n\x14Regist\ + rationResponse\x12\x1a\n\x08ipv4addr\x18\x01\x20\x01(\x07R\x08ipv4addr\ + \x12\x1a\n\x08ipv6addr\x18\x02\x20\x01(\x0cR\x08ipv6addr\x12\x19\n\x08ds\ + t_port\x18\x03\x20\x01(\rR\x07dstPort\x12\"\n\x0cserverRandom\x18\x04\ + \x20\x01(\x0cR\x0cserverRandom\x12\x14\n\x05error\x18\x05\x20\x01(\tR\ + \x05error\x121\n\nclientConf\x18\x06\x20\x01(\x0b2\x11.proto.ClientConfR\ + \nclientConf\x12?\n\x10transport_params\x18\n\x20\x01(\x0b2\x14.google.p\ + rotobuf.AnyR\x0ftransportParams\x12;\n\x1aphantoms_support_port_rand\x18\ + \x0b\x20\x01(\x08R\x17phantomsSupportPortRand\"\xac\x01\n\x0bDnsResponse\ + \x12\x18\n\x07success\x18\x01\x20\x01(\x08R\x07success\x12/\n\x13clientc\ + onf_outdated\x18\x02\x20\x01(\x08R\x12clientconfOutdated\x12R\n\x16bidir\ + ectional_response\x18\x03\x20\x01(\x0b2\x1b.proto.RegistrationResponseR\ + \x15bidirectionalResponse*+\n\x07KeyType\x12\x0f\n\x0bAES_GCM_128\x10Z\ + \x12\x0f\n\x0bAES_GCM_256\x10[*)\n\x0cDnsRegMethod\x12\x07\n\x03UDP\x10\ + \x01\x12\x07\n\x03DOT\x10\x02\x12\x07\n\x03DOH\x10\x03*\xe7\x01\n\x0eC2S\ + _Transition\x12\x11\n\rC2S_NO_CHANGE\x10\0\x12\x14\n\x10C2S_SESSION_INIT\ + \x10\x01\x12\x1b\n\x17C2S_SESSION_COVERT_INIT\x10\x0b\x12\x18\n\x14C2S_E\ + XPECT_RECONNECT\x10\x02\x12\x15\n\x11C2S_SESSION_CLOSE\x10\x03\x12\x14\n\ + \x10C2S_YIELD_UPLOAD\x10\x04\x12\x16\n\x12C2S_ACQUIRE_UPLOAD\x10\x05\x12\ + \x20\n\x1cC2S_EXPECT_UPLOADONLY_RECONN\x10\x06\x12\x0e\n\tC2S_ERROR\x10\ + \xff\x01*\x98\x01\n\x0eS2C_Transition\x12\x11\n\rS2C_NO_CHANGE\x10\0\x12\ + \x14\n\x10S2C_SESSION_INIT\x10\x01\x12\x1b\n\x17S2C_SESSION_COVERT_INIT\ + \x10\x0b\x12\x19\n\x15S2C_CONFIRM_RECONNECT\x10\x02\x12\x15\n\x11S2C_SES\ + SION_CLOSE\x10\x03\x12\x0e\n\tS2C_ERROR\x10\xff\x01*\xac\x01\n\x0eErrorR\ + easonS2C\x12\x0c\n\x08NO_ERROR\x10\0\x12\x11\n\rCOVERT_STREAM\x10\x01\ + \x12\x13\n\x0fCLIENT_REPORTED\x10\x02\x12\x13\n\x0fCLIENT_PROTOCOL\x10\ + \x03\x12\x14\n\x10STATION_INTERNAL\x10\x04\x12\x12\n\x0eDECOY_OVERLOAD\ + \x10\x05\x12\x11\n\rCLIENT_STREAM\x10d\x12\x12\n\x0eCLIENT_TIMEOUT\x10e*\ + \x82\x01\n\rTransportType\x12\x08\n\x04Null\x10\0\x12\x07\n\x03Min\x10\ + \x01\x12\t\n\x05Obfs4\x10\x02\x12\x08\n\x04DTLS\x10\x03\x12\n\n\x06Prefi\ + x\x10\x04\x12\x08\n\x04uTLS\x10\x05\x12\n\n\x06Format\x10\x06\x12\x08\n\ + \x04WASM\x10\x07\x12\x07\n\x03FTE\x10\x08\x12\x08\n\x04Quic\x10\t\x12\n\ + \n\x06Webrtc\x10c*\x86\x01\n\x12RegistrationSource\x12\x0f\n\x0bUnspecif\ + ied\x10\0\x12\x0c\n\x08Detector\x10\x01\x12\x07\n\x03API\x10\x02\x12\x13\ + \n\x0fDetectorPrescan\x10\x03\x12\x14\n\x10BidirectionalAPI\x10\x04\x12\ + \x07\n\x03DNS\x10\x05\x12\x14\n\x10BidirectionalDNS\x10\x06*@\n\x11Stati\ + onOperations\x12\x0b\n\x07Unknown\x10\0\x12\x07\n\x03New\x10\x01\x12\n\n\ + \x06Update\x10\x02\x12\t\n\x05Clear\x10\x03*$\n\x07IPProto\x12\x07\n\x03\ + Unk\x10\0\x12\x07\n\x03Tcp\x10\x01\x12\x07\n\x03Udp\x10\x02J\xe1\x94\x01\ + \n\x07\x12\x05\0\0\xb6\x03\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\xb0\x01\ + \n\x01\x02\x12\x03\x06\0\x0e2\xa5\x01\x20TODO:\x20We're\x20using\x20prot\ + o2\x20because\x20it's\x20the\x20default\x20on\x20Ubuntu\x2016.04.\n\x20A\ + t\x20some\x20point\x20we\x20will\x20want\x20to\x20migrate\x20to\x20proto\ + 3,\x20but\x20we\x20are\x20not\n\x20using\x20any\x20proto3\x20features\ + \x20yet.\n\n\t\n\x02\x03\0\x12\x03\x08\0#\n\n\n\x02\x05\0\x12\x04\n\0\r\ + \x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\x0c\n\x0b\n\x04\x05\0\x02\0\x12\ + \x03\x0b\x04\x15\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x0b\x04\x0f\n\x0c\n\ + \x05\x05\0\x02\0\x02\x12\x03\x0b\x12\x14\n\x20\n\x04\x05\0\x02\x01\x12\ + \x03\x0c\x04\x15\"\x13\x20not\x20supported\x20atm\n\n\x0c\n\x05\x05\0\ + \x02\x01\x01\x12\x03\x0c\x04\x0f\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\ + \x0c\x12\x14\n\n\n\x02\x04\0\x12\x04\x0f\0\x14\x01\n\n\n\x03\x04\0\x01\ + \x12\x03\x0f\x08\x0e\n4\n\x04\x04\0\x02\0\x12\x03\x11\x04\x1b\x1a'\x20A\ + \x20public\x20key,\x20as\x20used\x20by\x20the\x20station.\n\n\x0c\n\x05\ + \x04\0\x02\0\x04\x12\x03\x11\x04\x0c\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\ + \x11\r\x12\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x11\x13\x16\n\x0c\n\x05\ + \x04\0\x02\0\x03\x12\x03\x11\x19\x1a\n\x0b\n\x04\x04\0\x02\x01\x12\x03\ + \x13\x04\x1e\n\x0c\n\x05\x04\0\x02\x01\x04\x12\x03\x13\x04\x0c\n\x0c\n\ + \x05\x04\0\x02\x01\x06\x12\x03\x13\r\x14\n\x0c\n\x05\x04\0\x02\x01\x01\ + \x12\x03\x13\x15\x19\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x13\x1c\x1d\n\ + \n\n\x02\x04\x01\x12\x04\x16\0<\x01\n\n\n\x03\x04\x01\x01\x12\x03\x16\ + \x08\x14\n\xa1\x01\n\x04\x04\x01\x02\0\x12\x03\x1b\x04!\x1a\x93\x01\x20T\ + he\x20hostname/SNI\x20to\x20use\x20for\x20this\x20host\n\n\x20The\x20hos\ + tname\x20is\x20the\x20only\x20required\x20field,\x20although\x20other\n\ + \x20fields\x20are\x20expected\x20to\x20be\x20present\x20in\x20most\x20ca\ + ses.\n\n\x0c\n\x05\x04\x01\x02\0\x04\x12\x03\x1b\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\0\x05\x12\x03\x1b\r\x13\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\ + \x1b\x14\x1c\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\x1b\x1f\x20\n\xf7\x01\ + \n\x04\x04\x01\x02\x01\x12\x03\"\x04\"\x1a\xe9\x01\x20The\x2032-bit\x20i\ + pv4\x20address,\x20in\x20network\x20byte\x20order\n\n\x20If\x20the\x20IP\ + v4\x20address\x20is\x20absent,\x20then\x20it\x20may\x20be\x20resolved\ + \x20via\n\x20DNS\x20by\x20the\x20client,\x20or\x20the\x20client\x20may\ + \x20discard\x20this\x20decoy\x20spec\n\x20if\x20local\x20DNS\x20is\x20un\ + trusted,\x20or\x20the\x20service\x20may\x20be\x20multihomed.\n\n\x0c\n\ + \x05\x04\x01\x02\x01\x04\x12\x03\"\x04\x0c\n\x0c\n\x05\x04\x01\x02\x01\ + \x05\x12\x03\"\r\x14\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x03\"\x15\x1d\n\ + \x0c\n\x05\x04\x01\x02\x01\x03\x12\x03\"\x20!\n>\n\x04\x04\x01\x02\x02\ + \x12\x03%\x04\x20\x1a1\x20The\x20128-bit\x20ipv6\x20address,\x20in\x20ne\ + twork\x20byte\x20order\n\n\x0c\n\x05\x04\x01\x02\x02\x04\x12\x03%\x04\ + \x0c\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03%\r\x12\n\x0c\n\x05\x04\x01\ + \x02\x02\x01\x12\x03%\x13\x1b\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\x03%\ + \x1e\x1f\n\x91\x01\n\x04\x04\x01\x02\x03\x12\x03+\x04\x1f\x1a\x83\x01\ + \x20The\x20Tapdance\x20station\x20public\x20key\x20to\x20use\x20when\x20\ + contacting\x20this\n\x20decoy\n\n\x20If\x20omitted,\x20the\x20default\ + \x20station\x20public\x20key\x20(if\x20any)\x20is\x20used.\n\n\x0c\n\x05\ + \x04\x01\x02\x03\x04\x12\x03+\x04\x0c\n\x0c\n\x05\x04\x01\x02\x03\x06\ + \x12\x03+\r\x13\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03+\x14\x1a\n\x0c\n\ + \x05\x04\x01\x02\x03\x03\x12\x03+\x1d\x1e\n\xee\x01\n\x04\x04\x01\x02\ + \x04\x12\x032\x04\x20\x1a\xe0\x01\x20The\x20maximum\x20duration,\x20in\ + \x20milliseconds,\x20to\x20maintain\x20an\x20open\n\x20connection\x20to\ + \x20this\x20decoy\x20(because\x20the\x20decoy\x20may\x20close\x20the\n\ + \x20connection\x20itself\x20after\x20this\x20length\x20of\x20time)\n\n\ + \x20If\x20omitted,\x20a\x20default\x20of\x2030,000\x20milliseconds\x20is\ + \x20assumed.\n\n\x0c\n\x05\x04\x01\x02\x04\x04\x12\x032\x04\x0c\n\x0c\n\ + \x05\x04\x01\x02\x04\x05\x12\x032\r\x13\n\x0c\n\x05\x04\x01\x02\x04\x01\ + \x12\x032\x14\x1b\n\x0c\n\x05\x04\x01\x02\x04\x03\x12\x032\x1e\x1f\n\xb0\ + \x02\n\x04\x04\x01\x02\x05\x12\x03;\x04\x1f\x1a\xa2\x02\x20The\x20maximu\ + m\x20TCP\x20window\x20size\x20to\x20attempt\x20to\x20use\x20for\x20this\ + \x20decoy.\n\n\x20If\x20omitted,\x20a\x20default\x20of\x2015360\x20is\ + \x20assumed.\n\n\x20TODO:\x20the\x20default\x20is\x20based\x20on\x20the\ + \x20current\x20heuristic\x20of\x20only\n\x20using\x20decoys\x20that\x20p\ + ermit\x20windows\x20of\x2015KB\x20or\x20larger.\x20\x20If\x20this\n\x20h\ + euristic\x20changes,\x20then\x20this\x20default\x20doesn't\x20make\x20se\ + nse.\n\n\x0c\n\x05\x04\x01\x02\x05\x04\x12\x03;\x04\x0c\n\x0c\n\x05\x04\ + \x01\x02\x05\x05\x12\x03;\r\x13\n\x0c\n\x05\x04\x01\x02\x05\x01\x12\x03;\ + \x14\x1a\n\x0c\n\x05\x04\x01\x02\x05\x03\x12\x03;\x1d\x1e\n\x83\x08\n\ + \x02\x04\x02\x12\x04S\0Z\x012\xf6\x07\x20In\x20version\x201,\x20the\x20r\ + equest\x20is\x20very\x20simple:\x20when\n\x20the\x20client\x20sends\x20a\ + \x20MSG_PROTO\x20to\x20the\x20station,\x20if\x20the\n\x20generation\x20n\ + umber\x20is\x20present,\x20then\x20this\x20request\x20includes\n\x20(in\ + \x20addition\x20to\x20whatever\x20other\x20operations\x20are\x20part\x20\ + of\x20the\n\x20request)\x20a\x20request\x20for\x20the\x20station\x20to\ + \x20send\x20a\x20copy\x20of\n\x20the\x20current\x20decoy\x20set\x20that\ + \x20has\x20a\x20generation\x20number\x20greater\n\x20than\x20the\x20gene\ + ration\x20number\x20in\x20its\x20request.\n\n\x20If\x20the\x20response\ + \x20contains\x20a\x20DecoyListUpdate\x20with\x20a\x20generation\x20numbe\ + r\x20equal\n\x20to\x20that\x20which\x20the\x20client\x20sent,\x20then\ + \x20the\x20client\x20is\x20\"caught\x20up\"\x20with\n\x20the\x20station\ + \x20and\x20the\x20response\x20contains\x20no\x20new\x20information\n\x20\ + (and\x20all\x20other\x20fields\x20may\x20be\x20omitted\x20or\x20empty).\ + \x20\x20Otherwise,\n\x20the\x20station\x20will\x20send\x20the\x20latest\ + \x20configuration\x20information,\n\x20along\x20with\x20its\x20generatio\ + n\x20number.\n\n\x20The\x20station\x20can\x20also\x20send\x20ClientConf\ + \x20messages\n\x20(as\x20part\x20of\x20Station2Client\x20messages)\x20wh\ + enever\x20it\x20wants.\n\x20The\x20client\x20is\x20expected\x20to\x20rea\ + ct\x20as\x20if\x20it\x20had\x20requested\n\x20such\x20messages\x20--\x20\ + possibly\x20by\x20ignoring\x20them,\x20if\x20the\x20client\n\x20is\x20al\ + ready\x20up-to-date\x20according\x20to\x20the\x20generation\x20number.\n\ + \n\n\n\x03\x04\x02\x01\x12\x03S\x08\x12\n\x0b\n\x04\x04\x02\x02\0\x12\ + \x03T\x04&\n\x0c\n\x05\x04\x02\x02\0\x04\x12\x03T\x04\x0c\n\x0c\n\x05\ + \x04\x02\x02\0\x06\x12\x03T\r\x16\n\x0c\n\x05\x04\x02\x02\0\x01\x12\x03T\ + \x17!\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03T$%\n\x0b\n\x04\x04\x02\x02\ + \x01\x12\x03U\x04#\n\x0c\n\x05\x04\x02\x02\x01\x04\x12\x03U\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x01\x05\x12\x03U\r\x13\n\x0c\n\x05\x04\x02\x02\ + \x01\x01\x12\x03U\x14\x1e\n\x0c\n\x05\x04\x02\x02\x01\x03\x12\x03U!\"\n\ + \x0b\n\x04\x04\x02\x02\x02\x12\x03V\x04'\n\x0c\n\x05\x04\x02\x02\x02\x04\ + \x12\x03V\x04\x0c\n\x0c\n\x05\x04\x02\x02\x02\x06\x12\x03V\r\x13\n\x0c\n\ + \x05\x04\x02\x02\x02\x01\x12\x03V\x14\"\n\x0c\n\x05\x04\x02\x02\x02\x03\ + \x12\x03V%&\n\x0b\n\x04\x04\x02\x02\x03\x12\x03W\x049\n\x0c\n\x05\x04\ + \x02\x02\x03\x04\x12\x03W\x04\x0c\n\x0c\n\x05\x04\x02\x02\x03\x06\x12\ + \x03W\r\x1f\n\x0c\n\x05\x04\x02\x02\x03\x01\x12\x03W\x204\n\x0c\n\x05\ + \x04\x02\x02\x03\x03\x12\x03W78\n\x0b\n\x04\x04\x02\x02\x04\x12\x03X\x04\ + '\n\x0c\n\x05\x04\x02\x02\x04\x04\x12\x03X\x04\x0c\n\x0c\n\x05\x04\x02\ + \x02\x04\x06\x12\x03X\r\x13\n\x0c\n\x05\x04\x02\x02\x04\x01\x12\x03X\x14\ + \"\n\x0c\n\x05\x04\x02\x02\x04\x03\x12\x03X%&\n\x0b\n\x04\x04\x02\x02\ + \x05\x12\x03Y\x04)\n\x0c\n\x05\x04\x02\x02\x05\x04\x12\x03Y\x04\x0c\n\ + \x0c\n\x05\x04\x02\x02\x05\x06\x12\x03Y\r\x17\n\x0c\n\x05\x04\x02\x02\ + \x05\x01\x12\x03Y\x18$\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03Y'(\n-\n\ + \x02\x04\x03\x12\x04]\0d\x01\x1a!\x20Configuration\x20for\x20DNS\x20regi\ + strar\n\n\n\n\x03\x04\x03\x01\x12\x03]\x08\x12\n\x0b\n\x04\x04\x03\x02\0\ + \x12\x03^\x04-\n\x0c\n\x05\x04\x03\x02\0\x04\x12\x03^\x04\x0c\n\x0c\n\ + \x05\x04\x03\x02\0\x06\x12\x03^\r\x19\n\x0c\n\x05\x04\x03\x02\0\x01\x12\ + \x03^\x1a(\n\x0c\n\x05\x04\x03\x02\0\x03\x12\x03^+,\n\x0b\n\x04\x04\x03\ + \x02\x01\x12\x03_\x04\x1f\n\x0c\n\x05\x04\x03\x02\x01\x04\x12\x03_\x04\ + \x0c\n\x0c\n\x05\x04\x03\x02\x01\x05\x12\x03_\r\x13\n\x0c\n\x05\x04\x03\ + \x02\x01\x01\x12\x03_\x14\x1a\n\x0c\n\x05\x04\x03\x02\x01\x03\x12\x03_\ + \x1d\x1e\n\x0b\n\x04\x04\x03\x02\x02\x12\x03`\x04\x1f\n\x0c\n\x05\x04\ + \x03\x02\x02\x04\x12\x03`\x04\x0c\n\x0c\n\x05\x04\x03\x02\x02\x05\x12\ + \x03`\r\x13\n\x0c\n\x05\x04\x03\x02\x02\x01\x12\x03`\x14\x1a\n\x0c\n\x05\ + \x04\x03\x02\x02\x03\x12\x03`\x1d\x1e\n\x0b\n\x04\x04\x03\x02\x03\x12\ + \x03a\x04\x1e\n\x0c\n\x05\x04\x03\x02\x03\x04\x12\x03a\x04\x0c\n\x0c\n\ + \x05\x04\x03\x02\x03\x05\x12\x03a\r\x12\n\x0c\n\x05\x04\x03\x02\x03\x01\ + \x12\x03a\x13\x19\n\x0c\n\x05\x04\x03\x02\x03\x03\x12\x03a\x1c\x1d\n\x0b\ + \n\x04\x04\x03\x02\x04\x12\x03b\x04*\n\x0c\n\x05\x04\x03\x02\x04\x04\x12\ + \x03b\x04\x0c\n\x0c\n\x05\x04\x03\x02\x04\x05\x12\x03b\r\x13\n\x0c\n\x05\ + \x04\x03\x02\x04\x01\x12\x03b\x14%\n\x0c\n\x05\x04\x03\x02\x04\x03\x12\ + \x03b()\n\x0b\n\x04\x04\x03\x02\x05\x12\x03c\x04$\n\x0c\n\x05\x04\x03\ + \x02\x05\x04\x12\x03c\x04\x0c\n\x0c\n\x05\x04\x03\x02\x05\x05\x12\x03c\r\ + \x13\n\x0c\n\x05\x04\x03\x02\x05\x01\x12\x03c\x14\x1f\n\x0c\n\x05\x04\ + \x03\x02\x05\x03\x12\x03c\"#\n\n\n\x02\x05\x01\x12\x04f\0j\x01\n\n\n\x03\ + \x05\x01\x01\x12\x03f\x05\x11\n\x0b\n\x04\x05\x01\x02\0\x12\x03g\x04\x0c\ + \n\x0c\n\x05\x05\x01\x02\0\x01\x12\x03g\x04\x07\n\x0c\n\x05\x05\x01\x02\ + \0\x02\x12\x03g\n\x0b\n\x0b\n\x04\x05\x01\x02\x01\x12\x03h\x04\x0c\n\x0c\ + \n\x05\x05\x01\x02\x01\x01\x12\x03h\x04\x07\n\x0c\n\x05\x05\x01\x02\x01\ + \x02\x12\x03h\n\x0b\n\x0b\n\x04\x05\x01\x02\x02\x12\x03i\x04\x0c\n\x0c\n\ + \x05\x05\x01\x02\x02\x01\x12\x03i\x04\x07\n\x0c\n\x05\x05\x01\x02\x02\ + \x02\x12\x03i\n\x0b\n\n\n\x02\x04\x04\x12\x04l\0n\x01\n\n\n\x03\x04\x04\ + \x01\x12\x03l\x08\x11\n\x0b\n\x04\x04\x04\x02\0\x12\x03m\x04)\n\x0c\n\ + \x05\x04\x04\x02\0\x04\x12\x03m\x04\x0c\n\x0c\n\x05\x04\x04\x02\0\x06\ + \x12\x03m\r\x19\n\x0c\n\x05\x04\x04\x02\0\x01\x12\x03m\x1a$\n\x0c\n\x05\ + \x04\x04\x02\0\x03\x12\x03m'(\n\n\n\x02\x04\x05\x12\x04p\0r\x01\n\n\n\ + \x03\x04\x05\x01\x12\x03p\x08\x1a\n\x0b\n\x04\x04\x05\x02\0\x12\x03q\x04\ + 1\n\x0c\n\x05\x04\x05\x02\0\x04\x12\x03q\x04\x0c\n\x0c\n\x05\x04\x05\x02\ + \0\x06\x12\x03q\r\x1b\n\x0c\n\x05\x04\x05\x02\0\x01\x12\x03q\x1c,\n\x0c\ + \n\x05\x04\x05\x02\0\x03\x12\x03q/0\n\n\n\x02\x04\x06\x12\x04t\0x\x01\n\ + \n\n\x03\x04\x06\x01\x12\x03t\x08\x16\n\x0b\n\x04\x04\x06\x02\0\x12\x03u\ + \x04\x1f\n\x0c\n\x05\x04\x06\x02\0\x04\x12\x03u\x04\x0c\n\x0c\n\x05\x04\ + \x06\x02\0\x05\x12\x03u\r\x13\n\x0c\n\x05\x04\x06\x02\0\x01\x12\x03u\x14\ + \x1a\n\x0c\n\x05\x04\x06\x02\0\x03\x12\x03u\x1d\x1e\n\x0b\n\x04\x04\x06\ + \x02\x01\x12\x03v\x04\x20\n\x0c\n\x05\x04\x06\x02\x01\x04\x12\x03v\x04\ + \x0c\n\x0c\n\x05\x04\x06\x02\x01\x05\x12\x03v\r\x13\n\x0c\n\x05\x04\x06\ + \x02\x01\x01\x12\x03v\x14\x1b\n\x0c\n\x05\x04\x06\x02\x01\x03\x12\x03v\ + \x1e\x1f\n\x0b\n\x04\x04\x06\x02\x02\x12\x03w\x04)\n\x0c\n\x05\x04\x06\ + \x02\x02\x04\x12\x03w\x04\x0c\n\x0c\n\x05\x04\x06\x02\x02\x05\x12\x03w\r\ + \x11\n\x0c\n\x05\x04\x06\x02\x02\x01\x12\x03w\x12$\n\x0c\n\x05\x04\x06\ + \x02\x02\x03\x12\x03w'(\n.\n\x02\x05\x02\x12\x05{\0\x85\x01\x01\x1a!\x20\ + State\x20transitions\x20of\x20the\x20client\n\n\n\n\x03\x05\x02\x01\x12\ + \x03{\x05\x13\n\x0b\n\x04\x05\x02\x02\0\x12\x03|\x04\x16\n\x0c\n\x05\x05\ + \x02\x02\0\x01\x12\x03|\x04\x11\n\x0c\n\x05\x05\x02\x02\0\x02\x12\x03|\ + \x14\x15\n\"\n\x04\x05\x02\x02\x01\x12\x03}\x04\x19\"\x15\x20connect\x20\ + me\x20to\x20squid\n\n\x0c\n\x05\x05\x02\x02\x01\x01\x12\x03}\x04\x14\n\ + \x0c\n\x05\x05\x02\x02\x01\x02\x12\x03}\x17\x18\n,\n\x04\x05\x02\x02\x02\ + \x12\x03~\x04!\"\x1f\x20connect\x20me\x20to\x20provided\x20covert\n\n\ + \x0c\n\x05\x05\x02\x02\x02\x01\x12\x03~\x04\x1b\n\x0c\n\x05\x05\x02\x02\ + \x02\x02\x12\x03~\x1e\x20\n\x0b\n\x04\x05\x02\x02\x03\x12\x03\x7f\x04\ + \x1d\n\x0c\n\x05\x05\x02\x02\x03\x01\x12\x03\x7f\x04\x18\n\x0c\n\x05\x05\ + \x02\x02\x03\x02\x12\x03\x7f\x1b\x1c\n\x0c\n\x04\x05\x02\x02\x04\x12\x04\ + \x80\x01\x04\x1a\n\r\n\x05\x05\x02\x02\x04\x01\x12\x04\x80\x01\x04\x15\n\ + \r\n\x05\x05\x02\x02\x04\x02\x12\x04\x80\x01\x18\x19\n\x0c\n\x04\x05\x02\ + \x02\x05\x12\x04\x81\x01\x04\x19\n\r\n\x05\x05\x02\x02\x05\x01\x12\x04\ + \x81\x01\x04\x14\n\r\n\x05\x05\x02\x02\x05\x02\x12\x04\x81\x01\x17\x18\n\ + \x0c\n\x04\x05\x02\x02\x06\x12\x04\x82\x01\x04\x1b\n\r\n\x05\x05\x02\x02\ + \x06\x01\x12\x04\x82\x01\x04\x16\n\r\n\x05\x05\x02\x02\x06\x02\x12\x04\ + \x82\x01\x19\x1a\n\x0c\n\x04\x05\x02\x02\x07\x12\x04\x83\x01\x04%\n\r\n\ + \x05\x05\x02\x02\x07\x01\x12\x04\x83\x01\x04\x20\n\r\n\x05\x05\x02\x02\ + \x07\x02\x12\x04\x83\x01#$\n\x0c\n\x04\x05\x02\x02\x08\x12\x04\x84\x01\ + \x04\x14\n\r\n\x05\x05\x02\x02\x08\x01\x12\x04\x84\x01\x04\r\n\r\n\x05\ + \x05\x02\x02\x08\x02\x12\x04\x84\x01\x10\x13\n/\n\x02\x05\x03\x12\x06\ + \x88\x01\0\x90\x01\x01\x1a!\x20State\x20transitions\x20of\x20the\x20serv\ + er\n\n\x0b\n\x03\x05\x03\x01\x12\x04\x88\x01\x05\x13\n\x0c\n\x04\x05\x03\ + \x02\0\x12\x04\x89\x01\x04\x16\n\r\n\x05\x05\x03\x02\0\x01\x12\x04\x89\ + \x01\x04\x11\n\r\n\x05\x05\x03\x02\0\x02\x12\x04\x89\x01\x14\x15\n\"\n\ + \x04\x05\x03\x02\x01\x12\x04\x8a\x01\x04\x19\"\x14\x20connected\x20to\ + \x20squid\n\n\r\n\x05\x05\x03\x02\x01\x01\x12\x04\x8a\x01\x04\x14\n\r\n\ + \x05\x05\x03\x02\x01\x02\x12\x04\x8a\x01\x17\x18\n(\n\x04\x05\x03\x02\ + \x02\x12\x04\x8b\x01\x04!\"\x1a\x20connected\x20to\x20covert\x20host\n\n\ + \r\n\x05\x05\x03\x02\x02\x01\x12\x04\x8b\x01\x04\x1b\n\r\n\x05\x05\x03\ + \x02\x02\x02\x12\x04\x8b\x01\x1e\x20\n\x0c\n\x04\x05\x03\x02\x03\x12\x04\ + \x8c\x01\x04\x1e\n\r\n\x05\x05\x03\x02\x03\x01\x12\x04\x8c\x01\x04\x19\n\ + \r\n\x05\x05\x03\x02\x03\x02\x12\x04\x8c\x01\x1c\x1d\n\x0c\n\x04\x05\x03\ + \x02\x04\x12\x04\x8d\x01\x04\x1a\n\r\n\x05\x05\x03\x02\x04\x01\x12\x04\ + \x8d\x01\x04\x15\n\r\n\x05\x05\x03\x02\x04\x02\x12\x04\x8d\x01\x18\x19\n\ + S\n\x04\x05\x03\x02\x05\x12\x04\x8f\x01\x04\x14\x1aE\x20TODO\x20should\ + \x20probably\x20also\x20allow\x20EXPECT_RECONNECT\x20here,\x20for\x20Dit\ + toTap\n\n\r\n\x05\x05\x03\x02\x05\x01\x12\x04\x8f\x01\x04\r\n\r\n\x05\ + \x05\x03\x02\x05\x02\x12\x04\x8f\x01\x10\x13\n8\n\x02\x05\x04\x12\x06\ + \x93\x01\0\x9d\x01\x01\x1a*\x20Should\x20accompany\x20all\x20S2C_ERROR\ + \x20messages.\n\n\x0b\n\x03\x05\x04\x01\x12\x04\x93\x01\x05\x13\n\x0c\n\ + \x04\x05\x04\x02\0\x12\x04\x94\x01\x04\x11\n\r\n\x05\x05\x04\x02\0\x01\ + \x12\x04\x94\x01\x04\x0c\n\r\n\x05\x05\x04\x02\0\x02\x12\x04\x94\x01\x0f\ + \x10\n*\n\x04\x05\x04\x02\x01\x12\x04\x95\x01\x04\x16\"\x1c\x20Squid\x20\ + TCP\x20connection\x20broke\n\n\r\n\x05\x05\x04\x02\x01\x01\x12\x04\x95\ + \x01\x04\x11\n\r\n\x05\x05\x04\x02\x01\x02\x12\x04\x95\x01\x14\x15\n7\n\ + \x04\x05\x04\x02\x02\x12\x04\x96\x01\x04\x18\")\x20You\x20told\x20me\x20\ + something\x20was\x20wrong,\x20client\n\n\r\n\x05\x05\x04\x02\x02\x01\x12\ + \x04\x96\x01\x04\x13\n\r\n\x05\x05\x04\x02\x02\x02\x12\x04\x96\x01\x16\ + \x17\n@\n\x04\x05\x04\x02\x03\x12\x04\x97\x01\x04\x18\"2\x20You\x20messe\ + d\x20up,\x20client\x20(e.g.\x20sent\x20a\x20bad\x20protobuf)\n\n\r\n\x05\ + \x05\x04\x02\x03\x01\x12\x04\x97\x01\x04\x13\n\r\n\x05\x05\x04\x02\x03\ + \x02\x12\x04\x97\x01\x16\x17\n\x17\n\x04\x05\x04\x02\x04\x12\x04\x98\x01\ + \x04\x19\"\t\x20I\x20broke\n\n\r\n\x05\x05\x04\x02\x04\x01\x12\x04\x98\ + \x01\x04\x14\n\r\n\x05\x05\x04\x02\x04\x02\x12\x04\x98\x01\x17\x18\nE\n\ + \x04\x05\x04\x02\x05\x12\x04\x99\x01\x04\x17\"7\x20Everything's\x20fine,\ + \x20but\x20don't\x20use\x20this\x20decoy\x20right\x20now\n\n\r\n\x05\x05\ + \x04\x02\x05\x01\x12\x04\x99\x01\x04\x12\n\r\n\x05\x05\x04\x02\x05\x02\ + \x12\x04\x99\x01\x15\x16\nD\n\x04\x05\x04\x02\x06\x12\x04\x9b\x01\x04\ + \x18\"6\x20My\x20stream\x20to\x20you\x20broke.\x20(This\x20is\x20impossi\ + ble\x20to\x20send)\n\n\r\n\x05\x05\x04\x02\x06\x01\x12\x04\x9b\x01\x04\ + \x11\n\r\n\x05\x05\x04\x02\x06\x02\x12\x04\x9b\x01\x14\x17\nA\n\x04\x05\ + \x04\x02\x07\x12\x04\x9c\x01\x04\x19\"3\x20You\x20never\x20came\x20back.\ + \x20(This\x20is\x20impossible\x20to\x20send)\n\n\r\n\x05\x05\x04\x02\x07\ + \x01\x12\x04\x9c\x01\x04\x12\n\r\n\x05\x05\x04\x02\x07\x02\x12\x04\x9c\ + \x01\x15\x18\n\x0c\n\x02\x05\x05\x12\x06\x9f\x01\0\xab\x01\x01\n\x0b\n\ + \x03\x05\x05\x01\x12\x04\x9f\x01\x05\x12\n\x0c\n\x04\x05\x05\x02\0\x12\ + \x04\xa0\x01\x04\r\n\r\n\x05\x05\x05\x02\0\x01\x12\x04\xa0\x01\x04\x08\n\ + \r\n\x05\x05\x05\x02\0\x02\x12\x04\xa0\x01\x0b\x0c\n`\n\x04\x05\x05\x02\ + \x01\x12\x04\xa1\x01\x04\x0c\"R\x20Send\x20a\x2032-byte\x20HMAC\x20id\ + \x20to\x20let\x20the\x20station\x20distinguish\x20registrations\x20to\ + \x20same\x20host\n\n\r\n\x05\x05\x05\x02\x01\x01\x12\x04\xa1\x01\x04\x07\ + \n\r\n\x05\x05\x05\x02\x01\x02\x12\x04\xa1\x01\n\x0b\n\x0c\n\x04\x05\x05\ + \x02\x02\x12\x04\xa2\x01\x04\x0e\n\r\n\x05\x05\x05\x02\x02\x01\x12\x04\ + \xa2\x01\x04\t\n\r\n\x05\x05\x05\x02\x02\x02\x12\x04\xa2\x01\x0c\r\n#\n\ + \x04\x05\x05\x02\x03\x12\x04\xa3\x01\x04\r\"\x15\x20UDP\x20transport:\ + \x20DTLS\n\n\r\n\x05\x05\x05\x02\x03\x01\x12\x04\xa3\x01\x04\x08\n\r\n\ + \x05\x05\x05\x02\x03\x02\x12\x04\xa3\x01\x0b\x0c\n:\n\x04\x05\x05\x02\ + \x04\x12\x04\xa4\x01\x04\x0f\",\x20dynamic\x20prefix\x20transport\x20(an\ + d\x20updated\x20Min)\n\n\r\n\x05\x05\x05\x02\x04\x01\x12\x04\xa4\x01\x04\ + \n\n\r\n\x05\x05\x05\x02\x04\x02\x12\x04\xa4\x01\r\x0e\n$\n\x04\x05\x05\ + \x02\x05\x12\x04\xa5\x01\x04\r\"\x16\x20uTLS\x20based\x20transport\n\n\r\ + \n\x05\x05\x05\x02\x05\x01\x12\x04\xa5\x01\x04\x08\n\r\n\x05\x05\x05\x02\ + \x05\x02\x12\x04\xa5\x01\x0b\x0c\n?\n\x04\x05\x05\x02\x06\x12\x04\xa6\ + \x01\x04\x0f\"1\x20Formatting\x20transport\x20-\x20format\x20first,\x20f\ + ormat\x20all\n\n\r\n\x05\x05\x05\x02\x06\x01\x12\x04\xa6\x01\x04\n\n\r\n\ + \x05\x05\x05\x02\x06\x02\x12\x04\xa6\x01\r\x0e\n\x1b\n\x04\x05\x05\x02\ + \x07\x12\x04\xa7\x01\x04\r\"\r\x20WebAssembly\n\n\r\n\x05\x05\x05\x02\ + \x07\x01\x12\x04\xa7\x01\x04\x08\n\r\n\x05\x05\x05\x02\x07\x02\x12\x04\ + \xa7\x01\x0b\x0c\n.\n\x04\x05\x05\x02\x08\x12\x04\xa8\x01\x04\x0c\"\x20\ + \x20Format\x20transforming\x20encryption\n\n\r\n\x05\x05\x05\x02\x08\x01\ + \x12\x04\xa8\x01\x04\x07\n\r\n\x05\x05\x05\x02\x08\x02\x12\x04\xa8\x01\n\ + \x0b\n\x1f\n\x04\x05\x05\x02\t\x12\x04\xa9\x01\x04\r\"\x11\x20quic\x20tr\ + ansport?\n\n\r\n\x05\x05\x05\x02\t\x01\x12\x04\xa9\x01\x04\x08\n\r\n\x05\ + \x05\x05\x02\t\x02\x12\x04\xa9\x01\x0b\x0c\n1\n\x04\x05\x05\x02\n\x12\ + \x04\xaa\x01\x04\x10\"#\x20UDP\x20transport:\x20WebRTC\x20DataChannel\n\ + \n\r\n\x05\x05\x05\x02\n\x01\x12\x04\xaa\x01\x04\n\n\r\n\x05\x05\x05\x02\ + \n\x02\x12\x04\xaa\x01\r\x0f\n:\n\x02\x04\x07\x12\x06\xae\x01\0\xb4\x01\ + \x01\x1a,\x20Deflated\x20ICE\x20Candidate\x20by\x20seed2sdp\x20package\n\ + \n\x0b\n\x03\x04\x07\x01\x12\x04\xae\x01\x08\x1a\n5\n\x04\x04\x07\x02\0\ + \x12\x04\xb0\x01\x04!\x1a'\x20IP\x20is\x20represented\x20in\x20its\x2016\ + -byte\x20form\n\n\r\n\x05\x04\x07\x02\0\x04\x12\x04\xb0\x01\x04\x0c\n\r\ + \n\x05\x04\x07\x02\0\x05\x12\x04\xb0\x01\r\x13\n\r\n\x05\x04\x07\x02\0\ + \x01\x12\x04\xb0\x01\x14\x1c\n\r\n\x05\x04\x07\x02\0\x03\x12\x04\xb0\x01\ + \x1f\x20\n\x0c\n\x04\x04\x07\x02\x01\x12\x04\xb1\x01\x04!\n\r\n\x05\x04\ + \x07\x02\x01\x04\x12\x04\xb1\x01\x04\x0c\n\r\n\x05\x04\x07\x02\x01\x05\ + \x12\x04\xb1\x01\r\x13\n\r\n\x05\x04\x07\x02\x01\x01\x12\x04\xb1\x01\x14\ + \x1c\n\r\n\x05\x04\x07\x02\x01\x03\x12\x04\xb1\x01\x1f\x20\n\x9b\x01\n\ + \x04\x04\x07\x02\x02\x12\x04\xb3\x01\x04&\x1a\x8c\x01\x20Composed\x20inf\ + o\x20includes\x20port,\x20tcptype\x20(unset\x20if\x20not\x20tcp),\x20can\ + didate\x20type\x20(host,\x20srflx,\x20prflx),\x20protocol\x20(TCP/UDP),\ + \x20and\x20component\x20(RTP/RTCP)\n\n\r\n\x05\x04\x07\x02\x02\x04\x12\ + \x04\xb3\x01\x04\x0c\n\r\n\x05\x04\x07\x02\x02\x05\x12\x04\xb3\x01\r\x13\ + \n\r\n\x05\x04\x07\x02\x02\x01\x12\x04\xb3\x01\x14!\n\r\n\x05\x04\x07\ + \x02\x02\x03\x12\x04\xb3\x01$%\n;\n\x02\x04\x08\x12\x06\xb7\x01\0\xba\ + \x01\x01\x1a-\x20Deflated\x20SDP\x20for\x20WebRTC\x20by\x20seed2sdp\x20p\ + ackage\n\n\x0b\n\x03\x04\x08\x01\x12\x04\xb7\x01\x08\x11\n\x0c\n\x04\x04\ + \x08\x02\0\x12\x04\xb8\x01\x04\x1d\n\r\n\x05\x04\x08\x02\0\x04\x12\x04\ + \xb8\x01\x04\x0c\n\r\n\x05\x04\x08\x02\0\x05\x12\x04\xb8\x01\r\x13\n\r\n\ + \x05\x04\x08\x02\0\x01\x12\x04\xb8\x01\x14\x18\n\r\n\x05\x04\x08\x02\0\ + \x03\x12\x04\xb8\x01\x1b\x1c\n2\n\x04\x04\x08\x02\x01\x12\x04\xb9\x01\ + \x04/\"$\x20there\x20could\x20be\x20multiple\x20candidates\n\n\r\n\x05\ + \x04\x08\x02\x01\x04\x12\x04\xb9\x01\x04\x0c\n\r\n\x05\x04\x08\x02\x01\ + \x06\x12\x04\xb9\x01\r\x1f\n\r\n\x05\x04\x08\x02\x01\x01\x12\x04\xb9\x01\ + \x20*\n\r\n\x05\x04\x08\x02\x01\x03\x12\x04\xb9\x01-.\n?\n\x02\x04\t\x12\ + \x06\xbd\x01\0\xc0\x01\x01\x1a1\x20WebRTCSignal\x20includes\x20a\x20defl\ + ated\x20SDP\x20and\x20a\x20seed\n\n\x0b\n\x03\x04\t\x01\x12\x04\xbd\x01\ + \x08\x14\n\x0c\n\x04\x04\t\x02\0\x12\x04\xbe\x01\x04\x1d\n\r\n\x05\x04\t\ + \x02\0\x04\x12\x04\xbe\x01\x04\x0c\n\r\n\x05\x04\t\x02\0\x05\x12\x04\xbe\ + \x01\r\x13\n\r\n\x05\x04\t\x02\0\x01\x12\x04\xbe\x01\x14\x18\n\r\n\x05\ + \x04\t\x02\0\x03\x12\x04\xbe\x01\x1b\x1c\n\x0c\n\x04\x04\t\x02\x01\x12\ + \x04\xbf\x01\x04\x1f\n\r\n\x05\x04\t\x02\x01\x04\x12\x04\xbf\x01\x04\x0c\ + \n\r\n\x05\x04\t\x02\x01\x06\x12\x04\xbf\x01\r\x16\n\r\n\x05\x04\t\x02\ + \x01\x01\x12\x04\xbf\x01\x17\x1a\n\r\n\x05\x04\t\x02\x01\x03\x12\x04\xbf\ + \x01\x1d\x1e\n\x0c\n\x02\x04\n\x12\x06\xc2\x01\0\xc5\x01\x01\n\x0b\n\x03\ + \x04\n\x01\x12\x04\xc2\x01\x08\x0c\n\x0c\n\x04\x04\n\x02\0\x12\x04\xc3\ + \x01\x04\x1a\n\r\n\x05\x04\n\x02\0\x04\x12\x04\xc3\x01\x04\x0c\n\r\n\x05\ + \x04\n\x02\0\x05\x12\x04\xc3\x01\r\x12\n\r\n\x05\x04\n\x02\0\x01\x12\x04\ + \xc3\x01\x13\x15\n\r\n\x05\x04\n\x02\0\x03\x12\x04\xc3\x01\x18\x19\n\x0c\ + \n\x04\x04\n\x02\x01\x12\x04\xc4\x01\x04\x1d\n\r\n\x05\x04\n\x02\x01\x04\ + \x12\x04\xc4\x01\x04\x0c\n\r\n\x05\x04\n\x02\x01\x05\x12\x04\xc4\x01\r\ + \x13\n\r\n\x05\x04\n\x02\x01\x01\x12\x04\xc4\x01\x14\x18\n\r\n\x05\x04\n\ + \x02\x01\x03\x12\x04\xc4\x01\x1b\x1c\n\x0c\n\x02\x04\x0b\x12\x06\xc7\x01\ + \0\xcd\x01\x01\n\x0b\n\x03\x04\x0b\x01\x12\x04\xc7\x01\x08\x1b\n\x0c\n\ + \x04\x04\x0b\x02\0\x12\x04\xc8\x01\x04\x20\n\r\n\x05\x04\x0b\x02\0\x04\ + \x12\x04\xc8\x01\x04\x0c\n\r\n\x05\x04\x0b\x02\0\x06\x12\x04\xc8\x01\r\ + \x11\n\r\n\x05\x04\x0b\x02\0\x01\x12\x04\xc8\x01\x12\x1b\n\r\n\x05\x04\ + \x0b\x02\0\x03\x12\x04\xc8\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x01\x12\ + \x04\xc9\x01\x04\x20\n\r\n\x05\x04\x0b\x02\x01\x04\x12\x04\xc9\x01\x04\ + \x0c\n\r\n\x05\x04\x0b\x02\x01\x06\x12\x04\xc9\x01\r\x11\n\r\n\x05\x04\ + \x0b\x02\x01\x01\x12\x04\xc9\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x01\x03\ + \x12\x04\xc9\x01\x1e\x1f\n\x0c\n\x04\x04\x0b\x02\x02\x12\x04\xca\x01\x04\ + )\n\r\n\x05\x04\x0b\x02\x02\x04\x12\x04\xca\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x02\x05\x12\x04\xca\x01\r\x11\n\r\n\x05\x04\x0b\x02\x02\x01\x12\ + \x04\xca\x01\x12$\n\r\n\x05\x04\x0b\x02\x02\x03\x12\x04\xca\x01'(\nN\n\ + \x04\x04\x0b\x02\x03\x12\x04\xcc\x01\x04\x20\x1a@\x20Unordered\x20sets\ + \x20the\x20reliability\x20of\x20the\x20DTLS\x20stream\x20to\x20unordered\ + \n\n\r\n\x05\x04\x0b\x02\x03\x04\x12\x04\xcc\x01\x04\x0c\n\r\n\x05\x04\ + \x0b\x02\x03\x05\x12\x04\xcc\x01\r\x11\n\r\n\x05\x04\x0b\x02\x03\x01\x12\ + \x04\xcc\x01\x12\x1b\n\r\n\x05\x04\x0b\x02\x03\x03\x12\x04\xcc\x01\x1e\ + \x1f\n\x0c\n\x02\x04\x0c\x12\x06\xcf\x01\0\xe6\x01\x01\n\x0b\n\x03\x04\ + \x0c\x01\x12\x04\xcf\x01\x08\x17\nO\n\x04\x04\x0c\x02\0\x12\x04\xd1\x01\ + \x04)\x1aA\x20Should\x20accompany\x20(at\x20least)\x20SESSION_INIT\x20an\ + d\x20CONFIRM_RECONNECT.\n\n\r\n\x05\x04\x0c\x02\0\x04\x12\x04\xd1\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\0\x05\x12\x04\xd1\x01\r\x13\n\r\n\x05\x04\ + \x0c\x02\0\x01\x12\x04\xd1\x01\x14$\n\r\n\x05\x04\x0c\x02\0\x03\x12\x04\ + \xd1\x01'(\nv\n\x04\x04\x0c\x02\x01\x12\x04\xd5\x01\x041\x1ah\x20There\ + \x20might\x20be\x20a\x20state\x20transition.\x20May\x20be\x20absent;\x20\ + absence\x20should\x20be\n\x20treated\x20identically\x20to\x20NO_CHANGE.\ + \n\n\r\n\x05\x04\x0c\x02\x01\x04\x12\x04\xd5\x01\x04\x0c\n\r\n\x05\x04\ + \x0c\x02\x01\x06\x12\x04\xd5\x01\r\x1b\n\r\n\x05\x04\x0c\x02\x01\x01\x12\ + \x04\xd5\x01\x1c,\n\r\n\x05\x04\x0c\x02\x01\x03\x12\x04\xd5\x01/0\nc\n\ + \x04\x04\x0c\x02\x02\x12\x04\xd9\x01\x04(\x1aU\x20The\x20station\x20can\ + \x20send\x20client\x20config\x20info\x20piggybacked\n\x20on\x20any\x20me\ + ssage,\x20as\x20it\x20sees\x20fit\n\n\r\n\x05\x04\x0c\x02\x02\x04\x12\ + \x04\xd9\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x02\x06\x12\x04\xd9\x01\r\x17\ + \n\r\n\x05\x04\x0c\x02\x02\x01\x12\x04\xd9\x01\x18#\n\r\n\x05\x04\x0c\ + \x02\x02\x03\x12\x04\xd9\x01&'\nP\n\x04\x04\x0c\x02\x03\x12\x04\xdc\x01\ + \x04+\x1aB\x20If\x20state_transition\x20==\x20S2C_ERROR,\x20this\x20fiel\ + d\x20is\x20the\x20explanation.\n\n\r\n\x05\x04\x0c\x02\x03\x04\x12\x04\ + \xdc\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x03\x06\x12\x04\xdc\x01\r\x1b\n\r\ + \n\x05\x04\x0c\x02\x03\x01\x12\x04\xdc\x01\x1c&\n\r\n\x05\x04\x0c\x02\ + \x03\x03\x12\x04\xdc\x01)*\nQ\n\x04\x04\x0c\x02\x04\x12\x04\xdf\x01\x04$\ + \x1aC\x20Signals\x20client\x20to\x20stop\x20connecting\x20for\x20followi\ + ng\x20amount\x20of\x20seconds\n\n\r\n\x05\x04\x0c\x02\x04\x04\x12\x04\ + \xdf\x01\x04\x0c\n\r\n\x05\x04\x0c\x02\x04\x05\x12\x04\xdf\x01\r\x13\n\r\ + \n\x05\x04\x0c\x02\x04\x01\x12\x04\xdf\x01\x14\x1f\n\r\n\x05\x04\x0c\x02\ + \x04\x03\x12\x04\xdf\x01\"#\nK\n\x04\x04\x0c\x02\x05\x12\x04\xe2\x01\x04\ + #\x1a=\x20Sent\x20in\x20SESSION_INIT,\x20identifies\x20the\x20station\ + \x20that\x20picked\x20up\n\n\r\n\x05\x04\x0c\x02\x05\x04\x12\x04\xe2\x01\ + \x04\x0c\n\r\n\x05\x04\x0c\x02\x05\x05\x12\x04\xe2\x01\r\x13\n\r\n\x05\ + \x04\x0c\x02\x05\x01\x12\x04\xe2\x01\x14\x1e\n\r\n\x05\x04\x0c\x02\x05\ + \x03\x12\x04\xe2\x01!\"\nG\n\x04\x04\x0c\x02\x06\x12\x04\xe5\x01\x04!\ + \x1a9\x20Random-sized\x20junk\x20to\x20defeat\x20packet\x20size\x20finge\ + rprinting.\n\n\r\n\x05\x04\x0c\x02\x06\x04\x12\x04\xe5\x01\x04\x0c\n\r\n\ + \x05\x04\x0c\x02\x06\x05\x12\x04\xe5\x01\r\x12\n\r\n\x05\x04\x0c\x02\x06\ + \x01\x12\x04\xe5\x01\x13\x1a\n\r\n\x05\x04\x0c\x02\x06\x03\x12\x04\xe5\ + \x01\x1d\x20\n\x0c\n\x02\x04\r\x12\x06\xe8\x01\0\xee\x01\x01\n\x0b\n\x03\ + \x04\r\x01\x12\x04\xe8\x01\x08\x19\n\x0c\n\x04\x04\r\x02\0\x12\x04\xe9\ + \x01\x08&\n\r\n\x05\x04\r\x02\0\x04\x12\x04\xe9\x01\x08\x10\n\r\n\x05\ + \x04\r\x02\0\x05\x12\x04\xe9\x01\x11\x15\n\r\n\x05\x04\r\x02\0\x01\x12\ + \x04\xe9\x01\x16!\n\r\n\x05\x04\r\x02\0\x03\x12\x04\xe9\x01$%\n\x0c\n\ + \x04\x04\r\x02\x01\x12\x04\xea\x01\x08%\n\r\n\x05\x04\r\x02\x01\x04\x12\ + \x04\xea\x01\x08\x10\n\r\n\x05\x04\r\x02\x01\x05\x12\x04\xea\x01\x11\x15\ + \n\r\n\x05\x04\r\x02\x01\x01\x12\x04\xea\x01\x16\x20\n\r\n\x05\x04\r\x02\ + \x01\x03\x12\x04\xea\x01#$\n\x0c\n\x04\x04\r\x02\x02\x12\x04\xeb\x01\x08\ + '\n\r\n\x05\x04\r\x02\x02\x04\x12\x04\xeb\x01\x08\x10\n\r\n\x05\x04\r\ + \x02\x02\x05\x12\x04\xeb\x01\x11\x15\n\r\n\x05\x04\r\x02\x02\x01\x12\x04\ + \xeb\x01\x16\"\n\r\n\x05\x04\r\x02\x02\x03\x12\x04\xeb\x01%&\n\x0c\n\x04\ + \x04\r\x02\x03\x12\x04\xec\x01\x04\x1e\n\r\n\x05\x04\r\x02\x03\x04\x12\ + \x04\xec\x01\x04\x0c\n\r\n\x05\x04\r\x02\x03\x05\x12\x04\xec\x01\r\x11\n\ + \r\n\x05\x04\r\x02\x03\x01\x12\x04\xec\x01\x12\x19\n\r\n\x05\x04\r\x02\ + \x03\x03\x12\x04\xec\x01\x1c\x1d\n\x0c\n\x04\x04\r\x02\x04\x12\x04\xed\ + \x01\x04!\n\r\n\x05\x04\r\x02\x04\x04\x12\x04\xed\x01\x04\x0c\n\r\n\x05\ + \x04\r\x02\x04\x05\x12\x04\xed\x01\r\x11\n\r\n\x05\x04\r\x02\x04\x01\x12\ + \x04\xed\x01\x12\x1c\n\r\n\x05\x04\r\x02\x04\x03\x12\x04\xed\x01\x1f\x20\ + \n\x0c\n\x02\x04\x0e\x12\x06\xf0\x01\0\xaa\x02\x01\n\x0b\n\x03\x04\x0e\ + \x01\x12\x04\xf0\x01\x08\x17\n\x0c\n\x04\x04\x0e\x02\0\x12\x04\xf1\x01\ + \x04)\n\r\n\x05\x04\x0e\x02\0\x04\x12\x04\xf1\x01\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\0\x05\x12\x04\xf1\x01\r\x13\n\r\n\x05\x04\x0e\x02\0\x01\x12\x04\ + \xf1\x01\x14$\n\r\n\x05\x04\x0e\x02\0\x03\x12\x04\xf1\x01'(\n\xd0\x01\n\ + \x04\x04\x0e\x02\x01\x12\x04\xf6\x01\x04.\x1a\xc1\x01\x20The\x20client\ + \x20reports\x20its\x20decoy\x20list's\x20version\x20number\x20here,\x20w\ + hich\x20the\n\x20station\x20can\x20use\x20to\x20decide\x20whether\x20to\ + \x20send\x20an\x20updated\x20one.\x20The\x20station\n\x20should\x20alway\ + s\x20send\x20a\x20list\x20if\x20this\x20field\x20is\x20set\x20to\x200.\n\ + \n\r\n\x05\x04\x0e\x02\x01\x04\x12\x04\xf6\x01\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x01\x05\x12\x04\xf6\x01\r\x13\n\r\n\x05\x04\x0e\x02\x01\x01\x12\x04\ + \xf6\x01\x14)\n\r\n\x05\x04\x0e\x02\x01\x03\x12\x04\xf6\x01,-\n\x0c\n\ + \x04\x04\x0e\x02\x02\x12\x04\xf8\x01\x041\n\r\n\x05\x04\x0e\x02\x02\x04\ + \x12\x04\xf8\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x02\x06\x12\x04\xf8\x01\r\ + \x1b\n\r\n\x05\x04\x0e\x02\x02\x01\x12\x04\xf8\x01\x1c,\n\r\n\x05\x04\ + \x0e\x02\x02\x03\x12\x04\xf8\x01/0\n\x80\x01\n\x04\x04\x0e\x02\x03\x12\ + \x04\xfc\x01\x04$\x1ar\x20The\x20position\x20in\x20the\x20overall\x20ses\ + sion's\x20upload\x20sequence\x20where\x20the\x20current\n\x20YIELD=>ACQU\ + IRE\x20switchover\x20is\x20happening.\n\n\r\n\x05\x04\x0e\x02\x03\x04\ + \x12\x04\xfc\x01\x04\x0c\n\r\n\x05\x04\x0e\x02\x03\x05\x12\x04\xfc\x01\r\ + \x13\n\r\n\x05\x04\x0e\x02\x03\x01\x12\x04\xfc\x01\x14\x1f\n\r\n\x05\x04\ + \x0e\x02\x03\x03\x12\x04\xfc\x01\"#\ng\n\x04\x04\x0e\x02\x04\x12\x04\x80\ + \x02\x04+\x1aY\x20High\x20level\x20client\x20library\x20version\x20used\ + \x20for\x20indicating\x20feature\x20support,\x20or\n\x20lack\x20therof.\ + \n\n\r\n\x05\x04\x0e\x02\x04\x04\x12\x04\x80\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\x04\x05\x12\x04\x80\x02\r\x13\n\r\n\x05\x04\x0e\x02\x04\x01\x12\ + \x04\x80\x02\x14&\n\r\n\x05\x04\x0e\x02\x04\x03\x12\x04\x80\x02)*\n\xa5\ + \x02\n\x04\x04\x0e\x02\x05\x12\x04\x85\x02\x042\x1a\x96\x02\x20Indicates\ + \x20whether\x20the\x20client\x20will\x20allow\x20the\x20registrar\x20to\ + \x20provide\x20alternative\x20parameters\x20that\n\x20may\x20work\x20bet\ + ter\x20in\x20substitute\x20for\x20the\x20deterministically\x20selected\ + \x20parameters.\x20This\x20only\x20works\n\x20for\x20bidirectional\x20re\ + gistration\x20methods\x20where\x20the\x20client\x20receives\x20a\x20Regi\ + strationResponse.\n\n\r\n\x05\x04\x0e\x02\x05\x04\x12\x04\x85\x02\x04\ + \x0c\n\r\n\x05\x04\x0e\x02\x05\x05\x12\x04\x85\x02\r\x11\n\r\n\x05\x04\ + \x0e\x02\x05\x01\x12\x04\x85\x02\x12-\n\r\n\x05\x04\x0e\x02\x05\x03\x12\ + \x04\x85\x0201\nq\n\x04\x04\x0e\x02\x06\x12\x04\x89\x02\x04'\x1ac\x20Lis\ + t\x20of\x20decoys\x20that\x20client\x20have\x20unsuccessfully\x20tried\ + \x20in\x20current\x20session.\n\x20Could\x20be\x20sent\x20in\x20chunks\n\ + \n\r\n\x05\x04\x0e\x02\x06\x04\x12\x04\x89\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x06\x05\x12\x04\x89\x02\r\x13\n\r\n\x05\x04\x0e\x02\x06\x01\x12\x04\ + \x89\x02\x14!\n\r\n\x05\x04\x0e\x02\x06\x03\x12\x04\x89\x02$&\n\x0c\n\ + \x04\x04\x0e\x02\x07\x12\x04\x8b\x02\x04%\n\r\n\x05\x04\x0e\x02\x07\x04\ + \x12\x04\x8b\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x07\x06\x12\x04\x8b\x02\r\ + \x19\n\r\n\x05\x04\x0e\x02\x07\x01\x12\x04\x8b\x02\x1a\x1f\n\r\n\x05\x04\ + \x0e\x02\x07\x03\x12\x04\x8b\x02\"$\nk\n\x04\x04\x0e\x02\x08\x12\x04\x8e\ + \x02\x04*\x1a]\x20NullTransport,\x20MinTransport,\x20Obfs4Transport,\x20\ + etc.\x20Transport\x20type\x20we\x20want\x20from\x20phantom\x20proxy\n\n\ + \r\n\x05\x04\x0e\x02\x08\x04\x12\x04\x8e\x02\x04\x0c\n\r\n\x05\x04\x0e\ + \x02\x08\x06\x12\x04\x8e\x02\r\x1a\n\r\n\x05\x04\x0e\x02\x08\x01\x12\x04\ + \x8e\x02\x1b$\n\r\n\x05\x04\x0e\x02\x08\x03\x12\x04\x8e\x02')\n\x0c\n\ + \x04\x04\x0e\x02\t\x12\x04\x90\x02\x047\n\r\n\x05\x04\x0e\x02\t\x04\x12\ + \x04\x90\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\t\x06\x12\x04\x90\x02\r\x20\n\ + \r\n\x05\x04\x0e\x02\t\x01\x12\x04\x90\x02!1\n\r\n\x05\x04\x0e\x02\t\x03\ + \x12\x04\x90\x0246\n\xc8\x03\n\x04\x04\x0e\x02\n\x12\x04\x98\x02\x04(\ + \x1a\xb9\x03\x20Station\x20is\x20only\x20required\x20to\x20check\x20this\ + \x20variable\x20during\x20session\x20initialization.\n\x20If\x20set,\x20\ + station\x20must\x20facilitate\x20connection\x20to\x20said\x20target\x20b\ + y\x20itself,\x20i.e.\x20write\x20into\x20squid\n\x20socket\x20an\x20HTTP\ + /SOCKS/any\x20other\x20connection\x20request.\n\x20covert_address\x20mus\ + t\x20have\x20exactly\x20one\x20':'\x20colon,\x20that\x20separates\x20hos\ + t\x20(literal\x20IP\x20address\x20or\n\x20resolvable\x20hostname)\x20and\ + \x20port\n\x20TODO:\x20make\x20it\x20required\x20for\x20initialization,\ + \x20and\x20stop\x20connecting\x20any\x20client\x20straight\x20to\x20squi\ + d?\n\n\r\n\x05\x04\x0e\x02\n\x04\x12\x04\x98\x02\x04\x0c\n\r\n\x05\x04\ + \x0e\x02\n\x05\x12\x04\x98\x02\r\x13\n\r\n\x05\x04\x0e\x02\n\x01\x12\x04\ + \x98\x02\x14\"\n\r\n\x05\x04\x0e\x02\n\x03\x12\x04\x98\x02%'\nR\n\x04\ + \x04\x0e\x02\x0b\x12\x04\x9b\x02\x042\x1aD\x20Used\x20in\x20dark\x20deco\ + ys\x20to\x20signal\x20which\x20dark\x20decoy\x20it\x20will\x20connect\ + \x20to.\n\n\r\n\x05\x04\x0e\x02\x0b\x04\x12\x04\x9b\x02\x04\x0c\n\r\n\ + \x05\x04\x0e\x02\x0b\x05\x12\x04\x9b\x02\r\x13\n\r\n\x05\x04\x0e\x02\x0b\ + \x01\x12\x04\x9b\x02\x14,\n\r\n\x05\x04\x0e\x02\x0b\x03\x12\x04\x9b\x02/\ + 1\nR\n\x04\x04\x0e\x02\x0c\x12\x04\x9e\x02\x04\"\x1aD\x20Used\x20to\x20i\ + ndicate\x20to\x20server\x20if\x20client\x20is\x20registering\x20v4,\x20v\ + 6\x20or\x20both\n\n\r\n\x05\x04\x0e\x02\x0c\x04\x12\x04\x9e\x02\x04\x0c\ + \n\r\n\x05\x04\x0e\x02\x0c\x05\x12\x04\x9e\x02\r\x11\n\r\n\x05\x04\x0e\ + \x02\x0c\x01\x12\x04\x9e\x02\x12\x1c\n\r\n\x05\x04\x0e\x02\x0c\x03\x12\ + \x04\x9e\x02\x1f!\n\x0c\n\x04\x04\x0e\x02\r\x12\x04\x9f\x02\x04\"\n\r\n\ + \x05\x04\x0e\x02\r\x04\x12\x04\x9f\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\r\ + \x05\x12\x04\x9f\x02\r\x11\n\r\n\x05\x04\x0e\x02\r\x01\x12\x04\x9f\x02\ + \x12\x1c\n\r\n\x05\x04\x0e\x02\r\x03\x12\x04\x9f\x02\x1f!\nD\n\x04\x04\ + \x0e\x02\x0e\x12\x04\xa2\x02\x04*\x1a6\x20A\x20collection\x20of\x20optio\ + nal\x20flags\x20for\x20the\x20registration.\n\n\r\n\x05\x04\x0e\x02\x0e\ + \x04\x12\x04\xa2\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\x0e\x06\x12\x04\xa2\ + \x02\r\x1e\n\r\n\x05\x04\x0e\x02\x0e\x01\x12\x04\xa2\x02\x1f$\n\r\n\x05\ + \x04\x0e\x02\x0e\x03\x12\x04\xa2\x02')\nq\n\x04\x04\x0e\x02\x0f\x12\x04\ + \xa6\x02\x04-\x1ac\x20Transport\x20Extensions\n\x20TODO(jmwample)\x20-\ + \x20move\x20to\x20WebRTC\x20specific\x20transport\x20params\x20protobuf\ + \x20message.\n\n\r\n\x05\x04\x0e\x02\x0f\x04\x12\x04\xa6\x02\x04\x0c\n\r\ + \n\x05\x04\x0e\x02\x0f\x06\x12\x04\xa6\x02\r\x19\n\r\n\x05\x04\x0e\x02\ + \x0f\x01\x12\x04\xa6\x02\x1a'\n\r\n\x05\x04\x0e\x02\x0f\x03\x12\x04\xa6\ + \x02*,\nG\n\x04\x04\x0e\x02\x10\x12\x04\xa9\x02\x04!\x1a9\x20Random-size\ + d\x20junk\x20to\x20defeat\x20packet\x20size\x20fingerprinting.\n\n\r\n\ + \x05\x04\x0e\x02\x10\x04\x12\x04\xa9\x02\x04\x0c\n\r\n\x05\x04\x0e\x02\ + \x10\x05\x12\x04\xa9\x02\r\x12\n\r\n\x05\x04\x0e\x02\x10\x01\x12\x04\xa9\ + \x02\x13\x1a\n\r\n\x05\x04\x0e\x02\x10\x03\x12\x04\xa9\x02\x1d\x20\n\x0c\ + \n\x02\x04\x0f\x12\x06\xad\x02\0\xbf\x02\x01\n\x0b\n\x03\x04\x0f\x01\x12\ + \x04\xad\x02\x08\x1d\n!\n\x04\x04\x0f\x02\0\x12\x04\xaf\x02\x04!\x1a\x13\ + \x20Prefix\x20Identifier\n\n\r\n\x05\x04\x0f\x02\0\x04\x12\x04\xaf\x02\ + \x04\x0c\n\r\n\x05\x04\x0f\x02\0\x05\x12\x04\xaf\x02\r\x12\n\r\n\x05\x04\ + \x0f\x02\0\x01\x12\x04\xaf\x02\x13\x1c\n\r\n\x05\x04\x0f\x02\0\x03\x12\ + \x04\xaf\x02\x1f\x20\n\xc4\x01\n\x04\x04\x0f\x02\x01\x12\x04\xb3\x02\x04\ + \x1e\x1a\xb5\x01\x20Prefix\x20bytes\x20(optional\x20-\x20usually\x20sent\ + \x20from\x20station\x20to\x20client\x20as\x20override\x20if\x20allowed\ + \x20by\x20C2S)\n\x20as\x20the\x20station\x20cannot\x20take\x20this\x20in\ + to\x20account\x20when\x20attempting\x20to\x20identify\x20a\x20connection\ + .\n\n\r\n\x05\x04\x0f\x02\x01\x04\x12\x04\xb3\x02\x04\x0c\n\r\n\x05\x04\ + \x0f\x02\x01\x05\x12\x04\xb3\x02\r\x12\n\r\n\x05\x04\x0f\x02\x01\x01\x12\ + \x04\xb3\x02\x13\x19\n\r\n\x05\x04\x0f\x02\x01\x03\x12\x04\xb3\x02\x1c\ + \x1d\n\x0c\n\x04\x04\x0f\x02\x02\x12\x04\xb4\x02\x04+\n\r\n\x05\x04\x0f\ + \x02\x02\x04\x12\x04\xb4\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x02\x05\x12\ + \x04\xb4\x02\r\x12\n\r\n\x05\x04\x0f\x02\x02\x01\x12\x04\xb4\x02\x13&\n\ + \r\n\x05\x04\x0f\x02\x02\x03\x12\x04\xb4\x02)*\n\xed\x02\n\x04\x04\x0f\ + \x02\x03\x12\x04\xbe\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\x20the\ + \x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\x20rand\ + omization.\x20Should\x20be\n\x20checked\x20against\x20selected\x20transp\ + ort\x20to\x20ensure\x20that\x20destination\x20port\x20randomization\x20i\ + s\n\x20supported.\n2\x9f\x01\x20//\x20potential\x20future\x20fields\n\ + \x20obfuscator\x20ID\n\x20tagEncoder\x20ID\x20(¶ms?,\x20e.g.\x20form\ + at-base64\x20/\x20padding)\n\x20streamEncoder\x20ID\x20(¶ms?,\x20e.g\ + .\x20foramat-base64\x20/\x20padding)\n\n\r\n\x05\x04\x0f\x02\x03\x04\x12\ + \x04\xbe\x02\x04\x0c\n\r\n\x05\x04\x0f\x02\x03\x05\x12\x04\xbe\x02\r\x11\ + \n\r\n\x05\x04\x0f\x02\x03\x01\x12\x04\xbe\x02\x12$\n\r\n\x05\x04\x0f\ + \x02\x03\x03\x12\x04\xbe\x02')\n\x0c\n\x02\x04\x10\x12\x06\xc1\x02\0\xc6\ + \x02\x01\n\x0b\n\x03\x04\x10\x01\x12\x04\xc1\x02\x08\x1e\n\xcb\x01\n\x04\ + \x04\x10\x02\0\x12\x04\xc5\x02\x04*\x1a\xbc\x01\x20Indicates\x20whether\ + \x20the\x20client\x20has\x20elected\x20to\x20use\x20destination\x20port\ + \x20randomization.\x20Should\x20be\n\x20checked\x20against\x20selected\ + \x20transport\x20to\x20ensure\x20that\x20destination\x20port\x20randomiz\ + ation\x20is\n\x20supported.\n\n\r\n\x05\x04\x10\x02\0\x04\x12\x04\xc5\ + \x02\x04\x0c\n\r\n\x05\x04\x10\x02\0\x05\x12\x04\xc5\x02\r\x11\n\r\n\x05\ + \x04\x10\x02\0\x01\x12\x04\xc5\x02\x12$\n\r\n\x05\x04\x10\x02\0\x03\x12\ + \x04\xc5\x02')\n\x0c\n\x02\x05\x06\x12\x06\xc8\x02\0\xd0\x02\x01\n\x0b\n\ + \x03\x05\x06\x01\x12\x04\xc8\x02\x05\x17\n\x0c\n\x04\x05\x06\x02\0\x12\ + \x04\xc9\x02\x02\x12\n\r\n\x05\x05\x06\x02\0\x01\x12\x04\xc9\x02\x02\r\n\ + \r\n\x05\x05\x06\x02\0\x02\x12\x04\xc9\x02\x10\x11\n\x0c\n\x04\x05\x06\ + \x02\x01\x12\x04\xca\x02\x08\x15\n\r\n\x05\x05\x06\x02\x01\x01\x12\x04\ + \xca\x02\x08\x10\n\r\n\x05\x05\x06\x02\x01\x02\x12\x04\xca\x02\x13\x14\n\ + \x0c\n\x04\x05\x06\x02\x02\x12\x04\xcb\x02\x08\x10\n\r\n\x05\x05\x06\x02\ + \x02\x01\x12\x04\xcb\x02\x08\x0b\n\r\n\x05\x05\x06\x02\x02\x02\x12\x04\ + \xcb\x02\x0e\x0f\n\x0c\n\x04\x05\x06\x02\x03\x12\x04\xcc\x02\x02\x16\n\r\ + \n\x05\x05\x06\x02\x03\x01\x12\x04\xcc\x02\x02\x11\n\r\n\x05\x05\x06\x02\ + \x03\x02\x12\x04\xcc\x02\x14\x15\n\x0c\n\x04\x05\x06\x02\x04\x12\x04\xcd\ + \x02\x02\x17\n\r\n\x05\x05\x06\x02\x04\x01\x12\x04\xcd\x02\x02\x12\n\r\n\ + \x05\x05\x06\x02\x04\x02\x12\x04\xcd\x02\x15\x16\n\x0c\n\x04\x05\x06\x02\ + \x05\x12\x04\xce\x02\x02\n\n\r\n\x05\x05\x06\x02\x05\x01\x12\x04\xce\x02\ + \x02\x05\n\r\n\x05\x05\x06\x02\x05\x02\x12\x04\xce\x02\x08\t\n\x0c\n\x04\ + \x05\x06\x02\x06\x12\x04\xcf\x02\x02\x17\n\r\n\x05\x05\x06\x02\x06\x01\ + \x12\x04\xcf\x02\x02\x12\n\r\n\x05\x05\x06\x02\x06\x02\x12\x04\xcf\x02\ + \x15\x16\n\x0c\n\x02\x04\x11\x12\x06\xd2\x02\0\xec\x02\x01\n\x0b\n\x03\ + \x04\x11\x01\x12\x04\xd2\x02\x08\x12\n\x0c\n\x04\x04\x11\x02\0\x12\x04\ + \xd3\x02\x02#\n\r\n\x05\x04\x11\x02\0\x04\x12\x04\xd3\x02\x02\n\n\r\n\ + \x05\x04\x11\x02\0\x05\x12\x04\xd3\x02\x0b\x10\n\r\n\x05\x04\x11\x02\0\ + \x01\x12\x04\xd3\x02\x11\x1e\n\r\n\x05\x04\x11\x02\0\x03\x12\x04\xd3\x02\ + !\"\n\x0c\n\x04\x04\x11\x02\x01\x12\x04\xd4\x02\x024\n\r\n\x05\x04\x11\ + \x02\x01\x04\x12\x04\xd4\x02\x02\n\n\r\n\x05\x04\x11\x02\x01\x06\x12\x04\ + \xd4\x02\x0b\x1a\n\r\n\x05\x04\x11\x02\x01\x01\x12\x04\xd4\x02\x1b/\n\r\ + \n\x05\x04\x11\x02\x01\x03\x12\x04\xd4\x0223\n\x0c\n\x04\x04\x11\x02\x02\ + \x12\x04\xd5\x02\x026\n\r\n\x05\x04\x11\x02\x02\x04\x12\x04\xd5\x02\x02\ + \n\n\r\n\x05\x04\x11\x02\x02\x06\x12\x04\xd5\x02\x0b\x1d\n\r\n\x05\x04\ + \x11\x02\x02\x01\x12\x04\xd5\x02\x1e1\n\r\n\x05\x04\x11\x02\x02\x03\x12\ + \x04\xd5\x0245\nC\n\x04\x04\x11\x02\x03\x12\x04\xd8\x02\x02*\x1a5\x20cli\ + ent\x20source\x20address\x20when\x20receiving\x20a\x20registration\n\n\r\ + \n\x05\x04\x11\x02\x03\x04\x12\x04\xd8\x02\x02\n\n\r\n\x05\x04\x11\x02\ + \x03\x05\x12\x04\xd8\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x03\x01\x12\x04\ + \xd8\x02\x11%\n\r\n\x05\x04\x11\x02\x03\x03\x12\x04\xd8\x02()\nH\n\x04\ + \x04\x11\x02\x04\x12\x04\xdb\x02\x02#\x1a:\x20Decoy\x20address\x20used\ + \x20when\x20registering\x20over\x20Decoy\x20registrar\n\n\r\n\x05\x04\ + \x11\x02\x04\x04\x12\x04\xdb\x02\x02\n\n\r\n\x05\x04\x11\x02\x04\x05\x12\ + \x04\xdb\x02\x0b\x10\n\r\n\x05\x04\x11\x02\x04\x01\x12\x04\xdb\x02\x11\ + \x1e\n\r\n\x05\x04\x11\x02\x04\x03\x12\x04\xdb\x02!\"\n\xeb\x05\n\x04\ + \x04\x11\x02\x05\x12\x04\xe7\x02\x02:\x1a\xdc\x05\x20The\x20next\x20thre\ + e\x20fields\x20allow\x20an\x20independent\x20registrar\x20(trusted\x20by\ + \x20a\x20station\x20w/\x20a\x20zmq\x20keypair)\x20to\n\x20share\x20the\ + \x20registration\x20overrides\x20that\x20it\x20assigned\x20to\x20the\x20\ + client\x20with\x20the\x20station(s).\n\x20Registration\x20Respose\x20is\ + \x20here\x20to\x20allow\x20a\x20parsed\x20object\x20with\x20direct\x20ac\ + cess\x20to\x20the\x20fields\x20within.\n\x20RegRespBytes\x20provides\x20\ + a\x20serialized\x20verion\x20of\x20the\x20Registration\x20response\x20so\ + \x20that\x20the\x20signature\x20of\n\x20the\x20Bidirectional\x20registra\ + r\x20can\x20be\x20validated\x20before\x20a\x20station\x20applies\x20any\ + \x20overrides\x20present\x20in\n\x20the\x20Registration\x20Response.\n\n\ + \x20If\x20you\x20are\x20reading\x20this\x20in\x20the\x20future\x20and\ + \x20you\x20want\x20to\x20extend\x20the\x20functionality\x20here\x20it\ + \x20might\n\x20make\x20sense\x20to\x20make\x20the\x20RegistrationRespons\ + e\x20that\x20is\x20sent\x20to\x20the\x20client\x20a\x20distinct\x20messa\ + ge\x20from\n\x20the\x20one\x20that\x20gets\x20sent\x20to\x20the\x20stati\ + ons.\n\n\r\n\x05\x04\x11\x02\x05\x04\x12\x04\xe7\x02\x02\n\n\r\n\x05\x04\ + \x11\x02\x05\x06\x12\x04\xe7\x02\x0b\x1f\n\r\n\x05\x04\x11\x02\x05\x01\ + \x12\x04\xe7\x02\x205\n\r\n\x05\x04\x11\x02\x05\x03\x12\x04\xe7\x0289\n\ + \x0c\n\x04\x04\x11\x02\x06\x12\x04\xe8\x02\x02\"\n\r\n\x05\x04\x11\x02\ + \x06\x04\x12\x04\xe8\x02\x02\n\n\r\n\x05\x04\x11\x02\x06\x05\x12\x04\xe8\ + \x02\x0b\x10\n\r\n\x05\x04\x11\x02\x06\x01\x12\x04\xe8\x02\x11\x1d\n\r\n\ + \x05\x04\x11\x02\x06\x03\x12\x04\xe8\x02\x20!\n\x0c\n\x04\x04\x11\x02\ + \x07\x12\x04\xe9\x02\x02'\n\r\n\x05\x04\x11\x02\x07\x04\x12\x04\xe9\x02\ + \x02\n\n\r\n\x05\x04\x11\x02\x07\x05\x12\x04\xe9\x02\x0b\x10\n\r\n\x05\ + \x04\x11\x02\x07\x01\x12\x04\xe9\x02\x11!\n\r\n\x05\x04\x11\x02\x07\x03\ + \x12\x04\xe9\x02$&\n\x0c\n\x02\x04\x12\x12\x06\xee\x02\0\xfa\x02\x01\n\ + \x0b\n\x03\x04\x12\x01\x12\x04\xee\x02\x08\x14\n9\n\x04\x04\x12\x02\0\ + \x12\x04\xef\x02\x04.\"+\x20how\x20many\x20decoys\x20were\x20tried\x20be\ + fore\x20success\n\n\r\n\x05\x04\x12\x02\0\x04\x12\x04\xef\x02\x04\x0c\n\ + \r\n\x05\x04\x12\x02\0\x05\x12\x04\xef\x02\r\x13\n\r\n\x05\x04\x12\x02\0\ + \x01\x12\x04\xef\x02\x14(\n\r\n\x05\x04\x12\x02\0\x03\x12\x04\xef\x02+-\ + \nm\n\x04\x04\x12\x02\x01\x12\x04\xf4\x02\x04/\x1a\x1e\x20Applicable\x20\ + to\x20whole\x20session:\n\"\x1a\x20includes\x20failed\x20attempts\n2#\ + \x20Timings\x20below\x20are\x20in\x20milliseconds\n\n\r\n\x05\x04\x12\ + \x02\x01\x04\x12\x04\xf4\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x01\x05\x12\ + \x04\xf4\x02\r\x13\n\r\n\x05\x04\x12\x02\x01\x01\x12\x04\xf4\x02\x14)\n\ + \r\n\x05\x04\x12\x02\x01\x03\x12\x04\xf4\x02,.\nR\n\x04\x04\x12\x02\x02\ + \x12\x04\xf7\x02\x04(\x1a\x1f\x20Last\x20(i.e.\x20successful)\x20decoy:\ + \n\"#\x20measured\x20during\x20initial\x20handshake\n\n\r\n\x05\x04\x12\ + \x02\x02\x04\x12\x04\xf7\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x02\x05\x12\ + \x04\xf7\x02\r\x13\n\r\n\x05\x04\x12\x02\x02\x01\x12\x04\xf7\x02\x14\"\n\ + \r\n\x05\x04\x12\x02\x02\x03\x12\x04\xf7\x02%'\n%\n\x04\x04\x12\x02\x03\ + \x12\x04\xf8\x02\x04&\"\x17\x20includes\x20tcp\x20to\x20decoy\n\n\r\n\ + \x05\x04\x12\x02\x03\x04\x12\x04\xf8\x02\x04\x0c\n\r\n\x05\x04\x12\x02\ + \x03\x05\x12\x04\xf8\x02\r\x13\n\r\n\x05\x04\x12\x02\x03\x01\x12\x04\xf8\ + \x02\x14\x20\n\r\n\x05\x04\x12\x02\x03\x03\x12\x04\xf8\x02#%\nB\n\x04\ + \x04\x12\x02\x04\x12\x04\xf9\x02\x04&\"4\x20measured\x20when\x20establis\ + hing\x20tcp\x20connection\x20to\x20decot\n\n\r\n\x05\x04\x12\x02\x04\x04\ + \x12\x04\xf9\x02\x04\x0c\n\r\n\x05\x04\x12\x02\x04\x05\x12\x04\xf9\x02\r\ + \x13\n\r\n\x05\x04\x12\x02\x04\x01\x12\x04\xf9\x02\x14\x20\n\r\n\x05\x04\ + \x12\x02\x04\x03\x12\x04\xf9\x02#%\n\x0c\n\x02\x05\x07\x12\x06\xfc\x02\0\ + \x81\x03\x01\n\x0b\n\x03\x05\x07\x01\x12\x04\xfc\x02\x05\x16\n\x0c\n\x04\ + \x05\x07\x02\0\x12\x04\xfd\x02\x04\x10\n\r\n\x05\x05\x07\x02\0\x01\x12\ + \x04\xfd\x02\x04\x0b\n\r\n\x05\x05\x07\x02\0\x02\x12\x04\xfd\x02\x0e\x0f\ + \n\x0c\n\x04\x05\x07\x02\x01\x12\x04\xfe\x02\x04\x0c\n\r\n\x05\x05\x07\ + \x02\x01\x01\x12\x04\xfe\x02\x04\x07\n\r\n\x05\x05\x07\x02\x01\x02\x12\ + \x04\xfe\x02\n\x0b\n\x0c\n\x04\x05\x07\x02\x02\x12\x04\xff\x02\x04\x0f\n\ + \r\n\x05\x05\x07\x02\x02\x01\x12\x04\xff\x02\x04\n\n\r\n\x05\x05\x07\x02\ + \x02\x02\x12\x04\xff\x02\r\x0e\n\x0c\n\x04\x05\x07\x02\x03\x12\x04\x80\ + \x03\x04\x0e\n\r\n\x05\x05\x07\x02\x03\x01\x12\x04\x80\x03\x04\t\n\r\n\ + \x05\x05\x07\x02\x03\x02\x12\x04\x80\x03\x0c\r\n\x0c\n\x02\x05\x08\x12\ + \x06\x83\x03\0\x87\x03\x01\n\x0b\n\x03\x05\x08\x01\x12\x04\x83\x03\x05\ + \x0c\n\x0c\n\x04\x05\x08\x02\0\x12\x04\x84\x03\x04\x0c\n\r\n\x05\x05\x08\ + \x02\0\x01\x12\x04\x84\x03\x04\x07\n\r\n\x05\x05\x08\x02\0\x02\x12\x04\ + \x84\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x01\x12\x04\x85\x03\x04\x0c\n\r\n\ + \x05\x05\x08\x02\x01\x01\x12\x04\x85\x03\x04\x07\n\r\n\x05\x05\x08\x02\ + \x01\x02\x12\x04\x85\x03\n\x0b\n\x0c\n\x04\x05\x08\x02\x02\x12\x04\x86\ + \x03\x04\x0c\n\r\n\x05\x05\x08\x02\x02\x01\x12\x04\x86\x03\x04\x07\n\r\n\ + \x05\x05\x08\x02\x02\x02\x12\x04\x86\x03\n\x0b\n\x0c\n\x02\x04\x13\x12\ + \x06\x89\x03\0\x94\x03\x01\n\x0b\n\x03\x04\x13\x01\x12\x04\x89\x03\x08\ + \x19\n\x0c\n\x04\x04\x13\x02\0\x12\x04\x8a\x03\x04#\n\r\n\x05\x04\x13\ + \x02\0\x04\x12\x04\x8a\x03\x04\x0c\n\r\n\x05\x04\x13\x02\0\x05\x12\x04\ + \x8a\x03\r\x13\n\r\n\x05\x04\x13\x02\0\x01\x12\x04\x8a\x03\x14\x1e\n\r\n\ + \x05\x04\x13\x02\0\x03\x12\x04\x8a\x03!\"\n\x0c\n\x04\x04\x13\x02\x01\ + \x12\x04\x8b\x03\x04\"\n\r\n\x05\x04\x13\x02\x01\x04\x12\x04\x8b\x03\x04\ + \x0c\n\r\n\x05\x04\x13\x02\x01\x05\x12\x04\x8b\x03\r\x13\n\r\n\x05\x04\ + \x13\x02\x01\x01\x12\x04\x8b\x03\x14\x1d\n\r\n\x05\x04\x13\x02\x01\x03\ + \x12\x04\x8b\x03\x20!\n\x0c\n\x04\x04\x13\x02\x02\x12\x04\x8d\x03\x04#\n\ + \r\n\x05\x04\x13\x02\x02\x04\x12\x04\x8d\x03\x04\x0c\n\r\n\x05\x04\x13\ + \x02\x02\x05\x12\x04\x8d\x03\r\x13\n\r\n\x05\x04\x13\x02\x02\x01\x12\x04\ + \x8d\x03\x14\x1e\n\r\n\x05\x04\x13\x02\x02\x03\x12\x04\x8d\x03!\"\n\x0c\ + \n\x04\x04\x13\x02\x03\x12\x04\x8f\x03\x04-\n\r\n\x05\x04\x13\x02\x03\ + \x04\x12\x04\x8f\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x03\x06\x12\x04\x8f\ + \x03\r\x1e\n\r\n\x05\x04\x13\x02\x03\x01\x12\x04\x8f\x03\x1f(\n\r\n\x05\ + \x04\x13\x02\x03\x03\x12\x04\x8f\x03+,\n\x0c\n\x04\x04\x13\x02\x04\x12\ + \x04\x91\x03\x04\"\n\r\n\x05\x04\x13\x02\x04\x04\x12\x04\x91\x03\x04\x0c\ + \n\r\n\x05\x04\x13\x02\x04\x05\x12\x04\x91\x03\r\x13\n\r\n\x05\x04\x13\ + \x02\x04\x01\x12\x04\x91\x03\x14\x1c\n\r\n\x05\x04\x13\x02\x04\x03\x12\ + \x04\x91\x03\x1f!\n\x0c\n\x04\x04\x13\x02\x05\x12\x04\x92\x03\x04\"\n\r\ + \n\x05\x04\x13\x02\x05\x04\x12\x04\x92\x03\x04\x0c\n\r\n\x05\x04\x13\x02\ + \x05\x05\x12\x04\x92\x03\r\x13\n\r\n\x05\x04\x13\x02\x05\x01\x12\x04\x92\ + \x03\x14\x1c\n\r\n\x05\x04\x13\x02\x05\x03\x12\x04\x92\x03\x1f!\n\x0c\n\ + \x04\x04\x13\x02\x06\x12\x04\x93\x03\x04\x20\n\r\n\x05\x04\x13\x02\x06\ + \x04\x12\x04\x93\x03\x04\x0c\n\r\n\x05\x04\x13\x02\x06\x06\x12\x04\x93\ + \x03\r\x14\n\r\n\x05\x04\x13\x02\x06\x01\x12\x04\x93\x03\x15\x1a\n\r\n\ + \x05\x04\x13\x02\x06\x03\x12\x04\x93\x03\x1d\x1f\nT\n\x02\x04\x14\x12\ + \x06\x97\x03\0\xaf\x03\x01\x1aF\x20Adding\x20message\x20response\x20from\ + \x20Station\x20to\x20Client\x20for\x20bidirectional\x20API\n\n\x0b\n\x03\ + \x04\x14\x01\x12\x04\x97\x03\x08\x1c\n\x0c\n\x04\x04\x14\x02\0\x12\x04\ + \x98\x03\x02\x20\n\r\n\x05\x04\x14\x02\0\x04\x12\x04\x98\x03\x02\n\n\r\n\ + \x05\x04\x14\x02\0\x05\x12\x04\x98\x03\x0b\x12\n\r\n\x05\x04\x14\x02\0\ + \x01\x12\x04\x98\x03\x13\x1b\n\r\n\x05\x04\x14\x02\0\x03\x12\x04\x98\x03\ + \x1e\x1f\n?\n\x04\x04\x14\x02\x01\x12\x04\x9a\x03\x02\x1e\x1a1\x20The\ + \x20128-bit\x20ipv6\x20address,\x20in\x20network\x20byte\x20order\n\n\r\ + \n\x05\x04\x14\x02\x01\x04\x12\x04\x9a\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x01\x05\x12\x04\x9a\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x01\x01\x12\x04\ + \x9a\x03\x11\x19\n\r\n\x05\x04\x14\x02\x01\x03\x12\x04\x9a\x03\x1c\x1d\n\ + ,\n\x04\x04\x14\x02\x02\x12\x04\x9d\x03\x02\x1f\x1a\x1e\x20Respond\x20wi\ + th\x20randomized\x20port\n\n\r\n\x05\x04\x14\x02\x02\x04\x12\x04\x9d\x03\ + \x02\n\n\r\n\x05\x04\x14\x02\x02\x05\x12\x04\x9d\x03\x0b\x11\n\r\n\x05\ + \x04\x14\x02\x02\x01\x12\x04\x9d\x03\x12\x1a\n\r\n\x05\x04\x14\x02\x02\ + \x03\x12\x04\x9d\x03\x1d\x1e\nd\n\x04\x04\x14\x02\x03\x12\x04\xa1\x03\ + \x02\"\x1aV\x20Future:\x20station\x20provides\x20client\x20with\x20secre\ + t,\x20want\x20chanel\x20present\n\x20Leave\x20null\x20for\x20now\n\n\r\n\ + \x05\x04\x14\x02\x03\x04\x12\x04\xa1\x03\x02\n\n\r\n\x05\x04\x14\x02\x03\ + \x05\x12\x04\xa1\x03\x0b\x10\n\r\n\x05\x04\x14\x02\x03\x01\x12\x04\xa1\ + \x03\x11\x1d\n\r\n\x05\x04\x14\x02\x03\x03\x12\x04\xa1\x03\x20!\nA\n\x04\ + \x04\x14\x02\x04\x12\x04\xa4\x03\x02\x1c\x1a3\x20If\x20registration\x20w\ + rong,\x20populate\x20this\x20error\x20string\n\n\r\n\x05\x04\x14\x02\x04\ + \x04\x12\x04\xa4\x03\x02\n\n\r\n\x05\x04\x14\x02\x04\x05\x12\x04\xa4\x03\ + \x0b\x11\n\r\n\x05\x04\x14\x02\x04\x01\x12\x04\xa4\x03\x12\x17\n\r\n\x05\ + \x04\x14\x02\x04\x03\x12\x04\xa4\x03\x1a\x1b\n+\n\x04\x04\x14\x02\x05\ + \x12\x04\xa7\x03\x02%\x1a\x1d\x20ClientConf\x20field\x20(optional)\n\n\r\ + \n\x05\x04\x14\x02\x05\x04\x12\x04\xa7\x03\x02\n\n\r\n\x05\x04\x14\x02\ + \x05\x06\x12\x04\xa7\x03\x0b\x15\n\r\n\x05\x04\x14\x02\x05\x01\x12\x04\ + \xa7\x03\x16\x20\n\r\n\x05\x04\x14\x02\x05\x03\x12\x04\xa7\x03#$\nJ\n\ + \x04\x04\x14\x02\x06\x12\x04\xaa\x03\x025\x1a<\x20Transport\x20Params\ + \x20to\x20if\x20`allow_registrar_overrides`\x20is\x20set.\n\n\r\n\x05\ + \x04\x14\x02\x06\x04\x12\x04\xaa\x03\x02\n\n\r\n\x05\x04\x14\x02\x06\x06\ + \x12\x04\xaa\x03\x0b\x1e\n\r\n\x05\x04\x14\x02\x06\x01\x12\x04\xaa\x03\ + \x1f/\n\r\n\x05\x04\x14\x02\x06\x03\x12\x04\xaa\x0324\n\x9c\x01\n\x04\ + \x04\x14\x02\x07\x12\x04\xae\x03\x020\x1a\x8d\x01\x20PhantomsSupportPort\ + Rand\x20is\x20a\x20flag\x20that\x20indicates\x20whether\x20the\x20select\ + ed\x20phantoms\x20are\x20able\x20to\n\x20handle\x20phantom\x20connection\ + s\x20to\x20randomized\x20ports.\n\n\r\n\x05\x04\x14\x02\x07\x04\x12\x04\ + \xae\x03\x02\n\n\r\n\x05\x04\x14\x02\x07\x05\x12\x04\xae\x03\x0b\x0f\n\r\ + \n\x05\x04\x14\x02\x07\x01\x12\x04\xae\x03\x10*\n\r\n\x05\x04\x14\x02\ + \x07\x03\x12\x04\xae\x03-/\n!\n\x02\x04\x15\x12\x06\xb2\x03\0\xb6\x03\ + \x01\x1a\x13\x20response\x20from\x20dns\n\n\x0b\n\x03\x04\x15\x01\x12\ + \x04\xb2\x03\x08\x13\n\x0c\n\x04\x04\x15\x02\0\x12\x04\xb3\x03\x04\x1e\n\ + \r\n\x05\x04\x15\x02\0\x04\x12\x04\xb3\x03\x04\x0c\n\r\n\x05\x04\x15\x02\ + \0\x05\x12\x04\xb3\x03\r\x11\n\r\n\x05\x04\x15\x02\0\x01\x12\x04\xb3\x03\ + \x12\x19\n\r\n\x05\x04\x15\x02\0\x03\x12\x04\xb3\x03\x1c\x1d\n\x0c\n\x04\ + \x04\x15\x02\x01\x12\x04\xb4\x03\x04*\n\r\n\x05\x04\x15\x02\x01\x04\x12\ + \x04\xb4\x03\x04\x0c\n\r\n\x05\x04\x15\x02\x01\x05\x12\x04\xb4\x03\r\x11\ + \n\r\n\x05\x04\x15\x02\x01\x01\x12\x04\xb4\x03\x12%\n\r\n\x05\x04\x15\ + \x02\x01\x03\x12\x04\xb4\x03()\n\x0c\n\x04\x04\x15\x02\x02\x12\x04\xb5\ + \x03\x04=\n\r\n\x05\x04\x15\x02\x02\x04\x12\x04\xb5\x03\x04\x0c\n\r\n\ + \x05\x04\x15\x02\x02\x06\x12\x04\xb5\x03\r!\n\r\n\x05\x04\x15\x02\x02\ + \x01\x12\x04\xb5\x03\"8\n\r\n\x05\x04\x15\x02\x02\x03\x12\x04\xb5\x03;<\ +"; + +/// `FileDescriptorProto` object which was a source for this generated file +fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new(); + file_descriptor_proto_lazy.get(|| { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() + }) +} + +/// `FileDescriptor` object which allows dynamic access to files +pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { + static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new(); + static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new(); + file_descriptor.get(|| { + let generated_file_descriptor = generated_file_descriptor_lazy.get(|| { + let mut deps = ::std::vec::Vec::with_capacity(1); + deps.push(::protobuf::well_known_types::any::file_descriptor().clone()); + let mut messages = ::std::vec::Vec::with_capacity(22); + messages.push(PubKey::generated_message_descriptor_data()); + messages.push(TLSDecoySpec::generated_message_descriptor_data()); + messages.push(ClientConf::generated_message_descriptor_data()); + messages.push(DnsRegConf::generated_message_descriptor_data()); + messages.push(DecoyList::generated_message_descriptor_data()); + messages.push(PhantomSubnetsList::generated_message_descriptor_data()); + messages.push(PhantomSubnets::generated_message_descriptor_data()); + messages.push(WebRTCICECandidate::generated_message_descriptor_data()); + messages.push(WebRTCSDP::generated_message_descriptor_data()); + messages.push(WebRTCSignal::generated_message_descriptor_data()); + messages.push(Addr::generated_message_descriptor_data()); + messages.push(DTLSTransportParams::generated_message_descriptor_data()); + messages.push(StationToClient::generated_message_descriptor_data()); + messages.push(RegistrationFlags::generated_message_descriptor_data()); + messages.push(ClientToStation::generated_message_descriptor_data()); + messages.push(PrefixTransportParams::generated_message_descriptor_data()); + messages.push(GenericTransportParams::generated_message_descriptor_data()); + messages.push(C2SWrapper::generated_message_descriptor_data()); + messages.push(SessionStats::generated_message_descriptor_data()); + messages.push(StationToDetector::generated_message_descriptor_data()); + messages.push(RegistrationResponse::generated_message_descriptor_data()); + messages.push(DnsResponse::generated_message_descriptor_data()); + let mut enums = ::std::vec::Vec::with_capacity(9); + enums.push(KeyType::generated_enum_descriptor_data()); + enums.push(DnsRegMethod::generated_enum_descriptor_data()); + enums.push(C2S_Transition::generated_enum_descriptor_data()); + enums.push(S2C_Transition::generated_enum_descriptor_data()); + enums.push(ErrorReasonS2C::generated_enum_descriptor_data()); + enums.push(TransportType::generated_enum_descriptor_data()); + enums.push(RegistrationSource::generated_enum_descriptor_data()); + enums.push(StationOperations::generated_enum_descriptor_data()); + enums.push(IPProto::generated_enum_descriptor_data()); + ::protobuf::reflect::GeneratedFileDescriptor::new_generated( + file_descriptor_proto(), + deps, + messages, + enums, + ) + }); + ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor) + }) +} diff --git a/vendor/github.com/agl/ed25519/LICENSE b/vendor/github.com/refraction-networking/ed25519/LICENSE similarity index 100% rename from vendor/github.com/agl/ed25519/LICENSE rename to vendor/github.com/refraction-networking/ed25519/LICENSE diff --git a/vendor/github.com/agl/ed25519/edwards25519/const.go b/vendor/github.com/refraction-networking/ed25519/edwards25519/const.go similarity index 100% rename from vendor/github.com/agl/ed25519/edwards25519/const.go rename to vendor/github.com/refraction-networking/ed25519/edwards25519/const.go diff --git a/vendor/github.com/agl/ed25519/edwards25519/edwards25519.go b/vendor/github.com/refraction-networking/ed25519/edwards25519/edwards25519.go similarity index 96% rename from vendor/github.com/agl/ed25519/edwards25519/edwards25519.go rename to vendor/github.com/refraction-networking/ed25519/edwards25519/edwards25519.go index 907981855..4cb049d3e 100644 --- a/vendor/github.com/agl/ed25519/edwards25519/edwards25519.go +++ b/vendor/github.com/refraction-networking/ed25519/edwards25519/edwards25519.go @@ -109,27 +109,29 @@ func FeFromBytes(dst *FieldElement, src *[32]byte) { // FeToBytes marshals h to s. // Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +// +// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. // // Write p=2^255-19; q=floor(h/p). // Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). // // Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. // -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 5) @@ -1449,11 +1466,15 @@ func ScMulAdd(s, a, b, c *[32]byte) { } // Input: -// s[0]+256*s[1]+...+256^63*s[63] = s +// +// s[0]+256*s[1]+...+256^63*s[63] = s // // Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. +// +// s[0]+256*s[1]+...+256^31*s[31] = s mod l +// where l = 2^252 + 27742317777372353535851937790883648493. +// +//nolint:ineffassign func ScReduce(out *[32]byte, s *[64]byte) { s0 := 2097151 & load3(s[:]) s1 := 2097151 & (load4(s[2:]) >> 5) diff --git a/vendor/github.com/refraction-networking/gotapdance/ed25519/extra25519/extra25519.go b/vendor/github.com/refraction-networking/ed25519/extra25519/extra25519.go similarity index 99% rename from vendor/github.com/refraction-networking/gotapdance/ed25519/extra25519/extra25519.go rename to vendor/github.com/refraction-networking/ed25519/extra25519/extra25519.go index af8c1ff59..1b8f7c193 100644 --- a/vendor/github.com/refraction-networking/gotapdance/ed25519/extra25519/extra25519.go +++ b/vendor/github.com/refraction-networking/ed25519/extra25519/extra25519.go @@ -7,7 +7,7 @@ package extra25519 import ( "crypto/sha512" - "github.com/refraction-networking/gotapdance/ed25519/edwards25519" + "github.com/refraction-networking/ed25519/edwards25519" ) // PrivateKeyToCurve25519 converts an ed25519 private key into a corresponding diff --git a/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/const.go b/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/const.go deleted file mode 100644 index ea5b77a71..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/const.go +++ /dev/null @@ -1,1411 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package edwards25519 - -var d = FieldElement{ - -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, -} - -var d2 = FieldElement{ - -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199, -} - -var SqrtM1 = FieldElement{ - -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482, -} - -var A = FieldElement{ - 486662, 0, 0, 0, 0, 0, 0, 0, 0, 0, -} - -var bi = [8]PreComputedGroupElement{ - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877}, - FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951}, - FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784}, - }, - { - FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436}, - FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918}, - FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877}, - }, - { - FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800}, - FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305}, - FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300}, - }, - { - FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876}, - FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619}, - FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683}, - }, -} - -var base = [32][8]PreComputedGroupElement{ - { - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303}, - FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081}, - FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540}, - FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397}, - FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777}, - FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737}, - FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726}, - FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955}, - FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425}, - }, - }, - { - { - FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171}, - FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510}, - FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660}, - }, - { - FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639}, - FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963}, - FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950}, - }, - { - FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568}, - FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335}, - FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628}, - }, - { - FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007}, - FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772}, - FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653}, - }, - { - FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567}, - FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686}, - FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372}, - }, - { - FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887}, - FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954}, - FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953}, - }, - { - FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833}, - FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532}, - FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876}, - }, - { - FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268}, - FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214}, - FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038}, - }, - }, - { - { - FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800}, - FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645}, - FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664}, - }, - { - FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933}, - FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182}, - FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222}, - }, - { - FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991}, - FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880}, - FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092}, - }, - { - FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295}, - FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788}, - FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553}, - }, - { - FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026}, - FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347}, - FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033}, - }, - { - FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395}, - FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278}, - FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890}, - }, - { - FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995}, - FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596}, - FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891}, - }, - { - FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060}, - FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608}, - FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606}, - }, - }, - { - { - FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389}, - FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016}, - FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341}, - }, - { - FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505}, - FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553}, - FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655}, - }, - { - FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220}, - FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631}, - FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099}, - }, - { - FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556}, - FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749}, - FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930}, - }, - { - FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391}, - FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253}, - FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066}, - }, - { - FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958}, - FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082}, - FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383}, - }, - { - FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521}, - FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807}, - FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948}, - }, - { - FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134}, - FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455}, - FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629}, - }, - }, - { - { - FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069}, - FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746}, - FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919}, - }, - { - FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837}, - FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906}, - FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771}, - }, - { - FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817}, - FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098}, - FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409}, - }, - { - FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504}, - FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727}, - FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420}, - }, - { - FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003}, - FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605}, - FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384}, - }, - { - FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701}, - FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683}, - FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708}, - }, - { - FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563}, - FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260}, - FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387}, - }, - { - FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672}, - FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686}, - FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665}, - }, - }, - { - { - FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182}, - FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277}, - FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628}, - }, - { - FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474}, - FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539}, - FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822}, - }, - { - FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970}, - FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756}, - FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508}, - }, - { - FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683}, - FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655}, - FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158}, - }, - { - FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125}, - FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839}, - FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664}, - }, - { - FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294}, - FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899}, - FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070}, - }, - { - FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294}, - FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949}, - FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083}, - }, - { - FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420}, - FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940}, - FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396}, - }, - }, - { - { - FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567}, - FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127}, - FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294}, - }, - { - FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887}, - FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964}, - FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195}, - }, - { - FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244}, - FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999}, - FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762}, - }, - { - FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274}, - FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236}, - FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605}, - }, - { - FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761}, - FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884}, - FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482}, - }, - { - FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638}, - FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490}, - FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170}, - }, - { - FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736}, - FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124}, - FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392}, - }, - { - FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029}, - FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048}, - FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958}, - }, - }, - { - { - FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593}, - FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071}, - FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692}, - }, - { - FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687}, - FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441}, - FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001}, - }, - { - FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460}, - FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007}, - FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762}, - }, - { - FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005}, - FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674}, - FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035}, - }, - { - FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590}, - FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957}, - FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812}, - }, - { - FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740}, - FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122}, - FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158}, - }, - { - FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885}, - FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140}, - FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857}, - }, - { - FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155}, - FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260}, - FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483}, - }, - }, - { - { - FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677}, - FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815}, - FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751}, - }, - { - FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203}, - FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208}, - FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230}, - }, - { - FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850}, - FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389}, - FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968}, - }, - { - FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689}, - FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880}, - FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304}, - }, - { - FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632}, - FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412}, - FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566}, - }, - { - FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038}, - FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232}, - FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943}, - }, - { - FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856}, - FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738}, - FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971}, - }, - { - FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718}, - FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697}, - FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883}, - }, - }, - { - { - FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912}, - FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358}, - FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849}, - }, - { - FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307}, - FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977}, - FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335}, - }, - { - FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644}, - FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616}, - FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735}, - }, - { - FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099}, - FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341}, - FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336}, - }, - { - FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646}, - FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425}, - FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388}, - }, - { - FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743}, - FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822}, - FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462}, - }, - { - FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985}, - FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702}, - FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797}, - }, - { - FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293}, - FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100}, - FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688}, - }, - }, - { - { - FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186}, - FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610}, - FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707}, - }, - { - FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220}, - FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025}, - FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044}, - }, - { - FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992}, - FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027}, - FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197}, - }, - { - FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901}, - FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952}, - FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878}, - }, - { - FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390}, - FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730}, - FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730}, - }, - { - FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180}, - FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272}, - FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715}, - }, - { - FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970}, - FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772}, - FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865}, - }, - { - FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750}, - FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373}, - FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348}, - }, - }, - { - { - FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144}, - FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195}, - FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086}, - }, - { - FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684}, - FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518}, - FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233}, - }, - { - FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793}, - FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794}, - FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435}, - }, - { - FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921}, - FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518}, - FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563}, - }, - { - FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278}, - FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024}, - FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030}, - }, - { - FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783}, - FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717}, - FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844}, - }, - { - FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333}, - FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048}, - FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760}, - }, - { - FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760}, - FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757}, - FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112}, - }, - }, - { - { - FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468}, - FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184}, - FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289}, - }, - { - FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066}, - FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882}, - FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226}, - }, - { - FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101}, - FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279}, - FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811}, - }, - { - FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709}, - FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714}, - FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121}, - }, - { - FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464}, - FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847}, - FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400}, - }, - { - FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414}, - FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158}, - FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045}, - }, - { - FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415}, - FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459}, - FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079}, - }, - { - FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412}, - FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743}, - FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836}, - }, - }, - { - { - FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022}, - FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429}, - FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065}, - }, - { - FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861}, - FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000}, - FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101}, - }, - { - FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815}, - FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642}, - FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966}, - }, - { - FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574}, - FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742}, - FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689}, - }, - { - FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020}, - FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772}, - FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982}, - }, - { - FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953}, - FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218}, - FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265}, - }, - { - FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073}, - FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325}, - FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798}, - }, - { - FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870}, - FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863}, - FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927}, - }, - }, - { - { - FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267}, - FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663}, - FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862}, - }, - { - FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673}, - FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943}, - FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020}, - }, - { - FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238}, - FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064}, - FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795}, - }, - { - FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052}, - FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904}, - FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531}, - }, - { - FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979}, - FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841}, - FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431}, - }, - { - FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324}, - FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940}, - FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320}, - }, - { - FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184}, - FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114}, - FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878}, - }, - { - FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784}, - FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091}, - FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585}, - }, - }, - { - { - FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208}, - FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864}, - FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661}, - }, - { - FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233}, - FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212}, - FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525}, - }, - { - FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068}, - FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397}, - FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988}, - }, - { - FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889}, - FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038}, - FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697}, - }, - { - FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875}, - FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905}, - FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656}, - }, - { - FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818}, - FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714}, - FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203}, - }, - { - FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931}, - FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024}, - FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084}, - }, - { - FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204}, - FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817}, - FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667}, - }, - }, - { - { - FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504}, - FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768}, - FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255}, - }, - { - FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790}, - FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438}, - FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333}, - }, - { - FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971}, - FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905}, - FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409}, - }, - { - FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409}, - FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499}, - FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363}, - }, - { - FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664}, - FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324}, - FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940}, - }, - { - FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990}, - FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914}, - FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290}, - }, - { - FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257}, - FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433}, - FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236}, - }, - { - FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045}, - FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093}, - FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347}, - }, - }, - { - { - FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191}, - FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507}, - FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906}, - }, - { - FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018}, - FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109}, - FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926}, - }, - { - FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528}, - FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625}, - FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286}, - }, - { - FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033}, - FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866}, - FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896}, - }, - { - FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075}, - FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347}, - FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437}, - }, - { - FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165}, - FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588}, - FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193}, - }, - { - FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017}, - FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883}, - FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961}, - }, - { - FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043}, - FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663}, - FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362}, - }, - }, - { - { - FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860}, - FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466}, - FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063}, - }, - { - FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997}, - FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295}, - FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369}, - }, - { - FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385}, - FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109}, - FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906}, - }, - { - FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424}, - FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185}, - FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962}, - }, - { - FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325}, - FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593}, - FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404}, - }, - { - FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644}, - FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801}, - FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804}, - }, - { - FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884}, - FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577}, - FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849}, - }, - { - FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473}, - FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644}, - FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319}, - }, - }, - { - { - FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599}, - FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768}, - FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084}, - }, - { - FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328}, - FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369}, - FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920}, - }, - { - FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815}, - FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025}, - FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397}, - }, - { - FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448}, - FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981}, - FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165}, - }, - { - FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501}, - FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073}, - FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861}, - }, - { - FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845}, - FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211}, - FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870}, - }, - { - FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096}, - FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803}, - FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168}, - }, - { - FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965}, - FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505}, - FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598}, - }, - }, - { - { - FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782}, - FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900}, - FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479}, - }, - { - FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208}, - FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232}, - FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719}, - }, - { - FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271}, - FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326}, - FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132}, - }, - { - FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300}, - FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570}, - FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670}, - }, - { - FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994}, - FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913}, - FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317}, - }, - { - FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730}, - FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096}, - FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078}, - }, - { - FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411}, - FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905}, - FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654}, - }, - { - FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870}, - FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498}, - FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579}, - }, - }, - { - { - FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677}, - FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647}, - FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743}, - }, - { - FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468}, - FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375}, - FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155}, - }, - { - FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725}, - FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612}, - FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943}, - }, - { - FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944}, - FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928}, - FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406}, - }, - { - FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139}, - FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963}, - FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693}, - }, - { - FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734}, - FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680}, - FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410}, - }, - { - FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931}, - FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654}, - FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710}, - }, - { - FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180}, - FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684}, - FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895}, - }, - }, - { - { - FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501}, - FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413}, - FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880}, - }, - { - FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874}, - FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962}, - FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899}, - }, - { - FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152}, - FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063}, - FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080}, - }, - { - FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146}, - FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183}, - FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133}, - }, - { - FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421}, - FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622}, - FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197}, - }, - { - FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663}, - FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753}, - FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755}, - }, - { - FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862}, - FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118}, - FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171}, - }, - { - FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380}, - FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824}, - FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270}, - }, - }, - { - { - FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438}, - FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584}, - FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562}, - }, - { - FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471}, - FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610}, - FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269}, - }, - { - FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650}, - FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369}, - FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461}, - }, - { - FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462}, - FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793}, - FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218}, - }, - { - FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226}, - FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019}, - FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037}, - }, - { - FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171}, - FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132}, - FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841}, - }, - { - FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181}, - FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210}, - FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040}, - }, - { - FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935}, - FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105}, - FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814}, - }, - }, - { - { - FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852}, - FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581}, - FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646}, - }, - { - FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844}, - FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025}, - FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453}, - }, - { - FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068}, - FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192}, - FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921}, - }, - { - FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259}, - FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426}, - FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072}, - }, - { - FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305}, - FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832}, - FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943}, - }, - { - FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011}, - FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447}, - FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494}, - }, - { - FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245}, - FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859}, - FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915}, - }, - { - FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707}, - FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848}, - FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224}, - }, - }, - { - { - FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391}, - FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215}, - FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101}, - }, - { - FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713}, - FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849}, - FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930}, - }, - { - FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940}, - FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031}, - FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404}, - }, - { - FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243}, - FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116}, - FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525}, - }, - { - FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509}, - FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883}, - FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865}, - }, - { - FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660}, - FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273}, - FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138}, - }, - { - FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560}, - FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135}, - FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941}, - }, - { - FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739}, - FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756}, - FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819}, - }, - }, - { - { - FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347}, - FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028}, - FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075}, - }, - { - FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799}, - FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609}, - FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817}, - }, - { - FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989}, - FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523}, - FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278}, - }, - { - FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045}, - FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377}, - FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480}, - }, - { - FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016}, - FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426}, - FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525}, - }, - { - FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396}, - FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080}, - FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892}, - }, - { - FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275}, - FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074}, - FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140}, - }, - { - FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717}, - FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101}, - FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127}, - }, - }, - { - { - FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632}, - FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415}, - FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160}, - }, - { - FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876}, - FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625}, - FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478}, - }, - { - FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164}, - FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595}, - FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248}, - }, - { - FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858}, - FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193}, - FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184}, - }, - { - FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942}, - FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635}, - FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948}, - }, - { - FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935}, - FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415}, - FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416}, - }, - { - FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018}, - FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778}, - FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659}, - }, - { - FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385}, - FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503}, - FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329}, - }, - }, - { - { - FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056}, - FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838}, - FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948}, - }, - { - FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691}, - FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118}, - FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517}, - }, - { - FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269}, - FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904}, - FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589}, - }, - { - FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193}, - FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910}, - FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930}, - }, - { - FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667}, - FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481}, - FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876}, - }, - { - FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640}, - FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278}, - FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112}, - }, - { - FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272}, - FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012}, - FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221}, - }, - { - FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046}, - FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345}, - FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310}, - }, - }, - { - { - FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937}, - FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636}, - FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008}, - }, - { - FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429}, - FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576}, - FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066}, - }, - { - FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490}, - FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104}, - FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053}, - }, - { - FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275}, - FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511}, - FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095}, - }, - { - FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439}, - FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939}, - FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424}, - }, - { - FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310}, - FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608}, - FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079}, - }, - { - FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101}, - FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418}, - FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576}, - }, - { - FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356}, - FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996}, - FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099}, - }, - }, - { - { - FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728}, - FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658}, - FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242}, - }, - { - FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001}, - FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766}, - FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373}, - }, - { - FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458}, - FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628}, - FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657}, - }, - { - FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062}, - FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616}, - FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014}, - }, - { - FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383}, - FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814}, - FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718}, - }, - { - FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417}, - FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222}, - FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444}, - }, - { - FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597}, - FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970}, - FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799}, - }, - { - FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647}, - FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511}, - FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032}, - }, - }, - { - { - FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834}, - FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461}, - FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062}, - }, - { - FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516}, - FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547}, - FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240}, - }, - { - FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038}, - FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741}, - FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103}, - }, - { - FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747}, - FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323}, - FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016}, - }, - { - FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373}, - FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228}, - FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141}, - }, - { - FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399}, - FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831}, - FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376}, - }, - { - FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313}, - FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958}, - FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577}, - }, - { - FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743}, - FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684}, - FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476}, - }, - }, -} diff --git a/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/edwards25519.go b/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/edwards25519.go deleted file mode 100644 index 907981855..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/ed25519/edwards25519/edwards25519.go +++ /dev/null @@ -1,1773 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package edwards25519 implements operations in GF(2**255-19) and on an -// Edwards curve that is isomorphic to curve25519. See -// http://ed25519.cr.yp.to/. -package edwards25519 - -// This code is a port of the public domain, "ref10" implementation of ed25519 -// from SUPERCOP. - -// FieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type FieldElement [10]int32 - -var zero FieldElement - -func FeZero(fe *FieldElement) { - copy(fe[:], zero[:]) -} - -func FeOne(fe *FieldElement) { - FeZero(fe) - fe[0] = 1 -} - -func FeAdd(dst, a, b *FieldElement) { - dst[0] = a[0] + b[0] - dst[1] = a[1] + b[1] - dst[2] = a[2] + b[2] - dst[3] = a[3] + b[3] - dst[4] = a[4] + b[4] - dst[5] = a[5] + b[5] - dst[6] = a[6] + b[6] - dst[7] = a[7] + b[7] - dst[8] = a[8] + b[8] - dst[9] = a[9] + b[9] -} - -func FeSub(dst, a, b *FieldElement) { - dst[0] = a[0] - b[0] - dst[1] = a[1] - b[1] - dst[2] = a[2] - b[2] - dst[3] = a[3] - b[3] - dst[4] = a[4] - b[4] - dst[5] = a[5] - b[5] - dst[6] = a[6] - b[6] - dst[7] = a[7] - b[7] - dst[8] = a[8] - b[8] - dst[9] = a[9] - b[9] -} - -func FeCopy(dst, src *FieldElement) { - copy(dst[:], src[:]) -} - -// Replace (f,g) with (g,g) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func FeCMove(f, g *FieldElement, b int32) { - b = -b - f[0] ^= b & (f[0] ^ g[0]) - f[1] ^= b & (f[1] ^ g[1]) - f[2] ^= b & (f[2] ^ g[2]) - f[3] ^= b & (f[3] ^ g[3]) - f[4] ^= b & (f[4] ^ g[4]) - f[5] ^= b & (f[5] ^ g[5]) - f[6] ^= b & (f[6] ^ g[6]) - f[7] ^= b & (f[7] ^ g[7]) - f[8] ^= b & (f[8] ^ g[8]) - f[9] ^= b & (f[9] ^ g[9]) -} - -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -func load4(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - r |= int64(in[3]) << 24 - return r -} - -func FeFromBytes(dst *FieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := (load3(src[29:]) & 8388607) << 2 - - FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -func FeIsNegative(f *FieldElement) byte { - var s [32]byte - FeToBytes(&s, f) - return s[0] & 1 -} - -func FeIsNonZero(f *FieldElement) int32 { - var s [32]byte - FeToBytes(&s, f) - var x uint8 - for _, b := range s { - x |= b - } - x |= x >> 4 - x |= x >> 2 - x |= x >> 1 - return int32(x & 1) -} - -// FeNeg sets h = -f -// -// Preconditions: -// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeNeg(h, f *FieldElement) { - h[0] = -f[0] - h[1] = -f[1] - h[2] = -f[2] - h[3] = -f[3] - h[4] = -f[4] - h[5] = -f[5] - h[6] = -f[6] - h[7] = -f[7] - h[8] = -f[8] - h[9] = -f[9] -} - -func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64 - - /* - |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.51*2^58 */ - /* |h5| <= 1.51*2^58 */ - - c1 = (h1 + (1 << 24)) >> 25 - h2 += c1 - h1 -= c1 << 25 - c5 = (h5 + (1 << 24)) >> 25 - h6 += c5 - h5 -= c5 << 25 - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.21*2^59 */ - /* |h6| <= 1.21*2^59 */ - - c2 = (h2 + (1 << 25)) >> 26 - h3 += c2 - h2 -= c2 << 26 - c6 = (h6 + (1 << 25)) >> 26 - h7 += c6 - h6 -= c6 << 26 - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.51*2^58 */ - /* |h7| <= 1.51*2^58 */ - - c3 = (h3 + (1 << 24)) >> 25 - h4 += c3 - h3 -= c3 << 25 - c7 = (h7 + (1 << 24)) >> 25 - h8 += c7 - h7 -= c7 << 25 - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.52*2^33 */ - /* |h8| <= 1.52*2^33 */ - - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - c8 = (h8 + (1 << 25)) >> 26 - h9 += c8 - h8 -= c8 << 26 - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.51*2^58 */ - - c9 = (h9 + (1 << 24)) >> 25 - h0 += c9 * 19 - h9 -= c9 << 25 - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.8*2^37 */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// FeMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs can squeeze carries into int32. -func FeMul(h, f, g *FieldElement) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - - f1_2 := int64(2 * f[1]) - f3_2 := int64(2 * f[3]) - f5_2 := int64(2 * f[5]) - f7_2 := int64(2 * f[7]) - f9_2 := int64(2 * f[9]) - - g0 := int64(g[0]) - g1 := int64(g[1]) - g2 := int64(g[2]) - g3 := int64(g[3]) - g4 := int64(g[4]) - g5 := int64(g[5]) - g6 := int64(g[6]) - g7 := int64(g[7]) - g8 := int64(g[8]) - g9 := int64(g[9]) - - g1_19 := int64(19 * g[1]) /* 1.4*2^29 */ - g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */ - g3_19 := int64(19 * g[3]) - g4_19 := int64(19 * g[4]) - g5_19 := int64(19 * g[5]) - g6_19 := int64(19 * g[6]) - g7_19 := int64(19 * g[7]) - g8_19 := int64(19 * g[8]) - g9_19 := int64(19 * g[9]) - - h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19 - h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19 - h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19 - h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19 - h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19 - h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19 - h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19 - h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19 - h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19 - h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - f0_2 := int64(2 * f[0]) - f1_2 := int64(2 * f[1]) - f2_2 := int64(2 * f[2]) - f3_2 := int64(2 * f[3]) - f4_2 := int64(2 * f[4]) - f5_2 := int64(2 * f[5]) - f6_2 := int64(2 * f[6]) - f7_2 := int64(2 * f[7]) - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - - h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38 - h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19 - h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19 - h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38 - h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38 - h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19 - h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19 - h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38 - h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38 - h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5 - - return -} - -// FeSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeSquare(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeSquare2 sets h = 2 * f * f -// -// Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -// See fe_mul.c for discussion of implementation strategy. -func FeSquare2(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - - h0 += h0 - h1 += h1 - h2 += h2 - h3 += h3 - h4 += h4 - h5 += h5 - h6 += h6 - h7 += h7 - h8 += h8 - h9 += h9 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func FeInvert(out, z *FieldElement) { - var t0, t1, t2, t3 FieldElement - var i int - - FeSquare(&t0, z) // 2^1 - FeSquare(&t1, &t0) // 2^2 - for i = 1; i < 2; i++ { // 2^3 - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) // 2^3 + 2^0 - FeMul(&t0, &t0, &t1) // 2^3 + 2^1 + 2^0 - FeSquare(&t2, &t0) // 2^4 + 2^2 + 2^1 - FeMul(&t1, &t1, &t2) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 - FeSquare(&t2, &t1) // 5,4,3,2,1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 19..0 - FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 39..0 - FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 49..0 - FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 99..0 - FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 199..0 - FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 249..0 - FeSquare(&t1, &t1) // 250..1 - for i = 1; i < 5; i++ { // 254..5 - FeSquare(&t1, &t1) - } - FeMul(out, &t1, &t0) // 254..5,3,1,0 -} - -func fePow22523(out, z *FieldElement) { - var t0, t1, t2 FieldElement - var i int - - FeSquare(&t0, z) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeSquare(&t1, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) - FeMul(&t0, &t0, &t1) - FeSquare(&t0, &t0) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 5; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 20; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 100; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t0, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t0, &t0) - } - FeMul(out, &t0, z) -} - -// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 * -// y^2 where d = -121665/121666. -// -// Several representations are used: -// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// PreComputedGroupElement: (y+x,y-x,2dxy) - -type ProjectiveGroupElement struct { - X, Y, Z FieldElement -} - -type ExtendedGroupElement struct { - X, Y, Z, T FieldElement -} - -type CompletedGroupElement struct { - X, Y, Z, T FieldElement -} - -type PreComputedGroupElement struct { - yPlusX, yMinusX, xy2d FieldElement -} - -type CachedGroupElement struct { - yPlusX, yMinusX, Z, T2d FieldElement -} - -func (p *ProjectiveGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) -} - -func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) { - var t0 FieldElement - - FeSquare(&r.X, &p.X) - FeSquare(&r.Z, &p.Y) - FeSquare2(&r.T, &p.Z) - FeAdd(&r.Y, &p.X, &p.Y) - FeSquare(&t0, &r.Y) - FeAdd(&r.Y, &r.Z, &r.X) - FeSub(&r.Z, &r.Z, &r.X) - FeSub(&r.X, &t0, &r.Y) - FeSub(&r.T, &r.T, &r.Z) -} - -func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) - FeZero(&p.T) -} - -func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) { - var q ProjectiveGroupElement - p.ToProjective(&q) - q.Double(r) -} - -func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) { - FeAdd(&r.yPlusX, &p.Y, &p.X) - FeSub(&r.yMinusX, &p.Y, &p.X) - FeCopy(&r.Z, &p.Z) - FeMul(&r.T2d, &p.T, &d2) -} - -func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeCopy(&r.X, &p.X) - FeCopy(&r.Y, &p.Y) - FeCopy(&r.Z, &p.Z) -} - -func (p *ExtendedGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool { - var u, v, v3, vxx, check FieldElement - - FeFromBytes(&p.Y, s) - FeOne(&p.Z) - FeSquare(&u, &p.Y) - FeMul(&v, &u, &d) - FeSub(&u, &u, &p.Z) // y = y^2-1 - FeAdd(&v, &v, &p.Z) // v = dy^2+1 - - FeSquare(&v3, &v) - FeMul(&v3, &v3, &v) // v3 = v^3 - FeSquare(&p.X, &v3) - FeMul(&p.X, &p.X, &v) - FeMul(&p.X, &p.X, &u) // x = uv^7 - - fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8) - FeMul(&p.X, &p.X, &v3) - FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8) - - var tmpX, tmp2 [32]byte - - FeSquare(&vxx, &p.X) - FeMul(&vxx, &vxx, &v) - FeSub(&check, &vxx, &u) // vx^2-u - if FeIsNonZero(&check) == 1 { - FeAdd(&check, &vxx, &u) // vx^2+u - if FeIsNonZero(&check) == 1 { - return false - } - FeMul(&p.X, &p.X, &SqrtM1) - - FeToBytes(&tmpX, &p.X) - for i, v := range tmpX { - tmp2[31-i] = v - } - } - - if FeIsNegative(&p.X) != (s[31] >> 7) { - FeNeg(&p.X, &p.X) - } - - FeMul(&p.T, &p.X, &p.Y) - return true -} - -func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) -} - -func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) - FeMul(&r.T, &p.X, &p.Y) -} - -func (p *PreComputedGroupElement) Zero() { - FeOne(&p.yPlusX) - FeOne(&p.yMinusX) - FeZero(&p.xy2d) -} - -func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func slide(r *[256]int8, a *[32]byte) { - for i := range r { - r[i] = int8(1 & (a[i>>3] >> uint(i&7))) - } - - for i := range r { - if r[i] != 0 { - for b := 1; b <= 6 && i+b < 256; b++ { - if r[i+b] != 0 { - if r[i]+(r[i+b]<= -15 { - r[i] -= r[i+b] << uint(b) - for k := i + b; k < 256; k++ { - if r[k] == 0 { - r[k] = 1 - break - } - r[k] = 0 - } - } else { - break - } - } - } - } - } -} - -// GeDoubleScalarMultVartime sets r = a*A + b*B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) { - var aSlide, bSlide [256]int8 - var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A - var t CompletedGroupElement - var u, A2 ExtendedGroupElement - var i int - - slide(&aSlide, a) - slide(&bSlide, b) - - A.ToCached(&Ai[0]) - A.Double(&t) - t.ToExtended(&A2) - - for i := 0; i < 7; i++ { - geAdd(&t, &A2, &Ai[i]) - t.ToExtended(&u) - u.ToCached(&Ai[i+1]) - } - - r.Zero() - - for i = 255; i >= 0; i-- { - if aSlide[i] != 0 || bSlide[i] != 0 { - break - } - } - - for ; i >= 0; i-- { - r.Double(&t) - - if aSlide[i] > 0 { - t.ToExtended(&u) - geAdd(&t, &u, &Ai[aSlide[i]/2]) - } else if aSlide[i] < 0 { - t.ToExtended(&u) - geSub(&t, &u, &Ai[(-aSlide[i])/2]) - } - - if bSlide[i] > 0 { - t.ToExtended(&u) - geMixedAdd(&t, &u, &bi[bSlide[i]/2]) - } else if bSlide[i] < 0 { - t.ToExtended(&u) - geMixedSub(&t, &u, &bi[(-bSlide[i])/2]) - } - - t.ToProjective(r) - } -} - -// equal returns 1 if b == c and 0 otherwise. -func equal(b, c int32) int32 { - x := uint32(b ^ c) - x-- - return int32(x >> 31) -} - -// negative returns 1 if b < 0 and 0 otherwise. -func negative(b int32) int32 { - return (b >> 31) & 1 -} - -func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) { - FeCMove(&t.yPlusX, &u.yPlusX, b) - FeCMove(&t.yMinusX, &u.yMinusX, b) - FeCMove(&t.xy2d, &u.xy2d, b) -} - -func selectPoint(t *PreComputedGroupElement, pos int32, b int32) { - var minusT PreComputedGroupElement - bNegative := negative(b) - bAbs := b - (((-bNegative) & b) << 1) - - t.Zero() - for i := int32(0); i < 8; i++ { - PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1)) - } - FeCopy(&minusT.yPlusX, &t.yMinusX) - FeCopy(&minusT.yMinusX, &t.yPlusX) - FeNeg(&minusT.xy2d, &t.xy2d) - PreComputedGroupElementCMove(t, &minusT, bNegative) -} - -// GeScalarMultBase computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. -// -// Preconditions: -// a[31] <= 127 -func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) { - var e [64]int8 - - for i, v := range a { - e[2*i] = int8(v & 15) - e[2*i+1] = int8((v >> 4) & 15) - } - - // each e[i] is between 0 and 15 and e[63] is between 0 and 7. - - carry := int8(0) - for i := 0; i < 63; i++ { - e[i] += carry - carry = (e[i] + 8) >> 4 - e[i] -= carry << 4 - } - e[63] += carry - // each e[i] is between -8 and 8. - - h.Zero() - var t PreComputedGroupElement - var r CompletedGroupElement - for i := int32(1); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } - - var s ProjectiveGroupElement - - h.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToExtended(h) - - for i := int32(0); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } -} - -// The scalars are GF(2^252 + 27742317777372353535851937790883648493). - -// Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScMulAdd(s, a, b, c *[32]byte) { - a0 := 2097151 & load3(a[:]) - a1 := 2097151 & (load4(a[2:]) >> 5) - a2 := 2097151 & (load3(a[5:]) >> 2) - a3 := 2097151 & (load4(a[7:]) >> 7) - a4 := 2097151 & (load4(a[10:]) >> 4) - a5 := 2097151 & (load3(a[13:]) >> 1) - a6 := 2097151 & (load4(a[15:]) >> 6) - a7 := 2097151 & (load3(a[18:]) >> 3) - a8 := 2097151 & load3(a[21:]) - a9 := 2097151 & (load4(a[23:]) >> 5) - a10 := 2097151 & (load3(a[26:]) >> 2) - a11 := (load4(a[28:]) >> 7) - b0 := 2097151 & load3(b[:]) - b1 := 2097151 & (load4(b[2:]) >> 5) - b2 := 2097151 & (load3(b[5:]) >> 2) - b3 := 2097151 & (load4(b[7:]) >> 7) - b4 := 2097151 & (load4(b[10:]) >> 4) - b5 := 2097151 & (load3(b[13:]) >> 1) - b6 := 2097151 & (load4(b[15:]) >> 6) - b7 := 2097151 & (load3(b[18:]) >> 3) - b8 := 2097151 & load3(b[21:]) - b9 := 2097151 & (load4(b[23:]) >> 5) - b10 := 2097151 & (load3(b[26:]) >> 2) - b11 := (load4(b[28:]) >> 7) - c0 := 2097151 & load3(c[:]) - c1 := 2097151 & (load4(c[2:]) >> 5) - c2 := 2097151 & (load3(c[5:]) >> 2) - c3 := 2097151 & (load4(c[7:]) >> 7) - c4 := 2097151 & (load4(c[10:]) >> 4) - c5 := 2097151 & (load3(c[13:]) >> 1) - c6 := 2097151 & (load4(c[15:]) >> 6) - c7 := 2097151 & (load3(c[18:]) >> 3) - c8 := 2097151 & load3(c[21:]) - c9 := 2097151 & (load4(c[23:]) >> 5) - c10 := 2097151 & (load3(c[26:]) >> 2) - c11 := (load4(c[28:]) >> 7) - var carry [23]int64 - - s0 := c0 + a0*b0 - s1 := c1 + a0*b1 + a1*b0 - s2 := c2 + a0*b2 + a1*b1 + a2*b0 - s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0 - s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0 - s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0 - s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0 - s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0 - s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0 - s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0 - s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0 - s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0 - s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1 - s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2 - s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3 - s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4 - s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5 - s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6 - s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7 - s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8 - s20 := a9*b11 + a10*b10 + a11*b9 - s21 := a10*b11 + a11*b10 - s22 := a11 * b11 - s23 := int64(0) - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - carry[18] = (s18 + (1 << 20)) >> 21 - s19 += carry[18] - s18 -= carry[18] << 21 - carry[20] = (s20 + (1 << 20)) >> 21 - s21 += carry[20] - s20 -= carry[20] << 21 - carry[22] = (s22 + (1 << 20)) >> 21 - s23 += carry[22] - s22 -= carry[22] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - carry[17] = (s17 + (1 << 20)) >> 21 - s18 += carry[17] - s17 -= carry[17] << 21 - carry[19] = (s19 + (1 << 20)) >> 21 - s20 += carry[19] - s19 -= carry[19] << 21 - carry[21] = (s21 + (1 << 20)) >> 21 - s22 += carry[21] - s21 -= carry[21] << 21 - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - s[0] = byte(s0 >> 0) - s[1] = byte(s0 >> 8) - s[2] = byte((s0 >> 16) | (s1 << 5)) - s[3] = byte(s1 >> 3) - s[4] = byte(s1 >> 11) - s[5] = byte((s1 >> 19) | (s2 << 2)) - s[6] = byte(s2 >> 6) - s[7] = byte((s2 >> 14) | (s3 << 7)) - s[8] = byte(s3 >> 1) - s[9] = byte(s3 >> 9) - s[10] = byte((s3 >> 17) | (s4 << 4)) - s[11] = byte(s4 >> 4) - s[12] = byte(s4 >> 12) - s[13] = byte((s4 >> 20) | (s5 << 1)) - s[14] = byte(s5 >> 7) - s[15] = byte((s5 >> 15) | (s6 << 6)) - s[16] = byte(s6 >> 2) - s[17] = byte(s6 >> 10) - s[18] = byte((s6 >> 18) | (s7 << 3)) - s[19] = byte(s7 >> 5) - s[20] = byte(s7 >> 13) - s[21] = byte(s8 >> 0) - s[22] = byte(s8 >> 8) - s[23] = byte((s8 >> 16) | (s9 << 5)) - s[24] = byte(s9 >> 3) - s[25] = byte(s9 >> 11) - s[26] = byte((s9 >> 19) | (s10 << 2)) - s[27] = byte(s10 >> 6) - s[28] = byte((s10 >> 14) | (s11 << 7)) - s[29] = byte(s11 >> 1) - s[30] = byte(s11 >> 9) - s[31] = byte(s11 >> 17) -} - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScReduce(out *[32]byte, s *[64]byte) { - s0 := 2097151 & load3(s[:]) - s1 := 2097151 & (load4(s[2:]) >> 5) - s2 := 2097151 & (load3(s[5:]) >> 2) - s3 := 2097151 & (load4(s[7:]) >> 7) - s4 := 2097151 & (load4(s[10:]) >> 4) - s5 := 2097151 & (load3(s[13:]) >> 1) - s6 := 2097151 & (load4(s[15:]) >> 6) - s7 := 2097151 & (load3(s[18:]) >> 3) - s8 := 2097151 & load3(s[21:]) - s9 := 2097151 & (load4(s[23:]) >> 5) - s10 := 2097151 & (load3(s[26:]) >> 2) - s11 := 2097151 & (load4(s[28:]) >> 7) - s12 := 2097151 & (load4(s[31:]) >> 4) - s13 := 2097151 & (load3(s[34:]) >> 1) - s14 := 2097151 & (load4(s[36:]) >> 6) - s15 := 2097151 & (load3(s[39:]) >> 3) - s16 := 2097151 & load3(s[42:]) - s17 := 2097151 & (load4(s[44:]) >> 5) - s18 := 2097151 & (load3(s[47:]) >> 2) - s19 := 2097151 & (load4(s[49:]) >> 7) - s20 := 2097151 & (load4(s[52:]) >> 4) - s21 := 2097151 & (load3(s[55:]) >> 1) - s22 := 2097151 & (load4(s[57:]) >> 6) - s23 := (load4(s[60:]) >> 3) - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - var carry [17]int64 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - out[0] = byte(s0 >> 0) - out[1] = byte(s0 >> 8) - out[2] = byte((s0 >> 16) | (s1 << 5)) - out[3] = byte(s1 >> 3) - out[4] = byte(s1 >> 11) - out[5] = byte((s1 >> 19) | (s2 << 2)) - out[6] = byte(s2 >> 6) - out[7] = byte((s2 >> 14) | (s3 << 7)) - out[8] = byte(s3 >> 1) - out[9] = byte(s3 >> 9) - out[10] = byte((s3 >> 17) | (s4 << 4)) - out[11] = byte(s4 >> 4) - out[12] = byte(s4 >> 12) - out[13] = byte((s4 >> 20) | (s5 << 1)) - out[14] = byte(s5 >> 7) - out[15] = byte((s5 >> 15) | (s6 << 6)) - out[16] = byte(s6 >> 2) - out[17] = byte(s6 >> 10) - out[18] = byte((s6 >> 18) | (s7 << 3)) - out[19] = byte(s7 >> 5) - out[20] = byte(s7 >> 13) - out[21] = byte(s8 >> 0) - out[22] = byte(s8 >> 8) - out[23] = byte((s8 >> 16) | (s9 << 5)) - out[24] = byte(s9 >> 3) - out[25] = byte(s9 >> 11) - out[26] = byte((s9 >> 19) | (s10 << 2)) - out[27] = byte(s10 >> 6) - out[28] = byte((s10 >> 14) | (s11 << 7)) - out[29] = byte(s11 >> 1) - out[30] = byte(s11 >> 9) - out[31] = byte(s11 >> 17) -} diff --git a/vendor/github.com/refraction-networking/gotapdance/protobuf/Makefile b/vendor/github.com/refraction-networking/gotapdance/protobuf/Makefile deleted file mode 100644 index ce96b121a..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/protobuf/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# -# github.com/protobuf/protoc-gen-go was recently deprecated in favor of -# google.golang.org/protobuf/protoc-gen-go and there have been some changes to the interface. -# We are using protoc to generate golang as a package in a somewhat non-standard way and as such -# we have to specify some options. For more details see -# [here](https://developers.google.com/protocol-buffers/docs/reference/go-generated#package). -# -# protoc --go_out=./ --go_opt=M"./signalling.proto=./;tdproto" signalling.proto \ -# -# --go_out=./ -# --go_out == generate go files into the current directory -# -# --go_opt=M"signalling.proto=./;tdproto" -# --go_opt= == use options for protoc-gen-go -# Msignalling.proto == the structures defined by the protobuf at this path are used by the module defined here -# =./ == the module for importing related files is at ./ -# ;tdproto == use a custom package name (other than module name defined by package path, which we aren't using) -# -# signalling.proto == the file to compile using protoc -# -# -------------------------------------------------------------------------------------------------- -# -# old command to compile the protobuf into a local file with package name tdproto -# -# protoc --go_out=import_path=tdproto:. signalling.proto \ - -all: - protoc --go_out=./ --go_opt=M"signalling.proto=./;tdproto" signalling.proto diff --git a/vendor/github.com/refraction-networking/gotapdance/protobuf/README.md b/vendor/github.com/refraction-networking/gotapdance/protobuf/README.md deleted file mode 100644 index c3282f029..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/protobuf/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Protobuf messages for TapDance -[![godoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/refraction-networking/gotapdance/protobuf) ---- - -### Rebuild -protoc --go_out=import_path=tdproto:. signalling.proto - diff --git a/vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.pb.go b/vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.pb.go deleted file mode 100644 index 2fb9a9b9b..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/protobuf/signalling.pb.go +++ /dev/null @@ -1,2227 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.19.1 -// source: signalling.proto - -// TODO: We're using proto2 because it's the default on Ubuntu 16.04. -// At some point we will want to migrate to proto3, but we are not -// using any proto3 features yet. - -package tdproto - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type KeyType int32 - -const ( - KeyType_AES_GCM_128 KeyType = 90 - KeyType_AES_GCM_256 KeyType = 91 // not supported atm -) - -// Enum value maps for KeyType. -var ( - KeyType_name = map[int32]string{ - 90: "AES_GCM_128", - 91: "AES_GCM_256", - } - KeyType_value = map[string]int32{ - "AES_GCM_128": 90, - "AES_GCM_256": 91, - } -) - -func (x KeyType) Enum() *KeyType { - p := new(KeyType) - *p = x - return p -} - -func (x KeyType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (KeyType) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[0].Descriptor() -} - -func (KeyType) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[0] -} - -func (x KeyType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *KeyType) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = KeyType(num) - return nil -} - -// Deprecated: Use KeyType.Descriptor instead. -func (KeyType) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{0} -} - -// State transitions of the client -type C2S_Transition int32 - -const ( - C2S_Transition_C2S_NO_CHANGE C2S_Transition = 0 - C2S_Transition_C2S_SESSION_INIT C2S_Transition = 1 // connect me to squid - C2S_Transition_C2S_SESSION_COVERT_INIT C2S_Transition = 11 // connect me to provided covert - C2S_Transition_C2S_EXPECT_RECONNECT C2S_Transition = 2 - C2S_Transition_C2S_SESSION_CLOSE C2S_Transition = 3 - C2S_Transition_C2S_YIELD_UPLOAD C2S_Transition = 4 - C2S_Transition_C2S_ACQUIRE_UPLOAD C2S_Transition = 5 - C2S_Transition_C2S_EXPECT_UPLOADONLY_RECONN C2S_Transition = 6 - C2S_Transition_C2S_ERROR C2S_Transition = 255 -) - -// Enum value maps for C2S_Transition. -var ( - C2S_Transition_name = map[int32]string{ - 0: "C2S_NO_CHANGE", - 1: "C2S_SESSION_INIT", - 11: "C2S_SESSION_COVERT_INIT", - 2: "C2S_EXPECT_RECONNECT", - 3: "C2S_SESSION_CLOSE", - 4: "C2S_YIELD_UPLOAD", - 5: "C2S_ACQUIRE_UPLOAD", - 6: "C2S_EXPECT_UPLOADONLY_RECONN", - 255: "C2S_ERROR", - } - C2S_Transition_value = map[string]int32{ - "C2S_NO_CHANGE": 0, - "C2S_SESSION_INIT": 1, - "C2S_SESSION_COVERT_INIT": 11, - "C2S_EXPECT_RECONNECT": 2, - "C2S_SESSION_CLOSE": 3, - "C2S_YIELD_UPLOAD": 4, - "C2S_ACQUIRE_UPLOAD": 5, - "C2S_EXPECT_UPLOADONLY_RECONN": 6, - "C2S_ERROR": 255, - } -) - -func (x C2S_Transition) Enum() *C2S_Transition { - p := new(C2S_Transition) - *p = x - return p -} - -func (x C2S_Transition) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (C2S_Transition) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[1].Descriptor() -} - -func (C2S_Transition) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[1] -} - -func (x C2S_Transition) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *C2S_Transition) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = C2S_Transition(num) - return nil -} - -// Deprecated: Use C2S_Transition.Descriptor instead. -func (C2S_Transition) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{1} -} - -// State transitions of the server -type S2C_Transition int32 - -const ( - S2C_Transition_S2C_NO_CHANGE S2C_Transition = 0 - S2C_Transition_S2C_SESSION_INIT S2C_Transition = 1 // connected to squid - S2C_Transition_S2C_SESSION_COVERT_INIT S2C_Transition = 11 // connected to covert host - S2C_Transition_S2C_CONFIRM_RECONNECT S2C_Transition = 2 - S2C_Transition_S2C_SESSION_CLOSE S2C_Transition = 3 - // TODO should probably also allow EXPECT_RECONNECT here, for DittoTap - S2C_Transition_S2C_ERROR S2C_Transition = 255 -) - -// Enum value maps for S2C_Transition. -var ( - S2C_Transition_name = map[int32]string{ - 0: "S2C_NO_CHANGE", - 1: "S2C_SESSION_INIT", - 11: "S2C_SESSION_COVERT_INIT", - 2: "S2C_CONFIRM_RECONNECT", - 3: "S2C_SESSION_CLOSE", - 255: "S2C_ERROR", - } - S2C_Transition_value = map[string]int32{ - "S2C_NO_CHANGE": 0, - "S2C_SESSION_INIT": 1, - "S2C_SESSION_COVERT_INIT": 11, - "S2C_CONFIRM_RECONNECT": 2, - "S2C_SESSION_CLOSE": 3, - "S2C_ERROR": 255, - } -) - -func (x S2C_Transition) Enum() *S2C_Transition { - p := new(S2C_Transition) - *p = x - return p -} - -func (x S2C_Transition) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (S2C_Transition) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[2].Descriptor() -} - -func (S2C_Transition) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[2] -} - -func (x S2C_Transition) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *S2C_Transition) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = S2C_Transition(num) - return nil -} - -// Deprecated: Use S2C_Transition.Descriptor instead. -func (S2C_Transition) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{2} -} - -// Should accompany all S2C_ERROR messages. -type ErrorReasonS2C int32 - -const ( - ErrorReasonS2C_NO_ERROR ErrorReasonS2C = 0 - ErrorReasonS2C_COVERT_STREAM ErrorReasonS2C = 1 // Squid TCP connection broke - ErrorReasonS2C_CLIENT_REPORTED ErrorReasonS2C = 2 // You told me something was wrong, client - ErrorReasonS2C_CLIENT_PROTOCOL ErrorReasonS2C = 3 // You messed up, client (e.g. sent a bad protobuf) - ErrorReasonS2C_STATION_INTERNAL ErrorReasonS2C = 4 // I broke - ErrorReasonS2C_DECOY_OVERLOAD ErrorReasonS2C = 5 // Everything's fine, but don't use this decoy right now - ErrorReasonS2C_CLIENT_STREAM ErrorReasonS2C = 100 // My stream to you broke. (This is impossible to send) - ErrorReasonS2C_CLIENT_TIMEOUT ErrorReasonS2C = 101 // You never came back. (This is impossible to send) -) - -// Enum value maps for ErrorReasonS2C. -var ( - ErrorReasonS2C_name = map[int32]string{ - 0: "NO_ERROR", - 1: "COVERT_STREAM", - 2: "CLIENT_REPORTED", - 3: "CLIENT_PROTOCOL", - 4: "STATION_INTERNAL", - 5: "DECOY_OVERLOAD", - 100: "CLIENT_STREAM", - 101: "CLIENT_TIMEOUT", - } - ErrorReasonS2C_value = map[string]int32{ - "NO_ERROR": 0, - "COVERT_STREAM": 1, - "CLIENT_REPORTED": 2, - "CLIENT_PROTOCOL": 3, - "STATION_INTERNAL": 4, - "DECOY_OVERLOAD": 5, - "CLIENT_STREAM": 100, - "CLIENT_TIMEOUT": 101, - } -) - -func (x ErrorReasonS2C) Enum() *ErrorReasonS2C { - p := new(ErrorReasonS2C) - *p = x - return p -} - -func (x ErrorReasonS2C) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ErrorReasonS2C) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[3].Descriptor() -} - -func (ErrorReasonS2C) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[3] -} - -func (x ErrorReasonS2C) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *ErrorReasonS2C) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = ErrorReasonS2C(num) - return nil -} - -// Deprecated: Use ErrorReasonS2C.Descriptor instead. -func (ErrorReasonS2C) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{3} -} - -type TransportType int32 - -const ( - TransportType_Null TransportType = 0 - TransportType_Min TransportType = 1 // Send a 32-byte HMAC id to let the station distinguish registrations to same host - TransportType_Obfs4 TransportType = 2 // Not implemented yet? - TransportType_Webrtc TransportType = 99 // UDP transport: WebRTC DataChannel -) - -// Enum value maps for TransportType. -var ( - TransportType_name = map[int32]string{ - 0: "Null", - 1: "Min", - 2: "Obfs4", - 99: "Webrtc", - } - TransportType_value = map[string]int32{ - "Null": 0, - "Min": 1, - "Obfs4": 2, - "Webrtc": 99, - } -) - -func (x TransportType) Enum() *TransportType { - p := new(TransportType) - *p = x - return p -} - -func (x TransportType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TransportType) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[4].Descriptor() -} - -func (TransportType) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[4] -} - -func (x TransportType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *TransportType) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = TransportType(num) - return nil -} - -// Deprecated: Use TransportType.Descriptor instead. -func (TransportType) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{4} -} - -type RegistrationSource int32 - -const ( - RegistrationSource_Unspecified RegistrationSource = 0 - RegistrationSource_Detector RegistrationSource = 1 - RegistrationSource_API RegistrationSource = 2 - RegistrationSource_DetectorPrescan RegistrationSource = 3 - RegistrationSource_BidirectionalAPI RegistrationSource = 4 -) - -// Enum value maps for RegistrationSource. -var ( - RegistrationSource_name = map[int32]string{ - 0: "Unspecified", - 1: "Detector", - 2: "API", - 3: "DetectorPrescan", - 4: "BidirectionalAPI", - } - RegistrationSource_value = map[string]int32{ - "Unspecified": 0, - "Detector": 1, - "API": 2, - "DetectorPrescan": 3, - "BidirectionalAPI": 4, - } -) - -func (x RegistrationSource) Enum() *RegistrationSource { - p := new(RegistrationSource) - *p = x - return p -} - -func (x RegistrationSource) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RegistrationSource) Descriptor() protoreflect.EnumDescriptor { - return file_signalling_proto_enumTypes[5].Descriptor() -} - -func (RegistrationSource) Type() protoreflect.EnumType { - return &file_signalling_proto_enumTypes[5] -} - -func (x RegistrationSource) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Do not use. -func (x *RegistrationSource) UnmarshalJSON(b []byte) error { - num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) - if err != nil { - return err - } - *x = RegistrationSource(num) - return nil -} - -// Deprecated: Use RegistrationSource.Descriptor instead. -func (RegistrationSource) EnumDescriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{5} -} - -type PubKey struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A public key, as used by the station. - Key []byte `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - Type *KeyType `protobuf:"varint,2,opt,name=type,enum=tapdance.KeyType" json:"type,omitempty"` -} - -func (x *PubKey) Reset() { - *x = PubKey{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PubKey) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PubKey) ProtoMessage() {} - -func (x *PubKey) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PubKey.ProtoReflect.Descriptor instead. -func (*PubKey) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{0} -} - -func (x *PubKey) GetKey() []byte { - if x != nil { - return x.Key - } - return nil -} - -func (x *PubKey) GetType() KeyType { - if x != nil && x.Type != nil { - return *x.Type - } - return KeyType_AES_GCM_128 -} - -type TLSDecoySpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The hostname/SNI to use for this host - // - // The hostname is the only required field, although other - // fields are expected to be present in most cases. - Hostname *string `protobuf:"bytes,1,opt,name=hostname" json:"hostname,omitempty"` - // The 32-bit ipv4 address, in network byte order - // - // If the IPv4 address is absent, then it may be resolved via - // DNS by the client, or the client may discard this decoy spec - // if local DNS is untrusted, or the service may be multihomed. - Ipv4Addr *uint32 `protobuf:"fixed32,2,opt,name=ipv4addr" json:"ipv4addr,omitempty"` - // The 128-bit ipv6 address, in network byte order - Ipv6Addr []byte `protobuf:"bytes,6,opt,name=ipv6addr" json:"ipv6addr,omitempty"` - // The Tapdance station public key to use when contacting this - // decoy - // - // If omitted, the default station public key (if any) is used. - Pubkey *PubKey `protobuf:"bytes,3,opt,name=pubkey" json:"pubkey,omitempty"` - // The maximum duration, in milliseconds, to maintain an open - // connection to this decoy (because the decoy may close the - // connection itself after this length of time) - // - // If omitted, a default of 30,000 milliseconds is assumed. - Timeout *uint32 `protobuf:"varint,4,opt,name=timeout" json:"timeout,omitempty"` - // The maximum TCP window size to attempt to use for this decoy. - // - // If omitted, a default of 15360 is assumed. - // - // TODO: the default is based on the current heuristic of only - // using decoys that permit windows of 15KB or larger. If this - // heuristic changes, then this default doesn't make sense. - Tcpwin *uint32 `protobuf:"varint,5,opt,name=tcpwin" json:"tcpwin,omitempty"` -} - -func (x *TLSDecoySpec) Reset() { - *x = TLSDecoySpec{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TLSDecoySpec) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TLSDecoySpec) ProtoMessage() {} - -func (x *TLSDecoySpec) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TLSDecoySpec.ProtoReflect.Descriptor instead. -func (*TLSDecoySpec) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{1} -} - -func (x *TLSDecoySpec) GetHostname() string { - if x != nil && x.Hostname != nil { - return *x.Hostname - } - return "" -} - -func (x *TLSDecoySpec) GetIpv4Addr() uint32 { - if x != nil && x.Ipv4Addr != nil { - return *x.Ipv4Addr - } - return 0 -} - -func (x *TLSDecoySpec) GetIpv6Addr() []byte { - if x != nil { - return x.Ipv6Addr - } - return nil -} - -func (x *TLSDecoySpec) GetPubkey() *PubKey { - if x != nil { - return x.Pubkey - } - return nil -} - -func (x *TLSDecoySpec) GetTimeout() uint32 { - if x != nil && x.Timeout != nil { - return *x.Timeout - } - return 0 -} - -func (x *TLSDecoySpec) GetTcpwin() uint32 { - if x != nil && x.Tcpwin != nil { - return *x.Tcpwin - } - return 0 -} - -type ClientConf struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DecoyList *DecoyList `protobuf:"bytes,1,opt,name=decoy_list,json=decoyList" json:"decoy_list,omitempty"` - Generation *uint32 `protobuf:"varint,2,opt,name=generation" json:"generation,omitempty"` - DefaultPubkey *PubKey `protobuf:"bytes,3,opt,name=default_pubkey,json=defaultPubkey" json:"default_pubkey,omitempty"` - PhantomSubnetsList *PhantomSubnetsList `protobuf:"bytes,4,opt,name=phantom_subnets_list,json=phantomSubnetsList" json:"phantom_subnets_list,omitempty"` - ConjurePubkey *PubKey `protobuf:"bytes,5,opt,name=conjure_pubkey,json=conjurePubkey" json:"conjure_pubkey,omitempty"` -} - -func (x *ClientConf) Reset() { - *x = ClientConf{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientConf) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientConf) ProtoMessage() {} - -func (x *ClientConf) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientConf.ProtoReflect.Descriptor instead. -func (*ClientConf) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{2} -} - -func (x *ClientConf) GetDecoyList() *DecoyList { - if x != nil { - return x.DecoyList - } - return nil -} - -func (x *ClientConf) GetGeneration() uint32 { - if x != nil && x.Generation != nil { - return *x.Generation - } - return 0 -} - -func (x *ClientConf) GetDefaultPubkey() *PubKey { - if x != nil { - return x.DefaultPubkey - } - return nil -} - -func (x *ClientConf) GetPhantomSubnetsList() *PhantomSubnetsList { - if x != nil { - return x.PhantomSubnetsList - } - return nil -} - -func (x *ClientConf) GetConjurePubkey() *PubKey { - if x != nil { - return x.ConjurePubkey - } - return nil -} - -type DecoyList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TlsDecoys []*TLSDecoySpec `protobuf:"bytes,1,rep,name=tls_decoys,json=tlsDecoys" json:"tls_decoys,omitempty"` -} - -func (x *DecoyList) Reset() { - *x = DecoyList{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DecoyList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DecoyList) ProtoMessage() {} - -func (x *DecoyList) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DecoyList.ProtoReflect.Descriptor instead. -func (*DecoyList) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{3} -} - -func (x *DecoyList) GetTlsDecoys() []*TLSDecoySpec { - if x != nil { - return x.TlsDecoys - } - return nil -} - -type PhantomSubnetsList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WeightedSubnets []*PhantomSubnets `protobuf:"bytes,1,rep,name=weighted_subnets,json=weightedSubnets" json:"weighted_subnets,omitempty"` -} - -func (x *PhantomSubnetsList) Reset() { - *x = PhantomSubnetsList{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PhantomSubnetsList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PhantomSubnetsList) ProtoMessage() {} - -func (x *PhantomSubnetsList) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PhantomSubnetsList.ProtoReflect.Descriptor instead. -func (*PhantomSubnetsList) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{4} -} - -func (x *PhantomSubnetsList) GetWeightedSubnets() []*PhantomSubnets { - if x != nil { - return x.WeightedSubnets - } - return nil -} - -type PhantomSubnets struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Weight *uint32 `protobuf:"varint,1,opt,name=weight" json:"weight,omitempty"` - Subnets []string `protobuf:"bytes,2,rep,name=subnets" json:"subnets,omitempty"` -} - -func (x *PhantomSubnets) Reset() { - *x = PhantomSubnets{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PhantomSubnets) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PhantomSubnets) ProtoMessage() {} - -func (x *PhantomSubnets) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PhantomSubnets.ProtoReflect.Descriptor instead. -func (*PhantomSubnets) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{5} -} - -func (x *PhantomSubnets) GetWeight() uint32 { - if x != nil && x.Weight != nil { - return *x.Weight - } - return 0 -} - -func (x *PhantomSubnets) GetSubnets() []string { - if x != nil { - return x.Subnets - } - return nil -} - -// Deflated ICE Candidate by seed2sdp package -type WebRTCICECandidate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // IP is represented in its 16-byte form - IpUpper *uint64 `protobuf:"varint,1,req,name=ip_upper,json=ipUpper" json:"ip_upper,omitempty"` - IpLower *uint64 `protobuf:"varint,2,req,name=ip_lower,json=ipLower" json:"ip_lower,omitempty"` - // Composed info includes port, tcptype (unset if not tcp), candidate type (host, srflx, prflx), protocol (TCP/UDP), and component (RTP/RTCP) - ComposedInfo *uint32 `protobuf:"varint,3,req,name=composed_info,json=composedInfo" json:"composed_info,omitempty"` -} - -func (x *WebRTCICECandidate) Reset() { - *x = WebRTCICECandidate{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WebRTCICECandidate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WebRTCICECandidate) ProtoMessage() {} - -func (x *WebRTCICECandidate) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WebRTCICECandidate.ProtoReflect.Descriptor instead. -func (*WebRTCICECandidate) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{6} -} - -func (x *WebRTCICECandidate) GetIpUpper() uint64 { - if x != nil && x.IpUpper != nil { - return *x.IpUpper - } - return 0 -} - -func (x *WebRTCICECandidate) GetIpLower() uint64 { - if x != nil && x.IpLower != nil { - return *x.IpLower - } - return 0 -} - -func (x *WebRTCICECandidate) GetComposedInfo() uint32 { - if x != nil && x.ComposedInfo != nil { - return *x.ComposedInfo - } - return 0 -} - -// Deflated SDP for WebRTC by seed2sdp package -type WebRTCSDP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type *uint32 `protobuf:"varint,1,req,name=type" json:"type,omitempty"` - Candidates []*WebRTCICECandidate `protobuf:"bytes,2,rep,name=candidates" json:"candidates,omitempty"` // there could be multiple candidates -} - -func (x *WebRTCSDP) Reset() { - *x = WebRTCSDP{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WebRTCSDP) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WebRTCSDP) ProtoMessage() {} - -func (x *WebRTCSDP) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WebRTCSDP.ProtoReflect.Descriptor instead. -func (*WebRTCSDP) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{7} -} - -func (x *WebRTCSDP) GetType() uint32 { - if x != nil && x.Type != nil { - return *x.Type - } - return 0 -} - -func (x *WebRTCSDP) GetCandidates() []*WebRTCICECandidate { - if x != nil { - return x.Candidates - } - return nil -} - -// WebRTCSignal includes a deflated SDP and a seed -type WebRTCSignal struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Seed *string `protobuf:"bytes,1,req,name=seed" json:"seed,omitempty"` - Sdp *WebRTCSDP `protobuf:"bytes,2,req,name=sdp" json:"sdp,omitempty"` -} - -func (x *WebRTCSignal) Reset() { - *x = WebRTCSignal{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WebRTCSignal) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WebRTCSignal) ProtoMessage() {} - -func (x *WebRTCSignal) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use WebRTCSignal.ProtoReflect.Descriptor instead. -func (*WebRTCSignal) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{8} -} - -func (x *WebRTCSignal) GetSeed() string { - if x != nil && x.Seed != nil { - return *x.Seed - } - return "" -} - -func (x *WebRTCSignal) GetSdp() *WebRTCSDP { - if x != nil { - return x.Sdp - } - return nil -} - -type StationToClient struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Should accompany (at least) SESSION_INIT and CONFIRM_RECONNECT. - ProtocolVersion *uint32 `protobuf:"varint,1,opt,name=protocol_version,json=protocolVersion" json:"protocol_version,omitempty"` - // There might be a state transition. May be absent; absence should be - // treated identically to NO_CHANGE. - StateTransition *S2C_Transition `protobuf:"varint,2,opt,name=state_transition,json=stateTransition,enum=tapdance.S2C_Transition" json:"state_transition,omitempty"` - // The station can send client config info piggybacked - // on any message, as it sees fit - ConfigInfo *ClientConf `protobuf:"bytes,3,opt,name=config_info,json=configInfo" json:"config_info,omitempty"` - // If state_transition == S2C_ERROR, this field is the explanation. - ErrReason *ErrorReasonS2C `protobuf:"varint,4,opt,name=err_reason,json=errReason,enum=tapdance.ErrorReasonS2C" json:"err_reason,omitempty"` - // Signals client to stop connecting for following amount of seconds - TmpBackoff *uint32 `protobuf:"varint,5,opt,name=tmp_backoff,json=tmpBackoff" json:"tmp_backoff,omitempty"` - // Sent in SESSION_INIT, identifies the station that picked up - StationId *string `protobuf:"bytes,6,opt,name=station_id,json=stationId" json:"station_id,omitempty"` - // Random-sized junk to defeat packet size fingerprinting. - Padding []byte `protobuf:"bytes,100,opt,name=padding" json:"padding,omitempty"` -} - -func (x *StationToClient) Reset() { - *x = StationToClient{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StationToClient) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StationToClient) ProtoMessage() {} - -func (x *StationToClient) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StationToClient.ProtoReflect.Descriptor instead. -func (*StationToClient) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{9} -} - -func (x *StationToClient) GetProtocolVersion() uint32 { - if x != nil && x.ProtocolVersion != nil { - return *x.ProtocolVersion - } - return 0 -} - -func (x *StationToClient) GetStateTransition() S2C_Transition { - if x != nil && x.StateTransition != nil { - return *x.StateTransition - } - return S2C_Transition_S2C_NO_CHANGE -} - -func (x *StationToClient) GetConfigInfo() *ClientConf { - if x != nil { - return x.ConfigInfo - } - return nil -} - -func (x *StationToClient) GetErrReason() ErrorReasonS2C { - if x != nil && x.ErrReason != nil { - return *x.ErrReason - } - return ErrorReasonS2C_NO_ERROR -} - -func (x *StationToClient) GetTmpBackoff() uint32 { - if x != nil && x.TmpBackoff != nil { - return *x.TmpBackoff - } - return 0 -} - -func (x *StationToClient) GetStationId() string { - if x != nil && x.StationId != nil { - return *x.StationId - } - return "" -} - -func (x *StationToClient) GetPadding() []byte { - if x != nil { - return x.Padding - } - return nil -} - -type RegistrationFlags struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UploadOnly *bool `protobuf:"varint,1,opt,name=upload_only,json=uploadOnly" json:"upload_only,omitempty"` - DarkDecoy *bool `protobuf:"varint,2,opt,name=dark_decoy,json=darkDecoy" json:"dark_decoy,omitempty"` - ProxyHeader *bool `protobuf:"varint,3,opt,name=proxy_header,json=proxyHeader" json:"proxy_header,omitempty"` - Use_TIL *bool `protobuf:"varint,4,opt,name=use_TIL,json=useTIL" json:"use_TIL,omitempty"` - Prescanned *bool `protobuf:"varint,5,opt,name=prescanned" json:"prescanned,omitempty"` -} - -func (x *RegistrationFlags) Reset() { - *x = RegistrationFlags{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegistrationFlags) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegistrationFlags) ProtoMessage() {} - -func (x *RegistrationFlags) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegistrationFlags.ProtoReflect.Descriptor instead. -func (*RegistrationFlags) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{10} -} - -func (x *RegistrationFlags) GetUploadOnly() bool { - if x != nil && x.UploadOnly != nil { - return *x.UploadOnly - } - return false -} - -func (x *RegistrationFlags) GetDarkDecoy() bool { - if x != nil && x.DarkDecoy != nil { - return *x.DarkDecoy - } - return false -} - -func (x *RegistrationFlags) GetProxyHeader() bool { - if x != nil && x.ProxyHeader != nil { - return *x.ProxyHeader - } - return false -} - -func (x *RegistrationFlags) GetUse_TIL() bool { - if x != nil && x.Use_TIL != nil { - return *x.Use_TIL - } - return false -} - -func (x *RegistrationFlags) GetPrescanned() bool { - if x != nil && x.Prescanned != nil { - return *x.Prescanned - } - return false -} - -type ClientToStation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ProtocolVersion *uint32 `protobuf:"varint,1,opt,name=protocol_version,json=protocolVersion" json:"protocol_version,omitempty"` - // The client reports its decoy list's version number here, which the - // station can use to decide whether to send an updated one. The station - // should always send a list if this field is set to 0. - DecoyListGeneration *uint32 `protobuf:"varint,2,opt,name=decoy_list_generation,json=decoyListGeneration" json:"decoy_list_generation,omitempty"` - StateTransition *C2S_Transition `protobuf:"varint,3,opt,name=state_transition,json=stateTransition,enum=tapdance.C2S_Transition" json:"state_transition,omitempty"` - // The position in the overall session's upload sequence where the current - // YIELD=>ACQUIRE switchover is happening. - UploadSync *uint64 `protobuf:"varint,4,opt,name=upload_sync,json=uploadSync" json:"upload_sync,omitempty"` - // List of decoys that client have unsuccessfully tried in current session. - // Could be sent in chunks - FailedDecoys []string `protobuf:"bytes,10,rep,name=failed_decoys,json=failedDecoys" json:"failed_decoys,omitempty"` - Stats *SessionStats `protobuf:"bytes,11,opt,name=stats" json:"stats,omitempty"` - // NullTransport, MinTransport, Obfs4Transport, etc. Transport type we want from phantom proxy - Transport *TransportType `protobuf:"varint,12,opt,name=transport,enum=tapdance.TransportType" json:"transport,omitempty"` - // Station is only required to check this variable during session initialization. - // If set, station must facilitate connection to said target by itself, i.e. write into squid - // socket an HTTP/SOCKS/any other connection request. - // covert_address must have exactly one ':' colon, that separates host (literal IP address or - // resolvable hostname) and port - // TODO: make it required for initialization, and stop connecting any client straight to squid? - CovertAddress *string `protobuf:"bytes,20,opt,name=covert_address,json=covertAddress" json:"covert_address,omitempty"` - // Used in dark decoys to signal which dark decoy it will connect to. - MaskedDecoyServerName *string `protobuf:"bytes,21,opt,name=masked_decoy_server_name,json=maskedDecoyServerName" json:"masked_decoy_server_name,omitempty"` - // Used to indicate to server if client is registering v4, v6 or both - V6Support *bool `protobuf:"varint,22,opt,name=v6_support,json=v6Support" json:"v6_support,omitempty"` - V4Support *bool `protobuf:"varint,23,opt,name=v4_support,json=v4Support" json:"v4_support,omitempty"` - // A collection of optional flags for the registration. - Flags *RegistrationFlags `protobuf:"bytes,24,opt,name=flags" json:"flags,omitempty"` - // Transport Extensions - WebrtcSignal *WebRTCSignal `protobuf:"bytes,31,opt,name=webrtc_signal,json=webrtcSignal" json:"webrtc_signal,omitempty"` - // Random-sized junk to defeat packet size fingerprinting. - Padding []byte `protobuf:"bytes,100,opt,name=padding" json:"padding,omitempty"` -} - -func (x *ClientToStation) Reset() { - *x = ClientToStation{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClientToStation) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClientToStation) ProtoMessage() {} - -func (x *ClientToStation) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClientToStation.ProtoReflect.Descriptor instead. -func (*ClientToStation) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{11} -} - -func (x *ClientToStation) GetProtocolVersion() uint32 { - if x != nil && x.ProtocolVersion != nil { - return *x.ProtocolVersion - } - return 0 -} - -func (x *ClientToStation) GetDecoyListGeneration() uint32 { - if x != nil && x.DecoyListGeneration != nil { - return *x.DecoyListGeneration - } - return 0 -} - -func (x *ClientToStation) GetStateTransition() C2S_Transition { - if x != nil && x.StateTransition != nil { - return *x.StateTransition - } - return C2S_Transition_C2S_NO_CHANGE -} - -func (x *ClientToStation) GetUploadSync() uint64 { - if x != nil && x.UploadSync != nil { - return *x.UploadSync - } - return 0 -} - -func (x *ClientToStation) GetFailedDecoys() []string { - if x != nil { - return x.FailedDecoys - } - return nil -} - -func (x *ClientToStation) GetStats() *SessionStats { - if x != nil { - return x.Stats - } - return nil -} - -func (x *ClientToStation) GetTransport() TransportType { - if x != nil && x.Transport != nil { - return *x.Transport - } - return TransportType_Null -} - -func (x *ClientToStation) GetCovertAddress() string { - if x != nil && x.CovertAddress != nil { - return *x.CovertAddress - } - return "" -} - -func (x *ClientToStation) GetMaskedDecoyServerName() string { - if x != nil && x.MaskedDecoyServerName != nil { - return *x.MaskedDecoyServerName - } - return "" -} - -func (x *ClientToStation) GetV6Support() bool { - if x != nil && x.V6Support != nil { - return *x.V6Support - } - return false -} - -func (x *ClientToStation) GetV4Support() bool { - if x != nil && x.V4Support != nil { - return *x.V4Support - } - return false -} - -func (x *ClientToStation) GetFlags() *RegistrationFlags { - if x != nil { - return x.Flags - } - return nil -} - -func (x *ClientToStation) GetWebrtcSignal() *WebRTCSignal { - if x != nil { - return x.WebrtcSignal - } - return nil -} - -func (x *ClientToStation) GetPadding() []byte { - if x != nil { - return x.Padding - } - return nil -} - -type C2SWrapper struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SharedSecret []byte `protobuf:"bytes,1,opt,name=shared_secret,json=sharedSecret" json:"shared_secret,omitempty"` - RegistrationPayload *ClientToStation `protobuf:"bytes,3,opt,name=registration_payload,json=registrationPayload" json:"registration_payload,omitempty"` - RegistrationSource *RegistrationSource `protobuf:"varint,4,opt,name=registration_source,json=registrationSource,enum=tapdance.RegistrationSource" json:"registration_source,omitempty"` - // client source address when receiving a registration - RegistrationAddress []byte `protobuf:"bytes,6,opt,name=registration_address,json=registrationAddress" json:"registration_address,omitempty"` - // Decoy address used when registering over Decoy registrar - DecoyAddress []byte `protobuf:"bytes,7,opt,name=decoy_address,json=decoyAddress" json:"decoy_address,omitempty"` - RegistrationResponse *RegistrationResponse `protobuf:"bytes,8,opt,name=registration_response,json=registrationResponse" json:"registration_response,omitempty"` -} - -func (x *C2SWrapper) Reset() { - *x = C2SWrapper{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *C2SWrapper) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*C2SWrapper) ProtoMessage() {} - -func (x *C2SWrapper) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use C2SWrapper.ProtoReflect.Descriptor instead. -func (*C2SWrapper) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{12} -} - -func (x *C2SWrapper) GetSharedSecret() []byte { - if x != nil { - return x.SharedSecret - } - return nil -} - -func (x *C2SWrapper) GetRegistrationPayload() *ClientToStation { - if x != nil { - return x.RegistrationPayload - } - return nil -} - -func (x *C2SWrapper) GetRegistrationSource() RegistrationSource { - if x != nil && x.RegistrationSource != nil { - return *x.RegistrationSource - } - return RegistrationSource_Unspecified -} - -func (x *C2SWrapper) GetRegistrationAddress() []byte { - if x != nil { - return x.RegistrationAddress - } - return nil -} - -func (x *C2SWrapper) GetDecoyAddress() []byte { - if x != nil { - return x.DecoyAddress - } - return nil -} - -func (x *C2SWrapper) GetRegistrationResponse() *RegistrationResponse { - if x != nil { - return x.RegistrationResponse - } - return nil -} - -type SessionStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FailedDecoysAmount *uint32 `protobuf:"varint,20,opt,name=failed_decoys_amount,json=failedDecoysAmount" json:"failed_decoys_amount,omitempty"` // how many decoys were tried before success - // Applicable to whole session: - TotalTimeToConnect *uint32 `protobuf:"varint,31,opt,name=total_time_to_connect,json=totalTimeToConnect" json:"total_time_to_connect,omitempty"` // includes failed attempts - // Last (i.e. successful) decoy: - RttToStation *uint32 `protobuf:"varint,33,opt,name=rtt_to_station,json=rttToStation" json:"rtt_to_station,omitempty"` // measured during initial handshake - TlsToDecoy *uint32 `protobuf:"varint,38,opt,name=tls_to_decoy,json=tlsToDecoy" json:"tls_to_decoy,omitempty"` // includes tcp to decoy - TcpToDecoy *uint32 `protobuf:"varint,39,opt,name=tcp_to_decoy,json=tcpToDecoy" json:"tcp_to_decoy,omitempty"` // measured when establishing tcp connection to decot -} - -func (x *SessionStats) Reset() { - *x = SessionStats{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SessionStats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SessionStats) ProtoMessage() {} - -func (x *SessionStats) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SessionStats.ProtoReflect.Descriptor instead. -func (*SessionStats) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{13} -} - -func (x *SessionStats) GetFailedDecoysAmount() uint32 { - if x != nil && x.FailedDecoysAmount != nil { - return *x.FailedDecoysAmount - } - return 0 -} - -func (x *SessionStats) GetTotalTimeToConnect() uint32 { - if x != nil && x.TotalTimeToConnect != nil { - return *x.TotalTimeToConnect - } - return 0 -} - -func (x *SessionStats) GetRttToStation() uint32 { - if x != nil && x.RttToStation != nil { - return *x.RttToStation - } - return 0 -} - -func (x *SessionStats) GetTlsToDecoy() uint32 { - if x != nil && x.TlsToDecoy != nil { - return *x.TlsToDecoy - } - return 0 -} - -func (x *SessionStats) GetTcpToDecoy() uint32 { - if x != nil && x.TcpToDecoy != nil { - return *x.TcpToDecoy - } - return 0 -} - -type StationToDetector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PhantomIp *string `protobuf:"bytes,1,opt,name=phantom_ip,json=phantomIp" json:"phantom_ip,omitempty"` - ClientIp *string `protobuf:"bytes,2,opt,name=client_ip,json=clientIp" json:"client_ip,omitempty"` - TimeoutNs *uint64 `protobuf:"varint,3,opt,name=timeout_ns,json=timeoutNs" json:"timeout_ns,omitempty"` -} - -func (x *StationToDetector) Reset() { - *x = StationToDetector{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StationToDetector) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StationToDetector) ProtoMessage() {} - -func (x *StationToDetector) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StationToDetector.ProtoReflect.Descriptor instead. -func (*StationToDetector) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{14} -} - -func (x *StationToDetector) GetPhantomIp() string { - if x != nil && x.PhantomIp != nil { - return *x.PhantomIp - } - return "" -} - -func (x *StationToDetector) GetClientIp() string { - if x != nil && x.ClientIp != nil { - return *x.ClientIp - } - return "" -} - -func (x *StationToDetector) GetTimeoutNs() uint64 { - if x != nil && x.TimeoutNs != nil { - return *x.TimeoutNs - } - return 0 -} - -// Adding message response from Station to Client for birdirectional API -type RegistrationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ipv4Addr *uint32 `protobuf:"fixed32,1,opt,name=ipv4addr" json:"ipv4addr,omitempty"` - // The 128-bit ipv6 address, in network byte order - Ipv6Addr []byte `protobuf:"bytes,2,opt,name=ipv6addr" json:"ipv6addr,omitempty"` - // Respond with randomized port - Port *uint32 `protobuf:"varint,3,opt,name=port" json:"port,omitempty"` - // Future: station provides client with secret, want chanel present - // Leave null for now - ServerRandom []byte `protobuf:"bytes,4,opt,name=serverRandom" json:"serverRandom,omitempty"` - // If registration wrong, populate this error string - Error *string `protobuf:"bytes,5,opt,name=error" json:"error,omitempty"` - // ClientConf field (optional) - ClientConf *ClientConf `protobuf:"bytes,6,opt,name=clientConf" json:"clientConf,omitempty"` -} - -func (x *RegistrationResponse) Reset() { - *x = RegistrationResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_signalling_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RegistrationResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RegistrationResponse) ProtoMessage() {} - -func (x *RegistrationResponse) ProtoReflect() protoreflect.Message { - mi := &file_signalling_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RegistrationResponse.ProtoReflect.Descriptor instead. -func (*RegistrationResponse) Descriptor() ([]byte, []int) { - return file_signalling_proto_rawDescGZIP(), []int{15} -} - -func (x *RegistrationResponse) GetIpv4Addr() uint32 { - if x != nil && x.Ipv4Addr != nil { - return *x.Ipv4Addr - } - return 0 -} - -func (x *RegistrationResponse) GetIpv6Addr() []byte { - if x != nil { - return x.Ipv6Addr - } - return nil -} - -func (x *RegistrationResponse) GetPort() uint32 { - if x != nil && x.Port != nil { - return *x.Port - } - return 0 -} - -func (x *RegistrationResponse) GetServerRandom() []byte { - if x != nil { - return x.ServerRandom - } - return nil -} - -func (x *RegistrationResponse) GetError() string { - if x != nil && x.Error != nil { - return *x.Error - } - return "" -} - -func (x *RegistrationResponse) GetClientConf() *ClientConf { - if x != nil { - return x.ClientConf - } - return nil -} - -var File_signalling_proto protoreflect.FileDescriptor - -var file_signalling_proto_rawDesc = []byte{ - 0x0a, 0x10, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x08, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x41, 0x0a, 0x06, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0xbe, 0x01, 0x0a, 0x0c, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x07, 0x52, 0x08, - 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, 0x76, 0x36, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, - 0x61, 0x64, 0x64, 0x72, 0x12, 0x28, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x63, 0x70, 0x77, - 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x63, 0x70, 0x77, 0x69, 0x6e, - 0x22, 0xa2, 0x02, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x12, - 0x32, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, - 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x14, - 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x61, 0x70, - 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x12, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, - 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x72, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6a, 0x75, 0x72, 0x65, 0x50, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x22, 0x42, 0x0a, 0x09, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x6c, 0x73, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x54, 0x4c, 0x53, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, - 0x74, 0x6c, 0x73, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x22, 0x59, 0x0a, 0x12, 0x50, 0x68, 0x61, - 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x43, 0x0a, 0x10, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x6e, - 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x64, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, 0x75, 0x62, 0x6e, - 0x65, 0x74, 0x73, 0x52, 0x0f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x73, 0x22, 0x42, 0x0a, 0x0e, 0x50, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x53, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x22, 0x6f, 0x0a, 0x12, 0x57, 0x65, 0x62, 0x52, - 0x54, 0x43, 0x49, 0x43, 0x45, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x69, 0x70, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x04, - 0x52, 0x07, 0x69, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x70, 0x5f, - 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x02, 0x28, 0x04, 0x52, 0x07, 0x69, 0x70, 0x4c, - 0x6f, 0x77, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x64, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x02, 0x28, 0x0d, 0x52, 0x0c, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x73, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x09, 0x57, 0x65, 0x62, - 0x52, 0x54, 0x43, 0x53, 0x44, 0x50, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x02, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x63, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, - 0x49, 0x43, 0x45, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x49, 0x0a, 0x0c, 0x57, 0x65, 0x62, 0x52, - 0x54, 0x43, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x03, - 0x73, 0x64, 0x70, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x61, 0x70, 0x64, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, 0x53, 0x44, 0x50, 0x52, 0x03, - 0x73, 0x64, 0x70, 0x22, 0xcb, 0x02, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x6f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, - 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x32, 0x43, 0x5f, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, - 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x37, - 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x53, 0x32, 0x43, 0x52, 0x09, 0x65, 0x72, - 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6d, 0x70, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6d, - 0x70, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, - 0x6e, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, - 0x67, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x72, 0x6b, - 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x64, 0x61, - 0x72, 0x6b, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x5f, 0x54, 0x49, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x54, 0x49, 0x4c, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, - 0x6e, 0x65, 0x64, 0x22, 0x88, 0x05, 0x0a, 0x0f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x13, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x32, 0x53, 0x5f, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x75, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x79, - 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x35, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x37, 0x0a, - 0x18, 0x6d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x6d, 0x61, 0x73, 0x6b, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x36, 0x5f, 0x73, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x76, 0x36, 0x53, 0x75, - 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x34, 0x5f, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x76, 0x34, 0x53, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x73, - 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x77, 0x65, 0x62, 0x72, 0x74, - 0x63, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x65, 0x62, 0x52, 0x54, 0x43, - 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x0c, 0x77, 0x65, 0x62, 0x72, 0x74, 0x63, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xfb, - 0x02, 0x0a, 0x0a, 0x43, 0x32, 0x53, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x12, 0x4c, 0x0a, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x54, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x4d, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x12, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x31, 0x0a, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x64, 0x65, 0x63, 0x6f, 0x79, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, - 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x14, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, 0x0a, - 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x30, 0x0a, - 0x14, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x73, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x31, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x74, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x72, 0x74, 0x74, 0x54, - 0x6f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x74, 0x6c, 0x73, 0x5f, - 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x74, 0x6c, 0x73, 0x54, 0x6f, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x12, 0x20, 0x0a, 0x0c, 0x74, 0x63, - 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x79, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x74, 0x63, 0x70, 0x54, 0x6f, 0x44, 0x65, 0x63, 0x6f, 0x79, 0x22, 0x6e, 0x0a, 0x11, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x5f, 0x69, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x68, 0x61, 0x6e, 0x74, 0x6f, 0x6d, 0x49, 0x70, - 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x1d, 0x0a, - 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x4e, 0x73, 0x22, 0xd2, 0x01, 0x0a, - 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x07, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x61, 0x64, 0x64, - 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x70, 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x0a, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x74, 0x61, 0x70, 0x64, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x2a, 0x2b, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, - 0x41, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x4d, 0x5f, 0x31, 0x32, 0x38, 0x10, 0x5a, 0x12, 0x0f, 0x0a, - 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x4d, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x5b, 0x2a, 0xe7, - 0x01, 0x0a, 0x0e, 0x43, 0x32, 0x53, 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x32, 0x53, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x32, - 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, - 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x32, 0x53, 0x5f, 0x45, - 0x58, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x32, 0x53, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x32, 0x53, 0x5f, - 0x59, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x04, 0x12, 0x16, - 0x0a, 0x12, 0x43, 0x32, 0x53, 0x5f, 0x41, 0x43, 0x51, 0x55, 0x49, 0x52, 0x45, 0x5f, 0x55, 0x50, - 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x20, 0x0a, 0x1c, 0x43, 0x32, 0x53, 0x5f, 0x45, 0x58, - 0x50, 0x45, 0x43, 0x54, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, - 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x09, 0x43, 0x32, 0x53, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0x01, 0x2a, 0x98, 0x01, 0x0a, 0x0e, 0x53, 0x32, 0x43, - 0x5f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x53, - 0x32, 0x43, 0x5f, 0x4e, 0x4f, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, - 0x49, 0x54, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, - 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x10, - 0x0b, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x32, 0x43, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x52, 0x4d, - 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, - 0x53, 0x32, 0x43, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, - 0x45, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x09, 0x53, 0x32, 0x43, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0xff, 0x01, 0x2a, 0xac, 0x01, 0x0a, 0x0e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x53, 0x32, 0x43, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x54, 0x5f, 0x53, - 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4c, 0x49, 0x45, 0x4e, - 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, - 0x03, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x54, - 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x43, 0x4f, 0x59, - 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, - 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x64, 0x12, 0x12, - 0x0a, 0x0e, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, - 0x10, 0x65, 0x2a, 0x39, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x75, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x4d, 0x69, 0x6e, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x62, 0x66, 0x73, 0x34, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x72, 0x74, 0x63, 0x10, 0x63, 0x2a, 0x67, 0x0a, - 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x50, 0x49, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x65, 0x73, 0x63, 0x61, 0x6e, 0x10, 0x03, - 0x12, 0x14, 0x0a, 0x10, 0x42, 0x69, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x41, 0x50, 0x49, 0x10, 0x04, -} - -var ( - file_signalling_proto_rawDescOnce sync.Once - file_signalling_proto_rawDescData = file_signalling_proto_rawDesc -) - -func file_signalling_proto_rawDescGZIP() []byte { - file_signalling_proto_rawDescOnce.Do(func() { - file_signalling_proto_rawDescData = protoimpl.X.CompressGZIP(file_signalling_proto_rawDescData) - }) - return file_signalling_proto_rawDescData -} - -var file_signalling_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_signalling_proto_msgTypes = make([]protoimpl.MessageInfo, 16) -var file_signalling_proto_goTypes = []interface{}{ - (KeyType)(0), // 0: tapdance.KeyType - (C2S_Transition)(0), // 1: tapdance.C2S_Transition - (S2C_Transition)(0), // 2: tapdance.S2C_Transition - (ErrorReasonS2C)(0), // 3: tapdance.ErrorReasonS2C - (TransportType)(0), // 4: tapdance.TransportType - (RegistrationSource)(0), // 5: tapdance.RegistrationSource - (*PubKey)(nil), // 6: tapdance.PubKey - (*TLSDecoySpec)(nil), // 7: tapdance.TLSDecoySpec - (*ClientConf)(nil), // 8: tapdance.ClientConf - (*DecoyList)(nil), // 9: tapdance.DecoyList - (*PhantomSubnetsList)(nil), // 10: tapdance.PhantomSubnetsList - (*PhantomSubnets)(nil), // 11: tapdance.PhantomSubnets - (*WebRTCICECandidate)(nil), // 12: tapdance.WebRTCICECandidate - (*WebRTCSDP)(nil), // 13: tapdance.WebRTCSDP - (*WebRTCSignal)(nil), // 14: tapdance.WebRTCSignal - (*StationToClient)(nil), // 15: tapdance.StationToClient - (*RegistrationFlags)(nil), // 16: tapdance.RegistrationFlags - (*ClientToStation)(nil), // 17: tapdance.ClientToStation - (*C2SWrapper)(nil), // 18: tapdance.C2SWrapper - (*SessionStats)(nil), // 19: tapdance.SessionStats - (*StationToDetector)(nil), // 20: tapdance.StationToDetector - (*RegistrationResponse)(nil), // 21: tapdance.RegistrationResponse -} -var file_signalling_proto_depIdxs = []int32{ - 0, // 0: tapdance.PubKey.type:type_name -> tapdance.KeyType - 6, // 1: tapdance.TLSDecoySpec.pubkey:type_name -> tapdance.PubKey - 9, // 2: tapdance.ClientConf.decoy_list:type_name -> tapdance.DecoyList - 6, // 3: tapdance.ClientConf.default_pubkey:type_name -> tapdance.PubKey - 10, // 4: tapdance.ClientConf.phantom_subnets_list:type_name -> tapdance.PhantomSubnetsList - 6, // 5: tapdance.ClientConf.conjure_pubkey:type_name -> tapdance.PubKey - 7, // 6: tapdance.DecoyList.tls_decoys:type_name -> tapdance.TLSDecoySpec - 11, // 7: tapdance.PhantomSubnetsList.weighted_subnets:type_name -> tapdance.PhantomSubnets - 12, // 8: tapdance.WebRTCSDP.candidates:type_name -> tapdance.WebRTCICECandidate - 13, // 9: tapdance.WebRTCSignal.sdp:type_name -> tapdance.WebRTCSDP - 2, // 10: tapdance.StationToClient.state_transition:type_name -> tapdance.S2C_Transition - 8, // 11: tapdance.StationToClient.config_info:type_name -> tapdance.ClientConf - 3, // 12: tapdance.StationToClient.err_reason:type_name -> tapdance.ErrorReasonS2C - 1, // 13: tapdance.ClientToStation.state_transition:type_name -> tapdance.C2S_Transition - 19, // 14: tapdance.ClientToStation.stats:type_name -> tapdance.SessionStats - 4, // 15: tapdance.ClientToStation.transport:type_name -> tapdance.TransportType - 16, // 16: tapdance.ClientToStation.flags:type_name -> tapdance.RegistrationFlags - 14, // 17: tapdance.ClientToStation.webrtc_signal:type_name -> tapdance.WebRTCSignal - 17, // 18: tapdance.C2SWrapper.registration_payload:type_name -> tapdance.ClientToStation - 5, // 19: tapdance.C2SWrapper.registration_source:type_name -> tapdance.RegistrationSource - 21, // 20: tapdance.C2SWrapper.registration_response:type_name -> tapdance.RegistrationResponse - 8, // 21: tapdance.RegistrationResponse.clientConf:type_name -> tapdance.ClientConf - 22, // [22:22] is the sub-list for method output_type - 22, // [22:22] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name -} - -func init() { file_signalling_proto_init() } -func file_signalling_proto_init() { - if File_signalling_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_signalling_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PubKey); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TLSDecoySpec); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientConf); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DecoyList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PhantomSubnetsList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PhantomSubnets); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebRTCICECandidate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebRTCSDP); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebRTCSignal); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StationToClient); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegistrationFlags); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientToStation); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*C2SWrapper); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SessionStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StationToDetector); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_signalling_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegistrationResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_signalling_proto_rawDesc, - NumEnums: 6, - NumMessages: 16, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_signalling_proto_goTypes, - DependencyIndexes: file_signalling_proto_depIdxs, - EnumInfos: file_signalling_proto_enumTypes, - MessageInfos: file_signalling_proto_msgTypes, - }.Build() - File_signalling_proto = out.File - file_signalling_proto_rawDesc = nil - file_signalling_proto_goTypes = nil - file_signalling_proto_depIdxs = nil -} \ No newline at end of file diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/TODO b/vendor/github.com/refraction-networking/gotapdance/tapdance/TODO deleted file mode 100644 index 6e3c787af..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/TODO +++ /dev/null @@ -1,4 +0,0 @@ -MED-LONG-NEVER TERM: -redo bandwidth tracking -redo tmp backoff -UDP diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/assets.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/assets.go index a731b4aa4..293beb909 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/assets.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/assets.go @@ -5,16 +5,16 @@ import ( "encoding/binary" "encoding/hex" "errors" - "io/ioutil" "net" "os" "path" "strings" "sync" - "github.com/golang/protobuf/proto" - pb "github.com/refraction-networking/gotapdance/protobuf" - ps "github.com/refraction-networking/gotapdance/tapdance/phantoms" + ps "github.com/refraction-networking/conjure/pkg/phantoms" + pb "github.com/refraction-networking/conjure/proto" + + "google.golang.org/protobuf/proto" ) type assets struct { @@ -39,6 +39,11 @@ var assetsOnce sync.Once // First access to singleton sets path. Assets(), if called // before SetAssetsDir() sets path to "./assets/" func Assets() *assets { + // We leave this warning here, because only Tapdance should + // use this instance. Conjure uses assets provided by + // github.com/refraction-networking/conjure/pkg/client/assets + // and this Assets (and Tapdance as a whole) is deprecated + Logger().Warnf("Loading TapDance Assets...(deprecated; use conjure assets)") var err error _initAssets := func() { err = initAssets("./assets/") } assetsOnce.Do(_initAssets) @@ -102,11 +107,28 @@ func initAssets(path string) error { defaultGeneration := uint32(1) defaultDecoyList := pb.DecoyList{TlsDecoys: defaultDecoys} + defaultDnsRegDomain := "r.refraction.network" + defaultDnsRegDohUrl := "https://1.1.1.1/dns-query" + defaultStunServer := "stun.voip.blackberry.com:3478" + defaultDnsRegPubkey := getDefaultKey() + defaultDnsRegUtlsDistribution := "3*Firefox_65,1*Firefox_63,1*iOS_12_1" + defaultDnsRegMethod := pb.DnsRegMethod_DOH + + defaultDnsRegConf := pb.DnsRegConf{ + DnsRegMethod: &defaultDnsRegMethod, + Target: &defaultDnsRegDohUrl, + Domain: &defaultDnsRegDomain, + Pubkey: defaultDnsRegPubkey, + UtlsDistribution: &defaultDnsRegUtlsDistribution, + StunServer: &defaultStunServer, + } + defaultClientConf := pb.ClientConf{ DecoyList: &defaultDecoyList, DefaultPubkey: &defaultPubKey, ConjurePubkey: &defaultConjurePubKey, Generation: &defaultGeneration, + DnsRegConf: &defaultDnsRegConf, } assetsInstance = &assets{ @@ -126,23 +148,29 @@ func (a *assets) GetAssetsDir() string { return a.path } +func (a *assets) GetDNSRegConf() *pb.DnsRegConf { + a.RLock() + defer a.RUnlock() + return a.config.DnsRegConf +} + func (a *assets) readConfigs() error { readRoots := func(filename string) error { - rootCerts, err := ioutil.ReadFile(filename) + rootCerts, err := os.ReadFile(filename) if err != nil { return err } roots := x509.NewCertPool() ok := roots.AppendCertsFromPEM(rootCerts) if !ok { - return errors.New("Failed to parse root certificates") + return errors.New("failed to parse root certificates") } a.roots = roots return nil } readClientConf := func(filename string) error { - buf, err := ioutil.ReadFile(filename) + buf, err := os.ReadFile(filename) if err != nil { return err } @@ -381,7 +409,7 @@ func (a *assets) saveClientConf() error { } filename := path.Join(a.path, a.filenameClientConf) tmpFilename := path.Join(a.path, "."+a.filenameClientConf+"."+getRandString(5)+".tmp") - err = ioutil.WriteFile(tmpFilename, buf[:], 0644) + err = os.WriteFile(tmpFilename, buf[:], 0644) if err != nil { return err } diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/common.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/common.go index d3128f511..d37bae0ad 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/common.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/common.go @@ -5,11 +5,12 @@ import ( "encoding/hex" "errors" "fmt" + "math" "os" "strconv" "time" - "github.com/refraction-networking/gotapdance/ed25519/extra25519" + "github.com/refraction-networking/ed25519/extra25519" "golang.org/x/crypto/curve25519" ) @@ -129,8 +130,9 @@ var default_flags = tdFlagUseTIL // // Requests station to send client's IP to covert in following form: // PROXY TCP4 x.x.x.x 127.0.0.1 1111 1234\r\n -// ^__^ ^_____^ ^_________________^ -// proto clientIP garbage +// +// ^__^ ^_____^ ^_________________^ +// proto clientIP garbage func EnableProxyProtocol() { Logger().Println("tapdance.EnableProxyProtocol() is deprecated, " + "use tapdance.Dialer with UseProxyHeader flag instead.") @@ -171,8 +173,9 @@ func WriteTlsLog(clientRandom, masterSecret []byte) error { // How much time to sleep on trying to connect to decoys to prevent overwhelming them func sleepBeforeConnect(attempt int) (waitTime <-chan time.Time) { - if attempt >= 6 { // return nil for first 6 attempts - waitTime = time.After(time.Second * 1) + if attempt >= 1 { + ms := math.Min(25*math.Pow(2, float64(attempt)), 15000) + waitTime = time.After(time.Duration(int(ms)) * time.Millisecond) } return } diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/conjure.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/conjure.go index 4b97a447a..9ac16b7f4 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/conjure.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/conjure.go @@ -1,30 +1,23 @@ package tapdance import ( - "bytes" "context" - "crypto/hmac" - "crypto/sha256" "encoding/binary" "encoding/hex" + "errors" "fmt" - "io" - "math/big" "net" - "net/http" "strconv" "sync" "time" - pt "git.torproject.org/pluggable-transports/goptlib.git" - "github.com/golang/protobuf/proto" - pb "github.com/refraction-networking/gotapdance/protobuf" - ps "github.com/refraction-networking/gotapdance/tapdance/phantoms" - tls "github.com/refraction-networking/utls" - "gitlab.com/yawning/obfs4.git/common/ntor" - "gitlab.com/yawning/obfs4.git/transports/obfs4" - "golang.org/x/crypto/curve25519" - "golang.org/x/crypto/hkdf" + "github.com/refraction-networking/conjure/pkg/core" + "github.com/refraction-networking/conjure/pkg/core/interfaces" + ps "github.com/refraction-networking/conjure/pkg/phantoms" + pb "github.com/refraction-networking/conjure/proto" + ca "github.com/refraction-networking/conjure/pkg/client/assets" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/anypb" ) // V6 - Struct to track V6 support and cache result across sessions @@ -33,268 +26,23 @@ type V6 struct { include uint } -// Registrar defines the interface for a service executing -// decoy registrations. -type Registrar interface { - Register(*ConjureSession, context.Context) (*ConjureReg, error) -} - -type DecoyRegistrar struct { - - // TcpDialer is a custom TCP dailer to use when establishing TCP connections - // to decoys. When nil, Dialer.TcpDialer will be used. - TcpDialer func(context.Context, string, string) (net.Conn, error) -} - -func (r DecoyRegistrar) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error) { - Logger().Debugf("%v Registering V4 and V6 via DecoyRegistrar", cjSession.IDString()) - - // Choose N (width) decoys from decoylist - decoys, err := SelectDecoys(cjSession.Keys.SharedSecret, cjSession.V6Support.include, cjSession.Width) - if err != nil { - Logger().Warnf("%v failed to select decoys: %v", cjSession.IDString(), err) - return nil, err - } - cjSession.RegDecoys = decoys - - phantom4, phantom6, err := SelectPhantom(cjSession.Keys.ConjureSeed, cjSession.V6Support.include) - if err != nil { - Logger().Warnf("%v failed to select Phantom: %v", cjSession.IDString(), err) - return nil, err - } - - //[reference] Prepare registration - reg := &ConjureReg{ - sessionIDStr: cjSession.IDString(), - keys: cjSession.Keys, - stats: &pb.SessionStats{}, - phantom4: phantom4, - phantom6: phantom6, - v6Support: cjSession.V6Support.include, - covertAddress: cjSession.CovertAddress, - transport: cjSession.Transport, - TcpDialer: cjSession.TcpDialer, - useProxyHeader: cjSession.UseProxyHeader, - } - - if r.TcpDialer != nil { - reg.TcpDialer = r.TcpDialer - } - - // //[TODO]{priority:later} How to pass context to multiple registration goroutines? - if ctx == nil { - ctx = context.Background() - } - - width := uint(len(cjSession.RegDecoys)) - if width < cjSession.Width { - Logger().Warnf("%v Using width %v (default %v)", cjSession.IDString(), width, cjSession.Width) - } - - Logger().Debugf("%v Registration - v6:%v, covert:%v, phantoms:%v,[%v], width:%v, transport:%v", - reg.sessionIDStr, - reg.v6SupportStr(), - reg.covertAddress, - reg.phantom4.String(), - reg.phantom6.String(), - cjSession.Width, - cjSession.Transport, - ) - - //[reference] Send registrations to each decoy - dialErrors := make(chan error, width) - for _, decoy := range cjSession.RegDecoys { - Logger().Debugf("%v Sending Reg: %v, %v", cjSession.IDString(), decoy.GetHostname(), decoy.GetIpAddrStr()) - //decoyAddr := decoy.GetIpAddrStr() - - // [Psiphon] - // - // Workaround: reference and pass in reg.TcpDialer rather than wait - // and reference it within reg.send in the goroutine. This allows - // gotapdance users to clear and reset the TcpDialer field for cached - // ConjureRegs without risking a race condition or nil pointer - // dereference. These conditions otherwise arise as reg.send - // goroutines can remain running, and reference reg.TcpDialer, after - // Register returns -- the point at which gotapdance users may cache - // the ConjureReg. - - go reg.send(ctx, decoy, reg.TcpDialer, dialErrors, cjSession.registrationCallback) - } - - //[reference] Dial errors happen immediately so block until all N dials complete - var unreachableCount uint = 0 - for err := range dialErrors { - if err != nil { - Logger().Debugf("%v %v", cjSession.IDString(), err) - if dialErr, ok := err.(RegError); ok && dialErr.code == Unreachable { - // If we failed because ipv6 network was unreachable try v4 only. - unreachableCount++ - if unreachableCount < width { - continue - } else { - break - } - } - } - //[reference] if we succeed or fail for any other reason then the network is reachable and we can continue - break - } - - //[reference] if ALL fail to dial return error (retry in parent if ipv6 unreachable) - if unreachableCount == width { - Logger().Debugf("%v NETWORK UNREACHABLE", cjSession.IDString()) - return nil, &RegError{code: Unreachable, msg: "All decoys failed to register -- Dial Unreachable"} - } - - // randomized sleeping here to break the intraflow signal - toSleep := reg.getRandomDuration(3000, 212, 3449) - Logger().Debugf("%v Successfully sent registrations, sleeping for: %v", cjSession.IDString(), toSleep) - sleepWithContext(ctx, toSleep) - - return reg, nil -} - -// Registration strategy using a centralized REST API to -// create registrations. Only the Endpoint need be specified; -// the remaining fields are valid with their zero values and -// provide the opportunity for additional control over the process. -type APIRegistrar struct { - // Endpoint to use in registration request - Endpoint string - - // HTTP client to use in request - Client *http.Client - - // Length of time to delay after confirming successful - // registration before attempting a connection, - // allowing for propagation throughout the stations. - ConnectionDelay time.Duration - - // Maximum number of retries before giving up - MaxRetries int - - // A secondary registration method to use on failure. - // Because the API registration can give us definite - // indication of a failure to register, this can be - // used as a "backup" in the case of the API being - // down or being blocked. - // - // If this field is nil, no secondary registration will - // be attempted. If it is non-nil, after failing to register - // (retrying MaxRetries times) we will fall back to - // the Register method on this field. - SecondaryRegistrar Registrar -} - -func (r APIRegistrar) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error) { - Logger().Debugf("%v registering via APIRegistrar", cjSession.IDString()) - // TODO: this section is duplicated from DecoyRegistrar; consider consolidating - phantom4, phantom6, err := SelectPhantom(cjSession.Keys.ConjureSeed, cjSession.V6Support.include) - if err != nil { - Logger().Warnf("%v failed to select Phantom: %v", cjSession.IDString(), err) - return nil, err - } - - // [reference] Prepare registration - reg := &ConjureReg{ - sessionIDStr: cjSession.IDString(), - keys: cjSession.Keys, - stats: &pb.SessionStats{}, - phantom4: phantom4, - phantom6: phantom6, - v6Support: cjSession.V6Support.include, - covertAddress: cjSession.CovertAddress, - transport: cjSession.Transport, - TcpDialer: cjSession.TcpDialer, - useProxyHeader: cjSession.UseProxyHeader, - } - - c2s := reg.generateClientToStation() - - protoPayload := pb.C2SWrapper{ - SharedSecret: cjSession.Keys.SharedSecret, - RegistrationPayload: c2s, - } - - payload, err := proto.Marshal(&protoPayload) - if err != nil { - Logger().Warnf("%v failed to marshal ClientToStation payload: %v", cjSession.IDString(), err) - return nil, err - } - - if r.Client == nil { - // Transports should ideally be re-used for TCP connection pooling, - // but each registration is most likely making precisely one request, - // or if it's making more than one, is most likely due to an underlying - // connection issue rather than an application-level error anyways. - t := http.DefaultTransport.(*http.Transport).Clone() - t.DialContext = reg.TcpDialer - r.Client = &http.Client{Transport: t} - } - - tries := 0 - for tries < r.MaxRetries+1 { - tries++ - err = r.executeHTTPRequest(ctx, cjSession, payload) - if err == nil { - Logger().Debugf("%v API registration succeeded", cjSession.IDString()) - if r.ConnectionDelay != 0 { - Logger().Debugf("%v sleeping for %v", cjSession.IDString(), r.ConnectionDelay) - sleepWithContext(ctx, r.ConnectionDelay) - } - return reg, nil - } - Logger().Warnf("%v failed API registration, attempt %d/%d", cjSession.IDString(), tries, r.MaxRetries+1) - } - - // If we make it here, we failed API registration - Logger().Warnf("%v giving up on API registration", cjSession.IDString()) - - if r.SecondaryRegistrar != nil { - Logger().Debugf("%v trying secondary registration method", cjSession.IDString()) - return r.SecondaryRegistrar.Register(cjSession, ctx) - } - - return nil, err -} - -func (r APIRegistrar) executeHTTPRequest(ctx context.Context, cjSession *ConjureSession, payload []byte) error { - req, err := http.NewRequestWithContext(ctx, "POST", r.Endpoint, bytes.NewReader(payload)) - if err != nil { - Logger().Warnf("%v failed to create HTTP request to registration endpoint %s: %v", cjSession.IDString(), r.Endpoint, err) - return err - } - - resp, err := r.Client.Do(req) - if err != nil { - Logger().Warnf("%v failed to do HTTP request to registration endpoint %s: %v", cjSession.IDString(), r.Endpoint, err) - return err - } - defer resp.Body.Close() - - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - Logger().Warnf("%v got non-success response code %d from registration endpoint %v", cjSession.IDString(), resp.StatusCode, r.Endpoint) - return fmt.Errorf("non-success response code %d on %s", resp.StatusCode, r.Endpoint) - } - - return nil -} - const ( v4 uint = iota v6 both ) -//[TODO]{priority:winter-break} make this not constant -const defaultRegWidth = 5 - -// DialConjureAddr - Perform Registration and Dial after creating a Conjure session from scratch -func DialConjureAddr(ctx context.Context, address string, registrationMethod Registrar) (net.Conn, error) { - cjSession := makeConjureSession(address, pb.TransportType_Min) - return DialConjure(ctx, cjSession, registrationMethod) +// Include returns a private field of the V6 Support struct. +func (v *V6) Include() uint { + if v == nil { + return 0 + } + return v.include } +// [TODO]{priority:winter-break} make this not constant +const defaultRegWidth = 5 + // DialConjure - Perform Registration and Dial on an existing Conjure session func DialConjure(ctx context.Context, cjSession *ConjureSession, registrationMethod Registrar) (net.Conn, error) { @@ -302,19 +50,38 @@ func DialConjure(ctx context.Context, cjSession *ConjureSession, registrationMet return nil, fmt.Errorf("No Session Provided") } - cjSession.setV6Support(both) + err := cjSession.Transport.Prepare(ctx, cjSession.Dialer) + if err != nil { + return nil, err + } + //cjSession.setV6Support(both) // We don't want to override this here; defaults set in MakeConjureSession + // Prepare registrar specific keys + registrationMethod.PrepareRegKeys(getStationKey(), cjSession.Keys.SharedSecret) // Choose Phantom Address in Register depending on v6 support. + registration, err := registrationMethod.Register(cjSession, ctx) if err != nil { Logger().Debugf("%v Failed to register: %v", cjSession.IDString(), err) return nil, err } - Logger().Debugf("%v Attempting to Connect ...", cjSession.IDString()) + // registration, ok := reg.(*ConjureReg) + // if !ok { + // return nil, fmt.Errorf("Unknown registration Returned") + // } - return registration.Connect(ctx) - // return Connect(cjSession) + tp, isconnecting := cjSession.Transport.(interfaces.ConnectingTransport) + if isconnecting { + if tp.DisableRegDelay() { + cjSession.RegDelay = 0 + } + } + + sleepWithContext(ctx, cjSession.RegDelay) + + Logger().Debugf("%v Attempting to Connect using %s libcj_v%d...", cjSession.IDString(), registration.Transport.Name(), core.CurrentClientLibraryVersion()) + return registration.Connect(ctx, cjSession.Dialer) } // // testV6 -- This is over simple and incomplete (currently unused) @@ -344,63 +111,111 @@ func DialConjure(ctx context.Context, cjSession *ConjureSession, registrationMet // } // } -// Connect - Dial the Phantom IP address after registration -func Connect(ctx context.Context, reg *ConjureReg) (net.Conn, error) { - return reg.Connect(ctx) -} - // ConjureSession - Create a session with details for registration and connection type ConjureSession struct { - Keys *sharedKeys - Width uint + Keys *core.SharedKeys V6Support *V6 UseProxyHeader bool SessionID uint64 - RegDecoys []*pb.TLSDecoySpec // pb.DecoyList Phantom *net.IP - Transport pb.TransportType + Transport Transport CovertAddress string // rtt uint // tracked in stats + DisableRegistrarOverrides bool + + // TcpDialer allows the caller to provide a custom dialer for outgoing proxy connections. + // // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. - TcpDialer func(context.Context, string, string) (net.Conn, error) + Dialer dialFunc + + // RegDelay is the delay duration to wait for registration ingest. + RegDelay time.Duration // performance tracking stats *pb.SessionStats } -func makeConjureSession(covert string, transport pb.TransportType) *ConjureSession { +// MakeConjureSessionSilent creates a conjure session without logging anything +func MakeConjureSessionSilent(covert string, transport Transport) *ConjureSession { + keys, err := core.GenerateClientSharedKeys(getStationKey()) - keys, err := generateSharedKeys(getStationKey()) if err != nil { return nil } //[TODO]{priority:NOW} move v6support initialization to assets so it can be tracked across dials cjSession := &ConjureSession{ - Keys: keys, - Width: defaultRegWidth, - V6Support: &V6{support: true, include: both}, - UseProxyHeader: false, - Transport: transport, - CovertAddress: covert, - SessionID: sessionsTotal.GetAndInc(), + Keys: keys, + V6Support: &V6{support: true, include: both}, + UseProxyHeader: false, + Transport: transport, + CovertAddress: covert, + SessionID: sessionsTotal.GetAndInc(), + DisableRegistrarOverrides: false, } + return cjSession +} + +func LogConjureSession(cjSession *ConjureSession) { + + keys := cjSession.Keys + sharedSecretStr := make([]byte, hex.EncodedLen(len(keys.SharedSecret))) hex.Encode(sharedSecretStr, keys.SharedSecret) Logger().Debugf("%v Shared Secret - %s", cjSession.IDString(), sharedSecretStr) - Logger().Debugf("%v covert %s", cjSession.IDString(), covert) + Logger().Debugf("%v covert %s", cjSession.IDString(), cjSession.CovertAddress) reprStr := make([]byte, hex.EncodedLen(len(keys.Representative))) hex.Encode(reprStr, keys.Representative) Logger().Debugf("%v Representative - %s", cjSession.IDString(), reprStr) +} + +func MakeConjureSession(covert string, transport Transport) *ConjureSession { + + cjSession := MakeConjureSessionSilent(covert, transport) + if cjSession == nil { + return nil + } + + // Print out the session details (debug) + LogConjureSession(cjSession) + return cjSession } +func FindConjureSessionInRange(covert string, transport Transport, phantomSubnet *net.IPNet) *ConjureSession { + + count := 0 + Logger().Debugf("Searching for a seed for phantom subnet %v...", phantomSubnet) + for count < 100000 { + // Generate a random session + cjSession := MakeConjureSessionSilent(covert, transport) + count += 1 + + // Get the phantoms this seed would generate + phantom4, phantom6, _, err := SelectPhantom(cjSession.Keys.ConjureSeed, cjSession.V6Support.include) + if err != nil { + Logger().Warnf("%v failed to select Phantom: %v", cjSession.IDString(), err) + } + + // See if our phantoms are in the subnet + if phantomSubnet.Contains(*phantom4) || phantomSubnet.Contains(*phantom6) { + Logger().Debugf("Generated %d sessions to find one in %v", count, phantomSubnet) + // Print out what we got + LogConjureSession(cjSession) + + return cjSession + } + } + Logger().Warnf("Failed to find a session in %v", phantomSubnet) + return nil +} + // IDString - Get the ID string for the session func (cjSession *ConjureSession) IDString() string { if cjSession.Keys == nil || cjSession.Keys.SharedSecret == nil { @@ -421,36 +236,129 @@ func (cjSession *ConjureSession) String() string { // expand for debug?? } +// conjureReg generates ConjureReg from the corresponding ConjureSession +func (cjSession *ConjureSession) conjureReg() *ConjureReg { + return &ConjureReg{ + ConjureSession: cjSession, + sessionIDStr: cjSession.IDString(), + keys: cjSession.Keys, + stats: &pb.SessionStats{}, + v6Support: cjSession.V6Support.include, + covertAddress: cjSession.CovertAddress, + Transport: cjSession.Transport, + Dialer: removeLaddr(cjSession.Dialer), + useProxyHeader: cjSession.UseProxyHeader, + } +} + +// BidirectionalRegData returns a C2SWrapper for bidirectional registration +func (cjSession *ConjureSession) BidirectionalRegData(ctx context.Context, regSource *pb.RegistrationSource) (*ConjureReg, *pb.C2SWrapper, error) { + reg := cjSession.conjureReg() + + c2s, err := reg.generateClientToStation(ctx) + if err != nil { + return nil, nil, err + } + + return reg, &pb.C2SWrapper{ + SharedSecret: cjSession.Keys.SharedSecret, + RegistrationPayload: c2s, + RegistrationSource: regSource, + }, nil + +} + +// UnidirectionalRegData returns a C2SWrapper for unidirectional registration +func (cjSession *ConjureSession) UnidirectionalRegData(ctx context.Context, regSource *pb.RegistrationSource) (*ConjureReg, *pb.C2SWrapper, error) { + reg := cjSession.conjureReg() + + phantom4, phantom6, supportRandomPort, err := SelectPhantom(cjSession.Keys.ConjureSeed, cjSession.V6Support.include) + if err != nil { + Logger().Warnf("%v failed to select Phantom: %v", cjSession.IDString(), err) + return nil, nil, err + } + + reg.phantom4 = phantom4 + reg.phantom6 = phantom6 + + if supportRandomPort { + reg.phantomDstPort, err = cjSession.Transport.GetDstPort(reg.keys.ConjureSeed) + if err != nil { + return nil, nil, err + } + } else { + reg.phantomDstPort = 443 + } + + c2s, err := reg.generateClientToStation(ctx) + if err != nil { + return nil, nil, err + } + + return reg, &pb.C2SWrapper{ + SharedSecret: cjSession.Keys.SharedSecret, + RegistrationPayload: c2s, + RegistrationSource: regSource, + }, nil +} + +// GetV6Support created for the sake of removing ConjureReg +func (cjSession *ConjureSession) GetV6Support() *bool { + support := true + if cjSession.V6Support.include == v4 { + support = false + } + return &support +} + +// GetV4Support created for the sake of removing ConjureReg +func (cjSession *ConjureSession) GetV4Support() *bool { + // for now return true and register both + support := true + if cjSession.V6Support.include == v6 { + support = false + } + return &support +} + +// GetV6Include - returns the Include var of the clients V6 support +func (cjSession *ConjureSession) GetV6Include() uint { + return cjSession.V6Support.include +} + type resultTuple struct { conn net.Conn err error } // Simple type alias for brevity -type dialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) +type dialFunc = func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) func (reg *ConjureReg) connect(ctx context.Context, addr string, dialer dialFunc) (net.Conn, error) { //[reference] Create Context with deadline deadline, deadlineAlreadySet := ctx.Deadline() if !deadlineAlreadySet { //[reference] randomized timeout to Dial dark decoy address - deadline = time.Now().Add(reg.getRandomDuration(0, 1061*2, 1953*3)) - //[TODO]{priority:@sfrolov} explain these numbers and why they were chosen for the boundaries. + deadline = time.Now().Add(reg.GetRandomDuration(0, 1461*2, 2453*3)) } childCtx, childCancelFunc := context.WithDeadline(ctx, deadline) defer childCancelFunc() //[reference] Connect to Phantom Host - phantomAddr := net.JoinHostPort(addr, "443") + phantomAddr := net.JoinHostPort(addr, strconv.Itoa(int(reg.phantomDstPort))) - // conn, err := reg.TcpDialer(childCtx, "tcp", phantomAddr) - return dialer(childCtx, "tcp", phantomAddr) + // conn, err := reg.Dialer(childCtx, "tcp", phantomAddr) + return dialer(childCtx, "tcp", "", phantomAddr) } +// ErrNoOpenConns indicates that the client Failed to establish a connection with any phantom addr +var ErrNoOpenConns = errors.New("no open connections") + func (reg *ConjureReg) getFirstConnection(ctx context.Context, dialer dialFunc, phantoms []*net.IP) (net.Conn, error) { connChannel := make(chan resultTuple, len(phantoms)) for _, p := range phantoms { if p == nil { + connChannel <- resultTuple{nil, fmt.Errorf("nil addr")} continue } go func(phantom *net.IP) { @@ -460,7 +368,7 @@ func (reg *ConjureReg) getFirstConnection(ctx context.Context, dialer dialFunc, connChannel <- resultTuple{nil, err} return } - Logger().Infof("%v Connected to phantom %v using transport %d", reg.sessionIDStr, phantom.String(), reg.transport) + Logger().Infof("%v Connected to phantom %v using transport %s", reg.sessionIDStr, net.JoinHostPort(phantom.String(), strconv.Itoa(int(reg.phantomDstPort))), reg.Transport) connChannel <- resultTuple{conn, nil} }(p) } @@ -489,250 +397,158 @@ func (reg *ConjureReg) getFirstConnection(ctx context.Context, dialer dialFunc, return rt.conn, nil } - return nil, fmt.Errorf("no open connections") + return nil, ErrNoOpenConns } // Connect - Use a registration (result of calling Register) to connect to a phantom // Note: This is hacky but should work for v4, v6, or both as any nil phantom addr will // return a dial error and be ignored. -func (reg *ConjureReg) Connect(ctx context.Context) (net.Conn, error) { +func (reg *ConjureReg) Connect(ctx context.Context, dialer dialFunc) (net.Conn, error) { phantoms := []*net.IP{reg.phantom4, reg.phantom6} - //[reference] Provide chosen transport to sent bytes (or connect) if necessary - switch reg.transport { - case pb.TransportType_Min: - conn, err := reg.getFirstConnection(ctx, reg.TcpDialer, phantoms) + // Prepare the transport by generating any necessary keys + pubKey := getStationKey() + reg.Transport.PrepareKeys(pubKey, reg.keys.SharedSecret, reg.keys.Reader) + + switch transport := reg.Transport.(type) { + case interfaces.WrappingTransport: + conn, err := reg.getFirstConnection(ctx, dialer, phantoms) if err != nil { Logger().Infof("%v failed to form phantom connection: %v", reg.sessionIDStr, err) return nil, err } - // Send hmac(seed, str) bytes to indicate to station (min transport) - connectTag := conjureHMAC(reg.keys.SharedSecret, "MinTrasportHMACString") - conn.Write(connectTag) - return conn, nil - - case pb.TransportType_Obfs4: - args := pt.Args{} - args.Add("node-id", reg.keys.Obfs4Keys.NodeID.Hex()) - args.Add("public-key", reg.keys.Obfs4Keys.PublicKey.Hex()) - args.Add("iat-mode", "1") - - Logger().Infof("%v node_id = %s; public key = %s", reg.sessionIDStr, reg.keys.Obfs4Keys.NodeID.Hex(), reg.keys.Obfs4Keys.PublicKey.Hex()) - - t := obfs4.Transport{} - c, err := t.ClientFactory("") + conn, err = transport.WrapConn(conn) if err != nil { - Logger().Infof("%v failed to create client factory: %v", reg.sessionIDStr, err) + Logger().Infof("WrapConn failed") return nil, err } - parsedArgs, err := c.ParseArgs(&args) + return conn, nil + case interfaces.ConnectingTransport: + transportDialer, err := transport.WrapDial(dialer) if err != nil { - Logger().Infof("%v failed to parse obfs4 args: %v", reg.sessionIDStr, err) - return nil, err - } - - dialer := func(dialContext context.Context, network string, address string) (net.Conn, error) { - d := func(network, address string) (net.Conn, error) { return reg.TcpDialer(dialContext, network, address) } - return c.Dial("tcp", address, d, parsedArgs) + return nil, fmt.Errorf("error wrapping transport dialer: %v", err) } - conn, err := reg.getFirstConnection(ctx, dialer, phantoms) + conn, err := reg.getFirstConnection(ctx, transportDialer, phantoms) if err != nil { - Logger().Infof("%v failed to form obfs4 connection: %v", reg.sessionIDStr, err) - return nil, err + return nil, fmt.Errorf("failed to dialing connecting transport: %v", err) } - return conn, err - case pb.TransportType_Null: - // Dial and do nothing to the connection before returning it to the user. - return reg.getFirstConnection(ctx, reg.TcpDialer, phantoms) - default: - // If transport is unrecognized use min transport. - return nil, fmt.Errorf("unknown transport") + return conn, nil } + + return nil, fmt.Errorf("transport does not implement any transport interface") } // ConjureReg - Registration structure created for each individual registration within a session. type ConjureReg struct { + Transport + *ConjureSession + seed []byte sessionIDStr string phantom4 *net.IP phantom6 *net.IP + phantomDstPort uint16 useProxyHeader bool covertAddress string phantomSNI string v6Support uint - transport pb.TransportType // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. - TcpDialer func(context.Context, string, string) (net.Conn, error) + Dialer func(context.Context, string, string) (net.Conn, error) stats *pb.SessionStats - keys *sharedKeys + keys *core.SharedKeys m sync.Mutex } -func (reg *ConjureReg) createRequest(tlsConn *tls.UConn, decoy *pb.TLSDecoySpec) ([]byte, error) { - //[reference] generate and encrypt variable size payload - vsp, err := reg.generateVSP() - if err != nil { - return nil, err - } - if len(vsp) > int(^uint16(0)) { - return nil, fmt.Errorf("Variable-Size Payload exceeds %v", ^uint16(0)) - } - encryptedVsp, err := aesGcmEncrypt(vsp, reg.keys.VspKey, reg.keys.VspIv) - if err != nil { - return nil, err - } - - //[reference] generate and encrypt fixed size payload - fsp := reg.generateFSP(uint16(len(encryptedVsp))) - encryptedFsp, err := aesGcmEncrypt(fsp, reg.keys.FspKey, reg.keys.FspIv) - if err != nil { - return nil, err - } - - var tag []byte // tag will be base-64 style encoded - tag = append(encryptedVsp, reg.keys.Representative...) - tag = append(tag, encryptedFsp...) - - httpRequest := generateHTTPRequestBeginning(decoy.GetHostname()) - keystreamOffset := len(httpRequest) - keystreamSize := (len(tag)/3+1)*4 + keystreamOffset // we can't use first 2 bits of every byte - wholeKeystream, err := tlsConn.GetOutKeystream(keystreamSize) - if err != nil { - return nil, err - } - keystreamAtTag := wholeKeystream[keystreamOffset:] - httpRequest = append(httpRequest, reverseEncrypt(tag, keystreamAtTag)...) - httpRequest = append(httpRequest, []byte("\r\n\r\n")...) - return httpRequest, nil -} - -// Being called in parallel -> no changes to ConjureReg allowed in this function -func (reg *ConjureReg) send(ctx context.Context, decoy *pb.TLSDecoySpec, dialer dialFunc, dialError chan error, callback func(*ConjureReg)) { - - deadline, deadlineAlreadySet := ctx.Deadline() - if !deadlineAlreadySet { - deadline = time.Now().Add(getRandomDuration(deadlineTCPtoDecoyMin, deadlineTCPtoDecoyMax)) - } - childCtx, childCancelFunc := context.WithDeadline(ctx, deadline) - defer childCancelFunc() - - //[reference] TCP to decoy - tcpToDecoyStartTs := time.Now() - - //[Note] decoy.GetIpAddrStr() will get only v4 addr if a decoy has both - dialConn, err := dialer(childCtx, "tcp", decoy.GetIpAddrStr()) - - reg.setTCPToDecoy(durationToU32ptrMs(time.Since(tcpToDecoyStartTs))) - if err != nil { - if opErr, ok := err.(*net.OpError); ok && opErr.Err.Error() == "connect: network is unreachable" { - dialError <- RegError{msg: err.Error(), code: Unreachable} - return - } - dialError <- err - return - } - - //[reference] connection stats tracking - rtt := rttInt(uint32(time.Since(tcpToDecoyStartTs).Milliseconds())) - delay := getRandomDuration(1061*rtt*2, 1953*rtt*3) //[TODO]{priority:@sfrolov} why these values?? - TLSDeadline := time.Now().Add(delay) - - tlsToDecoyStartTs := time.Now() - tlsConn, err := reg.createTLSConn(dialConn, decoy.GetIpAddrStr(), decoy.GetHostname(), TLSDeadline) - if err != nil { - dialConn.Close() - msg := fmt.Sprintf("%v - %v createConn: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) - dialError <- RegError{msg: msg, code: TLSError} - return - } - reg.setTLSToDecoy(durationToU32ptrMs(time.Since(tlsToDecoyStartTs))) - - //[reference] Create the HTTP request for the registration - httpRequest, err := reg.createRequest(tlsConn, decoy) - if err != nil { - msg := fmt.Sprintf("%v - %v createReq: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) - dialError <- RegError{msg: msg, code: TLSError} - return - } - - //[reference] Write reg into conn - _, err = tlsConn.Write(httpRequest) - if err != nil { - // // This will not get printed because it is executed in a goroutine. - // Logger().Errorf("%v - %v Could not send Conjure registration request, error: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) - tlsConn.Close() - msg := fmt.Sprintf("%v - %v Write: %v", decoy.GetHostname(), decoy.GetIpAddrStr(), err.Error()) - dialError <- RegError{msg: msg, code: TLSError} - return +// UnpackRegResp unpacks the RegistrationResponse message sent back by the station. This unpacks +// any field overrides sent by the registrar. When using a bidirectional registration method +// the server chooses the phantom IP and Port by default. Overrides to transport parameters +// are applied when reg.DisableRegistrarOverrides is false. +func (reg *ConjureReg) UnpackRegResp(regResp *pb.RegistrationResponse) error { + if regResp == nil { + return nil } - - dialError <- nil - readAndClose(dialConn, time.Second*15) - callback(reg) -} - -func (reg *ConjureReg) createTLSConn(dialConn net.Conn, address string, hostname string, deadline time.Time) (*tls.UConn, error) { - var err error - //[reference] TLS to Decoy - config := tls.Config{ServerName: hostname} - if config.ServerName == "" { - // if SNI is unset -- try IP - config.ServerName, _, err = net.SplitHostPort(address) + if reg.v6Support == v4 { + // Save the ipv4address in the Conjure Reg struct (phantom4) to return + ip4 := make(net.IP, 4) + addr4 := regResp.GetIpv4Addr() + binary.BigEndian.PutUint32(ip4, addr4) + reg.phantom4 = &ip4 + } else if reg.v6Support == v6 { + // Save the ipv6address in the Conjure Reg struct (phantom6) to return + addr6 := net.IP(regResp.GetIpv6Addr()) + reg.phantom6 = &addr6 + } else { + // Case where cjSession.V6Support == both + // Save the ipv4address in the Conjure Reg struct (phantom4) to return + ip4 := make(net.IP, 4) + addr4 := regResp.GetIpv4Addr() + binary.BigEndian.PutUint32(ip4, addr4) + reg.phantom4 = &ip4 + + // Save the ipv6address in the Conjure Reg struct (phantom6) to return + addr6 := net.IP(regResp.GetIpv6Addr()) + reg.phantom6 = &addr6 + } + + p := uint16(regResp.GetDstPort()) + if p != 0 { + reg.phantomDstPort = p + } else if reg.phantomDstPort == 0 { + // If a bidirectional registrar does not support randomization (or doesn't set the port in the + // registration response we default to the original port we used for all transports). + reg.phantomDstPort = 443 + } + + maybeTP := regResp.GetTransportParams() + if maybeTP != nil && !reg.DisableRegistrarOverrides { + // If an error occurs while setting transport parameters give up as continuing would likely + // lead to incongruence between the client and station and an unserviceable connection. + err := reg.Transport.SetSessionParams(maybeTP, true) if err != nil { - return nil, err + return fmt.Errorf("Param Parse error: %w", err) + } + } else if maybeTP != nil && reg.DisableRegistrarOverrides { + return fmt.Errorf("registrar failed to respect disabled overrides") + } + + // Client config -- check if not nil in the registration response + if regResp.GetClientConf() != nil { + currGen := ca.Assets().GetGeneration() + incomingGen := regResp.GetClientConf().GetGeneration() + Logger().Debugf("received clientconf in regResponse w/ gen %d", incomingGen) + if currGen < incomingGen { + Logger().Debugf("Updating clientconf %d -> %d", currGen, incomingGen) + _err := ca.Assets().SetClientConf(regResp.GetClientConf()) + if _err != nil { + Logger().Warnf("could not set ClientConf in bidirectional API: %v", _err.Error()) + } } - Logger().Debugf("%v SNI was nil. Setting it to %v ", reg.sessionIDStr, config.ServerName) - } - //[TODO]{priority:medium} parroting Chrome 62 ClientHello -- parrot newer. - tlsConn := tls.UClient(dialConn, &config, tls.HelloChrome_62) - err = tlsConn.BuildHandshakeState() - if err != nil { - return nil, err - } - err = tlsConn.MarshalClientHello() - if err != nil { - return nil, err - } - - tlsConn.SetDeadline(deadline) - err = tlsConn.Handshake() - if err != nil { - return nil, err } - return tlsConn, nil + return nil } -func (reg *ConjureReg) setTCPToDecoy(tcprtt *uint32) { - reg.m.Lock() - defer reg.m.Unlock() - - if reg.stats == nil { - reg.stats = &pb.SessionStats{} - } - reg.stats.TcpToDecoy = tcprtt +func (reg *ConjureReg) getPbTransport() pb.TransportType { + return reg.Transport.ID() } -func (reg *ConjureReg) setTLSToDecoy(tlsrtt *uint32) { - reg.m.Lock() - defer reg.m.Unlock() - - if reg.stats == nil { - reg.stats = &pb.SessionStats{} +func (reg *ConjureReg) getPbTransportParams() (*anypb.Any, error) { + var m proto.Message + m, err := reg.Transport.GetParams() + if err != nil { + return nil, err + } else if m == nil { + return nil, nil } - reg.stats.TlsToDecoy = tlsrtt -} - -func (reg *ConjureReg) getPbTransport() pb.TransportType { - return pb.TransportType(reg.transport) + return anypb.New(m) } func (reg *ConjureReg) generateFlags() *pb.RegistrationFlags { @@ -753,7 +569,7 @@ func (reg *ConjureReg) generateFlags() *pb.RegistrationFlags { return flags } -func (reg *ConjureReg) generateClientToStation() *pb.ClientToStation { +func (reg *ConjureReg) generateClientToStation(ctx context.Context) (*pb.ClientToStation, error) { var covert *string if len(reg.covertAddress) > 0 { //[TODO]{priority:medium} this isn't the correct place to deal with signaling to the station @@ -763,16 +579,30 @@ func (reg *ConjureReg) generateClientToStation() *pb.ClientToStation { //[reference] Generate ClientToStation protobuf // transition := pb.C2S_Transition_C2S_SESSION_INIT - currentGen := Assets().GetGeneration() + currentGen := ca.Assets().GetGeneration() + currentLibVer := core.CurrentClientLibraryVersion() transport := reg.getPbTransport() + + transportParams, err := reg.getPbTransportParams() + if err != nil { + Logger().Debugf("%s failed to marshal transport parameters ", reg.sessionIDStr) + } + + // remove type url to save space for DNS registration + // for server side changes see https://github.com/refraction-networking/conjure/pull/163 + transportParams.TypeUrl = "" + initProto := &pb.ClientToStation{ + ClientLibVersion: ¤tLibVer, CovertAddress: covert, DecoyListGeneration: ¤tGen, - V6Support: reg.getV6Support(), - V4Support: reg.getV4Support(), + V6Support: reg.ConjureSession.GetV6Support(), + V4Support: reg.ConjureSession.GetV4Support(), Transport: &transport, Flags: reg.generateFlags(), - // StateTransition: &transition, + TransportParams: transportParams, + + DisableRegistrarOverrides: ®.ConjureSession.DisableRegistrarOverrides, //[TODO]{priority:medium} specify width in C2S because different width might // be useful in different regions (constant for now.) @@ -786,36 +616,7 @@ func (reg *ConjureReg) generateClientToStation() *pb.ClientToStation { initProto.Padding = append(initProto.Padding, byte(0)) } - return initProto -} - -func (reg *ConjureReg) generateVSP() ([]byte, error) { - //[reference] Marshal ClientToStation protobuf - return proto.Marshal(reg.generateClientToStation()) -} - -func (reg *ConjureReg) generateFSP(espSize uint16) []byte { - buf := make([]byte, 6) - binary.BigEndian.PutUint16(buf[0:2], espSize) - - return buf -} - -func (reg *ConjureReg) getV4Support() *bool { - // for now return true and register both - support := true - if reg.v6Support == v6 { - support = false - } - return &support -} - -func (reg *ConjureReg) getV6Support() *bool { - support := true - if reg.v6Support == v4 { - support = false - } - return &support + return initProto, nil } func (reg *ConjureReg) v6SupportStr() string { @@ -831,6 +632,16 @@ func (reg *ConjureReg) v6SupportStr() string { } } +// Phantom4 returns the ipv4 phantom address +func (reg *ConjureReg) Phantom4() net.IP { + return *reg.phantom4 +} + +// Phantom6 returns the ipv6 phantom address +func (reg *ConjureReg) Phantom6() net.IP { + return *reg.phantom6 +} + func (reg *ConjureReg) digestStats() string { //[TODO]{priority:eventually} add decoy details to digest if reg == nil || reg.stats == nil { @@ -845,23 +656,6 @@ func (reg *ConjureReg) digestStats() string { reg.stats.GetTotalTimeToConnect()) } -func (reg *ConjureReg) getRandomDuration(base, min, max int) time.Duration { - addon := getRandInt(min, max) / 1000 // why this min and max??? - rtt := rttInt(reg.getTcpToDecoy()) - return time.Millisecond * time.Duration(base+rtt*addon) -} - -func (reg *ConjureReg) getTcpToDecoy() uint32 { - reg.m.Lock() - defer reg.m.Unlock() - if reg != nil { - if reg.stats != nil { - return reg.stats.GetTcpToDecoy() - } - } - return 0 -} - func (cjSession *ConjureSession) setV6Support(support uint) { switch support { case v4: @@ -879,28 +673,6 @@ func (cjSession *ConjureSession) setV6Support(support uint) { } } -// When a registration send goroutine finishes it will call this and log -// session stats and/or errors. -func (cjSession *ConjureSession) registrationCallback(reg *ConjureReg) { - //[TODO]{priority:NOW} - Logger().Infof("%v %v", cjSession.IDString(), reg.digestStats()) -} - -func (cjSession *ConjureSession) getRandomDuration(base, min, max int) time.Duration { - addon := getRandInt(min, max) / 1000 // why this min and max??? - rtt := rttInt(cjSession.getTcpToDecoy()) - return time.Millisecond * time.Duration(base+rtt*addon) -} - -func (cjSession *ConjureSession) getTcpToDecoy() uint32 { - if cjSession != nil { - if cjSession.stats != nil { - return cjSession.stats.GetTcpToDecoy() - } - } - return 0 -} - func sleepWithContext(ctx context.Context, duration time.Duration) { timer := time.NewTimer(duration) defer timer.Stop() @@ -910,177 +682,65 @@ func sleepWithContext(ctx context.Context, duration time.Duration) { } } -func rttInt(millis uint32) int { - defaultValue := 300 - if millis == 0 { - return defaultValue - } - return int(millis) -} - -// SelectDecoys - Get an array of `width` decoys to be used for registration -func SelectDecoys(sharedSecret []byte, version uint, width uint) ([]*pb.TLSDecoySpec, error) { - - //[reference] prune to v6 only decoys if useV6 is true - var allDecoys []*pb.TLSDecoySpec - switch version { - case v6: - allDecoys = Assets().GetV6Decoys() - case v4: - allDecoys = Assets().GetV4Decoys() - case both: - allDecoys = Assets().GetAllDecoys() - default: - allDecoys = Assets().GetAllDecoys() - } - - if len(allDecoys) == 0 { - return nil, fmt.Errorf("no decoys") - } - - decoys := make([]*pb.TLSDecoySpec, width) - numDecoys := big.NewInt(int64(len(allDecoys))) - hmacInt := new(big.Int) - idx := new(big.Int) - - //[reference] select decoys - for i := uint(0); i < width; i++ { - macString := fmt.Sprintf("registrationdecoy%d", i) - hmac := conjureHMAC(sharedSecret, macString) - hmacInt = hmacInt.SetBytes(hmac[:8]) - hmacInt.SetBytes(hmac) - hmacInt.Abs(hmacInt) - idx.Mod(hmacInt, numDecoys) - decoys[i] = allDecoys[int(idx.Int64())] - } - return decoys, nil -} - -// var phantomSubnets = []conjurePhantomSubnet{ -// {subnet: "192.122.190.0/24", weight: 90.0}, -// {subnet: "2001:48a8:687f:1::/64", weight: 90.0}, -// {subnet: "141.219.0.0/16", weight: 10.0}, -// {subnet: "35.8.0.0/16", weight: 10.0}, -// } - // SelectPhantom - select one phantom IP address based on shared secret -func SelectPhantom(seed []byte, support uint) (*net.IP, *net.IP, error) { - phantomSubnets := Assets().GetPhantomSubnets() +func SelectPhantom(seed []byte, support uint) (*net.IP, *net.IP, bool, error) { + phantomSubnets := ca.Assets().GetPhantomSubnets() switch support { case v4: phantomIPv4, err := ps.SelectPhantom(seed, phantomSubnets, ps.V4Only, true) if err != nil { - return nil, nil, err + return nil, nil, false, err } - return phantomIPv4, nil, nil + return phantomIPv4.IP(), nil, phantomIPv4.SupportRandomPort(), nil case v6: phantomIPv6, err := ps.SelectPhantom(seed, phantomSubnets, ps.V6Only, true) if err != nil { - return nil, nil, err + return nil, nil, false, err } - return nil, phantomIPv6, nil + return nil, phantomIPv6.IP(), phantomIPv6.SupportRandomPort(), nil case both: phantomIPv4, err := ps.SelectPhantom(seed, phantomSubnets, ps.V4Only, true) if err != nil { - return nil, nil, err + return nil, nil, false, err } phantomIPv6, err := ps.SelectPhantom(seed, phantomSubnets, ps.V6Only, true) if err != nil { - return nil, nil, err + return nil, nil, false, err } - return phantomIPv4, phantomIPv6, nil + return phantomIPv4.IP(), phantomIPv6.IP(), phantomIPv4.SupportRandomPort() && phantomIPv6.SupportRandomPort(), nil default: - return nil, nil, fmt.Errorf("unknown v4/v6 support") + return nil, nil, false, fmt.Errorf("unknown v4/v6 support") } } func getStationKey() [32]byte { - return *Assets().GetConjurePubkey() + return *ca.Assets().GetConjurePubkey() } -type Obfs4Keys struct { - PrivateKey *ntor.PrivateKey - PublicKey *ntor.PublicKey - NodeID *ntor.NodeID +// GetRandomDuration returns a random duration that +func (reg *ConjureReg) GetRandomDuration(base, min, max int) time.Duration { + addon := getRandInt(min, max) / 1000 // why this min and max??? + rtt := rttInt(reg.getTcpToDecoy()) + return time.Millisecond * time.Duration(base+rtt*addon) } -func generateObfs4Keys(rand io.Reader) (Obfs4Keys, error) { - keys := Obfs4Keys{ - PrivateKey: new(ntor.PrivateKey), - PublicKey: new(ntor.PublicKey), - NodeID: new(ntor.NodeID), - } - - _, err := rand.Read(keys.PrivateKey[:]) - if err != nil { - return keys, err - } - - keys.PrivateKey[0] &= 248 - keys.PrivateKey[31] &= 127 - keys.PrivateKey[31] |= 64 - - pub, err := curve25519.X25519(keys.PrivateKey[:], curve25519.Basepoint) - if err != nil { - return keys, err +func (reg *ConjureReg) getTcpToDecoy() uint32 { + reg.m.Lock() + defer reg.m.Unlock() + if reg != nil { + if reg.stats != nil { + return reg.stats.GetTcpToDecoy() + } } - copy(keys.PublicKey[:], pub) - - _, err = rand.Read(keys.NodeID[:]) - return keys, err -} - -type sharedKeys struct { - SharedSecret, Representative []byte - FspKey, FspIv, VspKey, VspIv, NewMasterSecret, ConjureSeed []byte - Obfs4Keys Obfs4Keys + return 0 } -func generateSharedKeys(pubkey [32]byte) (*sharedKeys, error) { - sharedSecret, representative, err := generateEligatorTransformedKey(pubkey[:]) - if err != nil { - return nil, err - } - - tdHkdf := hkdf.New(sha256.New, sharedSecret, []byte("conjureconjureconjureconjure"), nil) - keys := &sharedKeys{ - SharedSecret: sharedSecret, - Representative: representative, - FspKey: make([]byte, 16), - FspIv: make([]byte, 12), - VspKey: make([]byte, 16), - VspIv: make([]byte, 12), - NewMasterSecret: make([]byte, 48), - ConjureSeed: make([]byte, 16), - } - - if _, err := tdHkdf.Read(keys.FspKey); err != nil { - return keys, err - } - if _, err := tdHkdf.Read(keys.FspIv); err != nil { - return keys, err - } - if _, err := tdHkdf.Read(keys.VspKey); err != nil { - return keys, err - } - if _, err := tdHkdf.Read(keys.VspIv); err != nil { - return keys, err - } - if _, err := tdHkdf.Read(keys.NewMasterSecret); err != nil { - return keys, err - } - if _, err := tdHkdf.Read(keys.ConjureSeed); err != nil { - return keys, err +func rttInt(millis uint32) int { + defaultValue := 300 + if millis == 0 { + return defaultValue } - keys.Obfs4Keys, err = generateObfs4Keys(tdHkdf) - return keys, err -} - -// -func conjureHMAC(key []byte, str string) []byte { - hash := hmac.New(sha256.New, key) - hash.Write([]byte(str)) - return hash.Sum(nil) + return int(millis) } // RegError - Registration Error passed during registration to indicate failure mode @@ -1089,10 +749,18 @@ type RegError struct { msg string } +func NewRegError(code uint, msg string) RegError { + return RegError{code: code, msg: msg} +} + func (err RegError) Error() string { return fmt.Sprintf("Registration Error [%v]: %v", err.CodeStr(), err.msg) } +func (err RegError) Code() uint { + return err.code +} + // CodeStr - Get desctriptor associated with error code func (err RegError) CodeStr() string { switch err.code { @@ -1109,6 +777,13 @@ func (err RegError) CodeStr() string { } } +// removeLaddr removes the laddr field in dialer +func removeLaddr(dialer func(ctx context.Context, network, laddr, raddr string) (net.Conn, error)) func(ctx context.Context, network, raddr string) (net.Conn, error) { + return func(ctx context.Context, network, addr string) (net.Conn, error) { + return dialer(ctx, network, "", addr) + } +} + const ( // Unreachable -Dial Error Unreachable -- likely network unavailable (i.e. ipv6 error) Unreachable = iota @@ -1119,7 +794,7 @@ const ( // NotImplemented - Related Function Not Implemented NotImplemented - // TLS Error (Expired, Wrong-Host, Untrusted-Root, ...) + // TLSError (Expired, Wrong-Host, Untrusted-Root, ...) TLSError // Unknown - Error occurred without obvious explanation diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_flow.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_flow.go index 2d89f4a6b..0b96eda6f 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_flow.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_flow.go @@ -17,9 +17,9 @@ import ( "sync" "time" - "github.com/golang/protobuf/proto" - pb "github.com/refraction-networking/gotapdance/protobuf" + pb "github.com/refraction-networking/conjure/proto" "github.com/sergeyfrolov/bsbuffer" + "google.golang.org/protobuf/proto" ) // TapdanceFlowConn represents single TapDance flow. @@ -632,7 +632,6 @@ func (flowConn *TapdanceFlowConn) RemoteAddr() net.Addr { // the deadline after successful Read or Write calls. // // A zero value for t means I/O operations will not time out. -// func (flowConn *TapdanceFlowConn) SetDeadline(t time.Time) error { return errNotImplemented } diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_raw.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_raw.go index c454fd866..fb933a3ee 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_raw.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/conn_raw.go @@ -16,9 +16,9 @@ import ( "sync" "time" - "github.com/golang/protobuf/proto" - pb "github.com/refraction-networking/gotapdance/protobuf" + pb "github.com/refraction-networking/conjure/proto" tls "github.com/refraction-networking/utls" + "google.golang.org/protobuf/proto" ) // Simply establishes TLS and TapDance connection. @@ -30,7 +30,7 @@ type tdRawConn struct { covert string // hostname that tapdance station will connect client to - TcpDialer func(context.Context, string, string) (net.Conn, error) + Dialer func(context.Context, string, string) (net.Conn, error) decoySpec *pb.TLSDecoySpec pinDecoySpec bool // don't ever change decoy (still changeable from outside) @@ -262,15 +262,15 @@ func (tdRaw *tdRawConn) establishTLStoDecoy(ctx context.Context) error { childCtx, childCancelFunc := context.WithDeadline(ctx, deadline) defer childCancelFunc() - tcpDialer := tdRaw.TcpDialer - if tcpDialer == nil { + dialer := tdRaw.Dialer + if dialer == nil { // custom dialer is not set, use default d := net.Dialer{} - tcpDialer = d.DialContext + dialer = d.DialContext } tcpToDecoyStartTs := time.Now() - dialConn, err := tcpDialer(childCtx, "tcp", tdRaw.decoySpec.GetIpAddrStr()) + dialConn, err := dialer(childCtx, "tcp", tdRaw.decoySpec.GetIpAddrStr()) tcpToDecoyTotalTs := time.Since(tcpToDecoyStartTs) if err != nil { return err diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/dialer.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/dialer.go index 6d2665e1a..5828c0717 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/dialer.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/dialer.go @@ -3,12 +3,17 @@ package tapdance import ( "context" "errors" + "fmt" "net" + "strings" + "time" - pb "github.com/refraction-networking/gotapdance/protobuf" + transports "github.com/refraction-networking/conjure/pkg/transports/client" + pb "github.com/refraction-networking/conjure/proto" ) var sessionsTotal CounterUint64 +var randomizePortDefault = false // Dialer contains options and implements advanced functions for establishing TapDance connection. type Dialer struct { @@ -17,19 +22,47 @@ type Dialer struct { // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID // we use their dialer to prevent connection loopback into our own proxy // connection when tunneling the whole device. - TcpDialer func(context.Context, string, string) (net.Conn, error) + // + // Deprecated: Dialer does not allow specifying the local address used for NAT traversal in + // some transports. Use DialerWithLaddr instead. + Dialer func(context.Context, string, string) (net.Conn, error) + + // DialerWithLaddr allows a custom dialer to be used for the underlying TCP/UDP connection. + // + // THIS IS REQUIRED TO INTERFACE WITH PSIPHON ANDROID + // we use their dialer to prevent connection loopback into our own proxy + // connection when tunneling the whole device. + DialerWithLaddr dialFunc DarkDecoy bool // The type of registrar to use when performing Conjure registrations. DarkDecoyRegistrar Registrar + // DisableRegistrarOverrides Indicates whether the client will allow the registrar to provide + // alternative parameters that may work better in substitute for the deterministically selected + // parameters. This only works for bidirectional registration methods where the client receives + // a RegistrationResponse. + DisableRegistrarOverrides bool + // The type of transport to use for Conjure connections. - Transport pb.TransportType + Transport pb.TransportType + TransportConfig Transport + + // RegDelay is the delay duration to wait for registration ingest. + RegDelay time.Duration UseProxyHeader bool - V6Support bool // *bool so that it is a nullable type. that can be overridden - Width int + V6Support bool + + // Width indicates the number of independent decoy registrations to send in parallel as success + // rates for individual decoy registrations are relatively low. (Default 5) + // + // Deprecated: Use the Width parameter in the Decoy Registrar. + Width int + + // Subnet that we want to limit to (or empty if they're all fine) + PhantomNet string } // Dial connects to the address on the named network. @@ -72,10 +105,29 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (net. } } - if d.TcpDialer == nil { + if d.DialerWithLaddr != nil && d.Dialer != nil { + return nil, fmt.Errorf("both DialerWithLaddr and Dialer are defined, only one dialer can be used") + } + + if d.Dialer != nil { + d.DialerWithLaddr = func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) { + if laddr != "" { + return nil, errUnsupportedLaddr + } + return d.Dialer(ctx, network, raddr) + } + } else if d.DialerWithLaddr == nil { // custom dialer is not set, use default - defaultDialer := net.Dialer{} - d.TcpDialer = defaultDialer.DialContext + d.DialerWithLaddr = func(ctx context.Context, network, laddr, raddr string) (net.Conn, error) { + defaultDialer := net.Dialer{} + localAddr, err := resolveAddr(network, laddr) + if err != nil { + return nil, fmt.Errorf("error resolving laddr: %v", err) + } + + defaultDialer.LocalAddr = localAddr + return defaultDialer.DialContext(ctx, network, raddr) + } } if !d.SplitFlows { @@ -84,30 +136,52 @@ func (d *Dialer) DialContext(ctx context.Context, network, address string) (net. if err != nil { return nil, err } - flow.tdRaw.TcpDialer = d.TcpDialer + flow.tdRaw.Dialer = d.Dialer flow.tdRaw.useProxyHeader = d.UseProxyHeader return flow, flow.DialContext(ctx) - } else { - // _, err := makeTdFlow(flowBidirectional, nil, address) - // if err != nil { - // return nil, err - // } - cjSession := makeConjureSession(address, d.Transport) - cjSession.TcpDialer = d.TcpDialer - cjSession.UseProxyHeader = d.UseProxyHeader - cjSession.Width = uint(d.Width) - - if d.V6Support { - cjSession.V6Support = &V6{include: both, support: true} - } else { - cjSession.V6Support = &V6{include: v4, support: false} + } + // Conjure + var cjSession *ConjureSession + + transport := d.TransportConfig + var err error + if d.TransportConfig == nil { + transport, err = transports.ConfigFromTransportType(d.Transport, randomizePortDefault) + } + if err != nil { + return nil, err + } + + // If specified, only select a phantom from a given range + if d.PhantomNet != "" { + _, phantomRange, err := net.ParseCIDR(d.PhantomNet) + if err != nil { + return nil, errors.New("Invalid Phantom network goal") } - if len(address) == 0 { - return nil, errors.New("Dark Decoys require target address to be set") + cjSession = FindConjureSessionInRange(address, d.TransportConfig, phantomRange) + if cjSession == nil { + return nil, errors.New("Failed to find Phantom in target subnet") } - return DialConjure(ctx, cjSession, d.DarkDecoyRegistrar) + } else { + cjSession = MakeConjureSession(address, transport) + } + + cjSession.Dialer = d.DialerWithLaddr + cjSession.UseProxyHeader = d.UseProxyHeader + cjSession.DisableRegistrarOverrides = d.DisableRegistrarOverrides + cjSession.RegDelay = d.RegDelay + + if d.V6Support { + cjSession.V6Support = &V6{include: both, support: true} + } else { + cjSession.V6Support = &V6{include: v4, support: false} } + if len(address) == 0 { + return nil, errors.New("Dark Decoys require target address to be set") + } + return DialConjure(ctx, cjSession, d.DarkDecoyRegistrar) } + return nil, errors.New("SplitFlows are not supported") } @@ -122,3 +196,17 @@ func (d *Dialer) DialProxy() (net.Conn, error) { func (d *Dialer) DialProxyContext(ctx context.Context) (net.Conn, error) { return d.DialContext(ctx, "tcp", "") } + +func resolveAddr(network, addrStr string) (net.Addr, error) { + if addrStr == "" { + return nil, nil + } + + if strings.Contains(network, "tcp") { + return net.ResolveTCPAddr(network, addrStr) + } + + return net.ResolveUDPAddr(network, addrStr) +} + +var errUnsupportedLaddr = fmt.Errorf("dialer does not support laddr") diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/interfaces.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/interfaces.go new file mode 100644 index 000000000..9f64fccdf --- /dev/null +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/interfaces.go @@ -0,0 +1,21 @@ +package tapdance + +import ( + "context" + + "github.com/refraction-networking/conjure/pkg/core/interfaces" +) + +// Transport provides a generic interface for utilities that allow the client to dial and connect to +// a phantom address when creating a Conjure connection. +type Transport interfaces.Transport + +// Registrar defines the interface for a module completing the initial portion of the conjure +// protocol which registers the clients intent to connect, along with the specifics of the session +// they wish to establish. +type Registrar interface { + Register(*ConjureSession, context.Context) (*ConjureReg, error) + + // PrepareRegKeys prepares key materials specific to the registrar + PrepareRegKeys(stationPubkey [32]byte, sessionSecret []byte) error +} diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/logger.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/logger.go index bbbd358bd..aead325ae 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/logger.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/logger.go @@ -2,6 +2,7 @@ package tapdance import ( "fmt" + "io" "sync" "github.com/sirupsen/logrus" @@ -35,3 +36,9 @@ func Logger() *logrus.Logger { }) return logrusLogger } + +// SetLoggerOutput will allow a caller to change the Logger output from the +// default of os.Stderr +func SetLoggerOutput(out io.Writer) { + Logger().SetOutput(out) +} diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/phantoms/phantoms.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/phantoms/phantoms.go deleted file mode 100644 index b929fc0ac..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/phantoms/phantoms.go +++ /dev/null @@ -1,273 +0,0 @@ -package phantoms - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "math/big" - "math/rand" - "net" - - wr "github.com/mroth/weightedrand" - pb "github.com/refraction-networking/gotapdance/protobuf" -) - -// getSubnets - return EITHER all subnet strings as one composite array if we are -// selecting unweighted, or return the array associated with the (seed) selected -// array of subnet strings based on the associated weights -func getSubnets(sc *pb.PhantomSubnetsList, seed []byte, weighted bool) []string { - - var out []string = []string{} - - if weighted { - // seed random with hkdf derived seed provided by client - seedInt, err := binary.ReadVarint(bytes.NewBuffer(seed)) - if err != nil { - return nil - } - rand.Seed(seedInt) - - weightedSubnets := sc.GetWeightedSubnets() - if weightedSubnets == nil { - return []string{} - } - - choices := make([]wr.Choice, 0, len(weightedSubnets)) - - // fmt.Println("DEBUG - len = ", len(weightedSubnets)) - for _, cjSubnet := range weightedSubnets { - weight := cjSubnet.GetWeight() - subnets := cjSubnet.GetSubnets() - if subnets == nil { - continue - } - // fmt.Println("Adding Choice", subnets, weight) - choices = append(choices, wr.Choice{Item: subnets, Weight: uint(weight)}) - } - - c, _ := wr.NewChooser(choices...) - if c == nil { - return []string{} - } - - out = c.Pick().([]string) - } else { - - weightedSubnets := sc.GetWeightedSubnets() - if weightedSubnets == nil { - return []string{} - } - - // Use unweighted config for subnets, concat all into one array and return. - for _, cjSubnet := range weightedSubnets { - for _, subnet := range cjSubnet.Subnets { - out = append(out, subnet) - } - } - } - - return out -} - -// SubnetFilter - Filter IP subnets based on whatever to prevent specific subnets from -// inclusion in choice. See v4Only and v6Only for reference. -type SubnetFilter func([]*net.IPNet) ([]*net.IPNet, error) - -func V4Only(obj []*net.IPNet) ([]*net.IPNet, error) { - var out []*net.IPNet = []*net.IPNet{} - - for _, _net := range obj { - if ipv4net := _net.IP.To4(); ipv4net != nil { - out = append(out, _net) - } - } - return out, nil -} - -// V6Only - a functor for transforming the subnet list to only include IPv6 subnets -func V6Only(obj []*net.IPNet) ([]*net.IPNet, error) { - var out []*net.IPNet = []*net.IPNet{} - - for _, _net := range obj { - if _net.IP == nil { - continue - } - if net := _net.IP.To4(); net != nil { - continue - } - out = append(out, _net) - } - return out, nil -} - -func parseSubnets(phantomSubnets []string) ([]*net.IPNet, error) { - var subnets []*net.IPNet = []*net.IPNet{} - - if len(phantomSubnets) == 0 { - return nil, fmt.Errorf("parseSubnets - no subnets provided") - } - - for _, strNet := range phantomSubnets { - _, parsedNet, err := net.ParseCIDR(strNet) - if err != nil { - return nil, err - } - if parsedNet == nil { - return nil, fmt.Errorf("failed to parse %v as subnet", parsedNet) - } - - subnets = append(subnets, parsedNet) - } - - return subnets, nil - // return nil, fmt.Errorf("parseSubnets not implemented yet") -} - -// SelectAddrFromSubnet - given a seed and a CIDR block choose an address. -// This is done by generating a seeded random bytes up to teh length of the -// full address then using the net mask to zero out any bytes that are -// already specified by the CIDR block. Tde masked random value is then -// added to the cidr block base giving the final randomly selected address. -func SelectAddrFromSubnet(seed []byte, net1 *net.IPNet) (net.IP, error) { - bits, addrLen := net1.Mask.Size() - - ipBigInt := &big.Int{} - if v4net := net1.IP.To4(); v4net != nil { - ipBigInt.SetBytes(net1.IP.To4()) - } else if v6net := net1.IP.To16(); v6net != nil { - ipBigInt.SetBytes(net1.IP.To16()) - } - - seedInt, err := binary.ReadVarint(bytes.NewBuffer(seed)) - if err != nil { - return nil, err - } - - rand.Seed(seedInt) - randBytes := make([]byte, addrLen/8) - _, err = rand.Read(randBytes) - if err != nil { - return nil, err - } - randBigInt := &big.Int{} - randBigInt.SetBytes(randBytes) - - mask := make([]byte, addrLen/8) - for i := 0; i < addrLen/8; i++ { - mask[i] = 0xff - } - maskBigInt := &big.Int{} - maskBigInt.SetBytes(mask) - maskBigInt.Rsh(maskBigInt, uint(bits)) - - randBigInt.And(randBigInt, maskBigInt) - ipBigInt.Add(ipBigInt, randBigInt) - - return net.IP(ipBigInt.Bytes()), nil -} - -func selectIPAddr(seed []byte, subnets []*net.IPNet) (*net.IP, error) { - - addresses_total := big.NewInt(0) - - type idNet struct { - min, max big.Int - net *net.IPNet - } - var idNets []idNet - - for _, _net := range subnets { - netMaskOnes, _ := _net.Mask.Size() - if ipv4net := _net.IP.To4(); ipv4net != nil { - _idNet := idNet{} - _idNet.min.Set(addresses_total) - addresses_total.Add(addresses_total, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(32-netMaskOnes)), nil)) - addresses_total.Sub(addresses_total, big.NewInt(1)) - _idNet.max.Set(addresses_total) - _idNet.net = _net - idNets = append(idNets, _idNet) - } else if ipv6net := _net.IP.To16(); ipv6net != nil { - _idNet := idNet{} - _idNet.min.Set(addresses_total) - addresses_total.Add(addresses_total, big.NewInt(2).Exp(big.NewInt(2), big.NewInt(int64(128-netMaskOnes)), nil)) - addresses_total.Sub(addresses_total, big.NewInt(1)) - _idNet.max.Set(addresses_total) - _idNet.net = _net - idNets = append(idNets, _idNet) - } else { - return nil, fmt.Errorf("failed to parse %v", _net) - } - } - - if addresses_total.Cmp(big.NewInt(0)) <= 0 { - return nil, fmt.Errorf("No valid addresses specified") - } - - id := &big.Int{} - id.SetBytes(seed) - if id.Cmp(addresses_total) > 0 { - id.Mod(id, addresses_total) - } - - var result net.IP - var err error - for _, _idNet := range idNets { - if _idNet.max.Cmp(id) >= 0 && _idNet.min.Cmp(id) == -1 { - result, err = SelectAddrFromSubnet(seed, _idNet.net) - if err != nil { - return nil, fmt.Errorf("Failed to chose IP address: %v", err) - } - } - } - if result == nil { - return nil, errors.New("let's rewrite the phantom address selector") - } - return &result, nil -} - -// SelectPhantom - select one phantom IP address based on shared secret -func SelectPhantom(seed []byte, subnetsList *pb.PhantomSubnetsList, transform SubnetFilter, weighted bool) (*net.IP, error) { - - s, err := parseSubnets(getSubnets(subnetsList, seed, weighted)) - if err != nil { - return nil, fmt.Errorf("Failed to parse subnets: %v", err) - } - - if transform != nil { - s, err = transform(s) - if err != nil { - return nil, err - } - } - - return selectIPAddr(seed, s) -} - -// SelectPhantomUnweighted - select one phantom IP address based on shared secret -func SelectPhantomUnweighted(seed []byte, subnets *pb.PhantomSubnetsList, transform SubnetFilter) (*net.IP, error) { - return SelectPhantom(seed, subnets, transform, false) -} - -// SelectPhantomWeighted - select one phantom IP address based on shared secret -func SelectPhantomWeighted(seed []byte, subnets *pb.PhantomSubnetsList, transform SubnetFilter) (*net.IP, error) { - return SelectPhantom(seed, subnets, transform, true) -} - -// GetDefaultPhantomSubnets implements the -func GetDefaultPhantomSubnets() *pb.PhantomSubnetsList { - var w1 = uint32(9.0) - var w2 = uint32(1.0) - return &pb.PhantomSubnetsList{ - WeightedSubnets: []*pb.PhantomSubnets{ - { - Weight: &w1, - Subnets: []string{"192.122.190.0/24", "2001:48a8:687f:1::/64"}, - }, - { - Weight: &w2, - Subnets: []string{"141.219.0.0/16", "35.8.0.0/16"}, - }, - }, - } -} diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/registrar_bidirectional.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/registrar_bidirectional.go deleted file mode 100644 index dcdbf6252..000000000 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/registrar_bidirectional.go +++ /dev/null @@ -1,213 +0,0 @@ -package tapdance - -import ( - "bytes" - "context" - "encoding/binary" - "fmt" - "io/ioutil" - "net" - "net/http" - "time" - - "github.com/golang/protobuf/proto" - pb "github.com/refraction-networking/gotapdance/protobuf" -) - -// Registration strategy using a centralized REST API to -// create registrations. Only the Endpoint need be specified; -// the remaining fields are valid with their zero values and -// provide the opportunity for additional control over the process. -type APIRegistrarBidirectional struct { - // Endpoint to use in registration request - Endpoint string - - // HTTP client to use in request - Client *http.Client - - // Length of time to delay after confirming successful - // registration before attempting a connection, - // allowing for propagation throughout the stations. - ConnectionDelay time.Duration - - // Maximum number of retries before giving up - MaxRetries int - - // A secondary registration method to use on failure. - // Because the API registration can give us definite - // indication of a failure to register, this can be - // used as a "backup" in the case of the API being - // down or being blocked. - // - // If this field is nil, no secondary registration will - // be attempted. If it is non-nil, after failing to register - // (retrying MaxRetries times) we will fall back to - // the Register method on this field. - SecondaryRegistrar Registrar -} - -func (r APIRegistrarBidirectional) Register(cjSession *ConjureSession, ctx context.Context) (*ConjureReg, error) { - Logger().Debugf("%v registering via APIRegistrarBidirectional", cjSession.IDString()) - - // Differences from APIRegistrar Register(): Client now does not generate - // phantom addresses, leave the phantom4 and phantom6 fields blank for now - // [reference] Prepare registration - reg := &ConjureReg{ - sessionIDStr: cjSession.IDString(), - keys: cjSession.Keys, - stats: &pb.SessionStats{}, - // phantom4: phantom4, - // phantom6: phantom6, - v6Support: cjSession.V6Support.include, - covertAddress: cjSession.CovertAddress, - transport: cjSession.Transport, - TcpDialer: cjSession.TcpDialer, - useProxyHeader: cjSession.UseProxyHeader, - } - - c2s := reg.generateClientToStation() - - protoPayload := pb.C2SWrapper{ - SharedSecret: cjSession.Keys.SharedSecret, - RegistrationPayload: c2s, - } - - payload, err := proto.Marshal(&protoPayload) - if err != nil { - Logger().Warnf("%v failed to marshal ClientToStation payload: %v", cjSession.IDString(), err) - return nil, err - } - - if r.Client == nil { - // Transports should ideally be re-used for TCP connection pooling, - // but each registration is most likely making precisely one request, - // or if it's making more than one, is most likely due to an underlying - // connection issue rather than an application-level error anyways. - t := http.DefaultTransport.(*http.Transport).Clone() - t.DialContext = reg.TcpDialer - r.Client = &http.Client{Transport: t} - } - - tries := 0 - for tries < r.MaxRetries+1 { - tries++ - regResp := &pb.RegistrationResponse{} - // executeHTTPRequestBidirectional() returns the Registration Response protobuf --> save that in regResp - regResp, err = r.executeHTTPRequestBidirectional(ctx, cjSession, payload) - if err != nil || regResp == nil { - Logger().Warnf("%v failed bidirectional API registration, attempt %d/%d", cjSession.IDString(), tries, r.MaxRetries+1) - continue - } - - // Handle server error - if regResp.GetError() != "" { - Logger().Debugf("%v bidirectional API registration returned err: %s", cjSession.IDString(), regResp.GetError()) - continue - } - - Logger().Debugf("%v bidirectional API registration succeeded", cjSession.IDString()) - if r.ConnectionDelay != 0 { - Logger().Debugf("%v sleeping for %v", cjSession.IDString(), r.ConnectionDelay) - sleepWithContext(ctx, r.ConnectionDelay) - } - - // Helper function defined below that takes in the registraion response protobuf from the - // executeHTTPRequestBidireectional() func and the ConjureReg that we want to return and - // unpacks the returned ipv addresses into the conjureReg - // LATER: carry more stuff in registration response protobuf and unpack helper will handle that too - conjReg := r.unpackRegResp(reg, regResp) - - // Return conjReg (ConjureReg struct) containing the ipv4 and ipv6 addresses from the server - return conjReg, nil - } - - // If we make it here, we failed API registration - Logger().Warnf("%v giving up on bidirectional API registration", cjSession.IDString()) - - if r.SecondaryRegistrar != nil { - Logger().Debugf("%v trying secondary registration method", cjSession.IDString()) - return r.SecondaryRegistrar.Register(cjSession, ctx) - } - - return nil, err -} - -func (r APIRegistrarBidirectional) executeHTTPRequestBidirectional(ctx context.Context, cjSession *ConjureSession, payload []byte) (*pb.RegistrationResponse, error) { - // Create an instance of the ConjureReg struct to return; this will hold the updated phantom4 and phantom6 addresses received from registrar response - regResp := &pb.RegistrationResponse{} - // Make new HTTP request with given context, registrar, and paylaod - req, err := http.NewRequestWithContext(ctx, "POST", r.Endpoint, bytes.NewReader(payload)) - if err != nil { - Logger().Warnf("%v failed to create HTTP request to registration endpoint %s: %v", cjSession.IDString(), r.Endpoint, err) - return regResp, err - } - - resp, err := r.Client.Do(req) - if err != nil { - Logger().Warnf("%v failed to do HTTP request to registration endpoint %s: %v", cjSession.IDString(), r.Endpoint, err) - return regResp, err - } - defer resp.Body.Close() - - // Check that the HTTP request returned a success code - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - Logger().Warnf("%v got non-success response code %d from registration endpoint %v", cjSession.IDString(), resp.StatusCode, r.Endpoint) - return regResp, fmt.Errorf("non-success response code %d on %s", resp.StatusCode, r.Endpoint) - } - - // Read the HTTP response body into []bytes - bodyBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - Logger().Warnf("error in serializing Registrtion Response protobuf in bytes: %v", err) - return regResp, err - } - - // Unmarshal response body into Registration Response protobuf - if err = proto.Unmarshal(bodyBytes, regResp); err != nil { - Logger().Warnf("error in storing Registrtion Response protobuf: %v", err) - return regResp, err - } - - return regResp, nil -} - -func (r APIRegistrarBidirectional) unpackRegResp(reg *ConjureReg, regResp *pb.RegistrationResponse) *ConjureReg { - if reg.v6Support == v4 { - // Save the ipv4address in the Conjure Reg struct (phantom4) to return - ip4 := make(net.IP, 4) - addr4 := regResp.GetIpv4Addr() - binary.BigEndian.PutUint32(ip4, addr4) - reg.phantom4 = &ip4 - } else if reg.v6Support == v6 { - // Save the ipv6address in the Conjure Reg struct (phantom6) to return - addr6 := net.IP(regResp.GetIpv6Addr()) - reg.phantom6 = &addr6 - } else { - // Case where cjSession.V6Support == both - // Save the ipv4address in the Conjure Reg struct (phantom4) to return - ip4 := make(net.IP, 4) - addr4 := regResp.GetIpv4Addr() - binary.BigEndian.PutUint32(ip4, addr4) - reg.phantom4 = &ip4 - - // Save the ipv6address in the Conjure Reg struct (phantom6) to return - addr6 := net.IP(regResp.GetIpv6Addr()) - reg.phantom6 = &addr6 - } - - // Client config -- check if not nil in the registration response - if regResp.GetClientConf() != nil { - currGen := Assets().GetGeneration() - incomingGen := regResp.GetClientConf().GetGeneration() - Logger().Debugf("received clientconf in regResponse w/ gen %d", incomingGen) - if currGen < incomingGen { - Logger().Debugf("Updating clientconf %d -> %d", currGen, incomingGen) - _err := Assets().SetClientConf(regResp.GetClientConf()) - if _err != nil { - Logger().Warnf("could not set ClientConf in bidirectional API: %v", _err.Error()) - } - } - } - - return reg -} diff --git a/vendor/github.com/refraction-networking/gotapdance/tapdance/utils.go b/vendor/github.com/refraction-networking/gotapdance/tapdance/utils.go index 940966009..a073201b0 100644 --- a/vendor/github.com/refraction-networking/gotapdance/tapdance/utils.go +++ b/vendor/github.com/refraction-networking/gotapdance/tapdance/utils.go @@ -15,7 +15,7 @@ import ( "strings" "time" - "github.com/refraction-networking/gotapdance/ed25519/extra25519" + "github.com/refraction-networking/ed25519/extra25519" "golang.org/x/crypto/curve25519" ) @@ -233,13 +233,14 @@ func errIsTimeout(err error) bool { // public key (and avoid sending it directly over the wire, as points on ellyptic curve are // distinguishable) // Then the sharedSecret will be used to encrypt stegoPayload and protobuf slices: -// - stegoPayload is encrypted with AES-GCM KEY=sharedSecret[0:16], IV=sharedSecret[16:28] -// - protobuf is encrypted with AES-GCM KEY=sharedSecret[0:16], IV={new random IV}, that will be -// prepended to encryptedProtobuf and eventually sent out together +// - stegoPayload is encrypted with AES-GCM KEY=sharedSecret[0:16], IV=sharedSecret[16:28] +// - protobuf is encrypted with AES-GCM KEY=sharedSecret[0:16], IV={new random IV}, that will be +// prepended to encryptedProtobuf and eventually sent out together +// // Returns -// - tag(concatenated representative and encrypted stegoPayload), -// - encryptedProtobuf(concatenated 12 byte IV + encrypted protobuf) -// - error +// - tag(concatenated representative and encrypted stegoPayload), +// - encryptedProtobuf(concatenated 12 byte IV + encrypted protobuf) +// - error func obfuscateTagAndProtobuf(stegoPayload []byte, protobuf []byte, stationPubkey []byte) ([]byte, []byte, error) { if len(stationPubkey) != 32 { return nil, nil, errors.New("Unexpected station pubkey length. Expected: 32." + @@ -267,7 +268,7 @@ func obfuscateTagAndProtobuf(stegoPayload []byte, protobuf []byte, stationPubkey if err != nil { return nil, nil, err } - representative[31] |= (0x80 & randByte[0]) + representative[31] |= (0xC0 & randByte[0]) tagBuf := new(bytes.Buffer) // What we have to encrypt with the shared secret using AES tagBuf.Write(representative[:]) diff --git a/vendor/gitlab.com/yawning/obfs4.git/LICENSE b/vendor/github.com/refraction-networking/obfs4/LICENSE similarity index 100% rename from vendor/gitlab.com/yawning/obfs4.git/LICENSE rename to vendor/github.com/refraction-networking/obfs4/LICENSE diff --git a/vendor/gitlab.com/yawning/obfs4.git/common/csrand/csrand.go b/vendor/github.com/refraction-networking/obfs4/common/csrand/csrand.go similarity index 97% rename from vendor/gitlab.com/yawning/obfs4.git/common/csrand/csrand.go rename to vendor/github.com/refraction-networking/obfs4/common/csrand/csrand.go index 5dc617fd1..29b612f50 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/common/csrand/csrand.go +++ b/vendor/github.com/refraction-networking/obfs4/common/csrand/csrand.go @@ -31,7 +31,7 @@ // Not all of the convinience routines are replicated, only those that are // immediately useful. The Rand variable provides access to the full math/rand // API. -package csrand // import "gitlab.com/yawning/obfs4.git/common/csrand" +package csrand // import "github.com/refraction-networking/obfs4/common/csrand" import ( cryptRand "crypto/rand" diff --git a/vendor/gitlab.com/yawning/obfs4.git/common/drbg/hash_drbg.go b/vendor/github.com/refraction-networking/obfs4/common/drbg/hash_drbg.go similarity index 96% rename from vendor/gitlab.com/yawning/obfs4.git/common/drbg/hash_drbg.go rename to vendor/github.com/refraction-networking/obfs4/common/drbg/hash_drbg.go index 3d1a46940..762f740db 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/common/drbg/hash_drbg.go +++ b/vendor/github.com/refraction-networking/obfs4/common/drbg/hash_drbg.go @@ -27,7 +27,7 @@ // Package drbg implements a minimalistic DRBG based off SipHash-2-4 in OFB // mode. -package drbg // import "gitlab.com/yawning/obfs4.git/common/drbg" +package drbg // import "github.com/refraction-networking/obfs4/common/drbg" import ( "encoding/binary" @@ -36,7 +36,7 @@ import ( "hash" "github.com/dchest/siphash" - "gitlab.com/yawning/obfs4.git/common/csrand" + "github.com/refraction-networking/obfs4/common/csrand" ) // Size is the length of the HashDrbg output. diff --git a/vendor/gitlab.com/yawning/obfs4.git/common/ntor/ntor.go b/vendor/github.com/refraction-networking/obfs4/common/ntor/ntor.go similarity index 93% rename from vendor/gitlab.com/yawning/obfs4.git/common/ntor/ntor.go rename to vendor/github.com/refraction-networking/obfs4/common/ntor/ntor.go index 48508bfe7..b86c03ee9 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/common/ntor/ntor.go +++ b/vendor/github.com/refraction-networking/obfs4/common/ntor/ntor.go @@ -32,19 +32,18 @@ // // Before using this package, it is strongly recommended that the specification // is read and understood. -package ntor // import "gitlab.com/yawning/obfs4.git/common/ntor" +package ntor // import "github.com/refraction-networking/obfs4/common/ntor" import ( "bytes" "crypto/hmac" "crypto/sha256" - "crypto/subtle" "encoding/hex" "fmt" "io" - "github.com/agl/ed25519/extra25519" - "gitlab.com/yawning/obfs4.git/common/csrand" + "github.com/refraction-networking/ed25519/extra25519" + "github.com/refraction-networking/obfs4/common/csrand" "golang.org/x/crypto/curve25519" "golang.org/x/crypto/hkdf" ) @@ -320,15 +319,20 @@ func ServerHandshake(clientPublic *PublicKey, serverKeypair *Keypair, idKeypair var secretInput bytes.Buffer // Server side uses EXP(X,y) | EXP(X,b) - var exp [SharedSecretLength]byte - curve25519.ScalarMult(&exp, serverKeypair.private.Bytes(), - clientPublic.Bytes()) - notOk |= constantTimeIsZero(exp[:]) + exp, err := curve25519.X25519(serverKeypair.private.Bytes()[:], clientPublic.Bytes()[:]) + if err != nil { + notOk |= 1 + } else { + notOk |= 0 + } secretInput.Write(exp[:]) - curve25519.ScalarMult(&exp, idKeypair.private.Bytes(), - clientPublic.Bytes()) - notOk |= constantTimeIsZero(exp[:]) + exp, err = curve25519.X25519(idKeypair.private.Bytes()[:], clientPublic.Bytes()[:]) + if err != nil { + notOk |= 1 + } else { + notOk |= 0 + } secretInput.Write(exp[:]) keySeed, auth = ntorCommon(secretInput, id, idKeypair.public, @@ -344,15 +348,20 @@ func ClientHandshake(clientKeypair *Keypair, serverPublic *PublicKey, idPublic * var secretInput bytes.Buffer // Client side uses EXP(Y,x) | EXP(B,x) - var exp [SharedSecretLength]byte - curve25519.ScalarMult(&exp, clientKeypair.private.Bytes(), - serverPublic.Bytes()) - notOk |= constantTimeIsZero(exp[:]) + exp, err := curve25519.X25519(clientKeypair.private.Bytes()[:], serverPublic.Bytes()[:]) + if err != nil { + notOk |= 1 + } else { + notOk |= 0 + } secretInput.Write(exp[:]) - curve25519.ScalarMult(&exp, clientKeypair.private.Bytes(), - idPublic.Bytes()) - notOk |= constantTimeIsZero(exp[:]) + exp, err = curve25519.X25519(clientKeypair.private.Bytes()[:], idPublic.Bytes()[:]) + if err != nil { + notOk |= 1 + } else { + notOk |= 0 + } secretInput.Write(exp[:]) keySeed, auth = ntorCommon(secretInput, id, idPublic, @@ -406,15 +415,6 @@ func ntorCommon(secretInput bytes.Buffer, id *NodeID, b *PublicKey, x *PublicKey return keySeed, auth } -func constantTimeIsZero(x []byte) int { - var ret byte - for _, v := range x { - ret |= v - } - - return subtle.ConstantTimeByteEq(ret, 0) -} - // Kdf extracts and expands KEY_SEED via HKDF-SHA256 and returns `okm_len` bytes // of key material. func Kdf(keySeed []byte, okmLen int) []byte { diff --git a/vendor/gitlab.com/yawning/obfs4.git/common/probdist/weighted_dist.go b/vendor/github.com/refraction-networking/obfs4/common/probdist/weighted_dist.go similarity index 97% rename from vendor/gitlab.com/yawning/obfs4.git/common/probdist/weighted_dist.go rename to vendor/github.com/refraction-networking/obfs4/common/probdist/weighted_dist.go index 66c4f7b71..a913fba63 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/common/probdist/weighted_dist.go +++ b/vendor/github.com/refraction-networking/obfs4/common/probdist/weighted_dist.go @@ -28,7 +28,7 @@ // Package probdist implements a weighted probability distribution suitable for // protocol parameterization. To allow for easy reproduction of a given // distribution, the drbg package is used as the random number source. -package probdist // import "gitlab.com/yawning/obfs4.git/common/probdist" +package probdist // import "github.com/refraction-networking/obfs4/common/probdist" import ( "bytes" @@ -37,8 +37,8 @@ import ( "math/rand" "sync" - "gitlab.com/yawning/obfs4.git/common/csrand" - "gitlab.com/yawning/obfs4.git/common/drbg" + "github.com/refraction-networking/obfs4/common/csrand" + "github.com/refraction-networking/obfs4/common/drbg" ) const ( diff --git a/vendor/gitlab.com/yawning/obfs4.git/common/replayfilter/replay_filter.go b/vendor/github.com/refraction-networking/obfs4/common/replayfilter/replay_filter.go similarity index 96% rename from vendor/gitlab.com/yawning/obfs4.git/common/replayfilter/replay_filter.go rename to vendor/github.com/refraction-networking/obfs4/common/replayfilter/replay_filter.go index f3b2bd09f..305eb58d1 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/common/replayfilter/replay_filter.go +++ b/vendor/github.com/refraction-networking/obfs4/common/replayfilter/replay_filter.go @@ -30,7 +30,7 @@ // has been seen before based on the SipHash-2-4 digest of the sequence. // Collisions are treated as positive matches, though the probability of this // happening is negligible. -package replayfilter // import "gitlab.com/yawning/obfs4.git/common/replayfilter" +package replayfilter // import "github.com/refraction-networking/obfs4/common/replayfilter" import ( "container/list" @@ -39,7 +39,7 @@ import ( "time" "github.com/dchest/siphash" - "gitlab.com/yawning/obfs4.git/common/csrand" + "github.com/refraction-networking/obfs4/common/csrand" ) // maxFilterSize is the maximum capacity of a replay filter. This value is diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/base/base.go b/vendor/github.com/refraction-networking/obfs4/transports/base/base.go similarity index 95% rename from vendor/gitlab.com/yawning/obfs4.git/transports/base/base.go rename to vendor/github.com/refraction-networking/obfs4/transports/base/base.go index de5192957..df6b9696b 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/base/base.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/base/base.go @@ -27,12 +27,12 @@ // Package base provides the common interface that each supported transport // protocol must implement. -package base // import "gitlab.com/yawning/obfs4.git/transports/base" +package base // import "github.com/refraction-networking/obfs4/transports/base" import ( "net" - "git.torproject.org/pluggable-transports/goptlib.git" + pt "gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib" ) type DialFunc func(string, string) (net.Conn, error) diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/framing/framing.go b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/framing/framing.go similarity index 92% rename from vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/framing/framing.go rename to vendor/github.com/refraction-networking/obfs4/transports/obfs4/framing/framing.go index f0c38c31e..9d6627aa1 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/framing/framing.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/framing/framing.go @@ -25,40 +25,41 @@ * POSSIBILITY OF SUCH DAMAGE. */ -// // Package framing implements the obfs4 link framing and cryptography. // // The Encoder/Decoder shared secret format is: -// uint8_t[32] NaCl secretbox key -// uint8_t[16] NaCl Nonce prefix -// uint8_t[16] SipHash-2-4 key (used to obfsucate length) -// uint8_t[8] SipHash-2-4 IV +// +// uint8_t[32] NaCl secretbox key +// uint8_t[16] NaCl Nonce prefix +// uint8_t[16] SipHash-2-4 key (used to obfsucate length) +// uint8_t[8] SipHash-2-4 IV // // The frame format is: -// uint16_t length (obfsucated, big endian) -// NaCl secretbox (Poly1305/XSalsa20) containing: -// uint8_t[16] tag (Part of the secretbox construct) -// uint8_t[] payload +// +// uint16_t length (obfsucated, big endian) +// NaCl secretbox (Poly1305/XSalsa20) containing: +// uint8_t[16] tag (Part of the secretbox construct) +// uint8_t[] payload // // The length field is length of the NaCl secretbox XORed with the truncated // SipHash-2-4 digest ran in OFB mode. // -// Initialize K, IV[0] with values from the shared secret. -// On each packet, IV[n] = H(K, IV[n - 1]) -// mask[n] = IV[n][0:2] -// obfsLen = length ^ mask[n] +// Initialize K, IV[0] with values from the shared secret. +// On each packet, IV[n] = H(K, IV[n - 1]) +// mask[n] = IV[n][0:2] +// obfsLen = length ^ mask[n] // // The NaCl secretbox (Poly1305/XSalsa20) nonce format is: -// uint8_t[24] prefix (Fixed) -// uint64_t counter (Big endian) +// +// uint8_t[24] prefix (Fixed) +// uint64_t counter (Big endian) // // The counter is initialized to 1, and is incremented on each frame. Since // the protocol is designed to be used over a reliable medium, the nonce is not // transmitted over the wire as both sides of the conversation know the prefix // and the initial counter value. It is imperative that the counter does not // wrap, and sessions MUST terminate before 2^64 frames are sent. -// -package framing // import "gitlab.com/yawning/obfs4.git/transports/obfs4/framing" +package framing // import "github.com/refraction-networking/obfs4/transports/obfs4/framing" import ( "bytes" @@ -67,8 +68,8 @@ import ( "fmt" "io" - "gitlab.com/yawning/obfs4.git/common/csrand" - "gitlab.com/yawning/obfs4.git/common/drbg" + "github.com/refraction-networking/obfs4/common/csrand" + "github.com/refraction-networking/obfs4/common/drbg" "golang.org/x/crypto/nacl/secretbox" ) diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/handshake_ntor.go b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/handshake_ntor.go similarity index 98% rename from vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/handshake_ntor.go rename to vendor/github.com/refraction-networking/obfs4/transports/obfs4/handshake_ntor.go index 6629c46a9..2741be5a2 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/handshake_ntor.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/handshake_ntor.go @@ -38,10 +38,10 @@ import ( "strconv" "time" - "gitlab.com/yawning/obfs4.git/common/csrand" - "gitlab.com/yawning/obfs4.git/common/ntor" - "gitlab.com/yawning/obfs4.git/common/replayfilter" - "gitlab.com/yawning/obfs4.git/transports/obfs4/framing" + "github.com/refraction-networking/obfs4/common/csrand" + "github.com/refraction-networking/obfs4/common/ntor" + "github.com/refraction-networking/obfs4/common/replayfilter" + "github.com/refraction-networking/obfs4/transports/obfs4/framing" ) const ( diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/obfs4.go b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/obfs4.go similarity index 96% rename from vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/obfs4.go rename to vendor/github.com/refraction-networking/obfs4/transports/obfs4/obfs4.go index 6a92f17f8..9f239ed35 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/obfs4.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/obfs4.go @@ -27,7 +27,7 @@ // Package obfs4 provides an implementation of the Tor Project's obfs4 // obfuscation protocol. -package obfs4 // import "gitlab.com/yawning/obfs4.git/transports/obfs4" +package obfs4 // import "github.com/refraction-networking/obfs4/transports/obfs4" import ( "bytes" @@ -40,13 +40,13 @@ import ( "syscall" "time" - "git.torproject.org/pluggable-transports/goptlib.git" - "gitlab.com/yawning/obfs4.git/common/drbg" - "gitlab.com/yawning/obfs4.git/common/ntor" - "gitlab.com/yawning/obfs4.git/common/probdist" - "gitlab.com/yawning/obfs4.git/common/replayfilter" - "gitlab.com/yawning/obfs4.git/transports/base" - "gitlab.com/yawning/obfs4.git/transports/obfs4/framing" + "github.com/refraction-networking/obfs4/common/drbg" + "github.com/refraction-networking/obfs4/common/ntor" + "github.com/refraction-networking/obfs4/common/probdist" + "github.com/refraction-networking/obfs4/common/replayfilter" + "github.com/refraction-networking/obfs4/transports/base" + "github.com/refraction-networking/obfs4/transports/obfs4/framing" + pt "gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib" ) const ( @@ -491,7 +491,7 @@ func (conn *obfs4Conn) Write(b []byte) (n int, err error) { if err != nil { return 0, err } else if rdLen == 0 { - panic(fmt.Sprintf("BUG: Write(), chopping length was 0")) + panic("BUG: Write(), chopping length was 0") } n += rdLen @@ -549,7 +549,7 @@ func (conn *obfs4Conn) Write(b []byte) (n int, err error) { if err != nil { return 0, err } else if iatWrLen == 0 { - panic(fmt.Sprintf("BUG: Write(), iat length was 0")) + panic("BUG: Write(), iat length was 0") } // Calculate the delay. The delay resolution is 100 usec, leading diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/packet.go b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/packet.go similarity index 97% rename from vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/packet.go rename to vendor/github.com/refraction-networking/obfs4/transports/obfs4/packet.go index 653fae3b9..cefb4d055 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/packet.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/packet.go @@ -33,8 +33,8 @@ import ( "fmt" "io" - "gitlab.com/yawning/obfs4.git/common/drbg" - "gitlab.com/yawning/obfs4.git/transports/obfs4/framing" + "github.com/refraction-networking/obfs4/common/drbg" + "github.com/refraction-networking/obfs4/transports/obfs4/framing" ) const ( diff --git a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/statefile.go b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/statefile.go similarity index 89% rename from vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/statefile.go rename to vendor/github.com/refraction-networking/obfs4/transports/obfs4/statefile.go index 8752f0d9c..6e38003f3 100644 --- a/vendor/gitlab.com/yawning/obfs4.git/transports/obfs4/statefile.go +++ b/vendor/github.com/refraction-networking/obfs4/transports/obfs4/statefile.go @@ -31,16 +31,15 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io/ioutil" "os" "path" "strconv" "strings" - "git.torproject.org/pluggable-transports/goptlib.git" - "gitlab.com/yawning/obfs4.git/common/csrand" - "gitlab.com/yawning/obfs4.git/common/drbg" - "gitlab.com/yawning/obfs4.git/common/ntor" + "github.com/refraction-networking/obfs4/common/csrand" + "github.com/refraction-networking/obfs4/common/drbg" + "github.com/refraction-networking/obfs4/common/ntor" + pt "gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib" ) const ( @@ -121,7 +120,7 @@ func serverStateFromArgs(stateDir string, args *pt.Args) (*obfs4ServerState, err // Either a private key, node id, and seed are ALL specified, or // they should be loaded from the state file. - if !privKeyOk && !nodeIDOk && !seedOk { + if !privKeyOk && !nodeIDOk && !seedOk && stateDir != "" { if err := jsonServerStateFromFile(stateDir, &js); err != nil { return nil, err } @@ -166,18 +165,23 @@ func serverStateFromJSONServerState(stateDir string, js *jsonServerState) (*obfs st.iatMode = js.IATMode st.cert = serverCertFromState(st) - // Generate a human readable summary of the configured endpoint. - if err = newBridgeFile(stateDir, st); err != nil { - return nil, err + // Avoid writing out any state files if no stateDir is provided. + if stateDir != "" { + // Generate a human readable summary of the configured endpoint. + if err = newBridgeFile(stateDir, st); err != nil { + return nil, err + } + + // Write back the possibly updated server state. + return st, writeJSONServerState(stateDir, js) } - // Write back the possibly updated server state. - return st, writeJSONServerState(stateDir, js) + return st, nil } func jsonServerStateFromFile(stateDir string, js *jsonServerState) error { fPath := path.Join(stateDir, stateFile) - f, err := ioutil.ReadFile(fPath) + f, err := os.ReadFile(fPath) if err != nil { if os.IsNotExist(err) { if err = newJSONServerState(stateDir, js); err == nil { @@ -228,7 +232,7 @@ func writeJSONServerState(stateDir string, js *jsonServerState) error { if encoded, err = json.Marshal(js); err != nil { return err } - if err = ioutil.WriteFile(path.Join(stateDir, stateFile), encoded, 0600); err != nil { + if err = os.WriteFile(path.Join(stateDir, stateFile), encoded, 0600); err != nil { return err } @@ -252,7 +256,7 @@ func newBridgeFile(stateDir string, st *obfs4ServerState) error { st.clientString()) tmp := []byte(prefix + bridgeLine) - if err := ioutil.WriteFile(path.Join(stateDir, bridgeFile), tmp, 0600); err != nil { + if err := os.WriteFile(path.Join(stateDir, bridgeFile), tmp, 0600); err != nil { return err } diff --git a/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md index 5152b6aa4..d1d4a85fd 100644 --- a/vendor/github.com/sirupsen/logrus/README.md +++ b/vendor/github.com/sirupsen/logrus/README.md @@ -1,4 +1,4 @@ -# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) +# Logrus :walrus: [![Build Status](https://github.com/sirupsen/logrus/workflows/CI/badge.svg)](https://github.com/sirupsen/logrus/actions?query=workflow%3ACI) [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![Go Reference](https://pkg.go.dev/badge/github.com/sirupsen/logrus.svg)](https://pkg.go.dev/github.com/sirupsen/logrus) Logrus is a structured logger for Go (golang), completely API compatible with the standard library logger. @@ -9,7 +9,7 @@ the last thing you want from your Logging library (again...). This does not mean Logrus is dead. Logrus will continue to be maintained for security, (backwards compatible) bug fixes, and performance (where we are -limited by the interface). +limited by the interface). I believe Logrus' biggest contribution is to have played a part in today's widespread use of structured logging in Golang. There doesn't seem to be a @@ -43,7 +43,7 @@ plain text): With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash or Splunk: -```json +```text {"animal":"walrus","level":"info","msg":"A group of walrus emerges from the ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} @@ -99,7 +99,7 @@ time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcr ``` Note that this does add measurable overhead - the cost will depend on the version of Go, but is between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your -environment via benchmarks: +environment via benchmarks: ``` go test -bench=.*CallerTracing ``` @@ -317,6 +317,8 @@ log.SetLevel(log.InfoLevel) It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose environment if your application has that. +Note: If you want different log levels for global (`log.SetLevel(...)`) and syslog logging, please check the [syslog hook README](hooks/syslog/README.md#different-log-levels-for-local-and-remote-logging). + #### Entries Besides the fields added with `WithField` or `WithFields` some fields are @@ -341,7 +343,7 @@ import ( log "github.com/sirupsen/logrus" ) -init() { +func init() { // do something here to set environment depending on an environment variable // or command-line flag if Environment == "production" { diff --git a/vendor/github.com/sirupsen/logrus/buffer_pool.go b/vendor/github.com/sirupsen/logrus/buffer_pool.go index 4545dec07..c7787f77c 100644 --- a/vendor/github.com/sirupsen/logrus/buffer_pool.go +++ b/vendor/github.com/sirupsen/logrus/buffer_pool.go @@ -26,15 +26,6 @@ func (p *defaultPool) Get() *bytes.Buffer { return p.pool.Get().(*bytes.Buffer) } -func getBuffer() *bytes.Buffer { - return bufferPool.Get() -} - -func putBuffer(buf *bytes.Buffer) { - buf.Reset() - bufferPool.Put(buf) -} - // SetBufferPool allows to replace the default logrus buffer pool // to better meets the specific needs of an application. func SetBufferPool(bp BufferPool) { diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go index 07a1e5fa7..71cdbbc35 100644 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ b/vendor/github.com/sirupsen/logrus/entry.go @@ -232,6 +232,7 @@ func (entry *Entry) log(level Level, msg string) { newEntry.Logger.mu.Lock() reportCaller := newEntry.Logger.ReportCaller + bufPool := newEntry.getBufferPool() newEntry.Logger.mu.Unlock() if reportCaller { @@ -239,11 +240,11 @@ func (entry *Entry) log(level Level, msg string) { } newEntry.fireHooks() - - buffer = getBuffer() + buffer = bufPool.Get() defer func() { newEntry.Buffer = nil - putBuffer(buffer) + buffer.Reset() + bufPool.Put(buffer) }() buffer.Reset() newEntry.Buffer = buffer @@ -260,6 +261,13 @@ func (entry *Entry) log(level Level, msg string) { } } +func (entry *Entry) getBufferPool() (pool BufferPool) { + if entry.Logger.BufferPool != nil { + return entry.Logger.BufferPool + } + return bufferPool +} + func (entry *Entry) fireHooks() { var tmpHooks LevelHooks entry.Logger.mu.Lock() @@ -276,18 +284,21 @@ func (entry *Entry) fireHooks() { } func (entry *Entry) write() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() serialized, err := entry.Logger.Formatter.Format(entry) if err != nil { fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) return } - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() if _, err := entry.Logger.Out.Write(serialized); err != nil { fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) } } +// Log will log a message at the level given as parameter. +// Warning: using Log at Panic or Fatal level will not respectively Panic nor Exit. +// For this behaviour Entry.Panic or Entry.Fatal should be used instead. func (entry *Entry) Log(level Level, args ...interface{}) { if entry.Logger.IsLevelEnabled(level) { entry.log(level, fmt.Sprint(args...)) diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go index 337704457..5ff0aef6d 100644 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ b/vendor/github.com/sirupsen/logrus/logger.go @@ -44,6 +44,9 @@ type Logger struct { entryPool sync.Pool // Function to exit the application, defaults to `os.Exit()` ExitFunc exitFunc + // The buffer pool used to format the log. If it is nil, the default global + // buffer pool will be used. + BufferPool BufferPool } type exitFunc func(int) @@ -192,6 +195,9 @@ func (logger *Logger) Panicf(format string, args ...interface{}) { logger.Logf(PanicLevel, format, args...) } +// Log will log a message at the level given as parameter. +// Warning: using Log at Panic or Fatal level will not respectively Panic nor Exit. +// For this behaviour Logger.Panic or Logger.Fatal should be used instead. func (logger *Logger) Log(level Level, args ...interface{}) { if logger.IsLevelEnabled(level) { entry := logger.newEntry() @@ -402,3 +408,10 @@ func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { logger.mu.Unlock() return oldHooks } + +// SetBufferPool sets the logger buffer pool. +func (logger *Logger) SetBufferPool(pool BufferPool) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.BufferPool = pool +} diff --git a/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go index 72e8e3a1b..074fd4b8b 100644 --- a/vendor/github.com/sirupsen/logrus/writer.go +++ b/vendor/github.com/sirupsen/logrus/writer.go @@ -4,6 +4,7 @@ import ( "bufio" "io" "runtime" + "strings" ) // Writer at INFO level. See WriterLevel for details. @@ -20,15 +21,18 @@ func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { return NewEntry(logger).WriterLevel(level) } +// Writer returns an io.Writer that writes to the logger at the info log level func (entry *Entry) Writer() *io.PipeWriter { return entry.WriterLevel(InfoLevel) } +// WriterLevel returns an io.Writer that writes to the logger at the given log level func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { reader, writer := io.Pipe() var printFunc func(args ...interface{}) + // Determine which log function to use based on the specified log level switch level { case TraceLevel: printFunc = entry.Trace @@ -48,23 +52,51 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { printFunc = entry.Print } + // Start a new goroutine to scan the input and write it to the logger using the specified print function. + // It splits the input into chunks of up to 64KB to avoid buffer overflows. go entry.writerScanner(reader, printFunc) + + // Set a finalizer function to close the writer when it is garbage collected runtime.SetFinalizer(writer, writerFinalizer) return writer } +// writerScanner scans the input from the reader and writes it to the logger func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { scanner := bufio.NewScanner(reader) + + // Set the buffer size to the maximum token size to avoid buffer overflows + scanner.Buffer(make([]byte, bufio.MaxScanTokenSize), bufio.MaxScanTokenSize) + + // Define a split function to split the input into chunks of up to 64KB + chunkSize := bufio.MaxScanTokenSize // 64KB + splitFunc := func(data []byte, atEOF bool) (int, []byte, error) { + if len(data) >= chunkSize { + return chunkSize, data[:chunkSize], nil + } + + return bufio.ScanLines(data, atEOF) + } + + // Use the custom split function to split the input + scanner.Split(splitFunc) + + // Scan the input and write it to the logger using the specified print function for scanner.Scan() { - printFunc(scanner.Text()) + printFunc(strings.TrimRight(scanner.Text(), "\r\n")) } + + // If there was an error while scanning the input, log an error if err := scanner.Err(); err != nil { entry.Errorf("Error while reading from Writer: %s", err) } + + // Close the reader when we are done reader.Close() } +// WriterFinalizer is a finalizer function that closes then given writer when it is garbage collected func writerFinalizer(writer *io.PipeWriter) { writer.Close() } diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 3bb22a971..b774da88d 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -1,6 +1,7 @@ package assert import ( + "bytes" "fmt" "reflect" "time" @@ -32,7 +33,8 @@ var ( stringType = reflect.TypeOf("") - timeType = reflect.TypeOf(time.Time{}) + timeType = reflect.TypeOf(time.Time{}) + bytesType = reflect.TypeOf([]byte{}) ) func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { @@ -323,6 +325,26 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { return compare(timeObj1.UnixNano(), timeObj2.UnixNano(), reflect.Int64) } + case reflect.Slice: + { + // We only care about the []byte type. + if !canConvert(obj1Value, bytesType) { + break + } + + // []byte can be compared! + bytesObj1, ok := obj1.([]byte) + if !ok { + bytesObj1 = obj1Value.Convert(bytesType).Interface().([]byte) + + } + bytesObj2, ok := obj2.([]byte) + if !ok { + bytesObj2 = obj2Value.Convert(bytesType).Interface().([]byte) + } + + return CompareType(bytes.Compare(bytesObj1, bytesObj2)), true + } } return compareEqual, false @@ -330,9 +352,9 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { // Greater asserts that the first element is greater than the second // -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -342,10 +364,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface // GreaterOrEqual asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -355,9 +377,9 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in // Less asserts that the first element is less than the second // -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -367,10 +389,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) // LessOrEqual asserts that the first element is less than or equal to the second // -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -380,8 +402,8 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter // Positive asserts that the specified element is positive // -// assert.Positive(t, 1) -// assert.Positive(t, 1.23) +// assert.Positive(t, 1) +// assert.Positive(t, 1.23) func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -392,8 +414,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { // Negative asserts that the specified element is negative // -// assert.Negative(t, -1) -// assert.Negative(t, -1.23) +// assert.Negative(t, -1) +// assert.Negative(t, -1.23) func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go index df22c47fc..da867903e 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare_can_convert.go @@ -9,7 +9,7 @@ package assert import "reflect" -// Wrapper around reflect.Value.CanConvert, for compatability +// Wrapper around reflect.Value.CanConvert, for compatibility // reasons. func canConvert(value reflect.Value, to reflect.Type) bool { return value.CanConvert(to) diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index 27e2420ed..84dbd6c79 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -22,9 +22,9 @@ func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bo // Containsf asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -56,7 +56,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string // Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Emptyf(t, obj, "error message %s", "formatted") +// assert.Emptyf(t, obj, "error message %s", "formatted") func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -66,7 +66,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) boo // Equalf asserts that two objects are equal. // -// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// assert.Equalf(t, 123, 123, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -81,8 +81,8 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar // EqualErrorf asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -90,10 +90,27 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) } +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EqualExportedValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -103,10 +120,10 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri // Errorf asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -126,8 +143,8 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -147,7 +164,7 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -155,9 +172,34 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick return Eventually(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) } +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithTf(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return EventuallyWithT(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -183,7 +225,7 @@ func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{} // Falsef asserts that the specified value is false. // -// assert.Falsef(t, myBool, "error message %s", "formatted") +// assert.Falsef(t, myBool, "error message %s", "formatted") func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -202,9 +244,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool // Greaterf asserts that the first element is greater than the second // -// assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") -// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +// assert.Greaterf(t, 2, 1, "error message %s", "formatted") +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") +// assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -214,10 +256,10 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in // GreaterOrEqualf asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -228,7 +270,7 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { @@ -241,7 +283,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url // HTTPBodyNotContainsf asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { @@ -253,7 +295,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // HTTPErrorf asserts that a specified handler returns an error status code. // -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -265,7 +307,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // HTTPRedirectf asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -277,7 +319,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri // HTTPStatusCodef asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { @@ -289,7 +331,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st // HTTPSuccessf asserts that a specified handler returns a success status code. // -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -301,7 +343,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -311,7 +353,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms // InDeltaf asserts that the two numerals are within delta of each other. // -// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -353,9 +395,9 @@ func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsil // IsDecreasingf asserts that the collection is decreasing // -// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -365,9 +407,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface // IsIncreasingf asserts that the collection is increasing // -// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -377,9 +419,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface // IsNonDecreasingf asserts that the collection is not decreasing // -// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -389,9 +431,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf // IsNonIncreasingf asserts that the collection is not increasing // -// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -409,7 +451,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin // JSONEqf asserts that two JSON strings are equivalent. // -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -420,7 +462,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -430,9 +472,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Lessf asserts that the first element is less than the second // -// assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") -// assert.Lessf(t, "a", "b", "error message %s", "formatted") +// assert.Lessf(t, 1, 2, "error message %s", "formatted") +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") +// assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -442,10 +484,10 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter // LessOrEqualf asserts that the first element is less than or equal to the second // -// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") -// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -455,8 +497,8 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . // Negativef asserts that the specified element is negative // -// assert.Negativef(t, -1, "error message %s", "formatted") -// assert.Negativef(t, -1.23, "error message %s", "formatted") +// assert.Negativef(t, -1, "error message %s", "formatted") +// assert.Negativef(t, -1.23, "error message %s", "formatted") func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -467,7 +509,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool // Neverf asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -477,7 +519,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time. // Nilf asserts that the specified object is nil. // -// assert.Nilf(t, err, "error message %s", "formatted") +// assert.Nilf(t, err, "error message %s", "formatted") func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -496,10 +538,10 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool // NoErrorf asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -519,9 +561,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) boo // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -532,9 +574,9 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -544,7 +586,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) // NotEqualf asserts that the specified values are NOT equal. // -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -557,7 +599,7 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, // NotEqualValuesf asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -576,7 +618,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf // NotNilf asserts that the specified object is not nil. // -// assert.NotNilf(t, err, "error message %s", "formatted") +// assert.NotNilf(t, err, "error message %s", "formatted") func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -586,7 +628,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bo // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -596,8 +638,8 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -607,7 +649,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args .. // NotSamef asserts that two pointers do not reference the same object. // -// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -621,7 +663,7 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -639,7 +681,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { // Panicsf asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -651,7 +693,7 @@ func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -662,7 +704,7 @@ func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -672,8 +714,8 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str // Positivef asserts that the specified element is positive // -// assert.Positivef(t, 1, "error message %s", "formatted") -// assert.Positivef(t, 1.23, "error message %s", "formatted") +// assert.Positivef(t, 1, "error message %s", "formatted") +// assert.Positivef(t, 1.23, "error message %s", "formatted") func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -683,8 +725,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -694,7 +736,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in // Samef asserts that two pointers reference the same object. // -// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -708,7 +750,7 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg // Subsetf asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -718,7 +760,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args // Truef asserts that the specified value is true. // -// assert.Truef(t, myBool, "error message %s", "formatted") +// assert.Truef(t, myBool, "error message %s", "formatted") func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -728,7 +770,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { // WithinDurationf asserts that the two times are within duration delta of each other. // -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -736,6 +778,16 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) } +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return WithinRange(t, actual, start, end, append([]interface{}{msg}, args...)...) +} + // YAMLEqf asserts that two YAML strings are equivalent. func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index d9ea368d0..b1d94aec5 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -30,9 +30,9 @@ func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{} // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -43,9 +43,9 @@ func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs .. // Containsf asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -98,7 +98,7 @@ func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg st // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// a.Empty(obj) +// a.Empty(obj) func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -109,7 +109,7 @@ func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { // Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// a.Emptyf(obj, "error message %s", "formatted") +// a.Emptyf(obj, "error message %s", "formatted") func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -119,7 +119,7 @@ func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) // Equal asserts that two objects are equal. // -// a.Equal(123, 123) +// a.Equal(123, 123) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -134,8 +134,8 @@ func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -146,8 +146,8 @@ func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ... // EqualErrorf asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -155,10 +155,44 @@ func (a *Assertions) EqualErrorf(theError error, errString string, msg string, a return EqualErrorf(a.t, theError, errString, msg, args...) } +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValues(S{1, 2}, S{1, 3}) => true +// a.EqualExportedValues(S{1, 2}, S{2, 3}) => false +func (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualExportedValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValuesf(S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// a.EqualExportedValuesf(S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EqualExportedValuesf(a.t, expected, actual, msg, args...) +} + // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValues(uint32(123), int32(123)) +// a.EqualValues(uint32(123), int32(123)) func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -169,7 +203,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -179,7 +213,7 @@ func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg // Equalf asserts that two objects are equal. // -// a.Equalf(123, 123, "error message %s", "formatted") +// a.Equalf(123, 123, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -193,10 +227,10 @@ func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string // Error asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) -// } +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -225,8 +259,8 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args .. // ErrorContains asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// a.ErrorContains(err, expectedErrorSubString) +// actualObj, err := SomeFunction() +// a.ErrorContains(err, expectedErrorSubString) func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -237,8 +271,8 @@ func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs . // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -266,10 +300,10 @@ func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...inter // Errorf asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -280,7 +314,7 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { // Eventually asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) +// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -288,10 +322,60 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti return Eventually(a.t, condition, waitFor, tick, msgAndArgs...) } +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithT(func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithT(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithTf(condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return EventuallyWithTf(a.t, condition, waitFor, tick, msg, args...) +} + // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -301,7 +385,7 @@ func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, t // Exactly asserts that two objects are equal in value and type. // -// a.Exactly(int32(123), int64(123)) +// a.Exactly(int32(123), int64(123)) func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -311,7 +395,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -353,7 +437,7 @@ func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{ // False asserts that the specified value is false. // -// a.False(myBool) +// a.False(myBool) func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -363,7 +447,7 @@ func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { // Falsef asserts that the specified value is false. // -// a.Falsef(myBool, "error message %s", "formatted") +// a.Falsef(myBool, "error message %s", "formatted") func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -391,9 +475,9 @@ func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) b // Greater asserts that the first element is greater than the second // -// a.Greater(2, 1) -// a.Greater(float64(2), float64(1)) -// a.Greater("b", "a") +// a.Greater(2, 1) +// a.Greater(float64(2), float64(1)) +// a.Greater("b", "a") func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -403,10 +487,10 @@ func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...inter // GreaterOrEqual asserts that the first element is greater than or equal to the second // -// a.GreaterOrEqual(2, 1) -// a.GreaterOrEqual(2, 2) -// a.GreaterOrEqual("b", "a") -// a.GreaterOrEqual("b", "b") +// a.GreaterOrEqual(2, 1) +// a.GreaterOrEqual(2, 2) +// a.GreaterOrEqual("b", "a") +// a.GreaterOrEqual("b", "b") func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -416,10 +500,10 @@ func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs . // GreaterOrEqualf asserts that the first element is greater than or equal to the second // -// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") -// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") -// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") -// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") +// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") +// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") +// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") +// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -429,9 +513,9 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // -// a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") -// a.Greaterf("b", "a", "error message %s", "formatted") +// a.Greaterf(2, 1, "error message %s", "formatted") +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") +// a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -442,7 +526,7 @@ func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args . // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { @@ -455,7 +539,7 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // -// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { @@ -468,7 +552,7 @@ func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { @@ -481,7 +565,7 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string // HTTPBodyNotContainsf asserts that a specified handler returns a // body that does not contain a string. // -// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) bool { @@ -493,7 +577,7 @@ func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method strin // HTTPError asserts that a specified handler returns an error status code. // -// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -505,7 +589,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // HTTPErrorf asserts that a specified handler returns an error status code. // -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -517,7 +601,7 @@ func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url str // HTTPRedirect asserts that a specified handler returns a redirect status code. // -// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -529,7 +613,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // HTTPRedirectf asserts that a specified handler returns a redirect status code. // -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -541,7 +625,7 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url // HTTPStatusCode asserts that a specified handler returns a specified status code. // -// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { @@ -553,7 +637,7 @@ func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url // HTTPStatusCodef asserts that a specified handler returns a specified status code. // -// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { @@ -565,7 +649,7 @@ func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, ur // HTTPSuccess asserts that a specified handler returns a success status code. // -// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -577,7 +661,7 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st // HTTPSuccessf asserts that a specified handler returns a success status code. // -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { @@ -589,7 +673,7 @@ func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url s // Implements asserts that an object is implemented by the specified interface. // -// a.Implements((*MyInterface)(nil), new(MyObject)) +// a.Implements((*MyInterface)(nil), new(MyObject)) func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -599,7 +683,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -609,7 +693,7 @@ func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{} // InDelta asserts that the two numerals are within delta of each other. // -// a.InDelta(math.Pi, 22/7.0, 0.01) +// a.InDelta(math.Pi, 22/7.0, 0.01) func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -651,7 +735,7 @@ func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, del // InDeltaf asserts that the two numerals are within delta of each other. // -// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -693,9 +777,9 @@ func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilo // IsDecreasing asserts that the collection is decreasing // -// a.IsDecreasing([]int{2, 1, 0}) -// a.IsDecreasing([]float{2, 1}) -// a.IsDecreasing([]string{"b", "a"}) +// a.IsDecreasing([]int{2, 1, 0}) +// a.IsDecreasing([]float{2, 1}) +// a.IsDecreasing([]string{"b", "a"}) func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -705,9 +789,9 @@ func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) // IsDecreasingf asserts that the collection is decreasing // -// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") -// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") -// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") +// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") +// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -717,9 +801,9 @@ func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...inter // IsIncreasing asserts that the collection is increasing // -// a.IsIncreasing([]int{1, 2, 3}) -// a.IsIncreasing([]float{1, 2}) -// a.IsIncreasing([]string{"a", "b"}) +// a.IsIncreasing([]int{1, 2, 3}) +// a.IsIncreasing([]float{1, 2}) +// a.IsIncreasing([]string{"a", "b"}) func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -729,9 +813,9 @@ func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) // IsIncreasingf asserts that the collection is increasing // -// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") -// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") -// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") +// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") +// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -741,9 +825,9 @@ func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...inter // IsNonDecreasing asserts that the collection is not decreasing // -// a.IsNonDecreasing([]int{1, 1, 2}) -// a.IsNonDecreasing([]float{1, 2}) -// a.IsNonDecreasing([]string{"a", "b"}) +// a.IsNonDecreasing([]int{1, 1, 2}) +// a.IsNonDecreasing([]float{1, 2}) +// a.IsNonDecreasing([]string{"a", "b"}) func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -753,9 +837,9 @@ func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface // IsNonDecreasingf asserts that the collection is not decreasing // -// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") -// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") -// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") +// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -765,9 +849,9 @@ func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...in // IsNonIncreasing asserts that the collection is not increasing // -// a.IsNonIncreasing([]int{2, 1, 1}) -// a.IsNonIncreasing([]float{2, 1}) -// a.IsNonIncreasing([]string{"b", "a"}) +// a.IsNonIncreasing([]int{2, 1, 1}) +// a.IsNonIncreasing([]float{2, 1}) +// a.IsNonIncreasing([]string{"b", "a"}) func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -777,9 +861,9 @@ func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface // IsNonIncreasingf asserts that the collection is not increasing // -// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") -// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") -// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") +// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") func (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -805,7 +889,7 @@ func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg s // JSONEq asserts that two JSON strings are equivalent. // -// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -815,7 +899,7 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interf // JSONEqf asserts that two JSON strings are equivalent. // -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -826,7 +910,7 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// a.Len(mySlice, 3) +// a.Len(mySlice, 3) func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -837,7 +921,7 @@ func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // -// a.Lenf(mySlice, 3, "error message %s", "formatted") +// a.Lenf(mySlice, 3, "error message %s", "formatted") func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -847,9 +931,9 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in // Less asserts that the first element is less than the second // -// a.Less(1, 2) -// a.Less(float64(1), float64(2)) -// a.Less("a", "b") +// a.Less(1, 2) +// a.Less(float64(1), float64(2)) +// a.Less("a", "b") func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -859,10 +943,10 @@ func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interfac // LessOrEqual asserts that the first element is less than or equal to the second // -// a.LessOrEqual(1, 2) -// a.LessOrEqual(2, 2) -// a.LessOrEqual("a", "b") -// a.LessOrEqual("b", "b") +// a.LessOrEqual(1, 2) +// a.LessOrEqual(2, 2) +// a.LessOrEqual("a", "b") +// a.LessOrEqual("b", "b") func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -872,10 +956,10 @@ func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...i // LessOrEqualf asserts that the first element is less than or equal to the second // -// a.LessOrEqualf(1, 2, "error message %s", "formatted") -// a.LessOrEqualf(2, 2, "error message %s", "formatted") -// a.LessOrEqualf("a", "b", "error message %s", "formatted") -// a.LessOrEqualf("b", "b", "error message %s", "formatted") +// a.LessOrEqualf(1, 2, "error message %s", "formatted") +// a.LessOrEqualf(2, 2, "error message %s", "formatted") +// a.LessOrEqualf("a", "b", "error message %s", "formatted") +// a.LessOrEqualf("b", "b", "error message %s", "formatted") func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -885,9 +969,9 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // -// a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1), float64(2), "error message %s", "formatted") -// a.Lessf("a", "b", "error message %s", "formatted") +// a.Lessf(1, 2, "error message %s", "formatted") +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") +// a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -897,8 +981,8 @@ func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...i // Negative asserts that the specified element is negative // -// a.Negative(-1) -// a.Negative(-1.23) +// a.Negative(-1) +// a.Negative(-1.23) func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -908,8 +992,8 @@ func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) bool { // Negativef asserts that the specified element is negative // -// a.Negativef(-1, "error message %s", "formatted") -// a.Negativef(-1.23, "error message %s", "formatted") +// a.Negativef(-1, "error message %s", "formatted") +// a.Negativef(-1.23, "error message %s", "formatted") func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -920,7 +1004,7 @@ func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) b // Never asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -931,7 +1015,7 @@ func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick ti // Neverf asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -941,7 +1025,7 @@ func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick t // Nil asserts that the specified object is nil. // -// a.Nil(err) +// a.Nil(err) func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -951,7 +1035,7 @@ func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { // Nilf asserts that the specified object is nil. // -// a.Nilf(err, "error message %s", "formatted") +// a.Nilf(err, "error message %s", "formatted") func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -979,10 +1063,10 @@ func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) // NoError asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -992,10 +1076,10 @@ func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { // NoErrorf asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1024,9 +1108,9 @@ func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1037,9 +1121,9 @@ func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1050,9 +1134,9 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if a.NotEmpty(obj) { -// assert.Equal(t, "two", obj[1]) -// } +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1063,9 +1147,9 @@ func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) boo // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1075,7 +1159,7 @@ func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface // NotEqual asserts that the specified values are NOT equal. // -// a.NotEqual(obj1, obj2) +// a.NotEqual(obj1, obj2) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1088,7 +1172,7 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr // NotEqualValues asserts that two objects are not equal even when converted to the same type // -// a.NotEqualValues(obj1, obj2) +// a.NotEqualValues(obj1, obj2) func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1098,7 +1182,7 @@ func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, ms // NotEqualValuesf asserts that two objects are not equal even when converted to the same type // -// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1108,7 +1192,7 @@ func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, m // NotEqualf asserts that the specified values are NOT equal. // -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1139,7 +1223,7 @@ func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...in // NotNil asserts that the specified object is not nil. // -// a.NotNil(err) +// a.NotNil(err) func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1149,7 +1233,7 @@ func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool // NotNilf asserts that the specified object is not nil. // -// a.NotNilf(err, "error message %s", "formatted") +// a.NotNilf(err, "error message %s", "formatted") func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1159,7 +1243,7 @@ func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{} // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// a.NotPanics(func(){ RemainCalm() }) +// a.NotPanics(func(){ RemainCalm() }) func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1169,7 +1253,7 @@ func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. // -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1179,8 +1263,8 @@ func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{} // NotRegexp asserts that a specified regexp does not match a string. // -// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") -// a.NotRegexp("^start", "it's not starting") +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1190,8 +1274,8 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1201,7 +1285,7 @@ func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, arg // NotSame asserts that two pointers do not reference the same object. // -// a.NotSame(ptr1, ptr2) +// a.NotSame(ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1214,7 +1298,7 @@ func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArg // NotSamef asserts that two pointers do not reference the same object. // -// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1228,7 +1312,7 @@ func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg stri // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1239,7 +1323,7 @@ func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1265,7 +1349,7 @@ func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bo // Panics asserts that the code inside the specified PanicTestFunc panics. // -// a.Panics(func(){ GoCrazy() }) +// a.Panics(func(){ GoCrazy() }) func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1277,7 +1361,7 @@ func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1289,7 +1373,7 @@ func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndAr // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1300,7 +1384,7 @@ func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg str // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1311,7 +1395,7 @@ func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgA // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1321,7 +1405,7 @@ func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg // Panicsf asserts that the code inside the specified PanicTestFunc panics. // -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1331,8 +1415,8 @@ func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) b // Positive asserts that the specified element is positive // -// a.Positive(1) -// a.Positive(1.23) +// a.Positive(1) +// a.Positive(1.23) func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1342,8 +1426,8 @@ func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) bool { // Positivef asserts that the specified element is positive // -// a.Positivef(1, "error message %s", "formatted") -// a.Positivef(1.23, "error message %s", "formatted") +// a.Positivef(1, "error message %s", "formatted") +// a.Positivef(1.23, "error message %s", "formatted") func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1353,8 +1437,8 @@ func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) b // Regexp asserts that a specified regexp matches a string. // -// a.Regexp(regexp.MustCompile("start"), "it's starting") -// a.Regexp("start...$", "it's not starting") +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1364,8 +1448,8 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1375,7 +1459,7 @@ func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args . // Same asserts that two pointers reference the same object. // -// a.Same(ptr1, ptr2) +// a.Same(ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1388,7 +1472,7 @@ func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs . // Samef asserts that two pointers reference the same object. // -// a.Samef(ptr1, ptr2, "error message %s", "formatted") +// a.Samef(ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1402,7 +1486,7 @@ func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, // Subset asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1413,7 +1497,7 @@ func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ... // Subsetf asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1423,7 +1507,7 @@ func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, a // True asserts that the specified value is true. // -// a.True(myBool) +// a.True(myBool) func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1433,7 +1517,7 @@ func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { // Truef asserts that the specified value is true. // -// a.Truef(myBool, "error message %s", "formatted") +// a.Truef(myBool, "error message %s", "formatted") func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1443,7 +1527,7 @@ func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { // WithinDuration asserts that the two times are within duration delta of each other. // -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1453,7 +1537,7 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta // WithinDurationf asserts that the two times are within duration delta of each other. // -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1461,6 +1545,26 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta return WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return WithinRangef(a.t, actual, start, end, msg, args...) +} + // YAMLEq asserts that two YAML strings are equivalent. func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go index 759448783..00df62a05 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_order.go @@ -46,36 +46,36 @@ func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareT // IsIncreasing asserts that the collection is increasing // -// assert.IsIncreasing(t, []int{1, 2, 3}) -// assert.IsIncreasing(t, []float{1, 2}) -// assert.IsIncreasing(t, []string{"a", "b"}) +// assert.IsIncreasing(t, []int{1, 2, 3}) +// assert.IsIncreasing(t, []float{1, 2}) +// assert.IsIncreasing(t, []string{"a", "b"}) func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs...) } // IsNonIncreasing asserts that the collection is not increasing // -// assert.IsNonIncreasing(t, []int{2, 1, 1}) -// assert.IsNonIncreasing(t, []float{2, 1}) -// assert.IsNonIncreasing(t, []string{"b", "a"}) +// assert.IsNonIncreasing(t, []int{2, 1, 1}) +// assert.IsNonIncreasing(t, []float{2, 1}) +// assert.IsNonIncreasing(t, []string{"b", "a"}) func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs...) } // IsDecreasing asserts that the collection is decreasing // -// assert.IsDecreasing(t, []int{2, 1, 0}) -// assert.IsDecreasing(t, []float{2, 1}) -// assert.IsDecreasing(t, []string{"b", "a"}) +// assert.IsDecreasing(t, []int{2, 1, 0}) +// assert.IsDecreasing(t, []float{2, 1}) +// assert.IsDecreasing(t, []string{"b", "a"}) func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs...) } // IsNonDecreasing asserts that the collection is not decreasing // -// assert.IsNonDecreasing(t, []int{1, 1, 2}) -// assert.IsNonDecreasing(t, []float{1, 2}) -// assert.IsNonDecreasing(t, []string{"a", "b"}) +// assert.IsNonDecreasing(t, []int{1, 1, 2}) +// assert.IsNonDecreasing(t, []float{1, 2}) +// assert.IsNonDecreasing(t, []string{"a", "b"}) func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs...) } diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 0357b2231..a55d1bba9 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -75,6 +75,77 @@ func ObjectsAreEqual(expected, actual interface{}) bool { return bytes.Equal(exp, act) } +// copyExportedFields iterates downward through nested data structures and creates a copy +// that only contains the exported struct fields. +func copyExportedFields(expected interface{}) interface{} { + if isNil(expected) { + return expected + } + + expectedType := reflect.TypeOf(expected) + expectedKind := expectedType.Kind() + expectedValue := reflect.ValueOf(expected) + + switch expectedKind { + case reflect.Struct: + result := reflect.New(expectedType).Elem() + for i := 0; i < expectedType.NumField(); i++ { + field := expectedType.Field(i) + isExported := field.IsExported() + if isExported { + fieldValue := expectedValue.Field(i) + if isNil(fieldValue) || isNil(fieldValue.Interface()) { + continue + } + newValue := copyExportedFields(fieldValue.Interface()) + result.Field(i).Set(reflect.ValueOf(newValue)) + } + } + return result.Interface() + + case reflect.Ptr: + result := reflect.New(expectedType.Elem()) + unexportedRemoved := copyExportedFields(expectedValue.Elem().Interface()) + result.Elem().Set(reflect.ValueOf(unexportedRemoved)) + return result.Interface() + + case reflect.Array, reflect.Slice: + result := reflect.MakeSlice(expectedType, expectedValue.Len(), expectedValue.Len()) + for i := 0; i < expectedValue.Len(); i++ { + index := expectedValue.Index(i) + if isNil(index) { + continue + } + unexportedRemoved := copyExportedFields(index.Interface()) + result.Index(i).Set(reflect.ValueOf(unexportedRemoved)) + } + return result.Interface() + + case reflect.Map: + result := reflect.MakeMap(expectedType) + for _, k := range expectedValue.MapKeys() { + index := expectedValue.MapIndex(k) + unexportedRemoved := copyExportedFields(index.Interface()) + result.SetMapIndex(k, reflect.ValueOf(unexportedRemoved)) + } + return result.Interface() + + default: + return expected + } +} + +// ObjectsExportedFieldsAreEqual determines if the exported (public) fields of two objects are +// considered equal. This comparison of only exported fields is applied recursively to nested data +// structures. +// +// This function does no assertion of any kind. +func ObjectsExportedFieldsAreEqual(expected, actual interface{}) bool { + expectedCleaned := copyExportedFields(expected) + actualCleaned := copyExportedFields(actual) + return ObjectsAreEqualValues(expectedCleaned, actualCleaned) +} + // ObjectsAreEqualValues gets whether two objects are equal, or if their // values are equal. func ObjectsAreEqualValues(expected, actual interface{}) bool { @@ -140,10 +211,10 @@ func CallerInfo() []string { } parts := strings.Split(file, "/") - file = parts[len(parts)-1] if len(parts) > 1 { + filename := parts[len(parts)-1] dir := parts[len(parts)-2] - if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + if (dir != "assert" && dir != "mock" && dir != "require") || filename == "mock_test.go" { callers = append(callers, fmt.Sprintf("%s:%d", file, line)) } } @@ -271,7 +342,7 @@ type labeledContent struct { // labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: // -// \t{{label}}:{{align_spaces}}\t{{content}}\n +// \t{{label}}:{{align_spaces}}\t{{content}}\n // // The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. // If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this @@ -294,7 +365,7 @@ func labeledOutput(content ...labeledContent) string { // Implements asserts that an object is implemented by the specified interface. // -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -326,7 +397,7 @@ func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs // Equal asserts that two objects are equal. // -// assert.Equal(t, 123, 123) +// assert.Equal(t, 123, 123) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -367,7 +438,7 @@ func validateEqualArgs(expected, actual interface{}) error { // Same asserts that two pointers reference the same object. // -// assert.Same(t, ptr1, ptr2) +// assert.Same(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -387,7 +458,7 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b // NotSame asserts that two pointers do not reference the same object. // -// assert.NotSame(t, ptr1, ptr2) +// assert.NotSame(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -455,7 +526,7 @@ func truncatingFormat(data interface{}) string { // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValues(t, uint32(123), int32(123)) +// assert.EqualValues(t, uint32(123), int32(123)) func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -473,9 +544,53 @@ func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interfa } +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true +// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false +func EqualExportedValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\t%v != %v", aType, bType), msgAndArgs...) + } + + if aType.Kind() != reflect.Struct { + return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", aType.Kind(), reflect.Struct), msgAndArgs...) + } + + if bType.Kind() != reflect.Struct { + return Fail(t, fmt.Sprintf("Types expected to both be struct \n\t%v != %v", bType.Kind(), reflect.Struct), msgAndArgs...) + } + + expected = copyExportedFields(expected) + actual = copyExportedFields(actual) + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal (comparing only exported fields): \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) + } + + return true +} + // Exactly asserts that two objects are equal in value and type. // -// assert.Exactly(t, int32(123), int64(123)) +// assert.Exactly(t, int32(123), int64(123)) func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -494,7 +609,7 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // NotNil asserts that the specified object is not nil. // -// assert.NotNil(t, err) +// assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if !isNil(object) { return true @@ -528,7 +643,7 @@ func isNil(object interface{}) bool { []reflect.Kind{ reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, - reflect.Ptr, reflect.Slice}, + reflect.Ptr, reflect.Slice, reflect.UnsafePointer}, kind) if isNilableKind && value.IsNil() { @@ -540,7 +655,7 @@ func isNil(object interface{}) bool { // Nil asserts that the specified object is nil. // -// assert.Nil(t, err) +// assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { if isNil(object) { return true @@ -563,16 +678,17 @@ func isEmpty(object interface{}) bool { switch objValue.Kind() { // collection types are empty when they have no element - case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + case reflect.Chan, reflect.Map, reflect.Slice: return objValue.Len() == 0 - // pointers are empty if nil or if the value they point to is empty + // pointers are empty if nil or if the value they point to is empty case reflect.Ptr: if objValue.IsNil() { return true } deref := objValue.Elem().Interface() return isEmpty(deref) - // for all other types, compare against the zero value + // for all other types, compare against the zero value + // array types are empty when they match their zero-initialized state default: zero := reflect.Zero(objValue.Type()) return reflect.DeepEqual(object, zero.Interface()) @@ -582,7 +698,7 @@ func isEmpty(object interface{}) bool { // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Empty(t, obj) +// assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { pass := isEmpty(object) if !pass { @@ -599,9 +715,9 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) -// } +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { pass := !isEmpty(object) if !pass { @@ -630,7 +746,7 @@ func getLen(x interface{}) (ok bool, length int) { // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// assert.Len(t, mySlice, 3) +// assert.Len(t, mySlice, 3) func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -648,7 +764,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // True asserts that the specified value is true. // -// assert.True(t, myBool) +// assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { if !value { if h, ok := t.(tHelper); ok { @@ -663,7 +779,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // False asserts that the specified value is false. // -// assert.False(t, myBool) +// assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { if value { if h, ok := t.(tHelper); ok { @@ -678,7 +794,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { // NotEqual asserts that the specified values are NOT equal. // -// assert.NotEqual(t, obj1, obj2) +// assert.NotEqual(t, obj1, obj2) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -701,7 +817,7 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ // NotEqualValues asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValues(t, obj1, obj2) +// assert.NotEqualValues(t, obj1, obj2) func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -760,9 +876,9 @@ func containsElement(list interface{}, element interface{}) (ok, found bool) { // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -783,9 +899,9 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -793,10 +909,10 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) ok, found := containsElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) } if found { - return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v should not contain %#v", s, contains), msgAndArgs...) } return true @@ -806,7 +922,7 @@ func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) // Subset asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { if h, ok := t.(tHelper); ok { h.Helper() @@ -815,32 +931,44 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok return true // we consider nil to be equal to the nil set } - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } - if subsetKind != reflect.Array && subsetKind != reflect.Slice { + subsetKind := reflect.TypeOf(subset).Kind() + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() + if subsetKind == reflect.Map && listKind == reflect.Map { + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) + + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !av.IsValid() { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, subset), msgAndArgs...) + } + } + + return true + } + + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() ok, found := containsElement(list, element) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", list), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", list, element), msgAndArgs...) } } @@ -850,7 +978,7 @@ func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { if h, ok := t.(tHelper); ok { h.Helper() @@ -859,26 +987,38 @@ func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) return Fail(t, "nil is the empty set which is a subset of every set", msgAndArgs...) } - subsetValue := reflect.ValueOf(subset) - defer func() { - if e := recover(); e != nil { - ok = false - } - }() - listKind := reflect.TypeOf(list).Kind() - subsetKind := reflect.TypeOf(subset).Kind() - - if listKind != reflect.Array && listKind != reflect.Slice { + if listKind != reflect.Array && listKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) } - if subsetKind != reflect.Array && subsetKind != reflect.Slice { + subsetKind := reflect.TypeOf(subset).Kind() + if subsetKind != reflect.Array && subsetKind != reflect.Slice && listKind != reflect.Map { return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) } - for i := 0; i < subsetValue.Len(); i++ { - element := subsetValue.Index(i).Interface() + if subsetKind == reflect.Map && listKind == reflect.Map { + subsetMap := reflect.ValueOf(subset) + actualMap := reflect.ValueOf(list) + + for _, k := range subsetMap.MapKeys() { + ev := subsetMap.MapIndex(k) + av := actualMap.MapIndex(k) + + if !av.IsValid() { + return true + } + if !ObjectsAreEqual(ev.Interface(), av.Interface()) { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) + } + + subsetList := reflect.ValueOf(subset) + for i := 0; i < subsetList.Len(); i++ { + element := subsetList.Index(i).Interface() ok, found := containsElement(list, element) if !ok { return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) @@ -1023,7 +1163,7 @@ func didPanic(f PanicTestFunc) (didPanic bool, message interface{}, stack string // Panics asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panics(t, func(){ GoCrazy() }) +// assert.Panics(t, func(){ GoCrazy() }) func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1039,7 +1179,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1060,7 +1200,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1080,7 +1220,7 @@ func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs . // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanics(t, func(){ RemainCalm() }) +// assert.NotPanics(t, func(){ RemainCalm() }) func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1095,7 +1235,7 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { // WithinDuration asserts that the two times are within duration delta of each other. // -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1109,6 +1249,27 @@ func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, return true } +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual, start, end time.Time, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if end.Before(start) { + return Fail(t, "Start should be before end", msgAndArgs...) + } + + if actual.Before(start) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is before the range", actual, start, end), msgAndArgs...) + } else if actual.After(end) { + return Fail(t, fmt.Sprintf("Time %v expected to be in time range %v to %v, but is after the range", actual, start, end), msgAndArgs...) + } + + return true +} + func toFloat(x interface{}) (float64, bool) { var xf float64 xok := true @@ -1149,7 +1310,7 @@ func toFloat(x interface{}) (float64, bool) { // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1322,10 +1483,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // NoError asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { if err != nil { if h, ok := t.(tHelper); ok { @@ -1339,10 +1500,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // Error asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) -// } +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { if err == nil { if h, ok := t.(tHelper); ok { @@ -1357,8 +1518,8 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1380,8 +1541,8 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte // ErrorContains asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// assert.ErrorContains(t, err, expectedErrorSubString) +// actualObj, err := SomeFunction() +// assert.ErrorContains(t, err, expectedErrorSubString) func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1414,8 +1575,8 @@ func matchRegexp(rx interface{}, str interface{}) bool { // Regexp asserts that a specified regexp matches a string. // -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1432,8 +1593,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // NotRegexp asserts that a specified regexp does not match a string. // -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1545,7 +1706,7 @@ func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { // JSONEq asserts that two JSON strings are equivalent. // -// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1668,7 +1829,7 @@ type tHelper interface { // Eventually asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1698,10 +1859,93 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t } } +// CollectT implements the TestingT interface and collects all errors. +type CollectT struct { + errors []error +} + +// Errorf collects the error. +func (c *CollectT) Errorf(format string, args ...interface{}) { + c.errors = append(c.errors, fmt.Errorf(format, args...)) +} + +// FailNow panics. +func (c *CollectT) FailNow() { + panic("Assertion failed") +} + +// Reset clears the collected errors. +func (c *CollectT) Reset() { + c.errors = nil +} + +// Copy copies the collected errors to the supplied t. +func (c *CollectT) Copy(t TestingT) { + if tt, ok := t.(tHelper); ok { + tt.Helper() + } + for _, err := range c.errors { + t.Errorf("%v", err) + } +} + +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithT(t, func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithT(t TestingT, condition func(collect *CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + collect := new(CollectT) + ch := make(chan bool, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + collect.Copy(t) + return Fail(t, "Condition never satisfied", msgAndArgs...) + case <-tick: + tick = nil + collect.Reset() + go func() { + condition(collect) + ch <- len(collect.errors) == 0 + }() + case v := <-ch: + if v { + return true + } + tick = ticker.C + } + } +} + // Never asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() diff --git a/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/stretchr/testify/assert/doc.go index c9dccc4d6..4953981d3 100644 --- a/vendor/github.com/stretchr/testify/assert/doc.go +++ b/vendor/github.com/stretchr/testify/assert/doc.go @@ -1,39 +1,40 @@ // Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. // -// Example Usage +// # Example Usage // // The following is a complete example using assert in a standard test function: -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) // -// func TestSomething(t *testing.T) { +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) // -// var a string = "Hello" -// var b string = "Hello" +// func TestSomething(t *testing.T) { // -// assert.Equal(t, a, b, "The two words should be the same.") +// var a string = "Hello" +// var b string = "Hello" // -// } +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } // // if you assert many times, use the format below: // -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// ) +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) // -// func TestSomething(t *testing.T) { -// assert := assert.New(t) +// func TestSomething(t *testing.T) { +// assert := assert.New(t) // -// var a string = "Hello" -// var b string = "Hello" +// var a string = "Hello" +// var b string = "Hello" // -// assert.Equal(a, b, "The two words should be the same.") -// } +// assert.Equal(a, b, "The two words should be the same.") +// } // -// Assertions +// # Assertions // // Assertions allow you to easily write test code, and are global funcs in the `assert` package. // All assertion functions take, as the first argument, the `*testing.T` object provided by the diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index 4ed341dd2..d8038c28a 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -23,7 +23,7 @@ func httpCode(handler http.HandlerFunc, method, url string, values url.Values) ( // HTTPSuccess asserts that a specified handler returns a success status code. // -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -45,7 +45,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value // HTTPRedirect asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -67,7 +67,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu // HTTPError asserts that a specified handler returns an error status code. // -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, msgAndArgs ...interface{}) bool { @@ -89,7 +89,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values // HTTPStatusCode asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { @@ -124,7 +124,7 @@ func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) s // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { @@ -144,7 +144,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) bool { diff --git a/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/stretchr/testify/require/doc.go index 169de3922..968434724 100644 --- a/vendor/github.com/stretchr/testify/require/doc.go +++ b/vendor/github.com/stretchr/testify/require/doc.go @@ -1,24 +1,25 @@ // Package require implements the same assertions as the `assert` package but // stops test execution when a test fails. // -// Example Usage +// # Example Usage // // The following is a complete example using require in a standard test function: -// import ( -// "testing" -// "github.com/stretchr/testify/require" -// ) // -// func TestSomething(t *testing.T) { +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) // -// var a string = "Hello" -// var b string = "Hello" +// func TestSomething(t *testing.T) { // -// require.Equal(t, a, b, "The two words should be the same.") +// var a string = "Hello" +// var b string = "Hello" // -// } +// require.Equal(t, a, b, "The two words should be the same.") // -// Assertions +// } +// +// # Assertions // // The `require` package have same global functions as in the `assert` package, // but instead of returning a boolean result they call `t.FailNow()`. diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go index 59c48277a..63f852147 100644 --- a/vendor/github.com/stretchr/testify/require/require.go +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -37,9 +37,9 @@ func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interfac // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Contains(t, "Hello World", "World") -// assert.Contains(t, ["Hello", "World"], "World") -// assert.Contains(t, {"Hello": "World"}, "Hello") +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -53,9 +53,9 @@ func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...int // Containsf asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") -// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") -// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -123,7 +123,7 @@ func ElementsMatchf(t TestingT, listA interface{}, listB interface{}, msg string // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Empty(t, obj) +// assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -137,7 +137,7 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { // Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// assert.Emptyf(t, obj, "error message %s", "formatted") +// assert.Emptyf(t, obj, "error message %s", "formatted") func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -150,7 +150,7 @@ func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { // Equal asserts that two objects are equal. // -// assert.Equal(t, 123, 123) +// assert.Equal(t, 123, 123) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -168,8 +168,8 @@ func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...i // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// assert.EqualError(t, err, expectedErrorString) +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -183,8 +183,8 @@ func EqualError(t TestingT, theError error, errString string, msgAndArgs ...inte // EqualErrorf asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -195,10 +195,50 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args t.FailNow() } +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValues(t, S{1, 2}, S{1, 3}) => true +// assert.EqualExportedValues(t, S{1, 2}, S{2, 3}) => false +func EqualExportedValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualExportedValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// assert.EqualExportedValuesf(t, S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// assert.EqualExportedValuesf(t, S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func EqualExportedValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EqualExportedValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValues(t, uint32(123), int32(123)) +// assert.EqualValues(t, uint32(123), int32(123)) func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -212,7 +252,7 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -225,7 +265,7 @@ func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg stri // Equalf asserts that two objects are equal. // -// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// assert.Equalf(t, 123, 123, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -242,10 +282,10 @@ func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, ar // Error asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if assert.Error(t, err) { -// assert.Equal(t, expectedError, err) -// } +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } func Error(t TestingT, err error, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -283,8 +323,8 @@ func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...int // ErrorContains asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// assert.ErrorContains(t, err, expectedErrorSubString) +// actualObj, err := SomeFunction() +// assert.ErrorContains(t, err, expectedErrorSubString) func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -298,8 +338,8 @@ func ErrorContains(t TestingT, theError error, contains string, msgAndArgs ...in // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// assert.ErrorContainsf(t, err, expectedErrorSubString, "error message %s", "formatted") func ErrorContainsf(t TestingT, theError error, contains string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -336,10 +376,10 @@ func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface // Errorf asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if assert.Errorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } func Errorf(t TestingT, err error, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -353,7 +393,7 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) { // Eventually asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) +// assert.Eventually(t, func() bool { return true; }, time.Second, 10*time.Millisecond) func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -364,10 +404,66 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t t.FailNow() } +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithT(t, func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithT(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EventuallyWithT(t, condition, waitFor, tick, msgAndArgs...) { + return + } + t.FailNow() +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// assert.EventuallyWithTf(t, func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func EventuallyWithTf(t TestingT, condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.EventuallyWithTf(t, condition, waitFor, tick, msg, args...) { + return + } + t.FailNow() +} + // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// assert.Eventuallyf(t, func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -380,7 +476,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactly asserts that two objects are equal in value and type. // -// assert.Exactly(t, int32(123), int64(123)) +// assert.Exactly(t, int32(123), int64(123)) func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -393,7 +489,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -450,7 +546,7 @@ func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { // False asserts that the specified value is false. // -// assert.False(t, myBool) +// assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -463,7 +559,7 @@ func False(t TestingT, value bool, msgAndArgs ...interface{}) { // Falsef asserts that the specified value is false. // -// assert.Falsef(t, myBool, "error message %s", "formatted") +// assert.Falsef(t, myBool, "error message %s", "formatted") func Falsef(t TestingT, value bool, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -500,9 +596,9 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) { // Greater asserts that the first element is greater than the second // -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -515,10 +611,10 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface // GreaterOrEqual asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -531,10 +627,10 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in // GreaterOrEqualf asserts that the first element is greater than or equal to the second // -// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") -// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 1, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "a", "error message %s", "formatted") +// assert.GreaterOrEqualf(t, "b", "b", "error message %s", "formatted") func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -547,9 +643,9 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // Greaterf asserts that the first element is greater than the second // -// assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") -// assert.Greaterf(t, "b", "a", "error message %s", "formatted") +// assert.Greaterf(t, 2, 1, "error message %s", "formatted") +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") +// assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -563,7 +659,7 @@ func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...in // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -579,7 +675,7 @@ func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url s // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // -// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// assert.HTTPBodyContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -595,7 +691,7 @@ func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// assert.HTTPBodyNotContains(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -611,7 +707,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, ur // HTTPBodyNotContainsf asserts that a specified handler returns a // body that does not contain a string. // -// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// assert.HTTPBodyNotContainsf(t, myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -626,7 +722,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // HTTPError asserts that a specified handler returns an error status code. // -// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -641,7 +737,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, // HTTPErrorf asserts that a specified handler returns an error status code. // -// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -656,7 +752,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // HTTPRedirect asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -671,7 +767,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin // HTTPRedirectf asserts that a specified handler returns a redirect status code. // -// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -686,7 +782,7 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri // HTTPStatusCode asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { @@ -701,7 +797,7 @@ func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url str // HTTPStatusCodef asserts that a specified handler returns a specified status code. // -// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { @@ -716,7 +812,7 @@ func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url st // HTTPSuccess asserts that a specified handler returns a success status code. // -// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -731,7 +827,7 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string // HTTPSuccessf asserts that a specified handler returns a success status code. // -// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -746,7 +842,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implements asserts that an object is implemented by the specified interface. // -// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -759,7 +855,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -772,7 +868,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, 22/7.0, 0.01) +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -829,7 +925,7 @@ func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta f // InDeltaf asserts that the two numerals are within delta of each other. // -// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -886,9 +982,9 @@ func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon fl // IsDecreasing asserts that the collection is decreasing // -// assert.IsDecreasing(t, []int{2, 1, 0}) -// assert.IsDecreasing(t, []float{2, 1}) -// assert.IsDecreasing(t, []string{"b", "a"}) +// assert.IsDecreasing(t, []int{2, 1, 0}) +// assert.IsDecreasing(t, []float{2, 1}) +// assert.IsDecreasing(t, []string{"b", "a"}) func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -901,9 +997,9 @@ func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { // IsDecreasingf asserts that the collection is decreasing // -// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -916,9 +1012,9 @@ func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface // IsIncreasing asserts that the collection is increasing // -// assert.IsIncreasing(t, []int{1, 2, 3}) -// assert.IsIncreasing(t, []float{1, 2}) -// assert.IsIncreasing(t, []string{"a", "b"}) +// assert.IsIncreasing(t, []int{1, 2, 3}) +// assert.IsIncreasing(t, []float{1, 2}) +// assert.IsIncreasing(t, []string{"a", "b"}) func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -931,9 +1027,9 @@ func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { // IsIncreasingf asserts that the collection is increasing // -// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -946,9 +1042,9 @@ func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface // IsNonDecreasing asserts that the collection is not decreasing // -// assert.IsNonDecreasing(t, []int{1, 1, 2}) -// assert.IsNonDecreasing(t, []float{1, 2}) -// assert.IsNonDecreasing(t, []string{"a", "b"}) +// assert.IsNonDecreasing(t, []int{1, 1, 2}) +// assert.IsNonDecreasing(t, []float{1, 2}) +// assert.IsNonDecreasing(t, []string{"a", "b"}) func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -961,9 +1057,9 @@ func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) // IsNonDecreasingf asserts that the collection is not decreasing // -// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") -// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -976,9 +1072,9 @@ func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interf // IsNonIncreasing asserts that the collection is not increasing // -// assert.IsNonIncreasing(t, []int{2, 1, 1}) -// assert.IsNonIncreasing(t, []float{2, 1}) -// assert.IsNonIncreasing(t, []string{"b", "a"}) +// assert.IsNonIncreasing(t, []int{2, 1, 1}) +// assert.IsNonIncreasing(t, []float{2, 1}) +// assert.IsNonIncreasing(t, []string{"b", "a"}) func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -991,9 +1087,9 @@ func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) // IsNonIncreasingf asserts that the collection is not increasing // -// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") -// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1028,7 +1124,7 @@ func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg strin // JSONEq asserts that two JSON strings are equivalent. // -// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1041,7 +1137,7 @@ func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{ // JSONEqf asserts that two JSON strings are equivalent. // -// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1055,7 +1151,7 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// assert.Len(t, mySlice, 3) +// assert.Len(t, mySlice, 3) func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1069,7 +1165,7 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // -// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1082,9 +1178,9 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Less asserts that the first element is less than the second // -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1097,10 +1193,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) // LessOrEqual asserts that the first element is less than or equal to the second // -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1113,10 +1209,10 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter // LessOrEqualf asserts that the first element is less than or equal to the second // -// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") -// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") -// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, 1, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, 2, 2, "error message %s", "formatted") +// assert.LessOrEqualf(t, "a", "b", "error message %s", "formatted") +// assert.LessOrEqualf(t, "b", "b", "error message %s", "formatted") func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1129,9 +1225,9 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . // Lessf asserts that the first element is less than the second // -// assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") -// assert.Lessf(t, "a", "b", "error message %s", "formatted") +// assert.Lessf(t, 1, 2, "error message %s", "formatted") +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") +// assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1144,8 +1240,8 @@ func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...inter // Negative asserts that the specified element is negative // -// assert.Negative(t, -1) -// assert.Negative(t, -1.23) +// assert.Negative(t, -1) +// assert.Negative(t, -1.23) func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1158,8 +1254,8 @@ func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) { // Negativef asserts that the specified element is negative // -// assert.Negativef(t, -1, "error message %s", "formatted") -// assert.Negativef(t, -1.23, "error message %s", "formatted") +// assert.Negativef(t, -1, "error message %s", "formatted") +// assert.Negativef(t, -1.23, "error message %s", "formatted") func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1173,7 +1269,7 @@ func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) { // Never asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1187,7 +1283,7 @@ func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.D // Neverf asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1200,7 +1296,7 @@ func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time. // Nil asserts that the specified object is nil. // -// assert.Nil(t, err) +// assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1213,7 +1309,7 @@ func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { // Nilf asserts that the specified object is nil. // -// assert.Nilf(t, err, "error message %s", "formatted") +// assert.Nilf(t, err, "error message %s", "formatted") func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1250,10 +1346,10 @@ func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) { // NoError asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if assert.NoError(t, err) { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } func NoError(t TestingT, err error, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1266,10 +1362,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) { // NoErrorf asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if assert.NoErrorf(t, err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1307,9 +1403,9 @@ func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) { // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContains(t, "Hello World", "Earth") -// assert.NotContains(t, ["Hello", "World"], "Earth") -// assert.NotContains(t, {"Hello": "World"}, "Earth") +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1323,9 +1419,9 @@ func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ... // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") -// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1339,9 +1435,9 @@ func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, a // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmpty(t, obj) { -// assert.Equal(t, "two", obj[1]) -// } +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1355,9 +1451,9 @@ func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1370,7 +1466,7 @@ func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) // NotEqual asserts that the specified values are NOT equal. // -// assert.NotEqual(t, obj1, obj2) +// assert.NotEqual(t, obj1, obj2) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1386,7 +1482,7 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs . // NotEqualValues asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValues(t, obj1, obj2) +// assert.NotEqualValues(t, obj1, obj2) func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1399,7 +1495,7 @@ func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAnd // NotEqualValuesf asserts that two objects are not equal even when converted to the same type // -// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1412,7 +1508,7 @@ func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg s // NotEqualf asserts that the specified values are NOT equal. // -// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1452,7 +1548,7 @@ func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interf // NotNil asserts that the specified object is not nil. // -// assert.NotNil(t, err) +// assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1465,7 +1561,7 @@ func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { // NotNilf asserts that the specified object is not nil. // -// assert.NotNilf(t, err, "error message %s", "formatted") +// assert.NotNilf(t, err, "error message %s", "formatted") func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1478,7 +1574,7 @@ func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanics(t, func(){ RemainCalm() }) +// assert.NotPanics(t, func(){ RemainCalm() }) func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1491,7 +1587,7 @@ func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. // -// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1504,8 +1600,8 @@ func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interfac // NotRegexp asserts that a specified regexp does not match a string. // -// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") -// assert.NotRegexp(t, "^start", "it's not starting") +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1518,8 +1614,8 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1532,7 +1628,7 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args .. // NotSame asserts that two pointers do not reference the same object. // -// assert.NotSame(t, ptr1, ptr2) +// assert.NotSame(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1548,7 +1644,7 @@ func NotSame(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // NotSamef asserts that two pointers do not reference the same object. // -// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1565,7 +1661,7 @@ func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1579,7 +1675,7 @@ func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...i // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1614,7 +1710,7 @@ func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { // Panics asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panics(t, func(){ GoCrazy() }) +// assert.Panics(t, func(){ GoCrazy() }) func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1629,7 +1725,7 @@ func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1644,7 +1740,7 @@ func PanicsWithError(t TestingT, errString string, f assert.PanicTestFunc, msgAn // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1658,7 +1754,7 @@ func PanicsWithErrorf(t TestingT, errString string, f assert.PanicTestFunc, msg // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1672,7 +1768,7 @@ func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, m // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1685,7 +1781,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, // Panicsf asserts that the code inside the specified PanicTestFunc panics. // -// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1698,8 +1794,8 @@ func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{} // Positive asserts that the specified element is positive // -// assert.Positive(t, 1) -// assert.Positive(t, 1.23) +// assert.Positive(t, 1) +// assert.Positive(t, 1.23) func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1712,8 +1808,8 @@ func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) { // Positivef asserts that the specified element is positive // -// assert.Positivef(t, 1, "error message %s", "formatted") -// assert.Positivef(t, 1.23, "error message %s", "formatted") +// assert.Positivef(t, 1, "error message %s", "formatted") +// assert.Positivef(t, 1.23, "error message %s", "formatted") func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1726,8 +1822,8 @@ func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) { // Regexp asserts that a specified regexp matches a string. // -// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") -// assert.Regexp(t, "start...$", "it's not starting") +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1740,8 +1836,8 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1754,7 +1850,7 @@ func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...in // Same asserts that two pointers reference the same object. // -// assert.Same(t, ptr1, ptr2) +// assert.Same(t, ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1770,7 +1866,7 @@ func Same(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...in // Samef asserts that two pointers reference the same object. // -// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") +// assert.Samef(t, ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1787,7 +1883,7 @@ func Samef(t TestingT, expected interface{}, actual interface{}, msg string, arg // Subset asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1801,7 +1897,7 @@ func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...inte // Subsetf asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1814,7 +1910,7 @@ func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args // True asserts that the specified value is true. // -// assert.True(t, myBool) +// assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1827,7 +1923,7 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) { // Truef asserts that the specified value is true. // -// assert.Truef(t, myBool, "error message %s", "formatted") +// assert.Truef(t, myBool, "error message %s", "formatted") func Truef(t TestingT, value bool, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1840,7 +1936,7 @@ func Truef(t TestingT, value bool, msg string, args ...interface{}) { // WithinDuration asserts that the two times are within duration delta of each other. // -// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1853,7 +1949,7 @@ func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time // WithinDurationf asserts that the two times are within duration delta of each other. // -// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -1864,6 +1960,32 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim t.FailNow() } +// WithinRange asserts that a time is within a time range (inclusive). +// +// assert.WithinRange(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func WithinRange(t TestingT, actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRange(t, actual, start, end, msgAndArgs...) { + return + } + t.FailNow() +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// assert.WithinRangef(t, time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func WithinRangef(t TestingT, actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.WithinRangef(t, actual, start, end, msg, args...) { + return + } + t.FailNow() +} + // YAMLEq asserts that two YAML strings are equivalent. func YAMLEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go index 5bb07c89c..3b5b09330 100644 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -31,9 +31,9 @@ func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...inte // Contains asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// a.Contains("Hello World", "World") -// a.Contains(["Hello", "World"], "World") -// a.Contains({"Hello": "World"}, "Hello") +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -44,9 +44,9 @@ func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs .. // Containsf asserts that the specified string, list(array, slice...) or map contains the // specified substring or element. // -// a.Containsf("Hello World", "World", "error message %s", "formatted") -// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") -// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -99,7 +99,7 @@ func (a *Assertions) ElementsMatchf(listA interface{}, listB interface{}, msg st // Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// a.Empty(obj) +// a.Empty(obj) func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -110,7 +110,7 @@ func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { // Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either // a slice or a channel with len == 0. // -// a.Emptyf(obj, "error message %s", "formatted") +// a.Emptyf(obj, "error message %s", "formatted") func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -120,7 +120,7 @@ func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) // Equal asserts that two objects are equal. // -// a.Equal(123, 123) +// a.Equal(123, 123) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -135,8 +135,8 @@ func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs // EqualError asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// a.EqualError(err, expectedErrorString) +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -147,8 +147,8 @@ func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ... // EqualErrorf asserts that a function returned an error (i.e. not `nil`) // and that it is equal to the provided error. // -// actualObj, err := SomeFunction() -// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -156,10 +156,44 @@ func (a *Assertions) EqualErrorf(theError error, errString string, msg string, a EqualErrorf(a.t, theError, errString, msg, args...) } +// EqualExportedValues asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValues(S{1, 2}, S{1, 3}) => true +// a.EqualExportedValues(S{1, 2}, S{2, 3}) => false +func (a *Assertions) EqualExportedValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualExportedValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualExportedValuesf asserts that the types of two objects are equal and their public +// fields are also equal. This is useful for comparing structs that have private fields +// that could potentially differ. +// +// type S struct { +// Exported int +// notExported int +// } +// a.EqualExportedValuesf(S{1, 2}, S{1, 3}, "error message %s", "formatted") => true +// a.EqualExportedValuesf(S{1, 2}, S{2, 3}, "error message %s", "formatted") => false +func (a *Assertions) EqualExportedValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EqualExportedValuesf(a.t, expected, actual, msg, args...) +} + // EqualValues asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValues(uint32(123), int32(123)) +// a.EqualValues(uint32(123), int32(123)) func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -170,7 +204,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -180,7 +214,7 @@ func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg // Equalf asserts that two objects are equal. // -// a.Equalf(123, 123, "error message %s", "formatted") +// a.Equalf(123, 123, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). Function equality @@ -194,10 +228,10 @@ func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string // Error asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if a.Error(err) { -// assert.Equal(t, expectedError, err) -// } +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -226,8 +260,8 @@ func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args .. // ErrorContains asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// a.ErrorContains(err, expectedErrorSubString) +// actualObj, err := SomeFunction() +// a.ErrorContains(err, expectedErrorSubString) func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -238,8 +272,8 @@ func (a *Assertions) ErrorContains(theError error, contains string, msgAndArgs . // ErrorContainsf asserts that a function returned an error (i.e. not `nil`) // and that the error contains the specified substring. // -// actualObj, err := SomeFunction() -// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") +// actualObj, err := SomeFunction() +// a.ErrorContainsf(err, expectedErrorSubString, "error message %s", "formatted") func (a *Assertions) ErrorContainsf(theError error, contains string, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -267,10 +301,10 @@ func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...inter // Errorf asserts that a function returned an error (i.e. not `nil`). // -// actualObj, err := SomeFunction() -// if a.Errorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedErrorf, err) -// } +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -281,7 +315,7 @@ func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { // Eventually asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) +// a.Eventually(func() bool { return true; }, time.Second, 10*time.Millisecond) func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -289,10 +323,60 @@ func (a *Assertions) Eventually(condition func() bool, waitFor time.Duration, ti Eventually(a.t, condition, waitFor, tick, msgAndArgs...) } +// EventuallyWithT asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithT(func(c *assert.CollectT) { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithT(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EventuallyWithT(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// EventuallyWithTf asserts that given condition will be met in waitFor time, +// periodically checking target function each tick. In contrast to Eventually, +// it supplies a CollectT to the condition function, so that the condition +// function can use the CollectT to call other assertions. +// The condition is considered "met" if no errors are raised in a tick. +// The supplied CollectT collects all errors from one tick (if there are any). +// If the condition is not met before waitFor, the collected errors of +// the last tick are copied to t. +// +// externalValue := false +// go func() { +// time.Sleep(8*time.Second) +// externalValue = true +// }() +// a.EventuallyWithTf(func(c *assert.CollectT, "error message %s", "formatted") { +// // add assertions as needed; any assertion failure will fail the current tick +// assert.True(c, externalValue, "expected 'externalValue' to be true") +// }, 1*time.Second, 10*time.Second, "external state has not changed to 'true'; still false") +func (a *Assertions) EventuallyWithTf(condition func(collect *assert.CollectT), waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + EventuallyWithTf(a.t, condition, waitFor, tick, msg, args...) +} + // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // -// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// a.Eventuallyf(func() bool { return true; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -302,7 +386,7 @@ func (a *Assertions) Eventuallyf(condition func() bool, waitFor time.Duration, t // Exactly asserts that two objects are equal in value and type. // -// a.Exactly(int32(123), int64(123)) +// a.Exactly(int32(123), int64(123)) func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -312,7 +396,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -354,7 +438,7 @@ func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{ // False asserts that the specified value is false. // -// a.False(myBool) +// a.False(myBool) func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -364,7 +448,7 @@ func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { // Falsef asserts that the specified value is false. // -// a.Falsef(myBool, "error message %s", "formatted") +// a.Falsef(myBool, "error message %s", "formatted") func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -392,9 +476,9 @@ func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) { // Greater asserts that the first element is greater than the second // -// a.Greater(2, 1) -// a.Greater(float64(2), float64(1)) -// a.Greater("b", "a") +// a.Greater(2, 1) +// a.Greater(float64(2), float64(1)) +// a.Greater("b", "a") func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -404,10 +488,10 @@ func (a *Assertions) Greater(e1 interface{}, e2 interface{}, msgAndArgs ...inter // GreaterOrEqual asserts that the first element is greater than or equal to the second // -// a.GreaterOrEqual(2, 1) -// a.GreaterOrEqual(2, 2) -// a.GreaterOrEqual("b", "a") -// a.GreaterOrEqual("b", "b") +// a.GreaterOrEqual(2, 1) +// a.GreaterOrEqual(2, 2) +// a.GreaterOrEqual("b", "a") +// a.GreaterOrEqual("b", "b") func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -417,10 +501,10 @@ func (a *Assertions) GreaterOrEqual(e1 interface{}, e2 interface{}, msgAndArgs . // GreaterOrEqualf asserts that the first element is greater than or equal to the second // -// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") -// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") -// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") -// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") +// a.GreaterOrEqualf(2, 1, "error message %s", "formatted") +// a.GreaterOrEqualf(2, 2, "error message %s", "formatted") +// a.GreaterOrEqualf("b", "a", "error message %s", "formatted") +// a.GreaterOrEqualf("b", "b", "error message %s", "formatted") func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -430,9 +514,9 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // -// a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") -// a.Greaterf("b", "a", "error message %s", "formatted") +// a.Greaterf(2, 1, "error message %s", "formatted") +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") +// a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -443,7 +527,7 @@ func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args . // HTTPBodyContains asserts that a specified handler returns a // body that contains a string. // -// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// a.HTTPBodyContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -456,7 +540,7 @@ func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, u // HTTPBodyContainsf asserts that a specified handler returns a // body that contains a string. // -// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// a.HTTPBodyContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -469,7 +553,7 @@ func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, // HTTPBodyNotContains asserts that a specified handler returns a // body that does not contain a string. // -// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") +// a.HTTPBodyNotContains(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msgAndArgs ...interface{}) { @@ -482,7 +566,7 @@ func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string // HTTPBodyNotContainsf asserts that a specified handler returns a // body that does not contain a string. // -// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// a.HTTPBodyNotContainsf(myHandler, "GET", "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}, msg string, args ...interface{}) { @@ -494,7 +578,7 @@ func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method strin // HTTPError asserts that a specified handler returns an error status code. // -// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -506,7 +590,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // HTTPErrorf asserts that a specified handler returns an error status code. // -// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -518,7 +602,7 @@ func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url str // HTTPRedirect asserts that a specified handler returns a redirect status code. // -// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -530,7 +614,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // HTTPRedirectf asserts that a specified handler returns a redirect status code. // -// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -542,7 +626,7 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url // HTTPStatusCode asserts that a specified handler returns a specified status code. // -// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { @@ -554,7 +638,7 @@ func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url // HTTPStatusCodef asserts that a specified handler returns a specified status code. // -// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { @@ -566,7 +650,7 @@ func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, ur // HTTPSuccess asserts that a specified handler returns a success status code. // -// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values, msgAndArgs ...interface{}) { @@ -578,7 +662,7 @@ func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url st // HTTPSuccessf asserts that a specified handler returns a success status code. // -// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") // // Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { @@ -590,7 +674,7 @@ func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url s // Implements asserts that an object is implemented by the specified interface. // -// a.Implements((*MyInterface)(nil), new(MyObject)) +// a.Implements((*MyInterface)(nil), new(MyObject)) func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -600,7 +684,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -610,7 +694,7 @@ func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{} // InDelta asserts that the two numerals are within delta of each other. // -// a.InDelta(math.Pi, 22/7.0, 0.01) +// a.InDelta(math.Pi, 22/7.0, 0.01) func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -652,7 +736,7 @@ func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, del // InDeltaf asserts that the two numerals are within delta of each other. // -// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -694,9 +778,9 @@ func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilo // IsDecreasing asserts that the collection is decreasing // -// a.IsDecreasing([]int{2, 1, 0}) -// a.IsDecreasing([]float{2, 1}) -// a.IsDecreasing([]string{"b", "a"}) +// a.IsDecreasing([]int{2, 1, 0}) +// a.IsDecreasing([]float{2, 1}) +// a.IsDecreasing([]string{"b", "a"}) func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -706,9 +790,9 @@ func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) // IsDecreasingf asserts that the collection is decreasing // -// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") -// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") -// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") +// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") +// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -718,9 +802,9 @@ func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...inter // IsIncreasing asserts that the collection is increasing // -// a.IsIncreasing([]int{1, 2, 3}) -// a.IsIncreasing([]float{1, 2}) -// a.IsIncreasing([]string{"a", "b"}) +// a.IsIncreasing([]int{1, 2, 3}) +// a.IsIncreasing([]float{1, 2}) +// a.IsIncreasing([]string{"a", "b"}) func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -730,9 +814,9 @@ func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) // IsIncreasingf asserts that the collection is increasing // -// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") -// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") -// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") +// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") +// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -742,9 +826,9 @@ func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...inter // IsNonDecreasing asserts that the collection is not decreasing // -// a.IsNonDecreasing([]int{1, 1, 2}) -// a.IsNonDecreasing([]float{1, 2}) -// a.IsNonDecreasing([]string{"a", "b"}) +// a.IsNonDecreasing([]int{1, 1, 2}) +// a.IsNonDecreasing([]float{1, 2}) +// a.IsNonDecreasing([]string{"a", "b"}) func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -754,9 +838,9 @@ func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface // IsNonDecreasingf asserts that the collection is not decreasing // -// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") -// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") -// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") +// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -766,9 +850,9 @@ func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...in // IsNonIncreasing asserts that the collection is not increasing // -// a.IsNonIncreasing([]int{2, 1, 1}) -// a.IsNonIncreasing([]float{2, 1}) -// a.IsNonIncreasing([]string{"b", "a"}) +// a.IsNonIncreasing([]int{2, 1, 1}) +// a.IsNonIncreasing([]float{2, 1}) +// a.IsNonIncreasing([]string{"b", "a"}) func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -778,9 +862,9 @@ func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface // IsNonIncreasingf asserts that the collection is not increasing // -// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") -// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") -// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") +// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") func (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -806,7 +890,7 @@ func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg s // JSONEq asserts that two JSON strings are equivalent. // -// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -816,7 +900,7 @@ func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interf // JSONEqf asserts that two JSON strings are equivalent. // -// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -827,7 +911,7 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // -// a.Len(mySlice, 3) +// a.Len(mySlice, 3) func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -838,7 +922,7 @@ func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // -// a.Lenf(mySlice, 3, "error message %s", "formatted") +// a.Lenf(mySlice, 3, "error message %s", "formatted") func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -848,9 +932,9 @@ func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...in // Less asserts that the first element is less than the second // -// a.Less(1, 2) -// a.Less(float64(1), float64(2)) -// a.Less("a", "b") +// a.Less(1, 2) +// a.Less(float64(1), float64(2)) +// a.Less("a", "b") func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -860,10 +944,10 @@ func (a *Assertions) Less(e1 interface{}, e2 interface{}, msgAndArgs ...interfac // LessOrEqual asserts that the first element is less than or equal to the second // -// a.LessOrEqual(1, 2) -// a.LessOrEqual(2, 2) -// a.LessOrEqual("a", "b") -// a.LessOrEqual("b", "b") +// a.LessOrEqual(1, 2) +// a.LessOrEqual(2, 2) +// a.LessOrEqual("a", "b") +// a.LessOrEqual("b", "b") func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -873,10 +957,10 @@ func (a *Assertions) LessOrEqual(e1 interface{}, e2 interface{}, msgAndArgs ...i // LessOrEqualf asserts that the first element is less than or equal to the second // -// a.LessOrEqualf(1, 2, "error message %s", "formatted") -// a.LessOrEqualf(2, 2, "error message %s", "formatted") -// a.LessOrEqualf("a", "b", "error message %s", "formatted") -// a.LessOrEqualf("b", "b", "error message %s", "formatted") +// a.LessOrEqualf(1, 2, "error message %s", "formatted") +// a.LessOrEqualf(2, 2, "error message %s", "formatted") +// a.LessOrEqualf("a", "b", "error message %s", "formatted") +// a.LessOrEqualf("b", "b", "error message %s", "formatted") func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -886,9 +970,9 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // -// a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1), float64(2), "error message %s", "formatted") -// a.Lessf("a", "b", "error message %s", "formatted") +// a.Lessf(1, 2, "error message %s", "formatted") +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") +// a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -898,8 +982,8 @@ func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...i // Negative asserts that the specified element is negative // -// a.Negative(-1) -// a.Negative(-1.23) +// a.Negative(-1) +// a.Negative(-1.23) func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -909,8 +993,8 @@ func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) { // Negativef asserts that the specified element is negative // -// a.Negativef(-1, "error message %s", "formatted") -// a.Negativef(-1.23, "error message %s", "formatted") +// a.Negativef(-1, "error message %s", "formatted") +// a.Negativef(-1.23, "error message %s", "formatted") func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -921,7 +1005,7 @@ func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) { // Never asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -932,7 +1016,7 @@ func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick ti // Neverf asserts that the given condition doesn't satisfy in waitFor time, // periodically checking the target function each tick. // -// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -942,7 +1026,7 @@ func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick t // Nil asserts that the specified object is nil. // -// a.Nil(err) +// a.Nil(err) func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -952,7 +1036,7 @@ func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { // Nilf asserts that the specified object is nil. // -// a.Nilf(err, "error message %s", "formatted") +// a.Nilf(err, "error message %s", "formatted") func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -980,10 +1064,10 @@ func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) // NoError asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if a.NoError(err) { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -993,10 +1077,10 @@ func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { // NoErrorf asserts that a function returned no error (i.e. `nil`). // -// actualObj, err := SomeFunction() -// if a.NoErrorf(err, "error message %s", "formatted") { -// assert.Equal(t, expectedObj, actualObj) -// } +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1025,9 +1109,9 @@ func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// a.NotContains("Hello World", "Earth") -// a.NotContains(["Hello", "World"], "Earth") -// a.NotContains({"Hello": "World"}, "Earth") +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1038,9 +1122,9 @@ func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // -// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") -// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") -// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1051,9 +1135,9 @@ func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg strin // NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if a.NotEmpty(obj) { -// assert.Equal(t, "two", obj[1]) -// } +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1064,9 +1148,9 @@ func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { // NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either // a slice or a channel with len == 0. // -// if a.NotEmptyf(obj, "error message %s", "formatted") { -// assert.Equal(t, "two", obj[1]) -// } +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1076,7 +1160,7 @@ func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface // NotEqual asserts that the specified values are NOT equal. // -// a.NotEqual(obj1, obj2) +// a.NotEqual(obj1, obj2) // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1089,7 +1173,7 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr // NotEqualValues asserts that two objects are not equal even when converted to the same type // -// a.NotEqualValues(obj1, obj2) +// a.NotEqualValues(obj1, obj2) func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1099,7 +1183,7 @@ func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, ms // NotEqualValuesf asserts that two objects are not equal even when converted to the same type // -// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1109,7 +1193,7 @@ func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, m // NotEqualf asserts that the specified values are NOT equal. // -// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") // // Pointer variable equality is determined based on the equality of the // referenced values (as opposed to the memory addresses). @@ -1140,7 +1224,7 @@ func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...in // NotNil asserts that the specified object is not nil. // -// a.NotNil(err) +// a.NotNil(err) func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1150,7 +1234,7 @@ func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { // NotNilf asserts that the specified object is not nil. // -// a.NotNilf(err, "error message %s", "formatted") +// a.NotNilf(err, "error message %s", "formatted") func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1160,7 +1244,7 @@ func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{} // NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. // -// a.NotPanics(func(){ RemainCalm() }) +// a.NotPanics(func(){ RemainCalm() }) func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1170,7 +1254,7 @@ func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{} // NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. // -// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1180,8 +1264,8 @@ func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...inte // NotRegexp asserts that a specified regexp does not match a string. // -// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") -// a.NotRegexp("^start", "it's not starting") +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1191,8 +1275,8 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") -// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1202,7 +1286,7 @@ func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, arg // NotSame asserts that two pointers do not reference the same object. // -// a.NotSame(ptr1, ptr2) +// a.NotSame(ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1215,7 +1299,7 @@ func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArg // NotSamef asserts that two pointers do not reference the same object. // -// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1229,7 +1313,7 @@ func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg stri // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1240,7 +1324,7 @@ func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // -// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1266,7 +1350,7 @@ func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { // Panics asserts that the code inside the specified PanicTestFunc panics. // -// a.Panics(func(){ GoCrazy() }) +// a.Panics(func(){ GoCrazy() }) func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1278,7 +1362,7 @@ func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) func (a *Assertions) PanicsWithError(errString string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1290,7 +1374,7 @@ func (a *Assertions) PanicsWithError(errString string, f assert.PanicTestFunc, m // panics, and that the recovered panic value is an error that satisfies the // EqualError comparison. // -// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) PanicsWithErrorf(errString string, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1301,7 +1385,7 @@ func (a *Assertions) PanicsWithErrorf(errString string, f assert.PanicTestFunc, // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1312,7 +1396,7 @@ func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFun // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // -// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1322,7 +1406,7 @@ func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFu // Panicsf asserts that the code inside the specified PanicTestFunc panics. // -// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1332,8 +1416,8 @@ func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interfa // Positive asserts that the specified element is positive // -// a.Positive(1) -// a.Positive(1.23) +// a.Positive(1) +// a.Positive(1.23) func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1343,8 +1427,8 @@ func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) { // Positivef asserts that the specified element is positive // -// a.Positivef(1, "error message %s", "formatted") -// a.Positivef(1.23, "error message %s", "formatted") +// a.Positivef(1, "error message %s", "formatted") +// a.Positivef(1.23, "error message %s", "formatted") func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1354,8 +1438,8 @@ func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) { // Regexp asserts that a specified regexp matches a string. // -// a.Regexp(regexp.MustCompile("start"), "it's starting") -// a.Regexp("start...$", "it's not starting") +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1365,8 +1449,8 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") -// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1376,7 +1460,7 @@ func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args . // Same asserts that two pointers reference the same object. // -// a.Same(ptr1, ptr2) +// a.Same(ptr1, ptr2) // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1389,7 +1473,7 @@ func (a *Assertions) Same(expected interface{}, actual interface{}, msgAndArgs . // Samef asserts that two pointers reference the same object. // -// a.Samef(ptr1, ptr2, "error message %s", "formatted") +// a.Samef(ptr1, ptr2, "error message %s", "formatted") // // Both arguments must be pointer variables. Pointer variable sameness is // determined based on the equality of both type and value. @@ -1403,7 +1487,7 @@ func (a *Assertions) Samef(expected interface{}, actual interface{}, msg string, // Subset asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1414,7 +1498,7 @@ func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ... // Subsetf asserts that the specified list(array, slice...) contains all // elements given in the specified subset(array, slice...). // -// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1424,7 +1508,7 @@ func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, a // True asserts that the specified value is true. // -// a.True(myBool) +// a.True(myBool) func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1434,7 +1518,7 @@ func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { // Truef asserts that the specified value is true. // -// a.Truef(myBool, "error message %s", "formatted") +// a.Truef(myBool, "error message %s", "formatted") func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1444,7 +1528,7 @@ func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { // WithinDuration asserts that the two times are within duration delta of each other. // -// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1454,7 +1538,7 @@ func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta // WithinDurationf asserts that the two times are within duration delta of each other. // -// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -1462,6 +1546,26 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// WithinRange asserts that a time is within a time range (inclusive). +// +// a.WithinRange(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second)) +func (a *Assertions) WithinRange(actual time.Time, start time.Time, end time.Time, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRange(a.t, actual, start, end, msgAndArgs...) +} + +// WithinRangef asserts that a time is within a time range (inclusive). +// +// a.WithinRangef(time.Now(), time.Now().Add(-time.Second), time.Now().Add(time.Second), "error message %s", "formatted") +func (a *Assertions) WithinRangef(actual time.Time, start time.Time, end time.Time, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + WithinRangef(a.t, actual, start, end, msg, args...) +} + // YAMLEq asserts that two YAML strings are equivalent. func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/suite/doc.go b/vendor/github.com/stretchr/testify/suite/doc.go index f91a245d3..8d55a3aa8 100644 --- a/vendor/github.com/stretchr/testify/suite/doc.go +++ b/vendor/github.com/stretchr/testify/suite/doc.go @@ -29,37 +29,38 @@ // Suite object has assertion methods. // // A crude example: -// // Basic imports -// import ( -// "testing" -// "github.com/stretchr/testify/assert" -// "github.com/stretchr/testify/suite" -// ) // -// // Define the suite, and absorb the built-in basic suite -// // functionality from testify - including a T() method which -// // returns the current testing context -// type ExampleTestSuite struct { -// suite.Suite -// VariableThatShouldStartAtFive int -// } +// // Basic imports +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// "github.com/stretchr/testify/suite" +// ) // -// // Make sure that VariableThatShouldStartAtFive is set to five -// // before each test -// func (suite *ExampleTestSuite) SetupTest() { -// suite.VariableThatShouldStartAtFive = 5 -// } +// // Define the suite, and absorb the built-in basic suite +// // functionality from testify - including a T() method which +// // returns the current testing context +// type ExampleTestSuite struct { +// suite.Suite +// VariableThatShouldStartAtFive int +// } // -// // All methods that begin with "Test" are run as tests within a -// // suite. -// func (suite *ExampleTestSuite) TestExample() { -// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) -// suite.Equal(5, suite.VariableThatShouldStartAtFive) -// } +// // Make sure that VariableThatShouldStartAtFive is set to five +// // before each test +// func (suite *ExampleTestSuite) SetupTest() { +// suite.VariableThatShouldStartAtFive = 5 +// } // -// // In order for 'go test' to run this suite, we need to create -// // a normal test function and pass our suite to suite.Run -// func TestExampleTestSuite(t *testing.T) { -// suite.Run(t, new(ExampleTestSuite)) -// } +// // All methods that begin with "Test" are run as tests within a +// // suite. +// func (suite *ExampleTestSuite) TestExample() { +// assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) +// suite.Equal(5, suite.VariableThatShouldStartAtFive) +// } +// +// // In order for 'go test' to run this suite, we need to create +// // a normal test function and pass our suite to suite.Run +// func TestExampleTestSuite(t *testing.T) { +// suite.Run(t, new(ExampleTestSuite)) +// } package suite diff --git a/vendor/github.com/stretchr/testify/suite/interfaces.go b/vendor/github.com/stretchr/testify/suite/interfaces.go index 8b98a8af2..fed037d7f 100644 --- a/vendor/github.com/stretchr/testify/suite/interfaces.go +++ b/vendor/github.com/stretchr/testify/suite/interfaces.go @@ -7,6 +7,7 @@ import "testing" type TestingSuite interface { T() *testing.T SetT(*testing.T) + SetS(suite TestingSuite) } // SetupAllSuite has a SetupSuite method, which will run before the @@ -51,3 +52,15 @@ type AfterTest interface { type WithStats interface { HandleStats(suiteName string, stats *SuiteInformation) } + +// SetupSubTest has a SetupSubTest method, which will run before each +// subtest in the suite. +type SetupSubTest interface { + SetupSubTest() +} + +// TearDownSubTest has a TearDownSubTest method, which will run after +// each subtest in the suite have been run. +type TearDownSubTest interface { + TearDownSubTest() +} diff --git a/vendor/github.com/stretchr/testify/suite/suite.go b/vendor/github.com/stretchr/testify/suite/suite.go index b9b5d1c56..8b4202d89 100644 --- a/vendor/github.com/stretchr/testify/suite/suite.go +++ b/vendor/github.com/stretchr/testify/suite/suite.go @@ -7,6 +7,7 @@ import ( "reflect" "regexp" "runtime/debug" + "sync" "testing" "time" @@ -21,24 +22,41 @@ var matchMethod = flag.String("testify.m", "", "regular expression to select tes // retrieving the current *testing.T context. type Suite struct { *assert.Assertions + + mu sync.RWMutex require *require.Assertions t *testing.T + + // Parent suite to have access to the implemented methods of parent struct + s TestingSuite } // T retrieves the current *testing.T context. func (suite *Suite) T() *testing.T { + suite.mu.RLock() + defer suite.mu.RUnlock() return suite.t } // SetT sets the current *testing.T context. func (suite *Suite) SetT(t *testing.T) { + suite.mu.Lock() + defer suite.mu.Unlock() suite.t = t suite.Assertions = assert.New(t) suite.require = require.New(t) } +// SetS needs to set the current test suite as parent +// to get access to the parent methods +func (suite *Suite) SetS(s TestingSuite) { + suite.s = s +} + // Require returns a require context for suite. func (suite *Suite) Require() *require.Assertions { + suite.mu.Lock() + defer suite.mu.Unlock() if suite.require == nil { suite.require = require.New(suite.T()) } @@ -51,14 +69,20 @@ func (suite *Suite) Require() *require.Assertions { // assert.Assertions with require.Assertions), this method is provided so you // can call `suite.Assert().NoError()`. func (suite *Suite) Assert() *assert.Assertions { + suite.mu.Lock() + defer suite.mu.Unlock() if suite.Assertions == nil { suite.Assertions = assert.New(suite.T()) } return suite.Assertions } -func failOnPanic(t *testing.T) { +func recoverAndFailOnPanic(t *testing.T) { r := recover() + failOnPanic(t, r) +} + +func failOnPanic(t *testing.T, r interface{}) { if r != nil { t.Errorf("test panicked: %v\n%s", r, debug.Stack()) t.FailNow() @@ -71,7 +95,18 @@ func failOnPanic(t *testing.T) { // Provides compatibility with go test pkg -run TestSuite/TestName/SubTestName. func (suite *Suite) Run(name string, subtest func()) bool { oldT := suite.T() - defer suite.SetT(oldT) + + if setupSubTest, ok := suite.s.(SetupSubTest); ok { + setupSubTest.SetupSubTest() + } + + defer func() { + suite.SetT(oldT) + if tearDownSubTest, ok := suite.s.(TearDownSubTest); ok { + tearDownSubTest.TearDownSubTest() + } + }() + return oldT.Run(name, func(t *testing.T) { suite.SetT(t) subtest() @@ -81,9 +116,10 @@ func (suite *Suite) Run(name string, subtest func()) bool { // Run takes a testing suite and runs all of the tests attached // to it. func Run(t *testing.T, suite TestingSuite) { - defer failOnPanic(t) + defer recoverAndFailOnPanic(t) suite.SetT(t) + suite.SetS(suite) var suiteSetupDone bool @@ -126,10 +162,12 @@ func Run(t *testing.T, suite TestingSuite) { F: func(t *testing.T) { parentT := suite.T() suite.SetT(t) - defer failOnPanic(t) + defer recoverAndFailOnPanic(t) defer func() { + r := recover() + if stats != nil { - passed := !t.Failed() + passed := !t.Failed() && r == nil stats.end(method.Name, passed) } @@ -142,6 +180,7 @@ func Run(t *testing.T, suite TestingSuite) { } suite.SetT(parentT) + failOnPanic(t, r) }() if setupTestSuite, ok := suite.(SetupTestSuite); ok { diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/.gitignore b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/.gitignore similarity index 100% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/.gitignore rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/.gitignore diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/COPYING b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/COPYING similarity index 100% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/COPYING rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/COPYING diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/ChangeLog b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/ChangeLog similarity index 79% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/ChangeLog rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/ChangeLog index 7a86c48ed..050b54ee0 100644 --- a/vendor/git.torproject.org/pluggable-transports/goptlib.git/ChangeLog +++ b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/ChangeLog @@ -1,3 +1,20 @@ +== v1.5.0 + +Added the ReportVersion function that lets a client or server report its +implementation version using the new STATUS TYPE=version feature. + +https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/-/issues/1 + +== v1.4.0 + +Moved the repository URL from git.torproject.org/pluggable-transports/goptlib.git +to gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib. + +== v1.3.0 + +Added a DialOrWithDialer function that allows you to, for example, use a +specific source address when dialing the ORPort. + == v1.2.0 The default and development branch is now "main" rather than "master". diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/README b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/README similarity index 64% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/README rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/README index dc605d14c..20cb428e8 100644 --- a/vendor/git.torproject.org/pluggable-transports/goptlib.git/README +++ b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/README @@ -1,12 +1,10 @@ goptlib is a library for writing Tor pluggable transports in Go. https://spec.torproject.org/pt-spec -https://gitweb.torproject.org/torspec.git/tree/proposals/196-transport-control-ports.txt -https://gitweb.torproject.org/torspec.git/tree/proposals/217-ext-orport-auth.txt -https://gitweb.torproject.org/torspec.git/tree/proposals/232-pluggable-transports-through-proxy.txt +https://spec.torproject.org/ext-orport-spec To download a copy of the library into $GOPATH: - go get git.torproject.org/pluggable-transports/goptlib.git + go get gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib See the included example programs for examples of how to use the library. To build them, enter their directory and run "go build". @@ -16,10 +14,10 @@ The recommended way to start writing a new transport plugin is to copy dummy-client or dummy-server and make changes to it. There is browseable documentation here: -https://godoc.org/git.torproject.org/pluggable-transports/goptlib.git +https://pkg.go.dev/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib Report bugs to the tor-dev@lists.torproject.org mailing list or to the -bug tracker at https://trac.torproject.org/projects/tor. +bug tracker at https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/-/issues. To the extent possible under law, the authors have dedicated all copyright and related and neighboring rights to this software to the diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/args.go b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/args.go similarity index 100% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/args.go rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/args.go diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/pt.go b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/pt.go similarity index 93% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/pt.go rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/pt.go index 23893f4fc..660e7c311 100644 --- a/vendor/git.torproject.org/pluggable-transports/goptlib.git/pt.go +++ b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/pt.go @@ -36,6 +36,7 @@ // ... // func main() { // var err error +// pt.ReportVersion("program", "v1.0") // ptInfo, err = pt.ClientSetup(nil) // if err != nil { // os.Exit(1) @@ -94,6 +95,7 @@ // ... // func main() { // var err error +// pt.ReportVersion("program", "v1.0") // ptInfo, err = pt.ServerSetup(nil) // if err != nil { // os.Exit(1) @@ -122,13 +124,7 @@ // https://spec.torproject.org/pt-spec // // Extended ORPort: -// https://gitweb.torproject.org/torspec.git/tree/proposals/196-transport-control-ports.txt -// -// Extended ORPort Authentication: -// https://gitweb.torproject.org/torspec.git/tree/proposals/217-ext-orport-auth.txt -// -// Pluggable Transport through SOCKS proxy: -// https://gitweb.torproject.org/torspec.git/tree/proposals/232-pluggable-transports-through-proxy.txt +// https://spec.torproject.org/ext-orport-spec // // The package implements a SOCKS5 server sufficient for a Tor client transport // plugin. @@ -349,6 +345,15 @@ func ProxyDone() { fmt.Fprintf(Stdout, "PROXY DONE\n") } +// Report this program's name and version number using a STATUS TYPE=version +// line. Can be called any time before calling CmethodsDone or SmethodsDone. +// +// When called in a pluggable transport server, the implementation name and +// version number will appear in the relay's bridge-extra-info descriptor. +func ReportVersion(implementation string, version string) { + line("STATUS", "TYPE=version", "IMPLEMENTATION="+encodeCString(implementation), "VERSION="+encodeCString(version)) +} + // Unexported type to represent log severities, preventing external callers from // inventing new severity strings that may violate quoting rules. // @@ -680,7 +685,7 @@ func readAuthCookie(f io.Reader) ([]byte, error) { } // Read and validate the contents of an auth cookie file. Returns the 32-byte -// cookie. See section 4.2.1.2 of 217-ext-orport-auth.txt. +// cookie. See section 2.1.2 of ext-orport-spec.txt. func readAuthCookieFile(filename string) (cookie []byte, err error) { f, err := os.Open(filename) if err != nil { @@ -770,7 +775,7 @@ func ServerSetup(_ []string) (info ServerInfo, err error) { return info, nil } -// See 217-ext-orport-auth.txt section 4.2.1.3. +// See ext-orport-spec.txt section 2.1.3. func computeServerHash(authCookie, clientNonce, serverNonce []byte) []byte { h := hmac.New(sha256.New, authCookie) io.WriteString(h, "ExtORPort authentication server-to-client hash") @@ -779,7 +784,7 @@ func computeServerHash(authCookie, clientNonce, serverNonce []byte) []byte { return h.Sum([]byte{}) } -// See 217-ext-orport-auth.txt section 4.2.1.3. +// See ext-orport-spec.txt section 2.1.3. func computeClientHash(authCookie, clientNonce, serverNonce []byte) []byte { h := hmac.New(sha256.New, authCookie) io.WriteString(h, "ExtORPort authentication client-to-server hash") @@ -789,7 +794,7 @@ func computeClientHash(authCookie, clientNonce, serverNonce []byte) []byte { } func extOrPortAuthenticate(s io.ReadWriter, info *ServerInfo) error { - // Read auth types. 217-ext-orport-auth.txt section 4.1. + // Read auth types. ext-orport-spec.txt section 2. var authTypes [256]bool var count int for count = 0; count < 256; count++ { @@ -872,7 +877,7 @@ func extOrPortAuthenticate(s io.ReadWriter, info *ServerInfo) error { return nil } -// See section 3.1.1 of 196-transport-control-ports.txt. +// See section 3.1 of ext-orport-spec.txt. const ( extOrCmdDone = 0x0000 extOrCmdUserAddr = 0x0001 @@ -906,19 +911,17 @@ func extOrPortSendCommand(s io.Writer, cmd uint16, body []byte) error { return nil } -// Send a USERADDR command on s. See section 3.1.2.1 of -// 196-transport-control-ports.txt. +// Send a USERADDR command on s. See section 3.2.1 of ext-orport-spec.txt. func extOrPortSendUserAddr(s io.Writer, addr string) error { return extOrPortSendCommand(s, extOrCmdUserAddr, []byte(addr)) } -// Send a TRANSPORT command on s. See section 3.1.2.2 of -// 196-transport-control-ports.txt. +// Send a TRANSPORT command on s. See section 3.2.2 of ext-orport-spec.txt. func extOrPortSendTransport(s io.Writer, methodName string) error { return extOrPortSendCommand(s, extOrCmdTransport, []byte(methodName)) } -// Send a DONE command on s. See section 3.1 of 196-transport-control-ports.txt. +// Send a DONE command on s. See section 3.1 of ext-orport-spec.txt. func extOrPortSendDone(s io.Writer) error { return extOrPortSendCommand(s, extOrCmdDone, []byte{}) } @@ -987,7 +990,7 @@ func extOrPortSetMetadata(s io.ReadWriter, addr, methodName string) error { func extOrPortSetup(s net.Conn, timeout time.Duration, info *ServerInfo, addr, methodName string) error { - err := s.SetDeadline(time.Now().Add(5 * time.Second)) + err := s.SetDeadline(time.Now().Add(timeout)) if err != nil { return err } @@ -1006,20 +1009,20 @@ func extOrPortSetup(s net.Conn, timeout time.Duration, return nil } -// Dial info.ExtendedOrAddr if defined, or else info.OrAddr, and return an open -// *net.TCPConn. If connecting to the extended OR port, extended OR port -// authentication à la 217-ext-orport-auth.txt is done before returning; an -// error is returned if authentication fails. +// Dial (using the given net.Dialer) info.ExtendedOrAddr if defined, or else +// info.OrAddr, and return an open net.Conn. If connecting to the extended OR +// port, extended OR port authentication is done before returning; an error is +// returned if authentication fails. // // The addr and methodName arguments are put in USERADDR and TRANSPORT ExtOrPort // commands, respectively. If either is "", the corresponding command is not // sent. -func DialOr(info *ServerInfo, addr, methodName string) (*net.TCPConn, error) { +func DialOrWithDialer(dialer *net.Dialer, info *ServerInfo, addr, methodName string) (net.Conn, error) { if info.ExtendedOrAddr == nil || info.AuthCookiePath == "" { - return net.DialTCP("tcp", nil, info.OrAddr) + return dialer.Dial("tcp", info.OrAddr.String()) } - s, err := net.DialTCP("tcp", nil, info.ExtendedOrAddr) + s, err := dialer.Dial("tcp", info.ExtendedOrAddr.String()) if err != nil { return nil, err } @@ -1031,3 +1034,16 @@ func DialOr(info *ServerInfo, addr, methodName string) (*net.TCPConn, error) { return s, nil } + +// Dial info.ExtendedOrAddr if defined, or else info.OrAddr, and return an open +// *net.TCPConn. If connecting to the extended OR port, extended OR port +// authentication is done before returning; an error is returned if +// authentication fails. +// +// The addr and methodName arguments are put in USERADDR and TRANSPORT ExtOrPort +// commands, respectively. If either is "", the corresponding command is not +// sent. +func DialOr(info *ServerInfo, addr, methodName string) (*net.TCPConn, error) { + c, err := DialOrWithDialer(&net.Dialer{}, info, addr, methodName) + return c.(*net.TCPConn), err +} diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/socks.go b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/socks.go similarity index 100% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/socks.go rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/socks.go diff --git a/vendor/git.torproject.org/pluggable-transports/goptlib.git/test_authcookie b/vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/test_authcookie similarity index 100% rename from vendor/git.torproject.org/pluggable-transports/goptlib.git/test_authcookie rename to vendor/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib/test_authcookie diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s.go b/vendor/golang.org/x/crypto/blake2s/blake2s.go new file mode 100644 index 000000000..e3f46aab3 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s.go @@ -0,0 +1,246 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package blake2s implements the BLAKE2s hash algorithm defined by RFC 7693 +// and the extendable output function (XOF) BLAKE2Xs. +// +// BLAKE2s is optimized for 8- to 32-bit platforms and produces digests of any +// size between 1 and 32 bytes. +// For a detailed specification of BLAKE2s see https://blake2.net/blake2.pdf +// and for BLAKE2Xs see https://blake2.net/blake2x.pdf +// +// If you aren't sure which function you need, use BLAKE2s (Sum256 or New256). +// If you need a secret-key MAC (message authentication code), use the New256 +// function with a non-nil key. +// +// BLAKE2X is a construction to compute hash values larger than 32 bytes. It +// can produce hash values between 0 and 65535 bytes. +package blake2s // import "golang.org/x/crypto/blake2s" + +import ( + "encoding/binary" + "errors" + "hash" +) + +const ( + // The blocksize of BLAKE2s in bytes. + BlockSize = 64 + + // The hash size of BLAKE2s-256 in bytes. + Size = 32 + + // The hash size of BLAKE2s-128 in bytes. + Size128 = 16 +) + +var errKeySize = errors.New("blake2s: invalid key size") + +var iv = [8]uint32{ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19, +} + +// Sum256 returns the BLAKE2s-256 checksum of the data. +func Sum256(data []byte) [Size]byte { + var sum [Size]byte + checkSum(&sum, Size, data) + return sum +} + +// New256 returns a new hash.Hash computing the BLAKE2s-256 checksum. A non-nil +// key turns the hash into a MAC. The key must between zero and 32 bytes long. +// When the key is nil, the returned hash.Hash implements BinaryMarshaler +// and BinaryUnmarshaler for state (de)serialization as documented by hash.Hash. +func New256(key []byte) (hash.Hash, error) { return newDigest(Size, key) } + +// New128 returns a new hash.Hash computing the BLAKE2s-128 checksum given a +// non-empty key. Note that a 128-bit digest is too small to be secure as a +// cryptographic hash and should only be used as a MAC, thus the key argument +// is not optional. +func New128(key []byte) (hash.Hash, error) { + if len(key) == 0 { + return nil, errors.New("blake2s: a key is required for a 128-bit hash") + } + return newDigest(Size128, key) +} + +func newDigest(hashSize int, key []byte) (*digest, error) { + if len(key) > Size { + return nil, errKeySize + } + d := &digest{ + size: hashSize, + keyLen: len(key), + } + copy(d.key[:], key) + d.Reset() + return d, nil +} + +func checkSum(sum *[Size]byte, hashSize int, data []byte) { + var ( + h [8]uint32 + c [2]uint32 + ) + + h = iv + h[0] ^= uint32(hashSize) | (1 << 16) | (1 << 24) + + if length := len(data); length > BlockSize { + n := length &^ (BlockSize - 1) + if length == n { + n -= BlockSize + } + hashBlocks(&h, &c, 0, data[:n]) + data = data[n:] + } + + var block [BlockSize]byte + offset := copy(block[:], data) + remaining := uint32(BlockSize - offset) + + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + hashBlocks(&h, &c, 0xFFFFFFFF, block[:]) + + for i, v := range h { + binary.LittleEndian.PutUint32(sum[4*i:], v) + } +} + +type digest struct { + h [8]uint32 + c [2]uint32 + size int + block [BlockSize]byte + offset int + + key [BlockSize]byte + keyLen int +} + +const ( + magic = "b2s" + marshaledSize = len(magic) + 8*4 + 2*4 + 1 + BlockSize + 1 +) + +func (d *digest) MarshalBinary() ([]byte, error) { + if d.keyLen != 0 { + return nil, errors.New("crypto/blake2s: cannot marshal MACs") + } + b := make([]byte, 0, marshaledSize) + b = append(b, magic...) + for i := 0; i < 8; i++ { + b = appendUint32(b, d.h[i]) + } + b = appendUint32(b, d.c[0]) + b = appendUint32(b, d.c[1]) + // Maximum value for size is 32 + b = append(b, byte(d.size)) + b = append(b, d.block[:]...) + b = append(b, byte(d.offset)) + return b, nil +} + +func (d *digest) UnmarshalBinary(b []byte) error { + if len(b) < len(magic) || string(b[:len(magic)]) != magic { + return errors.New("crypto/blake2s: invalid hash state identifier") + } + if len(b) != marshaledSize { + return errors.New("crypto/blake2s: invalid hash state size") + } + b = b[len(magic):] + for i := 0; i < 8; i++ { + b, d.h[i] = consumeUint32(b) + } + b, d.c[0] = consumeUint32(b) + b, d.c[1] = consumeUint32(b) + d.size = int(b[0]) + b = b[1:] + copy(d.block[:], b[:BlockSize]) + b = b[BlockSize:] + d.offset = int(b[0]) + return nil +} + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Size() int { return d.size } + +func (d *digest) Reset() { + d.h = iv + d.h[0] ^= uint32(d.size) | (uint32(d.keyLen) << 8) | (1 << 16) | (1 << 24) + d.offset, d.c[0], d.c[1] = 0, 0, 0 + if d.keyLen > 0 { + d.block = d.key + d.offset = BlockSize + } +} + +func (d *digest) Write(p []byte) (n int, err error) { + n = len(p) + + if d.offset > 0 { + remaining := BlockSize - d.offset + if n <= remaining { + d.offset += copy(d.block[d.offset:], p) + return + } + copy(d.block[d.offset:], p[:remaining]) + hashBlocks(&d.h, &d.c, 0, d.block[:]) + d.offset = 0 + p = p[remaining:] + } + + if length := len(p); length > BlockSize { + nn := length &^ (BlockSize - 1) + if length == nn { + nn -= BlockSize + } + hashBlocks(&d.h, &d.c, 0, p[:nn]) + p = p[nn:] + } + + d.offset += copy(d.block[:], p) + return +} + +func (d *digest) Sum(sum []byte) []byte { + var hash [Size]byte + d.finalize(&hash) + return append(sum, hash[:d.size]...) +} + +func (d *digest) finalize(hash *[Size]byte) { + var block [BlockSize]byte + h := d.h + c := d.c + + copy(block[:], d.block[:d.offset]) + remaining := uint32(BlockSize - d.offset) + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + hashBlocks(&h, &c, 0xFFFFFFFF, block[:]) + for i, v := range h { + binary.LittleEndian.PutUint32(hash[4*i:], v) + } +} + +func appendUint32(b []byte, x uint32) []byte { + var a [4]byte + binary.BigEndian.PutUint32(a[:], x) + return append(b, a[:]...) +} + +func consumeUint32(b []byte) ([]byte, uint32) { + x := binary.BigEndian.Uint32(b) + return b[4:], x +} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_386.go b/vendor/golang.org/x/crypto/blake2s/blake2s_386.go new file mode 100644 index 000000000..b4463fb4d --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_386.go @@ -0,0 +1,33 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build 386 && gc && !purego +// +build 386,gc,!purego + +package blake2s + +import "golang.org/x/sys/cpu" + +var ( + useSSE4 = false + useSSSE3 = cpu.X86.HasSSSE3 + useSSE2 = cpu.X86.HasSSE2 +) + +//go:noescape +func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) + +//go:noescape +func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) + +func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { + switch { + case useSSSE3: + hashBlocksSSSE3(h, c, flag, blocks) + case useSSE2: + hashBlocksSSE2(h, c, flag, blocks) + default: + hashBlocksGeneric(h, c, flag, blocks) + } +} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_386.s b/vendor/golang.org/x/crypto/blake2s/blake2s_386.s new file mode 100644 index 000000000..603d00ca3 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_386.s @@ -0,0 +1,430 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build 386 && gc && !purego +// +build 386,gc,!purego + +#include "textflag.h" + +DATA iv0<>+0x00(SB)/4, $0x6a09e667 +DATA iv0<>+0x04(SB)/4, $0xbb67ae85 +DATA iv0<>+0x08(SB)/4, $0x3c6ef372 +DATA iv0<>+0x0c(SB)/4, $0xa54ff53a +GLOBL iv0<>(SB), (NOPTR+RODATA), $16 + +DATA iv1<>+0x00(SB)/4, $0x510e527f +DATA iv1<>+0x04(SB)/4, $0x9b05688c +DATA iv1<>+0x08(SB)/4, $0x1f83d9ab +DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 +GLOBL iv1<>(SB), (NOPTR+RODATA), $16 + +DATA rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +GLOBL rol16<>(SB), (NOPTR+RODATA), $16 + +DATA rol8<>+0x00(SB)/8, $0x0407060500030201 +DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 +GLOBL rol8<>(SB), (NOPTR+RODATA), $16 + +DATA counter<>+0x00(SB)/8, $0x40 +DATA counter<>+0x08(SB)/8, $0x0 +GLOBL counter<>(SB), (NOPTR+RODATA), $16 + +#define ROTL_SSE2(n, t, v) \ + MOVO v, t; \ + PSLLL $n, t; \ + PSRLL $(32-n), v; \ + PXOR t, v + +#define ROTL_SSSE3(c, v) \ + PSHUFB c, v + +#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ + PADDL m0, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(16, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m1, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(24, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v1, v1; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v3, v3; \ + PADDL m2, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(16, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m3, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(24, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v3, v3; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v1, v1 + +#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ + PADDL m0, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c16, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m1, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c8, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v1, v1; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v3, v3; \ + PADDL m2, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c16, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m3, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c8, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v3, v3; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v1, v1 + +#define PRECOMPUTE(dst, off, src, t) \ + MOVL 0*4(src), t; \ + MOVL t, 0*4+off+0(dst); \ + MOVL t, 9*4+off+64(dst); \ + MOVL t, 5*4+off+128(dst); \ + MOVL t, 14*4+off+192(dst); \ + MOVL t, 4*4+off+256(dst); \ + MOVL t, 2*4+off+320(dst); \ + MOVL t, 8*4+off+384(dst); \ + MOVL t, 12*4+off+448(dst); \ + MOVL t, 3*4+off+512(dst); \ + MOVL t, 15*4+off+576(dst); \ + MOVL 1*4(src), t; \ + MOVL t, 4*4+off+0(dst); \ + MOVL t, 8*4+off+64(dst); \ + MOVL t, 14*4+off+128(dst); \ + MOVL t, 5*4+off+192(dst); \ + MOVL t, 12*4+off+256(dst); \ + MOVL t, 11*4+off+320(dst); \ + MOVL t, 1*4+off+384(dst); \ + MOVL t, 6*4+off+448(dst); \ + MOVL t, 10*4+off+512(dst); \ + MOVL t, 3*4+off+576(dst); \ + MOVL 2*4(src), t; \ + MOVL t, 1*4+off+0(dst); \ + MOVL t, 13*4+off+64(dst); \ + MOVL t, 6*4+off+128(dst); \ + MOVL t, 8*4+off+192(dst); \ + MOVL t, 2*4+off+256(dst); \ + MOVL t, 0*4+off+320(dst); \ + MOVL t, 14*4+off+384(dst); \ + MOVL t, 11*4+off+448(dst); \ + MOVL t, 12*4+off+512(dst); \ + MOVL t, 4*4+off+576(dst); \ + MOVL 3*4(src), t; \ + MOVL t, 5*4+off+0(dst); \ + MOVL t, 15*4+off+64(dst); \ + MOVL t, 9*4+off+128(dst); \ + MOVL t, 1*4+off+192(dst); \ + MOVL t, 11*4+off+256(dst); \ + MOVL t, 7*4+off+320(dst); \ + MOVL t, 13*4+off+384(dst); \ + MOVL t, 3*4+off+448(dst); \ + MOVL t, 6*4+off+512(dst); \ + MOVL t, 10*4+off+576(dst); \ + MOVL 4*4(src), t; \ + MOVL t, 2*4+off+0(dst); \ + MOVL t, 1*4+off+64(dst); \ + MOVL t, 15*4+off+128(dst); \ + MOVL t, 10*4+off+192(dst); \ + MOVL t, 6*4+off+256(dst); \ + MOVL t, 8*4+off+320(dst); \ + MOVL t, 3*4+off+384(dst); \ + MOVL t, 13*4+off+448(dst); \ + MOVL t, 14*4+off+512(dst); \ + MOVL t, 5*4+off+576(dst); \ + MOVL 5*4(src), t; \ + MOVL t, 6*4+off+0(dst); \ + MOVL t, 11*4+off+64(dst); \ + MOVL t, 2*4+off+128(dst); \ + MOVL t, 9*4+off+192(dst); \ + MOVL t, 1*4+off+256(dst); \ + MOVL t, 13*4+off+320(dst); \ + MOVL t, 4*4+off+384(dst); \ + MOVL t, 8*4+off+448(dst); \ + MOVL t, 15*4+off+512(dst); \ + MOVL t, 7*4+off+576(dst); \ + MOVL 6*4(src), t; \ + MOVL t, 3*4+off+0(dst); \ + MOVL t, 7*4+off+64(dst); \ + MOVL t, 13*4+off+128(dst); \ + MOVL t, 12*4+off+192(dst); \ + MOVL t, 10*4+off+256(dst); \ + MOVL t, 1*4+off+320(dst); \ + MOVL t, 9*4+off+384(dst); \ + MOVL t, 14*4+off+448(dst); \ + MOVL t, 0*4+off+512(dst); \ + MOVL t, 6*4+off+576(dst); \ + MOVL 7*4(src), t; \ + MOVL t, 7*4+off+0(dst); \ + MOVL t, 14*4+off+64(dst); \ + MOVL t, 10*4+off+128(dst); \ + MOVL t, 0*4+off+192(dst); \ + MOVL t, 5*4+off+256(dst); \ + MOVL t, 9*4+off+320(dst); \ + MOVL t, 12*4+off+384(dst); \ + MOVL t, 1*4+off+448(dst); \ + MOVL t, 13*4+off+512(dst); \ + MOVL t, 2*4+off+576(dst); \ + MOVL 8*4(src), t; \ + MOVL t, 8*4+off+0(dst); \ + MOVL t, 5*4+off+64(dst); \ + MOVL t, 4*4+off+128(dst); \ + MOVL t, 15*4+off+192(dst); \ + MOVL t, 14*4+off+256(dst); \ + MOVL t, 3*4+off+320(dst); \ + MOVL t, 11*4+off+384(dst); \ + MOVL t, 10*4+off+448(dst); \ + MOVL t, 7*4+off+512(dst); \ + MOVL t, 1*4+off+576(dst); \ + MOVL 9*4(src), t; \ + MOVL t, 12*4+off+0(dst); \ + MOVL t, 2*4+off+64(dst); \ + MOVL t, 11*4+off+128(dst); \ + MOVL t, 4*4+off+192(dst); \ + MOVL t, 0*4+off+256(dst); \ + MOVL t, 15*4+off+320(dst); \ + MOVL t, 10*4+off+384(dst); \ + MOVL t, 7*4+off+448(dst); \ + MOVL t, 5*4+off+512(dst); \ + MOVL t, 9*4+off+576(dst); \ + MOVL 10*4(src), t; \ + MOVL t, 9*4+off+0(dst); \ + MOVL t, 4*4+off+64(dst); \ + MOVL t, 8*4+off+128(dst); \ + MOVL t, 13*4+off+192(dst); \ + MOVL t, 3*4+off+256(dst); \ + MOVL t, 5*4+off+320(dst); \ + MOVL t, 7*4+off+384(dst); \ + MOVL t, 15*4+off+448(dst); \ + MOVL t, 11*4+off+512(dst); \ + MOVL t, 0*4+off+576(dst); \ + MOVL 11*4(src), t; \ + MOVL t, 13*4+off+0(dst); \ + MOVL t, 10*4+off+64(dst); \ + MOVL t, 0*4+off+128(dst); \ + MOVL t, 3*4+off+192(dst); \ + MOVL t, 9*4+off+256(dst); \ + MOVL t, 6*4+off+320(dst); \ + MOVL t, 15*4+off+384(dst); \ + MOVL t, 4*4+off+448(dst); \ + MOVL t, 2*4+off+512(dst); \ + MOVL t, 12*4+off+576(dst); \ + MOVL 12*4(src), t; \ + MOVL t, 10*4+off+0(dst); \ + MOVL t, 12*4+off+64(dst); \ + MOVL t, 1*4+off+128(dst); \ + MOVL t, 6*4+off+192(dst); \ + MOVL t, 13*4+off+256(dst); \ + MOVL t, 4*4+off+320(dst); \ + MOVL t, 0*4+off+384(dst); \ + MOVL t, 2*4+off+448(dst); \ + MOVL t, 8*4+off+512(dst); \ + MOVL t, 14*4+off+576(dst); \ + MOVL 13*4(src), t; \ + MOVL t, 14*4+off+0(dst); \ + MOVL t, 3*4+off+64(dst); \ + MOVL t, 7*4+off+128(dst); \ + MOVL t, 2*4+off+192(dst); \ + MOVL t, 15*4+off+256(dst); \ + MOVL t, 12*4+off+320(dst); \ + MOVL t, 6*4+off+384(dst); \ + MOVL t, 0*4+off+448(dst); \ + MOVL t, 9*4+off+512(dst); \ + MOVL t, 11*4+off+576(dst); \ + MOVL 14*4(src), t; \ + MOVL t, 11*4+off+0(dst); \ + MOVL t, 0*4+off+64(dst); \ + MOVL t, 12*4+off+128(dst); \ + MOVL t, 7*4+off+192(dst); \ + MOVL t, 8*4+off+256(dst); \ + MOVL t, 14*4+off+320(dst); \ + MOVL t, 2*4+off+384(dst); \ + MOVL t, 5*4+off+448(dst); \ + MOVL t, 1*4+off+512(dst); \ + MOVL t, 13*4+off+576(dst); \ + MOVL 15*4(src), t; \ + MOVL t, 15*4+off+0(dst); \ + MOVL t, 6*4+off+64(dst); \ + MOVL t, 3*4+off+128(dst); \ + MOVL t, 11*4+off+192(dst); \ + MOVL t, 7*4+off+256(dst); \ + MOVL t, 10*4+off+320(dst); \ + MOVL t, 5*4+off+384(dst); \ + MOVL t, 9*4+off+448(dst); \ + MOVL t, 4*4+off+512(dst); \ + MOVL t, 8*4+off+576(dst) + +// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +TEXT ·hashBlocksSSE2(SB), 0, $672-24 // frame = 656 + 16 byte alignment + MOVL h+0(FP), AX + MOVL c+4(FP), BX + MOVL flag+8(FP), CX + MOVL blocks_base+12(FP), SI + MOVL blocks_len+16(FP), DX + + MOVL SP, DI + ADDL $15, DI + ANDL $~15, DI + + MOVL CX, 8(DI) + MOVL 0(BX), CX + MOVL CX, 0(DI) + MOVL 4(BX), CX + MOVL CX, 4(DI) + XORL CX, CX + MOVL CX, 12(DI) + + MOVOU 0(AX), X0 + MOVOU 16(AX), X1 + MOVOU counter<>(SB), X2 + +loop: + MOVO X0, X4 + MOVO X1, X5 + MOVOU iv0<>(SB), X6 + MOVOU iv1<>(SB), X7 + + MOVO 0(DI), X3 + PADDQ X2, X3 + PXOR X3, X7 + MOVO X3, 0(DI) + + PRECOMPUTE(DI, 16, SI, CX) + ROUND_SSE2(X4, X5, X6, X7, 16(DI), 32(DI), 48(DI), 64(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+64(DI), 32+64(DI), 48+64(DI), 64+64(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+128(DI), 32+128(DI), 48+128(DI), 64+128(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+192(DI), 32+192(DI), 48+192(DI), 64+192(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+256(DI), 32+256(DI), 48+256(DI), 64+256(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+320(DI), 32+320(DI), 48+320(DI), 64+320(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+384(DI), 32+384(DI), 48+384(DI), 64+384(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+448(DI), 32+448(DI), 48+448(DI), 64+448(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+512(DI), 32+512(DI), 48+512(DI), 64+512(DI), X3) + ROUND_SSE2(X4, X5, X6, X7, 16+576(DI), 32+576(DI), 48+576(DI), 64+576(DI), X3) + + PXOR X4, X0 + PXOR X5, X1 + PXOR X6, X0 + PXOR X7, X1 + + LEAL 64(SI), SI + SUBL $64, DX + JNE loop + + MOVL 0(DI), CX + MOVL CX, 0(BX) + MOVL 4(DI), CX + MOVL CX, 4(BX) + + MOVOU X0, 0(AX) + MOVOU X1, 16(AX) + + RET + +// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +TEXT ·hashBlocksSSSE3(SB), 0, $704-24 // frame = 688 + 16 byte alignment + MOVL h+0(FP), AX + MOVL c+4(FP), BX + MOVL flag+8(FP), CX + MOVL blocks_base+12(FP), SI + MOVL blocks_len+16(FP), DX + + MOVL SP, DI + ADDL $15, DI + ANDL $~15, DI + + MOVL CX, 8(DI) + MOVL 0(BX), CX + MOVL CX, 0(DI) + MOVL 4(BX), CX + MOVL CX, 4(DI) + XORL CX, CX + MOVL CX, 12(DI) + + MOVOU 0(AX), X0 + MOVOU 16(AX), X1 + MOVOU counter<>(SB), X2 + +loop: + MOVO X0, 656(DI) + MOVO X1, 672(DI) + MOVO X0, X4 + MOVO X1, X5 + MOVOU iv0<>(SB), X6 + MOVOU iv1<>(SB), X7 + + MOVO 0(DI), X3 + PADDQ X2, X3 + PXOR X3, X7 + MOVO X3, 0(DI) + + MOVOU rol16<>(SB), X0 + MOVOU rol8<>(SB), X1 + + PRECOMPUTE(DI, 16, SI, CX) + ROUND_SSSE3(X4, X5, X6, X7, 16(DI), 32(DI), 48(DI), 64(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+64(DI), 32+64(DI), 48+64(DI), 64+64(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+128(DI), 32+128(DI), 48+128(DI), 64+128(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+192(DI), 32+192(DI), 48+192(DI), 64+192(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+256(DI), 32+256(DI), 48+256(DI), 64+256(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+320(DI), 32+320(DI), 48+320(DI), 64+320(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+384(DI), 32+384(DI), 48+384(DI), 64+384(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+448(DI), 32+448(DI), 48+448(DI), 64+448(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+512(DI), 32+512(DI), 48+512(DI), 64+512(DI), X3, X0, X1) + ROUND_SSSE3(X4, X5, X6, X7, 16+576(DI), 32+576(DI), 48+576(DI), 64+576(DI), X3, X0, X1) + + MOVO 656(DI), X0 + MOVO 672(DI), X1 + PXOR X4, X0 + PXOR X5, X1 + PXOR X6, X0 + PXOR X7, X1 + + LEAL 64(SI), SI + SUBL $64, DX + JNE loop + + MOVL 0(DI), CX + MOVL CX, 0(BX) + MOVL 4(DI), CX + MOVL CX, 4(BX) + + MOVOU X0, 0(AX) + MOVOU X1, 16(AX) + + RET diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go new file mode 100644 index 000000000..becdaa120 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.go @@ -0,0 +1,38 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +package blake2s + +import "golang.org/x/sys/cpu" + +var ( + useSSE4 = cpu.X86.HasSSE41 + useSSSE3 = cpu.X86.HasSSSE3 + useSSE2 = cpu.X86.HasSSE2 +) + +//go:noescape +func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) + +//go:noescape +func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) + +//go:noescape +func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) + +func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { + switch { + case useSSE4: + hashBlocksSSE4(h, c, flag, blocks) + case useSSSE3: + hashBlocksSSSE3(h, c, flag, blocks) + case useSSE2: + hashBlocksSSE2(h, c, flag, blocks) + default: + hashBlocksGeneric(h, c, flag, blocks) + } +} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s new file mode 100644 index 000000000..e9df7a7c2 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s @@ -0,0 +1,433 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build amd64 && gc && !purego +// +build amd64,gc,!purego + +#include "textflag.h" + +DATA iv0<>+0x00(SB)/4, $0x6a09e667 +DATA iv0<>+0x04(SB)/4, $0xbb67ae85 +DATA iv0<>+0x08(SB)/4, $0x3c6ef372 +DATA iv0<>+0x0c(SB)/4, $0xa54ff53a +GLOBL iv0<>(SB), (NOPTR+RODATA), $16 + +DATA iv1<>+0x00(SB)/4, $0x510e527f +DATA iv1<>+0x04(SB)/4, $0x9b05688c +DATA iv1<>+0x08(SB)/4, $0x1f83d9ab +DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 +GLOBL iv1<>(SB), (NOPTR+RODATA), $16 + +DATA rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +GLOBL rol16<>(SB), (NOPTR+RODATA), $16 + +DATA rol8<>+0x00(SB)/8, $0x0407060500030201 +DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 +GLOBL rol8<>(SB), (NOPTR+RODATA), $16 + +DATA counter<>+0x00(SB)/8, $0x40 +DATA counter<>+0x08(SB)/8, $0x0 +GLOBL counter<>(SB), (NOPTR+RODATA), $16 + +#define ROTL_SSE2(n, t, v) \ + MOVO v, t; \ + PSLLL $n, t; \ + PSRLL $(32-n), v; \ + PXOR t, v + +#define ROTL_SSSE3(c, v) \ + PSHUFB c, v + +#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ + PADDL m0, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(16, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m1, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(24, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v1, v1; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v3, v3; \ + PADDL m2, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(16, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m3, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSE2(24, t, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v3, v3; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v1, v1 + +#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ + PADDL m0, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c16, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m1, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c8, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v1, v1; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v3, v3; \ + PADDL m2, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c16, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(20, t, v1); \ + PADDL m3, v0; \ + PADDL v1, v0; \ + PXOR v0, v3; \ + ROTL_SSSE3(c8, v3); \ + PADDL v3, v2; \ + PXOR v2, v1; \ + ROTL_SSE2(25, t, v1); \ + PSHUFL $0x39, v3, v3; \ + PSHUFL $0x4E, v2, v2; \ + PSHUFL $0x93, v1, v1 + + +#define LOAD_MSG_SSE4(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) \ + MOVL i0*4(src), m0; \ + PINSRD $1, i1*4(src), m0; \ + PINSRD $2, i2*4(src), m0; \ + PINSRD $3, i3*4(src), m0; \ + MOVL i4*4(src), m1; \ + PINSRD $1, i5*4(src), m1; \ + PINSRD $2, i6*4(src), m1; \ + PINSRD $3, i7*4(src), m1; \ + MOVL i8*4(src), m2; \ + PINSRD $1, i9*4(src), m2; \ + PINSRD $2, i10*4(src), m2; \ + PINSRD $3, i11*4(src), m2; \ + MOVL i12*4(src), m3; \ + PINSRD $1, i13*4(src), m3; \ + PINSRD $2, i14*4(src), m3; \ + PINSRD $3, i15*4(src), m3 + +#define PRECOMPUTE_MSG(dst, off, src, R8, R9, R10, R11, R12, R13, R14, R15) \ + MOVQ 0*4(src), R8; \ + MOVQ 2*4(src), R9; \ + MOVQ 4*4(src), R10; \ + MOVQ 6*4(src), R11; \ + MOVQ 8*4(src), R12; \ + MOVQ 10*4(src), R13; \ + MOVQ 12*4(src), R14; \ + MOVQ 14*4(src), R15; \ + \ + MOVL R8, 0*4+off+0(dst); \ + MOVL R8, 9*4+off+64(dst); \ + MOVL R8, 5*4+off+128(dst); \ + MOVL R8, 14*4+off+192(dst); \ + MOVL R8, 4*4+off+256(dst); \ + MOVL R8, 2*4+off+320(dst); \ + MOVL R8, 8*4+off+384(dst); \ + MOVL R8, 12*4+off+448(dst); \ + MOVL R8, 3*4+off+512(dst); \ + MOVL R8, 15*4+off+576(dst); \ + SHRQ $32, R8; \ + MOVL R8, 4*4+off+0(dst); \ + MOVL R8, 8*4+off+64(dst); \ + MOVL R8, 14*4+off+128(dst); \ + MOVL R8, 5*4+off+192(dst); \ + MOVL R8, 12*4+off+256(dst); \ + MOVL R8, 11*4+off+320(dst); \ + MOVL R8, 1*4+off+384(dst); \ + MOVL R8, 6*4+off+448(dst); \ + MOVL R8, 10*4+off+512(dst); \ + MOVL R8, 3*4+off+576(dst); \ + \ + MOVL R9, 1*4+off+0(dst); \ + MOVL R9, 13*4+off+64(dst); \ + MOVL R9, 6*4+off+128(dst); \ + MOVL R9, 8*4+off+192(dst); \ + MOVL R9, 2*4+off+256(dst); \ + MOVL R9, 0*4+off+320(dst); \ + MOVL R9, 14*4+off+384(dst); \ + MOVL R9, 11*4+off+448(dst); \ + MOVL R9, 12*4+off+512(dst); \ + MOVL R9, 4*4+off+576(dst); \ + SHRQ $32, R9; \ + MOVL R9, 5*4+off+0(dst); \ + MOVL R9, 15*4+off+64(dst); \ + MOVL R9, 9*4+off+128(dst); \ + MOVL R9, 1*4+off+192(dst); \ + MOVL R9, 11*4+off+256(dst); \ + MOVL R9, 7*4+off+320(dst); \ + MOVL R9, 13*4+off+384(dst); \ + MOVL R9, 3*4+off+448(dst); \ + MOVL R9, 6*4+off+512(dst); \ + MOVL R9, 10*4+off+576(dst); \ + \ + MOVL R10, 2*4+off+0(dst); \ + MOVL R10, 1*4+off+64(dst); \ + MOVL R10, 15*4+off+128(dst); \ + MOVL R10, 10*4+off+192(dst); \ + MOVL R10, 6*4+off+256(dst); \ + MOVL R10, 8*4+off+320(dst); \ + MOVL R10, 3*4+off+384(dst); \ + MOVL R10, 13*4+off+448(dst); \ + MOVL R10, 14*4+off+512(dst); \ + MOVL R10, 5*4+off+576(dst); \ + SHRQ $32, R10; \ + MOVL R10, 6*4+off+0(dst); \ + MOVL R10, 11*4+off+64(dst); \ + MOVL R10, 2*4+off+128(dst); \ + MOVL R10, 9*4+off+192(dst); \ + MOVL R10, 1*4+off+256(dst); \ + MOVL R10, 13*4+off+320(dst); \ + MOVL R10, 4*4+off+384(dst); \ + MOVL R10, 8*4+off+448(dst); \ + MOVL R10, 15*4+off+512(dst); \ + MOVL R10, 7*4+off+576(dst); \ + \ + MOVL R11, 3*4+off+0(dst); \ + MOVL R11, 7*4+off+64(dst); \ + MOVL R11, 13*4+off+128(dst); \ + MOVL R11, 12*4+off+192(dst); \ + MOVL R11, 10*4+off+256(dst); \ + MOVL R11, 1*4+off+320(dst); \ + MOVL R11, 9*4+off+384(dst); \ + MOVL R11, 14*4+off+448(dst); \ + MOVL R11, 0*4+off+512(dst); \ + MOVL R11, 6*4+off+576(dst); \ + SHRQ $32, R11; \ + MOVL R11, 7*4+off+0(dst); \ + MOVL R11, 14*4+off+64(dst); \ + MOVL R11, 10*4+off+128(dst); \ + MOVL R11, 0*4+off+192(dst); \ + MOVL R11, 5*4+off+256(dst); \ + MOVL R11, 9*4+off+320(dst); \ + MOVL R11, 12*4+off+384(dst); \ + MOVL R11, 1*4+off+448(dst); \ + MOVL R11, 13*4+off+512(dst); \ + MOVL R11, 2*4+off+576(dst); \ + \ + MOVL R12, 8*4+off+0(dst); \ + MOVL R12, 5*4+off+64(dst); \ + MOVL R12, 4*4+off+128(dst); \ + MOVL R12, 15*4+off+192(dst); \ + MOVL R12, 14*4+off+256(dst); \ + MOVL R12, 3*4+off+320(dst); \ + MOVL R12, 11*4+off+384(dst); \ + MOVL R12, 10*4+off+448(dst); \ + MOVL R12, 7*4+off+512(dst); \ + MOVL R12, 1*4+off+576(dst); \ + SHRQ $32, R12; \ + MOVL R12, 12*4+off+0(dst); \ + MOVL R12, 2*4+off+64(dst); \ + MOVL R12, 11*4+off+128(dst); \ + MOVL R12, 4*4+off+192(dst); \ + MOVL R12, 0*4+off+256(dst); \ + MOVL R12, 15*4+off+320(dst); \ + MOVL R12, 10*4+off+384(dst); \ + MOVL R12, 7*4+off+448(dst); \ + MOVL R12, 5*4+off+512(dst); \ + MOVL R12, 9*4+off+576(dst); \ + \ + MOVL R13, 9*4+off+0(dst); \ + MOVL R13, 4*4+off+64(dst); \ + MOVL R13, 8*4+off+128(dst); \ + MOVL R13, 13*4+off+192(dst); \ + MOVL R13, 3*4+off+256(dst); \ + MOVL R13, 5*4+off+320(dst); \ + MOVL R13, 7*4+off+384(dst); \ + MOVL R13, 15*4+off+448(dst); \ + MOVL R13, 11*4+off+512(dst); \ + MOVL R13, 0*4+off+576(dst); \ + SHRQ $32, R13; \ + MOVL R13, 13*4+off+0(dst); \ + MOVL R13, 10*4+off+64(dst); \ + MOVL R13, 0*4+off+128(dst); \ + MOVL R13, 3*4+off+192(dst); \ + MOVL R13, 9*4+off+256(dst); \ + MOVL R13, 6*4+off+320(dst); \ + MOVL R13, 15*4+off+384(dst); \ + MOVL R13, 4*4+off+448(dst); \ + MOVL R13, 2*4+off+512(dst); \ + MOVL R13, 12*4+off+576(dst); \ + \ + MOVL R14, 10*4+off+0(dst); \ + MOVL R14, 12*4+off+64(dst); \ + MOVL R14, 1*4+off+128(dst); \ + MOVL R14, 6*4+off+192(dst); \ + MOVL R14, 13*4+off+256(dst); \ + MOVL R14, 4*4+off+320(dst); \ + MOVL R14, 0*4+off+384(dst); \ + MOVL R14, 2*4+off+448(dst); \ + MOVL R14, 8*4+off+512(dst); \ + MOVL R14, 14*4+off+576(dst); \ + SHRQ $32, R14; \ + MOVL R14, 14*4+off+0(dst); \ + MOVL R14, 3*4+off+64(dst); \ + MOVL R14, 7*4+off+128(dst); \ + MOVL R14, 2*4+off+192(dst); \ + MOVL R14, 15*4+off+256(dst); \ + MOVL R14, 12*4+off+320(dst); \ + MOVL R14, 6*4+off+384(dst); \ + MOVL R14, 0*4+off+448(dst); \ + MOVL R14, 9*4+off+512(dst); \ + MOVL R14, 11*4+off+576(dst); \ + \ + MOVL R15, 11*4+off+0(dst); \ + MOVL R15, 0*4+off+64(dst); \ + MOVL R15, 12*4+off+128(dst); \ + MOVL R15, 7*4+off+192(dst); \ + MOVL R15, 8*4+off+256(dst); \ + MOVL R15, 14*4+off+320(dst); \ + MOVL R15, 2*4+off+384(dst); \ + MOVL R15, 5*4+off+448(dst); \ + MOVL R15, 1*4+off+512(dst); \ + MOVL R15, 13*4+off+576(dst); \ + SHRQ $32, R15; \ + MOVL R15, 15*4+off+0(dst); \ + MOVL R15, 6*4+off+64(dst); \ + MOVL R15, 3*4+off+128(dst); \ + MOVL R15, 11*4+off+192(dst); \ + MOVL R15, 7*4+off+256(dst); \ + MOVL R15, 10*4+off+320(dst); \ + MOVL R15, 5*4+off+384(dst); \ + MOVL R15, 9*4+off+448(dst); \ + MOVL R15, 4*4+off+512(dst); \ + MOVL R15, 8*4+off+576(dst) + +#define BLAKE2s_SSE2() \ + PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ + ROUND_SSE2(X4, X5, X6, X7, 16(BP), 32(BP), 48(BP), 64(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+64(BP), 32+64(BP), 48+64(BP), 64+64(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+128(BP), 32+128(BP), 48+128(BP), 64+128(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+192(BP), 32+192(BP), 48+192(BP), 64+192(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+256(BP), 32+256(BP), 48+256(BP), 64+256(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+320(BP), 32+320(BP), 48+320(BP), 64+320(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+384(BP), 32+384(BP), 48+384(BP), 64+384(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+448(BP), 32+448(BP), 48+448(BP), 64+448(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+512(BP), 32+512(BP), 48+512(BP), 64+512(BP), X8); \ + ROUND_SSE2(X4, X5, X6, X7, 16+576(BP), 32+576(BP), 48+576(BP), 64+576(BP), X8) + +#define BLAKE2s_SSSE3() \ + PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ + ROUND_SSSE3(X4, X5, X6, X7, 16(BP), 32(BP), 48(BP), 64(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+64(BP), 32+64(BP), 48+64(BP), 64+64(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+128(BP), 32+128(BP), 48+128(BP), 64+128(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+192(BP), 32+192(BP), 48+192(BP), 64+192(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+256(BP), 32+256(BP), 48+256(BP), 64+256(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+320(BP), 32+320(BP), 48+320(BP), 64+320(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+384(BP), 32+384(BP), 48+384(BP), 64+384(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+448(BP), 32+448(BP), 48+448(BP), 64+448(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+512(BP), 32+512(BP), 48+512(BP), 64+512(BP), X8, X13, X14); \ + ROUND_SSSE3(X4, X5, X6, X7, 16+576(BP), 32+576(BP), 48+576(BP), 64+576(BP), X8, X13, X14) + +#define BLAKE2s_SSE4() \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ + LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0); \ + ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14) + +#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_FUNC) \ + MOVQ h, AX; \ + MOVQ c, BX; \ + MOVL flag, CX; \ + MOVQ blocks_base, SI; \ + MOVQ blocks_len, DX; \ + \ + MOVQ SP, BP; \ + ADDQ $15, BP; \ + ANDQ $~15, BP; \ + \ + MOVQ 0(BX), R9; \ + MOVQ R9, 0(BP); \ + MOVQ CX, 8(BP); \ + \ + MOVOU 0(AX), X0; \ + MOVOU 16(AX), X1; \ + MOVOU iv0<>(SB), X2; \ + MOVOU iv1<>(SB), X3 \ + \ + MOVOU counter<>(SB), X12; \ + MOVOU rol16<>(SB), X13; \ + MOVOU rol8<>(SB), X14; \ + MOVO 0(BP), X15; \ + \ + loop: \ + MOVO X0, X4; \ + MOVO X1, X5; \ + MOVO X2, X6; \ + MOVO X3, X7; \ + \ + PADDQ X12, X15; \ + PXOR X15, X7; \ + \ + BLAKE2s_FUNC(); \ + \ + PXOR X4, X0; \ + PXOR X5, X1; \ + PXOR X6, X0; \ + PXOR X7, X1; \ + \ + LEAQ 64(SI), SI; \ + SUBQ $64, DX; \ + JNE loop; \ + \ + MOVO X15, 0(BP); \ + MOVQ 0(BP), R9; \ + MOVQ R9, 0(BX); \ + \ + MOVOU X0, 0(AX); \ + MOVOU X1, 16(AX) + +// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +TEXT ·hashBlocksSSE2(SB), 0, $672-48 // frame = 656 + 16 byte alignment + HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE2) + RET + +// func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +TEXT ·hashBlocksSSSE3(SB), 0, $672-48 // frame = 656 + 16 byte alignment + HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSSE3) + RET + +// func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +TEXT ·hashBlocksSSE4(SB), 0, $32-48 // frame = 16 + 16 byte alignment + HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE4) + RET diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go b/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go new file mode 100644 index 000000000..24a1ff22a --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_generic.go @@ -0,0 +1,178 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package blake2s + +import ( + "math/bits" +) + +// the precomputed values for BLAKE2s +// there are 10 16-byte arrays - one for each round +// the entries are calculated from the sigma constants. +var precomputed = [10][16]byte{ + {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, + {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, + {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, + {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, + {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, + {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, + {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, + {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, + {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, + {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0}, +} + +func hashBlocksGeneric(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { + var m [16]uint32 + c0, c1 := c[0], c[1] + + for i := 0; i < len(blocks); { + c0 += BlockSize + if c0 < BlockSize { + c1++ + } + + v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] + v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7] + v12 ^= c0 + v13 ^= c1 + v14 ^= flag + + for j := range m { + m[j] = uint32(blocks[i]) | uint32(blocks[i+1])<<8 | uint32(blocks[i+2])<<16 | uint32(blocks[i+3])<<24 + i += 4 + } + + for k := range precomputed { + s := &(precomputed[k]) + + v0 += m[s[0]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft32(v12, -16) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft32(v4, -12) + v1 += m[s[1]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft32(v13, -16) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft32(v5, -12) + v2 += m[s[2]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft32(v14, -16) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft32(v6, -12) + v3 += m[s[3]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft32(v15, -16) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft32(v7, -12) + + v0 += m[s[4]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft32(v12, -8) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft32(v4, -7) + v1 += m[s[5]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft32(v13, -8) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft32(v5, -7) + v2 += m[s[6]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft32(v14, -8) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft32(v6, -7) + v3 += m[s[7]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft32(v15, -8) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft32(v7, -7) + + v0 += m[s[8]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft32(v15, -16) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft32(v5, -12) + v1 += m[s[9]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft32(v12, -16) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft32(v6, -12) + v2 += m[s[10]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft32(v13, -16) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft32(v7, -12) + v3 += m[s[11]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft32(v14, -16) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft32(v4, -12) + + v0 += m[s[12]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft32(v15, -8) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft32(v5, -7) + v1 += m[s[13]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft32(v12, -8) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft32(v6, -7) + v2 += m[s[14]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft32(v13, -8) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft32(v7, -7) + v3 += m[s[15]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft32(v14, -8) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft32(v4, -7) + } + + h[0] ^= v0 ^ v8 + h[1] ^= v1 ^ v9 + h[2] ^= v2 ^ v10 + h[3] ^= v3 ^ v11 + h[4] ^= v4 ^ v12 + h[5] ^= v5 ^ v13 + h[6] ^= v6 ^ v14 + h[7] ^= v7 ^ v15 + } + c[0], c[1] = c0, c1 +} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go b/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go new file mode 100644 index 000000000..799dba0c4 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_ref.go @@ -0,0 +1,18 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (!amd64 && !386) || !gc || purego +// +build !amd64,!386 !gc purego + +package blake2s + +var ( + useSSE4 = false + useSSSE3 = false + useSSE2 = false +) + +func hashBlocks(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) { + hashBlocksGeneric(h, c, flag, blocks) +} diff --git a/vendor/golang.org/x/crypto/blake2s/blake2x.go b/vendor/golang.org/x/crypto/blake2s/blake2x.go new file mode 100644 index 000000000..828749ff0 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/blake2x.go @@ -0,0 +1,178 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package blake2s + +import ( + "encoding/binary" + "errors" + "io" +) + +// XOF defines the interface to hash functions that +// support arbitrary-length output. +type XOF interface { + // Write absorbs more data into the hash's state. It panics if called + // after Read. + io.Writer + + // Read reads more output from the hash. It returns io.EOF if the limit + // has been reached. + io.Reader + + // Clone returns a copy of the XOF in its current state. + Clone() XOF + + // Reset resets the XOF to its initial state. + Reset() +} + +// OutputLengthUnknown can be used as the size argument to NewXOF to indicate +// the length of the output is not known in advance. +const OutputLengthUnknown = 0 + +// magicUnknownOutputLength is a magic value for the output size that indicates +// an unknown number of output bytes. +const magicUnknownOutputLength = 65535 + +// maxOutputLength is the absolute maximum number of bytes to produce when the +// number of output bytes is unknown. +const maxOutputLength = (1 << 32) * 32 + +// NewXOF creates a new variable-output-length hash. The hash either produce a +// known number of bytes (1 <= size < 65535), or an unknown number of bytes +// (size == OutputLengthUnknown). In the latter case, an absolute limit of +// 128GiB applies. +// +// A non-nil key turns the hash into a MAC. The key must between +// zero and 32 bytes long. +func NewXOF(size uint16, key []byte) (XOF, error) { + if len(key) > Size { + return nil, errKeySize + } + if size == magicUnknownOutputLength { + // 2^16-1 indicates an unknown number of bytes and thus isn't a + // valid length. + return nil, errors.New("blake2s: XOF length too large") + } + if size == OutputLengthUnknown { + size = magicUnknownOutputLength + } + x := &xof{ + d: digest{ + size: Size, + keyLen: len(key), + }, + length: size, + } + copy(x.d.key[:], key) + x.Reset() + return x, nil +} + +type xof struct { + d digest + length uint16 + remaining uint64 + cfg, root, block [Size]byte + offset int + nodeOffset uint32 + readMode bool +} + +func (x *xof) Write(p []byte) (n int, err error) { + if x.readMode { + panic("blake2s: write to XOF after read") + } + return x.d.Write(p) +} + +func (x *xof) Clone() XOF { + clone := *x + return &clone +} + +func (x *xof) Reset() { + x.cfg[0] = byte(Size) + binary.LittleEndian.PutUint32(x.cfg[4:], uint32(Size)) // leaf length + binary.LittleEndian.PutUint16(x.cfg[12:], x.length) // XOF length + x.cfg[15] = byte(Size) // inner hash size + + x.d.Reset() + x.d.h[3] ^= uint32(x.length) + + x.remaining = uint64(x.length) + if x.remaining == magicUnknownOutputLength { + x.remaining = maxOutputLength + } + x.offset, x.nodeOffset = 0, 0 + x.readMode = false +} + +func (x *xof) Read(p []byte) (n int, err error) { + if !x.readMode { + x.d.finalize(&x.root) + x.readMode = true + } + + if x.remaining == 0 { + return 0, io.EOF + } + + n = len(p) + if uint64(n) > x.remaining { + n = int(x.remaining) + p = p[:n] + } + + if x.offset > 0 { + blockRemaining := Size - x.offset + if n < blockRemaining { + x.offset += copy(p, x.block[x.offset:]) + x.remaining -= uint64(n) + return + } + copy(p, x.block[x.offset:]) + p = p[blockRemaining:] + x.offset = 0 + x.remaining -= uint64(blockRemaining) + } + + for len(p) >= Size { + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + copy(p, x.block[:]) + p = p[Size:] + x.remaining -= uint64(Size) + } + + if todo := len(p); todo > 0 { + if x.remaining < uint64(Size) { + x.cfg[0] = byte(x.remaining) + } + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + x.offset = copy(p, x.block[:todo]) + x.remaining -= uint64(todo) + } + + return +} + +func (d *digest) initConfig(cfg *[Size]byte) { + d.offset, d.c[0], d.c[1] = 0, 0, 0 + for i := range d.h { + d.h[i] = iv[i] ^ binary.LittleEndian.Uint32(cfg[i*4:]) + } +} diff --git a/vendor/golang.org/x/crypto/blake2s/register.go b/vendor/golang.org/x/crypto/blake2s/register.go new file mode 100644 index 000000000..ef79ff3c6 --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/register.go @@ -0,0 +1,22 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.9 +// +build go1.9 + +package blake2s + +import ( + "crypto" + "hash" +) + +func init() { + newHash256 := func() hash.Hash { + h, _ := New256(nil) + return h + } + + crypto.RegisterHash(crypto.BLAKE2s_256, newHash256) +} diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go index 94c71ac1a..5dfacbb98 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.11 && gc && !purego -// +build go1.11,gc,!purego +//go:build gc && !purego +// +build gc,!purego package chacha20 diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s index 63cae9e6f..f1f66230d 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s +++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.11 && gc && !purego -// +build go1.11,gc,!purego +//go:build gc && !purego +// +build gc,!purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go index 025b49897..02ff3d05e 100644 --- a/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go +++ b/vendor/golang.org/x/crypto/chacha20/chacha_noasm.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build (!arm64 && !s390x && !ppc64le) || (arm64 && !go1.11) || !gc || purego -// +build !arm64,!s390x,!ppc64le arm64,!go1.11 !gc purego +//go:build (!arm64 && !s390x && !ppc64le) || !gc || purego +// +build !arm64,!s390x,!ppc64le !gc purego package chacha20 diff --git a/vendor/golang.org/x/crypto/cryptobyte/builder.go b/vendor/golang.org/x/crypto/cryptobyte/builder.go index c05ac7d16..cf254f5f1 100644 --- a/vendor/golang.org/x/crypto/cryptobyte/builder.go +++ b/vendor/golang.org/x/crypto/cryptobyte/builder.go @@ -95,6 +95,11 @@ func (b *Builder) AddUint32(v uint32) { b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) } +// AddUint48 appends a big-endian, 48-bit value to the byte string. +func (b *Builder) AddUint48(v uint64) { + b.add(byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) +} + // AddUint64 appends a big-endian, 64-bit value to the byte string. func (b *Builder) AddUint64(v uint64) { b.add(byte(v>>56), byte(v>>48), byte(v>>40), byte(v>>32), byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) diff --git a/vendor/golang.org/x/crypto/cryptobyte/string.go b/vendor/golang.org/x/crypto/cryptobyte/string.go index 0531a3d6f..10692a8a3 100644 --- a/vendor/golang.org/x/crypto/cryptobyte/string.go +++ b/vendor/golang.org/x/crypto/cryptobyte/string.go @@ -81,6 +81,17 @@ func (s *String) ReadUint32(out *uint32) bool { return true } +// ReadUint48 decodes a big-endian, 48-bit value into out and advances over it. +// It reports whether the read was successful. +func (s *String) ReadUint48(out *uint64) bool { + v := s.read(6) + if v == nil { + return false + } + *out = uint64(v[0])<<40 | uint64(v[1])<<32 | uint64(v[2])<<24 | uint64(v[3])<<16 | uint64(v[4])<<8 | uint64(v[5]) + return true +} + // ReadUint64 decodes a big-endian, 64-bit value into out and advances over it. // It reports whether the read was successful. func (s *String) ReadUint64(out *uint64) bool { diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go index fa182beb4..4884d172a 100644 --- a/vendor/golang.org/x/crypto/sha3/sha3.go +++ b/vendor/golang.org/x/crypto/sha3/sha3.go @@ -121,11 +121,11 @@ func (d *state) padAndPermute(dsbyte byte) { copyOut(d, d.buf) } -// Write absorbs more data into the hash's state. It produces an error -// if more data is written to the ShakeHash after writing +// Write absorbs more data into the hash's state. It panics if any +// output has already been read. func (d *state) Write(p []byte) (written int, err error) { if d.state != spongeAbsorbing { - panic("sha3: write to sponge after read") + panic("sha3: Write after Read") } if d.buf == nil { d.buf = d.storage.asBytes()[:0] @@ -182,12 +182,16 @@ func (d *state) Read(out []byte) (n int, err error) { } // Sum applies padding to the hash state and then squeezes out the desired -// number of output bytes. +// number of output bytes. It panics if any output has already been read. func (d *state) Sum(in []byte) []byte { + if d.state != spongeAbsorbing { + panic("sha3: Sum after Read") + } + // Make a copy of the original hash so that caller can keep writing // and summing. dup := d.clone() - hash := make([]byte, dup.outputLen) + hash := make([]byte, dup.outputLen, 64) // explicit cap to allow stack allocation dup.Read(hash) return append(in, hash...) } diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go index 63a3edb4c..ec26f147f 100644 --- a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go @@ -49,7 +49,7 @@ type asmState struct { buf []byte // care must be taken to ensure cap(buf) is a multiple of rate rate int // equivalent to block size storage [3072]byte // underlying storage for buf - outputLen int // output length if fixed, 0 if not + outputLen int // output length for full security function code // KIMD/KLMD function code state spongeDirection // whether the sponge is absorbing or squeezing } @@ -72,8 +72,10 @@ func newAsmState(function code) *asmState { s.outputLen = 64 case shake_128: s.rate = 168 + s.outputLen = 32 case shake_256: s.rate = 136 + s.outputLen = 64 default: panic("sha3: unrecognized function code") } @@ -108,7 +110,7 @@ func (s *asmState) resetBuf() { // It never returns an error. func (s *asmState) Write(b []byte) (int, error) { if s.state != spongeAbsorbing { - panic("sha3: write to sponge after read") + panic("sha3: Write after Read") } length := len(b) for len(b) > 0 { @@ -192,8 +194,8 @@ func (s *asmState) Read(out []byte) (n int, err error) { // Sum appends the current hash to b and returns the resulting slice. // It does not change the underlying hash state. func (s *asmState) Sum(b []byte) []byte { - if s.outputLen == 0 { - panic("sha3: cannot call Sum on SHAKE functions") + if s.state != spongeAbsorbing { + panic("sha3: Sum after Read") } // Copy the state to preserve the original. diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go index d7be2954a..bb6998402 100644 --- a/vendor/golang.org/x/crypto/sha3/shake.go +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -17,26 +17,25 @@ package sha3 import ( "encoding/binary" + "hash" "io" ) -// ShakeHash defines the interface to hash functions that -// support arbitrary-length output. +// ShakeHash defines the interface to hash functions that support +// arbitrary-length output. When used as a plain [hash.Hash], it +// produces minimum-length outputs that provide full-strength generic +// security. type ShakeHash interface { - // Write absorbs more data into the hash's state. It panics if input is - // written to it after output has been read from it. - io.Writer + hash.Hash // Read reads more output from the hash; reading affects the hash's // state. (ShakeHash.Read is thus very different from Hash.Sum) - // It never returns an error. + // It never returns an error, but subsequent calls to Write or Sum + // will panic. io.Reader // Clone returns a copy of the ShakeHash in its current state. Clone() ShakeHash - - // Reset resets the ShakeHash to its initial state. - Reset() } // cSHAKE specific context @@ -81,8 +80,8 @@ func leftEncode(value uint64) []byte { return b[i-1:] } -func newCShake(N, S []byte, rate int, dsbyte byte) ShakeHash { - c := cshakeState{state: &state{rate: rate, dsbyte: dsbyte}} +func newCShake(N, S []byte, rate, outputLen int, dsbyte byte) ShakeHash { + c := cshakeState{state: &state{rate: rate, outputLen: outputLen, dsbyte: dsbyte}} // leftEncode returns max 9 bytes c.initBlock = make([]byte, 0, 9*2+len(N)+len(S)) @@ -119,7 +118,7 @@ func NewShake128() ShakeHash { if h := newShake128Asm(); h != nil { return h } - return &state{rate: rate128, dsbyte: dsbyteShake} + return &state{rate: rate128, outputLen: 32, dsbyte: dsbyteShake} } // NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. @@ -129,7 +128,7 @@ func NewShake256() ShakeHash { if h := newShake256Asm(); h != nil { return h } - return &state{rate: rate256, dsbyte: dsbyteShake} + return &state{rate: rate256, outputLen: 64, dsbyte: dsbyteShake} } // NewCShake128 creates a new instance of cSHAKE128 variable-output-length ShakeHash, @@ -142,7 +141,7 @@ func NewCShake128(N, S []byte) ShakeHash { if len(N) == 0 && len(S) == 0 { return NewShake128() } - return newCShake(N, S, rate128, dsbyteCShake) + return newCShake(N, S, rate128, 32, dsbyteCShake) } // NewCShake256 creates a new instance of cSHAKE256 variable-output-length ShakeHash, @@ -155,7 +154,7 @@ func NewCShake256(N, S []byte) ShakeHash { if len(N) == 0 && len(S) == 0 { return NewShake256() } - return newCShake(N, S, rate256, dsbyteCShake) + return newCShake(N, S, rate256, 64, dsbyteCShake) } // ShakeSum128 writes an arbitrary-length digest of data into hash. diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile deleted file mode 100644 index 851224595..000000000 --- a/vendor/golang.org/x/net/http2/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -# -# This Dockerfile builds a recent curl with HTTP/2 client support, using -# a recent nghttp2 build. -# -# See the Makefile for how to tag it. If Docker and that image is found, the -# Go tests use this curl binary for integration tests. -# - -FROM ubuntu:trusty - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y git-core build-essential wget - -RUN apt-get install -y --no-install-recommends \ - autotools-dev libtool pkg-config zlib1g-dev \ - libcunit1-dev libssl-dev libxml2-dev libevent-dev \ - automake autoconf - -# The list of packages nghttp2 recommends for h2load: -RUN apt-get install -y --no-install-recommends make binutils \ - autoconf automake autotools-dev \ - libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev \ - libev-dev libevent-dev libjansson-dev libjemalloc-dev \ - cython python3.4-dev python-setuptools - -# Note: setting NGHTTP2_VER before the git clone, so an old git clone isn't cached: -ENV NGHTTP2_VER 895da9a -RUN cd /root && git clone https://github.com/tatsuhiro-t/nghttp2.git - -WORKDIR /root/nghttp2 -RUN git reset --hard $NGHTTP2_VER -RUN autoreconf -i -RUN automake -RUN autoconf -RUN ./configure -RUN make -RUN make install - -WORKDIR /root -RUN wget https://curl.se/download/curl-7.45.0.tar.gz -RUN tar -zxvf curl-7.45.0.tar.gz -WORKDIR /root/curl-7.45.0 -RUN ./configure --with-ssl --with-nghttp2=/usr/local -RUN make -RUN make install -RUN ldconfig - -CMD ["-h"] -ENTRYPOINT ["/usr/local/bin/curl"] - diff --git a/vendor/golang.org/x/net/http2/Makefile b/vendor/golang.org/x/net/http2/Makefile deleted file mode 100644 index 55fd826f7..000000000 --- a/vendor/golang.org/x/net/http2/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -curlimage: - docker build -t gohttp2/curl . - diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 033b6e6db..02c88b6b3 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -581,9 +581,11 @@ type serverConn struct { advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client curClientStreams uint32 // number of open streams initiated by the client curPushedStreams uint32 // number of open streams initiated by server push + curHandlers uint32 // number of running handler goroutines maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes streams map[uint32]*stream + unstartedHandlers []unstartedHandler initialStreamSendWindowSize int32 maxFrameSize int32 peerMaxHeaderListSize uint32 // zero means unknown (default) @@ -981,6 +983,8 @@ func (sc *serverConn) serve() { return case gracefulShutdownMsg: sc.startGracefulShutdownInternal() + case handlerDoneMsg: + sc.handlerDone() default: panic("unknown timer") } @@ -1012,14 +1016,6 @@ func (sc *serverConn) serve() { } } -func (sc *serverConn) awaitGracefulShutdown(sharedCh <-chan struct{}, privateCh chan struct{}) { - select { - case <-sc.doneServing: - case <-sharedCh: - close(privateCh) - } -} - type serverMessage int // Message values sent to serveMsgCh. @@ -1028,6 +1024,7 @@ var ( idleTimerMsg = new(serverMessage) shutdownTimerMsg = new(serverMessage) gracefulShutdownMsg = new(serverMessage) + handlerDoneMsg = new(serverMessage) ) func (sc *serverConn) onSettingsTimer() { sc.sendServeMsg(settingsTimerMsg) } @@ -1900,9 +1897,11 @@ func (st *stream) copyTrailersToHandlerRequest() { // onReadTimeout is run on its own goroutine (from time.AfterFunc) // when the stream's ReadTimeout has fired. func (st *stream) onReadTimeout() { - // Wrap the ErrDeadlineExceeded to avoid callers depending on us - // returning the bare error. - st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + if st.body != nil { + // Wrap the ErrDeadlineExceeded to avoid callers depending on us + // returning the bare error. + st.body.CloseWithError(fmt.Errorf("%w", os.ErrDeadlineExceeded)) + } } // onWriteTimeout is run on its own goroutine (from time.AfterFunc) @@ -2020,13 +2019,10 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { // (in Go 1.8), though. That's a more sane option anyway. if sc.hs.ReadTimeout != 0 { sc.conn.SetReadDeadline(time.Time{}) - if st.body != nil { - st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) - } + st.readDeadline = time.AfterFunc(sc.hs.ReadTimeout, st.onReadTimeout) } - go sc.runHandler(rw, req, handler) - return nil + return sc.scheduleHandler(id, rw, req, handler) } func (sc *serverConn) upgradeRequest(req *http.Request) { @@ -2046,6 +2042,10 @@ func (sc *serverConn) upgradeRequest(req *http.Request) { sc.conn.SetReadDeadline(time.Time{}) } + // This is the first request on the connection, + // so start the handler directly rather than going + // through scheduleHandler. + sc.curHandlers++ go sc.runHandler(rw, req, sc.handler.ServeHTTP) } @@ -2286,8 +2286,62 @@ func (sc *serverConn) newResponseWriter(st *stream, req *http.Request) *response return &responseWriter{rws: rws} } +type unstartedHandler struct { + streamID uint32 + rw *responseWriter + req *http.Request + handler func(http.ResponseWriter, *http.Request) +} + +// scheduleHandler starts a handler goroutine, +// or schedules one to start as soon as an existing handler finishes. +func (sc *serverConn) scheduleHandler(streamID uint32, rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) error { + sc.serveG.check() + maxHandlers := sc.advMaxStreams + if sc.curHandlers < maxHandlers { + sc.curHandlers++ + go sc.runHandler(rw, req, handler) + return nil + } + if len(sc.unstartedHandlers) > int(4*sc.advMaxStreams) { + return sc.countError("too_many_early_resets", ConnectionError(ErrCodeEnhanceYourCalm)) + } + sc.unstartedHandlers = append(sc.unstartedHandlers, unstartedHandler{ + streamID: streamID, + rw: rw, + req: req, + handler: handler, + }) + return nil +} + +func (sc *serverConn) handlerDone() { + sc.serveG.check() + sc.curHandlers-- + i := 0 + maxHandlers := sc.advMaxStreams + for ; i < len(sc.unstartedHandlers); i++ { + u := sc.unstartedHandlers[i] + if sc.streams[u.streamID] == nil { + // This stream was reset before its goroutine had a chance to start. + continue + } + if sc.curHandlers >= maxHandlers { + break + } + sc.curHandlers++ + go sc.runHandler(u.rw, u.req, u.handler) + sc.unstartedHandlers[i] = unstartedHandler{} // don't retain references + } + sc.unstartedHandlers = sc.unstartedHandlers[i:] + if len(sc.unstartedHandlers) == 0 { + sc.unstartedHandlers = nil + } +} + // Run on its own goroutine. func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + defer sc.sendServeMsg(handlerDoneMsg) didPanic := true defer func() { rw.rws.stream.cancelCtx() diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 4f08ccba9..4515b22c4 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -19,6 +19,7 @@ import ( "io/fs" "log" "math" + "math/bits" mathrand "math/rand" "net" "net/http" @@ -290,8 +291,7 @@ func (t *Transport) initConnPool() { // HTTP/2 server. type ClientConn struct { t *Transport - tconn net.Conn // usually *tls.Conn, except specialized impls - tconnClosed bool + tconn net.Conn // usually *tls.Conn, except specialized impls tlsState *tls.ConnectionState // nil only for specialized impls reused uint32 // whether conn is being reused; atomic singleUse bool // whether being used for a single http.Request @@ -518,11 +518,14 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { func authorityAddr(scheme string, authority string) (addr string) { host, port, err := net.SplitHostPort(authority) if err != nil { // authority didn't have a port + host = authority + port = "" + } + if port == "" { // authority's port was empty port = "443" if scheme == "http" { port = "80" } - host = authority } if a, err := idna.ToASCII(host); err == nil { host = a @@ -1268,22 +1271,7 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { cancelRequest := func(cs *clientStream, err error) error { cs.cc.mu.Lock() - cs.abortStreamLocked(err) bodyClosed := cs.reqBodyClosed - if cs.ID != 0 { - // This request may have failed because of a problem with the connection, - // or for some unrelated reason. (For example, the user might have canceled - // the request without waiting for a response.) Mark the connection as - // not reusable, since trying to reuse a dead connection is worse than - // unnecessarily creating a new one. - // - // If cs.ID is 0, then the request was never allocated a stream ID and - // whatever went wrong was unrelated to the connection. We might have - // timed out waiting for a stream slot when StrictMaxConcurrentStreams - // is set, for example, in which case retrying on a different connection - // will not help. - cs.cc.doNotReuse = true - } cs.cc.mu.Unlock() // Wait for the request body to be closed. // @@ -1318,11 +1306,14 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { return handleResponseHeaders() default: waitDone() - return nil, cancelRequest(cs, cs.abortErr) + return nil, cs.abortErr } case <-ctx.Done(): - return nil, cancelRequest(cs, ctx.Err()) + err := ctx.Err() + cs.abortStream(err) + return nil, cancelRequest(cs, err) case <-cs.reqCancel: + cs.abortStream(errRequestCanceled) return nil, cancelRequest(cs, errRequestCanceled) } } @@ -1689,7 +1680,27 @@ func (cs *clientStream) frameScratchBufferLen(maxFrameSize int) int { return int(n) // doesn't truncate; max is 512K } -var bufPool sync.Pool // of *[]byte +// Seven bufPools manage different frame sizes. This helps to avoid scenarios where long-running +// streaming requests using small frame sizes occupy large buffers initially allocated for prior +// requests needing big buffers. The size ranges are as follows: +// {0 KB, 16 KB], {16 KB, 32 KB], {32 KB, 64 KB], {64 KB, 128 KB], {128 KB, 256 KB], +// {256 KB, 512 KB], {512 KB, infinity} +// In practice, the maximum scratch buffer size should not exceed 512 KB due to +// frameScratchBufferLen(maxFrameSize), thus the "infinity pool" should never be used. +// It exists mainly as a safety measure, for potential future increases in max buffer size. +var bufPools [7]sync.Pool // of *[]byte +func bufPoolIndex(size int) int { + if size <= 16384 { + return 0 + } + size -= 1 + bits := bits.Len(uint(size)) + index := bits - 14 + if index >= len(bufPools) { + return len(bufPools) - 1 + } + return index +} func (cs *clientStream) writeRequestBody(req *http.Request) (err error) { cc := cs.cc @@ -1707,12 +1718,13 @@ func (cs *clientStream) writeRequestBody(req *http.Request) (err error) { // Scratch buffer for reading into & writing from. scratchLen := cs.frameScratchBufferLen(maxFrameSize) var buf []byte - if bp, ok := bufPool.Get().(*[]byte); ok && len(*bp) >= scratchLen { - defer bufPool.Put(bp) + index := bufPoolIndex(scratchLen) + if bp, ok := bufPools[index].Get().(*[]byte); ok && len(*bp) >= scratchLen { + defer bufPools[index].Put(bp) buf = *bp } else { buf = make([]byte, scratchLen) - defer bufPool.Put(&buf) + defer bufPools[index].Put(&buf) } var sawEOF bool @@ -1880,6 +1892,9 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail if err != nil { return nil, err } + if !httpguts.ValidHostHeader(host) { + return nil, errors.New("http2: invalid Host header") + } var path string if req.Method != "CONNECT" { diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index aae6aac87..ee1698cef 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -121,7 +121,7 @@ func CheckJoiners(enable bool) Option { } } -// StrictDomainName limits the set of permissable ASCII characters to those +// StrictDomainName limits the set of permissible ASCII characters to those // allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the // hyphen). This is set by default for MapForLookup and ValidateForRegistration, // but is only useful if ValidateLabels is set. diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index 390c5e56d..66701eadf 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,151 +1,294 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package idna // UnicodeVersion is the Unicode version from which the tables in this package are derived. const UnicodeVersion = "13.0.0" -var mappings string = "" + // Size: 8188 bytes - "\x00\x01 \x03 ̈\x01a\x03 ̄\x012\x013\x03 ́\x03 ̧\x011\x01o\x051⁄4\x051⁄2" + - "\x053⁄4\x03i̇\x03l·\x03ʼn\x01s\x03dž\x03ⱥ\x03ⱦ\x01h\x01j\x01r\x01w\x01y" + - "\x03 ̆\x03 ̇\x03 ̊\x03 ̨\x03 ̃\x03 ̋\x01l\x01x\x04̈́\x03 ι\x01;\x05 ̈́" + - "\x04եւ\x04اٴ\x04وٴ\x04ۇٴ\x04يٴ\x06क़\x06ख़\x06ग़\x06ज़\x06ड़\x06ढ़\x06फ़" + - "\x06य़\x06ড়\x06ঢ়\x06য়\x06ਲ਼\x06ਸ਼\x06ਖ਼\x06ਗ਼\x06ਜ਼\x06ਫ਼\x06ଡ଼\x06ଢ଼" + - "\x06ํา\x06ໍາ\x06ຫນ\x06ຫມ\x06གྷ\x06ཌྷ\x06དྷ\x06བྷ\x06ཛྷ\x06ཀྵ\x06ཱི\x06ཱུ" + - "\x06ྲྀ\x09ྲཱྀ\x06ླྀ\x09ླཱྀ\x06ཱྀ\x06ྒྷ\x06ྜྷ\x06ྡྷ\x06ྦྷ\x06ྫྷ\x06ྐྵ\x02" + - "в\x02д\x02о\x02с\x02т\x02ъ\x02ѣ\x02æ\x01b\x01d\x01e\x02ǝ\x01g\x01i\x01k" + - "\x01m\x01n\x02ȣ\x01p\x01t\x01u\x02ɐ\x02ɑ\x02ə\x02ɛ\x02ɜ\x02ŋ\x02ɔ\x02ɯ" + - "\x01v\x02β\x02γ\x02δ\x02φ\x02χ\x02ρ\x02н\x02ɒ\x01c\x02ɕ\x02ð\x01f\x02ɟ" + - "\x02ɡ\x02ɥ\x02ɨ\x02ɩ\x02ɪ\x02ʝ\x02ɭ\x02ʟ\x02ɱ\x02ɰ\x02ɲ\x02ɳ\x02ɴ\x02ɵ" + - "\x02ɸ\x02ʂ\x02ʃ\x02ƫ\x02ʉ\x02ʊ\x02ʋ\x02ʌ\x01z\x02ʐ\x02ʑ\x02ʒ\x02θ\x02ss" + - "\x02ά\x02έ\x02ή\x02ί\x02ό\x02ύ\x02ώ\x05ἀι\x05ἁι\x05ἂι\x05ἃι\x05ἄι\x05ἅι" + - "\x05ἆι\x05ἇι\x05ἠι\x05ἡι\x05ἢι\x05ἣι\x05ἤι\x05ἥι\x05ἦι\x05ἧι\x05ὠι\x05ὡι" + - "\x05ὢι\x05ὣι\x05ὤι\x05ὥι\x05ὦι\x05ὧι\x05ὰι\x04αι\x04άι\x05ᾶι\x02ι\x05 ̈͂" + - "\x05ὴι\x04ηι\x04ήι\x05ῆι\x05 ̓̀\x05 ̓́\x05 ̓͂\x02ΐ\x05 ̔̀\x05 ̔́\x05 ̔͂" + - "\x02ΰ\x05 ̈̀\x01`\x05ὼι\x04ωι\x04ώι\x05ῶι\x06′′\x09′′′\x06‵‵\x09‵‵‵\x02!" + - "!\x02??\x02?!\x02!?\x0c′′′′\x010\x014\x015\x016\x017\x018\x019\x01+\x01=" + - "\x01(\x01)\x02rs\x02ħ\x02no\x01q\x02sm\x02tm\x02ω\x02å\x02א\x02ב\x02ג" + - "\x02ד\x02π\x051⁄7\x051⁄9\x061⁄10\x051⁄3\x052⁄3\x051⁄5\x052⁄5\x053⁄5\x054" + - "⁄5\x051⁄6\x055⁄6\x051⁄8\x053⁄8\x055⁄8\x057⁄8\x041⁄\x02ii\x02iv\x02vi" + - "\x04viii\x02ix\x02xi\x050⁄3\x06∫∫\x09∫∫∫\x06∮∮\x09∮∮∮\x0210\x0211\x0212" + - "\x0213\x0214\x0215\x0216\x0217\x0218\x0219\x0220\x04(10)\x04(11)\x04(12)" + - "\x04(13)\x04(14)\x04(15)\x04(16)\x04(17)\x04(18)\x04(19)\x04(20)\x0c∫∫∫∫" + - "\x02==\x05⫝̸\x02ɫ\x02ɽ\x02ȿ\x02ɀ\x01.\x04 ゙\x04 ゚\x06より\x06コト\x05(ᄀ)\x05" + - "(ᄂ)\x05(ᄃ)\x05(ᄅ)\x05(ᄆ)\x05(ᄇ)\x05(ᄉ)\x05(ᄋ)\x05(ᄌ)\x05(ᄎ)\x05(ᄏ)\x05(ᄐ" + - ")\x05(ᄑ)\x05(ᄒ)\x05(가)\x05(나)\x05(다)\x05(라)\x05(마)\x05(바)\x05(사)\x05(아)" + - "\x05(자)\x05(차)\x05(카)\x05(타)\x05(파)\x05(하)\x05(주)\x08(오전)\x08(오후)\x05(一)" + - "\x05(二)\x05(三)\x05(四)\x05(五)\x05(六)\x05(七)\x05(八)\x05(九)\x05(十)\x05(月)" + - "\x05(火)\x05(水)\x05(木)\x05(金)\x05(土)\x05(日)\x05(株)\x05(有)\x05(社)\x05(名)" + - "\x05(特)\x05(財)\x05(祝)\x05(労)\x05(代)\x05(呼)\x05(学)\x05(監)\x05(企)\x05(資)" + - "\x05(協)\x05(祭)\x05(休)\x05(自)\x05(至)\x0221\x0222\x0223\x0224\x0225\x0226" + - "\x0227\x0228\x0229\x0230\x0231\x0232\x0233\x0234\x0235\x06참고\x06주의\x0236" + - "\x0237\x0238\x0239\x0240\x0241\x0242\x0243\x0244\x0245\x0246\x0247\x0248" + - "\x0249\x0250\x041月\x042月\x043月\x044月\x045月\x046月\x047月\x048月\x049月\x0510" + - "月\x0511月\x0512月\x02hg\x02ev\x06令和\x0cアパート\x0cアルファ\x0cアンペア\x09アール\x0cイニ" + - "ング\x09インチ\x09ウォン\x0fエスクード\x0cエーカー\x09オンス\x09オーム\x09カイリ\x0cカラット\x0cカロリー" + - "\x09ガロン\x09ガンマ\x06ギガ\x09ギニー\x0cキュリー\x0cギルダー\x06キロ\x0fキログラム\x12キロメートル\x0f" + - "キロワット\x09グラム\x0fグラムトン\x0fクルゼイロ\x0cクローネ\x09ケース\x09コルナ\x09コーポ\x0cサイクル" + - "\x0fサンチーム\x0cシリング\x09センチ\x09セント\x09ダース\x06デシ\x06ドル\x06トン\x06ナノ\x09ノット" + - "\x09ハイツ\x0fパーセント\x09パーツ\x0cバーレル\x0fピアストル\x09ピクル\x06ピコ\x06ビル\x0fファラッド\x0c" + - "フィート\x0fブッシェル\x09フラン\x0fヘクタール\x06ペソ\x09ペニヒ\x09ヘルツ\x09ペンス\x09ページ\x09ベータ" + - "\x0cポイント\x09ボルト\x06ホン\x09ポンド\x09ホール\x09ホーン\x0cマイクロ\x09マイル\x09マッハ\x09マルク" + - "\x0fマンション\x0cミクロン\x06ミリ\x0fミリバール\x06メガ\x0cメガトン\x0cメートル\x09ヤード\x09ヤール\x09" + - "ユアン\x0cリットル\x06リラ\x09ルピー\x0cルーブル\x06レム\x0fレントゲン\x09ワット\x040点\x041点\x04" + - "2点\x043点\x044点\x045点\x046点\x047点\x048点\x049点\x0510点\x0511点\x0512点\x0513点" + - "\x0514点\x0515点\x0516点\x0517点\x0518点\x0519点\x0520点\x0521点\x0522点\x0523点" + - "\x0524点\x02da\x02au\x02ov\x02pc\x02dm\x02iu\x06平成\x06昭和\x06大正\x06明治\x0c株" + - "式会社\x02pa\x02na\x02ma\x02ka\x02kb\x02mb\x02gb\x04kcal\x02pf\x02nf\x02m" + - "g\x02kg\x02hz\x02ml\x02dl\x02kl\x02fm\x02nm\x02mm\x02cm\x02km\x02m2\x02m" + - "3\x05m∕s\x06m∕s2\x07rad∕s\x08rad∕s2\x02ps\x02ns\x02ms\x02pv\x02nv\x02mv" + - "\x02kv\x02pw\x02nw\x02mw\x02kw\x02bq\x02cc\x02cd\x06c∕kg\x02db\x02gy\x02" + - "ha\x02hp\x02in\x02kk\x02kt\x02lm\x02ln\x02lx\x02ph\x02pr\x02sr\x02sv\x02" + - "wb\x05v∕m\x05a∕m\x041日\x042日\x043日\x044日\x045日\x046日\x047日\x048日\x049日" + - "\x0510日\x0511日\x0512日\x0513日\x0514日\x0515日\x0516日\x0517日\x0518日\x0519日" + - "\x0520日\x0521日\x0522日\x0523日\x0524日\x0525日\x0526日\x0527日\x0528日\x0529日" + - "\x0530日\x0531日\x02ь\x02ɦ\x02ɬ\x02ʞ\x02ʇ\x02œ\x02ʍ\x04𤋮\x04𢡊\x04𢡄\x04𣏕" + - "\x04𥉉\x04𥳐\x04𧻓\x02ff\x02fi\x02fl\x02st\x04մն\x04մե\x04մի\x04վն\x04մխ" + - "\x04יִ\x04ײַ\x02ע\x02ה\x02כ\x02ל\x02ם\x02ר\x02ת\x04שׁ\x04שׂ\x06שּׁ\x06שּ" + - "ׂ\x04אַ\x04אָ\x04אּ\x04בּ\x04גּ\x04דּ\x04הּ\x04וּ\x04זּ\x04טּ\x04יּ\x04" + - "ךּ\x04כּ\x04לּ\x04מּ\x04נּ\x04סּ\x04ףּ\x04פּ\x04צּ\x04קּ\x04רּ\x04שּ" + - "\x04תּ\x04וֹ\x04בֿ\x04כֿ\x04פֿ\x04אל\x02ٱ\x02ٻ\x02پ\x02ڀ\x02ٺ\x02ٿ\x02ٹ" + - "\x02ڤ\x02ڦ\x02ڄ\x02ڃ\x02چ\x02ڇ\x02ڍ\x02ڌ\x02ڎ\x02ڈ\x02ژ\x02ڑ\x02ک\x02گ" + - "\x02ڳ\x02ڱ\x02ں\x02ڻ\x02ۀ\x02ہ\x02ھ\x02ے\x02ۓ\x02ڭ\x02ۇ\x02ۆ\x02ۈ\x02ۋ" + - "\x02ۅ\x02ۉ\x02ې\x02ى\x04ئا\x04ئە\x04ئو\x04ئۇ\x04ئۆ\x04ئۈ\x04ئې\x04ئى\x02" + - "ی\x04ئج\x04ئح\x04ئم\x04ئي\x04بج\x04بح\x04بخ\x04بم\x04بى\x04بي\x04تج\x04" + - "تح\x04تخ\x04تم\x04تى\x04تي\x04ثج\x04ثم\x04ثى\x04ثي\x04جح\x04جم\x04حج" + - "\x04حم\x04خج\x04خح\x04خم\x04سج\x04سح\x04سخ\x04سم\x04صح\x04صم\x04ضج\x04ضح" + - "\x04ضخ\x04ضم\x04طح\x04طم\x04ظم\x04عج\x04عم\x04غج\x04غم\x04فج\x04فح\x04فخ" + - "\x04فم\x04فى\x04في\x04قح\x04قم\x04قى\x04قي\x04كا\x04كج\x04كح\x04كخ\x04كل" + - "\x04كم\x04كى\x04كي\x04لج\x04لح\x04لخ\x04لم\x04لى\x04لي\x04مج\x04مح\x04مخ" + - "\x04مم\x04مى\x04مي\x04نج\x04نح\x04نخ\x04نم\x04نى\x04ني\x04هج\x04هم\x04هى" + - "\x04هي\x04يج\x04يح\x04يخ\x04يم\x04يى\x04يي\x04ذٰ\x04رٰ\x04ىٰ\x05 ٌّ\x05 " + - "ٍّ\x05 َّ\x05 ُّ\x05 ِّ\x05 ّٰ\x04ئر\x04ئز\x04ئن\x04بر\x04بز\x04بن\x04ت" + - "ر\x04تز\x04تن\x04ثر\x04ثز\x04ثن\x04ما\x04نر\x04نز\x04نن\x04ير\x04يز\x04" + - "ين\x04ئخ\x04ئه\x04به\x04ته\x04صخ\x04له\x04نه\x04هٰ\x04يه\x04ثه\x04سه" + - "\x04شم\x04شه\x06ـَّ\x06ـُّ\x06ـِّ\x04طى\x04طي\x04عى\x04عي\x04غى\x04غي" + - "\x04سى\x04سي\x04شى\x04شي\x04حى\x04حي\x04جى\x04جي\x04خى\x04خي\x04صى\x04صي" + - "\x04ضى\x04ضي\x04شج\x04شح\x04شخ\x04شر\x04سر\x04صر\x04ضر\x04اً\x06تجم\x06ت" + - "حج\x06تحم\x06تخم\x06تمج\x06تمح\x06تمخ\x06جمح\x06حمي\x06حمى\x06سحج\x06سج" + - "ح\x06سجى\x06سمح\x06سمج\x06سمم\x06صحح\x06صمم\x06شحم\x06شجي\x06شمخ\x06شمم" + - "\x06ضحى\x06ضخم\x06طمح\x06طمم\x06طمي\x06عجم\x06عمم\x06عمى\x06غمم\x06غمي" + - "\x06غمى\x06فخم\x06قمح\x06قمم\x06لحم\x06لحي\x06لحى\x06لجج\x06لخم\x06لمح" + - "\x06محج\x06محم\x06محي\x06مجح\x06مجم\x06مخج\x06مخم\x06مجخ\x06همج\x06همم" + - "\x06نحم\x06نحى\x06نجم\x06نجى\x06نمي\x06نمى\x06يمم\x06بخي\x06تجي\x06تجى" + - "\x06تخي\x06تخى\x06تمي\x06تمى\x06جمي\x06جحى\x06جمى\x06سخى\x06صحي\x06شحي" + - "\x06ضحي\x06لجي\x06لمي\x06يحي\x06يجي\x06يمي\x06ممي\x06قمي\x06نحي\x06عمي" + - "\x06كمي\x06نجح\x06مخي\x06لجم\x06كمم\x06جحي\x06حجي\x06مجي\x06فمي\x06بحي" + - "\x06سخي\x06نجي\x06صلے\x06قلے\x08الله\x08اكبر\x08محمد\x08صلعم\x08رسول\x08" + - "عليه\x08وسلم\x06صلى!صلى الله عليه وسلم\x0fجل جلاله\x08ریال\x01,\x01:" + - "\x01!\x01?\x01_\x01{\x01}\x01[\x01]\x01#\x01&\x01*\x01-\x01<\x01>\x01\\" + - "\x01$\x01%\x01@\x04ـً\x04ـَ\x04ـُ\x04ـِ\x04ـّ\x04ـْ\x02ء\x02آ\x02أ\x02ؤ" + - "\x02إ\x02ئ\x02ا\x02ب\x02ة\x02ت\x02ث\x02ج\x02ح\x02خ\x02د\x02ذ\x02ر\x02ز" + - "\x02س\x02ش\x02ص\x02ض\x02ط\x02ظ\x02ع\x02غ\x02ف\x02ق\x02ك\x02ل\x02م\x02ن" + - "\x02ه\x02و\x02ي\x04لآ\x04لأ\x04لإ\x04لا\x01\x22\x01'\x01/\x01^\x01|\x01~" + - "\x02¢\x02£\x02¬\x02¦\x02¥\x08𝅗𝅥\x08𝅘𝅥\x0c𝅘𝅥𝅮\x0c𝅘𝅥𝅯\x0c𝅘𝅥𝅰\x0c𝅘𝅥𝅱\x0c𝅘𝅥𝅲" + - "\x08𝆹𝅥\x08𝆺𝅥\x0c𝆹𝅥𝅮\x0c𝆺𝅥𝅮\x0c𝆹𝅥𝅯\x0c𝆺𝅥𝅯\x02ı\x02ȷ\x02α\x02ε\x02ζ\x02η" + - "\x02κ\x02λ\x02μ\x02ν\x02ξ\x02ο\x02σ\x02τ\x02υ\x02ψ\x03∇\x03∂\x02ϝ\x02ٮ" + - "\x02ڡ\x02ٯ\x020,\x021,\x022,\x023,\x024,\x025,\x026,\x027,\x028,\x029," + - "\x03(a)\x03(b)\x03(c)\x03(d)\x03(e)\x03(f)\x03(g)\x03(h)\x03(i)\x03(j)" + - "\x03(k)\x03(l)\x03(m)\x03(n)\x03(o)\x03(p)\x03(q)\x03(r)\x03(s)\x03(t)" + - "\x03(u)\x03(v)\x03(w)\x03(x)\x03(y)\x03(z)\x07〔s〕\x02wz\x02hv\x02sd\x03p" + - "pv\x02wc\x02mc\x02md\x02mr\x02dj\x06ほか\x06ココ\x03サ\x03手\x03字\x03双\x03デ" + - "\x03二\x03多\x03解\x03天\x03交\x03映\x03無\x03料\x03前\x03後\x03再\x03新\x03初\x03終" + - "\x03生\x03販\x03声\x03吹\x03演\x03投\x03捕\x03一\x03三\x03遊\x03左\x03中\x03右\x03指" + - "\x03走\x03打\x03禁\x03空\x03合\x03満\x03有\x03月\x03申\x03割\x03営\x03配\x09〔本〕\x09〔" + - "三〕\x09〔二〕\x09〔安〕\x09〔点〕\x09〔打〕\x09〔盗〕\x09〔勝〕\x09〔敗〕\x03得\x03可\x03丽\x03" + - "丸\x03乁\x03你\x03侮\x03侻\x03倂\x03偺\x03備\x03僧\x03像\x03㒞\x03免\x03兔\x03兤\x03" + - "具\x03㒹\x03內\x03冗\x03冤\x03仌\x03冬\x03况\x03凵\x03刃\x03㓟\x03刻\x03剆\x03剷\x03" + - "㔕\x03勇\x03勉\x03勤\x03勺\x03包\x03匆\x03北\x03卉\x03卑\x03博\x03即\x03卽\x03卿\x03" + - "灰\x03及\x03叟\x03叫\x03叱\x03吆\x03咞\x03吸\x03呈\x03周\x03咢\x03哶\x03唐\x03啓\x03" + - "啣\x03善\x03喙\x03喫\x03喳\x03嗂\x03圖\x03嘆\x03圗\x03噑\x03噴\x03切\x03壮\x03城\x03" + - "埴\x03堍\x03型\x03堲\x03報\x03墬\x03売\x03壷\x03夆\x03夢\x03奢\x03姬\x03娛\x03娧\x03" + - "姘\x03婦\x03㛮\x03嬈\x03嬾\x03寃\x03寘\x03寧\x03寳\x03寿\x03将\x03尢\x03㞁\x03屠\x03" + - "屮\x03峀\x03岍\x03嵃\x03嵮\x03嵫\x03嵼\x03巡\x03巢\x03㠯\x03巽\x03帨\x03帽\x03幩\x03" + - "㡢\x03㡼\x03庰\x03庳\x03庶\x03廊\x03廾\x03舁\x03弢\x03㣇\x03形\x03彫\x03㣣\x03徚\x03" + - "忍\x03志\x03忹\x03悁\x03㤺\x03㤜\x03悔\x03惇\x03慈\x03慌\x03慎\x03慺\x03憎\x03憲\x03" + - "憤\x03憯\x03懞\x03懲\x03懶\x03成\x03戛\x03扝\x03抱\x03拔\x03捐\x03挽\x03拼\x03捨\x03" + - "掃\x03揤\x03搢\x03揅\x03掩\x03㨮\x03摩\x03摾\x03撝\x03摷\x03㩬\x03敏\x03敬\x03旣\x03" + - "書\x03晉\x03㬙\x03暑\x03㬈\x03㫤\x03冒\x03冕\x03最\x03暜\x03肭\x03䏙\x03朗\x03望\x03" + - "朡\x03杞\x03杓\x03㭉\x03柺\x03枅\x03桒\x03梅\x03梎\x03栟\x03椔\x03㮝\x03楂\x03榣\x03" + - "槪\x03檨\x03櫛\x03㰘\x03次\x03歔\x03㱎\x03歲\x03殟\x03殺\x03殻\x03汎\x03沿\x03泍\x03" + - "汧\x03洖\x03派\x03海\x03流\x03浩\x03浸\x03涅\x03洴\x03港\x03湮\x03㴳\x03滋\x03滇\x03" + - "淹\x03潮\x03濆\x03瀹\x03瀞\x03瀛\x03㶖\x03灊\x03災\x03灷\x03炭\x03煅\x03熜\x03爨\x03" + - "爵\x03牐\x03犀\x03犕\x03獺\x03王\x03㺬\x03玥\x03㺸\x03瑇\x03瑜\x03瑱\x03璅\x03瓊\x03" + - "㼛\x03甤\x03甾\x03異\x03瘐\x03㿼\x03䀈\x03直\x03眞\x03真\x03睊\x03䀹\x03瞋\x03䁆\x03" + - "䂖\x03硎\x03碌\x03磌\x03䃣\x03祖\x03福\x03秫\x03䄯\x03穀\x03穊\x03穏\x03䈂\x03篆\x03" + - "築\x03䈧\x03糒\x03䊠\x03糨\x03糣\x03紀\x03絣\x03䌁\x03緇\x03縂\x03繅\x03䌴\x03䍙\x03" + - "罺\x03羕\x03翺\x03者\x03聠\x03聰\x03䏕\x03育\x03脃\x03䐋\x03脾\x03媵\x03舄\x03辞\x03" + - "䑫\x03芑\x03芋\x03芝\x03劳\x03花\x03芳\x03芽\x03苦\x03若\x03茝\x03荣\x03莭\x03茣\x03" + - "莽\x03菧\x03著\x03荓\x03菊\x03菌\x03菜\x03䔫\x03蓱\x03蓳\x03蔖\x03蕤\x03䕝\x03䕡\x03" + - "䕫\x03虐\x03虜\x03虧\x03虩\x03蚩\x03蚈\x03蜎\x03蛢\x03蝹\x03蜨\x03蝫\x03螆\x03蟡\x03" + - "蠁\x03䗹\x03衠\x03衣\x03裗\x03裞\x03䘵\x03裺\x03㒻\x03䚾\x03䛇\x03誠\x03諭\x03變\x03" + - "豕\x03貫\x03賁\x03贛\x03起\x03跋\x03趼\x03跰\x03軔\x03輸\x03邔\x03郱\x03鄑\x03鄛\x03" + - "鈸\x03鋗\x03鋘\x03鉼\x03鏹\x03鐕\x03開\x03䦕\x03閷\x03䧦\x03雃\x03嶲\x03霣\x03䩮\x03" + - "䩶\x03韠\x03䪲\x03頋\x03頩\x03飢\x03䬳\x03餩\x03馧\x03駂\x03駾\x03䯎\x03鬒\x03鱀\x03" + - "鳽\x03䳎\x03䳭\x03鵧\x03䳸\x03麻\x03䵖\x03黹\x03黾\x03鼅\x03鼏\x03鼖\x03鼻" +var mappings string = "" + // Size: 6539 bytes + " ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" + + "ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" + + "ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" + + "′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" + + "⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" + + ")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" + + "(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" + + ")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" + + "財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" + + "5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" + + "アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" + + "グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" + + "ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" + + "イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" + + "ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" + + "点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" + + "lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" + + "pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" + + "8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" + + "խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" + + "ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" + + "ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" + + "مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" + + "نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" + + "زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" + + "ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" + + "مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" + + "فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" + + "ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" + + "حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" + + "وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" + + "أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱" + + "𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκλμνξοστυψ∇∂ϝٮڡٯ0,1,2,3,4,5,6,7,8,9,(a)(b)(c" + + ")(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y)(z)〔s" + + "〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申割営配〔" + + "本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉卑博即卽" + + "卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢㠯巽帨帽" + + "幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最暜肭䏙朗" + + "望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸瑇瑜瑱璅" + + "瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦若茝荣莭" + + "茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷䧦雃嶲霣" + + "䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻" + +var mappingIndex = []uint16{ // 1650 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a, + 0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024, + 0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, + 0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e, + 0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086, + 0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6, + 0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6, + // Entry 40 - 7F + 0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116, + 0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c, + 0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174, + 0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182, + 0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c, + 0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199, + 0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8, + 0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6, + // Entry 80 - BF + 0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6, + 0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6, + 0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5, + 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5, + 0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211, + 0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239, + 0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261, + 0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287, + // Entry C0 - FF + 0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa, + 0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8, + 0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8, + 0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326, + 0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340, + 0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368, + // Entry 100 - 13F + 0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386, + 0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1, + 0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1, + 0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db, + 0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401, + 0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417, + 0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441, + 0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469, + // Entry 140 - 17F + 0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491, + 0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc, + 0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7, + 0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f, + 0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537, + 0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f, + 0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e, + 0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e, + // Entry 180 - 1BF + 0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6, + 0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6, + 0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc, + 0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee, + 0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a, + 0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e, + 0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf, + 0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738, + // Entry 1C0 - 1FF + 0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c, + 0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce, + 0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822, + 0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873, + 0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be, + 0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f, + 0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d, + 0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997, + // Entry 200 - 23F + 0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9, + 0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1, + 0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00, + 0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a, + 0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c, + 0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c, + 0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f, + 0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e, + // Entry 240 - 27F + 0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e, + 0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2, + 0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2, + 0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2, + 0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6, + 0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e, + 0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46, + 0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c, + // Entry 280 - 2BF + 0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a, + 0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92, + 0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8, + 0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8, + 0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8, + 0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08, + 0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28, + 0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e, + // Entry 2C0 - 2FF + 0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e, + 0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e, + 0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e, + 0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e, + 0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a, + 0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8, + 0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8, + 0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8, + // Entry 300 - 33F + 0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18, + 0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38, + 0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58, + 0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78, + 0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98, + 0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8, + 0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8, + 0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8, + // Entry 340 - 37F + 0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18, + 0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e, + 0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e, + 0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e, + 0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e, + 0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2, + 0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4, + 0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04, + // Entry 380 - 3BF + 0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24, + 0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a, + 0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a, + 0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa, + 0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda, + 0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a, + 0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a, + 0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a, + // Entry 3C0 - 3FF + 0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a, + 0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca, + 0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa, + 0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a, + 0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a, + 0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190, + 0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee, + 0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, + // Entry 400 - 43F + 0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, + 0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215, + 0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227, + 0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237, + 0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247, + 0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257, + 0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f, + 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279, + // Entry 440 - 47F + 0x127b, 0x127d, 0x127f, 0x1287, 0x128f, 0x129b, 0x12a7, 0x12b3, + 0x12bf, 0x12cb, 0x12d3, 0x12db, 0x12e7, 0x12f3, 0x12ff, 0x130b, + 0x130d, 0x130f, 0x1311, 0x1313, 0x1315, 0x1317, 0x1319, 0x131b, + 0x131d, 0x131f, 0x1321, 0x1323, 0x1325, 0x1327, 0x1329, 0x132b, + 0x132e, 0x1331, 0x1333, 0x1335, 0x1337, 0x1339, 0x133b, 0x133d, + 0x133f, 0x1341, 0x1343, 0x1345, 0x1347, 0x1349, 0x134b, 0x134d, + 0x1350, 0x1353, 0x1356, 0x1359, 0x135c, 0x135f, 0x1362, 0x1365, + 0x1368, 0x136b, 0x136e, 0x1371, 0x1374, 0x1377, 0x137a, 0x137d, + // Entry 480 - 4BF + 0x1380, 0x1383, 0x1386, 0x1389, 0x138c, 0x138f, 0x1392, 0x1395, + 0x1398, 0x139b, 0x13a2, 0x13a4, 0x13a6, 0x13a8, 0x13ab, 0x13ad, + 0x13af, 0x13b1, 0x13b3, 0x13b5, 0x13bb, 0x13c1, 0x13c4, 0x13c7, + 0x13ca, 0x13cd, 0x13d0, 0x13d3, 0x13d6, 0x13d9, 0x13dc, 0x13df, + 0x13e2, 0x13e5, 0x13e8, 0x13eb, 0x13ee, 0x13f1, 0x13f4, 0x13f7, + 0x13fa, 0x13fd, 0x1400, 0x1403, 0x1406, 0x1409, 0x140c, 0x140f, + 0x1412, 0x1415, 0x1418, 0x141b, 0x141e, 0x1421, 0x1424, 0x1427, + 0x142a, 0x142d, 0x1430, 0x1433, 0x1436, 0x1439, 0x143c, 0x143f, + // Entry 4C0 - 4FF + 0x1442, 0x1445, 0x1448, 0x1451, 0x145a, 0x1463, 0x146c, 0x1475, + 0x147e, 0x1487, 0x1490, 0x1499, 0x149c, 0x149f, 0x14a2, 0x14a5, + 0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7, 0x14ba, 0x14bd, + 0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf, 0x14d2, 0x14d5, + 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7, 0x14ea, 0x14ed, + 0x14f0, 0x14f3, 0x14f6, 0x14f9, 0x14fc, 0x14ff, 0x1502, 0x1505, + 0x1508, 0x150b, 0x150e, 0x1511, 0x1514, 0x1517, 0x151a, 0x151d, + 0x1520, 0x1523, 0x1526, 0x1529, 0x152c, 0x152f, 0x1532, 0x1535, + // Entry 500 - 53F + 0x1538, 0x153b, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d, + 0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565, + 0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d, + 0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595, + 0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad, + 0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5, + 0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd, + 0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5, + // Entry 540 - 57F + 0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d, + 0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625, + 0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d, + 0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655, + 0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d, + 0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685, + 0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d, + 0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5, + // Entry 580 - 5BF + 0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd, + 0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5, + 0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd, + 0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715, + 0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d, + 0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745, + 0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d, + 0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775, + // Entry 5C0 - 5FF + 0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d, + 0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5, + 0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd, + 0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5, + 0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed, + 0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805, + 0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d, + 0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835, + // Entry 600 - 63F + 0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d, + 0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865, + 0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d, + 0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895, + 0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad, + 0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5, + 0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd, + 0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5, + // Entry 640 - 67F + 0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d, + 0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925, + 0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, + 0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955, + 0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d, + 0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985, + 0x1988, 0x198b, +} // Size: 3324 bytes var xorData string = "" + // Size: 4862 bytes "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + @@ -547,7 +690,7 @@ func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { return 0 } -// idnaTrie. Total size: 30288 bytes (29.58 KiB). Checksum: c0cd84404a2f6f19. +// idnaTrie. Total size: 30196 bytes (29.49 KiB). Checksum: e2ae95a945f04016. type idnaTrie struct{} func newIdnaTrie(i int) *idnaTrie { @@ -600,11 +743,11 @@ var idnaValues = [8192]uint16{ 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, - 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018, - 0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a, - 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005, - 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018, - 0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x0012, 0xe9: 0x0018, + 0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018, + 0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 0xff: 0x0018, // Block 0x4, offset 0x100 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, @@ -614,12 +757,12 @@ var idnaValues = [8192]uint16{ 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, - 0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x130: 0x0071, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, - 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0079, // Block 0x5, offset 0x140 - 0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, - 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 0x14a: 0xe00d, 0x14b: 0x0008, 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, @@ -628,7 +771,7 @@ var idnaValues = [8192]uint16{ 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, - 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x0089, // Block 0x6, offset 0x180 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, @@ -642,8 +785,8 @@ var idnaValues = [8192]uint16{ 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, // Block 0x7, offset 0x1c0 - 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9, - 0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x0091, 0x1c5: 0x0091, + 0x1c6: 0x0091, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, @@ -663,22 +806,22 @@ var idnaValues = [8192]uint16{ 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, - 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d, - 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0099, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 0x23f: 0x0008, // Block 0x9, offset 0x240 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, - 0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a, - 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369, + 0x258: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109, 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, // Block 0xa, offset 0x280 - 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d, + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d, 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, @@ -687,10 +830,10 @@ var idnaValues = [8192]uint16{ 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, - 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008, - 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d, // Block 0xb, offset 0x2c0 - 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2, + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a, 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, @@ -782,8 +925,8 @@ var idnaValues = [8192]uint16{ 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, - 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429, - 0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139, + 0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, // Block 0x13, offset 0x4c0 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, @@ -826,8 +969,8 @@ var idnaValues = [8192]uint16{ 0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008, 0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308, 0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308, - 0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1, - 0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, + 0x598: 0x0159, 0x599: 0x0161, 0x59a: 0x0169, 0x59b: 0x0171, 0x59c: 0x0179, 0x59d: 0x0181, + 0x59e: 0x0189, 0x59f: 0x0191, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308, 0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008, 0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008, 0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, @@ -850,8 +993,8 @@ var idnaValues = [8192]uint16{ 0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008, 0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040, 0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008, - 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1, - 0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, + 0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0199, 0x61d: 0x01a1, + 0x61e: 0x0040, 0x61f: 0x01a9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308, 0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, 0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018, @@ -866,16 +1009,16 @@ var idnaValues = [8192]uint16{ 0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008, 0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040, 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, - 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008, - 0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, + 0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x01b1, 0x674: 0x0040, 0x675: 0x0008, + 0x676: 0x01b9, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040, 0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008, // Block 0x1a, offset 0x680 0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040, 0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308, 0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308, 0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040, - 0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040, - 0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, + 0x698: 0x0040, 0x699: 0x01c1, 0x69a: 0x01c9, 0x69b: 0x01d1, 0x69c: 0x0008, 0x69d: 0x0040, + 0x69e: 0x01d9, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040, 0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008, 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, 0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308, @@ -922,7 +1065,7 @@ var idnaValues = [8192]uint16{ 0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008, 0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040, 0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x3308, 0x796: 0x3308, 0x797: 0x3008, - 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9, + 0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x01e1, 0x79d: 0x01e9, 0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308, 0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008, 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, @@ -998,32 +1141,32 @@ var idnaValues = [8192]uint16{ 0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008, 0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008, 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, - 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308, + 0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x01f9, 0x934: 0x3308, 0x935: 0x3308, 0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x3b08, 0x93b: 0x3308, 0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040, // Block 0x25, offset 0x940 - 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008, + 0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0211, 0x944: 0x0008, 0x945: 0x0008, 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008, - 0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, - 0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79, - 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008, + 0x94c: 0x0008, 0x94d: 0x0219, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0221, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0229, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0231, 0x95d: 0x0008, 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, - 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9, + 0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0239, 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040, - 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59, - 0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308, + 0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0241, 0x974: 0x3308, 0x975: 0x0249, + 0x976: 0x0251, 0x977: 0x0259, 0x978: 0x0261, 0x979: 0x0269, 0x97a: 0x3308, 0x97b: 0x3308, 0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008, // Block 0x26, offset 0x980 - 0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, + 0x980: 0x3308, 0x981: 0x0271, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018, 0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, 0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308, - 0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, - 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11, - 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308, - 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308, - 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, + 0x992: 0x3308, 0x993: 0x0279, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308, + 0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0281, + 0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0289, 0x9a3: 0x3308, + 0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0291, 0x9a8: 0x3308, 0x9a9: 0x3308, + 0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0299, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308, 0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308, - 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x02a1, 0x9ba: 0x3308, 0x9bb: 0x3308, 0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018, // Block 0x27, offset 0x9c0 0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008, @@ -1033,34 +1176,34 @@ var idnaValues = [8192]uint16{ 0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008, 0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008, 0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008, - 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008, - 0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41, - 0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008, - 0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269, + 0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0019, 0x9ed: 0x02e1, 0x9ee: 0x02e9, 0x9ef: 0x0008, + 0x9f0: 0x02f1, 0x9f1: 0x02f9, 0x9f2: 0x0301, 0x9f3: 0x0309, 0x9f4: 0x00a9, 0x9f5: 0x0311, + 0x9f6: 0x00b1, 0x9f7: 0x0319, 0x9f8: 0x0101, 0x9f9: 0x0321, 0x9fa: 0x0329, 0x9fb: 0x0008, + 0x9fc: 0x0051, 0x9fd: 0x0331, 0x9fe: 0x0339, 0x9ff: 0x00b9, // Block 0x28, offset 0xa00 - 0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1, - 0xa06: 0x05b5, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011, - 0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041, - 0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0f99, 0xa17: 0x0fa9, - 0xa18: 0x0fb9, 0xa19: 0x05b5, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05e5, 0xa1d: 0x1099, - 0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269, - 0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1, - 0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, + 0xa00: 0x0341, 0xa01: 0x0349, 0xa02: 0x00c1, 0xa03: 0x0019, 0xa04: 0x0351, 0xa05: 0x0359, + 0xa06: 0x05b5, 0xa07: 0x02e9, 0xa08: 0x02f1, 0xa09: 0x02f9, 0xa0a: 0x0361, 0xa0b: 0x0369, + 0xa0c: 0x0371, 0xa0d: 0x0309, 0xa0e: 0x0008, 0xa0f: 0x0319, 0xa10: 0x0321, 0xa11: 0x0379, + 0xa12: 0x0051, 0xa13: 0x0381, 0xa14: 0x05cd, 0xa15: 0x05cd, 0xa16: 0x0339, 0xa17: 0x0341, + 0xa18: 0x0349, 0xa19: 0x05b5, 0xa1a: 0x0389, 0xa1b: 0x0391, 0xa1c: 0x05e5, 0xa1d: 0x0399, + 0xa1e: 0x03a1, 0xa1f: 0x03a9, 0xa20: 0x03b1, 0xa21: 0x03b9, 0xa22: 0x0311, 0xa23: 0x00b9, + 0xa24: 0x0349, 0xa25: 0x0391, 0xa26: 0x0399, 0xa27: 0x03a1, 0xa28: 0x03c1, 0xa29: 0x03b1, + 0xa2a: 0x03b9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008, 0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008, - 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, + 0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x03c9, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008, 0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008, // Block 0x29, offset 0xa40 0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008, 0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008, 0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008, 0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008, - 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169, - 0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9, - 0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05fd, 0xa68: 0x1239, 0xa69: 0x1251, - 0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9, - 0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359, - 0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x0615, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1, - 0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429, + 0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x03d1, 0xa5c: 0x03d9, 0xa5d: 0x03e1, + 0xa5e: 0x03e9, 0xa5f: 0x0371, 0xa60: 0x03f1, 0xa61: 0x03f9, 0xa62: 0x0401, 0xa63: 0x0409, + 0xa64: 0x0411, 0xa65: 0x0419, 0xa66: 0x0421, 0xa67: 0x05fd, 0xa68: 0x0429, 0xa69: 0x0431, + 0xa6a: 0xe17d, 0xa6b: 0x0439, 0xa6c: 0x0441, 0xa6d: 0x0449, 0xa6e: 0x0451, 0xa6f: 0x0459, + 0xa70: 0x0461, 0xa71: 0x0469, 0xa72: 0x0471, 0xa73: 0x0479, 0xa74: 0x0481, 0xa75: 0x0489, + 0xa76: 0x0491, 0xa77: 0x0499, 0xa78: 0x0615, 0xa79: 0x04a1, 0xa7a: 0x04a9, 0xa7b: 0x04b1, + 0xa7c: 0x04b9, 0xa7d: 0x04c1, 0xa7e: 0x04c9, 0xa7f: 0x04d1, // Block 0x2a, offset 0xa80 0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008, 0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008, @@ -1079,7 +1222,7 @@ var idnaValues = [8192]uint16{ 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008, 0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x062d, 0xadb: 0x064d, 0xadc: 0x0008, 0xadd: 0x0008, - 0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xade: 0x04d9, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, @@ -1094,33 +1237,33 @@ var idnaValues = [8192]uint16{ 0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008, 0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045, 0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045, - 0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489, - 0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1, - 0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040, + 0xb30: 0x0008, 0xb31: 0x04e1, 0xb32: 0x0008, 0xb33: 0x04e9, 0xb34: 0x0008, 0xb35: 0x04f1, + 0xb36: 0x0008, 0xb37: 0x04f9, 0xb38: 0x0008, 0xb39: 0x0501, 0xb3a: 0x0008, 0xb3b: 0x0509, + 0xb3c: 0x0008, 0xb3d: 0x0511, 0xb3e: 0x0040, 0xb3f: 0x0040, // Block 0x2d, offset 0xb40 - 0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1, - 0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591, - 0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1, - 0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1, - 0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771, - 0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891, - 0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831, - 0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951, - 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040, - 0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x1459, - 0xb7c: 0x19b1, 0xb7d: 0x067e, 0xb7e: 0x1a31, 0xb7f: 0x069e, + 0xb40: 0x0519, 0xb41: 0x0521, 0xb42: 0x0529, 0xb43: 0x0531, 0xb44: 0x0539, 0xb45: 0x0541, + 0xb46: 0x0549, 0xb47: 0x0551, 0xb48: 0x0519, 0xb49: 0x0521, 0xb4a: 0x0529, 0xb4b: 0x0531, + 0xb4c: 0x0539, 0xb4d: 0x0541, 0xb4e: 0x0549, 0xb4f: 0x0551, 0xb50: 0x0559, 0xb51: 0x0561, + 0xb52: 0x0569, 0xb53: 0x0571, 0xb54: 0x0579, 0xb55: 0x0581, 0xb56: 0x0589, 0xb57: 0x0591, + 0xb58: 0x0559, 0xb59: 0x0561, 0xb5a: 0x0569, 0xb5b: 0x0571, 0xb5c: 0x0579, 0xb5d: 0x0581, + 0xb5e: 0x0589, 0xb5f: 0x0591, 0xb60: 0x0599, 0xb61: 0x05a1, 0xb62: 0x05a9, 0xb63: 0x05b1, + 0xb64: 0x05b9, 0xb65: 0x05c1, 0xb66: 0x05c9, 0xb67: 0x05d1, 0xb68: 0x0599, 0xb69: 0x05a1, + 0xb6a: 0x05a9, 0xb6b: 0x05b1, 0xb6c: 0x05b9, 0xb6d: 0x05c1, 0xb6e: 0x05c9, 0xb6f: 0x05d1, + 0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x05d9, 0xb73: 0x05e1, 0xb74: 0x05e9, 0xb75: 0x0040, + 0xb76: 0x0008, 0xb77: 0x05f1, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x0665, 0xb7b: 0x04e1, + 0xb7c: 0x05e1, 0xb7d: 0x067e, 0xb7e: 0x05f9, 0xb7f: 0x069e, // Block 0x2e, offset 0xb80 - 0xb80: 0x06be, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040, - 0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06dd, 0xb89: 0x1471, 0xb8a: 0x06f5, 0xb8b: 0x1489, - 0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008, - 0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, - 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2, - 0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61, + 0xb80: 0x06be, 0xb81: 0x0602, 0xb82: 0x0609, 0xb83: 0x0611, 0xb84: 0x0619, 0xb85: 0x0040, + 0xb86: 0x0008, 0xb87: 0x0621, 0xb88: 0x06dd, 0xb89: 0x04e9, 0xb8a: 0x06f5, 0xb8b: 0x04f1, + 0xb8c: 0x0611, 0xb8d: 0x062a, 0xb8e: 0x0632, 0xb8f: 0x063a, 0xb90: 0x0008, 0xb91: 0x0008, + 0xb92: 0x0008, 0xb93: 0x0641, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008, + 0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x070d, 0xb9b: 0x04f9, 0xb9c: 0x0040, 0xb9d: 0x064a, + 0xb9e: 0x0652, 0xb9f: 0x065a, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x0661, 0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045, - 0xbaa: 0x0725, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa, - 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040, - 0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x073d, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9, - 0xbbc: 0x1ce9, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040, + 0xbaa: 0x0725, 0xbab: 0x0509, 0xbac: 0xe04d, 0xbad: 0x066a, 0xbae: 0x012a, 0xbaf: 0x0672, + 0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x0679, 0xbb3: 0x0681, 0xbb4: 0x0689, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x0691, 0xbb8: 0x073d, 0xbb9: 0x0501, 0xbba: 0x0515, 0xbbb: 0x0511, + 0xbbc: 0x0681, 0xbbd: 0x0756, 0xbbe: 0x0776, 0xbbf: 0x0040, // Block 0x2f, offset 0xbc0 0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a, 0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0, @@ -1130,72 +1273,72 @@ var idnaValues = [8192]uint16{ 0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018, 0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040, 0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a, - 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018, - 0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, - 0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018, + 0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x0699, 0xbf4: 0x06a1, 0xbf5: 0x0018, + 0xbf6: 0x06a9, 0xbf7: 0x06b1, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018, + 0xbfc: 0x06ba, 0xbfd: 0x0018, 0xbfe: 0x07b6, 0xbff: 0x0018, // Block 0x30, offset 0xc00 0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018, - 0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018, + 0xc06: 0x0018, 0xc07: 0x06c2, 0xc08: 0x06ca, 0xc09: 0x06d2, 0xc0a: 0x0018, 0xc0b: 0x0018, 0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018, - 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x06d9, 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, 0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340, 0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040, 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340, - 0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61, - 0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07d5, - 0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71, + 0xc30: 0x06e1, 0xc31: 0x0311, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x06e9, 0xc35: 0x06f1, + 0xc36: 0x06f9, 0xc37: 0x0701, 0xc38: 0x0709, 0xc39: 0x0711, 0xc3a: 0x071a, 0xc3b: 0x07d5, + 0xc3c: 0x0722, 0xc3d: 0x072a, 0xc3e: 0x0732, 0xc3f: 0x0329, // Block 0x31, offset 0xc40 - 0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61, - 0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07ed, - 0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09, - 0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359, - 0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040, + 0xc40: 0x06e1, 0xc41: 0x0049, 0xc42: 0x0029, 0xc43: 0x0031, 0xc44: 0x06e9, 0xc45: 0x06f1, + 0xc46: 0x06f9, 0xc47: 0x0701, 0xc48: 0x0709, 0xc49: 0x0711, 0xc4a: 0x071a, 0xc4b: 0x07ed, + 0xc4c: 0x0722, 0xc4d: 0x072a, 0xc4e: 0x0732, 0xc4f: 0x0040, 0xc50: 0x0019, 0xc51: 0x02f9, + 0xc52: 0x0051, 0xc53: 0x0109, 0xc54: 0x0361, 0xc55: 0x00a9, 0xc56: 0x0319, 0xc57: 0x0101, + 0xc58: 0x0321, 0xc59: 0x0329, 0xc5a: 0x0339, 0xc5b: 0x0089, 0xc5c: 0x0341, 0xc5d: 0x0040, 0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018, - 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018, + 0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x0739, 0xc69: 0x0018, 0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018, 0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018, 0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018, 0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018, // Block 0x32, offset 0xc80 - 0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x1159, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866, - 0xc86: 0x0886, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0f31, 0xc8b: 0x0249, - 0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41, - 0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018, - 0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269, - 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08c5, 0xca2: 0x2061, 0xca3: 0x0018, - 0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018, - 0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09, - 0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9, - 0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08e5, - 0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109, + 0xc80: 0x0806, 0xc81: 0x0826, 0xc82: 0x03d9, 0xc83: 0x0845, 0xc84: 0x0018, 0xc85: 0x0866, + 0xc86: 0x0886, 0xc87: 0x0369, 0xc88: 0x0018, 0xc89: 0x08a5, 0xc8a: 0x0309, 0xc8b: 0x00a9, + 0xc8c: 0x00a9, 0xc8d: 0x00a9, 0xc8e: 0x00a9, 0xc8f: 0x0741, 0xc90: 0x0311, 0xc91: 0x0311, + 0xc92: 0x0101, 0xc93: 0x0101, 0xc94: 0x0018, 0xc95: 0x0329, 0xc96: 0x0749, 0xc97: 0x0018, + 0xc98: 0x0018, 0xc99: 0x0339, 0xc9a: 0x0751, 0xc9b: 0x00b9, 0xc9c: 0x00b9, 0xc9d: 0x00b9, + 0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x0759, 0xca1: 0x08c5, 0xca2: 0x0761, 0xca3: 0x0018, + 0xca4: 0x04b1, 0xca5: 0x0018, 0xca6: 0x0769, 0xca7: 0x0018, 0xca8: 0x04b1, 0xca9: 0x0018, + 0xcaa: 0x0319, 0xcab: 0x0771, 0xcac: 0x02e9, 0xcad: 0x03d9, 0xcae: 0x0018, 0xcaf: 0x02f9, + 0xcb0: 0x02f9, 0xcb1: 0x03f1, 0xcb2: 0x0040, 0xcb3: 0x0321, 0xcb4: 0x0051, 0xcb5: 0x0779, + 0xcb6: 0x0781, 0xcb7: 0x0789, 0xcb8: 0x0791, 0xcb9: 0x0311, 0xcba: 0x0018, 0xcbb: 0x08e5, + 0xcbc: 0x0799, 0xcbd: 0x03a1, 0xcbe: 0x03a1, 0xcbf: 0x0799, // Block 0x33, offset 0xcc0 - 0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9, - 0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018, - 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151, - 0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279, - 0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399, - 0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x091d, 0xce3: 0x2439, - 0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x093d, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369, - 0xcea: 0x24a9, 0xceb: 0x095d, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61, - 0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x097d, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451, - 0xcf6: 0x099d, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09bd, - 0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61, + 0xcc0: 0x0905, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x02f1, + 0xcc6: 0x02f1, 0xcc7: 0x02f9, 0xcc8: 0x0311, 0xcc9: 0x00b1, 0xcca: 0x0018, 0xccb: 0x0018, + 0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x07a1, 0xcd1: 0x07a9, + 0xcd2: 0x07b1, 0xcd3: 0x07b9, 0xcd4: 0x07c1, 0xcd5: 0x07c9, 0xcd6: 0x07d1, 0xcd7: 0x07d9, + 0xcd8: 0x07e1, 0xcd9: 0x07e9, 0xcda: 0x07f1, 0xcdb: 0x07f9, 0xcdc: 0x0801, 0xcdd: 0x0809, + 0xcde: 0x0811, 0xcdf: 0x0819, 0xce0: 0x0311, 0xce1: 0x0821, 0xce2: 0x091d, 0xce3: 0x0829, + 0xce4: 0x0391, 0xce5: 0x0831, 0xce6: 0x093d, 0xce7: 0x0839, 0xce8: 0x0841, 0xce9: 0x0109, + 0xcea: 0x0849, 0xceb: 0x095d, 0xcec: 0x0101, 0xced: 0x03d9, 0xcee: 0x02f1, 0xcef: 0x0321, + 0xcf0: 0x0311, 0xcf1: 0x0821, 0xcf2: 0x097d, 0xcf3: 0x0829, 0xcf4: 0x0391, 0xcf5: 0x0831, + 0xcf6: 0x099d, 0xcf7: 0x0839, 0xcf8: 0x0841, 0xcf9: 0x0109, 0xcfa: 0x0849, 0xcfb: 0x09bd, + 0xcfc: 0x0101, 0xcfd: 0x03d9, 0xcfe: 0x02f1, 0xcff: 0x0321, // Block 0x34, offset 0xd00 0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018, 0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040, 0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040, 0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040, 0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040, - 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51, - 0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601, - 0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691, - 0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a1e, 0xd35: 0x0a3e, + 0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x0049, 0xd21: 0x0029, 0xd22: 0x0031, 0xd23: 0x06e9, + 0xd24: 0x06f1, 0xd25: 0x06f9, 0xd26: 0x0701, 0xd27: 0x0709, 0xd28: 0x0711, 0xd29: 0x0879, + 0xd2a: 0x0881, 0xd2b: 0x0889, 0xd2c: 0x0891, 0xd2d: 0x0899, 0xd2e: 0x08a1, 0xd2f: 0x08a9, + 0xd30: 0x08b1, 0xd31: 0x08b9, 0xd32: 0x08c1, 0xd33: 0x08c9, 0xd34: 0x0a1e, 0xd35: 0x0a3e, 0xd36: 0x0a5e, 0xd37: 0x0a7e, 0xd38: 0x0a9e, 0xd39: 0x0abe, 0xd3a: 0x0ade, 0xd3b: 0x0afe, - 0xd3c: 0x0b1e, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a, + 0xd3c: 0x0b1e, 0xd3d: 0x08d2, 0xd3e: 0x08da, 0xd3f: 0x08e2, // Block 0x35, offset 0xd40 - 0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a, - 0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, + 0xd40: 0x08ea, 0xd41: 0x08f2, 0xd42: 0x08fa, 0xd43: 0x0902, 0xd44: 0x090a, 0xd45: 0x0912, + 0xd46: 0x091a, 0xd47: 0x0922, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040, 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b3e, 0xd5d: 0x0b5e, @@ -1203,17 +1346,17 @@ var idnaValues = [8192]uint16{ 0xd64: 0x0c3e, 0xd65: 0x0c5e, 0xd66: 0x0c7e, 0xd67: 0x0c9e, 0xd68: 0x0cbe, 0xd69: 0x0cde, 0xd6a: 0x0cfe, 0xd6b: 0x0d1e, 0xd6c: 0x0d3e, 0xd6d: 0x0d5e, 0xd6e: 0x0d7e, 0xd6f: 0x0d9e, 0xd70: 0x0dbe, 0xd71: 0x0dde, 0xd72: 0x0dfe, 0xd73: 0x0e1e, 0xd74: 0x0e3e, 0xd75: 0x0e5e, - 0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199, - 0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259, + 0xd76: 0x0019, 0xd77: 0x02e9, 0xd78: 0x03d9, 0xd79: 0x02f1, 0xd7a: 0x02f9, 0xd7b: 0x03f1, + 0xd7c: 0x0309, 0xd7d: 0x00a9, 0xd7e: 0x0311, 0xd7f: 0x00b1, // Block 0x36, offset 0xd80 - 0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99, - 0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089, - 0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9, - 0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249, - 0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71, - 0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9, - 0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1, - 0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, + 0xd80: 0x0319, 0xd81: 0x0101, 0xd82: 0x0321, 0xd83: 0x0329, 0xd84: 0x0051, 0xd85: 0x0339, + 0xd86: 0x0751, 0xd87: 0x00b9, 0xd88: 0x0089, 0xd89: 0x0341, 0xd8a: 0x0349, 0xd8b: 0x0391, + 0xd8c: 0x00c1, 0xd8d: 0x0109, 0xd8e: 0x00c9, 0xd8f: 0x04b1, 0xd90: 0x0019, 0xd91: 0x02e9, + 0xd92: 0x03d9, 0xd93: 0x02f1, 0xd94: 0x02f9, 0xd95: 0x03f1, 0xd96: 0x0309, 0xd97: 0x00a9, + 0xd98: 0x0311, 0xd99: 0x00b1, 0xd9a: 0x0319, 0xd9b: 0x0101, 0xd9c: 0x0321, 0xd9d: 0x0329, + 0xd9e: 0x0051, 0xd9f: 0x0339, 0xda0: 0x0751, 0xda1: 0x00b9, 0xda2: 0x0089, 0xda3: 0x0341, + 0xda4: 0x0349, 0xda5: 0x0391, 0xda6: 0x00c1, 0xda7: 0x0109, 0xda8: 0x00c9, 0xda9: 0x04b1, + 0xdaa: 0x06e1, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018, 0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018, 0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018, 0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018, @@ -1223,12 +1366,12 @@ var idnaValues = [8192]uint16{ 0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008, 0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008, 0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008, - 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ed5, - 0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, - 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9, - 0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, + 0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x0941, 0xde3: 0x0ed5, + 0xde4: 0x0949, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d, + 0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0359, 0xdee: 0x0441, 0xdef: 0x0351, + 0xdf0: 0x03d1, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d, 0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008, - 0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9, + 0xdfc: 0x00b1, 0xdfd: 0x0391, 0xdfe: 0x0951, 0xdff: 0x0959, // Block 0x38, offset 0xe00 0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008, 0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008, @@ -1254,7 +1397,7 @@ var idnaValues = [8192]uint16{ 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040, 0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040, // Block 0x3a, offset 0xe80 - 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, + 0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x0961, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008, 0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018, 0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018, 0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018, @@ -1290,17 +1433,17 @@ var idnaValues = [8192]uint16{ 0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0008, 0xf3c: 0x0008, 0xf3d: 0x0008, 0xf3e: 0x0008, 0xf3f: 0x0008, // Block 0x3d, offset 0xf40 - 0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32d5, 0xf45: 0x32f5, + 0xf40: 0x0b82, 0xf41: 0x0b8a, 0xf42: 0x0b92, 0xf43: 0x0b9a, 0xf44: 0x32d5, 0xf45: 0x32f5, 0xf46: 0x3315, 0xf47: 0x3335, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018, - 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x3761, - 0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1, - 0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881, - 0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5, + 0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x3355, 0xf51: 0x0ba1, + 0xf52: 0x0ba9, 0xf53: 0x0bb1, 0xf54: 0x0bb9, 0xf55: 0x0bc1, 0xf56: 0x0bc9, 0xf57: 0x0bd1, + 0xf58: 0x0bd9, 0xf59: 0x0be1, 0xf5a: 0x0be9, 0xf5b: 0x0bf1, 0xf5c: 0x0bf9, 0xf5d: 0x0c01, + 0xf5e: 0x0c09, 0xf5f: 0x0c11, 0xf60: 0x3375, 0xf61: 0x3395, 0xf62: 0x33b5, 0xf63: 0x33d5, 0xf64: 0x33f5, 0xf65: 0x33f5, 0xf66: 0x3415, 0xf67: 0x3435, 0xf68: 0x3455, 0xf69: 0x3475, 0xf6a: 0x3495, 0xf6b: 0x34b5, 0xf6c: 0x34d5, 0xf6d: 0x34f5, 0xf6e: 0x3515, 0xf6f: 0x3535, 0xf70: 0x3555, 0xf71: 0x3575, 0xf72: 0x3595, 0xf73: 0x35b5, 0xf74: 0x35d5, 0xf75: 0x35f5, 0xf76: 0x3615, 0xf77: 0x3635, 0xf78: 0x3655, 0xf79: 0x3675, 0xf7a: 0x3695, 0xf7b: 0x36b5, - 0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36d5, 0xf7f: 0x0018, + 0xf7c: 0x0c19, 0xf7d: 0x0c21, 0xf7e: 0x36d5, 0xf7f: 0x0018, // Block 0x3e, offset 0xf80 0xf80: 0x36f5, 0xf81: 0x3715, 0xf82: 0x3735, 0xf83: 0x3755, 0xf84: 0x3775, 0xf85: 0x3795, 0xf86: 0x37b5, 0xf87: 0x37d5, 0xf88: 0x37f5, 0xf89: 0x3815, 0xf8a: 0x3835, 0xf8b: 0x3855, @@ -1310,13 +1453,13 @@ var idnaValues = [8192]uint16{ 0xf9e: 0x3ab5, 0xf9f: 0x3ad5, 0xfa0: 0x3af5, 0xfa1: 0x3b15, 0xfa2: 0x3b35, 0xfa3: 0x3b55, 0xfa4: 0x3b75, 0xfa5: 0x3b95, 0xfa6: 0x1295, 0xfa7: 0x3bb5, 0xfa8: 0x3bd5, 0xfa9: 0x3bf5, 0xfaa: 0x3c15, 0xfab: 0x3c35, 0xfac: 0x3c55, 0xfad: 0x3c75, 0xfae: 0x23b5, 0xfaf: 0x3c95, - 0xfb0: 0x3cb5, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999, - 0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29, - 0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89, + 0xfb0: 0x3cb5, 0xfb1: 0x0c29, 0xfb2: 0x0c31, 0xfb3: 0x0c39, 0xfb4: 0x0c41, 0xfb5: 0x0c49, + 0xfb6: 0x0c51, 0xfb7: 0x0c59, 0xfb8: 0x0c61, 0xfb9: 0x0c69, 0xfba: 0x0c71, 0xfbb: 0x0c79, + 0xfbc: 0x0c81, 0xfbd: 0x0c89, 0xfbe: 0x0c91, 0xfbf: 0x0c99, // Block 0x3f, offset 0xfc0 - 0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69, - 0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69, - 0xfcc: 0x3c99, 0xfcd: 0x3cd5, 0xfce: 0x3cb1, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d, + 0xfc0: 0x0ca1, 0xfc1: 0x0ca9, 0xfc2: 0x0cb1, 0xfc3: 0x0cb9, 0xfc4: 0x0cc1, 0xfc5: 0x0cc9, + 0xfc6: 0x0cd1, 0xfc7: 0x0cd9, 0xfc8: 0x0ce1, 0xfc9: 0x0ce9, 0xfca: 0x0cf1, 0xfcb: 0x0cf9, + 0xfcc: 0x0d01, 0xfcd: 0x3cd5, 0xfce: 0x0d09, 0xfcf: 0x3cf5, 0xfd0: 0x3d15, 0xfd1: 0x3d2d, 0xfd2: 0x3d45, 0xfd3: 0x3d5d, 0xfd4: 0x3d75, 0xfd5: 0x3d75, 0xfd6: 0x3d5d, 0xfd7: 0x3d8d, 0xfd8: 0x07d5, 0xfd9: 0x3da5, 0xfda: 0x3dbd, 0xfdb: 0x3dd5, 0xfdc: 0x3ded, 0xfdd: 0x3e05, 0xfde: 0x3e1d, 0xfdf: 0x3e35, 0xfe0: 0x3e4d, 0xfe1: 0x3e65, 0xfe2: 0x3e7d, 0xfe3: 0x3e95, @@ -1324,769 +1467,769 @@ var idnaValues = [8192]uint16{ 0xfea: 0x3ef5, 0xfeb: 0x3f0d, 0xfec: 0x3f25, 0xfed: 0x3f3d, 0xfee: 0x3f55, 0xfef: 0x3f55, 0xff0: 0x3f6d, 0xff1: 0x3f6d, 0xff2: 0x3f6d, 0xff3: 0x3f85, 0xff4: 0x3f9d, 0xff5: 0x3fb5, 0xff6: 0x3fcd, 0xff7: 0x3fb5, 0xff8: 0x3fe5, 0xff9: 0x3ffd, 0xffa: 0x3f85, 0xffb: 0x4015, - 0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x3cc9, + 0xffc: 0x402d, 0xffd: 0x402d, 0xffe: 0x402d, 0xfff: 0x0d11, // Block 0x40, offset 0x1000 - 0x1000: 0x3d01, 0x1001: 0x3d69, 0x1002: 0x3dd1, 0x1003: 0x3e39, 0x1004: 0x3e89, 0x1005: 0x3ef1, - 0x1006: 0x3f41, 0x1007: 0x3f91, 0x1008: 0x4011, 0x1009: 0x4079, 0x100a: 0x40c9, 0x100b: 0x4119, - 0x100c: 0x4169, 0x100d: 0x41d1, 0x100e: 0x4239, 0x100f: 0x4289, 0x1010: 0x42d9, 0x1011: 0x4311, - 0x1012: 0x4361, 0x1013: 0x43c9, 0x1014: 0x4431, 0x1015: 0x4469, 0x1016: 0x44e9, 0x1017: 0x4581, - 0x1018: 0x4601, 0x1019: 0x4651, 0x101a: 0x46d1, 0x101b: 0x4751, 0x101c: 0x47b9, 0x101d: 0x4809, - 0x101e: 0x4859, 0x101f: 0x48a9, 0x1020: 0x4911, 0x1021: 0x4991, 0x1022: 0x49f9, 0x1023: 0x4a49, - 0x1024: 0x4a99, 0x1025: 0x4ae9, 0x1026: 0x4b21, 0x1027: 0x4b59, 0x1028: 0x4b91, 0x1029: 0x4bc9, - 0x102a: 0x4c19, 0x102b: 0x4c69, 0x102c: 0x4ce9, 0x102d: 0x4d39, 0x102e: 0x4da1, 0x102f: 0x4e21, - 0x1030: 0x4e71, 0x1031: 0x4ea9, 0x1032: 0x4ee1, 0x1033: 0x4f61, 0x1034: 0x4fc9, 0x1035: 0x5049, - 0x1036: 0x5099, 0x1037: 0x5119, 0x1038: 0x5151, 0x1039: 0x51a1, 0x103a: 0x51f1, 0x103b: 0x5241, - 0x103c: 0x5291, 0x103d: 0x52e1, 0x103e: 0x5349, 0x103f: 0x5399, + 0x1000: 0x10f9, 0x1001: 0x1101, 0x1002: 0x40a5, 0x1003: 0x1109, 0x1004: 0x1111, 0x1005: 0x1119, + 0x1006: 0x1121, 0x1007: 0x1129, 0x1008: 0x40c5, 0x1009: 0x1131, 0x100a: 0x1139, 0x100b: 0x1141, + 0x100c: 0x40e5, 0x100d: 0x40e5, 0x100e: 0x1149, 0x100f: 0x1151, 0x1010: 0x1159, 0x1011: 0x4105, + 0x1012: 0x4125, 0x1013: 0x4145, 0x1014: 0x4165, 0x1015: 0x4185, 0x1016: 0x1161, 0x1017: 0x1169, + 0x1018: 0x1171, 0x1019: 0x1179, 0x101a: 0x1181, 0x101b: 0x41a5, 0x101c: 0x1189, 0x101d: 0x1191, + 0x101e: 0x1199, 0x101f: 0x41c5, 0x1020: 0x41e5, 0x1021: 0x11a1, 0x1022: 0x4205, 0x1023: 0x4225, + 0x1024: 0x4245, 0x1025: 0x11a9, 0x1026: 0x4265, 0x1027: 0x11b1, 0x1028: 0x11b9, 0x1029: 0x10f9, + 0x102a: 0x4285, 0x102b: 0x42a5, 0x102c: 0x42c5, 0x102d: 0x42e5, 0x102e: 0x11c1, 0x102f: 0x11c9, + 0x1030: 0x11d1, 0x1031: 0x11d9, 0x1032: 0x4305, 0x1033: 0x11e1, 0x1034: 0x11e9, 0x1035: 0x11f1, + 0x1036: 0x4325, 0x1037: 0x11f9, 0x1038: 0x1201, 0x1039: 0x11f9, 0x103a: 0x1209, 0x103b: 0x1211, + 0x103c: 0x4345, 0x103d: 0x1219, 0x103e: 0x1221, 0x103f: 0x1219, // Block 0x41, offset 0x1040 - 0x1040: 0x53d1, 0x1041: 0x5421, 0x1042: 0x5471, 0x1043: 0x54c1, 0x1044: 0x5529, 0x1045: 0x5579, - 0x1046: 0x55c9, 0x1047: 0x5619, 0x1048: 0x5699, 0x1049: 0x5701, 0x104a: 0x5739, 0x104b: 0x57b9, - 0x104c: 0x57f1, 0x104d: 0x5859, 0x104e: 0x58c1, 0x104f: 0x5911, 0x1050: 0x5961, 0x1051: 0x59b1, - 0x1052: 0x5a19, 0x1053: 0x5a51, 0x1054: 0x5aa1, 0x1055: 0x5b09, 0x1056: 0x5b41, 0x1057: 0x5bc1, - 0x1058: 0x5c11, 0x1059: 0x5c39, 0x105a: 0x5c61, 0x105b: 0x5c89, 0x105c: 0x5cb1, 0x105d: 0x5cd9, - 0x105e: 0x5d01, 0x105f: 0x5d29, 0x1060: 0x5d51, 0x1061: 0x5d79, 0x1062: 0x5da1, 0x1063: 0x5dd1, - 0x1064: 0x5e01, 0x1065: 0x5e31, 0x1066: 0x5e61, 0x1067: 0x5e91, 0x1068: 0x5ec1, 0x1069: 0x5ef1, - 0x106a: 0x5f21, 0x106b: 0x5f51, 0x106c: 0x5f81, 0x106d: 0x5fb1, 0x106e: 0x5fe1, 0x106f: 0x6011, - 0x1070: 0x6041, 0x1071: 0x4045, 0x1072: 0x6071, 0x1073: 0x6089, 0x1074: 0x4065, 0x1075: 0x60a1, - 0x1076: 0x60b9, 0x1077: 0x60d1, 0x1078: 0x4085, 0x1079: 0x4085, 0x107a: 0x60e9, 0x107b: 0x6101, - 0x107c: 0x6139, 0x107d: 0x6171, 0x107e: 0x61a9, 0x107f: 0x61e1, + 0x1040: 0x4365, 0x1041: 0x4385, 0x1042: 0x0040, 0x1043: 0x1229, 0x1044: 0x1231, 0x1045: 0x1239, + 0x1046: 0x1241, 0x1047: 0x0040, 0x1048: 0x1249, 0x1049: 0x1251, 0x104a: 0x1259, 0x104b: 0x1261, + 0x104c: 0x1269, 0x104d: 0x1271, 0x104e: 0x1199, 0x104f: 0x1279, 0x1050: 0x1281, 0x1051: 0x1289, + 0x1052: 0x43a5, 0x1053: 0x1291, 0x1054: 0x1121, 0x1055: 0x43c5, 0x1056: 0x43e5, 0x1057: 0x1299, + 0x1058: 0x0040, 0x1059: 0x4405, 0x105a: 0x12a1, 0x105b: 0x12a9, 0x105c: 0x12b1, 0x105d: 0x12b9, + 0x105e: 0x12c1, 0x105f: 0x12c9, 0x1060: 0x12d1, 0x1061: 0x12d9, 0x1062: 0x12e1, 0x1063: 0x12e9, + 0x1064: 0x12f1, 0x1065: 0x12f9, 0x1066: 0x1301, 0x1067: 0x1309, 0x1068: 0x1311, 0x1069: 0x1319, + 0x106a: 0x1321, 0x106b: 0x1329, 0x106c: 0x1331, 0x106d: 0x1339, 0x106e: 0x1341, 0x106f: 0x1349, + 0x1070: 0x1351, 0x1071: 0x1359, 0x1072: 0x1361, 0x1073: 0x1369, 0x1074: 0x1371, 0x1075: 0x1379, + 0x1076: 0x1381, 0x1077: 0x1389, 0x1078: 0x1391, 0x1079: 0x1399, 0x107a: 0x13a1, 0x107b: 0x13a9, + 0x107c: 0x13b1, 0x107d: 0x13b9, 0x107e: 0x13c1, 0x107f: 0x4425, // Block 0x42, offset 0x1080 - 0x1080: 0x6249, 0x1081: 0x6261, 0x1082: 0x40a5, 0x1083: 0x6279, 0x1084: 0x6291, 0x1085: 0x62a9, - 0x1086: 0x62c1, 0x1087: 0x62d9, 0x1088: 0x40c5, 0x1089: 0x62f1, 0x108a: 0x6319, 0x108b: 0x6331, - 0x108c: 0x40e5, 0x108d: 0x40e5, 0x108e: 0x6349, 0x108f: 0x6361, 0x1090: 0x6379, 0x1091: 0x4105, - 0x1092: 0x4125, 0x1093: 0x4145, 0x1094: 0x4165, 0x1095: 0x4185, 0x1096: 0x6391, 0x1097: 0x63a9, - 0x1098: 0x63c1, 0x1099: 0x63d9, 0x109a: 0x63f1, 0x109b: 0x41a5, 0x109c: 0x6409, 0x109d: 0x6421, - 0x109e: 0x6439, 0x109f: 0x41c5, 0x10a0: 0x41e5, 0x10a1: 0x6451, 0x10a2: 0x4205, 0x10a3: 0x4225, - 0x10a4: 0x4245, 0x10a5: 0x6469, 0x10a6: 0x4265, 0x10a7: 0x6481, 0x10a8: 0x64b1, 0x10a9: 0x6249, - 0x10aa: 0x4285, 0x10ab: 0x42a5, 0x10ac: 0x42c5, 0x10ad: 0x42e5, 0x10ae: 0x64e9, 0x10af: 0x6529, - 0x10b0: 0x6571, 0x10b1: 0x6589, 0x10b2: 0x4305, 0x10b3: 0x65a1, 0x10b4: 0x65b9, 0x10b5: 0x65d1, - 0x10b6: 0x4325, 0x10b7: 0x65e9, 0x10b8: 0x6601, 0x10b9: 0x65e9, 0x10ba: 0x6619, 0x10bb: 0x6631, - 0x10bc: 0x4345, 0x10bd: 0x6649, 0x10be: 0x6661, 0x10bf: 0x6649, + 0x1080: 0xe00d, 0x1081: 0x0008, 0x1082: 0xe00d, 0x1083: 0x0008, 0x1084: 0xe00d, 0x1085: 0x0008, + 0x1086: 0xe00d, 0x1087: 0x0008, 0x1088: 0xe00d, 0x1089: 0x0008, 0x108a: 0xe00d, 0x108b: 0x0008, + 0x108c: 0xe00d, 0x108d: 0x0008, 0x108e: 0xe00d, 0x108f: 0x0008, 0x1090: 0xe00d, 0x1091: 0x0008, + 0x1092: 0xe00d, 0x1093: 0x0008, 0x1094: 0xe00d, 0x1095: 0x0008, 0x1096: 0xe00d, 0x1097: 0x0008, + 0x1098: 0xe00d, 0x1099: 0x0008, 0x109a: 0xe00d, 0x109b: 0x0008, 0x109c: 0xe00d, 0x109d: 0x0008, + 0x109e: 0xe00d, 0x109f: 0x0008, 0x10a0: 0xe00d, 0x10a1: 0x0008, 0x10a2: 0xe00d, 0x10a3: 0x0008, + 0x10a4: 0xe00d, 0x10a5: 0x0008, 0x10a6: 0xe00d, 0x10a7: 0x0008, 0x10a8: 0xe00d, 0x10a9: 0x0008, + 0x10aa: 0xe00d, 0x10ab: 0x0008, 0x10ac: 0xe00d, 0x10ad: 0x0008, 0x10ae: 0x0008, 0x10af: 0x3308, + 0x10b0: 0x3318, 0x10b1: 0x3318, 0x10b2: 0x3318, 0x10b3: 0x0018, 0x10b4: 0x3308, 0x10b5: 0x3308, + 0x10b6: 0x3308, 0x10b7: 0x3308, 0x10b8: 0x3308, 0x10b9: 0x3308, 0x10ba: 0x3308, 0x10bb: 0x3308, + 0x10bc: 0x3308, 0x10bd: 0x3308, 0x10be: 0x0018, 0x10bf: 0x0008, // Block 0x43, offset 0x10c0 - 0x10c0: 0x4365, 0x10c1: 0x4385, 0x10c2: 0x0040, 0x10c3: 0x6679, 0x10c4: 0x6691, 0x10c5: 0x66a9, - 0x10c6: 0x66c1, 0x10c7: 0x0040, 0x10c8: 0x66f9, 0x10c9: 0x6711, 0x10ca: 0x6729, 0x10cb: 0x6741, - 0x10cc: 0x6759, 0x10cd: 0x6771, 0x10ce: 0x6439, 0x10cf: 0x6789, 0x10d0: 0x67a1, 0x10d1: 0x67b9, - 0x10d2: 0x43a5, 0x10d3: 0x67d1, 0x10d4: 0x62c1, 0x10d5: 0x43c5, 0x10d6: 0x43e5, 0x10d7: 0x67e9, - 0x10d8: 0x0040, 0x10d9: 0x4405, 0x10da: 0x6801, 0x10db: 0x6819, 0x10dc: 0x6831, 0x10dd: 0x6849, - 0x10de: 0x6861, 0x10df: 0x6891, 0x10e0: 0x68c1, 0x10e1: 0x68e9, 0x10e2: 0x6911, 0x10e3: 0x6939, - 0x10e4: 0x6961, 0x10e5: 0x6989, 0x10e6: 0x69b1, 0x10e7: 0x69d9, 0x10e8: 0x6a01, 0x10e9: 0x6a29, - 0x10ea: 0x6a59, 0x10eb: 0x6a89, 0x10ec: 0x6ab9, 0x10ed: 0x6ae9, 0x10ee: 0x6b19, 0x10ef: 0x6b49, - 0x10f0: 0x6b79, 0x10f1: 0x6ba9, 0x10f2: 0x6bd9, 0x10f3: 0x6c09, 0x10f4: 0x6c39, 0x10f5: 0x6c69, - 0x10f6: 0x6c99, 0x10f7: 0x6cc9, 0x10f8: 0x6cf9, 0x10f9: 0x6d29, 0x10fa: 0x6d59, 0x10fb: 0x6d89, - 0x10fc: 0x6db9, 0x10fd: 0x6de9, 0x10fe: 0x6e19, 0x10ff: 0x4425, + 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, + 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, + 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, + 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, + 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0x02d1, 0x10dd: 0x13c9, + 0x10de: 0x3308, 0x10df: 0x3308, 0x10e0: 0x0008, 0x10e1: 0x0008, 0x10e2: 0x0008, 0x10e3: 0x0008, + 0x10e4: 0x0008, 0x10e5: 0x0008, 0x10e6: 0x0008, 0x10e7: 0x0008, 0x10e8: 0x0008, 0x10e9: 0x0008, + 0x10ea: 0x0008, 0x10eb: 0x0008, 0x10ec: 0x0008, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x0008, + 0x10f0: 0x0008, 0x10f1: 0x0008, 0x10f2: 0x0008, 0x10f3: 0x0008, 0x10f4: 0x0008, 0x10f5: 0x0008, + 0x10f6: 0x0008, 0x10f7: 0x0008, 0x10f8: 0x0008, 0x10f9: 0x0008, 0x10fa: 0x0008, 0x10fb: 0x0008, + 0x10fc: 0x0008, 0x10fd: 0x0008, 0x10fe: 0x0008, 0x10ff: 0x0008, // Block 0x44, offset 0x1100 - 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, - 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, - 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, - 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, - 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008, - 0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008, + 0x1100: 0x0018, 0x1101: 0x0018, 0x1102: 0x0018, 0x1103: 0x0018, 0x1104: 0x0018, 0x1105: 0x0018, + 0x1106: 0x0018, 0x1107: 0x0018, 0x1108: 0x0018, 0x1109: 0x0018, 0x110a: 0x0018, 0x110b: 0x0018, + 0x110c: 0x0018, 0x110d: 0x0018, 0x110e: 0x0018, 0x110f: 0x0018, 0x1110: 0x0018, 0x1111: 0x0018, + 0x1112: 0x0018, 0x1113: 0x0018, 0x1114: 0x0018, 0x1115: 0x0018, 0x1116: 0x0018, 0x1117: 0x0008, + 0x1118: 0x0008, 0x1119: 0x0008, 0x111a: 0x0008, 0x111b: 0x0008, 0x111c: 0x0008, 0x111d: 0x0008, + 0x111e: 0x0008, 0x111f: 0x0008, 0x1120: 0x0018, 0x1121: 0x0018, 0x1122: 0xe00d, 0x1123: 0x0008, 0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008, - 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308, - 0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308, - 0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308, - 0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008, + 0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0xe00d, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0xe00d, 0x1133: 0x0008, 0x1134: 0xe00d, 0x1135: 0x0008, + 0x1136: 0xe00d, 0x1137: 0x0008, 0x1138: 0xe00d, 0x1139: 0x0008, 0x113a: 0xe00d, 0x113b: 0x0008, + 0x113c: 0xe00d, 0x113d: 0x0008, 0x113e: 0xe00d, 0x113f: 0x0008, // Block 0x45, offset 0x1140 0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008, 0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008, 0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008, 0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008, - 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e49, - 0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008, - 0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008, - 0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008, - 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, - 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008, - 0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008, + 0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0xe00d, 0x115d: 0x0008, + 0x115e: 0xe00d, 0x115f: 0x0008, 0x1160: 0xe00d, 0x1161: 0x0008, 0x1162: 0xe00d, 0x1163: 0x0008, + 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, + 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, + 0x1170: 0xe0fd, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008, + 0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0xe01d, 0x117a: 0x0008, 0x117b: 0xe03d, + 0x117c: 0x0008, 0x117d: 0x4445, 0x117e: 0xe00d, 0x117f: 0x0008, // Block 0x46, offset 0x1180 - 0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018, - 0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018, - 0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018, - 0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008, - 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, - 0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, + 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0x0008, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0xe03d, + 0x118c: 0x0008, 0x118d: 0x0409, 0x118e: 0x0008, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0x0008, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, + 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, + 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, - 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, - 0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008, + 0x11aa: 0x13d1, 0x11ab: 0x0371, 0x11ac: 0x0401, 0x11ad: 0x13d9, 0x11ae: 0x0421, 0x11af: 0x0008, + 0x11b0: 0x13e1, 0x11b1: 0x13e9, 0x11b2: 0x0429, 0x11b3: 0x4465, 0x11b4: 0xe00d, 0x11b5: 0x0008, 0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008, 0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008, // Block 0x47, offset 0x11c0 - 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, - 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008, - 0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, - 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, - 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, - 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, - 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, - 0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008, - 0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, - 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d, - 0x11fc: 0x0008, 0x11fd: 0x4445, 0x11fe: 0xe00d, 0x11ff: 0x0008, + 0x11c0: 0x650d, 0x11c1: 0x652d, 0x11c2: 0x654d, 0x11c3: 0x656d, 0x11c4: 0x658d, 0x11c5: 0x65ad, + 0x11c6: 0x65cd, 0x11c7: 0x65ed, 0x11c8: 0x660d, 0x11c9: 0x662d, 0x11ca: 0x664d, 0x11cb: 0x666d, + 0x11cc: 0x668d, 0x11cd: 0x66ad, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0x66cd, 0x11d1: 0x0008, + 0x11d2: 0x66ed, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x670d, 0x11d6: 0x672d, 0x11d7: 0x674d, + 0x11d8: 0x676d, 0x11d9: 0x678d, 0x11da: 0x67ad, 0x11db: 0x67cd, 0x11dc: 0x67ed, 0x11dd: 0x680d, + 0x11de: 0x682d, 0x11df: 0x0008, 0x11e0: 0x684d, 0x11e1: 0x0008, 0x11e2: 0x686d, 0x11e3: 0x0008, + 0x11e4: 0x0008, 0x11e5: 0x688d, 0x11e6: 0x68ad, 0x11e7: 0x0008, 0x11e8: 0x0008, 0x11e9: 0x0008, + 0x11ea: 0x68cd, 0x11eb: 0x68ed, 0x11ec: 0x690d, 0x11ed: 0x692d, 0x11ee: 0x694d, 0x11ef: 0x696d, + 0x11f0: 0x698d, 0x11f1: 0x69ad, 0x11f2: 0x69cd, 0x11f3: 0x69ed, 0x11f4: 0x6a0d, 0x11f5: 0x6a2d, + 0x11f6: 0x6a4d, 0x11f7: 0x6a6d, 0x11f8: 0x6a8d, 0x11f9: 0x6aad, 0x11fa: 0x6acd, 0x11fb: 0x6aed, + 0x11fc: 0x6b0d, 0x11fd: 0x6b2d, 0x11fe: 0x6b4d, 0x11ff: 0x6b6d, // Block 0x48, offset 0x1200 - 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008, - 0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d, - 0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008, - 0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, - 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008, - 0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008, - 0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008, - 0x122a: 0x6e61, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e79, 0x122e: 0x1221, 0x122f: 0x0008, - 0x1230: 0x6e91, 0x1231: 0x6ea9, 0x1232: 0x1239, 0x1233: 0x4465, 0x1234: 0xe00d, 0x1235: 0x0008, - 0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0xe00d, 0x1239: 0x0008, 0x123a: 0xe00d, 0x123b: 0x0008, - 0x123c: 0xe00d, 0x123d: 0x0008, 0x123e: 0xe00d, 0x123f: 0x0008, + 0x1200: 0x7acd, 0x1201: 0x7aed, 0x1202: 0x7b0d, 0x1203: 0x7b2d, 0x1204: 0x7b4d, 0x1205: 0x7b6d, + 0x1206: 0x7b8d, 0x1207: 0x7bad, 0x1208: 0x7bcd, 0x1209: 0x7bed, 0x120a: 0x7c0d, 0x120b: 0x7c2d, + 0x120c: 0x7c4d, 0x120d: 0x7c6d, 0x120e: 0x7c8d, 0x120f: 0x1409, 0x1210: 0x1411, 0x1211: 0x1419, + 0x1212: 0x7cad, 0x1213: 0x7ccd, 0x1214: 0x7ced, 0x1215: 0x1421, 0x1216: 0x1429, 0x1217: 0x1431, + 0x1218: 0x7d0d, 0x1219: 0x7d2d, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, + 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, + 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, + 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, + 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x0040, 0x1233: 0x0040, 0x1234: 0x0040, 0x1235: 0x0040, + 0x1236: 0x0040, 0x1237: 0x0040, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040, + 0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040, // Block 0x49, offset 0x1240 - 0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad, - 0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d, - 0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008, - 0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d, - 0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d, - 0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008, - 0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, - 0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d, - 0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d, - 0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed, - 0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d, + 0x1240: 0x1439, 0x1241: 0x1441, 0x1242: 0x1449, 0x1243: 0x7d4d, 0x1244: 0x7d6d, 0x1245: 0x1451, + 0x1246: 0x1451, 0x1247: 0x0040, 0x1248: 0x0040, 0x1249: 0x0040, 0x124a: 0x0040, 0x124b: 0x0040, + 0x124c: 0x0040, 0x124d: 0x0040, 0x124e: 0x0040, 0x124f: 0x0040, 0x1250: 0x0040, 0x1251: 0x0040, + 0x1252: 0x0040, 0x1253: 0x1459, 0x1254: 0x1461, 0x1255: 0x1469, 0x1256: 0x1471, 0x1257: 0x1479, + 0x1258: 0x0040, 0x1259: 0x0040, 0x125a: 0x0040, 0x125b: 0x0040, 0x125c: 0x0040, 0x125d: 0x1481, + 0x125e: 0x3308, 0x125f: 0x1489, 0x1260: 0x1491, 0x1261: 0x0779, 0x1262: 0x0791, 0x1263: 0x1499, + 0x1264: 0x14a1, 0x1265: 0x14a9, 0x1266: 0x14b1, 0x1267: 0x14b9, 0x1268: 0x14c1, 0x1269: 0x071a, + 0x126a: 0x14c9, 0x126b: 0x14d1, 0x126c: 0x14d9, 0x126d: 0x14e1, 0x126e: 0x14e9, 0x126f: 0x14f1, + 0x1270: 0x14f9, 0x1271: 0x1501, 0x1272: 0x1509, 0x1273: 0x1511, 0x1274: 0x1519, 0x1275: 0x1521, + 0x1276: 0x1529, 0x1277: 0x0040, 0x1278: 0x1531, 0x1279: 0x1539, 0x127a: 0x1541, 0x127b: 0x1549, + 0x127c: 0x1551, 0x127d: 0x0040, 0x127e: 0x1559, 0x127f: 0x0040, // Block 0x4a, offset 0x1280 - 0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d, - 0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d, - 0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x6f19, 0x1290: 0x6f41, 0x1291: 0x6f69, - 0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x6f91, 0x1296: 0x6fb9, 0x1297: 0x6fe1, - 0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, - 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, - 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, - 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, - 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, - 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, - 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + 0x1280: 0x1561, 0x1281: 0x1569, 0x1282: 0x0040, 0x1283: 0x1571, 0x1284: 0x1579, 0x1285: 0x0040, + 0x1286: 0x1581, 0x1287: 0x1589, 0x1288: 0x1591, 0x1289: 0x1599, 0x128a: 0x15a1, 0x128b: 0x15a9, + 0x128c: 0x15b1, 0x128d: 0x15b9, 0x128e: 0x15c1, 0x128f: 0x15c9, 0x1290: 0x15d1, 0x1291: 0x15d1, + 0x1292: 0x15d9, 0x1293: 0x15d9, 0x1294: 0x15d9, 0x1295: 0x15d9, 0x1296: 0x15e1, 0x1297: 0x15e1, + 0x1298: 0x15e1, 0x1299: 0x15e1, 0x129a: 0x15e9, 0x129b: 0x15e9, 0x129c: 0x15e9, 0x129d: 0x15e9, + 0x129e: 0x15f1, 0x129f: 0x15f1, 0x12a0: 0x15f1, 0x12a1: 0x15f1, 0x12a2: 0x15f9, 0x12a3: 0x15f9, + 0x12a4: 0x15f9, 0x12a5: 0x15f9, 0x12a6: 0x1601, 0x12a7: 0x1601, 0x12a8: 0x1601, 0x12a9: 0x1601, + 0x12aa: 0x1609, 0x12ab: 0x1609, 0x12ac: 0x1609, 0x12ad: 0x1609, 0x12ae: 0x1611, 0x12af: 0x1611, + 0x12b0: 0x1611, 0x12b1: 0x1611, 0x12b2: 0x1619, 0x12b3: 0x1619, 0x12b4: 0x1619, 0x12b5: 0x1619, + 0x12b6: 0x1621, 0x12b7: 0x1621, 0x12b8: 0x1621, 0x12b9: 0x1621, 0x12ba: 0x1629, 0x12bb: 0x1629, + 0x12bc: 0x1629, 0x12bd: 0x1629, 0x12be: 0x1631, 0x12bf: 0x1631, // Block 0x4b, offset 0x12c0 - 0x12c0: 0x7009, 0x12c1: 0x7021, 0x12c2: 0x7039, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x7051, - 0x12c6: 0x7051, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, - 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, - 0x12d2: 0x0040, 0x12d3: 0x7069, 0x12d4: 0x7091, 0x12d5: 0x70b9, 0x12d6: 0x70e1, 0x12d7: 0x7109, - 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x7131, - 0x12de: 0x3308, 0x12df: 0x7159, 0x12e0: 0x7181, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7199, - 0x12e4: 0x71b1, 0x12e5: 0x71c9, 0x12e6: 0x71e1, 0x12e7: 0x71f9, 0x12e8: 0x7211, 0x12e9: 0x1fb2, - 0x12ea: 0x7229, 0x12eb: 0x7251, 0x12ec: 0x7279, 0x12ed: 0x72b1, 0x12ee: 0x72e9, 0x12ef: 0x7311, - 0x12f0: 0x7339, 0x12f1: 0x7361, 0x12f2: 0x7389, 0x12f3: 0x73b1, 0x12f4: 0x73d9, 0x12f5: 0x7401, - 0x12f6: 0x7429, 0x12f7: 0x0040, 0x12f8: 0x7451, 0x12f9: 0x7479, 0x12fa: 0x74a1, 0x12fb: 0x74c9, - 0x12fc: 0x74f1, 0x12fd: 0x0040, 0x12fe: 0x7519, 0x12ff: 0x0040, + 0x12c0: 0x1631, 0x12c1: 0x1631, 0x12c2: 0x1639, 0x12c3: 0x1639, 0x12c4: 0x1641, 0x12c5: 0x1641, + 0x12c6: 0x1649, 0x12c7: 0x1649, 0x12c8: 0x1651, 0x12c9: 0x1651, 0x12ca: 0x1659, 0x12cb: 0x1659, + 0x12cc: 0x1661, 0x12cd: 0x1661, 0x12ce: 0x1669, 0x12cf: 0x1669, 0x12d0: 0x1669, 0x12d1: 0x1669, + 0x12d2: 0x1671, 0x12d3: 0x1671, 0x12d4: 0x1671, 0x12d5: 0x1671, 0x12d6: 0x1679, 0x12d7: 0x1679, + 0x12d8: 0x1679, 0x12d9: 0x1679, 0x12da: 0x1681, 0x12db: 0x1681, 0x12dc: 0x1681, 0x12dd: 0x1681, + 0x12de: 0x1689, 0x12df: 0x1689, 0x12e0: 0x1691, 0x12e1: 0x1691, 0x12e2: 0x1691, 0x12e3: 0x1691, + 0x12e4: 0x1699, 0x12e5: 0x1699, 0x12e6: 0x16a1, 0x12e7: 0x16a1, 0x12e8: 0x16a1, 0x12e9: 0x16a1, + 0x12ea: 0x16a9, 0x12eb: 0x16a9, 0x12ec: 0x16a9, 0x12ed: 0x16a9, 0x12ee: 0x16b1, 0x12ef: 0x16b1, + 0x12f0: 0x16b9, 0x12f1: 0x16b9, 0x12f2: 0x0818, 0x12f3: 0x0818, 0x12f4: 0x0818, 0x12f5: 0x0818, + 0x12f6: 0x0818, 0x12f7: 0x0818, 0x12f8: 0x0818, 0x12f9: 0x0818, 0x12fa: 0x0818, 0x12fb: 0x0818, + 0x12fc: 0x0818, 0x12fd: 0x0818, 0x12fe: 0x0818, 0x12ff: 0x0818, // Block 0x4c, offset 0x1300 - 0x1300: 0x7541, 0x1301: 0x7569, 0x1302: 0x0040, 0x1303: 0x7591, 0x1304: 0x75b9, 0x1305: 0x0040, - 0x1306: 0x75e1, 0x1307: 0x7609, 0x1308: 0x7631, 0x1309: 0x7659, 0x130a: 0x7681, 0x130b: 0x76a9, - 0x130c: 0x76d1, 0x130d: 0x76f9, 0x130e: 0x7721, 0x130f: 0x7749, 0x1310: 0x7771, 0x1311: 0x7771, - 0x1312: 0x7789, 0x1313: 0x7789, 0x1314: 0x7789, 0x1315: 0x7789, 0x1316: 0x77a1, 0x1317: 0x77a1, - 0x1318: 0x77a1, 0x1319: 0x77a1, 0x131a: 0x77b9, 0x131b: 0x77b9, 0x131c: 0x77b9, 0x131d: 0x77b9, - 0x131e: 0x77d1, 0x131f: 0x77d1, 0x1320: 0x77d1, 0x1321: 0x77d1, 0x1322: 0x77e9, 0x1323: 0x77e9, - 0x1324: 0x77e9, 0x1325: 0x77e9, 0x1326: 0x7801, 0x1327: 0x7801, 0x1328: 0x7801, 0x1329: 0x7801, - 0x132a: 0x7819, 0x132b: 0x7819, 0x132c: 0x7819, 0x132d: 0x7819, 0x132e: 0x7831, 0x132f: 0x7831, - 0x1330: 0x7831, 0x1331: 0x7831, 0x1332: 0x7849, 0x1333: 0x7849, 0x1334: 0x7849, 0x1335: 0x7849, - 0x1336: 0x7861, 0x1337: 0x7861, 0x1338: 0x7861, 0x1339: 0x7861, 0x133a: 0x7879, 0x133b: 0x7879, - 0x133c: 0x7879, 0x133d: 0x7879, 0x133e: 0x7891, 0x133f: 0x7891, + 0x1300: 0x0818, 0x1301: 0x0818, 0x1302: 0x0040, 0x1303: 0x0040, 0x1304: 0x0040, 0x1305: 0x0040, + 0x1306: 0x0040, 0x1307: 0x0040, 0x1308: 0x0040, 0x1309: 0x0040, 0x130a: 0x0040, 0x130b: 0x0040, + 0x130c: 0x0040, 0x130d: 0x0040, 0x130e: 0x0040, 0x130f: 0x0040, 0x1310: 0x0040, 0x1311: 0x0040, + 0x1312: 0x0040, 0x1313: 0x16c1, 0x1314: 0x16c1, 0x1315: 0x16c1, 0x1316: 0x16c1, 0x1317: 0x16c9, + 0x1318: 0x16c9, 0x1319: 0x16d1, 0x131a: 0x16d1, 0x131b: 0x16d9, 0x131c: 0x16d9, 0x131d: 0x0149, + 0x131e: 0x16e1, 0x131f: 0x16e1, 0x1320: 0x16e9, 0x1321: 0x16e9, 0x1322: 0x16f1, 0x1323: 0x16f1, + 0x1324: 0x16f9, 0x1325: 0x16f9, 0x1326: 0x16f9, 0x1327: 0x16f9, 0x1328: 0x1701, 0x1329: 0x1701, + 0x132a: 0x1709, 0x132b: 0x1709, 0x132c: 0x1711, 0x132d: 0x1711, 0x132e: 0x1719, 0x132f: 0x1719, + 0x1330: 0x1721, 0x1331: 0x1721, 0x1332: 0x1729, 0x1333: 0x1729, 0x1334: 0x1731, 0x1335: 0x1731, + 0x1336: 0x1739, 0x1337: 0x1739, 0x1338: 0x1739, 0x1339: 0x1741, 0x133a: 0x1741, 0x133b: 0x1741, + 0x133c: 0x1749, 0x133d: 0x1749, 0x133e: 0x1749, 0x133f: 0x1749, // Block 0x4d, offset 0x1340 - 0x1340: 0x7891, 0x1341: 0x7891, 0x1342: 0x78a9, 0x1343: 0x78a9, 0x1344: 0x78c1, 0x1345: 0x78c1, - 0x1346: 0x78d9, 0x1347: 0x78d9, 0x1348: 0x78f1, 0x1349: 0x78f1, 0x134a: 0x7909, 0x134b: 0x7909, - 0x134c: 0x7921, 0x134d: 0x7921, 0x134e: 0x7939, 0x134f: 0x7939, 0x1350: 0x7939, 0x1351: 0x7939, - 0x1352: 0x7951, 0x1353: 0x7951, 0x1354: 0x7951, 0x1355: 0x7951, 0x1356: 0x7969, 0x1357: 0x7969, - 0x1358: 0x7969, 0x1359: 0x7969, 0x135a: 0x7981, 0x135b: 0x7981, 0x135c: 0x7981, 0x135d: 0x7981, - 0x135e: 0x7999, 0x135f: 0x7999, 0x1360: 0x79b1, 0x1361: 0x79b1, 0x1362: 0x79b1, 0x1363: 0x79b1, - 0x1364: 0x79c9, 0x1365: 0x79c9, 0x1366: 0x79e1, 0x1367: 0x79e1, 0x1368: 0x79e1, 0x1369: 0x79e1, - 0x136a: 0x79f9, 0x136b: 0x79f9, 0x136c: 0x79f9, 0x136d: 0x79f9, 0x136e: 0x7a11, 0x136f: 0x7a11, - 0x1370: 0x7a29, 0x1371: 0x7a29, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, - 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, - 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + 0x1340: 0x1949, 0x1341: 0x1951, 0x1342: 0x1959, 0x1343: 0x1961, 0x1344: 0x1969, 0x1345: 0x1971, + 0x1346: 0x1979, 0x1347: 0x1981, 0x1348: 0x1989, 0x1349: 0x1991, 0x134a: 0x1999, 0x134b: 0x19a1, + 0x134c: 0x19a9, 0x134d: 0x19b1, 0x134e: 0x19b9, 0x134f: 0x19c1, 0x1350: 0x19c9, 0x1351: 0x19d1, + 0x1352: 0x19d9, 0x1353: 0x19e1, 0x1354: 0x19e9, 0x1355: 0x19f1, 0x1356: 0x19f9, 0x1357: 0x1a01, + 0x1358: 0x1a09, 0x1359: 0x1a11, 0x135a: 0x1a19, 0x135b: 0x1a21, 0x135c: 0x1a29, 0x135d: 0x1a31, + 0x135e: 0x1a3a, 0x135f: 0x1a42, 0x1360: 0x1a4a, 0x1361: 0x1a52, 0x1362: 0x1a5a, 0x1363: 0x1a62, + 0x1364: 0x1a69, 0x1365: 0x1a71, 0x1366: 0x1761, 0x1367: 0x1a79, 0x1368: 0x1741, 0x1369: 0x1769, + 0x136a: 0x1a81, 0x136b: 0x1a89, 0x136c: 0x1789, 0x136d: 0x1a91, 0x136e: 0x1791, 0x136f: 0x1799, + 0x1370: 0x1a99, 0x1371: 0x1aa1, 0x1372: 0x17b9, 0x1373: 0x1aa9, 0x1374: 0x17c1, 0x1375: 0x17c9, + 0x1376: 0x1ab1, 0x1377: 0x1ab9, 0x1378: 0x17d9, 0x1379: 0x1ac1, 0x137a: 0x17e1, 0x137b: 0x17e9, + 0x137c: 0x18d1, 0x137d: 0x18d9, 0x137e: 0x18f1, 0x137f: 0x18f9, // Block 0x4e, offset 0x1380 - 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, - 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, - 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, - 0x1392: 0x0040, 0x1393: 0x7a41, 0x1394: 0x7a41, 0x1395: 0x7a41, 0x1396: 0x7a41, 0x1397: 0x7a59, - 0x1398: 0x7a59, 0x1399: 0x7a71, 0x139a: 0x7a71, 0x139b: 0x7a89, 0x139c: 0x7a89, 0x139d: 0x0479, - 0x139e: 0x7aa1, 0x139f: 0x7aa1, 0x13a0: 0x7ab9, 0x13a1: 0x7ab9, 0x13a2: 0x7ad1, 0x13a3: 0x7ad1, - 0x13a4: 0x7ae9, 0x13a5: 0x7ae9, 0x13a6: 0x7ae9, 0x13a7: 0x7ae9, 0x13a8: 0x7b01, 0x13a9: 0x7b01, - 0x13aa: 0x7b19, 0x13ab: 0x7b19, 0x13ac: 0x7b41, 0x13ad: 0x7b41, 0x13ae: 0x7b69, 0x13af: 0x7b69, - 0x13b0: 0x7b91, 0x13b1: 0x7b91, 0x13b2: 0x7bb9, 0x13b3: 0x7bb9, 0x13b4: 0x7be1, 0x13b5: 0x7be1, - 0x13b6: 0x7c09, 0x13b7: 0x7c09, 0x13b8: 0x7c09, 0x13b9: 0x7c31, 0x13ba: 0x7c31, 0x13bb: 0x7c31, - 0x13bc: 0x7c59, 0x13bd: 0x7c59, 0x13be: 0x7c59, 0x13bf: 0x7c59, + 0x1380: 0x1901, 0x1381: 0x1921, 0x1382: 0x1929, 0x1383: 0x1931, 0x1384: 0x1939, 0x1385: 0x1959, + 0x1386: 0x1961, 0x1387: 0x1969, 0x1388: 0x1ac9, 0x1389: 0x1989, 0x138a: 0x1ad1, 0x138b: 0x1ad9, + 0x138c: 0x19b9, 0x138d: 0x1ae1, 0x138e: 0x19c1, 0x138f: 0x19c9, 0x1390: 0x1a31, 0x1391: 0x1ae9, + 0x1392: 0x1af1, 0x1393: 0x1a09, 0x1394: 0x1af9, 0x1395: 0x1a11, 0x1396: 0x1a19, 0x1397: 0x1751, + 0x1398: 0x1759, 0x1399: 0x1b01, 0x139a: 0x1761, 0x139b: 0x1b09, 0x139c: 0x1771, 0x139d: 0x1779, + 0x139e: 0x1781, 0x139f: 0x1789, 0x13a0: 0x1b11, 0x13a1: 0x17a1, 0x13a2: 0x17a9, 0x13a3: 0x17b1, + 0x13a4: 0x17b9, 0x13a5: 0x1b19, 0x13a6: 0x17d9, 0x13a7: 0x17f1, 0x13a8: 0x17f9, 0x13a9: 0x1801, + 0x13aa: 0x1809, 0x13ab: 0x1811, 0x13ac: 0x1821, 0x13ad: 0x1829, 0x13ae: 0x1831, 0x13af: 0x1839, + 0x13b0: 0x1841, 0x13b1: 0x1849, 0x13b2: 0x1b21, 0x13b3: 0x1851, 0x13b4: 0x1859, 0x13b5: 0x1861, + 0x13b6: 0x1869, 0x13b7: 0x1871, 0x13b8: 0x1879, 0x13b9: 0x1889, 0x13ba: 0x1891, 0x13bb: 0x1899, + 0x13bc: 0x18a1, 0x13bd: 0x18a9, 0x13be: 0x18b1, 0x13bf: 0x18b9, // Block 0x4f, offset 0x13c0 - 0x13c0: 0x8649, 0x13c1: 0x8671, 0x13c2: 0x8699, 0x13c3: 0x86c1, 0x13c4: 0x86e9, 0x13c5: 0x8711, - 0x13c6: 0x8739, 0x13c7: 0x8761, 0x13c8: 0x8789, 0x13c9: 0x87b1, 0x13ca: 0x87d9, 0x13cb: 0x8801, - 0x13cc: 0x8829, 0x13cd: 0x8851, 0x13ce: 0x8879, 0x13cf: 0x88a1, 0x13d0: 0x88c9, 0x13d1: 0x88f1, - 0x13d2: 0x8919, 0x13d3: 0x8941, 0x13d4: 0x8969, 0x13d5: 0x8991, 0x13d6: 0x89b9, 0x13d7: 0x89e1, - 0x13d8: 0x8a09, 0x13d9: 0x8a31, 0x13da: 0x8a59, 0x13db: 0x8a81, 0x13dc: 0x8aa9, 0x13dd: 0x8ad1, - 0x13de: 0x8afa, 0x13df: 0x8b2a, 0x13e0: 0x8b5a, 0x13e1: 0x8b8a, 0x13e2: 0x8bba, 0x13e3: 0x8bea, - 0x13e4: 0x8c19, 0x13e5: 0x8c41, 0x13e6: 0x7cc1, 0x13e7: 0x8c69, 0x13e8: 0x7c31, 0x13e9: 0x7ce9, - 0x13ea: 0x8c91, 0x13eb: 0x8cb9, 0x13ec: 0x7d89, 0x13ed: 0x8ce1, 0x13ee: 0x7db1, 0x13ef: 0x7dd9, - 0x13f0: 0x8d09, 0x13f1: 0x8d31, 0x13f2: 0x7e79, 0x13f3: 0x8d59, 0x13f4: 0x7ea1, 0x13f5: 0x7ec9, - 0x13f6: 0x8d81, 0x13f7: 0x8da9, 0x13f8: 0x7f19, 0x13f9: 0x8dd1, 0x13fa: 0x7f41, 0x13fb: 0x7f69, - 0x13fc: 0x83f1, 0x13fd: 0x8419, 0x13fe: 0x8491, 0x13ff: 0x84b9, + 0x13c0: 0x18c1, 0x13c1: 0x18c9, 0x13c2: 0x18e1, 0x13c3: 0x18e9, 0x13c4: 0x1909, 0x13c5: 0x1911, + 0x13c6: 0x1919, 0x13c7: 0x1921, 0x13c8: 0x1929, 0x13c9: 0x1941, 0x13ca: 0x1949, 0x13cb: 0x1951, + 0x13cc: 0x1959, 0x13cd: 0x1b29, 0x13ce: 0x1971, 0x13cf: 0x1979, 0x13d0: 0x1981, 0x13d1: 0x1989, + 0x13d2: 0x19a1, 0x13d3: 0x19a9, 0x13d4: 0x19b1, 0x13d5: 0x19b9, 0x13d6: 0x1b31, 0x13d7: 0x19d1, + 0x13d8: 0x19d9, 0x13d9: 0x1b39, 0x13da: 0x19f1, 0x13db: 0x19f9, 0x13dc: 0x1a01, 0x13dd: 0x1a09, + 0x13de: 0x1b41, 0x13df: 0x1761, 0x13e0: 0x1b09, 0x13e1: 0x1789, 0x13e2: 0x1b11, 0x13e3: 0x17b9, + 0x13e4: 0x1b19, 0x13e5: 0x17d9, 0x13e6: 0x1b49, 0x13e7: 0x1841, 0x13e8: 0x1b51, 0x13e9: 0x1b59, + 0x13ea: 0x1b61, 0x13eb: 0x1921, 0x13ec: 0x1929, 0x13ed: 0x1959, 0x13ee: 0x19b9, 0x13ef: 0x1b31, + 0x13f0: 0x1a09, 0x13f1: 0x1b41, 0x13f2: 0x1b69, 0x13f3: 0x1b71, 0x13f4: 0x1b79, 0x13f5: 0x1b81, + 0x13f6: 0x1b89, 0x13f7: 0x1b91, 0x13f8: 0x1b99, 0x13f9: 0x1ba1, 0x13fa: 0x1ba9, 0x13fb: 0x1bb1, + 0x13fc: 0x1bb9, 0x13fd: 0x1bc1, 0x13fe: 0x1bc9, 0x13ff: 0x1bd1, // Block 0x50, offset 0x1400 - 0x1400: 0x84e1, 0x1401: 0x8581, 0x1402: 0x85a9, 0x1403: 0x85d1, 0x1404: 0x85f9, 0x1405: 0x8699, - 0x1406: 0x86c1, 0x1407: 0x86e9, 0x1408: 0x8df9, 0x1409: 0x8789, 0x140a: 0x8e21, 0x140b: 0x8e49, - 0x140c: 0x8879, 0x140d: 0x8e71, 0x140e: 0x88a1, 0x140f: 0x88c9, 0x1410: 0x8ad1, 0x1411: 0x8e99, - 0x1412: 0x8ec1, 0x1413: 0x8a09, 0x1414: 0x8ee9, 0x1415: 0x8a31, 0x1416: 0x8a59, 0x1417: 0x7c71, - 0x1418: 0x7c99, 0x1419: 0x8f11, 0x141a: 0x7cc1, 0x141b: 0x8f39, 0x141c: 0x7d11, 0x141d: 0x7d39, - 0x141e: 0x7d61, 0x141f: 0x7d89, 0x1420: 0x8f61, 0x1421: 0x7e01, 0x1422: 0x7e29, 0x1423: 0x7e51, - 0x1424: 0x7e79, 0x1425: 0x8f89, 0x1426: 0x7f19, 0x1427: 0x7f91, 0x1428: 0x7fb9, 0x1429: 0x7fe1, - 0x142a: 0x8009, 0x142b: 0x8031, 0x142c: 0x8081, 0x142d: 0x80a9, 0x142e: 0x80d1, 0x142f: 0x80f9, - 0x1430: 0x8121, 0x1431: 0x8149, 0x1432: 0x8fb1, 0x1433: 0x8171, 0x1434: 0x8199, 0x1435: 0x81c1, - 0x1436: 0x81e9, 0x1437: 0x8211, 0x1438: 0x8239, 0x1439: 0x8289, 0x143a: 0x82b1, 0x143b: 0x82d9, - 0x143c: 0x8301, 0x143d: 0x8329, 0x143e: 0x8351, 0x143f: 0x8379, + 0x1400: 0x1bd9, 0x1401: 0x1be1, 0x1402: 0x1be9, 0x1403: 0x1bf1, 0x1404: 0x1bf9, 0x1405: 0x1c01, + 0x1406: 0x1c09, 0x1407: 0x1c11, 0x1408: 0x1c19, 0x1409: 0x1c21, 0x140a: 0x1c29, 0x140b: 0x1c31, + 0x140c: 0x1b59, 0x140d: 0x1c39, 0x140e: 0x1c41, 0x140f: 0x1c49, 0x1410: 0x1c51, 0x1411: 0x1b81, + 0x1412: 0x1b89, 0x1413: 0x1b91, 0x1414: 0x1b99, 0x1415: 0x1ba1, 0x1416: 0x1ba9, 0x1417: 0x1bb1, + 0x1418: 0x1bb9, 0x1419: 0x1bc1, 0x141a: 0x1bc9, 0x141b: 0x1bd1, 0x141c: 0x1bd9, 0x141d: 0x1be1, + 0x141e: 0x1be9, 0x141f: 0x1bf1, 0x1420: 0x1bf9, 0x1421: 0x1c01, 0x1422: 0x1c09, 0x1423: 0x1c11, + 0x1424: 0x1c19, 0x1425: 0x1c21, 0x1426: 0x1c29, 0x1427: 0x1c31, 0x1428: 0x1b59, 0x1429: 0x1c39, + 0x142a: 0x1c41, 0x142b: 0x1c49, 0x142c: 0x1c51, 0x142d: 0x1c21, 0x142e: 0x1c29, 0x142f: 0x1c31, + 0x1430: 0x1b59, 0x1431: 0x1b51, 0x1432: 0x1b61, 0x1433: 0x1881, 0x1434: 0x1829, 0x1435: 0x1831, + 0x1436: 0x1839, 0x1437: 0x1c21, 0x1438: 0x1c29, 0x1439: 0x1c31, 0x143a: 0x1881, 0x143b: 0x1889, + 0x143c: 0x1c59, 0x143d: 0x1c59, 0x143e: 0x0018, 0x143f: 0x0018, // Block 0x51, offset 0x1440 - 0x1440: 0x83a1, 0x1441: 0x83c9, 0x1442: 0x8441, 0x1443: 0x8469, 0x1444: 0x8509, 0x1445: 0x8531, - 0x1446: 0x8559, 0x1447: 0x8581, 0x1448: 0x85a9, 0x1449: 0x8621, 0x144a: 0x8649, 0x144b: 0x8671, - 0x144c: 0x8699, 0x144d: 0x8fd9, 0x144e: 0x8711, 0x144f: 0x8739, 0x1450: 0x8761, 0x1451: 0x8789, - 0x1452: 0x8801, 0x1453: 0x8829, 0x1454: 0x8851, 0x1455: 0x8879, 0x1456: 0x9001, 0x1457: 0x88f1, - 0x1458: 0x8919, 0x1459: 0x9029, 0x145a: 0x8991, 0x145b: 0x89b9, 0x145c: 0x89e1, 0x145d: 0x8a09, - 0x145e: 0x9051, 0x145f: 0x7cc1, 0x1460: 0x8f39, 0x1461: 0x7d89, 0x1462: 0x8f61, 0x1463: 0x7e79, - 0x1464: 0x8f89, 0x1465: 0x7f19, 0x1466: 0x9079, 0x1467: 0x8121, 0x1468: 0x90a1, 0x1469: 0x90c9, - 0x146a: 0x90f1, 0x146b: 0x8581, 0x146c: 0x85a9, 0x146d: 0x8699, 0x146e: 0x8879, 0x146f: 0x9001, - 0x1470: 0x8a09, 0x1471: 0x9051, 0x1472: 0x9119, 0x1473: 0x9151, 0x1474: 0x9189, 0x1475: 0x91c1, - 0x1476: 0x91e9, 0x1477: 0x9211, 0x1478: 0x9239, 0x1479: 0x9261, 0x147a: 0x9289, 0x147b: 0x92b1, - 0x147c: 0x92d9, 0x147d: 0x9301, 0x147e: 0x9329, 0x147f: 0x9351, + 0x1440: 0x0040, 0x1441: 0x0040, 0x1442: 0x0040, 0x1443: 0x0040, 0x1444: 0x0040, 0x1445: 0x0040, + 0x1446: 0x0040, 0x1447: 0x0040, 0x1448: 0x0040, 0x1449: 0x0040, 0x144a: 0x0040, 0x144b: 0x0040, + 0x144c: 0x0040, 0x144d: 0x0040, 0x144e: 0x0040, 0x144f: 0x0040, 0x1450: 0x1c61, 0x1451: 0x1c69, + 0x1452: 0x1c69, 0x1453: 0x1c71, 0x1454: 0x1c79, 0x1455: 0x1c81, 0x1456: 0x1c89, 0x1457: 0x1c91, + 0x1458: 0x1c99, 0x1459: 0x1c99, 0x145a: 0x1ca1, 0x145b: 0x1ca9, 0x145c: 0x1cb1, 0x145d: 0x1cb9, + 0x145e: 0x1cc1, 0x145f: 0x1cc9, 0x1460: 0x1cc9, 0x1461: 0x1cd1, 0x1462: 0x1cd9, 0x1463: 0x1cd9, + 0x1464: 0x1ce1, 0x1465: 0x1ce1, 0x1466: 0x1ce9, 0x1467: 0x1cf1, 0x1468: 0x1cf1, 0x1469: 0x1cf9, + 0x146a: 0x1d01, 0x146b: 0x1d01, 0x146c: 0x1d09, 0x146d: 0x1d09, 0x146e: 0x1d11, 0x146f: 0x1d19, + 0x1470: 0x1d19, 0x1471: 0x1d21, 0x1472: 0x1d21, 0x1473: 0x1d29, 0x1474: 0x1d31, 0x1475: 0x1d39, + 0x1476: 0x1d41, 0x1477: 0x1d41, 0x1478: 0x1d49, 0x1479: 0x1d51, 0x147a: 0x1d59, 0x147b: 0x1d61, + 0x147c: 0x1d69, 0x147d: 0x1d69, 0x147e: 0x1d71, 0x147f: 0x1d79, // Block 0x52, offset 0x1480 - 0x1480: 0x9379, 0x1481: 0x93a1, 0x1482: 0x93c9, 0x1483: 0x93f1, 0x1484: 0x9419, 0x1485: 0x9441, - 0x1486: 0x9469, 0x1487: 0x9491, 0x1488: 0x94b9, 0x1489: 0x94e1, 0x148a: 0x9509, 0x148b: 0x9531, - 0x148c: 0x90c9, 0x148d: 0x9559, 0x148e: 0x9581, 0x148f: 0x95a9, 0x1490: 0x95d1, 0x1491: 0x91c1, - 0x1492: 0x91e9, 0x1493: 0x9211, 0x1494: 0x9239, 0x1495: 0x9261, 0x1496: 0x9289, 0x1497: 0x92b1, - 0x1498: 0x92d9, 0x1499: 0x9301, 0x149a: 0x9329, 0x149b: 0x9351, 0x149c: 0x9379, 0x149d: 0x93a1, - 0x149e: 0x93c9, 0x149f: 0x93f1, 0x14a0: 0x9419, 0x14a1: 0x9441, 0x14a2: 0x9469, 0x14a3: 0x9491, - 0x14a4: 0x94b9, 0x14a5: 0x94e1, 0x14a6: 0x9509, 0x14a7: 0x9531, 0x14a8: 0x90c9, 0x14a9: 0x9559, - 0x14aa: 0x9581, 0x14ab: 0x95a9, 0x14ac: 0x95d1, 0x14ad: 0x94e1, 0x14ae: 0x9509, 0x14af: 0x9531, - 0x14b0: 0x90c9, 0x14b1: 0x90a1, 0x14b2: 0x90f1, 0x14b3: 0x8261, 0x14b4: 0x80a9, 0x14b5: 0x80d1, - 0x14b6: 0x80f9, 0x14b7: 0x94e1, 0x14b8: 0x9509, 0x14b9: 0x9531, 0x14ba: 0x8261, 0x14bb: 0x8289, - 0x14bc: 0x95f9, 0x14bd: 0x95f9, 0x14be: 0x0018, 0x14bf: 0x0018, + 0x1480: 0x1f29, 0x1481: 0x1f31, 0x1482: 0x1f39, 0x1483: 0x1f11, 0x1484: 0x1d39, 0x1485: 0x1ce9, + 0x1486: 0x1f41, 0x1487: 0x1f49, 0x1488: 0x0040, 0x1489: 0x0040, 0x148a: 0x0040, 0x148b: 0x0040, + 0x148c: 0x0040, 0x148d: 0x0040, 0x148e: 0x0040, 0x148f: 0x0040, 0x1490: 0x0040, 0x1491: 0x0040, + 0x1492: 0x0040, 0x1493: 0x0040, 0x1494: 0x0040, 0x1495: 0x0040, 0x1496: 0x0040, 0x1497: 0x0040, + 0x1498: 0x0040, 0x1499: 0x0040, 0x149a: 0x0040, 0x149b: 0x0040, 0x149c: 0x0040, 0x149d: 0x0040, + 0x149e: 0x0040, 0x149f: 0x0040, 0x14a0: 0x0040, 0x14a1: 0x0040, 0x14a2: 0x0040, 0x14a3: 0x0040, + 0x14a4: 0x0040, 0x14a5: 0x0040, 0x14a6: 0x0040, 0x14a7: 0x0040, 0x14a8: 0x0040, 0x14a9: 0x0040, + 0x14aa: 0x0040, 0x14ab: 0x0040, 0x14ac: 0x0040, 0x14ad: 0x0040, 0x14ae: 0x0040, 0x14af: 0x0040, + 0x14b0: 0x1f51, 0x14b1: 0x1f59, 0x14b2: 0x1f61, 0x14b3: 0x1f69, 0x14b4: 0x1f71, 0x14b5: 0x1f79, + 0x14b6: 0x1f81, 0x14b7: 0x1f89, 0x14b8: 0x1f91, 0x14b9: 0x1f99, 0x14ba: 0x1fa2, 0x14bb: 0x1faa, + 0x14bc: 0x1fb1, 0x14bd: 0x0018, 0x14be: 0x0040, 0x14bf: 0x0040, // Block 0x53, offset 0x14c0 - 0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040, - 0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040, - 0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x9621, 0x14d1: 0x9659, - 0x14d2: 0x9659, 0x14d3: 0x9691, 0x14d4: 0x96c9, 0x14d5: 0x9701, 0x14d6: 0x9739, 0x14d7: 0x9771, - 0x14d8: 0x97a9, 0x14d9: 0x97a9, 0x14da: 0x97e1, 0x14db: 0x9819, 0x14dc: 0x9851, 0x14dd: 0x9889, - 0x14de: 0x98c1, 0x14df: 0x98f9, 0x14e0: 0x98f9, 0x14e1: 0x9931, 0x14e2: 0x9969, 0x14e3: 0x9969, - 0x14e4: 0x99a1, 0x14e5: 0x99a1, 0x14e6: 0x99d9, 0x14e7: 0x9a11, 0x14e8: 0x9a11, 0x14e9: 0x9a49, - 0x14ea: 0x9a81, 0x14eb: 0x9a81, 0x14ec: 0x9ab9, 0x14ed: 0x9ab9, 0x14ee: 0x9af1, 0x14ef: 0x9b29, - 0x14f0: 0x9b29, 0x14f1: 0x9b61, 0x14f2: 0x9b61, 0x14f3: 0x9b99, 0x14f4: 0x9bd1, 0x14f5: 0x9c09, - 0x14f6: 0x9c41, 0x14f7: 0x9c41, 0x14f8: 0x9c79, 0x14f9: 0x9cb1, 0x14fa: 0x9ce9, 0x14fb: 0x9d21, - 0x14fc: 0x9d59, 0x14fd: 0x9d59, 0x14fe: 0x9d91, 0x14ff: 0x9dc9, + 0x14c0: 0x33c0, 0x14c1: 0x33c0, 0x14c2: 0x33c0, 0x14c3: 0x33c0, 0x14c4: 0x33c0, 0x14c5: 0x33c0, + 0x14c6: 0x33c0, 0x14c7: 0x33c0, 0x14c8: 0x33c0, 0x14c9: 0x33c0, 0x14ca: 0x33c0, 0x14cb: 0x33c0, + 0x14cc: 0x33c0, 0x14cd: 0x33c0, 0x14ce: 0x33c0, 0x14cf: 0x33c0, 0x14d0: 0x1fba, 0x14d1: 0x7d8d, + 0x14d2: 0x0040, 0x14d3: 0x1fc2, 0x14d4: 0x0122, 0x14d5: 0x1fca, 0x14d6: 0x1fd2, 0x14d7: 0x7dad, + 0x14d8: 0x7dcd, 0x14d9: 0x0040, 0x14da: 0x0040, 0x14db: 0x0040, 0x14dc: 0x0040, 0x14dd: 0x0040, + 0x14de: 0x0040, 0x14df: 0x0040, 0x14e0: 0x3308, 0x14e1: 0x3308, 0x14e2: 0x3308, 0x14e3: 0x3308, + 0x14e4: 0x3308, 0x14e5: 0x3308, 0x14e6: 0x3308, 0x14e7: 0x3308, 0x14e8: 0x3308, 0x14e9: 0x3308, + 0x14ea: 0x3308, 0x14eb: 0x3308, 0x14ec: 0x3308, 0x14ed: 0x3308, 0x14ee: 0x3308, 0x14ef: 0x3308, + 0x14f0: 0x0040, 0x14f1: 0x7ded, 0x14f2: 0x7e0d, 0x14f3: 0x1fda, 0x14f4: 0x1fda, 0x14f5: 0x072a, + 0x14f6: 0x0732, 0x14f7: 0x1fe2, 0x14f8: 0x1fea, 0x14f9: 0x7e2d, 0x14fa: 0x7e4d, 0x14fb: 0x7e6d, + 0x14fc: 0x7e2d, 0x14fd: 0x7e8d, 0x14fe: 0x7ead, 0x14ff: 0x7e8d, // Block 0x54, offset 0x1500 - 0x1500: 0xa999, 0x1501: 0xa9d1, 0x1502: 0xaa09, 0x1503: 0xa8f1, 0x1504: 0x9c09, 0x1505: 0x99d9, - 0x1506: 0xaa41, 0x1507: 0xaa79, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, - 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040, - 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, - 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, - 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, - 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, - 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, - 0x1530: 0xaab1, 0x1531: 0xaae9, 0x1532: 0xab21, 0x1533: 0xab69, 0x1534: 0xabb1, 0x1535: 0xabf9, - 0x1536: 0xac41, 0x1537: 0xac89, 0x1538: 0xacd1, 0x1539: 0xad19, 0x153a: 0xad52, 0x153b: 0xae62, - 0x153c: 0xaee1, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040, + 0x1500: 0x7ecd, 0x1501: 0x7eed, 0x1502: 0x7f0d, 0x1503: 0x7eed, 0x1504: 0x7f2d, 0x1505: 0x0018, + 0x1506: 0x0018, 0x1507: 0x1ff2, 0x1508: 0x1ffa, 0x1509: 0x7f4e, 0x150a: 0x7f6e, 0x150b: 0x7f8e, + 0x150c: 0x7fae, 0x150d: 0x1fda, 0x150e: 0x1fda, 0x150f: 0x1fda, 0x1510: 0x1fba, 0x1511: 0x7fcd, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0122, 0x1515: 0x1fc2, 0x1516: 0x1fd2, 0x1517: 0x1fca, + 0x1518: 0x7fed, 0x1519: 0x072a, 0x151a: 0x0732, 0x151b: 0x1fe2, 0x151c: 0x1fea, 0x151d: 0x7ecd, + 0x151e: 0x7f2d, 0x151f: 0x2002, 0x1520: 0x200a, 0x1521: 0x2012, 0x1522: 0x071a, 0x1523: 0x2019, + 0x1524: 0x2022, 0x1525: 0x202a, 0x1526: 0x0722, 0x1527: 0x0040, 0x1528: 0x2032, 0x1529: 0x203a, + 0x152a: 0x2042, 0x152b: 0x204a, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x800e, 0x1531: 0x2051, 0x1532: 0x802e, 0x1533: 0x0808, 0x1534: 0x804e, 0x1535: 0x0040, + 0x1536: 0x806e, 0x1537: 0x2059, 0x1538: 0x808e, 0x1539: 0x2061, 0x153a: 0x80ae, 0x153b: 0x2069, + 0x153c: 0x80ce, 0x153d: 0x2071, 0x153e: 0x80ee, 0x153f: 0x2079, // Block 0x55, offset 0x1540 - 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, - 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, - 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaf2a, 0x1551: 0x7d8d, - 0x1552: 0x0040, 0x1553: 0xaf3a, 0x1554: 0x03c2, 0x1555: 0xaf4a, 0x1556: 0xaf5a, 0x1557: 0x7dad, - 0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, - 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, - 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, - 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, - 0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0xaf6a, 0x1574: 0xaf6a, 0x1575: 0x1fd2, - 0x1576: 0x1fe2, 0x1577: 0xaf7a, 0x1578: 0xaf8a, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d, - 0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d, + 0x1540: 0x2081, 0x1541: 0x2089, 0x1542: 0x2089, 0x1543: 0x2091, 0x1544: 0x2091, 0x1545: 0x2099, + 0x1546: 0x2099, 0x1547: 0x20a1, 0x1548: 0x20a1, 0x1549: 0x20a9, 0x154a: 0x20a9, 0x154b: 0x20a9, + 0x154c: 0x20a9, 0x154d: 0x20b1, 0x154e: 0x20b1, 0x154f: 0x20b9, 0x1550: 0x20b9, 0x1551: 0x20b9, + 0x1552: 0x20b9, 0x1553: 0x20c1, 0x1554: 0x20c1, 0x1555: 0x20c9, 0x1556: 0x20c9, 0x1557: 0x20c9, + 0x1558: 0x20c9, 0x1559: 0x20d1, 0x155a: 0x20d1, 0x155b: 0x20d1, 0x155c: 0x20d1, 0x155d: 0x20d9, + 0x155e: 0x20d9, 0x155f: 0x20d9, 0x1560: 0x20d9, 0x1561: 0x20e1, 0x1562: 0x20e1, 0x1563: 0x20e1, + 0x1564: 0x20e1, 0x1565: 0x20e9, 0x1566: 0x20e9, 0x1567: 0x20e9, 0x1568: 0x20e9, 0x1569: 0x20f1, + 0x156a: 0x20f1, 0x156b: 0x20f9, 0x156c: 0x20f9, 0x156d: 0x2101, 0x156e: 0x2101, 0x156f: 0x2109, + 0x1570: 0x2109, 0x1571: 0x2111, 0x1572: 0x2111, 0x1573: 0x2111, 0x1574: 0x2111, 0x1575: 0x2119, + 0x1576: 0x2119, 0x1577: 0x2119, 0x1578: 0x2119, 0x1579: 0x2121, 0x157a: 0x2121, 0x157b: 0x2121, + 0x157c: 0x2121, 0x157d: 0x2129, 0x157e: 0x2129, 0x157f: 0x2129, // Block 0x56, offset 0x1580 - 0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018, - 0x1586: 0x0018, 0x1587: 0xaf9a, 0x1588: 0xafaa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e, - 0x158c: 0x7fae, 0x158d: 0xaf6a, 0x158e: 0xaf6a, 0x158f: 0xaf6a, 0x1590: 0xaf2a, 0x1591: 0x7fcd, - 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaf3a, 0x1596: 0xaf5a, 0x1597: 0xaf4a, - 0x1598: 0x7fed, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf7a, 0x159c: 0xaf8a, 0x159d: 0x7ecd, - 0x159e: 0x7f2d, 0x159f: 0xafba, 0x15a0: 0xafca, 0x15a1: 0xafda, 0x15a2: 0x1fb2, 0x15a3: 0xafe9, - 0x15a4: 0xaffa, 0x15a5: 0xb00a, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xb01a, 0x15a9: 0xb02a, - 0x15aa: 0xb03a, 0x15ab: 0xb04a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, - 0x15b0: 0x800e, 0x15b1: 0xb059, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040, - 0x15b6: 0x806e, 0x15b7: 0xb081, 0x15b8: 0x808e, 0x15b9: 0xb0a9, 0x15ba: 0x80ae, 0x15bb: 0xb0d1, - 0x15bc: 0x80ce, 0x15bd: 0xb0f9, 0x15be: 0x80ee, 0x15bf: 0xb121, + 0x1580: 0x2129, 0x1581: 0x2131, 0x1582: 0x2131, 0x1583: 0x2131, 0x1584: 0x2131, 0x1585: 0x2139, + 0x1586: 0x2139, 0x1587: 0x2139, 0x1588: 0x2139, 0x1589: 0x2141, 0x158a: 0x2141, 0x158b: 0x2141, + 0x158c: 0x2141, 0x158d: 0x2149, 0x158e: 0x2149, 0x158f: 0x2149, 0x1590: 0x2149, 0x1591: 0x2151, + 0x1592: 0x2151, 0x1593: 0x2151, 0x1594: 0x2151, 0x1595: 0x2159, 0x1596: 0x2159, 0x1597: 0x2159, + 0x1598: 0x2159, 0x1599: 0x2161, 0x159a: 0x2161, 0x159b: 0x2161, 0x159c: 0x2161, 0x159d: 0x2169, + 0x159e: 0x2169, 0x159f: 0x2169, 0x15a0: 0x2169, 0x15a1: 0x2171, 0x15a2: 0x2171, 0x15a3: 0x2171, + 0x15a4: 0x2171, 0x15a5: 0x2179, 0x15a6: 0x2179, 0x15a7: 0x2179, 0x15a8: 0x2179, 0x15a9: 0x2181, + 0x15aa: 0x2181, 0x15ab: 0x2181, 0x15ac: 0x2181, 0x15ad: 0x2189, 0x15ae: 0x2189, 0x15af: 0x1701, + 0x15b0: 0x1701, 0x15b1: 0x2191, 0x15b2: 0x2191, 0x15b3: 0x2191, 0x15b4: 0x2191, 0x15b5: 0x2199, + 0x15b6: 0x2199, 0x15b7: 0x21a1, 0x15b8: 0x21a1, 0x15b9: 0x21a9, 0x15ba: 0x21a9, 0x15bb: 0x21b1, + 0x15bc: 0x21b1, 0x15bd: 0x0040, 0x15be: 0x0040, 0x15bf: 0x03c0, // Block 0x57, offset 0x15c0 - 0x15c0: 0xb149, 0x15c1: 0xb161, 0x15c2: 0xb161, 0x15c3: 0xb179, 0x15c4: 0xb179, 0x15c5: 0xb191, - 0x15c6: 0xb191, 0x15c7: 0xb1a9, 0x15c8: 0xb1a9, 0x15c9: 0xb1c1, 0x15ca: 0xb1c1, 0x15cb: 0xb1c1, - 0x15cc: 0xb1c1, 0x15cd: 0xb1d9, 0x15ce: 0xb1d9, 0x15cf: 0xb1f1, 0x15d0: 0xb1f1, 0x15d1: 0xb1f1, - 0x15d2: 0xb1f1, 0x15d3: 0xb209, 0x15d4: 0xb209, 0x15d5: 0xb221, 0x15d6: 0xb221, 0x15d7: 0xb221, - 0x15d8: 0xb221, 0x15d9: 0xb239, 0x15da: 0xb239, 0x15db: 0xb239, 0x15dc: 0xb239, 0x15dd: 0xb251, - 0x15de: 0xb251, 0x15df: 0xb251, 0x15e0: 0xb251, 0x15e1: 0xb269, 0x15e2: 0xb269, 0x15e3: 0xb269, - 0x15e4: 0xb269, 0x15e5: 0xb281, 0x15e6: 0xb281, 0x15e7: 0xb281, 0x15e8: 0xb281, 0x15e9: 0xb299, - 0x15ea: 0xb299, 0x15eb: 0xb2b1, 0x15ec: 0xb2b1, 0x15ed: 0xb2c9, 0x15ee: 0xb2c9, 0x15ef: 0xb2e1, - 0x15f0: 0xb2e1, 0x15f1: 0xb2f9, 0x15f2: 0xb2f9, 0x15f3: 0xb2f9, 0x15f4: 0xb2f9, 0x15f5: 0xb311, - 0x15f6: 0xb311, 0x15f7: 0xb311, 0x15f8: 0xb311, 0x15f9: 0xb329, 0x15fa: 0xb329, 0x15fb: 0xb329, - 0x15fc: 0xb329, 0x15fd: 0xb341, 0x15fe: 0xb341, 0x15ff: 0xb341, + 0x15c0: 0x0040, 0x15c1: 0x1fca, 0x15c2: 0x21ba, 0x15c3: 0x2002, 0x15c4: 0x203a, 0x15c5: 0x2042, + 0x15c6: 0x200a, 0x15c7: 0x21c2, 0x15c8: 0x072a, 0x15c9: 0x0732, 0x15ca: 0x2012, 0x15cb: 0x071a, + 0x15cc: 0x1fba, 0x15cd: 0x2019, 0x15ce: 0x0961, 0x15cf: 0x21ca, 0x15d0: 0x06e1, 0x15d1: 0x0049, + 0x15d2: 0x0029, 0x15d3: 0x0031, 0x15d4: 0x06e9, 0x15d5: 0x06f1, 0x15d6: 0x06f9, 0x15d7: 0x0701, + 0x15d8: 0x0709, 0x15d9: 0x0711, 0x15da: 0x1fc2, 0x15db: 0x0122, 0x15dc: 0x2022, 0x15dd: 0x0722, + 0x15de: 0x202a, 0x15df: 0x1fd2, 0x15e0: 0x204a, 0x15e1: 0x0019, 0x15e2: 0x02e9, 0x15e3: 0x03d9, + 0x15e4: 0x02f1, 0x15e5: 0x02f9, 0x15e6: 0x03f1, 0x15e7: 0x0309, 0x15e8: 0x00a9, 0x15e9: 0x0311, + 0x15ea: 0x00b1, 0x15eb: 0x0319, 0x15ec: 0x0101, 0x15ed: 0x0321, 0x15ee: 0x0329, 0x15ef: 0x0051, + 0x15f0: 0x0339, 0x15f1: 0x0751, 0x15f2: 0x00b9, 0x15f3: 0x0089, 0x15f4: 0x0341, 0x15f5: 0x0349, + 0x15f6: 0x0391, 0x15f7: 0x00c1, 0x15f8: 0x0109, 0x15f9: 0x00c9, 0x15fa: 0x04b1, 0x15fb: 0x1ff2, + 0x15fc: 0x2032, 0x15fd: 0x1ffa, 0x15fe: 0x21d2, 0x15ff: 0x1fda, // Block 0x58, offset 0x1600 - 0x1600: 0xb341, 0x1601: 0xb359, 0x1602: 0xb359, 0x1603: 0xb359, 0x1604: 0xb359, 0x1605: 0xb371, - 0x1606: 0xb371, 0x1607: 0xb371, 0x1608: 0xb371, 0x1609: 0xb389, 0x160a: 0xb389, 0x160b: 0xb389, - 0x160c: 0xb389, 0x160d: 0xb3a1, 0x160e: 0xb3a1, 0x160f: 0xb3a1, 0x1610: 0xb3a1, 0x1611: 0xb3b9, - 0x1612: 0xb3b9, 0x1613: 0xb3b9, 0x1614: 0xb3b9, 0x1615: 0xb3d1, 0x1616: 0xb3d1, 0x1617: 0xb3d1, - 0x1618: 0xb3d1, 0x1619: 0xb3e9, 0x161a: 0xb3e9, 0x161b: 0xb3e9, 0x161c: 0xb3e9, 0x161d: 0xb401, - 0x161e: 0xb401, 0x161f: 0xb401, 0x1620: 0xb401, 0x1621: 0xb419, 0x1622: 0xb419, 0x1623: 0xb419, - 0x1624: 0xb419, 0x1625: 0xb431, 0x1626: 0xb431, 0x1627: 0xb431, 0x1628: 0xb431, 0x1629: 0xb449, - 0x162a: 0xb449, 0x162b: 0xb449, 0x162c: 0xb449, 0x162d: 0xb461, 0x162e: 0xb461, 0x162f: 0x7b01, - 0x1630: 0x7b01, 0x1631: 0xb479, 0x1632: 0xb479, 0x1633: 0xb479, 0x1634: 0xb479, 0x1635: 0xb491, - 0x1636: 0xb491, 0x1637: 0xb4b9, 0x1638: 0xb4b9, 0x1639: 0xb4e1, 0x163a: 0xb4e1, 0x163b: 0xb509, - 0x163c: 0xb509, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + 0x1600: 0x0672, 0x1601: 0x0019, 0x1602: 0x02e9, 0x1603: 0x03d9, 0x1604: 0x02f1, 0x1605: 0x02f9, + 0x1606: 0x03f1, 0x1607: 0x0309, 0x1608: 0x00a9, 0x1609: 0x0311, 0x160a: 0x00b1, 0x160b: 0x0319, + 0x160c: 0x0101, 0x160d: 0x0321, 0x160e: 0x0329, 0x160f: 0x0051, 0x1610: 0x0339, 0x1611: 0x0751, + 0x1612: 0x00b9, 0x1613: 0x0089, 0x1614: 0x0341, 0x1615: 0x0349, 0x1616: 0x0391, 0x1617: 0x00c1, + 0x1618: 0x0109, 0x1619: 0x00c9, 0x161a: 0x04b1, 0x161b: 0x1fe2, 0x161c: 0x21da, 0x161d: 0x1fea, + 0x161e: 0x21e2, 0x161f: 0x810d, 0x1620: 0x812d, 0x1621: 0x0961, 0x1622: 0x814d, 0x1623: 0x814d, + 0x1624: 0x816d, 0x1625: 0x818d, 0x1626: 0x81ad, 0x1627: 0x81cd, 0x1628: 0x81ed, 0x1629: 0x820d, + 0x162a: 0x822d, 0x162b: 0x824d, 0x162c: 0x826d, 0x162d: 0x828d, 0x162e: 0x82ad, 0x162f: 0x82cd, + 0x1630: 0x82ed, 0x1631: 0x830d, 0x1632: 0x832d, 0x1633: 0x834d, 0x1634: 0x836d, 0x1635: 0x838d, + 0x1636: 0x83ad, 0x1637: 0x83cd, 0x1638: 0x83ed, 0x1639: 0x840d, 0x163a: 0x842d, 0x163b: 0x844d, + 0x163c: 0x81ed, 0x163d: 0x846d, 0x163e: 0x848d, 0x163f: 0x824d, // Block 0x59, offset 0x1640 - 0x1640: 0x0040, 0x1641: 0xaf4a, 0x1642: 0xb532, 0x1643: 0xafba, 0x1644: 0xb02a, 0x1645: 0xb03a, - 0x1646: 0xafca, 0x1647: 0xb542, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xafda, 0x164b: 0x1fb2, - 0x164c: 0xaf2a, 0x164d: 0xafe9, 0x164e: 0x29d1, 0x164f: 0xb552, 0x1650: 0x1f41, 0x1651: 0x00c9, - 0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81, - 0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaf3a, 0x165b: 0x03c2, 0x165c: 0xaffa, 0x165d: 0x1fc2, - 0x165e: 0xb00a, 0x165f: 0xaf5a, 0x1660: 0xb04a, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159, - 0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41, - 0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9, - 0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9, - 0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf9a, - 0x167c: 0xb01a, 0x167d: 0xafaa, 0x167e: 0xb562, 0x167f: 0xaf6a, + 0x1640: 0x84ad, 0x1641: 0x84cd, 0x1642: 0x84ed, 0x1643: 0x850d, 0x1644: 0x852d, 0x1645: 0x854d, + 0x1646: 0x856d, 0x1647: 0x858d, 0x1648: 0x850d, 0x1649: 0x85ad, 0x164a: 0x850d, 0x164b: 0x85cd, + 0x164c: 0x85cd, 0x164d: 0x85ed, 0x164e: 0x85ed, 0x164f: 0x860d, 0x1650: 0x854d, 0x1651: 0x862d, + 0x1652: 0x864d, 0x1653: 0x862d, 0x1654: 0x866d, 0x1655: 0x864d, 0x1656: 0x868d, 0x1657: 0x868d, + 0x1658: 0x86ad, 0x1659: 0x86ad, 0x165a: 0x86cd, 0x165b: 0x86cd, 0x165c: 0x864d, 0x165d: 0x814d, + 0x165e: 0x86ed, 0x165f: 0x870d, 0x1660: 0x0040, 0x1661: 0x872d, 0x1662: 0x874d, 0x1663: 0x876d, + 0x1664: 0x878d, 0x1665: 0x876d, 0x1666: 0x87ad, 0x1667: 0x87cd, 0x1668: 0x87ed, 0x1669: 0x87ed, + 0x166a: 0x880d, 0x166b: 0x880d, 0x166c: 0x882d, 0x166d: 0x882d, 0x166e: 0x880d, 0x166f: 0x880d, + 0x1670: 0x884d, 0x1671: 0x886d, 0x1672: 0x888d, 0x1673: 0x88ad, 0x1674: 0x88cd, 0x1675: 0x88ed, + 0x1676: 0x88ed, 0x1677: 0x88ed, 0x1678: 0x890d, 0x1679: 0x890d, 0x167a: 0x890d, 0x167b: 0x890d, + 0x167c: 0x87ed, 0x167d: 0x87ed, 0x167e: 0x87ed, 0x167f: 0x0040, // Block 0x5a, offset 0x1680 - 0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09, - 0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51, - 0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039, - 0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279, - 0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf7a, 0x169c: 0xb572, 0x169d: 0xaf8a, - 0x169e: 0xb582, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x29d1, 0x16a2: 0x814d, 0x16a3: 0x814d, - 0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d, - 0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd, - 0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d, - 0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d, - 0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d, + 0x1680: 0x0040, 0x1681: 0x0040, 0x1682: 0x874d, 0x1683: 0x872d, 0x1684: 0x892d, 0x1685: 0x872d, + 0x1686: 0x874d, 0x1687: 0x872d, 0x1688: 0x0040, 0x1689: 0x0040, 0x168a: 0x894d, 0x168b: 0x874d, + 0x168c: 0x896d, 0x168d: 0x892d, 0x168e: 0x896d, 0x168f: 0x874d, 0x1690: 0x0040, 0x1691: 0x0040, + 0x1692: 0x898d, 0x1693: 0x89ad, 0x1694: 0x88ad, 0x1695: 0x896d, 0x1696: 0x892d, 0x1697: 0x896d, + 0x1698: 0x0040, 0x1699: 0x0040, 0x169a: 0x89cd, 0x169b: 0x89ed, 0x169c: 0x89cd, 0x169d: 0x0040, + 0x169e: 0x0040, 0x169f: 0x0040, 0x16a0: 0x21e9, 0x16a1: 0x21f1, 0x16a2: 0x21f9, 0x16a3: 0x8a0e, + 0x16a4: 0x2201, 0x16a5: 0x2209, 0x16a6: 0x8a2d, 0x16a7: 0x0040, 0x16a8: 0x8a4d, 0x16a9: 0x8a6d, + 0x16aa: 0x8a8d, 0x16ab: 0x8a6d, 0x16ac: 0x8aad, 0x16ad: 0x8acd, 0x16ae: 0x8aed, 0x16af: 0x0040, + 0x16b0: 0x0040, 0x16b1: 0x0040, 0x16b2: 0x0040, 0x16b3: 0x0040, 0x16b4: 0x0040, 0x16b5: 0x0040, + 0x16b6: 0x0040, 0x16b7: 0x0040, 0x16b8: 0x0040, 0x16b9: 0x0340, 0x16ba: 0x0340, 0x16bb: 0x0340, + 0x16bc: 0x0040, 0x16bd: 0x0040, 0x16be: 0x0040, 0x16bf: 0x0040, // Block 0x5b, offset 0x16c0 - 0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d, - 0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd, - 0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d, - 0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d, - 0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d, - 0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d, - 0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed, - 0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d, - 0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed, - 0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d, - 0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040, + 0x16c0: 0x0a08, 0x16c1: 0x0a08, 0x16c2: 0x0a08, 0x16c3: 0x0a08, 0x16c4: 0x0a08, 0x16c5: 0x0c08, + 0x16c6: 0x0808, 0x16c7: 0x0c08, 0x16c8: 0x0818, 0x16c9: 0x0c08, 0x16ca: 0x0c08, 0x16cb: 0x0808, + 0x16cc: 0x0808, 0x16cd: 0x0908, 0x16ce: 0x0c08, 0x16cf: 0x0c08, 0x16d0: 0x0c08, 0x16d1: 0x0c08, + 0x16d2: 0x0c08, 0x16d3: 0x0a08, 0x16d4: 0x0a08, 0x16d5: 0x0a08, 0x16d6: 0x0a08, 0x16d7: 0x0908, + 0x16d8: 0x0a08, 0x16d9: 0x0a08, 0x16da: 0x0a08, 0x16db: 0x0a08, 0x16dc: 0x0a08, 0x16dd: 0x0c08, + 0x16de: 0x0a08, 0x16df: 0x0a08, 0x16e0: 0x0a08, 0x16e1: 0x0c08, 0x16e2: 0x0808, 0x16e3: 0x0808, + 0x16e4: 0x0c08, 0x16e5: 0x3308, 0x16e6: 0x3308, 0x16e7: 0x0040, 0x16e8: 0x0040, 0x16e9: 0x0040, + 0x16ea: 0x0040, 0x16eb: 0x0a18, 0x16ec: 0x0a18, 0x16ed: 0x0a18, 0x16ee: 0x0a18, 0x16ef: 0x0c18, + 0x16f0: 0x0818, 0x16f1: 0x0818, 0x16f2: 0x0818, 0x16f3: 0x0818, 0x16f4: 0x0818, 0x16f5: 0x0818, + 0x16f6: 0x0818, 0x16f7: 0x0040, 0x16f8: 0x0040, 0x16f9: 0x0040, 0x16fa: 0x0040, 0x16fb: 0x0040, + 0x16fc: 0x0040, 0x16fd: 0x0040, 0x16fe: 0x0040, 0x16ff: 0x0040, // Block 0x5c, offset 0x1700 - 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d, - 0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d, - 0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040, - 0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d, - 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040, - 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb591, 0x1721: 0xb5a9, 0x1722: 0xb5c1, 0x1723: 0x8a0e, - 0x1724: 0xb5d9, 0x1725: 0xb5f1, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d, - 0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040, + 0x1700: 0x0a08, 0x1701: 0x0c08, 0x1702: 0x0a08, 0x1703: 0x0c08, 0x1704: 0x0c08, 0x1705: 0x0c08, + 0x1706: 0x0a08, 0x1707: 0x0a08, 0x1708: 0x0a08, 0x1709: 0x0c08, 0x170a: 0x0a08, 0x170b: 0x0a08, + 0x170c: 0x0c08, 0x170d: 0x0a08, 0x170e: 0x0c08, 0x170f: 0x0c08, 0x1710: 0x0a08, 0x1711: 0x0c08, + 0x1712: 0x0040, 0x1713: 0x0040, 0x1714: 0x0040, 0x1715: 0x0040, 0x1716: 0x0040, 0x1717: 0x0040, + 0x1718: 0x0040, 0x1719: 0x0818, 0x171a: 0x0818, 0x171b: 0x0818, 0x171c: 0x0818, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x0040, 0x1721: 0x0040, 0x1722: 0x0040, 0x1723: 0x0040, + 0x1724: 0x0040, 0x1725: 0x0040, 0x1726: 0x0040, 0x1727: 0x0040, 0x1728: 0x0040, 0x1729: 0x0c18, + 0x172a: 0x0c18, 0x172b: 0x0c18, 0x172c: 0x0c18, 0x172d: 0x0a18, 0x172e: 0x0a18, 0x172f: 0x0818, 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, - 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0040, 0x173a: 0x0040, 0x173b: 0x0040, 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, // Block 0x5d, offset 0x1740 - 0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08, - 0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808, - 0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08, - 0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908, - 0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08, - 0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808, - 0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, - 0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18, - 0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818, - 0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040, - 0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040, + 0x1740: 0x3308, 0x1741: 0x3308, 0x1742: 0x3008, 0x1743: 0x3008, 0x1744: 0x0040, 0x1745: 0x0008, + 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, + 0x174c: 0x0008, 0x174d: 0x0040, 0x174e: 0x0040, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0040, + 0x1752: 0x0040, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, + 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, + 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, + 0x1764: 0x0008, 0x1765: 0x0008, 0x1766: 0x0008, 0x1767: 0x0008, 0x1768: 0x0008, 0x1769: 0x0040, + 0x176a: 0x0008, 0x176b: 0x0008, 0x176c: 0x0008, 0x176d: 0x0008, 0x176e: 0x0008, 0x176f: 0x0008, + 0x1770: 0x0008, 0x1771: 0x0040, 0x1772: 0x0008, 0x1773: 0x0008, 0x1774: 0x0040, 0x1775: 0x0008, + 0x1776: 0x0008, 0x1777: 0x0008, 0x1778: 0x0008, 0x1779: 0x0008, 0x177a: 0x0040, 0x177b: 0x3308, + 0x177c: 0x3308, 0x177d: 0x0008, 0x177e: 0x3008, 0x177f: 0x3008, // Block 0x5e, offset 0x1780 - 0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08, - 0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08, - 0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08, - 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040, - 0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040, - 0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040, - 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18, - 0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818, - 0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040, + 0x1780: 0x3308, 0x1781: 0x3008, 0x1782: 0x3008, 0x1783: 0x3008, 0x1784: 0x3008, 0x1785: 0x0040, + 0x1786: 0x0040, 0x1787: 0x3008, 0x1788: 0x3008, 0x1789: 0x0040, 0x178a: 0x0040, 0x178b: 0x3008, + 0x178c: 0x3008, 0x178d: 0x3808, 0x178e: 0x0040, 0x178f: 0x0040, 0x1790: 0x0008, 0x1791: 0x0040, + 0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x3008, + 0x1798: 0x0040, 0x1799: 0x0040, 0x179a: 0x0040, 0x179b: 0x0040, 0x179c: 0x0040, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x3008, 0x17a3: 0x3008, + 0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x3308, 0x17a7: 0x3308, 0x17a8: 0x3308, 0x17a9: 0x3308, + 0x17aa: 0x3308, 0x17ab: 0x3308, 0x17ac: 0x3308, 0x17ad: 0x0040, 0x17ae: 0x0040, 0x17af: 0x0040, + 0x17b0: 0x3308, 0x17b1: 0x3308, 0x17b2: 0x3308, 0x17b3: 0x3308, 0x17b4: 0x3308, 0x17b5: 0x0040, 0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040, 0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, // Block 0x5f, offset 0x17c0 - 0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008, - 0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008, - 0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040, - 0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008, + 0x17c0: 0x0008, 0x17c1: 0x0008, 0x17c2: 0x0008, 0x17c3: 0x0008, 0x17c4: 0x0008, 0x17c5: 0x0008, + 0x17c6: 0x0008, 0x17c7: 0x0040, 0x17c8: 0x0040, 0x17c9: 0x0008, 0x17ca: 0x0040, 0x17cb: 0x0040, + 0x17cc: 0x0008, 0x17cd: 0x0008, 0x17ce: 0x0008, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0008, + 0x17d2: 0x0008, 0x17d3: 0x0008, 0x17d4: 0x0040, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0040, 0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008, 0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008, - 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040, + 0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0008, 0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008, - 0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008, - 0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x3308, - 0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008, + 0x17f0: 0x3008, 0x17f1: 0x3008, 0x17f2: 0x3008, 0x17f3: 0x3008, 0x17f4: 0x3008, 0x17f5: 0x3008, + 0x17f6: 0x0040, 0x17f7: 0x3008, 0x17f8: 0x3008, 0x17f9: 0x0040, 0x17fa: 0x0040, 0x17fb: 0x3308, + 0x17fc: 0x3308, 0x17fd: 0x3808, 0x17fe: 0x3b08, 0x17ff: 0x0008, // Block 0x60, offset 0x1800 - 0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040, - 0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008, - 0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040, - 0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008, - 0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008, - 0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008, - 0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308, - 0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040, - 0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040, - 0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, - 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + 0x1800: 0x0019, 0x1801: 0x02e9, 0x1802: 0x03d9, 0x1803: 0x02f1, 0x1804: 0x02f9, 0x1805: 0x03f1, + 0x1806: 0x0309, 0x1807: 0x00a9, 0x1808: 0x0311, 0x1809: 0x00b1, 0x180a: 0x0319, 0x180b: 0x0101, + 0x180c: 0x0321, 0x180d: 0x0329, 0x180e: 0x0051, 0x180f: 0x0339, 0x1810: 0x0751, 0x1811: 0x00b9, + 0x1812: 0x0089, 0x1813: 0x0341, 0x1814: 0x0349, 0x1815: 0x0391, 0x1816: 0x00c1, 0x1817: 0x0109, + 0x1818: 0x00c9, 0x1819: 0x04b1, 0x181a: 0x0019, 0x181b: 0x02e9, 0x181c: 0x03d9, 0x181d: 0x02f1, + 0x181e: 0x02f9, 0x181f: 0x03f1, 0x1820: 0x0309, 0x1821: 0x00a9, 0x1822: 0x0311, 0x1823: 0x00b1, + 0x1824: 0x0319, 0x1825: 0x0101, 0x1826: 0x0321, 0x1827: 0x0329, 0x1828: 0x0051, 0x1829: 0x0339, + 0x182a: 0x0751, 0x182b: 0x00b9, 0x182c: 0x0089, 0x182d: 0x0341, 0x182e: 0x0349, 0x182f: 0x0391, + 0x1830: 0x00c1, 0x1831: 0x0109, 0x1832: 0x00c9, 0x1833: 0x04b1, 0x1834: 0x0019, 0x1835: 0x02e9, + 0x1836: 0x03d9, 0x1837: 0x02f1, 0x1838: 0x02f9, 0x1839: 0x03f1, 0x183a: 0x0309, 0x183b: 0x00a9, + 0x183c: 0x0311, 0x183d: 0x00b1, 0x183e: 0x0319, 0x183f: 0x0101, // Block 0x61, offset 0x1840 - 0x1840: 0x0008, 0x1841: 0x0008, 0x1842: 0x0008, 0x1843: 0x0008, 0x1844: 0x0008, 0x1845: 0x0008, - 0x1846: 0x0008, 0x1847: 0x0040, 0x1848: 0x0040, 0x1849: 0x0008, 0x184a: 0x0040, 0x184b: 0x0040, - 0x184c: 0x0008, 0x184d: 0x0008, 0x184e: 0x0008, 0x184f: 0x0008, 0x1850: 0x0008, 0x1851: 0x0008, - 0x1852: 0x0008, 0x1853: 0x0008, 0x1854: 0x0040, 0x1855: 0x0008, 0x1856: 0x0008, 0x1857: 0x0040, - 0x1858: 0x0008, 0x1859: 0x0008, 0x185a: 0x0008, 0x185b: 0x0008, 0x185c: 0x0008, 0x185d: 0x0008, - 0x185e: 0x0008, 0x185f: 0x0008, 0x1860: 0x0008, 0x1861: 0x0008, 0x1862: 0x0008, 0x1863: 0x0008, - 0x1864: 0x0008, 0x1865: 0x0008, 0x1866: 0x0008, 0x1867: 0x0008, 0x1868: 0x0008, 0x1869: 0x0008, - 0x186a: 0x0008, 0x186b: 0x0008, 0x186c: 0x0008, 0x186d: 0x0008, 0x186e: 0x0008, 0x186f: 0x0008, - 0x1870: 0x3008, 0x1871: 0x3008, 0x1872: 0x3008, 0x1873: 0x3008, 0x1874: 0x3008, 0x1875: 0x3008, - 0x1876: 0x0040, 0x1877: 0x3008, 0x1878: 0x3008, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x3308, - 0x187c: 0x3308, 0x187d: 0x3808, 0x187e: 0x3b08, 0x187f: 0x0008, + 0x1840: 0x0321, 0x1841: 0x0329, 0x1842: 0x0051, 0x1843: 0x0339, 0x1844: 0x0751, 0x1845: 0x00b9, + 0x1846: 0x0089, 0x1847: 0x0341, 0x1848: 0x0349, 0x1849: 0x0391, 0x184a: 0x00c1, 0x184b: 0x0109, + 0x184c: 0x00c9, 0x184d: 0x04b1, 0x184e: 0x0019, 0x184f: 0x02e9, 0x1850: 0x03d9, 0x1851: 0x02f1, + 0x1852: 0x02f9, 0x1853: 0x03f1, 0x1854: 0x0309, 0x1855: 0x0040, 0x1856: 0x0311, 0x1857: 0x00b1, + 0x1858: 0x0319, 0x1859: 0x0101, 0x185a: 0x0321, 0x185b: 0x0329, 0x185c: 0x0051, 0x185d: 0x0339, + 0x185e: 0x0751, 0x185f: 0x00b9, 0x1860: 0x0089, 0x1861: 0x0341, 0x1862: 0x0349, 0x1863: 0x0391, + 0x1864: 0x00c1, 0x1865: 0x0109, 0x1866: 0x00c9, 0x1867: 0x04b1, 0x1868: 0x0019, 0x1869: 0x02e9, + 0x186a: 0x03d9, 0x186b: 0x02f1, 0x186c: 0x02f9, 0x186d: 0x03f1, 0x186e: 0x0309, 0x186f: 0x00a9, + 0x1870: 0x0311, 0x1871: 0x00b1, 0x1872: 0x0319, 0x1873: 0x0101, 0x1874: 0x0321, 0x1875: 0x0329, + 0x1876: 0x0051, 0x1877: 0x0339, 0x1878: 0x0751, 0x1879: 0x00b9, 0x187a: 0x0089, 0x187b: 0x0341, + 0x187c: 0x0349, 0x187d: 0x0391, 0x187e: 0x00c1, 0x187f: 0x0109, // Block 0x62, offset 0x1880 - 0x1880: 0x0039, 0x1881: 0x0ee9, 0x1882: 0x1159, 0x1883: 0x0ef9, 0x1884: 0x0f09, 0x1885: 0x1199, - 0x1886: 0x0f31, 0x1887: 0x0249, 0x1888: 0x0f41, 0x1889: 0x0259, 0x188a: 0x0f51, 0x188b: 0x0359, - 0x188c: 0x0f61, 0x188d: 0x0f71, 0x188e: 0x00d9, 0x188f: 0x0f99, 0x1890: 0x2039, 0x1891: 0x0269, - 0x1892: 0x01d9, 0x1893: 0x0fa9, 0x1894: 0x0fb9, 0x1895: 0x1089, 0x1896: 0x0279, 0x1897: 0x0369, - 0x1898: 0x0289, 0x1899: 0x13d1, 0x189a: 0x0039, 0x189b: 0x0ee9, 0x189c: 0x1159, 0x189d: 0x0ef9, - 0x189e: 0x0f09, 0x189f: 0x1199, 0x18a0: 0x0f31, 0x18a1: 0x0249, 0x18a2: 0x0f41, 0x18a3: 0x0259, - 0x18a4: 0x0f51, 0x18a5: 0x0359, 0x18a6: 0x0f61, 0x18a7: 0x0f71, 0x18a8: 0x00d9, 0x18a9: 0x0f99, - 0x18aa: 0x2039, 0x18ab: 0x0269, 0x18ac: 0x01d9, 0x18ad: 0x0fa9, 0x18ae: 0x0fb9, 0x18af: 0x1089, - 0x18b0: 0x0279, 0x18b1: 0x0369, 0x18b2: 0x0289, 0x18b3: 0x13d1, 0x18b4: 0x0039, 0x18b5: 0x0ee9, - 0x18b6: 0x1159, 0x18b7: 0x0ef9, 0x18b8: 0x0f09, 0x18b9: 0x1199, 0x18ba: 0x0f31, 0x18bb: 0x0249, - 0x18bc: 0x0f41, 0x18bd: 0x0259, 0x18be: 0x0f51, 0x18bf: 0x0359, + 0x1880: 0x00c9, 0x1881: 0x04b1, 0x1882: 0x0019, 0x1883: 0x02e9, 0x1884: 0x03d9, 0x1885: 0x02f1, + 0x1886: 0x02f9, 0x1887: 0x03f1, 0x1888: 0x0309, 0x1889: 0x00a9, 0x188a: 0x0311, 0x188b: 0x00b1, + 0x188c: 0x0319, 0x188d: 0x0101, 0x188e: 0x0321, 0x188f: 0x0329, 0x1890: 0x0051, 0x1891: 0x0339, + 0x1892: 0x0751, 0x1893: 0x00b9, 0x1894: 0x0089, 0x1895: 0x0341, 0x1896: 0x0349, 0x1897: 0x0391, + 0x1898: 0x00c1, 0x1899: 0x0109, 0x189a: 0x00c9, 0x189b: 0x04b1, 0x189c: 0x0019, 0x189d: 0x0040, + 0x189e: 0x03d9, 0x189f: 0x02f1, 0x18a0: 0x0040, 0x18a1: 0x0040, 0x18a2: 0x0309, 0x18a3: 0x0040, + 0x18a4: 0x0040, 0x18a5: 0x00b1, 0x18a6: 0x0319, 0x18a7: 0x0040, 0x18a8: 0x0040, 0x18a9: 0x0329, + 0x18aa: 0x0051, 0x18ab: 0x0339, 0x18ac: 0x0751, 0x18ad: 0x0040, 0x18ae: 0x0089, 0x18af: 0x0341, + 0x18b0: 0x0349, 0x18b1: 0x0391, 0x18b2: 0x00c1, 0x18b3: 0x0109, 0x18b4: 0x00c9, 0x18b5: 0x04b1, + 0x18b6: 0x0019, 0x18b7: 0x02e9, 0x18b8: 0x03d9, 0x18b9: 0x02f1, 0x18ba: 0x0040, 0x18bb: 0x03f1, + 0x18bc: 0x0040, 0x18bd: 0x00a9, 0x18be: 0x0311, 0x18bf: 0x00b1, // Block 0x63, offset 0x18c0 - 0x18c0: 0x0f61, 0x18c1: 0x0f71, 0x18c2: 0x00d9, 0x18c3: 0x0f99, 0x18c4: 0x2039, 0x18c5: 0x0269, - 0x18c6: 0x01d9, 0x18c7: 0x0fa9, 0x18c8: 0x0fb9, 0x18c9: 0x1089, 0x18ca: 0x0279, 0x18cb: 0x0369, - 0x18cc: 0x0289, 0x18cd: 0x13d1, 0x18ce: 0x0039, 0x18cf: 0x0ee9, 0x18d0: 0x1159, 0x18d1: 0x0ef9, - 0x18d2: 0x0f09, 0x18d3: 0x1199, 0x18d4: 0x0f31, 0x18d5: 0x0040, 0x18d6: 0x0f41, 0x18d7: 0x0259, - 0x18d8: 0x0f51, 0x18d9: 0x0359, 0x18da: 0x0f61, 0x18db: 0x0f71, 0x18dc: 0x00d9, 0x18dd: 0x0f99, - 0x18de: 0x2039, 0x18df: 0x0269, 0x18e0: 0x01d9, 0x18e1: 0x0fa9, 0x18e2: 0x0fb9, 0x18e3: 0x1089, - 0x18e4: 0x0279, 0x18e5: 0x0369, 0x18e6: 0x0289, 0x18e7: 0x13d1, 0x18e8: 0x0039, 0x18e9: 0x0ee9, - 0x18ea: 0x1159, 0x18eb: 0x0ef9, 0x18ec: 0x0f09, 0x18ed: 0x1199, 0x18ee: 0x0f31, 0x18ef: 0x0249, - 0x18f0: 0x0f41, 0x18f1: 0x0259, 0x18f2: 0x0f51, 0x18f3: 0x0359, 0x18f4: 0x0f61, 0x18f5: 0x0f71, - 0x18f6: 0x00d9, 0x18f7: 0x0f99, 0x18f8: 0x2039, 0x18f9: 0x0269, 0x18fa: 0x01d9, 0x18fb: 0x0fa9, - 0x18fc: 0x0fb9, 0x18fd: 0x1089, 0x18fe: 0x0279, 0x18ff: 0x0369, + 0x18c0: 0x0319, 0x18c1: 0x0101, 0x18c2: 0x0321, 0x18c3: 0x0329, 0x18c4: 0x0040, 0x18c5: 0x0339, + 0x18c6: 0x0751, 0x18c7: 0x00b9, 0x18c8: 0x0089, 0x18c9: 0x0341, 0x18ca: 0x0349, 0x18cb: 0x0391, + 0x18cc: 0x00c1, 0x18cd: 0x0109, 0x18ce: 0x00c9, 0x18cf: 0x04b1, 0x18d0: 0x0019, 0x18d1: 0x02e9, + 0x18d2: 0x03d9, 0x18d3: 0x02f1, 0x18d4: 0x02f9, 0x18d5: 0x03f1, 0x18d6: 0x0309, 0x18d7: 0x00a9, + 0x18d8: 0x0311, 0x18d9: 0x00b1, 0x18da: 0x0319, 0x18db: 0x0101, 0x18dc: 0x0321, 0x18dd: 0x0329, + 0x18de: 0x0051, 0x18df: 0x0339, 0x18e0: 0x0751, 0x18e1: 0x00b9, 0x18e2: 0x0089, 0x18e3: 0x0341, + 0x18e4: 0x0349, 0x18e5: 0x0391, 0x18e6: 0x00c1, 0x18e7: 0x0109, 0x18e8: 0x00c9, 0x18e9: 0x04b1, + 0x18ea: 0x0019, 0x18eb: 0x02e9, 0x18ec: 0x03d9, 0x18ed: 0x02f1, 0x18ee: 0x02f9, 0x18ef: 0x03f1, + 0x18f0: 0x0309, 0x18f1: 0x00a9, 0x18f2: 0x0311, 0x18f3: 0x00b1, 0x18f4: 0x0319, 0x18f5: 0x0101, + 0x18f6: 0x0321, 0x18f7: 0x0329, 0x18f8: 0x0051, 0x18f9: 0x0339, 0x18fa: 0x0751, 0x18fb: 0x00b9, + 0x18fc: 0x0089, 0x18fd: 0x0341, 0x18fe: 0x0349, 0x18ff: 0x0391, // Block 0x64, offset 0x1900 - 0x1900: 0x0289, 0x1901: 0x13d1, 0x1902: 0x0039, 0x1903: 0x0ee9, 0x1904: 0x1159, 0x1905: 0x0ef9, - 0x1906: 0x0f09, 0x1907: 0x1199, 0x1908: 0x0f31, 0x1909: 0x0249, 0x190a: 0x0f41, 0x190b: 0x0259, - 0x190c: 0x0f51, 0x190d: 0x0359, 0x190e: 0x0f61, 0x190f: 0x0f71, 0x1910: 0x00d9, 0x1911: 0x0f99, - 0x1912: 0x2039, 0x1913: 0x0269, 0x1914: 0x01d9, 0x1915: 0x0fa9, 0x1916: 0x0fb9, 0x1917: 0x1089, - 0x1918: 0x0279, 0x1919: 0x0369, 0x191a: 0x0289, 0x191b: 0x13d1, 0x191c: 0x0039, 0x191d: 0x0040, - 0x191e: 0x1159, 0x191f: 0x0ef9, 0x1920: 0x0040, 0x1921: 0x0040, 0x1922: 0x0f31, 0x1923: 0x0040, - 0x1924: 0x0040, 0x1925: 0x0259, 0x1926: 0x0f51, 0x1927: 0x0040, 0x1928: 0x0040, 0x1929: 0x0f71, - 0x192a: 0x00d9, 0x192b: 0x0f99, 0x192c: 0x2039, 0x192d: 0x0040, 0x192e: 0x01d9, 0x192f: 0x0fa9, - 0x1930: 0x0fb9, 0x1931: 0x1089, 0x1932: 0x0279, 0x1933: 0x0369, 0x1934: 0x0289, 0x1935: 0x13d1, - 0x1936: 0x0039, 0x1937: 0x0ee9, 0x1938: 0x1159, 0x1939: 0x0ef9, 0x193a: 0x0040, 0x193b: 0x1199, - 0x193c: 0x0040, 0x193d: 0x0249, 0x193e: 0x0f41, 0x193f: 0x0259, + 0x1900: 0x00c1, 0x1901: 0x0109, 0x1902: 0x00c9, 0x1903: 0x04b1, 0x1904: 0x0019, 0x1905: 0x02e9, + 0x1906: 0x0040, 0x1907: 0x02f1, 0x1908: 0x02f9, 0x1909: 0x03f1, 0x190a: 0x0309, 0x190b: 0x0040, + 0x190c: 0x0040, 0x190d: 0x00b1, 0x190e: 0x0319, 0x190f: 0x0101, 0x1910: 0x0321, 0x1911: 0x0329, + 0x1912: 0x0051, 0x1913: 0x0339, 0x1914: 0x0751, 0x1915: 0x0040, 0x1916: 0x0089, 0x1917: 0x0341, + 0x1918: 0x0349, 0x1919: 0x0391, 0x191a: 0x00c1, 0x191b: 0x0109, 0x191c: 0x00c9, 0x191d: 0x0040, + 0x191e: 0x0019, 0x191f: 0x02e9, 0x1920: 0x03d9, 0x1921: 0x02f1, 0x1922: 0x02f9, 0x1923: 0x03f1, + 0x1924: 0x0309, 0x1925: 0x00a9, 0x1926: 0x0311, 0x1927: 0x00b1, 0x1928: 0x0319, 0x1929: 0x0101, + 0x192a: 0x0321, 0x192b: 0x0329, 0x192c: 0x0051, 0x192d: 0x0339, 0x192e: 0x0751, 0x192f: 0x00b9, + 0x1930: 0x0089, 0x1931: 0x0341, 0x1932: 0x0349, 0x1933: 0x0391, 0x1934: 0x00c1, 0x1935: 0x0109, + 0x1936: 0x00c9, 0x1937: 0x04b1, 0x1938: 0x0019, 0x1939: 0x02e9, 0x193a: 0x0040, 0x193b: 0x02f1, + 0x193c: 0x02f9, 0x193d: 0x03f1, 0x193e: 0x0309, 0x193f: 0x0040, // Block 0x65, offset 0x1940 - 0x1940: 0x0f51, 0x1941: 0x0359, 0x1942: 0x0f61, 0x1943: 0x0f71, 0x1944: 0x0040, 0x1945: 0x0f99, - 0x1946: 0x2039, 0x1947: 0x0269, 0x1948: 0x01d9, 0x1949: 0x0fa9, 0x194a: 0x0fb9, 0x194b: 0x1089, - 0x194c: 0x0279, 0x194d: 0x0369, 0x194e: 0x0289, 0x194f: 0x13d1, 0x1950: 0x0039, 0x1951: 0x0ee9, - 0x1952: 0x1159, 0x1953: 0x0ef9, 0x1954: 0x0f09, 0x1955: 0x1199, 0x1956: 0x0f31, 0x1957: 0x0249, - 0x1958: 0x0f41, 0x1959: 0x0259, 0x195a: 0x0f51, 0x195b: 0x0359, 0x195c: 0x0f61, 0x195d: 0x0f71, - 0x195e: 0x00d9, 0x195f: 0x0f99, 0x1960: 0x2039, 0x1961: 0x0269, 0x1962: 0x01d9, 0x1963: 0x0fa9, - 0x1964: 0x0fb9, 0x1965: 0x1089, 0x1966: 0x0279, 0x1967: 0x0369, 0x1968: 0x0289, 0x1969: 0x13d1, - 0x196a: 0x0039, 0x196b: 0x0ee9, 0x196c: 0x1159, 0x196d: 0x0ef9, 0x196e: 0x0f09, 0x196f: 0x1199, - 0x1970: 0x0f31, 0x1971: 0x0249, 0x1972: 0x0f41, 0x1973: 0x0259, 0x1974: 0x0f51, 0x1975: 0x0359, - 0x1976: 0x0f61, 0x1977: 0x0f71, 0x1978: 0x00d9, 0x1979: 0x0f99, 0x197a: 0x2039, 0x197b: 0x0269, - 0x197c: 0x01d9, 0x197d: 0x0fa9, 0x197e: 0x0fb9, 0x197f: 0x1089, + 0x1940: 0x0311, 0x1941: 0x00b1, 0x1942: 0x0319, 0x1943: 0x0101, 0x1944: 0x0321, 0x1945: 0x0040, + 0x1946: 0x0051, 0x1947: 0x0040, 0x1948: 0x0040, 0x1949: 0x0040, 0x194a: 0x0089, 0x194b: 0x0341, + 0x194c: 0x0349, 0x194d: 0x0391, 0x194e: 0x00c1, 0x194f: 0x0109, 0x1950: 0x00c9, 0x1951: 0x0040, + 0x1952: 0x0019, 0x1953: 0x02e9, 0x1954: 0x03d9, 0x1955: 0x02f1, 0x1956: 0x02f9, 0x1957: 0x03f1, + 0x1958: 0x0309, 0x1959: 0x00a9, 0x195a: 0x0311, 0x195b: 0x00b1, 0x195c: 0x0319, 0x195d: 0x0101, + 0x195e: 0x0321, 0x195f: 0x0329, 0x1960: 0x0051, 0x1961: 0x0339, 0x1962: 0x0751, 0x1963: 0x00b9, + 0x1964: 0x0089, 0x1965: 0x0341, 0x1966: 0x0349, 0x1967: 0x0391, 0x1968: 0x00c1, 0x1969: 0x0109, + 0x196a: 0x00c9, 0x196b: 0x04b1, 0x196c: 0x0019, 0x196d: 0x02e9, 0x196e: 0x03d9, 0x196f: 0x02f1, + 0x1970: 0x02f9, 0x1971: 0x03f1, 0x1972: 0x0309, 0x1973: 0x00a9, 0x1974: 0x0311, 0x1975: 0x00b1, + 0x1976: 0x0319, 0x1977: 0x0101, 0x1978: 0x0321, 0x1979: 0x0329, 0x197a: 0x0051, 0x197b: 0x0339, + 0x197c: 0x0751, 0x197d: 0x00b9, 0x197e: 0x0089, 0x197f: 0x0341, // Block 0x66, offset 0x1980 - 0x1980: 0x0279, 0x1981: 0x0369, 0x1982: 0x0289, 0x1983: 0x13d1, 0x1984: 0x0039, 0x1985: 0x0ee9, - 0x1986: 0x0040, 0x1987: 0x0ef9, 0x1988: 0x0f09, 0x1989: 0x1199, 0x198a: 0x0f31, 0x198b: 0x0040, - 0x198c: 0x0040, 0x198d: 0x0259, 0x198e: 0x0f51, 0x198f: 0x0359, 0x1990: 0x0f61, 0x1991: 0x0f71, - 0x1992: 0x00d9, 0x1993: 0x0f99, 0x1994: 0x2039, 0x1995: 0x0040, 0x1996: 0x01d9, 0x1997: 0x0fa9, - 0x1998: 0x0fb9, 0x1999: 0x1089, 0x199a: 0x0279, 0x199b: 0x0369, 0x199c: 0x0289, 0x199d: 0x0040, - 0x199e: 0x0039, 0x199f: 0x0ee9, 0x19a0: 0x1159, 0x19a1: 0x0ef9, 0x19a2: 0x0f09, 0x19a3: 0x1199, - 0x19a4: 0x0f31, 0x19a5: 0x0249, 0x19a6: 0x0f41, 0x19a7: 0x0259, 0x19a8: 0x0f51, 0x19a9: 0x0359, - 0x19aa: 0x0f61, 0x19ab: 0x0f71, 0x19ac: 0x00d9, 0x19ad: 0x0f99, 0x19ae: 0x2039, 0x19af: 0x0269, - 0x19b0: 0x01d9, 0x19b1: 0x0fa9, 0x19b2: 0x0fb9, 0x19b3: 0x1089, 0x19b4: 0x0279, 0x19b5: 0x0369, - 0x19b6: 0x0289, 0x19b7: 0x13d1, 0x19b8: 0x0039, 0x19b9: 0x0ee9, 0x19ba: 0x0040, 0x19bb: 0x0ef9, - 0x19bc: 0x0f09, 0x19bd: 0x1199, 0x19be: 0x0f31, 0x19bf: 0x0040, + 0x1980: 0x0349, 0x1981: 0x0391, 0x1982: 0x00c1, 0x1983: 0x0109, 0x1984: 0x00c9, 0x1985: 0x04b1, + 0x1986: 0x0019, 0x1987: 0x02e9, 0x1988: 0x03d9, 0x1989: 0x02f1, 0x198a: 0x02f9, 0x198b: 0x03f1, + 0x198c: 0x0309, 0x198d: 0x00a9, 0x198e: 0x0311, 0x198f: 0x00b1, 0x1990: 0x0319, 0x1991: 0x0101, + 0x1992: 0x0321, 0x1993: 0x0329, 0x1994: 0x0051, 0x1995: 0x0339, 0x1996: 0x0751, 0x1997: 0x00b9, + 0x1998: 0x0089, 0x1999: 0x0341, 0x199a: 0x0349, 0x199b: 0x0391, 0x199c: 0x00c1, 0x199d: 0x0109, + 0x199e: 0x00c9, 0x199f: 0x04b1, 0x19a0: 0x0019, 0x19a1: 0x02e9, 0x19a2: 0x03d9, 0x19a3: 0x02f1, + 0x19a4: 0x02f9, 0x19a5: 0x03f1, 0x19a6: 0x0309, 0x19a7: 0x00a9, 0x19a8: 0x0311, 0x19a9: 0x00b1, + 0x19aa: 0x0319, 0x19ab: 0x0101, 0x19ac: 0x0321, 0x19ad: 0x0329, 0x19ae: 0x0051, 0x19af: 0x0339, + 0x19b0: 0x0751, 0x19b1: 0x00b9, 0x19b2: 0x0089, 0x19b3: 0x0341, 0x19b4: 0x0349, 0x19b5: 0x0391, + 0x19b6: 0x00c1, 0x19b7: 0x0109, 0x19b8: 0x00c9, 0x19b9: 0x04b1, 0x19ba: 0x0019, 0x19bb: 0x02e9, + 0x19bc: 0x03d9, 0x19bd: 0x02f1, 0x19be: 0x02f9, 0x19bf: 0x03f1, // Block 0x67, offset 0x19c0 - 0x19c0: 0x0f41, 0x19c1: 0x0259, 0x19c2: 0x0f51, 0x19c3: 0x0359, 0x19c4: 0x0f61, 0x19c5: 0x0040, - 0x19c6: 0x00d9, 0x19c7: 0x0040, 0x19c8: 0x0040, 0x19c9: 0x0040, 0x19ca: 0x01d9, 0x19cb: 0x0fa9, - 0x19cc: 0x0fb9, 0x19cd: 0x1089, 0x19ce: 0x0279, 0x19cf: 0x0369, 0x19d0: 0x0289, 0x19d1: 0x0040, - 0x19d2: 0x0039, 0x19d3: 0x0ee9, 0x19d4: 0x1159, 0x19d5: 0x0ef9, 0x19d6: 0x0f09, 0x19d7: 0x1199, - 0x19d8: 0x0f31, 0x19d9: 0x0249, 0x19da: 0x0f41, 0x19db: 0x0259, 0x19dc: 0x0f51, 0x19dd: 0x0359, - 0x19de: 0x0f61, 0x19df: 0x0f71, 0x19e0: 0x00d9, 0x19e1: 0x0f99, 0x19e2: 0x2039, 0x19e3: 0x0269, - 0x19e4: 0x01d9, 0x19e5: 0x0fa9, 0x19e6: 0x0fb9, 0x19e7: 0x1089, 0x19e8: 0x0279, 0x19e9: 0x0369, - 0x19ea: 0x0289, 0x19eb: 0x13d1, 0x19ec: 0x0039, 0x19ed: 0x0ee9, 0x19ee: 0x1159, 0x19ef: 0x0ef9, - 0x19f0: 0x0f09, 0x19f1: 0x1199, 0x19f2: 0x0f31, 0x19f3: 0x0249, 0x19f4: 0x0f41, 0x19f5: 0x0259, - 0x19f6: 0x0f51, 0x19f7: 0x0359, 0x19f8: 0x0f61, 0x19f9: 0x0f71, 0x19fa: 0x00d9, 0x19fb: 0x0f99, - 0x19fc: 0x2039, 0x19fd: 0x0269, 0x19fe: 0x01d9, 0x19ff: 0x0fa9, + 0x19c0: 0x0309, 0x19c1: 0x00a9, 0x19c2: 0x0311, 0x19c3: 0x00b1, 0x19c4: 0x0319, 0x19c5: 0x0101, + 0x19c6: 0x0321, 0x19c7: 0x0329, 0x19c8: 0x0051, 0x19c9: 0x0339, 0x19ca: 0x0751, 0x19cb: 0x00b9, + 0x19cc: 0x0089, 0x19cd: 0x0341, 0x19ce: 0x0349, 0x19cf: 0x0391, 0x19d0: 0x00c1, 0x19d1: 0x0109, + 0x19d2: 0x00c9, 0x19d3: 0x04b1, 0x19d4: 0x0019, 0x19d5: 0x02e9, 0x19d6: 0x03d9, 0x19d7: 0x02f1, + 0x19d8: 0x02f9, 0x19d9: 0x03f1, 0x19da: 0x0309, 0x19db: 0x00a9, 0x19dc: 0x0311, 0x19dd: 0x00b1, + 0x19de: 0x0319, 0x19df: 0x0101, 0x19e0: 0x0321, 0x19e1: 0x0329, 0x19e2: 0x0051, 0x19e3: 0x0339, + 0x19e4: 0x0751, 0x19e5: 0x00b9, 0x19e6: 0x0089, 0x19e7: 0x0341, 0x19e8: 0x0349, 0x19e9: 0x0391, + 0x19ea: 0x00c1, 0x19eb: 0x0109, 0x19ec: 0x00c9, 0x19ed: 0x04b1, 0x19ee: 0x0019, 0x19ef: 0x02e9, + 0x19f0: 0x03d9, 0x19f1: 0x02f1, 0x19f2: 0x02f9, 0x19f3: 0x03f1, 0x19f4: 0x0309, 0x19f5: 0x00a9, + 0x19f6: 0x0311, 0x19f7: 0x00b1, 0x19f8: 0x0319, 0x19f9: 0x0101, 0x19fa: 0x0321, 0x19fb: 0x0329, + 0x19fc: 0x0051, 0x19fd: 0x0339, 0x19fe: 0x0751, 0x19ff: 0x00b9, // Block 0x68, offset 0x1a00 - 0x1a00: 0x0fb9, 0x1a01: 0x1089, 0x1a02: 0x0279, 0x1a03: 0x0369, 0x1a04: 0x0289, 0x1a05: 0x13d1, - 0x1a06: 0x0039, 0x1a07: 0x0ee9, 0x1a08: 0x1159, 0x1a09: 0x0ef9, 0x1a0a: 0x0f09, 0x1a0b: 0x1199, - 0x1a0c: 0x0f31, 0x1a0d: 0x0249, 0x1a0e: 0x0f41, 0x1a0f: 0x0259, 0x1a10: 0x0f51, 0x1a11: 0x0359, - 0x1a12: 0x0f61, 0x1a13: 0x0f71, 0x1a14: 0x00d9, 0x1a15: 0x0f99, 0x1a16: 0x2039, 0x1a17: 0x0269, - 0x1a18: 0x01d9, 0x1a19: 0x0fa9, 0x1a1a: 0x0fb9, 0x1a1b: 0x1089, 0x1a1c: 0x0279, 0x1a1d: 0x0369, - 0x1a1e: 0x0289, 0x1a1f: 0x13d1, 0x1a20: 0x0039, 0x1a21: 0x0ee9, 0x1a22: 0x1159, 0x1a23: 0x0ef9, - 0x1a24: 0x0f09, 0x1a25: 0x1199, 0x1a26: 0x0f31, 0x1a27: 0x0249, 0x1a28: 0x0f41, 0x1a29: 0x0259, - 0x1a2a: 0x0f51, 0x1a2b: 0x0359, 0x1a2c: 0x0f61, 0x1a2d: 0x0f71, 0x1a2e: 0x00d9, 0x1a2f: 0x0f99, - 0x1a30: 0x2039, 0x1a31: 0x0269, 0x1a32: 0x01d9, 0x1a33: 0x0fa9, 0x1a34: 0x0fb9, 0x1a35: 0x1089, - 0x1a36: 0x0279, 0x1a37: 0x0369, 0x1a38: 0x0289, 0x1a39: 0x13d1, 0x1a3a: 0x0039, 0x1a3b: 0x0ee9, - 0x1a3c: 0x1159, 0x1a3d: 0x0ef9, 0x1a3e: 0x0f09, 0x1a3f: 0x1199, + 0x1a00: 0x0089, 0x1a01: 0x0341, 0x1a02: 0x0349, 0x1a03: 0x0391, 0x1a04: 0x00c1, 0x1a05: 0x0109, + 0x1a06: 0x00c9, 0x1a07: 0x04b1, 0x1a08: 0x0019, 0x1a09: 0x02e9, 0x1a0a: 0x03d9, 0x1a0b: 0x02f1, + 0x1a0c: 0x02f9, 0x1a0d: 0x03f1, 0x1a0e: 0x0309, 0x1a0f: 0x00a9, 0x1a10: 0x0311, 0x1a11: 0x00b1, + 0x1a12: 0x0319, 0x1a13: 0x0101, 0x1a14: 0x0321, 0x1a15: 0x0329, 0x1a16: 0x0051, 0x1a17: 0x0339, + 0x1a18: 0x0751, 0x1a19: 0x00b9, 0x1a1a: 0x0089, 0x1a1b: 0x0341, 0x1a1c: 0x0349, 0x1a1d: 0x0391, + 0x1a1e: 0x00c1, 0x1a1f: 0x0109, 0x1a20: 0x00c9, 0x1a21: 0x04b1, 0x1a22: 0x0019, 0x1a23: 0x02e9, + 0x1a24: 0x03d9, 0x1a25: 0x02f1, 0x1a26: 0x02f9, 0x1a27: 0x03f1, 0x1a28: 0x0309, 0x1a29: 0x00a9, + 0x1a2a: 0x0311, 0x1a2b: 0x00b1, 0x1a2c: 0x0319, 0x1a2d: 0x0101, 0x1a2e: 0x0321, 0x1a2f: 0x0329, + 0x1a30: 0x0051, 0x1a31: 0x0339, 0x1a32: 0x0751, 0x1a33: 0x00b9, 0x1a34: 0x0089, 0x1a35: 0x0341, + 0x1a36: 0x0349, 0x1a37: 0x0391, 0x1a38: 0x00c1, 0x1a39: 0x0109, 0x1a3a: 0x00c9, 0x1a3b: 0x04b1, + 0x1a3c: 0x0019, 0x1a3d: 0x02e9, 0x1a3e: 0x03d9, 0x1a3f: 0x02f1, // Block 0x69, offset 0x1a40 - 0x1a40: 0x0f31, 0x1a41: 0x0249, 0x1a42: 0x0f41, 0x1a43: 0x0259, 0x1a44: 0x0f51, 0x1a45: 0x0359, - 0x1a46: 0x0f61, 0x1a47: 0x0f71, 0x1a48: 0x00d9, 0x1a49: 0x0f99, 0x1a4a: 0x2039, 0x1a4b: 0x0269, - 0x1a4c: 0x01d9, 0x1a4d: 0x0fa9, 0x1a4e: 0x0fb9, 0x1a4f: 0x1089, 0x1a50: 0x0279, 0x1a51: 0x0369, - 0x1a52: 0x0289, 0x1a53: 0x13d1, 0x1a54: 0x0039, 0x1a55: 0x0ee9, 0x1a56: 0x1159, 0x1a57: 0x0ef9, - 0x1a58: 0x0f09, 0x1a59: 0x1199, 0x1a5a: 0x0f31, 0x1a5b: 0x0249, 0x1a5c: 0x0f41, 0x1a5d: 0x0259, - 0x1a5e: 0x0f51, 0x1a5f: 0x0359, 0x1a60: 0x0f61, 0x1a61: 0x0f71, 0x1a62: 0x00d9, 0x1a63: 0x0f99, - 0x1a64: 0x2039, 0x1a65: 0x0269, 0x1a66: 0x01d9, 0x1a67: 0x0fa9, 0x1a68: 0x0fb9, 0x1a69: 0x1089, - 0x1a6a: 0x0279, 0x1a6b: 0x0369, 0x1a6c: 0x0289, 0x1a6d: 0x13d1, 0x1a6e: 0x0039, 0x1a6f: 0x0ee9, - 0x1a70: 0x1159, 0x1a71: 0x0ef9, 0x1a72: 0x0f09, 0x1a73: 0x1199, 0x1a74: 0x0f31, 0x1a75: 0x0249, - 0x1a76: 0x0f41, 0x1a77: 0x0259, 0x1a78: 0x0f51, 0x1a79: 0x0359, 0x1a7a: 0x0f61, 0x1a7b: 0x0f71, - 0x1a7c: 0x00d9, 0x1a7d: 0x0f99, 0x1a7e: 0x2039, 0x1a7f: 0x0269, + 0x1a40: 0x02f9, 0x1a41: 0x03f1, 0x1a42: 0x0309, 0x1a43: 0x00a9, 0x1a44: 0x0311, 0x1a45: 0x00b1, + 0x1a46: 0x0319, 0x1a47: 0x0101, 0x1a48: 0x0321, 0x1a49: 0x0329, 0x1a4a: 0x0051, 0x1a4b: 0x0339, + 0x1a4c: 0x0751, 0x1a4d: 0x00b9, 0x1a4e: 0x0089, 0x1a4f: 0x0341, 0x1a50: 0x0349, 0x1a51: 0x0391, + 0x1a52: 0x00c1, 0x1a53: 0x0109, 0x1a54: 0x00c9, 0x1a55: 0x04b1, 0x1a56: 0x0019, 0x1a57: 0x02e9, + 0x1a58: 0x03d9, 0x1a59: 0x02f1, 0x1a5a: 0x02f9, 0x1a5b: 0x03f1, 0x1a5c: 0x0309, 0x1a5d: 0x00a9, + 0x1a5e: 0x0311, 0x1a5f: 0x00b1, 0x1a60: 0x0319, 0x1a61: 0x0101, 0x1a62: 0x0321, 0x1a63: 0x0329, + 0x1a64: 0x0051, 0x1a65: 0x0339, 0x1a66: 0x0751, 0x1a67: 0x00b9, 0x1a68: 0x0089, 0x1a69: 0x0341, + 0x1a6a: 0x0349, 0x1a6b: 0x0391, 0x1a6c: 0x00c1, 0x1a6d: 0x0109, 0x1a6e: 0x00c9, 0x1a6f: 0x04b1, + 0x1a70: 0x0019, 0x1a71: 0x02e9, 0x1a72: 0x03d9, 0x1a73: 0x02f1, 0x1a74: 0x02f9, 0x1a75: 0x03f1, + 0x1a76: 0x0309, 0x1a77: 0x00a9, 0x1a78: 0x0311, 0x1a79: 0x00b1, 0x1a7a: 0x0319, 0x1a7b: 0x0101, + 0x1a7c: 0x0321, 0x1a7d: 0x0329, 0x1a7e: 0x0051, 0x1a7f: 0x0339, // Block 0x6a, offset 0x1a80 - 0x1a80: 0x01d9, 0x1a81: 0x0fa9, 0x1a82: 0x0fb9, 0x1a83: 0x1089, 0x1a84: 0x0279, 0x1a85: 0x0369, - 0x1a86: 0x0289, 0x1a87: 0x13d1, 0x1a88: 0x0039, 0x1a89: 0x0ee9, 0x1a8a: 0x1159, 0x1a8b: 0x0ef9, - 0x1a8c: 0x0f09, 0x1a8d: 0x1199, 0x1a8e: 0x0f31, 0x1a8f: 0x0249, 0x1a90: 0x0f41, 0x1a91: 0x0259, - 0x1a92: 0x0f51, 0x1a93: 0x0359, 0x1a94: 0x0f61, 0x1a95: 0x0f71, 0x1a96: 0x00d9, 0x1a97: 0x0f99, - 0x1a98: 0x2039, 0x1a99: 0x0269, 0x1a9a: 0x01d9, 0x1a9b: 0x0fa9, 0x1a9c: 0x0fb9, 0x1a9d: 0x1089, - 0x1a9e: 0x0279, 0x1a9f: 0x0369, 0x1aa0: 0x0289, 0x1aa1: 0x13d1, 0x1aa2: 0x0039, 0x1aa3: 0x0ee9, - 0x1aa4: 0x1159, 0x1aa5: 0x0ef9, 0x1aa6: 0x0f09, 0x1aa7: 0x1199, 0x1aa8: 0x0f31, 0x1aa9: 0x0249, - 0x1aaa: 0x0f41, 0x1aab: 0x0259, 0x1aac: 0x0f51, 0x1aad: 0x0359, 0x1aae: 0x0f61, 0x1aaf: 0x0f71, - 0x1ab0: 0x00d9, 0x1ab1: 0x0f99, 0x1ab2: 0x2039, 0x1ab3: 0x0269, 0x1ab4: 0x01d9, 0x1ab5: 0x0fa9, - 0x1ab6: 0x0fb9, 0x1ab7: 0x1089, 0x1ab8: 0x0279, 0x1ab9: 0x0369, 0x1aba: 0x0289, 0x1abb: 0x13d1, - 0x1abc: 0x0039, 0x1abd: 0x0ee9, 0x1abe: 0x1159, 0x1abf: 0x0ef9, + 0x1a80: 0x0751, 0x1a81: 0x00b9, 0x1a82: 0x0089, 0x1a83: 0x0341, 0x1a84: 0x0349, 0x1a85: 0x0391, + 0x1a86: 0x00c1, 0x1a87: 0x0109, 0x1a88: 0x00c9, 0x1a89: 0x04b1, 0x1a8a: 0x0019, 0x1a8b: 0x02e9, + 0x1a8c: 0x03d9, 0x1a8d: 0x02f1, 0x1a8e: 0x02f9, 0x1a8f: 0x03f1, 0x1a90: 0x0309, 0x1a91: 0x00a9, + 0x1a92: 0x0311, 0x1a93: 0x00b1, 0x1a94: 0x0319, 0x1a95: 0x0101, 0x1a96: 0x0321, 0x1a97: 0x0329, + 0x1a98: 0x0051, 0x1a99: 0x0339, 0x1a9a: 0x0751, 0x1a9b: 0x00b9, 0x1a9c: 0x0089, 0x1a9d: 0x0341, + 0x1a9e: 0x0349, 0x1a9f: 0x0391, 0x1aa0: 0x00c1, 0x1aa1: 0x0109, 0x1aa2: 0x00c9, 0x1aa3: 0x04b1, + 0x1aa4: 0x2279, 0x1aa5: 0x2281, 0x1aa6: 0x0040, 0x1aa7: 0x0040, 0x1aa8: 0x2289, 0x1aa9: 0x0399, + 0x1aaa: 0x03a1, 0x1aab: 0x03a9, 0x1aac: 0x2291, 0x1aad: 0x2299, 0x1aae: 0x22a1, 0x1aaf: 0x04d1, + 0x1ab0: 0x05f9, 0x1ab1: 0x22a9, 0x1ab2: 0x22b1, 0x1ab3: 0x22b9, 0x1ab4: 0x22c1, 0x1ab5: 0x22c9, + 0x1ab6: 0x22d1, 0x1ab7: 0x0799, 0x1ab8: 0x03c1, 0x1ab9: 0x04d1, 0x1aba: 0x22d9, 0x1abb: 0x22e1, + 0x1abc: 0x22e9, 0x1abd: 0x03b1, 0x1abe: 0x03b9, 0x1abf: 0x22f1, // Block 0x6b, offset 0x1ac0 - 0x1ac0: 0x0f09, 0x1ac1: 0x1199, 0x1ac2: 0x0f31, 0x1ac3: 0x0249, 0x1ac4: 0x0f41, 0x1ac5: 0x0259, - 0x1ac6: 0x0f51, 0x1ac7: 0x0359, 0x1ac8: 0x0f61, 0x1ac9: 0x0f71, 0x1aca: 0x00d9, 0x1acb: 0x0f99, - 0x1acc: 0x2039, 0x1acd: 0x0269, 0x1ace: 0x01d9, 0x1acf: 0x0fa9, 0x1ad0: 0x0fb9, 0x1ad1: 0x1089, - 0x1ad2: 0x0279, 0x1ad3: 0x0369, 0x1ad4: 0x0289, 0x1ad5: 0x13d1, 0x1ad6: 0x0039, 0x1ad7: 0x0ee9, - 0x1ad8: 0x1159, 0x1ad9: 0x0ef9, 0x1ada: 0x0f09, 0x1adb: 0x1199, 0x1adc: 0x0f31, 0x1add: 0x0249, - 0x1ade: 0x0f41, 0x1adf: 0x0259, 0x1ae0: 0x0f51, 0x1ae1: 0x0359, 0x1ae2: 0x0f61, 0x1ae3: 0x0f71, - 0x1ae4: 0x00d9, 0x1ae5: 0x0f99, 0x1ae6: 0x2039, 0x1ae7: 0x0269, 0x1ae8: 0x01d9, 0x1ae9: 0x0fa9, - 0x1aea: 0x0fb9, 0x1aeb: 0x1089, 0x1aec: 0x0279, 0x1aed: 0x0369, 0x1aee: 0x0289, 0x1aef: 0x13d1, - 0x1af0: 0x0039, 0x1af1: 0x0ee9, 0x1af2: 0x1159, 0x1af3: 0x0ef9, 0x1af4: 0x0f09, 0x1af5: 0x1199, - 0x1af6: 0x0f31, 0x1af7: 0x0249, 0x1af8: 0x0f41, 0x1af9: 0x0259, 0x1afa: 0x0f51, 0x1afb: 0x0359, - 0x1afc: 0x0f61, 0x1afd: 0x0f71, 0x1afe: 0x00d9, 0x1aff: 0x0f99, + 0x1ac0: 0x0769, 0x1ac1: 0x22f9, 0x1ac2: 0x2289, 0x1ac3: 0x0399, 0x1ac4: 0x03a1, 0x1ac5: 0x03a9, + 0x1ac6: 0x2291, 0x1ac7: 0x2299, 0x1ac8: 0x22a1, 0x1ac9: 0x04d1, 0x1aca: 0x05f9, 0x1acb: 0x22a9, + 0x1acc: 0x22b1, 0x1acd: 0x22b9, 0x1ace: 0x22c1, 0x1acf: 0x22c9, 0x1ad0: 0x22d1, 0x1ad1: 0x0799, + 0x1ad2: 0x03c1, 0x1ad3: 0x22d9, 0x1ad4: 0x22d9, 0x1ad5: 0x22e1, 0x1ad6: 0x22e9, 0x1ad7: 0x03b1, + 0x1ad8: 0x03b9, 0x1ad9: 0x22f1, 0x1ada: 0x0769, 0x1adb: 0x2301, 0x1adc: 0x2291, 0x1add: 0x04d1, + 0x1ade: 0x22a9, 0x1adf: 0x03b1, 0x1ae0: 0x03c1, 0x1ae1: 0x0799, 0x1ae2: 0x2289, 0x1ae3: 0x0399, + 0x1ae4: 0x03a1, 0x1ae5: 0x03a9, 0x1ae6: 0x2291, 0x1ae7: 0x2299, 0x1ae8: 0x22a1, 0x1ae9: 0x04d1, + 0x1aea: 0x05f9, 0x1aeb: 0x22a9, 0x1aec: 0x22b1, 0x1aed: 0x22b9, 0x1aee: 0x22c1, 0x1aef: 0x22c9, + 0x1af0: 0x22d1, 0x1af1: 0x0799, 0x1af2: 0x03c1, 0x1af3: 0x04d1, 0x1af4: 0x22d9, 0x1af5: 0x22e1, + 0x1af6: 0x22e9, 0x1af7: 0x03b1, 0x1af8: 0x03b9, 0x1af9: 0x22f1, 0x1afa: 0x0769, 0x1afb: 0x22f9, + 0x1afc: 0x2289, 0x1afd: 0x0399, 0x1afe: 0x03a1, 0x1aff: 0x03a9, // Block 0x6c, offset 0x1b00 - 0x1b00: 0x2039, 0x1b01: 0x0269, 0x1b02: 0x01d9, 0x1b03: 0x0fa9, 0x1b04: 0x0fb9, 0x1b05: 0x1089, - 0x1b06: 0x0279, 0x1b07: 0x0369, 0x1b08: 0x0289, 0x1b09: 0x13d1, 0x1b0a: 0x0039, 0x1b0b: 0x0ee9, - 0x1b0c: 0x1159, 0x1b0d: 0x0ef9, 0x1b0e: 0x0f09, 0x1b0f: 0x1199, 0x1b10: 0x0f31, 0x1b11: 0x0249, - 0x1b12: 0x0f41, 0x1b13: 0x0259, 0x1b14: 0x0f51, 0x1b15: 0x0359, 0x1b16: 0x0f61, 0x1b17: 0x0f71, - 0x1b18: 0x00d9, 0x1b19: 0x0f99, 0x1b1a: 0x2039, 0x1b1b: 0x0269, 0x1b1c: 0x01d9, 0x1b1d: 0x0fa9, - 0x1b1e: 0x0fb9, 0x1b1f: 0x1089, 0x1b20: 0x0279, 0x1b21: 0x0369, 0x1b22: 0x0289, 0x1b23: 0x13d1, - 0x1b24: 0xbad1, 0x1b25: 0xbae9, 0x1b26: 0x0040, 0x1b27: 0x0040, 0x1b28: 0xbb01, 0x1b29: 0x1099, - 0x1b2a: 0x10b1, 0x1b2b: 0x10c9, 0x1b2c: 0xbb19, 0x1b2d: 0xbb31, 0x1b2e: 0xbb49, 0x1b2f: 0x1429, - 0x1b30: 0x1a31, 0x1b31: 0xbb61, 0x1b32: 0xbb79, 0x1b33: 0xbb91, 0x1b34: 0xbba9, 0x1b35: 0xbbc1, - 0x1b36: 0xbbd9, 0x1b37: 0x2109, 0x1b38: 0x1111, 0x1b39: 0x1429, 0x1b3a: 0xbbf1, 0x1b3b: 0xbc09, - 0x1b3c: 0xbc21, 0x1b3d: 0x10e1, 0x1b3e: 0x10f9, 0x1b3f: 0xbc39, + 0x1b00: 0x2291, 0x1b01: 0x2299, 0x1b02: 0x22a1, 0x1b03: 0x04d1, 0x1b04: 0x05f9, 0x1b05: 0x22a9, + 0x1b06: 0x22b1, 0x1b07: 0x22b9, 0x1b08: 0x22c1, 0x1b09: 0x22c9, 0x1b0a: 0x22d1, 0x1b0b: 0x0799, + 0x1b0c: 0x03c1, 0x1b0d: 0x22d9, 0x1b0e: 0x22d9, 0x1b0f: 0x22e1, 0x1b10: 0x22e9, 0x1b11: 0x03b1, + 0x1b12: 0x03b9, 0x1b13: 0x22f1, 0x1b14: 0x0769, 0x1b15: 0x2301, 0x1b16: 0x2291, 0x1b17: 0x04d1, + 0x1b18: 0x22a9, 0x1b19: 0x03b1, 0x1b1a: 0x03c1, 0x1b1b: 0x0799, 0x1b1c: 0x2289, 0x1b1d: 0x0399, + 0x1b1e: 0x03a1, 0x1b1f: 0x03a9, 0x1b20: 0x2291, 0x1b21: 0x2299, 0x1b22: 0x22a1, 0x1b23: 0x04d1, + 0x1b24: 0x05f9, 0x1b25: 0x22a9, 0x1b26: 0x22b1, 0x1b27: 0x22b9, 0x1b28: 0x22c1, 0x1b29: 0x22c9, + 0x1b2a: 0x22d1, 0x1b2b: 0x0799, 0x1b2c: 0x03c1, 0x1b2d: 0x04d1, 0x1b2e: 0x22d9, 0x1b2f: 0x22e1, + 0x1b30: 0x22e9, 0x1b31: 0x03b1, 0x1b32: 0x03b9, 0x1b33: 0x22f1, 0x1b34: 0x0769, 0x1b35: 0x22f9, + 0x1b36: 0x2289, 0x1b37: 0x0399, 0x1b38: 0x03a1, 0x1b39: 0x03a9, 0x1b3a: 0x2291, 0x1b3b: 0x2299, + 0x1b3c: 0x22a1, 0x1b3d: 0x04d1, 0x1b3e: 0x05f9, 0x1b3f: 0x22a9, // Block 0x6d, offset 0x1b40 - 0x1b40: 0x2079, 0x1b41: 0xbc51, 0x1b42: 0xbb01, 0x1b43: 0x1099, 0x1b44: 0x10b1, 0x1b45: 0x10c9, - 0x1b46: 0xbb19, 0x1b47: 0xbb31, 0x1b48: 0xbb49, 0x1b49: 0x1429, 0x1b4a: 0x1a31, 0x1b4b: 0xbb61, - 0x1b4c: 0xbb79, 0x1b4d: 0xbb91, 0x1b4e: 0xbba9, 0x1b4f: 0xbbc1, 0x1b50: 0xbbd9, 0x1b51: 0x2109, - 0x1b52: 0x1111, 0x1b53: 0xbbf1, 0x1b54: 0xbbf1, 0x1b55: 0xbc09, 0x1b56: 0xbc21, 0x1b57: 0x10e1, - 0x1b58: 0x10f9, 0x1b59: 0xbc39, 0x1b5a: 0x2079, 0x1b5b: 0xbc71, 0x1b5c: 0xbb19, 0x1b5d: 0x1429, - 0x1b5e: 0xbb61, 0x1b5f: 0x10e1, 0x1b60: 0x1111, 0x1b61: 0x2109, 0x1b62: 0xbb01, 0x1b63: 0x1099, - 0x1b64: 0x10b1, 0x1b65: 0x10c9, 0x1b66: 0xbb19, 0x1b67: 0xbb31, 0x1b68: 0xbb49, 0x1b69: 0x1429, - 0x1b6a: 0x1a31, 0x1b6b: 0xbb61, 0x1b6c: 0xbb79, 0x1b6d: 0xbb91, 0x1b6e: 0xbba9, 0x1b6f: 0xbbc1, - 0x1b70: 0xbbd9, 0x1b71: 0x2109, 0x1b72: 0x1111, 0x1b73: 0x1429, 0x1b74: 0xbbf1, 0x1b75: 0xbc09, - 0x1b76: 0xbc21, 0x1b77: 0x10e1, 0x1b78: 0x10f9, 0x1b79: 0xbc39, 0x1b7a: 0x2079, 0x1b7b: 0xbc51, - 0x1b7c: 0xbb01, 0x1b7d: 0x1099, 0x1b7e: 0x10b1, 0x1b7f: 0x10c9, + 0x1b40: 0x22b1, 0x1b41: 0x22b9, 0x1b42: 0x22c1, 0x1b43: 0x22c9, 0x1b44: 0x22d1, 0x1b45: 0x0799, + 0x1b46: 0x03c1, 0x1b47: 0x22d9, 0x1b48: 0x22d9, 0x1b49: 0x22e1, 0x1b4a: 0x22e9, 0x1b4b: 0x03b1, + 0x1b4c: 0x03b9, 0x1b4d: 0x22f1, 0x1b4e: 0x0769, 0x1b4f: 0x2301, 0x1b50: 0x2291, 0x1b51: 0x04d1, + 0x1b52: 0x22a9, 0x1b53: 0x03b1, 0x1b54: 0x03c1, 0x1b55: 0x0799, 0x1b56: 0x2289, 0x1b57: 0x0399, + 0x1b58: 0x03a1, 0x1b59: 0x03a9, 0x1b5a: 0x2291, 0x1b5b: 0x2299, 0x1b5c: 0x22a1, 0x1b5d: 0x04d1, + 0x1b5e: 0x05f9, 0x1b5f: 0x22a9, 0x1b60: 0x22b1, 0x1b61: 0x22b9, 0x1b62: 0x22c1, 0x1b63: 0x22c9, + 0x1b64: 0x22d1, 0x1b65: 0x0799, 0x1b66: 0x03c1, 0x1b67: 0x04d1, 0x1b68: 0x22d9, 0x1b69: 0x22e1, + 0x1b6a: 0x22e9, 0x1b6b: 0x03b1, 0x1b6c: 0x03b9, 0x1b6d: 0x22f1, 0x1b6e: 0x0769, 0x1b6f: 0x22f9, + 0x1b70: 0x2289, 0x1b71: 0x0399, 0x1b72: 0x03a1, 0x1b73: 0x03a9, 0x1b74: 0x2291, 0x1b75: 0x2299, + 0x1b76: 0x22a1, 0x1b77: 0x04d1, 0x1b78: 0x05f9, 0x1b79: 0x22a9, 0x1b7a: 0x22b1, 0x1b7b: 0x22b9, + 0x1b7c: 0x22c1, 0x1b7d: 0x22c9, 0x1b7e: 0x22d1, 0x1b7f: 0x0799, // Block 0x6e, offset 0x1b80 - 0x1b80: 0xbb19, 0x1b81: 0xbb31, 0x1b82: 0xbb49, 0x1b83: 0x1429, 0x1b84: 0x1a31, 0x1b85: 0xbb61, - 0x1b86: 0xbb79, 0x1b87: 0xbb91, 0x1b88: 0xbba9, 0x1b89: 0xbbc1, 0x1b8a: 0xbbd9, 0x1b8b: 0x2109, - 0x1b8c: 0x1111, 0x1b8d: 0xbbf1, 0x1b8e: 0xbbf1, 0x1b8f: 0xbc09, 0x1b90: 0xbc21, 0x1b91: 0x10e1, - 0x1b92: 0x10f9, 0x1b93: 0xbc39, 0x1b94: 0x2079, 0x1b95: 0xbc71, 0x1b96: 0xbb19, 0x1b97: 0x1429, - 0x1b98: 0xbb61, 0x1b99: 0x10e1, 0x1b9a: 0x1111, 0x1b9b: 0x2109, 0x1b9c: 0xbb01, 0x1b9d: 0x1099, - 0x1b9e: 0x10b1, 0x1b9f: 0x10c9, 0x1ba0: 0xbb19, 0x1ba1: 0xbb31, 0x1ba2: 0xbb49, 0x1ba3: 0x1429, - 0x1ba4: 0x1a31, 0x1ba5: 0xbb61, 0x1ba6: 0xbb79, 0x1ba7: 0xbb91, 0x1ba8: 0xbba9, 0x1ba9: 0xbbc1, - 0x1baa: 0xbbd9, 0x1bab: 0x2109, 0x1bac: 0x1111, 0x1bad: 0x1429, 0x1bae: 0xbbf1, 0x1baf: 0xbc09, - 0x1bb0: 0xbc21, 0x1bb1: 0x10e1, 0x1bb2: 0x10f9, 0x1bb3: 0xbc39, 0x1bb4: 0x2079, 0x1bb5: 0xbc51, - 0x1bb6: 0xbb01, 0x1bb7: 0x1099, 0x1bb8: 0x10b1, 0x1bb9: 0x10c9, 0x1bba: 0xbb19, 0x1bbb: 0xbb31, - 0x1bbc: 0xbb49, 0x1bbd: 0x1429, 0x1bbe: 0x1a31, 0x1bbf: 0xbb61, + 0x1b80: 0x03c1, 0x1b81: 0x22d9, 0x1b82: 0x22d9, 0x1b83: 0x22e1, 0x1b84: 0x22e9, 0x1b85: 0x03b1, + 0x1b86: 0x03b9, 0x1b87: 0x22f1, 0x1b88: 0x0769, 0x1b89: 0x2301, 0x1b8a: 0x2291, 0x1b8b: 0x04d1, + 0x1b8c: 0x22a9, 0x1b8d: 0x03b1, 0x1b8e: 0x03c1, 0x1b8f: 0x0799, 0x1b90: 0x2289, 0x1b91: 0x0399, + 0x1b92: 0x03a1, 0x1b93: 0x03a9, 0x1b94: 0x2291, 0x1b95: 0x2299, 0x1b96: 0x22a1, 0x1b97: 0x04d1, + 0x1b98: 0x05f9, 0x1b99: 0x22a9, 0x1b9a: 0x22b1, 0x1b9b: 0x22b9, 0x1b9c: 0x22c1, 0x1b9d: 0x22c9, + 0x1b9e: 0x22d1, 0x1b9f: 0x0799, 0x1ba0: 0x03c1, 0x1ba1: 0x04d1, 0x1ba2: 0x22d9, 0x1ba3: 0x22e1, + 0x1ba4: 0x22e9, 0x1ba5: 0x03b1, 0x1ba6: 0x03b9, 0x1ba7: 0x22f1, 0x1ba8: 0x0769, 0x1ba9: 0x22f9, + 0x1baa: 0x2289, 0x1bab: 0x0399, 0x1bac: 0x03a1, 0x1bad: 0x03a9, 0x1bae: 0x2291, 0x1baf: 0x2299, + 0x1bb0: 0x22a1, 0x1bb1: 0x04d1, 0x1bb2: 0x05f9, 0x1bb3: 0x22a9, 0x1bb4: 0x22b1, 0x1bb5: 0x22b9, + 0x1bb6: 0x22c1, 0x1bb7: 0x22c9, 0x1bb8: 0x22d1, 0x1bb9: 0x0799, 0x1bba: 0x03c1, 0x1bbb: 0x22d9, + 0x1bbc: 0x22d9, 0x1bbd: 0x22e1, 0x1bbe: 0x22e9, 0x1bbf: 0x03b1, // Block 0x6f, offset 0x1bc0 - 0x1bc0: 0xbb79, 0x1bc1: 0xbb91, 0x1bc2: 0xbba9, 0x1bc3: 0xbbc1, 0x1bc4: 0xbbd9, 0x1bc5: 0x2109, - 0x1bc6: 0x1111, 0x1bc7: 0xbbf1, 0x1bc8: 0xbbf1, 0x1bc9: 0xbc09, 0x1bca: 0xbc21, 0x1bcb: 0x10e1, - 0x1bcc: 0x10f9, 0x1bcd: 0xbc39, 0x1bce: 0x2079, 0x1bcf: 0xbc71, 0x1bd0: 0xbb19, 0x1bd1: 0x1429, - 0x1bd2: 0xbb61, 0x1bd3: 0x10e1, 0x1bd4: 0x1111, 0x1bd5: 0x2109, 0x1bd6: 0xbb01, 0x1bd7: 0x1099, - 0x1bd8: 0x10b1, 0x1bd9: 0x10c9, 0x1bda: 0xbb19, 0x1bdb: 0xbb31, 0x1bdc: 0xbb49, 0x1bdd: 0x1429, - 0x1bde: 0x1a31, 0x1bdf: 0xbb61, 0x1be0: 0xbb79, 0x1be1: 0xbb91, 0x1be2: 0xbba9, 0x1be3: 0xbbc1, - 0x1be4: 0xbbd9, 0x1be5: 0x2109, 0x1be6: 0x1111, 0x1be7: 0x1429, 0x1be8: 0xbbf1, 0x1be9: 0xbc09, - 0x1bea: 0xbc21, 0x1beb: 0x10e1, 0x1bec: 0x10f9, 0x1bed: 0xbc39, 0x1bee: 0x2079, 0x1bef: 0xbc51, - 0x1bf0: 0xbb01, 0x1bf1: 0x1099, 0x1bf2: 0x10b1, 0x1bf3: 0x10c9, 0x1bf4: 0xbb19, 0x1bf5: 0xbb31, - 0x1bf6: 0xbb49, 0x1bf7: 0x1429, 0x1bf8: 0x1a31, 0x1bf9: 0xbb61, 0x1bfa: 0xbb79, 0x1bfb: 0xbb91, - 0x1bfc: 0xbba9, 0x1bfd: 0xbbc1, 0x1bfe: 0xbbd9, 0x1bff: 0x2109, + 0x1bc0: 0x03b9, 0x1bc1: 0x22f1, 0x1bc2: 0x0769, 0x1bc3: 0x2301, 0x1bc4: 0x2291, 0x1bc5: 0x04d1, + 0x1bc6: 0x22a9, 0x1bc7: 0x03b1, 0x1bc8: 0x03c1, 0x1bc9: 0x0799, 0x1bca: 0x2309, 0x1bcb: 0x2309, + 0x1bcc: 0x0040, 0x1bcd: 0x0040, 0x1bce: 0x06e1, 0x1bcf: 0x0049, 0x1bd0: 0x0029, 0x1bd1: 0x0031, + 0x1bd2: 0x06e9, 0x1bd3: 0x06f1, 0x1bd4: 0x06f9, 0x1bd5: 0x0701, 0x1bd6: 0x0709, 0x1bd7: 0x0711, + 0x1bd8: 0x06e1, 0x1bd9: 0x0049, 0x1bda: 0x0029, 0x1bdb: 0x0031, 0x1bdc: 0x06e9, 0x1bdd: 0x06f1, + 0x1bde: 0x06f9, 0x1bdf: 0x0701, 0x1be0: 0x0709, 0x1be1: 0x0711, 0x1be2: 0x06e1, 0x1be3: 0x0049, + 0x1be4: 0x0029, 0x1be5: 0x0031, 0x1be6: 0x06e9, 0x1be7: 0x06f1, 0x1be8: 0x06f9, 0x1be9: 0x0701, + 0x1bea: 0x0709, 0x1beb: 0x0711, 0x1bec: 0x06e1, 0x1bed: 0x0049, 0x1bee: 0x0029, 0x1bef: 0x0031, + 0x1bf0: 0x06e9, 0x1bf1: 0x06f1, 0x1bf2: 0x06f9, 0x1bf3: 0x0701, 0x1bf4: 0x0709, 0x1bf5: 0x0711, + 0x1bf6: 0x06e1, 0x1bf7: 0x0049, 0x1bf8: 0x0029, 0x1bf9: 0x0031, 0x1bfa: 0x06e9, 0x1bfb: 0x06f1, + 0x1bfc: 0x06f9, 0x1bfd: 0x0701, 0x1bfe: 0x0709, 0x1bff: 0x0711, // Block 0x70, offset 0x1c00 - 0x1c00: 0x1111, 0x1c01: 0xbbf1, 0x1c02: 0xbbf1, 0x1c03: 0xbc09, 0x1c04: 0xbc21, 0x1c05: 0x10e1, - 0x1c06: 0x10f9, 0x1c07: 0xbc39, 0x1c08: 0x2079, 0x1c09: 0xbc71, 0x1c0a: 0xbb19, 0x1c0b: 0x1429, - 0x1c0c: 0xbb61, 0x1c0d: 0x10e1, 0x1c0e: 0x1111, 0x1c0f: 0x2109, 0x1c10: 0xbb01, 0x1c11: 0x1099, - 0x1c12: 0x10b1, 0x1c13: 0x10c9, 0x1c14: 0xbb19, 0x1c15: 0xbb31, 0x1c16: 0xbb49, 0x1c17: 0x1429, - 0x1c18: 0x1a31, 0x1c19: 0xbb61, 0x1c1a: 0xbb79, 0x1c1b: 0xbb91, 0x1c1c: 0xbba9, 0x1c1d: 0xbbc1, - 0x1c1e: 0xbbd9, 0x1c1f: 0x2109, 0x1c20: 0x1111, 0x1c21: 0x1429, 0x1c22: 0xbbf1, 0x1c23: 0xbc09, - 0x1c24: 0xbc21, 0x1c25: 0x10e1, 0x1c26: 0x10f9, 0x1c27: 0xbc39, 0x1c28: 0x2079, 0x1c29: 0xbc51, - 0x1c2a: 0xbb01, 0x1c2b: 0x1099, 0x1c2c: 0x10b1, 0x1c2d: 0x10c9, 0x1c2e: 0xbb19, 0x1c2f: 0xbb31, - 0x1c30: 0xbb49, 0x1c31: 0x1429, 0x1c32: 0x1a31, 0x1c33: 0xbb61, 0x1c34: 0xbb79, 0x1c35: 0xbb91, - 0x1c36: 0xbba9, 0x1c37: 0xbbc1, 0x1c38: 0xbbd9, 0x1c39: 0x2109, 0x1c3a: 0x1111, 0x1c3b: 0xbbf1, - 0x1c3c: 0xbbf1, 0x1c3d: 0xbc09, 0x1c3e: 0xbc21, 0x1c3f: 0x10e1, + 0x1c00: 0xe115, 0x1c01: 0xe115, 0x1c02: 0xe135, 0x1c03: 0xe135, 0x1c04: 0xe115, 0x1c05: 0xe115, + 0x1c06: 0xe175, 0x1c07: 0xe175, 0x1c08: 0xe115, 0x1c09: 0xe115, 0x1c0a: 0xe135, 0x1c0b: 0xe135, + 0x1c0c: 0xe115, 0x1c0d: 0xe115, 0x1c0e: 0xe1f5, 0x1c0f: 0xe1f5, 0x1c10: 0xe115, 0x1c11: 0xe115, + 0x1c12: 0xe135, 0x1c13: 0xe135, 0x1c14: 0xe115, 0x1c15: 0xe115, 0x1c16: 0xe175, 0x1c17: 0xe175, + 0x1c18: 0xe115, 0x1c19: 0xe115, 0x1c1a: 0xe135, 0x1c1b: 0xe135, 0x1c1c: 0xe115, 0x1c1d: 0xe115, + 0x1c1e: 0x8b3d, 0x1c1f: 0x8b3d, 0x1c20: 0x04b5, 0x1c21: 0x04b5, 0x1c22: 0x0a08, 0x1c23: 0x0a08, + 0x1c24: 0x0a08, 0x1c25: 0x0a08, 0x1c26: 0x0a08, 0x1c27: 0x0a08, 0x1c28: 0x0a08, 0x1c29: 0x0a08, + 0x1c2a: 0x0a08, 0x1c2b: 0x0a08, 0x1c2c: 0x0a08, 0x1c2d: 0x0a08, 0x1c2e: 0x0a08, 0x1c2f: 0x0a08, + 0x1c30: 0x0a08, 0x1c31: 0x0a08, 0x1c32: 0x0a08, 0x1c33: 0x0a08, 0x1c34: 0x0a08, 0x1c35: 0x0a08, + 0x1c36: 0x0a08, 0x1c37: 0x0a08, 0x1c38: 0x0a08, 0x1c39: 0x0a08, 0x1c3a: 0x0a08, 0x1c3b: 0x0a08, + 0x1c3c: 0x0a08, 0x1c3d: 0x0a08, 0x1c3e: 0x0a08, 0x1c3f: 0x0a08, // Block 0x71, offset 0x1c40 - 0x1c40: 0x10f9, 0x1c41: 0xbc39, 0x1c42: 0x2079, 0x1c43: 0xbc71, 0x1c44: 0xbb19, 0x1c45: 0x1429, - 0x1c46: 0xbb61, 0x1c47: 0x10e1, 0x1c48: 0x1111, 0x1c49: 0x2109, 0x1c4a: 0xbc91, 0x1c4b: 0xbc91, - 0x1c4c: 0x0040, 0x1c4d: 0x0040, 0x1c4e: 0x1f41, 0x1c4f: 0x00c9, 0x1c50: 0x0069, 0x1c51: 0x0079, - 0x1c52: 0x1f51, 0x1c53: 0x1f61, 0x1c54: 0x1f71, 0x1c55: 0x1f81, 0x1c56: 0x1f91, 0x1c57: 0x1fa1, - 0x1c58: 0x1f41, 0x1c59: 0x00c9, 0x1c5a: 0x0069, 0x1c5b: 0x0079, 0x1c5c: 0x1f51, 0x1c5d: 0x1f61, - 0x1c5e: 0x1f71, 0x1c5f: 0x1f81, 0x1c60: 0x1f91, 0x1c61: 0x1fa1, 0x1c62: 0x1f41, 0x1c63: 0x00c9, - 0x1c64: 0x0069, 0x1c65: 0x0079, 0x1c66: 0x1f51, 0x1c67: 0x1f61, 0x1c68: 0x1f71, 0x1c69: 0x1f81, - 0x1c6a: 0x1f91, 0x1c6b: 0x1fa1, 0x1c6c: 0x1f41, 0x1c6d: 0x00c9, 0x1c6e: 0x0069, 0x1c6f: 0x0079, - 0x1c70: 0x1f51, 0x1c71: 0x1f61, 0x1c72: 0x1f71, 0x1c73: 0x1f81, 0x1c74: 0x1f91, 0x1c75: 0x1fa1, - 0x1c76: 0x1f41, 0x1c77: 0x00c9, 0x1c78: 0x0069, 0x1c79: 0x0079, 0x1c7a: 0x1f51, 0x1c7b: 0x1f61, - 0x1c7c: 0x1f71, 0x1c7d: 0x1f81, 0x1c7e: 0x1f91, 0x1c7f: 0x1fa1, + 0x1c40: 0x20b1, 0x1c41: 0x20b9, 0x1c42: 0x20d9, 0x1c43: 0x20f1, 0x1c44: 0x0040, 0x1c45: 0x2189, + 0x1c46: 0x2109, 0x1c47: 0x20e1, 0x1c48: 0x2131, 0x1c49: 0x2191, 0x1c4a: 0x2161, 0x1c4b: 0x2169, + 0x1c4c: 0x2171, 0x1c4d: 0x2179, 0x1c4e: 0x2111, 0x1c4f: 0x2141, 0x1c50: 0x2151, 0x1c51: 0x2121, + 0x1c52: 0x2159, 0x1c53: 0x2101, 0x1c54: 0x2119, 0x1c55: 0x20c9, 0x1c56: 0x20d1, 0x1c57: 0x20e9, + 0x1c58: 0x20f9, 0x1c59: 0x2129, 0x1c5a: 0x2139, 0x1c5b: 0x2149, 0x1c5c: 0x2311, 0x1c5d: 0x1689, + 0x1c5e: 0x2319, 0x1c5f: 0x2321, 0x1c60: 0x0040, 0x1c61: 0x20b9, 0x1c62: 0x20d9, 0x1c63: 0x0040, + 0x1c64: 0x2181, 0x1c65: 0x0040, 0x1c66: 0x0040, 0x1c67: 0x20e1, 0x1c68: 0x0040, 0x1c69: 0x2191, + 0x1c6a: 0x2161, 0x1c6b: 0x2169, 0x1c6c: 0x2171, 0x1c6d: 0x2179, 0x1c6e: 0x2111, 0x1c6f: 0x2141, + 0x1c70: 0x2151, 0x1c71: 0x2121, 0x1c72: 0x2159, 0x1c73: 0x0040, 0x1c74: 0x2119, 0x1c75: 0x20c9, + 0x1c76: 0x20d1, 0x1c77: 0x20e9, 0x1c78: 0x0040, 0x1c79: 0x2129, 0x1c7a: 0x0040, 0x1c7b: 0x2149, + 0x1c7c: 0x0040, 0x1c7d: 0x0040, 0x1c7e: 0x0040, 0x1c7f: 0x0040, // Block 0x72, offset 0x1c80 - 0x1c80: 0xe115, 0x1c81: 0xe115, 0x1c82: 0xe135, 0x1c83: 0xe135, 0x1c84: 0xe115, 0x1c85: 0xe115, - 0x1c86: 0xe175, 0x1c87: 0xe175, 0x1c88: 0xe115, 0x1c89: 0xe115, 0x1c8a: 0xe135, 0x1c8b: 0xe135, - 0x1c8c: 0xe115, 0x1c8d: 0xe115, 0x1c8e: 0xe1f5, 0x1c8f: 0xe1f5, 0x1c90: 0xe115, 0x1c91: 0xe115, - 0x1c92: 0xe135, 0x1c93: 0xe135, 0x1c94: 0xe115, 0x1c95: 0xe115, 0x1c96: 0xe175, 0x1c97: 0xe175, - 0x1c98: 0xe115, 0x1c99: 0xe115, 0x1c9a: 0xe135, 0x1c9b: 0xe135, 0x1c9c: 0xe115, 0x1c9d: 0xe115, - 0x1c9e: 0x8b3d, 0x1c9f: 0x8b3d, 0x1ca0: 0x04b5, 0x1ca1: 0x04b5, 0x1ca2: 0x0a08, 0x1ca3: 0x0a08, - 0x1ca4: 0x0a08, 0x1ca5: 0x0a08, 0x1ca6: 0x0a08, 0x1ca7: 0x0a08, 0x1ca8: 0x0a08, 0x1ca9: 0x0a08, - 0x1caa: 0x0a08, 0x1cab: 0x0a08, 0x1cac: 0x0a08, 0x1cad: 0x0a08, 0x1cae: 0x0a08, 0x1caf: 0x0a08, - 0x1cb0: 0x0a08, 0x1cb1: 0x0a08, 0x1cb2: 0x0a08, 0x1cb3: 0x0a08, 0x1cb4: 0x0a08, 0x1cb5: 0x0a08, - 0x1cb6: 0x0a08, 0x1cb7: 0x0a08, 0x1cb8: 0x0a08, 0x1cb9: 0x0a08, 0x1cba: 0x0a08, 0x1cbb: 0x0a08, - 0x1cbc: 0x0a08, 0x1cbd: 0x0a08, 0x1cbe: 0x0a08, 0x1cbf: 0x0a08, + 0x1c80: 0x0040, 0x1c81: 0x0040, 0x1c82: 0x20d9, 0x1c83: 0x0040, 0x1c84: 0x0040, 0x1c85: 0x0040, + 0x1c86: 0x0040, 0x1c87: 0x20e1, 0x1c88: 0x0040, 0x1c89: 0x2191, 0x1c8a: 0x0040, 0x1c8b: 0x2169, + 0x1c8c: 0x0040, 0x1c8d: 0x2179, 0x1c8e: 0x2111, 0x1c8f: 0x2141, 0x1c90: 0x0040, 0x1c91: 0x2121, + 0x1c92: 0x2159, 0x1c93: 0x0040, 0x1c94: 0x2119, 0x1c95: 0x0040, 0x1c96: 0x0040, 0x1c97: 0x20e9, + 0x1c98: 0x0040, 0x1c99: 0x2129, 0x1c9a: 0x0040, 0x1c9b: 0x2149, 0x1c9c: 0x0040, 0x1c9d: 0x1689, + 0x1c9e: 0x0040, 0x1c9f: 0x2321, 0x1ca0: 0x0040, 0x1ca1: 0x20b9, 0x1ca2: 0x20d9, 0x1ca3: 0x0040, + 0x1ca4: 0x2181, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0x20e1, 0x1ca8: 0x2131, 0x1ca9: 0x2191, + 0x1caa: 0x2161, 0x1cab: 0x0040, 0x1cac: 0x2171, 0x1cad: 0x2179, 0x1cae: 0x2111, 0x1caf: 0x2141, + 0x1cb0: 0x2151, 0x1cb1: 0x2121, 0x1cb2: 0x2159, 0x1cb3: 0x0040, 0x1cb4: 0x2119, 0x1cb5: 0x20c9, + 0x1cb6: 0x20d1, 0x1cb7: 0x20e9, 0x1cb8: 0x0040, 0x1cb9: 0x2129, 0x1cba: 0x2139, 0x1cbb: 0x2149, + 0x1cbc: 0x2311, 0x1cbd: 0x0040, 0x1cbe: 0x2319, 0x1cbf: 0x0040, // Block 0x73, offset 0x1cc0 - 0x1cc0: 0xb1d9, 0x1cc1: 0xb1f1, 0x1cc2: 0xb251, 0x1cc3: 0xb299, 0x1cc4: 0x0040, 0x1cc5: 0xb461, - 0x1cc6: 0xb2e1, 0x1cc7: 0xb269, 0x1cc8: 0xb359, 0x1cc9: 0xb479, 0x1cca: 0xb3e9, 0x1ccb: 0xb401, - 0x1ccc: 0xb419, 0x1ccd: 0xb431, 0x1cce: 0xb2f9, 0x1ccf: 0xb389, 0x1cd0: 0xb3b9, 0x1cd1: 0xb329, - 0x1cd2: 0xb3d1, 0x1cd3: 0xb2c9, 0x1cd4: 0xb311, 0x1cd5: 0xb221, 0x1cd6: 0xb239, 0x1cd7: 0xb281, - 0x1cd8: 0xb2b1, 0x1cd9: 0xb341, 0x1cda: 0xb371, 0x1cdb: 0xb3a1, 0x1cdc: 0xbca9, 0x1cdd: 0x7999, - 0x1cde: 0xbcc1, 0x1cdf: 0xbcd9, 0x1ce0: 0x0040, 0x1ce1: 0xb1f1, 0x1ce2: 0xb251, 0x1ce3: 0x0040, - 0x1ce4: 0xb449, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb269, 0x1ce8: 0x0040, 0x1ce9: 0xb479, - 0x1cea: 0xb3e9, 0x1ceb: 0xb401, 0x1cec: 0xb419, 0x1ced: 0xb431, 0x1cee: 0xb2f9, 0x1cef: 0xb389, - 0x1cf0: 0xb3b9, 0x1cf1: 0xb329, 0x1cf2: 0xb3d1, 0x1cf3: 0x0040, 0x1cf4: 0xb311, 0x1cf5: 0xb221, - 0x1cf6: 0xb239, 0x1cf7: 0xb281, 0x1cf8: 0x0040, 0x1cf9: 0xb341, 0x1cfa: 0x0040, 0x1cfb: 0xb3a1, + 0x1cc0: 0x20b1, 0x1cc1: 0x20b9, 0x1cc2: 0x20d9, 0x1cc3: 0x20f1, 0x1cc4: 0x2181, 0x1cc5: 0x2189, + 0x1cc6: 0x2109, 0x1cc7: 0x20e1, 0x1cc8: 0x2131, 0x1cc9: 0x2191, 0x1cca: 0x0040, 0x1ccb: 0x2169, + 0x1ccc: 0x2171, 0x1ccd: 0x2179, 0x1cce: 0x2111, 0x1ccf: 0x2141, 0x1cd0: 0x2151, 0x1cd1: 0x2121, + 0x1cd2: 0x2159, 0x1cd3: 0x2101, 0x1cd4: 0x2119, 0x1cd5: 0x20c9, 0x1cd6: 0x20d1, 0x1cd7: 0x20e9, + 0x1cd8: 0x20f9, 0x1cd9: 0x2129, 0x1cda: 0x2139, 0x1cdb: 0x2149, 0x1cdc: 0x0040, 0x1cdd: 0x0040, + 0x1cde: 0x0040, 0x1cdf: 0x0040, 0x1ce0: 0x0040, 0x1ce1: 0x20b9, 0x1ce2: 0x20d9, 0x1ce3: 0x20f1, + 0x1ce4: 0x0040, 0x1ce5: 0x2189, 0x1ce6: 0x2109, 0x1ce7: 0x20e1, 0x1ce8: 0x2131, 0x1ce9: 0x2191, + 0x1cea: 0x0040, 0x1ceb: 0x2169, 0x1cec: 0x2171, 0x1ced: 0x2179, 0x1cee: 0x2111, 0x1cef: 0x2141, + 0x1cf0: 0x2151, 0x1cf1: 0x2121, 0x1cf2: 0x2159, 0x1cf3: 0x2101, 0x1cf4: 0x2119, 0x1cf5: 0x20c9, + 0x1cf6: 0x20d1, 0x1cf7: 0x20e9, 0x1cf8: 0x20f9, 0x1cf9: 0x2129, 0x1cfa: 0x2139, 0x1cfb: 0x2149, 0x1cfc: 0x0040, 0x1cfd: 0x0040, 0x1cfe: 0x0040, 0x1cff: 0x0040, // Block 0x74, offset 0x1d00 - 0x1d00: 0x0040, 0x1d01: 0x0040, 0x1d02: 0xb251, 0x1d03: 0x0040, 0x1d04: 0x0040, 0x1d05: 0x0040, - 0x1d06: 0x0040, 0x1d07: 0xb269, 0x1d08: 0x0040, 0x1d09: 0xb479, 0x1d0a: 0x0040, 0x1d0b: 0xb401, - 0x1d0c: 0x0040, 0x1d0d: 0xb431, 0x1d0e: 0xb2f9, 0x1d0f: 0xb389, 0x1d10: 0x0040, 0x1d11: 0xb329, - 0x1d12: 0xb3d1, 0x1d13: 0x0040, 0x1d14: 0xb311, 0x1d15: 0x0040, 0x1d16: 0x0040, 0x1d17: 0xb281, - 0x1d18: 0x0040, 0x1d19: 0xb341, 0x1d1a: 0x0040, 0x1d1b: 0xb3a1, 0x1d1c: 0x0040, 0x1d1d: 0x7999, - 0x1d1e: 0x0040, 0x1d1f: 0xbcd9, 0x1d20: 0x0040, 0x1d21: 0xb1f1, 0x1d22: 0xb251, 0x1d23: 0x0040, - 0x1d24: 0xb449, 0x1d25: 0x0040, 0x1d26: 0x0040, 0x1d27: 0xb269, 0x1d28: 0xb359, 0x1d29: 0xb479, - 0x1d2a: 0xb3e9, 0x1d2b: 0x0040, 0x1d2c: 0xb419, 0x1d2d: 0xb431, 0x1d2e: 0xb2f9, 0x1d2f: 0xb389, - 0x1d30: 0xb3b9, 0x1d31: 0xb329, 0x1d32: 0xb3d1, 0x1d33: 0x0040, 0x1d34: 0xb311, 0x1d35: 0xb221, - 0x1d36: 0xb239, 0x1d37: 0xb281, 0x1d38: 0x0040, 0x1d39: 0xb341, 0x1d3a: 0xb371, 0x1d3b: 0xb3a1, - 0x1d3c: 0xbca9, 0x1d3d: 0x0040, 0x1d3e: 0xbcc1, 0x1d3f: 0x0040, + 0x1d00: 0x0040, 0x1d01: 0x232a, 0x1d02: 0x2332, 0x1d03: 0x233a, 0x1d04: 0x2342, 0x1d05: 0x234a, + 0x1d06: 0x2352, 0x1d07: 0x235a, 0x1d08: 0x2362, 0x1d09: 0x236a, 0x1d0a: 0x2372, 0x1d0b: 0x0018, + 0x1d0c: 0x0018, 0x1d0d: 0x0018, 0x1d0e: 0x0018, 0x1d0f: 0x0018, 0x1d10: 0x237a, 0x1d11: 0x2382, + 0x1d12: 0x238a, 0x1d13: 0x2392, 0x1d14: 0x239a, 0x1d15: 0x23a2, 0x1d16: 0x23aa, 0x1d17: 0x23b2, + 0x1d18: 0x23ba, 0x1d19: 0x23c2, 0x1d1a: 0x23ca, 0x1d1b: 0x23d2, 0x1d1c: 0x23da, 0x1d1d: 0x23e2, + 0x1d1e: 0x23ea, 0x1d1f: 0x23f2, 0x1d20: 0x23fa, 0x1d21: 0x2402, 0x1d22: 0x240a, 0x1d23: 0x2412, + 0x1d24: 0x241a, 0x1d25: 0x2422, 0x1d26: 0x242a, 0x1d27: 0x2432, 0x1d28: 0x243a, 0x1d29: 0x2442, + 0x1d2a: 0x2449, 0x1d2b: 0x03d9, 0x1d2c: 0x00b9, 0x1d2d: 0x1239, 0x1d2e: 0x2451, 0x1d2f: 0x0018, + 0x1d30: 0x0019, 0x1d31: 0x02e9, 0x1d32: 0x03d9, 0x1d33: 0x02f1, 0x1d34: 0x02f9, 0x1d35: 0x03f1, + 0x1d36: 0x0309, 0x1d37: 0x00a9, 0x1d38: 0x0311, 0x1d39: 0x00b1, 0x1d3a: 0x0319, 0x1d3b: 0x0101, + 0x1d3c: 0x0321, 0x1d3d: 0x0329, 0x1d3e: 0x0051, 0x1d3f: 0x0339, // Block 0x75, offset 0x1d40 - 0x1d40: 0xb1d9, 0x1d41: 0xb1f1, 0x1d42: 0xb251, 0x1d43: 0xb299, 0x1d44: 0xb449, 0x1d45: 0xb461, - 0x1d46: 0xb2e1, 0x1d47: 0xb269, 0x1d48: 0xb359, 0x1d49: 0xb479, 0x1d4a: 0x0040, 0x1d4b: 0xb401, - 0x1d4c: 0xb419, 0x1d4d: 0xb431, 0x1d4e: 0xb2f9, 0x1d4f: 0xb389, 0x1d50: 0xb3b9, 0x1d51: 0xb329, - 0x1d52: 0xb3d1, 0x1d53: 0xb2c9, 0x1d54: 0xb311, 0x1d55: 0xb221, 0x1d56: 0xb239, 0x1d57: 0xb281, - 0x1d58: 0xb2b1, 0x1d59: 0xb341, 0x1d5a: 0xb371, 0x1d5b: 0xb3a1, 0x1d5c: 0x0040, 0x1d5d: 0x0040, - 0x1d5e: 0x0040, 0x1d5f: 0x0040, 0x1d60: 0x0040, 0x1d61: 0xb1f1, 0x1d62: 0xb251, 0x1d63: 0xb299, - 0x1d64: 0x0040, 0x1d65: 0xb461, 0x1d66: 0xb2e1, 0x1d67: 0xb269, 0x1d68: 0xb359, 0x1d69: 0xb479, - 0x1d6a: 0x0040, 0x1d6b: 0xb401, 0x1d6c: 0xb419, 0x1d6d: 0xb431, 0x1d6e: 0xb2f9, 0x1d6f: 0xb389, - 0x1d70: 0xb3b9, 0x1d71: 0xb329, 0x1d72: 0xb3d1, 0x1d73: 0xb2c9, 0x1d74: 0xb311, 0x1d75: 0xb221, - 0x1d76: 0xb239, 0x1d77: 0xb281, 0x1d78: 0xb2b1, 0x1d79: 0xb341, 0x1d7a: 0xb371, 0x1d7b: 0xb3a1, - 0x1d7c: 0x0040, 0x1d7d: 0x0040, 0x1d7e: 0x0040, 0x1d7f: 0x0040, + 0x1d40: 0x0751, 0x1d41: 0x00b9, 0x1d42: 0x0089, 0x1d43: 0x0341, 0x1d44: 0x0349, 0x1d45: 0x0391, + 0x1d46: 0x00c1, 0x1d47: 0x0109, 0x1d48: 0x00c9, 0x1d49: 0x04b1, 0x1d4a: 0x2459, 0x1d4b: 0x11f9, + 0x1d4c: 0x2461, 0x1d4d: 0x04d9, 0x1d4e: 0x2469, 0x1d4f: 0x2471, 0x1d50: 0x0018, 0x1d51: 0x0018, + 0x1d52: 0x0018, 0x1d53: 0x0018, 0x1d54: 0x0018, 0x1d55: 0x0018, 0x1d56: 0x0018, 0x1d57: 0x0018, + 0x1d58: 0x0018, 0x1d59: 0x0018, 0x1d5a: 0x0018, 0x1d5b: 0x0018, 0x1d5c: 0x0018, 0x1d5d: 0x0018, + 0x1d5e: 0x0018, 0x1d5f: 0x0018, 0x1d60: 0x0018, 0x1d61: 0x0018, 0x1d62: 0x0018, 0x1d63: 0x0018, + 0x1d64: 0x0018, 0x1d65: 0x0018, 0x1d66: 0x0018, 0x1d67: 0x0018, 0x1d68: 0x0018, 0x1d69: 0x0018, + 0x1d6a: 0x2479, 0x1d6b: 0x2481, 0x1d6c: 0x2489, 0x1d6d: 0x0018, 0x1d6e: 0x0018, 0x1d6f: 0x0018, + 0x1d70: 0x0018, 0x1d71: 0x0018, 0x1d72: 0x0018, 0x1d73: 0x0018, 0x1d74: 0x0018, 0x1d75: 0x0018, + 0x1d76: 0x0018, 0x1d77: 0x0018, 0x1d78: 0x0018, 0x1d79: 0x0018, 0x1d7a: 0x0018, 0x1d7b: 0x0018, + 0x1d7c: 0x0018, 0x1d7d: 0x0018, 0x1d7e: 0x0018, 0x1d7f: 0x0018, // Block 0x76, offset 0x1d80 - 0x1d80: 0x0040, 0x1d81: 0xbcf2, 0x1d82: 0xbd0a, 0x1d83: 0xbd22, 0x1d84: 0xbd3a, 0x1d85: 0xbd52, - 0x1d86: 0xbd6a, 0x1d87: 0xbd82, 0x1d88: 0xbd9a, 0x1d89: 0xbdb2, 0x1d8a: 0xbdca, 0x1d8b: 0x0018, - 0x1d8c: 0x0018, 0x1d8d: 0x0018, 0x1d8e: 0x0018, 0x1d8f: 0x0018, 0x1d90: 0xbde2, 0x1d91: 0xbe02, - 0x1d92: 0xbe22, 0x1d93: 0xbe42, 0x1d94: 0xbe62, 0x1d95: 0xbe82, 0x1d96: 0xbea2, 0x1d97: 0xbec2, - 0x1d98: 0xbee2, 0x1d99: 0xbf02, 0x1d9a: 0xbf22, 0x1d9b: 0xbf42, 0x1d9c: 0xbf62, 0x1d9d: 0xbf82, - 0x1d9e: 0xbfa2, 0x1d9f: 0xbfc2, 0x1da0: 0xbfe2, 0x1da1: 0xc002, 0x1da2: 0xc022, 0x1da3: 0xc042, - 0x1da4: 0xc062, 0x1da5: 0xc082, 0x1da6: 0xc0a2, 0x1da7: 0xc0c2, 0x1da8: 0xc0e2, 0x1da9: 0xc102, - 0x1daa: 0xc121, 0x1dab: 0x1159, 0x1dac: 0x0269, 0x1dad: 0x66a9, 0x1dae: 0xc161, 0x1daf: 0x0018, - 0x1db0: 0x0039, 0x1db1: 0x0ee9, 0x1db2: 0x1159, 0x1db3: 0x0ef9, 0x1db4: 0x0f09, 0x1db5: 0x1199, - 0x1db6: 0x0f31, 0x1db7: 0x0249, 0x1db8: 0x0f41, 0x1db9: 0x0259, 0x1dba: 0x0f51, 0x1dbb: 0x0359, - 0x1dbc: 0x0f61, 0x1dbd: 0x0f71, 0x1dbe: 0x00d9, 0x1dbf: 0x0f99, + 0x1d80: 0x2499, 0x1d81: 0x24a1, 0x1d82: 0x24a9, 0x1d83: 0x0040, 0x1d84: 0x0040, 0x1d85: 0x0040, + 0x1d86: 0x0040, 0x1d87: 0x0040, 0x1d88: 0x0040, 0x1d89: 0x0040, 0x1d8a: 0x0040, 0x1d8b: 0x0040, + 0x1d8c: 0x0040, 0x1d8d: 0x0040, 0x1d8e: 0x0040, 0x1d8f: 0x0040, 0x1d90: 0x24b1, 0x1d91: 0x24b9, + 0x1d92: 0x24c1, 0x1d93: 0x24c9, 0x1d94: 0x24d1, 0x1d95: 0x24d9, 0x1d96: 0x24e1, 0x1d97: 0x24e9, + 0x1d98: 0x24f1, 0x1d99: 0x24f9, 0x1d9a: 0x2501, 0x1d9b: 0x2509, 0x1d9c: 0x2511, 0x1d9d: 0x2519, + 0x1d9e: 0x2521, 0x1d9f: 0x2529, 0x1da0: 0x2531, 0x1da1: 0x2539, 0x1da2: 0x2541, 0x1da3: 0x2549, + 0x1da4: 0x2551, 0x1da5: 0x2559, 0x1da6: 0x2561, 0x1da7: 0x2569, 0x1da8: 0x2571, 0x1da9: 0x2579, + 0x1daa: 0x2581, 0x1dab: 0x2589, 0x1dac: 0x2591, 0x1dad: 0x2599, 0x1dae: 0x25a1, 0x1daf: 0x25a9, + 0x1db0: 0x25b1, 0x1db1: 0x25b9, 0x1db2: 0x25c1, 0x1db3: 0x25c9, 0x1db4: 0x25d1, 0x1db5: 0x25d9, + 0x1db6: 0x25e1, 0x1db7: 0x25e9, 0x1db8: 0x25f1, 0x1db9: 0x25f9, 0x1dba: 0x2601, 0x1dbb: 0x2609, + 0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040, // Block 0x77, offset 0x1dc0 - 0x1dc0: 0x2039, 0x1dc1: 0x0269, 0x1dc2: 0x01d9, 0x1dc3: 0x0fa9, 0x1dc4: 0x0fb9, 0x1dc5: 0x1089, - 0x1dc6: 0x0279, 0x1dc7: 0x0369, 0x1dc8: 0x0289, 0x1dc9: 0x13d1, 0x1dca: 0xc179, 0x1dcb: 0x65e9, - 0x1dcc: 0xc191, 0x1dcd: 0x1441, 0x1dce: 0xc1a9, 0x1dcf: 0xc1c9, 0x1dd0: 0x0018, 0x1dd1: 0x0018, - 0x1dd2: 0x0018, 0x1dd3: 0x0018, 0x1dd4: 0x0018, 0x1dd5: 0x0018, 0x1dd6: 0x0018, 0x1dd7: 0x0018, - 0x1dd8: 0x0018, 0x1dd9: 0x0018, 0x1dda: 0x0018, 0x1ddb: 0x0018, 0x1ddc: 0x0018, 0x1ddd: 0x0018, - 0x1dde: 0x0018, 0x1ddf: 0x0018, 0x1de0: 0x0018, 0x1de1: 0x0018, 0x1de2: 0x0018, 0x1de3: 0x0018, - 0x1de4: 0x0018, 0x1de5: 0x0018, 0x1de6: 0x0018, 0x1de7: 0x0018, 0x1de8: 0x0018, 0x1de9: 0x0018, - 0x1dea: 0xc1e1, 0x1deb: 0xc1f9, 0x1dec: 0xc211, 0x1ded: 0x0018, 0x1dee: 0x0018, 0x1def: 0x0018, - 0x1df0: 0x0018, 0x1df1: 0x0018, 0x1df2: 0x0018, 0x1df3: 0x0018, 0x1df4: 0x0018, 0x1df5: 0x0018, - 0x1df6: 0x0018, 0x1df7: 0x0018, 0x1df8: 0x0018, 0x1df9: 0x0018, 0x1dfa: 0x0018, 0x1dfb: 0x0018, - 0x1dfc: 0x0018, 0x1dfd: 0x0018, 0x1dfe: 0x0018, 0x1dff: 0x0018, + 0x1dc0: 0x2669, 0x1dc1: 0x2671, 0x1dc2: 0x2679, 0x1dc3: 0x8b55, 0x1dc4: 0x2681, 0x1dc5: 0x2689, + 0x1dc6: 0x2691, 0x1dc7: 0x2699, 0x1dc8: 0x26a1, 0x1dc9: 0x26a9, 0x1dca: 0x26b1, 0x1dcb: 0x26b9, + 0x1dcc: 0x26c1, 0x1dcd: 0x8b75, 0x1dce: 0x26c9, 0x1dcf: 0x26d1, 0x1dd0: 0x26d9, 0x1dd1: 0x26e1, + 0x1dd2: 0x8b95, 0x1dd3: 0x26e9, 0x1dd4: 0x26f1, 0x1dd5: 0x2521, 0x1dd6: 0x8bb5, 0x1dd7: 0x26f9, + 0x1dd8: 0x2701, 0x1dd9: 0x2709, 0x1dda: 0x2711, 0x1ddb: 0x2719, 0x1ddc: 0x8bd5, 0x1ddd: 0x2721, + 0x1dde: 0x2729, 0x1ddf: 0x2731, 0x1de0: 0x2739, 0x1de1: 0x2741, 0x1de2: 0x25f9, 0x1de3: 0x2749, + 0x1de4: 0x2751, 0x1de5: 0x2759, 0x1de6: 0x2761, 0x1de7: 0x2769, 0x1de8: 0x2771, 0x1de9: 0x2779, + 0x1dea: 0x2781, 0x1deb: 0x2789, 0x1dec: 0x2791, 0x1ded: 0x2799, 0x1dee: 0x27a1, 0x1def: 0x27a9, + 0x1df0: 0x27b1, 0x1df1: 0x27b9, 0x1df2: 0x27b9, 0x1df3: 0x27b9, 0x1df4: 0x8bf5, 0x1df5: 0x27c1, + 0x1df6: 0x27c9, 0x1df7: 0x27d1, 0x1df8: 0x8c15, 0x1df9: 0x27d9, 0x1dfa: 0x27e1, 0x1dfb: 0x27e9, + 0x1dfc: 0x27f1, 0x1dfd: 0x27f9, 0x1dfe: 0x2801, 0x1dff: 0x2809, // Block 0x78, offset 0x1e00 - 0x1e00: 0xc241, 0x1e01: 0xc279, 0x1e02: 0xc2b1, 0x1e03: 0x0040, 0x1e04: 0x0040, 0x1e05: 0x0040, - 0x1e06: 0x0040, 0x1e07: 0x0040, 0x1e08: 0x0040, 0x1e09: 0x0040, 0x1e0a: 0x0040, 0x1e0b: 0x0040, - 0x1e0c: 0x0040, 0x1e0d: 0x0040, 0x1e0e: 0x0040, 0x1e0f: 0x0040, 0x1e10: 0xc2d1, 0x1e11: 0xc2f1, - 0x1e12: 0xc311, 0x1e13: 0xc331, 0x1e14: 0xc351, 0x1e15: 0xc371, 0x1e16: 0xc391, 0x1e17: 0xc3b1, - 0x1e18: 0xc3d1, 0x1e19: 0xc3f1, 0x1e1a: 0xc411, 0x1e1b: 0xc431, 0x1e1c: 0xc451, 0x1e1d: 0xc471, - 0x1e1e: 0xc491, 0x1e1f: 0xc4b1, 0x1e20: 0xc4d1, 0x1e21: 0xc4f1, 0x1e22: 0xc511, 0x1e23: 0xc531, - 0x1e24: 0xc551, 0x1e25: 0xc571, 0x1e26: 0xc591, 0x1e27: 0xc5b1, 0x1e28: 0xc5d1, 0x1e29: 0xc5f1, - 0x1e2a: 0xc611, 0x1e2b: 0xc631, 0x1e2c: 0xc651, 0x1e2d: 0xc671, 0x1e2e: 0xc691, 0x1e2f: 0xc6b1, - 0x1e30: 0xc6d1, 0x1e31: 0xc6f1, 0x1e32: 0xc711, 0x1e33: 0xc731, 0x1e34: 0xc751, 0x1e35: 0xc771, - 0x1e36: 0xc791, 0x1e37: 0xc7b1, 0x1e38: 0xc7d1, 0x1e39: 0xc7f1, 0x1e3a: 0xc811, 0x1e3b: 0xc831, - 0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040, + 0x1e00: 0x2811, 0x1e01: 0x2819, 0x1e02: 0x2821, 0x1e03: 0x2829, 0x1e04: 0x2831, 0x1e05: 0x2839, + 0x1e06: 0x2839, 0x1e07: 0x2841, 0x1e08: 0x2849, 0x1e09: 0x2851, 0x1e0a: 0x2859, 0x1e0b: 0x2861, + 0x1e0c: 0x2869, 0x1e0d: 0x2871, 0x1e0e: 0x2879, 0x1e0f: 0x2881, 0x1e10: 0x2889, 0x1e11: 0x2891, + 0x1e12: 0x2899, 0x1e13: 0x28a1, 0x1e14: 0x28a9, 0x1e15: 0x28b1, 0x1e16: 0x28b9, 0x1e17: 0x28c1, + 0x1e18: 0x28c9, 0x1e19: 0x8c35, 0x1e1a: 0x28d1, 0x1e1b: 0x28d9, 0x1e1c: 0x28e1, 0x1e1d: 0x24d9, + 0x1e1e: 0x28e9, 0x1e1f: 0x28f1, 0x1e20: 0x8c55, 0x1e21: 0x8c75, 0x1e22: 0x28f9, 0x1e23: 0x2901, + 0x1e24: 0x2909, 0x1e25: 0x2911, 0x1e26: 0x2919, 0x1e27: 0x2921, 0x1e28: 0x2040, 0x1e29: 0x2929, + 0x1e2a: 0x2931, 0x1e2b: 0x2931, 0x1e2c: 0x8c95, 0x1e2d: 0x2939, 0x1e2e: 0x2941, 0x1e2f: 0x2949, + 0x1e30: 0x2951, 0x1e31: 0x8cb5, 0x1e32: 0x2959, 0x1e33: 0x2961, 0x1e34: 0x2040, 0x1e35: 0x2969, + 0x1e36: 0x2971, 0x1e37: 0x2979, 0x1e38: 0x2981, 0x1e39: 0x2989, 0x1e3a: 0x2991, 0x1e3b: 0x8cd5, + 0x1e3c: 0x2999, 0x1e3d: 0x8cf5, 0x1e3e: 0x29a1, 0x1e3f: 0x29a9, // Block 0x79, offset 0x1e40 - 0x1e40: 0xcb61, 0x1e41: 0xcb81, 0x1e42: 0xcba1, 0x1e43: 0x8b55, 0x1e44: 0xcbc1, 0x1e45: 0xcbe1, - 0x1e46: 0xcc01, 0x1e47: 0xcc21, 0x1e48: 0xcc41, 0x1e49: 0xcc61, 0x1e4a: 0xcc81, 0x1e4b: 0xcca1, - 0x1e4c: 0xccc1, 0x1e4d: 0x8b75, 0x1e4e: 0xcce1, 0x1e4f: 0xcd01, 0x1e50: 0xcd21, 0x1e51: 0xcd41, - 0x1e52: 0x8b95, 0x1e53: 0xcd61, 0x1e54: 0xcd81, 0x1e55: 0xc491, 0x1e56: 0x8bb5, 0x1e57: 0xcda1, - 0x1e58: 0xcdc1, 0x1e59: 0xcde1, 0x1e5a: 0xce01, 0x1e5b: 0xce21, 0x1e5c: 0x8bd5, 0x1e5d: 0xce41, - 0x1e5e: 0xce61, 0x1e5f: 0xce81, 0x1e60: 0xcea1, 0x1e61: 0xcec1, 0x1e62: 0xc7f1, 0x1e63: 0xcee1, - 0x1e64: 0xcf01, 0x1e65: 0xcf21, 0x1e66: 0xcf41, 0x1e67: 0xcf61, 0x1e68: 0xcf81, 0x1e69: 0xcfa1, - 0x1e6a: 0xcfc1, 0x1e6b: 0xcfe1, 0x1e6c: 0xd001, 0x1e6d: 0xd021, 0x1e6e: 0xd041, 0x1e6f: 0xd061, - 0x1e70: 0xd081, 0x1e71: 0xd0a1, 0x1e72: 0xd0a1, 0x1e73: 0xd0a1, 0x1e74: 0x8bf5, 0x1e75: 0xd0c1, - 0x1e76: 0xd0e1, 0x1e77: 0xd101, 0x1e78: 0x8c15, 0x1e79: 0xd121, 0x1e7a: 0xd141, 0x1e7b: 0xd161, - 0x1e7c: 0xd181, 0x1e7d: 0xd1a1, 0x1e7e: 0xd1c1, 0x1e7f: 0xd1e1, + 0x1e40: 0x29b1, 0x1e41: 0x29b9, 0x1e42: 0x29c1, 0x1e43: 0x29c9, 0x1e44: 0x29d1, 0x1e45: 0x29d9, + 0x1e46: 0x29e1, 0x1e47: 0x29e9, 0x1e48: 0x29f1, 0x1e49: 0x8d15, 0x1e4a: 0x29f9, 0x1e4b: 0x2a01, + 0x1e4c: 0x2a09, 0x1e4d: 0x2a11, 0x1e4e: 0x2a19, 0x1e4f: 0x8d35, 0x1e50: 0x2a21, 0x1e51: 0x8d55, + 0x1e52: 0x8d75, 0x1e53: 0x2a29, 0x1e54: 0x2a31, 0x1e55: 0x2a31, 0x1e56: 0x2a39, 0x1e57: 0x8d95, + 0x1e58: 0x8db5, 0x1e59: 0x2a41, 0x1e5a: 0x2a49, 0x1e5b: 0x2a51, 0x1e5c: 0x2a59, 0x1e5d: 0x2a61, + 0x1e5e: 0x2a69, 0x1e5f: 0x2a71, 0x1e60: 0x2a79, 0x1e61: 0x2a81, 0x1e62: 0x2a89, 0x1e63: 0x2a91, + 0x1e64: 0x8dd5, 0x1e65: 0x2a99, 0x1e66: 0x2aa1, 0x1e67: 0x2aa9, 0x1e68: 0x2ab1, 0x1e69: 0x2aa9, + 0x1e6a: 0x2ab9, 0x1e6b: 0x2ac1, 0x1e6c: 0x2ac9, 0x1e6d: 0x2ad1, 0x1e6e: 0x2ad9, 0x1e6f: 0x2ae1, + 0x1e70: 0x2ae9, 0x1e71: 0x2af1, 0x1e72: 0x2af9, 0x1e73: 0x2b01, 0x1e74: 0x2b09, 0x1e75: 0x2b11, + 0x1e76: 0x2b19, 0x1e77: 0x2b21, 0x1e78: 0x8df5, 0x1e79: 0x2b29, 0x1e7a: 0x2b31, 0x1e7b: 0x2b39, + 0x1e7c: 0x2b41, 0x1e7d: 0x2b49, 0x1e7e: 0x8e15, 0x1e7f: 0x2b51, // Block 0x7a, offset 0x1e80 - 0x1e80: 0xd201, 0x1e81: 0xd221, 0x1e82: 0xd241, 0x1e83: 0xd261, 0x1e84: 0xd281, 0x1e85: 0xd2a1, - 0x1e86: 0xd2a1, 0x1e87: 0xd2c1, 0x1e88: 0xd2e1, 0x1e89: 0xd301, 0x1e8a: 0xd321, 0x1e8b: 0xd341, - 0x1e8c: 0xd361, 0x1e8d: 0xd381, 0x1e8e: 0xd3a1, 0x1e8f: 0xd3c1, 0x1e90: 0xd3e1, 0x1e91: 0xd401, - 0x1e92: 0xd421, 0x1e93: 0xd441, 0x1e94: 0xd461, 0x1e95: 0xd481, 0x1e96: 0xd4a1, 0x1e97: 0xd4c1, - 0x1e98: 0xd4e1, 0x1e99: 0x8c35, 0x1e9a: 0xd501, 0x1e9b: 0xd521, 0x1e9c: 0xd541, 0x1e9d: 0xc371, - 0x1e9e: 0xd561, 0x1e9f: 0xd581, 0x1ea0: 0x8c55, 0x1ea1: 0x8c75, 0x1ea2: 0xd5a1, 0x1ea3: 0xd5c1, - 0x1ea4: 0xd5e1, 0x1ea5: 0xd601, 0x1ea6: 0xd621, 0x1ea7: 0xd641, 0x1ea8: 0x2040, 0x1ea9: 0xd661, - 0x1eaa: 0xd681, 0x1eab: 0xd681, 0x1eac: 0x8c95, 0x1ead: 0xd6a1, 0x1eae: 0xd6c1, 0x1eaf: 0xd6e1, - 0x1eb0: 0xd701, 0x1eb1: 0x8cb5, 0x1eb2: 0xd721, 0x1eb3: 0xd741, 0x1eb4: 0x2040, 0x1eb5: 0xd761, - 0x1eb6: 0xd781, 0x1eb7: 0xd7a1, 0x1eb8: 0xd7c1, 0x1eb9: 0xd7e1, 0x1eba: 0xd801, 0x1ebb: 0x8cd5, - 0x1ebc: 0xd821, 0x1ebd: 0x8cf5, 0x1ebe: 0xd841, 0x1ebf: 0xd861, + 0x1e80: 0x2b59, 0x1e81: 0x2b61, 0x1e82: 0x2b69, 0x1e83: 0x2b71, 0x1e84: 0x2b79, 0x1e85: 0x2b81, + 0x1e86: 0x2b89, 0x1e87: 0x2b91, 0x1e88: 0x2b99, 0x1e89: 0x2ba1, 0x1e8a: 0x8e35, 0x1e8b: 0x2ba9, + 0x1e8c: 0x2bb1, 0x1e8d: 0x2bb9, 0x1e8e: 0x2bc1, 0x1e8f: 0x2bc9, 0x1e90: 0x2bd1, 0x1e91: 0x2bd9, + 0x1e92: 0x2be1, 0x1e93: 0x2be9, 0x1e94: 0x2bf1, 0x1e95: 0x2bf9, 0x1e96: 0x2c01, 0x1e97: 0x2c09, + 0x1e98: 0x2c11, 0x1e99: 0x2c19, 0x1e9a: 0x2c21, 0x1e9b: 0x2c29, 0x1e9c: 0x2c31, 0x1e9d: 0x8e55, + 0x1e9e: 0x2c39, 0x1e9f: 0x2c41, 0x1ea0: 0x2c49, 0x1ea1: 0x2c51, 0x1ea2: 0x2c59, 0x1ea3: 0x8e75, + 0x1ea4: 0x2c61, 0x1ea5: 0x2c69, 0x1ea6: 0x2c71, 0x1ea7: 0x2c79, 0x1ea8: 0x2c81, 0x1ea9: 0x2c89, + 0x1eaa: 0x2c91, 0x1eab: 0x2c99, 0x1eac: 0x7f0d, 0x1ead: 0x2ca1, 0x1eae: 0x2ca9, 0x1eaf: 0x2cb1, + 0x1eb0: 0x8e95, 0x1eb1: 0x2cb9, 0x1eb2: 0x2cc1, 0x1eb3: 0x2cc9, 0x1eb4: 0x2cd1, 0x1eb5: 0x2cd9, + 0x1eb6: 0x2ce1, 0x1eb7: 0x8eb5, 0x1eb8: 0x8ed5, 0x1eb9: 0x8ef5, 0x1eba: 0x2ce9, 0x1ebb: 0x8f15, + 0x1ebc: 0x2cf1, 0x1ebd: 0x2cf9, 0x1ebe: 0x2d01, 0x1ebf: 0x2d09, // Block 0x7b, offset 0x1ec0 - 0x1ec0: 0xd881, 0x1ec1: 0xd8a1, 0x1ec2: 0xd8c1, 0x1ec3: 0xd8e1, 0x1ec4: 0xd901, 0x1ec5: 0xd921, - 0x1ec6: 0xd941, 0x1ec7: 0xd961, 0x1ec8: 0xd981, 0x1ec9: 0x8d15, 0x1eca: 0xd9a1, 0x1ecb: 0xd9c1, - 0x1ecc: 0xd9e1, 0x1ecd: 0xda01, 0x1ece: 0xda21, 0x1ecf: 0x8d35, 0x1ed0: 0xda41, 0x1ed1: 0x8d55, - 0x1ed2: 0x8d75, 0x1ed3: 0xda61, 0x1ed4: 0xda81, 0x1ed5: 0xda81, 0x1ed6: 0xdaa1, 0x1ed7: 0x8d95, - 0x1ed8: 0x8db5, 0x1ed9: 0xdac1, 0x1eda: 0xdae1, 0x1edb: 0xdb01, 0x1edc: 0xdb21, 0x1edd: 0xdb41, - 0x1ede: 0xdb61, 0x1edf: 0xdb81, 0x1ee0: 0xdba1, 0x1ee1: 0xdbc1, 0x1ee2: 0xdbe1, 0x1ee3: 0xdc01, - 0x1ee4: 0x8dd5, 0x1ee5: 0xdc21, 0x1ee6: 0xdc41, 0x1ee7: 0xdc61, 0x1ee8: 0xdc81, 0x1ee9: 0xdc61, - 0x1eea: 0xdca1, 0x1eeb: 0xdcc1, 0x1eec: 0xdce1, 0x1eed: 0xdd01, 0x1eee: 0xdd21, 0x1eef: 0xdd41, - 0x1ef0: 0xdd61, 0x1ef1: 0xdd81, 0x1ef2: 0xdda1, 0x1ef3: 0xddc1, 0x1ef4: 0xdde1, 0x1ef5: 0xde01, - 0x1ef6: 0xde21, 0x1ef7: 0xde41, 0x1ef8: 0x8df5, 0x1ef9: 0xde61, 0x1efa: 0xde81, 0x1efb: 0xdea1, - 0x1efc: 0xdec1, 0x1efd: 0xdee1, 0x1efe: 0x8e15, 0x1eff: 0xdf01, + 0x1ec0: 0x2d11, 0x1ec1: 0x2d19, 0x1ec2: 0x2d21, 0x1ec3: 0x2d29, 0x1ec4: 0x2d31, 0x1ec5: 0x2d39, + 0x1ec6: 0x8f35, 0x1ec7: 0x2d41, 0x1ec8: 0x2d49, 0x1ec9: 0x2d51, 0x1eca: 0x2d59, 0x1ecb: 0x2d61, + 0x1ecc: 0x2d69, 0x1ecd: 0x8f55, 0x1ece: 0x2d71, 0x1ecf: 0x2d79, 0x1ed0: 0x8f75, 0x1ed1: 0x8f95, + 0x1ed2: 0x2d81, 0x1ed3: 0x2d89, 0x1ed4: 0x2d91, 0x1ed5: 0x2d99, 0x1ed6: 0x2da1, 0x1ed7: 0x2da9, + 0x1ed8: 0x2db1, 0x1ed9: 0x2db9, 0x1eda: 0x2dc1, 0x1edb: 0x8fb5, 0x1edc: 0x2dc9, 0x1edd: 0x8fd5, + 0x1ede: 0x2dd1, 0x1edf: 0x2040, 0x1ee0: 0x2dd9, 0x1ee1: 0x2de1, 0x1ee2: 0x2de9, 0x1ee3: 0x8ff5, + 0x1ee4: 0x2df1, 0x1ee5: 0x2df9, 0x1ee6: 0x9015, 0x1ee7: 0x9035, 0x1ee8: 0x2e01, 0x1ee9: 0x2e09, + 0x1eea: 0x2e11, 0x1eeb: 0x2e19, 0x1eec: 0x2e21, 0x1eed: 0x2e21, 0x1eee: 0x2e29, 0x1eef: 0x2e31, + 0x1ef0: 0x2e39, 0x1ef1: 0x2e41, 0x1ef2: 0x2e49, 0x1ef3: 0x2e51, 0x1ef4: 0x2e59, 0x1ef5: 0x9055, + 0x1ef6: 0x2e61, 0x1ef7: 0x9075, 0x1ef8: 0x2e69, 0x1ef9: 0x9095, 0x1efa: 0x2e71, 0x1efb: 0x90b5, + 0x1efc: 0x90d5, 0x1efd: 0x90f5, 0x1efe: 0x2e79, 0x1eff: 0x2e81, // Block 0x7c, offset 0x1f00 - 0x1f00: 0xe601, 0x1f01: 0xe621, 0x1f02: 0xe641, 0x1f03: 0xe661, 0x1f04: 0xe681, 0x1f05: 0xe6a1, - 0x1f06: 0x8f35, 0x1f07: 0xe6c1, 0x1f08: 0xe6e1, 0x1f09: 0xe701, 0x1f0a: 0xe721, 0x1f0b: 0xe741, - 0x1f0c: 0xe761, 0x1f0d: 0x8f55, 0x1f0e: 0xe781, 0x1f0f: 0xe7a1, 0x1f10: 0x8f75, 0x1f11: 0x8f95, - 0x1f12: 0xe7c1, 0x1f13: 0xe7e1, 0x1f14: 0xe801, 0x1f15: 0xe821, 0x1f16: 0xe841, 0x1f17: 0xe861, - 0x1f18: 0xe881, 0x1f19: 0xe8a1, 0x1f1a: 0xe8c1, 0x1f1b: 0x8fb5, 0x1f1c: 0xe8e1, 0x1f1d: 0x8fd5, - 0x1f1e: 0xe901, 0x1f1f: 0x2040, 0x1f20: 0xe921, 0x1f21: 0xe941, 0x1f22: 0xe961, 0x1f23: 0x8ff5, - 0x1f24: 0xe981, 0x1f25: 0xe9a1, 0x1f26: 0x9015, 0x1f27: 0x9035, 0x1f28: 0xe9c1, 0x1f29: 0xe9e1, - 0x1f2a: 0xea01, 0x1f2b: 0xea21, 0x1f2c: 0xea41, 0x1f2d: 0xea41, 0x1f2e: 0xea61, 0x1f2f: 0xea81, - 0x1f30: 0xeaa1, 0x1f31: 0xeac1, 0x1f32: 0xeae1, 0x1f33: 0xeb01, 0x1f34: 0xeb21, 0x1f35: 0x9055, - 0x1f36: 0xeb41, 0x1f37: 0x9075, 0x1f38: 0xeb61, 0x1f39: 0x9095, 0x1f3a: 0xeb81, 0x1f3b: 0x90b5, - 0x1f3c: 0x90d5, 0x1f3d: 0x90f5, 0x1f3e: 0xeba1, 0x1f3f: 0xebc1, + 0x1f00: 0x2e89, 0x1f01: 0x9115, 0x1f02: 0x9135, 0x1f03: 0x9155, 0x1f04: 0x9175, 0x1f05: 0x2e91, + 0x1f06: 0x2e99, 0x1f07: 0x2e99, 0x1f08: 0x2ea1, 0x1f09: 0x2ea9, 0x1f0a: 0x2eb1, 0x1f0b: 0x2eb9, + 0x1f0c: 0x2ec1, 0x1f0d: 0x9195, 0x1f0e: 0x2ec9, 0x1f0f: 0x2ed1, 0x1f10: 0x2ed9, 0x1f11: 0x2ee1, + 0x1f12: 0x91b5, 0x1f13: 0x2ee9, 0x1f14: 0x91d5, 0x1f15: 0x91f5, 0x1f16: 0x2ef1, 0x1f17: 0x2ef9, + 0x1f18: 0x2f01, 0x1f19: 0x2f09, 0x1f1a: 0x2f11, 0x1f1b: 0x2f19, 0x1f1c: 0x9215, 0x1f1d: 0x9235, + 0x1f1e: 0x9255, 0x1f1f: 0x2040, 0x1f20: 0x2f21, 0x1f21: 0x9275, 0x1f22: 0x2f29, 0x1f23: 0x2f31, + 0x1f24: 0x2f39, 0x1f25: 0x9295, 0x1f26: 0x2f41, 0x1f27: 0x2f49, 0x1f28: 0x2f51, 0x1f29: 0x2f59, + 0x1f2a: 0x2f61, 0x1f2b: 0x92b5, 0x1f2c: 0x2f69, 0x1f2d: 0x2f71, 0x1f2e: 0x2f79, 0x1f2f: 0x2f81, + 0x1f30: 0x2f89, 0x1f31: 0x2f91, 0x1f32: 0x92d5, 0x1f33: 0x92f5, 0x1f34: 0x2f99, 0x1f35: 0x9315, + 0x1f36: 0x2fa1, 0x1f37: 0x9335, 0x1f38: 0x2fa9, 0x1f39: 0x2fb1, 0x1f3a: 0x2fb9, 0x1f3b: 0x9355, + 0x1f3c: 0x9375, 0x1f3d: 0x2fc1, 0x1f3e: 0x9395, 0x1f3f: 0x2fc9, // Block 0x7d, offset 0x1f40 - 0x1f40: 0xebe1, 0x1f41: 0x9115, 0x1f42: 0x9135, 0x1f43: 0x9155, 0x1f44: 0x9175, 0x1f45: 0xec01, - 0x1f46: 0xec21, 0x1f47: 0xec21, 0x1f48: 0xec41, 0x1f49: 0xec61, 0x1f4a: 0xec81, 0x1f4b: 0xeca1, - 0x1f4c: 0xecc1, 0x1f4d: 0x9195, 0x1f4e: 0xece1, 0x1f4f: 0xed01, 0x1f50: 0xed21, 0x1f51: 0xed41, - 0x1f52: 0x91b5, 0x1f53: 0xed61, 0x1f54: 0x91d5, 0x1f55: 0x91f5, 0x1f56: 0xed81, 0x1f57: 0xeda1, - 0x1f58: 0xedc1, 0x1f59: 0xede1, 0x1f5a: 0xee01, 0x1f5b: 0xee21, 0x1f5c: 0x9215, 0x1f5d: 0x9235, - 0x1f5e: 0x9255, 0x1f5f: 0x2040, 0x1f60: 0xee41, 0x1f61: 0x9275, 0x1f62: 0xee61, 0x1f63: 0xee81, - 0x1f64: 0xeea1, 0x1f65: 0x9295, 0x1f66: 0xeec1, 0x1f67: 0xeee1, 0x1f68: 0xef01, 0x1f69: 0xef21, - 0x1f6a: 0xef41, 0x1f6b: 0x92b5, 0x1f6c: 0xef61, 0x1f6d: 0xef81, 0x1f6e: 0xefa1, 0x1f6f: 0xefc1, - 0x1f70: 0xefe1, 0x1f71: 0xf001, 0x1f72: 0x92d5, 0x1f73: 0x92f5, 0x1f74: 0xf021, 0x1f75: 0x9315, - 0x1f76: 0xf041, 0x1f77: 0x9335, 0x1f78: 0xf061, 0x1f79: 0xf081, 0x1f7a: 0xf0a1, 0x1f7b: 0x9355, - 0x1f7c: 0x9375, 0x1f7d: 0xf0c1, 0x1f7e: 0x9395, 0x1f7f: 0xf0e1, + 0x1f40: 0x93b5, 0x1f41: 0x2fd1, 0x1f42: 0x2fd9, 0x1f43: 0x2fe1, 0x1f44: 0x2fe9, 0x1f45: 0x2ff1, + 0x1f46: 0x2ff9, 0x1f47: 0x93d5, 0x1f48: 0x93f5, 0x1f49: 0x9415, 0x1f4a: 0x9435, 0x1f4b: 0x2a29, + 0x1f4c: 0x3001, 0x1f4d: 0x3009, 0x1f4e: 0x3011, 0x1f4f: 0x3019, 0x1f50: 0x3021, 0x1f51: 0x3029, + 0x1f52: 0x3031, 0x1f53: 0x3039, 0x1f54: 0x3041, 0x1f55: 0x3049, 0x1f56: 0x3051, 0x1f57: 0x9455, + 0x1f58: 0x3059, 0x1f59: 0x3061, 0x1f5a: 0x3069, 0x1f5b: 0x3071, 0x1f5c: 0x3079, 0x1f5d: 0x3081, + 0x1f5e: 0x3089, 0x1f5f: 0x3091, 0x1f60: 0x3099, 0x1f61: 0x30a1, 0x1f62: 0x30a9, 0x1f63: 0x30b1, + 0x1f64: 0x9475, 0x1f65: 0x9495, 0x1f66: 0x94b5, 0x1f67: 0x30b9, 0x1f68: 0x30c1, 0x1f69: 0x30c9, + 0x1f6a: 0x30d1, 0x1f6b: 0x94d5, 0x1f6c: 0x30d9, 0x1f6d: 0x94f5, 0x1f6e: 0x30e1, 0x1f6f: 0x30e9, + 0x1f70: 0x9515, 0x1f71: 0x9535, 0x1f72: 0x30f1, 0x1f73: 0x30f9, 0x1f74: 0x3101, 0x1f75: 0x3109, + 0x1f76: 0x3111, 0x1f77: 0x3119, 0x1f78: 0x3121, 0x1f79: 0x3129, 0x1f7a: 0x3131, 0x1f7b: 0x3139, + 0x1f7c: 0x3141, 0x1f7d: 0x3149, 0x1f7e: 0x3151, 0x1f7f: 0x2040, // Block 0x7e, offset 0x1f80 - 0x1f80: 0xf721, 0x1f81: 0xf741, 0x1f82: 0xf761, 0x1f83: 0xf781, 0x1f84: 0xf7a1, 0x1f85: 0x9555, - 0x1f86: 0xf7c1, 0x1f87: 0xf7e1, 0x1f88: 0xf801, 0x1f89: 0xf821, 0x1f8a: 0xf841, 0x1f8b: 0x9575, - 0x1f8c: 0x9595, 0x1f8d: 0xf861, 0x1f8e: 0xf881, 0x1f8f: 0xf8a1, 0x1f90: 0xf8c1, 0x1f91: 0xf8e1, - 0x1f92: 0xf901, 0x1f93: 0x95b5, 0x1f94: 0xf921, 0x1f95: 0xf941, 0x1f96: 0xf961, 0x1f97: 0xf981, - 0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0xf9a1, 0x1f9b: 0xf9c1, 0x1f9c: 0xf9e1, 0x1f9d: 0x9615, - 0x1f9e: 0xfa01, 0x1f9f: 0xfa21, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0xfa41, 0x1fa3: 0xfa61, - 0x1fa4: 0xfa81, 0x1fa5: 0x9655, 0x1fa6: 0xfaa1, 0x1fa7: 0xfac1, 0x1fa8: 0xfae1, 0x1fa9: 0xfb01, - 0x1faa: 0xfb21, 0x1fab: 0xfb41, 0x1fac: 0xfb61, 0x1fad: 0x9675, 0x1fae: 0xfb81, 0x1faf: 0xfba1, - 0x1fb0: 0xfbc1, 0x1fb1: 0x9695, 0x1fb2: 0xfbe1, 0x1fb3: 0xfc01, 0x1fb4: 0xfc21, 0x1fb5: 0xfc41, - 0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0xfc61, 0x1fb9: 0xfc81, 0x1fba: 0xfca1, 0x1fbb: 0x96d5, - 0x1fbc: 0xfcc1, 0x1fbd: 0x96f5, 0x1fbe: 0xfce1, 0x1fbf: 0xfce1, + 0x1f80: 0x3159, 0x1f81: 0x3161, 0x1f82: 0x3169, 0x1f83: 0x3171, 0x1f84: 0x3179, 0x1f85: 0x9555, + 0x1f86: 0x3181, 0x1f87: 0x3189, 0x1f88: 0x3191, 0x1f89: 0x3199, 0x1f8a: 0x31a1, 0x1f8b: 0x9575, + 0x1f8c: 0x9595, 0x1f8d: 0x31a9, 0x1f8e: 0x31b1, 0x1f8f: 0x31b9, 0x1f90: 0x31c1, 0x1f91: 0x31c9, + 0x1f92: 0x31d1, 0x1f93: 0x95b5, 0x1f94: 0x31d9, 0x1f95: 0x31e1, 0x1f96: 0x31e9, 0x1f97: 0x31f1, + 0x1f98: 0x95d5, 0x1f99: 0x95f5, 0x1f9a: 0x31f9, 0x1f9b: 0x3201, 0x1f9c: 0x3209, 0x1f9d: 0x9615, + 0x1f9e: 0x3211, 0x1f9f: 0x3219, 0x1fa0: 0x684d, 0x1fa1: 0x9635, 0x1fa2: 0x3221, 0x1fa3: 0x3229, + 0x1fa4: 0x3231, 0x1fa5: 0x9655, 0x1fa6: 0x3239, 0x1fa7: 0x3241, 0x1fa8: 0x3249, 0x1fa9: 0x3251, + 0x1faa: 0x3259, 0x1fab: 0x3261, 0x1fac: 0x3269, 0x1fad: 0x9675, 0x1fae: 0x3271, 0x1faf: 0x3279, + 0x1fb0: 0x3281, 0x1fb1: 0x9695, 0x1fb2: 0x3289, 0x1fb3: 0x3291, 0x1fb4: 0x3299, 0x1fb5: 0x32a1, + 0x1fb6: 0x7b6d, 0x1fb7: 0x96b5, 0x1fb8: 0x32a9, 0x1fb9: 0x32b1, 0x1fba: 0x32b9, 0x1fbb: 0x96d5, + 0x1fbc: 0x32c1, 0x1fbd: 0x96f5, 0x1fbe: 0x32c9, 0x1fbf: 0x32c9, // Block 0x7f, offset 0x1fc0 - 0x1fc0: 0xfd01, 0x1fc1: 0x9715, 0x1fc2: 0xfd21, 0x1fc3: 0xfd41, 0x1fc4: 0xfd61, 0x1fc5: 0xfd81, - 0x1fc6: 0xfda1, 0x1fc7: 0xfdc1, 0x1fc8: 0xfde1, 0x1fc9: 0x9735, 0x1fca: 0xfe01, 0x1fcb: 0xfe21, - 0x1fcc: 0xfe41, 0x1fcd: 0xfe61, 0x1fce: 0xfe81, 0x1fcf: 0xfea1, 0x1fd0: 0x9755, 0x1fd1: 0xfec1, - 0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0xfee1, 0x1fd6: 0xff01, 0x1fd7: 0xff21, - 0x1fd8: 0xff41, 0x1fd9: 0xff61, 0x1fda: 0xff81, 0x1fdb: 0xffa1, 0x1fdc: 0xffc1, 0x1fdd: 0x97d5, + 0x1fc0: 0x32d1, 0x1fc1: 0x9715, 0x1fc2: 0x32d9, 0x1fc3: 0x32e1, 0x1fc4: 0x32e9, 0x1fc5: 0x32f1, + 0x1fc6: 0x32f9, 0x1fc7: 0x3301, 0x1fc8: 0x3309, 0x1fc9: 0x9735, 0x1fca: 0x3311, 0x1fcb: 0x3319, + 0x1fcc: 0x3321, 0x1fcd: 0x3329, 0x1fce: 0x3331, 0x1fcf: 0x3339, 0x1fd0: 0x9755, 0x1fd1: 0x3341, + 0x1fd2: 0x9775, 0x1fd3: 0x9795, 0x1fd4: 0x97b5, 0x1fd5: 0x3349, 0x1fd6: 0x3351, 0x1fd7: 0x3359, + 0x1fd8: 0x3361, 0x1fd9: 0x3369, 0x1fda: 0x3371, 0x1fdb: 0x3379, 0x1fdc: 0x3381, 0x1fdd: 0x97d5, 0x1fde: 0x0040, 0x1fdf: 0x0040, 0x1fe0: 0x0040, 0x1fe1: 0x0040, 0x1fe2: 0x0040, 0x1fe3: 0x0040, 0x1fe4: 0x0040, 0x1fe5: 0x0040, 0x1fe6: 0x0040, 0x1fe7: 0x0040, 0x1fe8: 0x0040, 0x1fe9: 0x0040, 0x1fea: 0x0040, 0x1feb: 0x0040, 0x1fec: 0x0040, 0x1fed: 0x0040, 0x1fee: 0x0040, 0x1fef: 0x0040, @@ -2134,7 +2277,7 @@ var idnaIndex = [2368]uint16{ 0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37, // Block 0x7, offset 0x1c0 0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1, - 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41, + 0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0xe3, 0x1cd: 0xe4, 0x1ce: 0x3e, 0x1cf: 0x3f, 0x1d0: 0xa0, 0x1d1: 0xa0, 0x1d2: 0xa0, 0x1d3: 0xa0, 0x1d4: 0xa0, 0x1d5: 0xa0, 0x1d6: 0xa0, 0x1d7: 0xa0, 0x1d8: 0xa0, 0x1d9: 0xa0, 0x1da: 0xa0, 0x1db: 0xa0, 0x1dc: 0xa0, 0x1dd: 0xa0, 0x1de: 0xa0, 0x1df: 0xa0, 0x1e0: 0xa0, 0x1e1: 0xa0, 0x1e2: 0xa0, 0x1e3: 0xa0, 0x1e4: 0xa0, 0x1e5: 0xa0, 0x1e6: 0xa0, 0x1e7: 0xa0, @@ -2167,143 +2310,143 @@ var idnaIndex = [2368]uint16{ 0x2a0: 0xa0, 0x2a1: 0xa0, 0x2a2: 0xa0, 0x2a3: 0xa0, 0x2a4: 0xa0, 0x2a5: 0xa0, 0x2a6: 0xa0, 0x2a7: 0xa0, 0x2a8: 0xa0, 0x2a9: 0xa0, 0x2aa: 0xa0, 0x2ab: 0xa0, 0x2ac: 0xa0, 0x2ad: 0xa0, 0x2ae: 0xa0, 0x2af: 0xa0, 0x2b0: 0xa0, 0x2b1: 0xa0, 0x2b2: 0xa0, 0x2b3: 0xa0, 0x2b4: 0xa0, 0x2b5: 0xa0, 0x2b6: 0xa0, 0x2b7: 0xa0, - 0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe3, + 0x2b8: 0xa0, 0x2b9: 0xa0, 0x2ba: 0xa0, 0x2bb: 0xa0, 0x2bc: 0xa0, 0x2bd: 0xa0, 0x2be: 0xa0, 0x2bf: 0xe5, // Block 0xb, offset 0x2c0 0x2c0: 0xa0, 0x2c1: 0xa0, 0x2c2: 0xa0, 0x2c3: 0xa0, 0x2c4: 0xa0, 0x2c5: 0xa0, 0x2c6: 0xa0, 0x2c7: 0xa0, 0x2c8: 0xa0, 0x2c9: 0xa0, 0x2ca: 0xa0, 0x2cb: 0xa0, 0x2cc: 0xa0, 0x2cd: 0xa0, 0x2ce: 0xa0, 0x2cf: 0xa0, - 0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0, - 0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8, - 0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0, - 0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8, + 0x2d0: 0xa0, 0x2d1: 0xa0, 0x2d2: 0xe6, 0x2d3: 0xe7, 0x2d4: 0xa0, 0x2d5: 0xa0, 0x2d6: 0xa0, 0x2d7: 0xa0, + 0x2d8: 0xe8, 0x2d9: 0x40, 0x2da: 0x41, 0x2db: 0xe9, 0x2dc: 0x42, 0x2dd: 0x43, 0x2de: 0x44, 0x2df: 0xea, + 0x2e0: 0xeb, 0x2e1: 0xec, 0x2e2: 0xed, 0x2e3: 0xee, 0x2e4: 0xef, 0x2e5: 0xf0, 0x2e6: 0xf1, 0x2e7: 0xf2, + 0x2e8: 0xf3, 0x2e9: 0xf4, 0x2ea: 0xf5, 0x2eb: 0xf6, 0x2ec: 0xf7, 0x2ed: 0xf8, 0x2ee: 0xf9, 0x2ef: 0xfa, 0x2f0: 0xa0, 0x2f1: 0xa0, 0x2f2: 0xa0, 0x2f3: 0xa0, 0x2f4: 0xa0, 0x2f5: 0xa0, 0x2f6: 0xa0, 0x2f7: 0xa0, 0x2f8: 0xa0, 0x2f9: 0xa0, 0x2fa: 0xa0, 0x2fb: 0xa0, 0x2fc: 0xa0, 0x2fd: 0xa0, 0x2fe: 0xa0, 0x2ff: 0xa0, // Block 0xc, offset 0x300 0x300: 0xa0, 0x301: 0xa0, 0x302: 0xa0, 0x303: 0xa0, 0x304: 0xa0, 0x305: 0xa0, 0x306: 0xa0, 0x307: 0xa0, 0x308: 0xa0, 0x309: 0xa0, 0x30a: 0xa0, 0x30b: 0xa0, 0x30c: 0xa0, 0x30d: 0xa0, 0x30e: 0xa0, 0x30f: 0xa0, 0x310: 0xa0, 0x311: 0xa0, 0x312: 0xa0, 0x313: 0xa0, 0x314: 0xa0, 0x315: 0xa0, 0x316: 0xa0, 0x317: 0xa0, - 0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xf9, 0x31f: 0xfa, + 0x318: 0xa0, 0x319: 0xa0, 0x31a: 0xa0, 0x31b: 0xa0, 0x31c: 0xa0, 0x31d: 0xa0, 0x31e: 0xfb, 0x31f: 0xfc, // Block 0xd, offset 0x340 - 0x340: 0xfb, 0x341: 0xfb, 0x342: 0xfb, 0x343: 0xfb, 0x344: 0xfb, 0x345: 0xfb, 0x346: 0xfb, 0x347: 0xfb, - 0x348: 0xfb, 0x349: 0xfb, 0x34a: 0xfb, 0x34b: 0xfb, 0x34c: 0xfb, 0x34d: 0xfb, 0x34e: 0xfb, 0x34f: 0xfb, - 0x350: 0xfb, 0x351: 0xfb, 0x352: 0xfb, 0x353: 0xfb, 0x354: 0xfb, 0x355: 0xfb, 0x356: 0xfb, 0x357: 0xfb, - 0x358: 0xfb, 0x359: 0xfb, 0x35a: 0xfb, 0x35b: 0xfb, 0x35c: 0xfb, 0x35d: 0xfb, 0x35e: 0xfb, 0x35f: 0xfb, - 0x360: 0xfb, 0x361: 0xfb, 0x362: 0xfb, 0x363: 0xfb, 0x364: 0xfb, 0x365: 0xfb, 0x366: 0xfb, 0x367: 0xfb, - 0x368: 0xfb, 0x369: 0xfb, 0x36a: 0xfb, 0x36b: 0xfb, 0x36c: 0xfb, 0x36d: 0xfb, 0x36e: 0xfb, 0x36f: 0xfb, - 0x370: 0xfb, 0x371: 0xfb, 0x372: 0xfb, 0x373: 0xfb, 0x374: 0xfb, 0x375: 0xfb, 0x376: 0xfb, 0x377: 0xfb, - 0x378: 0xfb, 0x379: 0xfb, 0x37a: 0xfb, 0x37b: 0xfb, 0x37c: 0xfb, 0x37d: 0xfb, 0x37e: 0xfb, 0x37f: 0xfb, + 0x340: 0xfd, 0x341: 0xfd, 0x342: 0xfd, 0x343: 0xfd, 0x344: 0xfd, 0x345: 0xfd, 0x346: 0xfd, 0x347: 0xfd, + 0x348: 0xfd, 0x349: 0xfd, 0x34a: 0xfd, 0x34b: 0xfd, 0x34c: 0xfd, 0x34d: 0xfd, 0x34e: 0xfd, 0x34f: 0xfd, + 0x350: 0xfd, 0x351: 0xfd, 0x352: 0xfd, 0x353: 0xfd, 0x354: 0xfd, 0x355: 0xfd, 0x356: 0xfd, 0x357: 0xfd, + 0x358: 0xfd, 0x359: 0xfd, 0x35a: 0xfd, 0x35b: 0xfd, 0x35c: 0xfd, 0x35d: 0xfd, 0x35e: 0xfd, 0x35f: 0xfd, + 0x360: 0xfd, 0x361: 0xfd, 0x362: 0xfd, 0x363: 0xfd, 0x364: 0xfd, 0x365: 0xfd, 0x366: 0xfd, 0x367: 0xfd, + 0x368: 0xfd, 0x369: 0xfd, 0x36a: 0xfd, 0x36b: 0xfd, 0x36c: 0xfd, 0x36d: 0xfd, 0x36e: 0xfd, 0x36f: 0xfd, + 0x370: 0xfd, 0x371: 0xfd, 0x372: 0xfd, 0x373: 0xfd, 0x374: 0xfd, 0x375: 0xfd, 0x376: 0xfd, 0x377: 0xfd, + 0x378: 0xfd, 0x379: 0xfd, 0x37a: 0xfd, 0x37b: 0xfd, 0x37c: 0xfd, 0x37d: 0xfd, 0x37e: 0xfd, 0x37f: 0xfd, // Block 0xe, offset 0x380 - 0x380: 0xfb, 0x381: 0xfb, 0x382: 0xfb, 0x383: 0xfb, 0x384: 0xfb, 0x385: 0xfb, 0x386: 0xfb, 0x387: 0xfb, - 0x388: 0xfb, 0x389: 0xfb, 0x38a: 0xfb, 0x38b: 0xfb, 0x38c: 0xfb, 0x38d: 0xfb, 0x38e: 0xfb, 0x38f: 0xfb, - 0x390: 0xfb, 0x391: 0xfb, 0x392: 0xfb, 0x393: 0xfb, 0x394: 0xfb, 0x395: 0xfb, 0x396: 0xfb, 0x397: 0xfb, - 0x398: 0xfb, 0x399: 0xfb, 0x39a: 0xfb, 0x39b: 0xfb, 0x39c: 0xfb, 0x39d: 0xfb, 0x39e: 0xfb, 0x39f: 0xfb, - 0x3a0: 0xfb, 0x3a1: 0xfb, 0x3a2: 0xfb, 0x3a3: 0xfb, 0x3a4: 0xfc, 0x3a5: 0xfd, 0x3a6: 0xfe, 0x3a7: 0xff, - 0x3a8: 0x47, 0x3a9: 0x100, 0x3aa: 0x101, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c, - 0x3b0: 0x102, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x103, 0x3b7: 0x52, - 0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a, + 0x380: 0xfd, 0x381: 0xfd, 0x382: 0xfd, 0x383: 0xfd, 0x384: 0xfd, 0x385: 0xfd, 0x386: 0xfd, 0x387: 0xfd, + 0x388: 0xfd, 0x389: 0xfd, 0x38a: 0xfd, 0x38b: 0xfd, 0x38c: 0xfd, 0x38d: 0xfd, 0x38e: 0xfd, 0x38f: 0xfd, + 0x390: 0xfd, 0x391: 0xfd, 0x392: 0xfd, 0x393: 0xfd, 0x394: 0xfd, 0x395: 0xfd, 0x396: 0xfd, 0x397: 0xfd, + 0x398: 0xfd, 0x399: 0xfd, 0x39a: 0xfd, 0x39b: 0xfd, 0x39c: 0xfd, 0x39d: 0xfd, 0x39e: 0xfd, 0x39f: 0xfd, + 0x3a0: 0xfd, 0x3a1: 0xfd, 0x3a2: 0xfd, 0x3a3: 0xfd, 0x3a4: 0xfe, 0x3a5: 0xff, 0x3a6: 0x100, 0x3a7: 0x101, + 0x3a8: 0x45, 0x3a9: 0x102, 0x3aa: 0x103, 0x3ab: 0x46, 0x3ac: 0x47, 0x3ad: 0x48, 0x3ae: 0x49, 0x3af: 0x4a, + 0x3b0: 0x104, 0x3b1: 0x4b, 0x3b2: 0x4c, 0x3b3: 0x4d, 0x3b4: 0x4e, 0x3b5: 0x4f, 0x3b6: 0x105, 0x3b7: 0x50, + 0x3b8: 0x51, 0x3b9: 0x52, 0x3ba: 0x53, 0x3bb: 0x54, 0x3bc: 0x55, 0x3bd: 0x56, 0x3be: 0x57, 0x3bf: 0x58, // Block 0xf, offset 0x3c0 - 0x3c0: 0x104, 0x3c1: 0x105, 0x3c2: 0xa0, 0x3c3: 0x106, 0x3c4: 0x107, 0x3c5: 0x9c, 0x3c6: 0x108, 0x3c7: 0x109, - 0x3c8: 0xfb, 0x3c9: 0xfb, 0x3ca: 0x10a, 0x3cb: 0x10b, 0x3cc: 0x10c, 0x3cd: 0x10d, 0x3ce: 0x10e, 0x3cf: 0x10f, - 0x3d0: 0x110, 0x3d1: 0xa0, 0x3d2: 0x111, 0x3d3: 0x112, 0x3d4: 0x113, 0x3d5: 0x114, 0x3d6: 0xfb, 0x3d7: 0xfb, - 0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x115, 0x3dd: 0x116, 0x3de: 0xfb, 0x3df: 0xfb, - 0x3e0: 0x117, 0x3e1: 0x118, 0x3e2: 0x119, 0x3e3: 0x11a, 0x3e4: 0x11b, 0x3e5: 0xfb, 0x3e6: 0x11c, 0x3e7: 0x11d, - 0x3e8: 0x11e, 0x3e9: 0x11f, 0x3ea: 0x120, 0x3eb: 0x5b, 0x3ec: 0x121, 0x3ed: 0x122, 0x3ee: 0x5c, 0x3ef: 0xfb, - 0x3f0: 0x123, 0x3f1: 0x124, 0x3f2: 0x125, 0x3f3: 0x126, 0x3f4: 0x127, 0x3f5: 0xfb, 0x3f6: 0xfb, 0x3f7: 0xfb, - 0x3f8: 0xfb, 0x3f9: 0x128, 0x3fa: 0x129, 0x3fb: 0xfb, 0x3fc: 0x12a, 0x3fd: 0x12b, 0x3fe: 0x12c, 0x3ff: 0x12d, + 0x3c0: 0x106, 0x3c1: 0x107, 0x3c2: 0xa0, 0x3c3: 0x108, 0x3c4: 0x109, 0x3c5: 0x9c, 0x3c6: 0x10a, 0x3c7: 0x10b, + 0x3c8: 0xfd, 0x3c9: 0xfd, 0x3ca: 0x10c, 0x3cb: 0x10d, 0x3cc: 0x10e, 0x3cd: 0x10f, 0x3ce: 0x110, 0x3cf: 0x111, + 0x3d0: 0x112, 0x3d1: 0xa0, 0x3d2: 0x113, 0x3d3: 0x114, 0x3d4: 0x115, 0x3d5: 0x116, 0x3d6: 0xfd, 0x3d7: 0xfd, + 0x3d8: 0xa0, 0x3d9: 0xa0, 0x3da: 0xa0, 0x3db: 0xa0, 0x3dc: 0x117, 0x3dd: 0x118, 0x3de: 0xfd, 0x3df: 0xfd, + 0x3e0: 0x119, 0x3e1: 0x11a, 0x3e2: 0x11b, 0x3e3: 0x11c, 0x3e4: 0x11d, 0x3e5: 0xfd, 0x3e6: 0x11e, 0x3e7: 0x11f, + 0x3e8: 0x120, 0x3e9: 0x121, 0x3ea: 0x122, 0x3eb: 0x59, 0x3ec: 0x123, 0x3ed: 0x124, 0x3ee: 0x5a, 0x3ef: 0xfd, + 0x3f0: 0x125, 0x3f1: 0x126, 0x3f2: 0x127, 0x3f3: 0x128, 0x3f4: 0x129, 0x3f5: 0xfd, 0x3f6: 0xfd, 0x3f7: 0xfd, + 0x3f8: 0xfd, 0x3f9: 0x12a, 0x3fa: 0x12b, 0x3fb: 0xfd, 0x3fc: 0x12c, 0x3fd: 0x12d, 0x3fe: 0x12e, 0x3ff: 0x12f, // Block 0x10, offset 0x400 - 0x400: 0x12e, 0x401: 0x12f, 0x402: 0x130, 0x403: 0x131, 0x404: 0x132, 0x405: 0x133, 0x406: 0x134, 0x407: 0x135, - 0x408: 0x136, 0x409: 0xfb, 0x40a: 0x137, 0x40b: 0x138, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xfb, 0x40f: 0xfb, - 0x410: 0x139, 0x411: 0x13a, 0x412: 0x13b, 0x413: 0x13c, 0x414: 0xfb, 0x415: 0xfb, 0x416: 0x13d, 0x417: 0x13e, - 0x418: 0x13f, 0x419: 0x140, 0x41a: 0x141, 0x41b: 0x142, 0x41c: 0x143, 0x41d: 0xfb, 0x41e: 0xfb, 0x41f: 0xfb, - 0x420: 0x144, 0x421: 0xfb, 0x422: 0x145, 0x423: 0x146, 0x424: 0x5f, 0x425: 0x147, 0x426: 0x148, 0x427: 0x149, - 0x428: 0x14a, 0x429: 0x14b, 0x42a: 0x14c, 0x42b: 0x14d, 0x42c: 0xfb, 0x42d: 0xfb, 0x42e: 0xfb, 0x42f: 0xfb, - 0x430: 0x14e, 0x431: 0x14f, 0x432: 0x150, 0x433: 0xfb, 0x434: 0x151, 0x435: 0x152, 0x436: 0x153, 0x437: 0xfb, - 0x438: 0xfb, 0x439: 0xfb, 0x43a: 0xfb, 0x43b: 0x154, 0x43c: 0xfb, 0x43d: 0xfb, 0x43e: 0x155, 0x43f: 0x156, + 0x400: 0x130, 0x401: 0x131, 0x402: 0x132, 0x403: 0x133, 0x404: 0x134, 0x405: 0x135, 0x406: 0x136, 0x407: 0x137, + 0x408: 0x138, 0x409: 0xfd, 0x40a: 0x139, 0x40b: 0x13a, 0x40c: 0x5b, 0x40d: 0x5c, 0x40e: 0xfd, 0x40f: 0xfd, + 0x410: 0x13b, 0x411: 0x13c, 0x412: 0x13d, 0x413: 0x13e, 0x414: 0xfd, 0x415: 0xfd, 0x416: 0x13f, 0x417: 0x140, + 0x418: 0x141, 0x419: 0x142, 0x41a: 0x143, 0x41b: 0x144, 0x41c: 0x145, 0x41d: 0xfd, 0x41e: 0xfd, 0x41f: 0xfd, + 0x420: 0x146, 0x421: 0xfd, 0x422: 0x147, 0x423: 0x148, 0x424: 0x5d, 0x425: 0x149, 0x426: 0x14a, 0x427: 0x14b, + 0x428: 0x14c, 0x429: 0x14d, 0x42a: 0x14e, 0x42b: 0x14f, 0x42c: 0xfd, 0x42d: 0xfd, 0x42e: 0xfd, 0x42f: 0xfd, + 0x430: 0x150, 0x431: 0x151, 0x432: 0x152, 0x433: 0xfd, 0x434: 0x153, 0x435: 0x154, 0x436: 0x155, 0x437: 0xfd, + 0x438: 0xfd, 0x439: 0xfd, 0x43a: 0xfd, 0x43b: 0x156, 0x43c: 0xfd, 0x43d: 0xfd, 0x43e: 0x157, 0x43f: 0x158, // Block 0x11, offset 0x440 0x440: 0xa0, 0x441: 0xa0, 0x442: 0xa0, 0x443: 0xa0, 0x444: 0xa0, 0x445: 0xa0, 0x446: 0xa0, 0x447: 0xa0, - 0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x157, 0x44f: 0xfb, - 0x450: 0x9c, 0x451: 0x158, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x159, 0x456: 0xfb, 0x457: 0xfb, - 0x458: 0xfb, 0x459: 0xfb, 0x45a: 0xfb, 0x45b: 0xfb, 0x45c: 0xfb, 0x45d: 0xfb, 0x45e: 0xfb, 0x45f: 0xfb, - 0x460: 0xfb, 0x461: 0xfb, 0x462: 0xfb, 0x463: 0xfb, 0x464: 0xfb, 0x465: 0xfb, 0x466: 0xfb, 0x467: 0xfb, - 0x468: 0xfb, 0x469: 0xfb, 0x46a: 0xfb, 0x46b: 0xfb, 0x46c: 0xfb, 0x46d: 0xfb, 0x46e: 0xfb, 0x46f: 0xfb, - 0x470: 0xfb, 0x471: 0xfb, 0x472: 0xfb, 0x473: 0xfb, 0x474: 0xfb, 0x475: 0xfb, 0x476: 0xfb, 0x477: 0xfb, - 0x478: 0xfb, 0x479: 0xfb, 0x47a: 0xfb, 0x47b: 0xfb, 0x47c: 0xfb, 0x47d: 0xfb, 0x47e: 0xfb, 0x47f: 0xfb, + 0x448: 0xa0, 0x449: 0xa0, 0x44a: 0xa0, 0x44b: 0xa0, 0x44c: 0xa0, 0x44d: 0xa0, 0x44e: 0x159, 0x44f: 0xfd, + 0x450: 0x9c, 0x451: 0x15a, 0x452: 0xa0, 0x453: 0xa0, 0x454: 0xa0, 0x455: 0x15b, 0x456: 0xfd, 0x457: 0xfd, + 0x458: 0xfd, 0x459: 0xfd, 0x45a: 0xfd, 0x45b: 0xfd, 0x45c: 0xfd, 0x45d: 0xfd, 0x45e: 0xfd, 0x45f: 0xfd, + 0x460: 0xfd, 0x461: 0xfd, 0x462: 0xfd, 0x463: 0xfd, 0x464: 0xfd, 0x465: 0xfd, 0x466: 0xfd, 0x467: 0xfd, + 0x468: 0xfd, 0x469: 0xfd, 0x46a: 0xfd, 0x46b: 0xfd, 0x46c: 0xfd, 0x46d: 0xfd, 0x46e: 0xfd, 0x46f: 0xfd, + 0x470: 0xfd, 0x471: 0xfd, 0x472: 0xfd, 0x473: 0xfd, 0x474: 0xfd, 0x475: 0xfd, 0x476: 0xfd, 0x477: 0xfd, + 0x478: 0xfd, 0x479: 0xfd, 0x47a: 0xfd, 0x47b: 0xfd, 0x47c: 0xfd, 0x47d: 0xfd, 0x47e: 0xfd, 0x47f: 0xfd, // Block 0x12, offset 0x480 0x480: 0xa0, 0x481: 0xa0, 0x482: 0xa0, 0x483: 0xa0, 0x484: 0xa0, 0x485: 0xa0, 0x486: 0xa0, 0x487: 0xa0, 0x488: 0xa0, 0x489: 0xa0, 0x48a: 0xa0, 0x48b: 0xa0, 0x48c: 0xa0, 0x48d: 0xa0, 0x48e: 0xa0, 0x48f: 0xa0, - 0x490: 0x15a, 0x491: 0xfb, 0x492: 0xfb, 0x493: 0xfb, 0x494: 0xfb, 0x495: 0xfb, 0x496: 0xfb, 0x497: 0xfb, - 0x498: 0xfb, 0x499: 0xfb, 0x49a: 0xfb, 0x49b: 0xfb, 0x49c: 0xfb, 0x49d: 0xfb, 0x49e: 0xfb, 0x49f: 0xfb, - 0x4a0: 0xfb, 0x4a1: 0xfb, 0x4a2: 0xfb, 0x4a3: 0xfb, 0x4a4: 0xfb, 0x4a5: 0xfb, 0x4a6: 0xfb, 0x4a7: 0xfb, - 0x4a8: 0xfb, 0x4a9: 0xfb, 0x4aa: 0xfb, 0x4ab: 0xfb, 0x4ac: 0xfb, 0x4ad: 0xfb, 0x4ae: 0xfb, 0x4af: 0xfb, - 0x4b0: 0xfb, 0x4b1: 0xfb, 0x4b2: 0xfb, 0x4b3: 0xfb, 0x4b4: 0xfb, 0x4b5: 0xfb, 0x4b6: 0xfb, 0x4b7: 0xfb, - 0x4b8: 0xfb, 0x4b9: 0xfb, 0x4ba: 0xfb, 0x4bb: 0xfb, 0x4bc: 0xfb, 0x4bd: 0xfb, 0x4be: 0xfb, 0x4bf: 0xfb, + 0x490: 0x15c, 0x491: 0xfd, 0x492: 0xfd, 0x493: 0xfd, 0x494: 0xfd, 0x495: 0xfd, 0x496: 0xfd, 0x497: 0xfd, + 0x498: 0xfd, 0x499: 0xfd, 0x49a: 0xfd, 0x49b: 0xfd, 0x49c: 0xfd, 0x49d: 0xfd, 0x49e: 0xfd, 0x49f: 0xfd, + 0x4a0: 0xfd, 0x4a1: 0xfd, 0x4a2: 0xfd, 0x4a3: 0xfd, 0x4a4: 0xfd, 0x4a5: 0xfd, 0x4a6: 0xfd, 0x4a7: 0xfd, + 0x4a8: 0xfd, 0x4a9: 0xfd, 0x4aa: 0xfd, 0x4ab: 0xfd, 0x4ac: 0xfd, 0x4ad: 0xfd, 0x4ae: 0xfd, 0x4af: 0xfd, + 0x4b0: 0xfd, 0x4b1: 0xfd, 0x4b2: 0xfd, 0x4b3: 0xfd, 0x4b4: 0xfd, 0x4b5: 0xfd, 0x4b6: 0xfd, 0x4b7: 0xfd, + 0x4b8: 0xfd, 0x4b9: 0xfd, 0x4ba: 0xfd, 0x4bb: 0xfd, 0x4bc: 0xfd, 0x4bd: 0xfd, 0x4be: 0xfd, 0x4bf: 0xfd, // Block 0x13, offset 0x4c0 - 0x4c0: 0xfb, 0x4c1: 0xfb, 0x4c2: 0xfb, 0x4c3: 0xfb, 0x4c4: 0xfb, 0x4c5: 0xfb, 0x4c6: 0xfb, 0x4c7: 0xfb, - 0x4c8: 0xfb, 0x4c9: 0xfb, 0x4ca: 0xfb, 0x4cb: 0xfb, 0x4cc: 0xfb, 0x4cd: 0xfb, 0x4ce: 0xfb, 0x4cf: 0xfb, + 0x4c0: 0xfd, 0x4c1: 0xfd, 0x4c2: 0xfd, 0x4c3: 0xfd, 0x4c4: 0xfd, 0x4c5: 0xfd, 0x4c6: 0xfd, 0x4c7: 0xfd, + 0x4c8: 0xfd, 0x4c9: 0xfd, 0x4ca: 0xfd, 0x4cb: 0xfd, 0x4cc: 0xfd, 0x4cd: 0xfd, 0x4ce: 0xfd, 0x4cf: 0xfd, 0x4d0: 0xa0, 0x4d1: 0xa0, 0x4d2: 0xa0, 0x4d3: 0xa0, 0x4d4: 0xa0, 0x4d5: 0xa0, 0x4d6: 0xa0, 0x4d7: 0xa0, - 0x4d8: 0xa0, 0x4d9: 0x15b, 0x4da: 0xfb, 0x4db: 0xfb, 0x4dc: 0xfb, 0x4dd: 0xfb, 0x4de: 0xfb, 0x4df: 0xfb, - 0x4e0: 0xfb, 0x4e1: 0xfb, 0x4e2: 0xfb, 0x4e3: 0xfb, 0x4e4: 0xfb, 0x4e5: 0xfb, 0x4e6: 0xfb, 0x4e7: 0xfb, - 0x4e8: 0xfb, 0x4e9: 0xfb, 0x4ea: 0xfb, 0x4eb: 0xfb, 0x4ec: 0xfb, 0x4ed: 0xfb, 0x4ee: 0xfb, 0x4ef: 0xfb, - 0x4f0: 0xfb, 0x4f1: 0xfb, 0x4f2: 0xfb, 0x4f3: 0xfb, 0x4f4: 0xfb, 0x4f5: 0xfb, 0x4f6: 0xfb, 0x4f7: 0xfb, - 0x4f8: 0xfb, 0x4f9: 0xfb, 0x4fa: 0xfb, 0x4fb: 0xfb, 0x4fc: 0xfb, 0x4fd: 0xfb, 0x4fe: 0xfb, 0x4ff: 0xfb, + 0x4d8: 0xa0, 0x4d9: 0x15d, 0x4da: 0xfd, 0x4db: 0xfd, 0x4dc: 0xfd, 0x4dd: 0xfd, 0x4de: 0xfd, 0x4df: 0xfd, + 0x4e0: 0xfd, 0x4e1: 0xfd, 0x4e2: 0xfd, 0x4e3: 0xfd, 0x4e4: 0xfd, 0x4e5: 0xfd, 0x4e6: 0xfd, 0x4e7: 0xfd, + 0x4e8: 0xfd, 0x4e9: 0xfd, 0x4ea: 0xfd, 0x4eb: 0xfd, 0x4ec: 0xfd, 0x4ed: 0xfd, 0x4ee: 0xfd, 0x4ef: 0xfd, + 0x4f0: 0xfd, 0x4f1: 0xfd, 0x4f2: 0xfd, 0x4f3: 0xfd, 0x4f4: 0xfd, 0x4f5: 0xfd, 0x4f6: 0xfd, 0x4f7: 0xfd, + 0x4f8: 0xfd, 0x4f9: 0xfd, 0x4fa: 0xfd, 0x4fb: 0xfd, 0x4fc: 0xfd, 0x4fd: 0xfd, 0x4fe: 0xfd, 0x4ff: 0xfd, // Block 0x14, offset 0x500 - 0x500: 0xfb, 0x501: 0xfb, 0x502: 0xfb, 0x503: 0xfb, 0x504: 0xfb, 0x505: 0xfb, 0x506: 0xfb, 0x507: 0xfb, - 0x508: 0xfb, 0x509: 0xfb, 0x50a: 0xfb, 0x50b: 0xfb, 0x50c: 0xfb, 0x50d: 0xfb, 0x50e: 0xfb, 0x50f: 0xfb, - 0x510: 0xfb, 0x511: 0xfb, 0x512: 0xfb, 0x513: 0xfb, 0x514: 0xfb, 0x515: 0xfb, 0x516: 0xfb, 0x517: 0xfb, - 0x518: 0xfb, 0x519: 0xfb, 0x51a: 0xfb, 0x51b: 0xfb, 0x51c: 0xfb, 0x51d: 0xfb, 0x51e: 0xfb, 0x51f: 0xfb, + 0x500: 0xfd, 0x501: 0xfd, 0x502: 0xfd, 0x503: 0xfd, 0x504: 0xfd, 0x505: 0xfd, 0x506: 0xfd, 0x507: 0xfd, + 0x508: 0xfd, 0x509: 0xfd, 0x50a: 0xfd, 0x50b: 0xfd, 0x50c: 0xfd, 0x50d: 0xfd, 0x50e: 0xfd, 0x50f: 0xfd, + 0x510: 0xfd, 0x511: 0xfd, 0x512: 0xfd, 0x513: 0xfd, 0x514: 0xfd, 0x515: 0xfd, 0x516: 0xfd, 0x517: 0xfd, + 0x518: 0xfd, 0x519: 0xfd, 0x51a: 0xfd, 0x51b: 0xfd, 0x51c: 0xfd, 0x51d: 0xfd, 0x51e: 0xfd, 0x51f: 0xfd, 0x520: 0xa0, 0x521: 0xa0, 0x522: 0xa0, 0x523: 0xa0, 0x524: 0xa0, 0x525: 0xa0, 0x526: 0xa0, 0x527: 0xa0, - 0x528: 0x14d, 0x529: 0x15c, 0x52a: 0xfb, 0x52b: 0x15d, 0x52c: 0x15e, 0x52d: 0x15f, 0x52e: 0x160, 0x52f: 0xfb, - 0x530: 0xfb, 0x531: 0xfb, 0x532: 0xfb, 0x533: 0xfb, 0x534: 0xfb, 0x535: 0xfb, 0x536: 0xfb, 0x537: 0xfb, - 0x538: 0xfb, 0x539: 0x161, 0x53a: 0x162, 0x53b: 0xfb, 0x53c: 0xa0, 0x53d: 0x163, 0x53e: 0x164, 0x53f: 0x165, + 0x528: 0x14f, 0x529: 0x15e, 0x52a: 0xfd, 0x52b: 0x15f, 0x52c: 0x160, 0x52d: 0x161, 0x52e: 0x162, 0x52f: 0xfd, + 0x530: 0xfd, 0x531: 0xfd, 0x532: 0xfd, 0x533: 0xfd, 0x534: 0xfd, 0x535: 0xfd, 0x536: 0xfd, 0x537: 0xfd, + 0x538: 0xfd, 0x539: 0x163, 0x53a: 0x164, 0x53b: 0xfd, 0x53c: 0xa0, 0x53d: 0x165, 0x53e: 0x166, 0x53f: 0x167, // Block 0x15, offset 0x540 0x540: 0xa0, 0x541: 0xa0, 0x542: 0xa0, 0x543: 0xa0, 0x544: 0xa0, 0x545: 0xa0, 0x546: 0xa0, 0x547: 0xa0, 0x548: 0xa0, 0x549: 0xa0, 0x54a: 0xa0, 0x54b: 0xa0, 0x54c: 0xa0, 0x54d: 0xa0, 0x54e: 0xa0, 0x54f: 0xa0, 0x550: 0xa0, 0x551: 0xa0, 0x552: 0xa0, 0x553: 0xa0, 0x554: 0xa0, 0x555: 0xa0, 0x556: 0xa0, 0x557: 0xa0, - 0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x166, + 0x558: 0xa0, 0x559: 0xa0, 0x55a: 0xa0, 0x55b: 0xa0, 0x55c: 0xa0, 0x55d: 0xa0, 0x55e: 0xa0, 0x55f: 0x168, 0x560: 0xa0, 0x561: 0xa0, 0x562: 0xa0, 0x563: 0xa0, 0x564: 0xa0, 0x565: 0xa0, 0x566: 0xa0, 0x567: 0xa0, 0x568: 0xa0, 0x569: 0xa0, 0x56a: 0xa0, 0x56b: 0xa0, 0x56c: 0xa0, 0x56d: 0xa0, 0x56e: 0xa0, 0x56f: 0xa0, - 0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x167, 0x574: 0x168, 0x575: 0xfb, 0x576: 0xfb, 0x577: 0xfb, - 0x578: 0xfb, 0x579: 0xfb, 0x57a: 0xfb, 0x57b: 0xfb, 0x57c: 0xfb, 0x57d: 0xfb, 0x57e: 0xfb, 0x57f: 0xfb, + 0x570: 0xa0, 0x571: 0xa0, 0x572: 0xa0, 0x573: 0x169, 0x574: 0x16a, 0x575: 0xfd, 0x576: 0xfd, 0x577: 0xfd, + 0x578: 0xfd, 0x579: 0xfd, 0x57a: 0xfd, 0x57b: 0xfd, 0x57c: 0xfd, 0x57d: 0xfd, 0x57e: 0xfd, 0x57f: 0xfd, // Block 0x16, offset 0x580 - 0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x169, 0x585: 0x16a, 0x586: 0xa0, 0x587: 0xa0, - 0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16b, 0x58c: 0xfb, 0x58d: 0xfb, 0x58e: 0xfb, 0x58f: 0xfb, - 0x590: 0xfb, 0x591: 0xfb, 0x592: 0xfb, 0x593: 0xfb, 0x594: 0xfb, 0x595: 0xfb, 0x596: 0xfb, 0x597: 0xfb, - 0x598: 0xfb, 0x599: 0xfb, 0x59a: 0xfb, 0x59b: 0xfb, 0x59c: 0xfb, 0x59d: 0xfb, 0x59e: 0xfb, 0x59f: 0xfb, - 0x5a0: 0xfb, 0x5a1: 0xfb, 0x5a2: 0xfb, 0x5a3: 0xfb, 0x5a4: 0xfb, 0x5a5: 0xfb, 0x5a6: 0xfb, 0x5a7: 0xfb, - 0x5a8: 0xfb, 0x5a9: 0xfb, 0x5aa: 0xfb, 0x5ab: 0xfb, 0x5ac: 0xfb, 0x5ad: 0xfb, 0x5ae: 0xfb, 0x5af: 0xfb, - 0x5b0: 0xa0, 0x5b1: 0x16c, 0x5b2: 0x16d, 0x5b3: 0xfb, 0x5b4: 0xfb, 0x5b5: 0xfb, 0x5b6: 0xfb, 0x5b7: 0xfb, - 0x5b8: 0xfb, 0x5b9: 0xfb, 0x5ba: 0xfb, 0x5bb: 0xfb, 0x5bc: 0xfb, 0x5bd: 0xfb, 0x5be: 0xfb, 0x5bf: 0xfb, + 0x580: 0xa0, 0x581: 0xa0, 0x582: 0xa0, 0x583: 0xa0, 0x584: 0x16b, 0x585: 0x16c, 0x586: 0xa0, 0x587: 0xa0, + 0x588: 0xa0, 0x589: 0xa0, 0x58a: 0xa0, 0x58b: 0x16d, 0x58c: 0xfd, 0x58d: 0xfd, 0x58e: 0xfd, 0x58f: 0xfd, + 0x590: 0xfd, 0x591: 0xfd, 0x592: 0xfd, 0x593: 0xfd, 0x594: 0xfd, 0x595: 0xfd, 0x596: 0xfd, 0x597: 0xfd, + 0x598: 0xfd, 0x599: 0xfd, 0x59a: 0xfd, 0x59b: 0xfd, 0x59c: 0xfd, 0x59d: 0xfd, 0x59e: 0xfd, 0x59f: 0xfd, + 0x5a0: 0xfd, 0x5a1: 0xfd, 0x5a2: 0xfd, 0x5a3: 0xfd, 0x5a4: 0xfd, 0x5a5: 0xfd, 0x5a6: 0xfd, 0x5a7: 0xfd, + 0x5a8: 0xfd, 0x5a9: 0xfd, 0x5aa: 0xfd, 0x5ab: 0xfd, 0x5ac: 0xfd, 0x5ad: 0xfd, 0x5ae: 0xfd, 0x5af: 0xfd, + 0x5b0: 0xa0, 0x5b1: 0x16e, 0x5b2: 0x16f, 0x5b3: 0xfd, 0x5b4: 0xfd, 0x5b5: 0xfd, 0x5b6: 0xfd, 0x5b7: 0xfd, + 0x5b8: 0xfd, 0x5b9: 0xfd, 0x5ba: 0xfd, 0x5bb: 0xfd, 0x5bc: 0xfd, 0x5bd: 0xfd, 0x5be: 0xfd, 0x5bf: 0xfd, // Block 0x17, offset 0x5c0 - 0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x16e, 0x5c4: 0x16f, 0x5c5: 0x170, 0x5c6: 0x171, 0x5c7: 0x172, - 0x5c8: 0x9c, 0x5c9: 0x173, 0x5ca: 0xfb, 0x5cb: 0x174, 0x5cc: 0x9c, 0x5cd: 0x175, 0x5ce: 0xfb, 0x5cf: 0xfb, - 0x5d0: 0x60, 0x5d1: 0x61, 0x5d2: 0x62, 0x5d3: 0x63, 0x5d4: 0x64, 0x5d5: 0x65, 0x5d6: 0x66, 0x5d7: 0x67, - 0x5d8: 0x68, 0x5d9: 0x69, 0x5da: 0x6a, 0x5db: 0x6b, 0x5dc: 0x6c, 0x5dd: 0x6d, 0x5de: 0x6e, 0x5df: 0x6f, + 0x5c0: 0x9c, 0x5c1: 0x9c, 0x5c2: 0x9c, 0x5c3: 0x170, 0x5c4: 0x171, 0x5c5: 0x172, 0x5c6: 0x173, 0x5c7: 0x174, + 0x5c8: 0x9c, 0x5c9: 0x175, 0x5ca: 0xfd, 0x5cb: 0x176, 0x5cc: 0x9c, 0x5cd: 0x177, 0x5ce: 0xfd, 0x5cf: 0xfd, + 0x5d0: 0x5e, 0x5d1: 0x5f, 0x5d2: 0x60, 0x5d3: 0x61, 0x5d4: 0x62, 0x5d5: 0x63, 0x5d6: 0x64, 0x5d7: 0x65, + 0x5d8: 0x66, 0x5d9: 0x67, 0x5da: 0x68, 0x5db: 0x69, 0x5dc: 0x6a, 0x5dd: 0x6b, 0x5de: 0x6c, 0x5df: 0x6d, 0x5e0: 0x9c, 0x5e1: 0x9c, 0x5e2: 0x9c, 0x5e3: 0x9c, 0x5e4: 0x9c, 0x5e5: 0x9c, 0x5e6: 0x9c, 0x5e7: 0x9c, - 0x5e8: 0x176, 0x5e9: 0x177, 0x5ea: 0x178, 0x5eb: 0xfb, 0x5ec: 0xfb, 0x5ed: 0xfb, 0x5ee: 0xfb, 0x5ef: 0xfb, - 0x5f0: 0xfb, 0x5f1: 0xfb, 0x5f2: 0xfb, 0x5f3: 0xfb, 0x5f4: 0xfb, 0x5f5: 0xfb, 0x5f6: 0xfb, 0x5f7: 0xfb, - 0x5f8: 0xfb, 0x5f9: 0xfb, 0x5fa: 0xfb, 0x5fb: 0xfb, 0x5fc: 0xfb, 0x5fd: 0xfb, 0x5fe: 0xfb, 0x5ff: 0xfb, + 0x5e8: 0x178, 0x5e9: 0x179, 0x5ea: 0x17a, 0x5eb: 0xfd, 0x5ec: 0xfd, 0x5ed: 0xfd, 0x5ee: 0xfd, 0x5ef: 0xfd, + 0x5f0: 0xfd, 0x5f1: 0xfd, 0x5f2: 0xfd, 0x5f3: 0xfd, 0x5f4: 0xfd, 0x5f5: 0xfd, 0x5f6: 0xfd, 0x5f7: 0xfd, + 0x5f8: 0xfd, 0x5f9: 0xfd, 0x5fa: 0xfd, 0x5fb: 0xfd, 0x5fc: 0xfd, 0x5fd: 0xfd, 0x5fe: 0xfd, 0x5ff: 0xfd, // Block 0x18, offset 0x600 - 0x600: 0x179, 0x601: 0xfb, 0x602: 0xfb, 0x603: 0xfb, 0x604: 0x17a, 0x605: 0x17b, 0x606: 0xfb, 0x607: 0xfb, - 0x608: 0xfb, 0x609: 0xfb, 0x60a: 0xfb, 0x60b: 0x17c, 0x60c: 0xfb, 0x60d: 0xfb, 0x60e: 0xfb, 0x60f: 0xfb, - 0x610: 0xfb, 0x611: 0xfb, 0x612: 0xfb, 0x613: 0xfb, 0x614: 0xfb, 0x615: 0xfb, 0x616: 0xfb, 0x617: 0xfb, - 0x618: 0xfb, 0x619: 0xfb, 0x61a: 0xfb, 0x61b: 0xfb, 0x61c: 0xfb, 0x61d: 0xfb, 0x61e: 0xfb, 0x61f: 0xfb, - 0x620: 0x123, 0x621: 0x123, 0x622: 0x123, 0x623: 0x17d, 0x624: 0x70, 0x625: 0x17e, 0x626: 0xfb, 0x627: 0xfb, - 0x628: 0xfb, 0x629: 0xfb, 0x62a: 0xfb, 0x62b: 0xfb, 0x62c: 0xfb, 0x62d: 0xfb, 0x62e: 0xfb, 0x62f: 0xfb, - 0x630: 0xfb, 0x631: 0x17f, 0x632: 0x180, 0x633: 0xfb, 0x634: 0x181, 0x635: 0xfb, 0x636: 0xfb, 0x637: 0xfb, - 0x638: 0x71, 0x639: 0x72, 0x63a: 0x73, 0x63b: 0x182, 0x63c: 0xfb, 0x63d: 0xfb, 0x63e: 0xfb, 0x63f: 0xfb, + 0x600: 0x17b, 0x601: 0xfd, 0x602: 0xfd, 0x603: 0xfd, 0x604: 0x17c, 0x605: 0x17d, 0x606: 0xfd, 0x607: 0xfd, + 0x608: 0xfd, 0x609: 0xfd, 0x60a: 0xfd, 0x60b: 0x17e, 0x60c: 0xfd, 0x60d: 0xfd, 0x60e: 0xfd, 0x60f: 0xfd, + 0x610: 0xfd, 0x611: 0xfd, 0x612: 0xfd, 0x613: 0xfd, 0x614: 0xfd, 0x615: 0xfd, 0x616: 0xfd, 0x617: 0xfd, + 0x618: 0xfd, 0x619: 0xfd, 0x61a: 0xfd, 0x61b: 0xfd, 0x61c: 0xfd, 0x61d: 0xfd, 0x61e: 0xfd, 0x61f: 0xfd, + 0x620: 0x125, 0x621: 0x125, 0x622: 0x125, 0x623: 0x17f, 0x624: 0x6e, 0x625: 0x180, 0x626: 0xfd, 0x627: 0xfd, + 0x628: 0xfd, 0x629: 0xfd, 0x62a: 0xfd, 0x62b: 0xfd, 0x62c: 0xfd, 0x62d: 0xfd, 0x62e: 0xfd, 0x62f: 0xfd, + 0x630: 0xfd, 0x631: 0x181, 0x632: 0x182, 0x633: 0xfd, 0x634: 0x183, 0x635: 0xfd, 0x636: 0xfd, 0x637: 0xfd, + 0x638: 0x6f, 0x639: 0x70, 0x63a: 0x71, 0x63b: 0x184, 0x63c: 0xfd, 0x63d: 0xfd, 0x63e: 0xfd, 0x63f: 0xfd, // Block 0x19, offset 0x640 - 0x640: 0x183, 0x641: 0x9c, 0x642: 0x184, 0x643: 0x185, 0x644: 0x74, 0x645: 0x75, 0x646: 0x186, 0x647: 0x187, - 0x648: 0x76, 0x649: 0x188, 0x64a: 0xfb, 0x64b: 0xfb, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c, + 0x640: 0x185, 0x641: 0x9c, 0x642: 0x186, 0x643: 0x187, 0x644: 0x72, 0x645: 0x73, 0x646: 0x188, 0x647: 0x189, + 0x648: 0x74, 0x649: 0x18a, 0x64a: 0xfd, 0x64b: 0xfd, 0x64c: 0x9c, 0x64d: 0x9c, 0x64e: 0x9c, 0x64f: 0x9c, 0x650: 0x9c, 0x651: 0x9c, 0x652: 0x9c, 0x653: 0x9c, 0x654: 0x9c, 0x655: 0x9c, 0x656: 0x9c, 0x657: 0x9c, - 0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x189, 0x65c: 0x9c, 0x65d: 0x18a, 0x65e: 0x9c, 0x65f: 0x18b, - 0x660: 0x18c, 0x661: 0x18d, 0x662: 0x18e, 0x663: 0xfb, 0x664: 0x9c, 0x665: 0x18f, 0x666: 0x9c, 0x667: 0x190, - 0x668: 0x9c, 0x669: 0x191, 0x66a: 0x192, 0x66b: 0x193, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x194, 0x66f: 0x195, - 0x670: 0xfb, 0x671: 0xfb, 0x672: 0xfb, 0x673: 0xfb, 0x674: 0xfb, 0x675: 0xfb, 0x676: 0xfb, 0x677: 0xfb, - 0x678: 0xfb, 0x679: 0xfb, 0x67a: 0xfb, 0x67b: 0xfb, 0x67c: 0xfb, 0x67d: 0xfb, 0x67e: 0xfb, 0x67f: 0xfb, + 0x658: 0x9c, 0x659: 0x9c, 0x65a: 0x9c, 0x65b: 0x18b, 0x65c: 0x9c, 0x65d: 0x18c, 0x65e: 0x9c, 0x65f: 0x18d, + 0x660: 0x18e, 0x661: 0x18f, 0x662: 0x190, 0x663: 0xfd, 0x664: 0x9c, 0x665: 0x191, 0x666: 0x9c, 0x667: 0x192, + 0x668: 0x9c, 0x669: 0x193, 0x66a: 0x194, 0x66b: 0x195, 0x66c: 0x9c, 0x66d: 0x9c, 0x66e: 0x196, 0x66f: 0x197, + 0x670: 0xfd, 0x671: 0xfd, 0x672: 0xfd, 0x673: 0xfd, 0x674: 0xfd, 0x675: 0xfd, 0x676: 0xfd, 0x677: 0xfd, + 0x678: 0xfd, 0x679: 0xfd, 0x67a: 0xfd, 0x67b: 0xfd, 0x67c: 0xfd, 0x67d: 0xfd, 0x67e: 0xfd, 0x67f: 0xfd, // Block 0x1a, offset 0x680 0x680: 0xa0, 0x681: 0xa0, 0x682: 0xa0, 0x683: 0xa0, 0x684: 0xa0, 0x685: 0xa0, 0x686: 0xa0, 0x687: 0xa0, 0x688: 0xa0, 0x689: 0xa0, 0x68a: 0xa0, 0x68b: 0xa0, 0x68c: 0xa0, 0x68d: 0xa0, 0x68e: 0xa0, 0x68f: 0xa0, 0x690: 0xa0, 0x691: 0xa0, 0x692: 0xa0, 0x693: 0xa0, 0x694: 0xa0, 0x695: 0xa0, 0x696: 0xa0, 0x697: 0xa0, - 0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x196, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0, + 0x698: 0xa0, 0x699: 0xa0, 0x69a: 0xa0, 0x69b: 0x198, 0x69c: 0xa0, 0x69d: 0xa0, 0x69e: 0xa0, 0x69f: 0xa0, 0x6a0: 0xa0, 0x6a1: 0xa0, 0x6a2: 0xa0, 0x6a3: 0xa0, 0x6a4: 0xa0, 0x6a5: 0xa0, 0x6a6: 0xa0, 0x6a7: 0xa0, 0x6a8: 0xa0, 0x6a9: 0xa0, 0x6aa: 0xa0, 0x6ab: 0xa0, 0x6ac: 0xa0, 0x6ad: 0xa0, 0x6ae: 0xa0, 0x6af: 0xa0, 0x6b0: 0xa0, 0x6b1: 0xa0, 0x6b2: 0xa0, 0x6b3: 0xa0, 0x6b4: 0xa0, 0x6b5: 0xa0, 0x6b6: 0xa0, 0x6b7: 0xa0, @@ -2312,8 +2455,8 @@ var idnaIndex = [2368]uint16{ 0x6c0: 0xa0, 0x6c1: 0xa0, 0x6c2: 0xa0, 0x6c3: 0xa0, 0x6c4: 0xa0, 0x6c5: 0xa0, 0x6c6: 0xa0, 0x6c7: 0xa0, 0x6c8: 0xa0, 0x6c9: 0xa0, 0x6ca: 0xa0, 0x6cb: 0xa0, 0x6cc: 0xa0, 0x6cd: 0xa0, 0x6ce: 0xa0, 0x6cf: 0xa0, 0x6d0: 0xa0, 0x6d1: 0xa0, 0x6d2: 0xa0, 0x6d3: 0xa0, 0x6d4: 0xa0, 0x6d5: 0xa0, 0x6d6: 0xa0, 0x6d7: 0xa0, - 0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x197, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0, - 0x6e0: 0x198, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0, + 0x6d8: 0xa0, 0x6d9: 0xa0, 0x6da: 0xa0, 0x6db: 0xa0, 0x6dc: 0x199, 0x6dd: 0xa0, 0x6de: 0xa0, 0x6df: 0xa0, + 0x6e0: 0x19a, 0x6e1: 0xa0, 0x6e2: 0xa0, 0x6e3: 0xa0, 0x6e4: 0xa0, 0x6e5: 0xa0, 0x6e6: 0xa0, 0x6e7: 0xa0, 0x6e8: 0xa0, 0x6e9: 0xa0, 0x6ea: 0xa0, 0x6eb: 0xa0, 0x6ec: 0xa0, 0x6ed: 0xa0, 0x6ee: 0xa0, 0x6ef: 0xa0, 0x6f0: 0xa0, 0x6f1: 0xa0, 0x6f2: 0xa0, 0x6f3: 0xa0, 0x6f4: 0xa0, 0x6f5: 0xa0, 0x6f6: 0xa0, 0x6f7: 0xa0, 0x6f8: 0xa0, 0x6f9: 0xa0, 0x6fa: 0xa0, 0x6fb: 0xa0, 0x6fc: 0xa0, 0x6fd: 0xa0, 0x6fe: 0xa0, 0x6ff: 0xa0, @@ -2325,34 +2468,34 @@ var idnaIndex = [2368]uint16{ 0x720: 0xa0, 0x721: 0xa0, 0x722: 0xa0, 0x723: 0xa0, 0x724: 0xa0, 0x725: 0xa0, 0x726: 0xa0, 0x727: 0xa0, 0x728: 0xa0, 0x729: 0xa0, 0x72a: 0xa0, 0x72b: 0xa0, 0x72c: 0xa0, 0x72d: 0xa0, 0x72e: 0xa0, 0x72f: 0xa0, 0x730: 0xa0, 0x731: 0xa0, 0x732: 0xa0, 0x733: 0xa0, 0x734: 0xa0, 0x735: 0xa0, 0x736: 0xa0, 0x737: 0xa0, - 0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x199, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0, + 0x738: 0xa0, 0x739: 0xa0, 0x73a: 0x19b, 0x73b: 0xa0, 0x73c: 0xa0, 0x73d: 0xa0, 0x73e: 0xa0, 0x73f: 0xa0, // Block 0x1d, offset 0x740 0x740: 0xa0, 0x741: 0xa0, 0x742: 0xa0, 0x743: 0xa0, 0x744: 0xa0, 0x745: 0xa0, 0x746: 0xa0, 0x747: 0xa0, 0x748: 0xa0, 0x749: 0xa0, 0x74a: 0xa0, 0x74b: 0xa0, 0x74c: 0xa0, 0x74d: 0xa0, 0x74e: 0xa0, 0x74f: 0xa0, 0x750: 0xa0, 0x751: 0xa0, 0x752: 0xa0, 0x753: 0xa0, 0x754: 0xa0, 0x755: 0xa0, 0x756: 0xa0, 0x757: 0xa0, 0x758: 0xa0, 0x759: 0xa0, 0x75a: 0xa0, 0x75b: 0xa0, 0x75c: 0xa0, 0x75d: 0xa0, 0x75e: 0xa0, 0x75f: 0xa0, 0x760: 0xa0, 0x761: 0xa0, 0x762: 0xa0, 0x763: 0xa0, 0x764: 0xa0, 0x765: 0xa0, 0x766: 0xa0, 0x767: 0xa0, - 0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19a, - 0x770: 0xfb, 0x771: 0xfb, 0x772: 0xfb, 0x773: 0xfb, 0x774: 0xfb, 0x775: 0xfb, 0x776: 0xfb, 0x777: 0xfb, - 0x778: 0xfb, 0x779: 0xfb, 0x77a: 0xfb, 0x77b: 0xfb, 0x77c: 0xfb, 0x77d: 0xfb, 0x77e: 0xfb, 0x77f: 0xfb, + 0x768: 0xa0, 0x769: 0xa0, 0x76a: 0xa0, 0x76b: 0xa0, 0x76c: 0xa0, 0x76d: 0xa0, 0x76e: 0xa0, 0x76f: 0x19c, + 0x770: 0xfd, 0x771: 0xfd, 0x772: 0xfd, 0x773: 0xfd, 0x774: 0xfd, 0x775: 0xfd, 0x776: 0xfd, 0x777: 0xfd, + 0x778: 0xfd, 0x779: 0xfd, 0x77a: 0xfd, 0x77b: 0xfd, 0x77c: 0xfd, 0x77d: 0xfd, 0x77e: 0xfd, 0x77f: 0xfd, // Block 0x1e, offset 0x780 - 0x780: 0xfb, 0x781: 0xfb, 0x782: 0xfb, 0x783: 0xfb, 0x784: 0xfb, 0x785: 0xfb, 0x786: 0xfb, 0x787: 0xfb, - 0x788: 0xfb, 0x789: 0xfb, 0x78a: 0xfb, 0x78b: 0xfb, 0x78c: 0xfb, 0x78d: 0xfb, 0x78e: 0xfb, 0x78f: 0xfb, - 0x790: 0xfb, 0x791: 0xfb, 0x792: 0xfb, 0x793: 0xfb, 0x794: 0xfb, 0x795: 0xfb, 0x796: 0xfb, 0x797: 0xfb, - 0x798: 0xfb, 0x799: 0xfb, 0x79a: 0xfb, 0x79b: 0xfb, 0x79c: 0xfb, 0x79d: 0xfb, 0x79e: 0xfb, 0x79f: 0xfb, - 0x7a0: 0x77, 0x7a1: 0x78, 0x7a2: 0x79, 0x7a3: 0x19b, 0x7a4: 0x7a, 0x7a5: 0x7b, 0x7a6: 0x19c, 0x7a7: 0x7c, - 0x7a8: 0x7d, 0x7a9: 0xfb, 0x7aa: 0xfb, 0x7ab: 0xfb, 0x7ac: 0xfb, 0x7ad: 0xfb, 0x7ae: 0xfb, 0x7af: 0xfb, - 0x7b0: 0xfb, 0x7b1: 0xfb, 0x7b2: 0xfb, 0x7b3: 0xfb, 0x7b4: 0xfb, 0x7b5: 0xfb, 0x7b6: 0xfb, 0x7b7: 0xfb, - 0x7b8: 0xfb, 0x7b9: 0xfb, 0x7ba: 0xfb, 0x7bb: 0xfb, 0x7bc: 0xfb, 0x7bd: 0xfb, 0x7be: 0xfb, 0x7bf: 0xfb, + 0x780: 0xfd, 0x781: 0xfd, 0x782: 0xfd, 0x783: 0xfd, 0x784: 0xfd, 0x785: 0xfd, 0x786: 0xfd, 0x787: 0xfd, + 0x788: 0xfd, 0x789: 0xfd, 0x78a: 0xfd, 0x78b: 0xfd, 0x78c: 0xfd, 0x78d: 0xfd, 0x78e: 0xfd, 0x78f: 0xfd, + 0x790: 0xfd, 0x791: 0xfd, 0x792: 0xfd, 0x793: 0xfd, 0x794: 0xfd, 0x795: 0xfd, 0x796: 0xfd, 0x797: 0xfd, + 0x798: 0xfd, 0x799: 0xfd, 0x79a: 0xfd, 0x79b: 0xfd, 0x79c: 0xfd, 0x79d: 0xfd, 0x79e: 0xfd, 0x79f: 0xfd, + 0x7a0: 0x75, 0x7a1: 0x76, 0x7a2: 0x77, 0x7a3: 0x78, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x7b, 0x7a7: 0x7c, + 0x7a8: 0x7d, 0x7a9: 0xfd, 0x7aa: 0xfd, 0x7ab: 0xfd, 0x7ac: 0xfd, 0x7ad: 0xfd, 0x7ae: 0xfd, 0x7af: 0xfd, + 0x7b0: 0xfd, 0x7b1: 0xfd, 0x7b2: 0xfd, 0x7b3: 0xfd, 0x7b4: 0xfd, 0x7b5: 0xfd, 0x7b6: 0xfd, 0x7b7: 0xfd, + 0x7b8: 0xfd, 0x7b9: 0xfd, 0x7ba: 0xfd, 0x7bb: 0xfd, 0x7bc: 0xfd, 0x7bd: 0xfd, 0x7be: 0xfd, 0x7bf: 0xfd, // Block 0x1f, offset 0x7c0 0x7c0: 0xa0, 0x7c1: 0xa0, 0x7c2: 0xa0, 0x7c3: 0xa0, 0x7c4: 0xa0, 0x7c5: 0xa0, 0x7c6: 0xa0, 0x7c7: 0xa0, - 0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfb, 0x7cf: 0xfb, - 0x7d0: 0xfb, 0x7d1: 0xfb, 0x7d2: 0xfb, 0x7d3: 0xfb, 0x7d4: 0xfb, 0x7d5: 0xfb, 0x7d6: 0xfb, 0x7d7: 0xfb, - 0x7d8: 0xfb, 0x7d9: 0xfb, 0x7da: 0xfb, 0x7db: 0xfb, 0x7dc: 0xfb, 0x7dd: 0xfb, 0x7de: 0xfb, 0x7df: 0xfb, - 0x7e0: 0xfb, 0x7e1: 0xfb, 0x7e2: 0xfb, 0x7e3: 0xfb, 0x7e4: 0xfb, 0x7e5: 0xfb, 0x7e6: 0xfb, 0x7e7: 0xfb, - 0x7e8: 0xfb, 0x7e9: 0xfb, 0x7ea: 0xfb, 0x7eb: 0xfb, 0x7ec: 0xfb, 0x7ed: 0xfb, 0x7ee: 0xfb, 0x7ef: 0xfb, - 0x7f0: 0xfb, 0x7f1: 0xfb, 0x7f2: 0xfb, 0x7f3: 0xfb, 0x7f4: 0xfb, 0x7f5: 0xfb, 0x7f6: 0xfb, 0x7f7: 0xfb, - 0x7f8: 0xfb, 0x7f9: 0xfb, 0x7fa: 0xfb, 0x7fb: 0xfb, 0x7fc: 0xfb, 0x7fd: 0xfb, 0x7fe: 0xfb, 0x7ff: 0xfb, + 0x7c8: 0xa0, 0x7c9: 0xa0, 0x7ca: 0xa0, 0x7cb: 0xa0, 0x7cc: 0xa0, 0x7cd: 0x19d, 0x7ce: 0xfd, 0x7cf: 0xfd, + 0x7d0: 0xfd, 0x7d1: 0xfd, 0x7d2: 0xfd, 0x7d3: 0xfd, 0x7d4: 0xfd, 0x7d5: 0xfd, 0x7d6: 0xfd, 0x7d7: 0xfd, + 0x7d8: 0xfd, 0x7d9: 0xfd, 0x7da: 0xfd, 0x7db: 0xfd, 0x7dc: 0xfd, 0x7dd: 0xfd, 0x7de: 0xfd, 0x7df: 0xfd, + 0x7e0: 0xfd, 0x7e1: 0xfd, 0x7e2: 0xfd, 0x7e3: 0xfd, 0x7e4: 0xfd, 0x7e5: 0xfd, 0x7e6: 0xfd, 0x7e7: 0xfd, + 0x7e8: 0xfd, 0x7e9: 0xfd, 0x7ea: 0xfd, 0x7eb: 0xfd, 0x7ec: 0xfd, 0x7ed: 0xfd, 0x7ee: 0xfd, 0x7ef: 0xfd, + 0x7f0: 0xfd, 0x7f1: 0xfd, 0x7f2: 0xfd, 0x7f3: 0xfd, 0x7f4: 0xfd, 0x7f5: 0xfd, 0x7f6: 0xfd, 0x7f7: 0xfd, + 0x7f8: 0xfd, 0x7f9: 0xfd, 0x7fa: 0xfd, 0x7fb: 0xfd, 0x7fc: 0xfd, 0x7fd: 0xfd, 0x7fe: 0xfd, 0x7ff: 0xfd, // Block 0x20, offset 0x800 0x810: 0x0d, 0x811: 0x0e, 0x812: 0x0f, 0x813: 0x10, 0x814: 0x11, 0x815: 0x0b, 0x816: 0x12, 0x817: 0x07, 0x818: 0x13, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x14, 0x81c: 0x0b, 0x81d: 0x15, 0x81e: 0x16, 0x81f: 0x17, @@ -2370,14 +2513,14 @@ var idnaIndex = [2368]uint16{ 0x870: 0x0b, 0x871: 0x0b, 0x872: 0x0b, 0x873: 0x0b, 0x874: 0x0b, 0x875: 0x0b, 0x876: 0x0b, 0x877: 0x0b, 0x878: 0x0b, 0x879: 0x0b, 0x87a: 0x0b, 0x87b: 0x0b, 0x87c: 0x0b, 0x87d: 0x0b, 0x87e: 0x0b, 0x87f: 0x0b, // Block 0x22, offset 0x880 - 0x880: 0x19e, 0x881: 0x19f, 0x882: 0xfb, 0x883: 0xfb, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1, - 0x888: 0xfb, 0x889: 0xfb, 0x88a: 0xfb, 0x88b: 0xfb, 0x88c: 0xfb, 0x88d: 0xfb, 0x88e: 0xfb, 0x88f: 0xfb, - 0x890: 0xfb, 0x891: 0xfb, 0x892: 0xfb, 0x893: 0xfb, 0x894: 0xfb, 0x895: 0xfb, 0x896: 0xfb, 0x897: 0xfb, - 0x898: 0xfb, 0x899: 0xfb, 0x89a: 0xfb, 0x89b: 0xfb, 0x89c: 0xfb, 0x89d: 0xfb, 0x89e: 0xfb, 0x89f: 0xfb, - 0x8a0: 0xfb, 0x8a1: 0xfb, 0x8a2: 0xfb, 0x8a3: 0xfb, 0x8a4: 0xfb, 0x8a5: 0xfb, 0x8a6: 0xfb, 0x8a7: 0xfb, - 0x8a8: 0xfb, 0x8a9: 0xfb, 0x8aa: 0xfb, 0x8ab: 0xfb, 0x8ac: 0xfb, 0x8ad: 0xfb, 0x8ae: 0xfb, 0x8af: 0xfb, - 0x8b0: 0xfb, 0x8b1: 0xfb, 0x8b2: 0xfb, 0x8b3: 0xfb, 0x8b4: 0xfb, 0x8b5: 0xfb, 0x8b6: 0xfb, 0x8b7: 0xfb, - 0x8b8: 0xfb, 0x8b9: 0xfb, 0x8ba: 0xfb, 0x8bb: 0xfb, 0x8bc: 0xfb, 0x8bd: 0xfb, 0x8be: 0xfb, 0x8bf: 0xfb, + 0x880: 0x19e, 0x881: 0x19f, 0x882: 0xfd, 0x883: 0xfd, 0x884: 0x1a0, 0x885: 0x1a0, 0x886: 0x1a0, 0x887: 0x1a1, + 0x888: 0xfd, 0x889: 0xfd, 0x88a: 0xfd, 0x88b: 0xfd, 0x88c: 0xfd, 0x88d: 0xfd, 0x88e: 0xfd, 0x88f: 0xfd, + 0x890: 0xfd, 0x891: 0xfd, 0x892: 0xfd, 0x893: 0xfd, 0x894: 0xfd, 0x895: 0xfd, 0x896: 0xfd, 0x897: 0xfd, + 0x898: 0xfd, 0x899: 0xfd, 0x89a: 0xfd, 0x89b: 0xfd, 0x89c: 0xfd, 0x89d: 0xfd, 0x89e: 0xfd, 0x89f: 0xfd, + 0x8a0: 0xfd, 0x8a1: 0xfd, 0x8a2: 0xfd, 0x8a3: 0xfd, 0x8a4: 0xfd, 0x8a5: 0xfd, 0x8a6: 0xfd, 0x8a7: 0xfd, + 0x8a8: 0xfd, 0x8a9: 0xfd, 0x8aa: 0xfd, 0x8ab: 0xfd, 0x8ac: 0xfd, 0x8ad: 0xfd, 0x8ae: 0xfd, 0x8af: 0xfd, + 0x8b0: 0xfd, 0x8b1: 0xfd, 0x8b2: 0xfd, 0x8b3: 0xfd, 0x8b4: 0xfd, 0x8b5: 0xfd, 0x8b6: 0xfd, 0x8b7: 0xfd, + 0x8b8: 0xfd, 0x8b9: 0xfd, 0x8ba: 0xfd, 0x8bb: 0xfd, 0x8bc: 0xfd, 0x8bd: 0xfd, 0x8be: 0xfd, 0x8bf: 0xfd, // Block 0x23, offset 0x8c0 0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b, 0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b, @@ -2393,10 +2536,10 @@ var idnaIndex = [2368]uint16{ } // idnaSparseOffset: 292 entries, 584 bytes -var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x330, 0x333, 0x337, 0x33c, 0x341, 0x347, 0x358, 0x368, 0x36e, 0x372, 0x381, 0x386, 0x38e, 0x398, 0x3a3, 0x3ab, 0x3bc, 0x3c5, 0x3d5, 0x3e2, 0x3ee, 0x3f3, 0x400, 0x404, 0x409, 0x40b, 0x40d, 0x411, 0x413, 0x417, 0x420, 0x426, 0x42a, 0x43a, 0x444, 0x449, 0x44c, 0x452, 0x459, 0x45e, 0x462, 0x468, 0x46d, 0x476, 0x47b, 0x481, 0x488, 0x48f, 0x496, 0x49a, 0x49f, 0x4a2, 0x4a7, 0x4b3, 0x4b9, 0x4be, 0x4c5, 0x4cd, 0x4d2, 0x4d6, 0x4e6, 0x4ed, 0x4f1, 0x4f5, 0x4fc, 0x4fe, 0x501, 0x504, 0x508, 0x511, 0x515, 0x51d, 0x525, 0x52d, 0x539, 0x545, 0x54b, 0x554, 0x560, 0x567, 0x570, 0x57b, 0x582, 0x591, 0x59e, 0x5ab, 0x5b4, 0x5b8, 0x5c7, 0x5cf, 0x5da, 0x5e3, 0x5e9, 0x5f1, 0x5fa, 0x605, 0x608, 0x614, 0x61d, 0x620, 0x625, 0x62e, 0x633, 0x640, 0x64b, 0x654, 0x65e, 0x661, 0x66b, 0x674, 0x680, 0x68d, 0x69a, 0x6a8, 0x6af, 0x6b3, 0x6b7, 0x6ba, 0x6bf, 0x6c2, 0x6c7, 0x6ca, 0x6d1, 0x6d8, 0x6dc, 0x6e7, 0x6ea, 0x6ed, 0x6f0, 0x6f6, 0x6fc, 0x705, 0x708, 0x70b, 0x70e, 0x711, 0x718, 0x71b, 0x720, 0x72a, 0x72d, 0x731, 0x740, 0x74c, 0x750, 0x755, 0x759, 0x75e, 0x762, 0x767, 0x770, 0x77b, 0x781, 0x787, 0x78d, 0x793, 0x79c, 0x79f, 0x7a2, 0x7a6, 0x7aa, 0x7ae, 0x7b4, 0x7ba, 0x7bf, 0x7c2, 0x7d2, 0x7d9, 0x7dc, 0x7e1, 0x7e5, 0x7eb, 0x7f2, 0x7f6, 0x7fa, 0x803, 0x80a, 0x80f, 0x813, 0x821, 0x824, 0x827, 0x82b, 0x82f, 0x832, 0x842, 0x853, 0x856, 0x85b, 0x85d, 0x85f} +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x85, 0x8b, 0x94, 0xa4, 0xb2, 0xbd, 0xca, 0xdb, 0xe5, 0xec, 0xf9, 0x10a, 0x111, 0x11c, 0x12b, 0x139, 0x143, 0x145, 0x14a, 0x14d, 0x150, 0x152, 0x15e, 0x169, 0x171, 0x177, 0x17d, 0x182, 0x187, 0x18a, 0x18e, 0x194, 0x199, 0x1a5, 0x1af, 0x1b5, 0x1c6, 0x1d0, 0x1d3, 0x1db, 0x1de, 0x1eb, 0x1f3, 0x1f7, 0x1fe, 0x206, 0x216, 0x222, 0x225, 0x22f, 0x23b, 0x247, 0x253, 0x25b, 0x260, 0x26d, 0x27e, 0x282, 0x28d, 0x291, 0x29a, 0x2a2, 0x2a8, 0x2ad, 0x2b0, 0x2b4, 0x2ba, 0x2be, 0x2c2, 0x2c6, 0x2cc, 0x2d4, 0x2db, 0x2e6, 0x2f0, 0x2f4, 0x2f7, 0x2fd, 0x301, 0x303, 0x306, 0x308, 0x30b, 0x315, 0x318, 0x327, 0x32b, 0x32f, 0x331, 0x33a, 0x33d, 0x341, 0x346, 0x34b, 0x351, 0x362, 0x372, 0x378, 0x37c, 0x38b, 0x390, 0x398, 0x3a2, 0x3ad, 0x3b5, 0x3c6, 0x3cf, 0x3df, 0x3ec, 0x3f8, 0x3fd, 0x40a, 0x40e, 0x413, 0x415, 0x417, 0x41b, 0x41d, 0x421, 0x42a, 0x430, 0x434, 0x444, 0x44e, 0x453, 0x456, 0x45c, 0x463, 0x468, 0x46c, 0x472, 0x477, 0x480, 0x485, 0x48b, 0x492, 0x499, 0x4a0, 0x4a4, 0x4a9, 0x4ac, 0x4b1, 0x4bd, 0x4c3, 0x4c8, 0x4cf, 0x4d7, 0x4dc, 0x4e0, 0x4f0, 0x4f7, 0x4fb, 0x4ff, 0x506, 0x508, 0x50b, 0x50e, 0x512, 0x51b, 0x51f, 0x527, 0x52f, 0x537, 0x543, 0x54f, 0x555, 0x55e, 0x56a, 0x571, 0x57a, 0x585, 0x58c, 0x59b, 0x5a8, 0x5b5, 0x5be, 0x5c2, 0x5d1, 0x5d9, 0x5e4, 0x5ed, 0x5f3, 0x5fb, 0x604, 0x60f, 0x612, 0x61e, 0x627, 0x62a, 0x62f, 0x638, 0x63d, 0x64a, 0x655, 0x65e, 0x668, 0x66b, 0x675, 0x67e, 0x68a, 0x697, 0x6a4, 0x6b2, 0x6b9, 0x6bd, 0x6c1, 0x6c4, 0x6c9, 0x6cc, 0x6d1, 0x6d4, 0x6db, 0x6e2, 0x6e6, 0x6f1, 0x6f4, 0x6f7, 0x6fa, 0x700, 0x706, 0x70f, 0x712, 0x715, 0x718, 0x71b, 0x722, 0x725, 0x72a, 0x734, 0x737, 0x73b, 0x74a, 0x756, 0x75a, 0x75f, 0x763, 0x768, 0x76c, 0x771, 0x77a, 0x785, 0x78b, 0x791, 0x797, 0x79d, 0x7a6, 0x7a9, 0x7ac, 0x7b0, 0x7b4, 0x7b8, 0x7be, 0x7c4, 0x7c9, 0x7cc, 0x7dc, 0x7e3, 0x7e6, 0x7eb, 0x7ef, 0x7f5, 0x7fc, 0x800, 0x804, 0x80d, 0x814, 0x819, 0x81d, 0x82b, 0x82e, 0x831, 0x835, 0x839, 0x83c, 0x83f, 0x844, 0x846, 0x848} -// idnaSparseValues: 2146 entries, 8584 bytes -var idnaSparseValues = [2146]valueRange{ +// idnaSparseValues: 2123 entries, 8492 bytes +var idnaSparseValues = [2123]valueRange{ // Block 0x0, offset 0x0 {value: 0x0000, lo: 0x07}, {value: 0xe105, lo: 0x80, hi: 0x96}, @@ -2427,15 +2570,15 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x2, offset 0x19 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0xaf}, - {value: 0x0249, lo: 0xb0, hi: 0xb0}, + {value: 0x00a9, lo: 0xb0, hi: 0xb0}, {value: 0x037d, lo: 0xb1, hi: 0xb1}, - {value: 0x0259, lo: 0xb2, hi: 0xb2}, - {value: 0x0269, lo: 0xb3, hi: 0xb3}, + {value: 0x00b1, lo: 0xb2, hi: 0xb2}, + {value: 0x00b9, lo: 0xb3, hi: 0xb3}, {value: 0x034d, lo: 0xb4, hi: 0xb4}, {value: 0x0395, lo: 0xb5, hi: 0xb5}, {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, - {value: 0x0279, lo: 0xb7, hi: 0xb7}, - {value: 0x0289, lo: 0xb8, hi: 0xb8}, + {value: 0x00c1, lo: 0xb7, hi: 0xb7}, + {value: 0x00c9, lo: 0xb8, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbf}, // Block 0x3, offset 0x25 {value: 0x0000, lo: 0x01}, @@ -2457,7 +2600,7 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x6, offset 0x33 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x86}, - {value: 0x0401, lo: 0x87, hi: 0x87}, + {value: 0x0131, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x88}, {value: 0x0018, lo: 0x89, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8c}, @@ -2643,7 +2786,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x81, hi: 0xb0}, {value: 0x3308, lo: 0xb1, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xb2}, - {value: 0x08f1, lo: 0xb3, hi: 0xb3}, + {value: 0x01f1, lo: 0xb3, hi: 0xb3}, {value: 0x3308, lo: 0xb4, hi: 0xb9}, {value: 0x3b08, lo: 0xba, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, @@ -2666,8 +2809,8 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9b}, - {value: 0x0961, lo: 0x9c, hi: 0x9c}, - {value: 0x0999, lo: 0x9d, hi: 0x9d}, + {value: 0x0201, lo: 0x9c, hi: 0x9c}, + {value: 0x0209, lo: 0x9d, hi: 0x9d}, {value: 0x0008, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, // Block 0x18, offset 0xf9 @@ -3075,13 +3218,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbe, hi: 0xbf}, // Block 0x44, offset 0x260 {value: 0x0000, lo: 0x0c}, - {value: 0x0e29, lo: 0x80, hi: 0x80}, - {value: 0x0e41, lo: 0x81, hi: 0x81}, - {value: 0x0e59, lo: 0x82, hi: 0x82}, - {value: 0x0e71, lo: 0x83, hi: 0x83}, - {value: 0x0e89, lo: 0x84, hi: 0x85}, - {value: 0x0ea1, lo: 0x86, hi: 0x86}, - {value: 0x0eb9, lo: 0x87, hi: 0x87}, + {value: 0x02a9, lo: 0x80, hi: 0x80}, + {value: 0x02b1, lo: 0x81, hi: 0x81}, + {value: 0x02b9, lo: 0x82, hi: 0x82}, + {value: 0x02c1, lo: 0x83, hi: 0x83}, + {value: 0x02c9, lo: 0x84, hi: 0x85}, + {value: 0x02d1, lo: 0x86, hi: 0x86}, + {value: 0x02d9, lo: 0x87, hi: 0x87}, {value: 0x057d, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, {value: 0x059d, lo: 0x90, hi: 0xba}, @@ -3133,18 +3276,18 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x83, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x88}, - {value: 0x24c1, lo: 0x89, hi: 0x89}, + {value: 0x0851, lo: 0x89, hi: 0x89}, {value: 0x0018, lo: 0x8a, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, // Block 0x4a, offset 0x29a {value: 0x0000, lo: 0x07}, {value: 0x0018, lo: 0x80, hi: 0xab}, - {value: 0x24f1, lo: 0xac, hi: 0xac}, - {value: 0x2529, lo: 0xad, hi: 0xad}, + {value: 0x0859, lo: 0xac, hi: 0xac}, + {value: 0x0861, lo: 0xad, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xae}, - {value: 0x2579, lo: 0xaf, hi: 0xaf}, - {value: 0x25b1, lo: 0xb0, hi: 0xb0}, + {value: 0x0869, lo: 0xaf, hi: 0xaf}, + {value: 0x0871, lo: 0xb0, hi: 0xb0}, {value: 0x0018, lo: 0xb1, hi: 0xbf}, // Block 0x4b, offset 0x2a2 {value: 0x0000, lo: 0x05}, @@ -3166,19 +3309,19 @@ var idnaSparseValues = [2146]valueRange{ // Block 0x4e, offset 0x2b0 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, - {value: 0x28c1, lo: 0x8c, hi: 0x8c}, + {value: 0x0929, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0xbf}, // Block 0x4f, offset 0x2b4 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0e7e, lo: 0xb4, hi: 0xb4}, - {value: 0x292a, lo: 0xb5, hi: 0xb5}, + {value: 0x0932, lo: 0xb5, hi: 0xb5}, {value: 0x0e9e, lo: 0xb6, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, // Block 0x50, offset 0x2ba {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x9b}, - {value: 0x2941, lo: 0x9c, hi: 0x9c}, + {value: 0x0939, lo: 0x9c, hi: 0x9c}, {value: 0x0018, lo: 0x9d, hi: 0xbf}, // Block 0x51, offset 0x2be {value: 0x0000, lo: 0x03}, @@ -3277,16 +3420,16 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9a}, - {value: 0x29e2, lo: 0x9b, hi: 0x9b}, - {value: 0x2a0a, lo: 0x9c, hi: 0x9c}, + {value: 0x096a, lo: 0x9b, hi: 0x9b}, + {value: 0x0972, lo: 0x9c, hi: 0x9c}, {value: 0x0008, lo: 0x9d, hi: 0x9e}, - {value: 0x2a31, lo: 0x9f, hi: 0x9f}, + {value: 0x0979, lo: 0x9f, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0008, lo: 0xa1, hi: 0xbf}, // Block 0x61, offset 0x315 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbe}, - {value: 0x2a69, lo: 0xbf, hi: 0xbf}, + {value: 0x0981, lo: 0xbf, hi: 0xbf}, // Block 0x62, offset 0x318 {value: 0x0000, lo: 0x0e}, {value: 0x0040, lo: 0x80, hi: 0x84}, @@ -3309,46 +3452,58 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, // Block 0x64, offset 0x32b - {value: 0x0030, lo: 0x04}, - {value: 0x2aa2, lo: 0x80, hi: 0x9d}, - {value: 0x305a, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x03}, + {value: 0x098a, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, - {value: 0x30a2, lo: 0xa0, hi: 0xbf}, - // Block 0x65, offset 0x330 + {value: 0x0a82, lo: 0xa0, hi: 0xbf}, + // Block 0x65, offset 0x32f + {value: 0x0008, lo: 0x01}, + {value: 0x0d19, lo: 0x80, hi: 0xbf}, + // Block 0x66, offset 0x331 + {value: 0x0008, lo: 0x08}, + {value: 0x0f19, lo: 0x80, hi: 0xb0}, + {value: 0x4045, lo: 0xb1, hi: 0xb1}, + {value: 0x10a1, lo: 0xb2, hi: 0xb3}, + {value: 0x4065, lo: 0xb4, hi: 0xb4}, + {value: 0x10b1, lo: 0xb5, hi: 0xb7}, + {value: 0x4085, lo: 0xb8, hi: 0xb8}, + {value: 0x4085, lo: 0xb9, hi: 0xb9}, + {value: 0x10c9, lo: 0xba, hi: 0xbf}, + // Block 0x67, offset 0x33a {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x66, offset 0x333 + // Block 0x68, offset 0x33d {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0040, lo: 0x8d, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x67, offset 0x337 + // Block 0x69, offset 0x341 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0x68, offset 0x33c + // Block 0x6a, offset 0x346 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xbf}, - // Block 0x69, offset 0x341 + // Block 0x6b, offset 0x34b {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb1}, {value: 0x0018, lo: 0xb2, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6a, offset 0x347 + // Block 0x6c, offset 0x351 {value: 0x0000, lo: 0x10}, {value: 0x0040, lo: 0x80, hi: 0x81}, {value: 0xe00d, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0x83}, {value: 0x03f5, lo: 0x84, hi: 0x84}, - {value: 0x1329, lo: 0x85, hi: 0x85}, + {value: 0x0479, lo: 0x85, hi: 0x85}, {value: 0x447d, lo: 0x86, hi: 0x86}, {value: 0xe07d, lo: 0x87, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x88}, @@ -3357,10 +3512,10 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x8b, hi: 0xb4}, {value: 0xe01d, lo: 0xb5, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xb7}, - {value: 0x2009, lo: 0xb8, hi: 0xb8}, - {value: 0x6ec1, lo: 0xb9, hi: 0xb9}, + {value: 0x0741, lo: 0xb8, hi: 0xb8}, + {value: 0x13f1, lo: 0xb9, hi: 0xb9}, {value: 0x0008, lo: 0xba, hi: 0xbf}, - // Block 0x6b, offset 0x358 + // Block 0x6d, offset 0x362 {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x81}, {value: 0x3308, lo: 0x82, hi: 0x82}, @@ -3377,19 +3532,19 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x6c, offset 0x368 + // Block 0x6e, offset 0x372 {value: 0x0000, lo: 0x05}, {value: 0x0208, lo: 0x80, hi: 0xb1}, {value: 0x0108, lo: 0xb2, hi: 0xb2}, {value: 0x0008, lo: 0xb3, hi: 0xb3}, {value: 0x0018, lo: 0xb4, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0x6d, offset 0x36e + // Block 0x6f, offset 0x378 {value: 0x0000, lo: 0x03}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x0008, lo: 0x82, hi: 0xb3}, {value: 0x3008, lo: 0xb4, hi: 0xbf}, - // Block 0x6e, offset 0x372 + // Block 0x70, offset 0x37c {value: 0x0000, lo: 0x0e}, {value: 0x3008, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x84}, @@ -3405,13 +3560,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbc, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0x6f, offset 0x381 + // Block 0x71, offset 0x38b {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x70, offset 0x386 + // Block 0x72, offset 0x390 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x3308, lo: 0x87, hi: 0x91}, @@ -3420,7 +3575,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x94, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x71, offset 0x38e + // Block 0x73, offset 0x398 {value: 0x0000, lo: 0x09}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x3008, lo: 0x83, hi: 0x83}, @@ -3431,7 +3586,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xba, hi: 0xbb}, {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbf}, - // Block 0x72, offset 0x398 + // Block 0x74, offset 0x3a2 {value: 0x0000, lo: 0x0a}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8d}, @@ -3443,7 +3598,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xa5, hi: 0xa5}, {value: 0x0008, lo: 0xa6, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0x73, offset 0x3a3 + // Block 0x75, offset 0x3ad {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xa8}, {value: 0x3308, lo: 0xa9, hi: 0xae}, @@ -3452,7 +3607,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb3, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x74, offset 0x3ab + // Block 0x76, offset 0x3b5 {value: 0x0000, lo: 0x10}, {value: 0x0008, lo: 0x80, hi: 0x82}, {value: 0x3308, lo: 0x83, hi: 0x83}, @@ -3470,7 +3625,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbc}, {value: 0x3008, lo: 0xbd, hi: 0xbd}, {value: 0x0008, lo: 0xbe, hi: 0xbf}, - // Block 0x75, offset 0x3bc + // Block 0x77, offset 0x3c6 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb0}, @@ -3480,7 +3635,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb7, hi: 0xb8}, {value: 0x0008, lo: 0xb9, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbf}, - // Block 0x76, offset 0x3c5 + // Block 0x78, offset 0x3cf {value: 0x0000, lo: 0x0f}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, @@ -3497,7 +3652,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb5, hi: 0xb5}, {value: 0x3b08, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x77, offset 0x3d5 + // Block 0x79, offset 0x3df {value: 0x0000, lo: 0x0c}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x86}, @@ -3511,26 +3666,26 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa8, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x78, offset 0x3e2 + // Block 0x7a, offset 0x3ec {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0018, lo: 0x9b, hi: 0x9b}, {value: 0x449d, lo: 0x9c, hi: 0x9c}, {value: 0x44b5, lo: 0x9d, hi: 0x9d}, - {value: 0x2971, lo: 0x9e, hi: 0x9e}, + {value: 0x0941, lo: 0x9e, hi: 0x9e}, {value: 0xe06d, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa8}, - {value: 0x6ed9, lo: 0xa9, hi: 0xa9}, + {value: 0x13f9, lo: 0xa9, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x44cd, lo: 0xb0, hi: 0xbf}, - // Block 0x79, offset 0x3ee + // Block 0x7b, offset 0x3f8 {value: 0x0000, lo: 0x04}, {value: 0x44ed, lo: 0x80, hi: 0x8f}, {value: 0x450d, lo: 0x90, hi: 0x9f}, {value: 0x452d, lo: 0xa0, hi: 0xaf}, {value: 0x450d, lo: 0xb0, hi: 0xbf}, - // Block 0x7a, offset 0x3f3 + // Block 0x7c, offset 0x3fd {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0xa2}, {value: 0x3008, lo: 0xa3, hi: 0xa4}, @@ -3544,76 +3699,76 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x7b, offset 0x400 + // Block 0x7d, offset 0x40a {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x7c, offset 0x404 + // Block 0x7e, offset 0x40e {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8a}, {value: 0x0018, lo: 0x8b, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x7d, offset 0x409 + // Block 0x7f, offset 0x413 {value: 0x0000, lo: 0x01}, {value: 0x0040, lo: 0x80, hi: 0xbf}, - // Block 0x7e, offset 0x40b + // Block 0x80, offset 0x415 {value: 0x0020, lo: 0x01}, {value: 0x454d, lo: 0x80, hi: 0xbf}, - // Block 0x7f, offset 0x40d + // Block 0x81, offset 0x417 {value: 0x0020, lo: 0x03}, {value: 0x4d4d, lo: 0x80, hi: 0x94}, {value: 0x4b0d, lo: 0x95, hi: 0x95}, {value: 0x4fed, lo: 0x96, hi: 0xbf}, - // Block 0x80, offset 0x411 + // Block 0x82, offset 0x41b {value: 0x0020, lo: 0x01}, {value: 0x552d, lo: 0x80, hi: 0xbf}, - // Block 0x81, offset 0x413 + // Block 0x83, offset 0x41d {value: 0x0020, lo: 0x03}, {value: 0x5d2d, lo: 0x80, hi: 0x84}, {value: 0x568d, lo: 0x85, hi: 0x85}, {value: 0x5dcd, lo: 0x86, hi: 0xbf}, - // Block 0x82, offset 0x417 + // Block 0x84, offset 0x421 {value: 0x0020, lo: 0x08}, {value: 0x6b8d, lo: 0x80, hi: 0x8f}, {value: 0x6d4d, lo: 0x90, hi: 0x90}, {value: 0x6d8d, lo: 0x91, hi: 0xab}, - {value: 0x6ef1, lo: 0xac, hi: 0xac}, + {value: 0x1401, lo: 0xac, hi: 0xac}, {value: 0x70ed, lo: 0xad, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x710d, lo: 0xb0, hi: 0xbf}, - // Block 0x83, offset 0x420 + // Block 0x85, offset 0x42a {value: 0x0020, lo: 0x05}, {value: 0x730d, lo: 0x80, hi: 0xad}, {value: 0x656d, lo: 0xae, hi: 0xae}, {value: 0x78cd, lo: 0xaf, hi: 0xb5}, {value: 0x6f8d, lo: 0xb6, hi: 0xb6}, {value: 0x79ad, lo: 0xb7, hi: 0xbf}, - // Block 0x84, offset 0x426 - {value: 0x0028, lo: 0x03}, - {value: 0x7c71, lo: 0x80, hi: 0x82}, - {value: 0x7c31, lo: 0x83, hi: 0x83}, - {value: 0x7ce9, lo: 0x84, hi: 0xbf}, - // Block 0x85, offset 0x42a - {value: 0x0038, lo: 0x0f}, - {value: 0x9e01, lo: 0x80, hi: 0x83}, - {value: 0x9ea9, lo: 0x84, hi: 0x85}, - {value: 0x9ee1, lo: 0x86, hi: 0x87}, - {value: 0x9f19, lo: 0x88, hi: 0x8f}, + // Block 0x86, offset 0x430 + {value: 0x0008, lo: 0x03}, + {value: 0x1751, lo: 0x80, hi: 0x82}, + {value: 0x1741, lo: 0x83, hi: 0x83}, + {value: 0x1769, lo: 0x84, hi: 0xbf}, + // Block 0x87, offset 0x434 + {value: 0x0008, lo: 0x0f}, + {value: 0x1d81, lo: 0x80, hi: 0x83}, + {value: 0x1d99, lo: 0x84, hi: 0x85}, + {value: 0x1da1, lo: 0x86, hi: 0x87}, + {value: 0x1da9, lo: 0x88, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x91}, - {value: 0xa0d9, lo: 0x92, hi: 0x97}, - {value: 0xa1f1, lo: 0x98, hi: 0x9c}, - {value: 0xa2d1, lo: 0x9d, hi: 0xb3}, - {value: 0x9d91, lo: 0xb4, hi: 0xb4}, - {value: 0x9e01, lo: 0xb5, hi: 0xb5}, - {value: 0xa7d9, lo: 0xb6, hi: 0xbb}, - {value: 0xa8b9, lo: 0xbc, hi: 0xbc}, - {value: 0xa849, lo: 0xbd, hi: 0xbd}, - {value: 0xa929, lo: 0xbe, hi: 0xbf}, - // Block 0x86, offset 0x43a + {value: 0x1de9, lo: 0x92, hi: 0x97}, + {value: 0x1e11, lo: 0x98, hi: 0x9c}, + {value: 0x1e31, lo: 0x9d, hi: 0xb3}, + {value: 0x1d71, lo: 0xb4, hi: 0xb4}, + {value: 0x1d81, lo: 0xb5, hi: 0xb5}, + {value: 0x1ee9, lo: 0xb6, hi: 0xbb}, + {value: 0x1f09, lo: 0xbc, hi: 0xbc}, + {value: 0x1ef9, lo: 0xbd, hi: 0xbd}, + {value: 0x1f19, lo: 0xbe, hi: 0xbf}, + // Block 0x88, offset 0x444 {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8c}, @@ -3624,24 +3779,24 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0x87, offset 0x444 + // Block 0x89, offset 0x44e {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x8d}, {value: 0x0040, lo: 0x8e, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0x88, offset 0x449 + // Block 0x8a, offset 0x453 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x89, offset 0x44c + // Block 0x8b, offset 0x456 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x86}, {value: 0x0018, lo: 0x87, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0x8a, offset 0x452 + // Block 0x8c, offset 0x45c {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x8e}, {value: 0x0040, lo: 0x8f, hi: 0x8f}, @@ -3649,31 +3804,31 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x8b, offset 0x459 + // Block 0x8d, offset 0x463 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbc}, {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x8c, offset 0x45e + // Block 0x8e, offset 0x468 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9c}, {value: 0x0040, lo: 0x9d, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x8d, offset 0x462 + // Block 0x8f, offset 0x46c {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x0040, lo: 0x91, hi: 0x9f}, {value: 0x3308, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x8e, offset 0x468 + // Block 0x90, offset 0x472 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xac}, {value: 0x0008, lo: 0xad, hi: 0xbf}, - // Block 0x8f, offset 0x46d + // Block 0x91, offset 0x477 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x81}, @@ -3683,20 +3838,20 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x90, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x90, offset 0x476 + // Block 0x92, offset 0x480 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9e}, {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x91, offset 0x47b + // Block 0x93, offset 0x485 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0x87}, {value: 0x0008, lo: 0x88, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0x92, offset 0x481 + // Block 0x94, offset 0x48b {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, @@ -3704,7 +3859,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x8b0d, lo: 0x98, hi: 0x9f}, {value: 0x8b25, lo: 0xa0, hi: 0xa7}, {value: 0x0008, lo: 0xa8, hi: 0xbf}, - // Block 0x93, offset 0x488 + // Block 0x95, offset 0x492 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, @@ -3712,7 +3867,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x8b25, lo: 0xb0, hi: 0xb7}, {value: 0x8b0d, lo: 0xb8, hi: 0xbf}, - // Block 0x94, offset 0x48f + // Block 0x96, offset 0x499 {value: 0x0000, lo: 0x06}, {value: 0xe145, lo: 0x80, hi: 0x87}, {value: 0xe1c5, lo: 0x88, hi: 0x8f}, @@ -3720,28 +3875,28 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x94, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0x95, offset 0x496 + // Block 0x97, offset 0x4a0 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x96, offset 0x49a + // Block 0x98, offset 0x4a4 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xae}, {value: 0x0018, lo: 0xaf, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x97, offset 0x49f + // Block 0x99, offset 0x4a9 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x98, offset 0x4a2 + // Block 0x9a, offset 0x4ac {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xbf}, - // Block 0x99, offset 0x4a7 + // Block 0x9b, offset 0x4b1 {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0x87}, @@ -3754,20 +3909,20 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xbc, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbe}, {value: 0x0808, lo: 0xbf, hi: 0xbf}, - // Block 0x9a, offset 0x4b3 + // Block 0x9c, offset 0x4bd {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x96}, {value: 0x0818, lo: 0x97, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb6}, {value: 0x0818, lo: 0xb7, hi: 0xbf}, - // Block 0x9b, offset 0x4b9 + // Block 0x9d, offset 0x4c3 {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xa6}, {value: 0x0818, lo: 0xa7, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0x9c, offset 0x4be + // Block 0x9e, offset 0x4c8 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb2}, @@ -3775,7 +3930,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xb4, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xba}, {value: 0x0818, lo: 0xbb, hi: 0xbf}, - // Block 0x9d, offset 0x4c5 + // Block 0x9f, offset 0x4cf {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0818, lo: 0x96, hi: 0x9b}, @@ -3784,18 +3939,18 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xa0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbe}, {value: 0x0818, lo: 0xbf, hi: 0xbf}, - // Block 0x9e, offset 0x4cd + // Block 0xa0, offset 0x4d7 {value: 0x0000, lo: 0x04}, {value: 0x0808, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbb}, {value: 0x0818, lo: 0xbc, hi: 0xbd}, {value: 0x0808, lo: 0xbe, hi: 0xbf}, - // Block 0x9f, offset 0x4d2 + // Block 0xa1, offset 0x4dc {value: 0x0000, lo: 0x03}, {value: 0x0818, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, {value: 0x0818, lo: 0x92, hi: 0xbf}, - // Block 0xa0, offset 0x4d6 + // Block 0xa2, offset 0x4e0 {value: 0x0000, lo: 0x0f}, {value: 0x0808, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x83}, @@ -3812,7 +3967,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xa1, offset 0x4e6 + // Block 0xa3, offset 0x4f0 {value: 0x0000, lo: 0x06}, {value: 0x0818, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, @@ -3820,17 +3975,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xbc}, {value: 0x0818, lo: 0xbd, hi: 0xbf}, - // Block 0xa2, offset 0x4ed + // Block 0xa4, offset 0x4f7 {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0x9c}, {value: 0x0818, lo: 0x9d, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xa3, offset 0x4f1 + // Block 0xa5, offset 0x4fb {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xb8}, {value: 0x0018, lo: 0xb9, hi: 0xbf}, - // Block 0xa4, offset 0x4f5 + // Block 0xa6, offset 0x4ff {value: 0x0000, lo: 0x06}, {value: 0x0808, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0x97}, @@ -3838,23 +3993,23 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0808, lo: 0xa0, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb7}, {value: 0x0818, lo: 0xb8, hi: 0xbf}, - // Block 0xa5, offset 0x4fc + // Block 0xa7, offset 0x506 {value: 0x0000, lo: 0x01}, {value: 0x0808, lo: 0x80, hi: 0xbf}, - // Block 0xa6, offset 0x4fe + // Block 0xa8, offset 0x508 {value: 0x0000, lo: 0x02}, {value: 0x0808, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xa7, offset 0x501 + // Block 0xa9, offset 0x50b {value: 0x0000, lo: 0x02}, {value: 0x03dd, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbf}, - // Block 0xa8, offset 0x504 + // Block 0xaa, offset 0x50e {value: 0x0000, lo: 0x03}, {value: 0x0808, lo: 0x80, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xb9}, {value: 0x0818, lo: 0xba, hi: 0xbf}, - // Block 0xa9, offset 0x508 + // Block 0xab, offset 0x512 {value: 0x0000, lo: 0x08}, {value: 0x0908, lo: 0x80, hi: 0x80}, {value: 0x0a08, lo: 0x81, hi: 0xa1}, @@ -3864,12 +4019,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0808, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xaa, offset 0x511 + // Block 0xac, offset 0x51b {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0818, lo: 0xa0, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xab, offset 0x515 + // Block 0xad, offset 0x51f {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaa}, @@ -3878,7 +4033,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0808, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xac, offset 0x51d + // Block 0xae, offset 0x527 {value: 0x0000, lo: 0x07}, {value: 0x0808, lo: 0x80, hi: 0x9c}, {value: 0x0818, lo: 0x9d, hi: 0xa6}, @@ -3887,7 +4042,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0a08, lo: 0xb0, hi: 0xb2}, {value: 0x0c08, lo: 0xb3, hi: 0xb3}, {value: 0x0a08, lo: 0xb4, hi: 0xbf}, - // Block 0xad, offset 0x525 + // Block 0xaf, offset 0x52f {value: 0x0000, lo: 0x07}, {value: 0x0a08, lo: 0x80, hi: 0x84}, {value: 0x0808, lo: 0x85, hi: 0x85}, @@ -3896,7 +4051,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0c18, lo: 0x94, hi: 0x94}, {value: 0x0818, lo: 0x95, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xae, offset 0x52d + // Block 0xb0, offset 0x537 {value: 0x0000, lo: 0x0b}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0a08, lo: 0xb0, hi: 0xb0}, @@ -3909,7 +4064,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0a08, lo: 0xbb, hi: 0xbc}, {value: 0x0c08, lo: 0xbd, hi: 0xbd}, {value: 0x0a08, lo: 0xbe, hi: 0xbf}, - // Block 0xaf, offset 0x539 + // Block 0xb1, offset 0x543 {value: 0x0000, lo: 0x0b}, {value: 0x0808, lo: 0x80, hi: 0x80}, {value: 0x0a08, lo: 0x81, hi: 0x81}, @@ -3922,14 +4077,14 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x8c, hi: 0x9f}, {value: 0x0808, lo: 0xa0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb0, offset 0x545 + // Block 0xb2, offset 0x54f {value: 0x0000, lo: 0x05}, {value: 0x3008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, - // Block 0xb1, offset 0x54b + // Block 0xb3, offset 0x555 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x85}, {value: 0x3b08, lo: 0x86, hi: 0x86}, @@ -3939,7 +4094,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa6, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xb2, offset 0x554 + // Block 0xb4, offset 0x55e {value: 0x0000, lo: 0x0b}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, @@ -3952,7 +4107,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xbb, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbd}, {value: 0x0018, lo: 0xbe, hi: 0xbf}, - // Block 0xb3, offset 0x560 + // Block 0xb5, offset 0x56a {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x0040, lo: 0x82, hi: 0x8f}, @@ -3960,7 +4115,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa9, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xb4, offset 0x567 + // Block 0xb6, offset 0x571 {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x82}, {value: 0x0008, lo: 0x83, hi: 0xa6}, @@ -3970,7 +4125,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3b08, lo: 0xb3, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xbf}, - // Block 0xb5, offset 0x570 + // Block 0xb7, offset 0x57a {value: 0x0000, lo: 0x0a}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x0008, lo: 0x84, hi: 0x84}, @@ -3982,7 +4137,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xb4, hi: 0xb5}, {value: 0x0008, lo: 0xb6, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xb6, offset 0x57b + // Block 0xb8, offset 0x585 {value: 0x0000, lo: 0x06}, {value: 0x3308, lo: 0x80, hi: 0x81}, {value: 0x3008, lo: 0x82, hi: 0x82}, @@ -3990,7 +4145,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb3, hi: 0xb5}, {value: 0x3308, lo: 0xb6, hi: 0xbe}, {value: 0x3008, lo: 0xbf, hi: 0xbf}, - // Block 0xb7, offset 0x582 + // Block 0xb9, offset 0x58c {value: 0x0000, lo: 0x0e}, {value: 0x3808, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x84}, @@ -4006,7 +4161,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x0018, lo: 0xa1, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xb8, offset 0x591 + // Block 0xba, offset 0x59b {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x92}, @@ -4020,7 +4175,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xb8, hi: 0xbd}, {value: 0x3308, lo: 0xbe, hi: 0xbe}, {value: 0x0040, lo: 0xbf, hi: 0xbf}, - // Block 0xb9, offset 0x59e + // Block 0xbb, offset 0x5a8 {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4034,7 +4189,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0xa9, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xba, offset 0x5ab + // Block 0xbc, offset 0x5b5 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x3308, lo: 0x9f, hi: 0x9f}, @@ -4044,12 +4199,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0xbb, offset 0x5b4 + // Block 0xbd, offset 0x5be {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x3008, lo: 0xb5, hi: 0xb7}, {value: 0x3308, lo: 0xb8, hi: 0xbf}, - // Block 0xbc, offset 0x5b8 + // Block 0xbe, offset 0x5c2 {value: 0x0000, lo: 0x0e}, {value: 0x3008, lo: 0x80, hi: 0x81}, {value: 0x3b08, lo: 0x82, hi: 0x82}, @@ -4065,7 +4220,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0x9e, hi: 0x9e}, {value: 0x0008, lo: 0x9f, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xbf}, - // Block 0xbd, offset 0x5c7 + // Block 0xbf, offset 0x5d1 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, @@ -4074,7 +4229,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x3008, lo: 0xbb, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0xbe, offset 0x5cf + // Block 0xc0, offset 0x5d9 {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x3008, lo: 0x81, hi: 0x81}, @@ -4086,7 +4241,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xbf, offset 0x5da + // Block 0xc1, offset 0x5e4 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x3008, lo: 0xaf, hi: 0xb1}, @@ -4096,14 +4251,14 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc0, offset 0x5e3 + // Block 0xc2, offset 0x5ed {value: 0x0000, lo: 0x05}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x97}, {value: 0x0008, lo: 0x98, hi: 0x9b}, {value: 0x3308, lo: 0x9c, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0xc1, offset 0x5e9 + // Block 0xc3, offset 0x5f3 {value: 0x0000, lo: 0x07}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb2}, @@ -4112,7 +4267,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbd, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xc2, offset 0x5f1 + // Block 0xc4, offset 0x5fb {value: 0x0000, lo: 0x08}, {value: 0x3308, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x83}, @@ -4122,7 +4277,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xbf}, - // Block 0xc3, offset 0x5fa + // Block 0xc5, offset 0x604 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x3308, lo: 0xab, hi: 0xab}, @@ -4134,11 +4289,11 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb7, hi: 0xb7}, {value: 0x0008, lo: 0xb8, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xc4, offset 0x605 + // Block 0xc6, offset 0x60f {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0xbf}, - // Block 0xc5, offset 0x608 + // Block 0xc7, offset 0x612 {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0x9c}, @@ -4151,7 +4306,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0xc6, offset 0x614 + // Block 0xc8, offset 0x61e {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0xab}, {value: 0x3008, lo: 0xac, hi: 0xae}, @@ -4161,17 +4316,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xba, hi: 0xba}, {value: 0x0018, lo: 0xbb, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0xc7, offset 0x61d + // Block 0xc9, offset 0x627 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x049d, lo: 0xa0, hi: 0xbf}, - // Block 0xc8, offset 0x620 + // Block 0xca, offset 0x62a {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xb2}, {value: 0x0040, lo: 0xb3, hi: 0xbe}, {value: 0x0008, lo: 0xbf, hi: 0xbf}, - // Block 0xc9, offset 0x625 + // Block 0xcb, offset 0x62f {value: 0x0000, lo: 0x08}, {value: 0x3008, lo: 0x80, hi: 0x80}, {value: 0x0008, lo: 0x81, hi: 0x81}, @@ -4181,13 +4336,13 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x87, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xca, offset 0x62e + // Block 0xcc, offset 0x638 {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xa9}, {value: 0x0008, lo: 0xaa, hi: 0xbf}, - // Block 0xcb, offset 0x633 + // Block 0xcd, offset 0x63d {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x90}, {value: 0x3008, lo: 0x91, hi: 0x93}, @@ -4201,7 +4356,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa3, hi: 0xa3}, {value: 0x3008, lo: 0xa4, hi: 0xa4}, {value: 0x0040, lo: 0xa5, hi: 0xbf}, - // Block 0xcc, offset 0x640 + // Block 0xce, offset 0x64a {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x3308, lo: 0x81, hi: 0x8a}, @@ -4213,7 +4368,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xba, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xcd, offset 0x64b + // Block 0xcf, offset 0x655 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x3b08, lo: 0x87, hi: 0x87}, @@ -4223,7 +4378,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0x97, hi: 0x98}, {value: 0x3308, lo: 0x99, hi: 0x9b}, {value: 0x0008, lo: 0x9c, hi: 0xbf}, - // Block 0xce, offset 0x654 + // Block 0xd0, offset 0x65e {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x3308, lo: 0x8a, hi: 0x96}, @@ -4234,11 +4389,11 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0x9d, hi: 0x9d}, {value: 0x0018, lo: 0x9e, hi: 0xa2}, {value: 0x0040, lo: 0xa3, hi: 0xbf}, - // Block 0xcf, offset 0x65e + // Block 0xd1, offset 0x668 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xd0, offset 0x661 + // Block 0xd2, offset 0x66b {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x89}, @@ -4249,7 +4404,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb8, hi: 0xbd}, {value: 0x3008, lo: 0xbe, hi: 0xbe}, {value: 0x3b08, lo: 0xbf, hi: 0xbf}, - // Block 0xd1, offset 0x66b + // Block 0xd3, offset 0x675 {value: 0x0000, lo: 0x08}, {value: 0x0008, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x85}, @@ -4259,7 +4414,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0008, lo: 0xb2, hi: 0xbf}, - // Block 0xd2, offset 0x674 + // Block 0xd4, offset 0x67e {value: 0x0000, lo: 0x0b}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x91}, @@ -4272,7 +4427,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb4, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0xd3, offset 0x680 + // Block 0xd5, offset 0x68a {value: 0x0000, lo: 0x0c}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4286,7 +4441,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xbc, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbe}, {value: 0x3308, lo: 0xbf, hi: 0xbf}, - // Block 0xd4, offset 0x68d + // Block 0xd6, offset 0x697 {value: 0x0000, lo: 0x0c}, {value: 0x3308, lo: 0x80, hi: 0x83}, {value: 0x3b08, lo: 0x84, hi: 0x85}, @@ -4300,7 +4455,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa7, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xa9}, {value: 0x0008, lo: 0xaa, hi: 0xbf}, - // Block 0xd5, offset 0x69a + // Block 0xd7, offset 0x6a4 {value: 0x0000, lo: 0x0d}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x3008, lo: 0x8a, hi: 0x8e}, @@ -4315,7 +4470,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa9}, {value: 0x0040, lo: 0xaa, hi: 0xbf}, - // Block 0xd6, offset 0x6a8 + // Block 0xd8, offset 0x6b2 {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xb2}, @@ -4323,41 +4478,41 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3008, lo: 0xb5, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xd7, offset 0x6af + // Block 0xd9, offset 0x6b9 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb0}, {value: 0x0040, lo: 0xb1, hi: 0xbf}, - // Block 0xd8, offset 0x6b3 + // Block 0xda, offset 0x6bd {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xd9, offset 0x6b7 + // Block 0xdb, offset 0x6c1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0xbf}, - // Block 0xda, offset 0x6ba + // Block 0xdc, offset 0x6c4 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0xdb, offset 0x6bf + // Block 0xdd, offset 0x6c9 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0040, lo: 0x84, hi: 0xbf}, - // Block 0xdc, offset 0x6c2 + // Block 0xde, offset 0x6cc {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xaf}, {value: 0x0340, lo: 0xb0, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xdd, offset 0x6c7 + // Block 0xdf, offset 0x6d1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0xbf}, - // Block 0xde, offset 0x6ca + // Block 0xe0, offset 0x6d4 {value: 0x0000, lo: 0x06}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0x9f}, @@ -4365,7 +4520,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xdf, offset 0x6d1 + // Block 0xe1, offset 0x6db {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0xad}, @@ -4373,12 +4528,12 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x3308, lo: 0xb0, hi: 0xb4}, {value: 0x0018, lo: 0xb5, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xe0, offset 0x6d8 + // Block 0xe2, offset 0x6e2 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xbf}, - // Block 0xe1, offset 0x6dc + // Block 0xe3, offset 0x6e6 {value: 0x0000, lo: 0x0a}, {value: 0x0008, lo: 0x80, hi: 0x83}, {value: 0x0018, lo: 0x84, hi: 0x85}, @@ -4390,33 +4545,33 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa3, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbc}, {value: 0x0008, lo: 0xbd, hi: 0xbf}, - // Block 0xe2, offset 0x6e7 + // Block 0xe4, offset 0x6f1 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xe3, offset 0x6ea + // Block 0xe5, offset 0x6f4 {value: 0x0000, lo: 0x02}, {value: 0xe105, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0xe4, offset 0x6ed + // Block 0xe6, offset 0x6f7 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0x9a}, {value: 0x0040, lo: 0x9b, hi: 0xbf}, - // Block 0xe5, offset 0x6f0 + // Block 0xe7, offset 0x6fa {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0x8e}, {value: 0x3308, lo: 0x8f, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x90}, {value: 0x3008, lo: 0x91, hi: 0xbf}, - // Block 0xe6, offset 0x6f6 + // Block 0xe8, offset 0x700 {value: 0x0000, lo: 0x05}, {value: 0x3008, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8e}, {value: 0x3308, lo: 0x8f, hi: 0x92}, {value: 0x0008, lo: 0x93, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0xe7, offset 0x6fc + // Block 0xe9, offset 0x706 {value: 0x0000, lo: 0x08}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xa1}, @@ -4426,23 +4581,23 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa5, hi: 0xaf}, {value: 0x3008, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0xe8, offset 0x705 + // Block 0xea, offset 0x70f {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb7}, {value: 0x0040, lo: 0xb8, hi: 0xbf}, - // Block 0xe9, offset 0x708 + // Block 0xeb, offset 0x712 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x95}, {value: 0x0040, lo: 0x96, hi: 0xbf}, - // Block 0xea, offset 0x70b + // Block 0xec, offset 0x715 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0xbf}, - // Block 0xeb, offset 0x70e + // Block 0xed, offset 0x718 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x9e}, {value: 0x0040, lo: 0x9f, hi: 0xbf}, - // Block 0xec, offset 0x711 + // Block 0xee, offset 0x71b {value: 0x0000, lo: 0x06}, {value: 0x0040, lo: 0x80, hi: 0x8f}, {value: 0x0008, lo: 0x90, hi: 0x92}, @@ -4450,17 +4605,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0008, lo: 0xa4, hi: 0xa7}, {value: 0x0040, lo: 0xa8, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0xed, offset 0x718 + // Block 0xef, offset 0x722 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xbb}, {value: 0x0040, lo: 0xbc, hi: 0xbf}, - // Block 0xee, offset 0x71b + // Block 0xf0, offset 0x725 {value: 0x0000, lo: 0x04}, {value: 0x0008, lo: 0x80, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0xef, offset 0x720 + // Block 0xf1, offset 0x72a {value: 0x0000, lo: 0x09}, {value: 0x0008, lo: 0x80, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, @@ -4471,32 +4626,32 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0x9f, hi: 0x9f}, {value: 0x03c0, lo: 0xa0, hi: 0xa3}, {value: 0x0040, lo: 0xa4, hi: 0xbf}, - // Block 0xf0, offset 0x72a + // Block 0xf2, offset 0x734 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0xf1, offset 0x72d + // Block 0xf3, offset 0x737 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xa6}, {value: 0x0040, lo: 0xa7, hi: 0xa8}, {value: 0x0018, lo: 0xa9, hi: 0xbf}, - // Block 0xf2, offset 0x731 + // Block 0xf4, offset 0x73b {value: 0x0000, lo: 0x0e}, {value: 0x0018, lo: 0x80, hi: 0x9d}, - {value: 0xb609, lo: 0x9e, hi: 0x9e}, - {value: 0xb651, lo: 0x9f, hi: 0x9f}, - {value: 0xb699, lo: 0xa0, hi: 0xa0}, - {value: 0xb701, lo: 0xa1, hi: 0xa1}, - {value: 0xb769, lo: 0xa2, hi: 0xa2}, - {value: 0xb7d1, lo: 0xa3, hi: 0xa3}, - {value: 0xb839, lo: 0xa4, hi: 0xa4}, + {value: 0x2211, lo: 0x9e, hi: 0x9e}, + {value: 0x2219, lo: 0x9f, hi: 0x9f}, + {value: 0x2221, lo: 0xa0, hi: 0xa0}, + {value: 0x2229, lo: 0xa1, hi: 0xa1}, + {value: 0x2231, lo: 0xa2, hi: 0xa2}, + {value: 0x2239, lo: 0xa3, hi: 0xa3}, + {value: 0x2241, lo: 0xa4, hi: 0xa4}, {value: 0x3018, lo: 0xa5, hi: 0xa6}, {value: 0x3318, lo: 0xa7, hi: 0xa9}, {value: 0x0018, lo: 0xaa, hi: 0xac}, {value: 0x3018, lo: 0xad, hi: 0xb2}, {value: 0x0340, lo: 0xb3, hi: 0xba}, {value: 0x3318, lo: 0xbb, hi: 0xbf}, - // Block 0xf3, offset 0x740 + // Block 0xf5, offset 0x74a {value: 0x0000, lo: 0x0b}, {value: 0x3318, lo: 0x80, hi: 0x82}, {value: 0x0018, lo: 0x83, hi: 0x84}, @@ -4504,45 +4659,45 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0018, lo: 0x8c, hi: 0xa9}, {value: 0x3318, lo: 0xaa, hi: 0xad}, {value: 0x0018, lo: 0xae, hi: 0xba}, - {value: 0xb8a1, lo: 0xbb, hi: 0xbb}, - {value: 0xb8e9, lo: 0xbc, hi: 0xbc}, - {value: 0xb931, lo: 0xbd, hi: 0xbd}, - {value: 0xb999, lo: 0xbe, hi: 0xbe}, - {value: 0xba01, lo: 0xbf, hi: 0xbf}, - // Block 0xf4, offset 0x74c + {value: 0x2249, lo: 0xbb, hi: 0xbb}, + {value: 0x2251, lo: 0xbc, hi: 0xbc}, + {value: 0x2259, lo: 0xbd, hi: 0xbd}, + {value: 0x2261, lo: 0xbe, hi: 0xbe}, + {value: 0x2269, lo: 0xbf, hi: 0xbf}, + // Block 0xf6, offset 0x756 {value: 0x0000, lo: 0x03}, - {value: 0xba69, lo: 0x80, hi: 0x80}, + {value: 0x2271, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0xa8}, {value: 0x0040, lo: 0xa9, hi: 0xbf}, - // Block 0xf5, offset 0x750 + // Block 0xf7, offset 0x75a {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x81}, {value: 0x3318, lo: 0x82, hi: 0x84}, {value: 0x0018, lo: 0x85, hi: 0x85}, {value: 0x0040, lo: 0x86, hi: 0xbf}, - // Block 0xf6, offset 0x755 + // Block 0xf8, offset 0x75f {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0xf7, offset 0x759 + // Block 0xf9, offset 0x763 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xbf}, - // Block 0xf8, offset 0x75e + // Block 0xfa, offset 0x768 {value: 0x0000, lo: 0x03}, {value: 0x3308, lo: 0x80, hi: 0xb6}, {value: 0x0018, lo: 0xb7, hi: 0xba}, {value: 0x3308, lo: 0xbb, hi: 0xbf}, - // Block 0xf9, offset 0x762 + // Block 0xfb, offset 0x76c {value: 0x0000, lo: 0x04}, {value: 0x3308, lo: 0x80, hi: 0xac}, {value: 0x0018, lo: 0xad, hi: 0xb4}, {value: 0x3308, lo: 0xb5, hi: 0xb5}, {value: 0x0018, lo: 0xb6, hi: 0xbf}, - // Block 0xfa, offset 0x767 + // Block 0xfc, offset 0x771 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x84}, @@ -4552,7 +4707,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa0, hi: 0xa0}, {value: 0x3308, lo: 0xa1, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, - // Block 0xfb, offset 0x770 + // Block 0xfd, offset 0x77a {value: 0x0000, lo: 0x0a}, {value: 0x3308, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x87}, @@ -4564,35 +4719,35 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa5, hi: 0xa5}, {value: 0x3308, lo: 0xa6, hi: 0xaa}, {value: 0x0040, lo: 0xab, hi: 0xbf}, - // Block 0xfc, offset 0x77b + // Block 0xfe, offset 0x785 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xac}, {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x3308, lo: 0xb0, hi: 0xb6}, {value: 0x0008, lo: 0xb7, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0xfd, offset 0x781 + // Block 0xff, offset 0x78b {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0x89}, {value: 0x0040, lo: 0x8a, hi: 0x8d}, {value: 0x0008, lo: 0x8e, hi: 0x8e}, {value: 0x0018, lo: 0x8f, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0xbf}, - // Block 0xfe, offset 0x787 + // Block 0x100, offset 0x791 {value: 0x0000, lo: 0x05}, {value: 0x0008, lo: 0x80, hi: 0xab}, {value: 0x3308, lo: 0xac, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbe}, {value: 0x0018, lo: 0xbf, hi: 0xbf}, - // Block 0xff, offset 0x78d + // Block 0x101, offset 0x797 {value: 0x0000, lo: 0x05}, {value: 0x0808, lo: 0x80, hi: 0x84}, {value: 0x0040, lo: 0x85, hi: 0x86}, {value: 0x0818, lo: 0x87, hi: 0x8f}, {value: 0x3308, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0x100, offset 0x793 + // Block 0x102, offset 0x79d {value: 0x0000, lo: 0x08}, {value: 0x0a08, lo: 0x80, hi: 0x83}, {value: 0x3308, lo: 0x84, hi: 0x8a}, @@ -4602,71 +4757,71 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0x9a, hi: 0x9d}, {value: 0x0818, lo: 0x9e, hi: 0x9f}, {value: 0x0040, lo: 0xa0, hi: 0xbf}, - // Block 0x101, offset 0x79c + // Block 0x103, offset 0x7a6 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xb0}, {value: 0x0818, lo: 0xb1, hi: 0xbf}, - // Block 0x102, offset 0x79f + // Block 0x104, offset 0x7a9 {value: 0x0000, lo: 0x02}, {value: 0x0818, lo: 0x80, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x103, offset 0x7a2 + // Block 0x105, offset 0x7ac {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0818, lo: 0x81, hi: 0xbd}, {value: 0x0040, lo: 0xbe, hi: 0xbf}, - // Block 0x104, offset 0x7a6 + // Block 0x106, offset 0x7b0 {value: 0x0000, lo: 0x03}, {value: 0x0040, lo: 0x80, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0x105, offset 0x7aa + // Block 0x107, offset 0x7b4 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbf}, - // Block 0x106, offset 0x7ae + // Block 0x108, offset 0x7b8 {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xae}, {value: 0x0040, lo: 0xaf, hi: 0xb0}, {value: 0x0018, lo: 0xb1, hi: 0xbf}, - // Block 0x107, offset 0x7b4 + // Block 0x109, offset 0x7be {value: 0x0000, lo: 0x05}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0018, lo: 0x81, hi: 0x8f}, {value: 0x0040, lo: 0x90, hi: 0x90}, {value: 0x0018, lo: 0x91, hi: 0xb5}, {value: 0x0040, lo: 0xb6, hi: 0xbf}, - // Block 0x108, offset 0x7ba + // Block 0x10a, offset 0x7c4 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x8f}, - {value: 0xc229, lo: 0x90, hi: 0x90}, + {value: 0x2491, lo: 0x90, hi: 0x90}, {value: 0x0018, lo: 0x91, hi: 0xad}, {value: 0x0040, lo: 0xae, hi: 0xbf}, - // Block 0x109, offset 0x7bf + // Block 0x10b, offset 0x7c9 {value: 0x0000, lo: 0x02}, {value: 0x0040, lo: 0x80, hi: 0xa5}, {value: 0x0018, lo: 0xa6, hi: 0xbf}, - // Block 0x10a, offset 0x7c2 + // Block 0x10c, offset 0x7cc {value: 0x0000, lo: 0x0f}, - {value: 0xc851, lo: 0x80, hi: 0x80}, - {value: 0xc8a1, lo: 0x81, hi: 0x81}, - {value: 0xc8f1, lo: 0x82, hi: 0x82}, - {value: 0xc941, lo: 0x83, hi: 0x83}, - {value: 0xc991, lo: 0x84, hi: 0x84}, - {value: 0xc9e1, lo: 0x85, hi: 0x85}, - {value: 0xca31, lo: 0x86, hi: 0x86}, - {value: 0xca81, lo: 0x87, hi: 0x87}, - {value: 0xcad1, lo: 0x88, hi: 0x88}, + {value: 0x2611, lo: 0x80, hi: 0x80}, + {value: 0x2619, lo: 0x81, hi: 0x81}, + {value: 0x2621, lo: 0x82, hi: 0x82}, + {value: 0x2629, lo: 0x83, hi: 0x83}, + {value: 0x2631, lo: 0x84, hi: 0x84}, + {value: 0x2639, lo: 0x85, hi: 0x85}, + {value: 0x2641, lo: 0x86, hi: 0x86}, + {value: 0x2649, lo: 0x87, hi: 0x87}, + {value: 0x2651, lo: 0x88, hi: 0x88}, {value: 0x0040, lo: 0x89, hi: 0x8f}, - {value: 0xcb21, lo: 0x90, hi: 0x90}, - {value: 0xcb41, lo: 0x91, hi: 0x91}, + {value: 0x2659, lo: 0x90, hi: 0x90}, + {value: 0x2661, lo: 0x91, hi: 0x91}, {value: 0x0040, lo: 0x92, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xa5}, {value: 0x0040, lo: 0xa6, hi: 0xbf}, - // Block 0x10b, offset 0x7d2 + // Block 0x10d, offset 0x7dc {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x97}, {value: 0x0040, lo: 0x98, hi: 0x9f}, @@ -4674,29 +4829,29 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xad, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xbc}, {value: 0x0040, lo: 0xbd, hi: 0xbf}, - // Block 0x10c, offset 0x7d9 + // Block 0x10e, offset 0x7e3 {value: 0x0000, lo: 0x02}, {value: 0x0018, lo: 0x80, hi: 0xb3}, {value: 0x0040, lo: 0xb4, hi: 0xbf}, - // Block 0x10d, offset 0x7dc + // Block 0x10f, offset 0x7e6 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x98}, {value: 0x0040, lo: 0x99, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xab}, {value: 0x0040, lo: 0xac, hi: 0xbf}, - // Block 0x10e, offset 0x7e1 + // Block 0x110, offset 0x7eb {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0xbf}, - // Block 0x10f, offset 0x7e5 + // Block 0x111, offset 0x7ef {value: 0x0000, lo: 0x05}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x99}, {value: 0x0040, lo: 0x9a, hi: 0x9f}, {value: 0x0018, lo: 0xa0, hi: 0xbf}, - // Block 0x110, offset 0x7eb + // Block 0x112, offset 0x7f5 {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x87}, {value: 0x0040, lo: 0x88, hi: 0x8f}, @@ -4704,17 +4859,17 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xae, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb1}, {value: 0x0040, lo: 0xb2, hi: 0xbf}, - // Block 0x111, offset 0x7f2 + // Block 0x113, offset 0x7fc {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0xb8}, {value: 0x0040, lo: 0xb9, hi: 0xb9}, {value: 0x0018, lo: 0xba, hi: 0xbf}, - // Block 0x112, offset 0x7f6 + // Block 0x114, offset 0x800 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x8b}, {value: 0x0040, lo: 0x8c, hi: 0x8c}, {value: 0x0018, lo: 0x8d, hi: 0xbf}, - // Block 0x113, offset 0x7fa + // Block 0x115, offset 0x804 {value: 0x0000, lo: 0x08}, {value: 0x0018, lo: 0x80, hi: 0x93}, {value: 0x0040, lo: 0x94, hi: 0x9f}, @@ -4724,7 +4879,7 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xb5, hi: 0xb7}, {value: 0x0018, lo: 0xb8, hi: 0xba}, {value: 0x0040, lo: 0xbb, hi: 0xbf}, - // Block 0x114, offset 0x803 + // Block 0x116, offset 0x80d {value: 0x0000, lo: 0x06}, {value: 0x0018, lo: 0x80, hi: 0x86}, {value: 0x0040, lo: 0x87, hi: 0x8f}, @@ -4732,109 +4887,74 @@ var idnaSparseValues = [2146]valueRange{ {value: 0x0040, lo: 0xa9, hi: 0xaf}, {value: 0x0018, lo: 0xb0, hi: 0xb6}, {value: 0x0040, lo: 0xb7, hi: 0xbf}, - // Block 0x115, offset 0x80a + // Block 0x117, offset 0x814 {value: 0x0000, lo: 0x04}, {value: 0x0018, lo: 0x80, hi: 0x82}, {value: 0x0040, lo: 0x83, hi: 0x8f}, {value: 0x0018, lo: 0x90, hi: 0x96}, {value: 0x0040, lo: 0x97, hi: 0xbf}, - // Block 0x116, offset 0x80f + // Block 0x118, offset 0x819 {value: 0x0000, lo: 0x03}, {value: 0x0018, lo: 0x80, hi: 0x92}, {value: 0x0040, lo: 0x93, hi: 0x93}, {value: 0x0018, lo: 0x94, hi: 0xbf}, - // Block 0x117, offset 0x813 + // Block 0x119, offset 0x81d {value: 0x0000, lo: 0x0d}, {value: 0x0018, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0xaf}, - {value: 0x1f41, lo: 0xb0, hi: 0xb0}, - {value: 0x00c9, lo: 0xb1, hi: 0xb1}, - {value: 0x0069, lo: 0xb2, hi: 0xb2}, - {value: 0x0079, lo: 0xb3, hi: 0xb3}, - {value: 0x1f51, lo: 0xb4, hi: 0xb4}, - {value: 0x1f61, lo: 0xb5, hi: 0xb5}, - {value: 0x1f71, lo: 0xb6, hi: 0xb6}, - {value: 0x1f81, lo: 0xb7, hi: 0xb7}, - {value: 0x1f91, lo: 0xb8, hi: 0xb8}, - {value: 0x1fa1, lo: 0xb9, hi: 0xb9}, + {value: 0x06e1, lo: 0xb0, hi: 0xb0}, + {value: 0x0049, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb2, hi: 0xb2}, + {value: 0x0031, lo: 0xb3, hi: 0xb3}, + {value: 0x06e9, lo: 0xb4, hi: 0xb4}, + {value: 0x06f1, lo: 0xb5, hi: 0xb5}, + {value: 0x06f9, lo: 0xb6, hi: 0xb6}, + {value: 0x0701, lo: 0xb7, hi: 0xb7}, + {value: 0x0709, lo: 0xb8, hi: 0xb8}, + {value: 0x0711, lo: 0xb9, hi: 0xb9}, {value: 0x0040, lo: 0xba, hi: 0xbf}, - // Block 0x118, offset 0x821 + // Block 0x11a, offset 0x82b {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0xbf}, - // Block 0x119, offset 0x824 + // Block 0x11b, offset 0x82e {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xb4}, {value: 0x0040, lo: 0xb5, hi: 0xbf}, - // Block 0x11a, offset 0x827 + // Block 0x11c, offset 0x831 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0x9d}, {value: 0x0040, lo: 0x9e, hi: 0x9f}, {value: 0x0008, lo: 0xa0, hi: 0xbf}, - // Block 0x11b, offset 0x82b + // Block 0x11d, offset 0x835 {value: 0x0000, lo: 0x03}, {value: 0x0008, lo: 0x80, hi: 0xa1}, {value: 0x0040, lo: 0xa2, hi: 0xaf}, {value: 0x0008, lo: 0xb0, hi: 0xbf}, - // Block 0x11c, offset 0x82f + // Block 0x11e, offset 0x839 {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0xa0}, {value: 0x0040, lo: 0xa1, hi: 0xbf}, - // Block 0x11d, offset 0x832 - {value: 0x0020, lo: 0x0f}, - {value: 0xdf21, lo: 0x80, hi: 0x89}, - {value: 0x8e35, lo: 0x8a, hi: 0x8a}, - {value: 0xe061, lo: 0x8b, hi: 0x9c}, - {value: 0x8e55, lo: 0x9d, hi: 0x9d}, - {value: 0xe2a1, lo: 0x9e, hi: 0xa2}, - {value: 0x8e75, lo: 0xa3, hi: 0xa3}, - {value: 0xe341, lo: 0xa4, hi: 0xab}, - {value: 0x7f0d, lo: 0xac, hi: 0xac}, - {value: 0xe441, lo: 0xad, hi: 0xaf}, - {value: 0x8e95, lo: 0xb0, hi: 0xb0}, - {value: 0xe4a1, lo: 0xb1, hi: 0xb6}, - {value: 0x8eb5, lo: 0xb7, hi: 0xb9}, - {value: 0xe561, lo: 0xba, hi: 0xba}, - {value: 0x8f15, lo: 0xbb, hi: 0xbb}, - {value: 0xe581, lo: 0xbc, hi: 0xbf}, - // Block 0x11e, offset 0x842 - {value: 0x0020, lo: 0x10}, - {value: 0x93b5, lo: 0x80, hi: 0x80}, - {value: 0xf101, lo: 0x81, hi: 0x86}, - {value: 0x93d5, lo: 0x87, hi: 0x8a}, - {value: 0xda61, lo: 0x8b, hi: 0x8b}, - {value: 0xf1c1, lo: 0x8c, hi: 0x96}, - {value: 0x9455, lo: 0x97, hi: 0x97}, - {value: 0xf321, lo: 0x98, hi: 0xa3}, - {value: 0x9475, lo: 0xa4, hi: 0xa6}, - {value: 0xf4a1, lo: 0xa7, hi: 0xaa}, - {value: 0x94d5, lo: 0xab, hi: 0xab}, - {value: 0xf521, lo: 0xac, hi: 0xac}, - {value: 0x94f5, lo: 0xad, hi: 0xad}, - {value: 0xf541, lo: 0xae, hi: 0xaf}, - {value: 0x9515, lo: 0xb0, hi: 0xb1}, - {value: 0xf581, lo: 0xb2, hi: 0xbe}, - {value: 0x2040, lo: 0xbf, hi: 0xbf}, - // Block 0x11f, offset 0x853 + // Block 0x11f, offset 0x83c {value: 0x0000, lo: 0x02}, {value: 0x0008, lo: 0x80, hi: 0x8a}, {value: 0x0040, lo: 0x8b, hi: 0xbf}, - // Block 0x120, offset 0x856 + // Block 0x120, offset 0x83f {value: 0x0000, lo: 0x04}, {value: 0x0040, lo: 0x80, hi: 0x80}, {value: 0x0340, lo: 0x81, hi: 0x81}, {value: 0x0040, lo: 0x82, hi: 0x9f}, {value: 0x0340, lo: 0xa0, hi: 0xbf}, - // Block 0x121, offset 0x85b + // Block 0x121, offset 0x844 {value: 0x0000, lo: 0x01}, {value: 0x0340, lo: 0x80, hi: 0xbf}, - // Block 0x122, offset 0x85d + // Block 0x122, offset 0x846 {value: 0x0000, lo: 0x01}, {value: 0x33c0, lo: 0x80, hi: 0xbf}, - // Block 0x123, offset 0x85f + // Block 0x123, offset 0x848 {value: 0x0000, lo: 0x02}, {value: 0x33c0, lo: 0x80, hi: 0xaf}, {value: 0x0040, lo: 0xb0, hi: 0xbf}, } -// Total table size 43370 bytes (42KiB); checksum: EBD909C0 +// Total table size 44953 bytes (43KiB); checksum: D51909DD diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go new file mode 100644 index 000000000..40033778f --- /dev/null +++ b/vendor/golang.org/x/net/idna/tables15.0.0.go @@ -0,0 +1,5145 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package idna + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +var mappings string = "" + // Size: 6704 bytes + " ̈a ̄23 ́ ̧1o1⁄41⁄23⁄4i̇l·ʼnsdžⱥⱦhjrwy ̆ ̇ ̊ ̨ ̃ ̋lẍ́ ι; ̈́եւاٴوٴۇٴيٴक" + + "़ख़ग़ज़ड़ढ़फ़य़ড়ঢ়য়ਲ਼ਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ଡ଼ଢ଼ําໍາຫນຫມགྷཌྷདྷབྷཛྷཀྵཱཱིུྲྀྲཱྀླྀླཱ" + + "ཱྀྀྒྷྜྷྡྷྦྷྫྷྐྵвдостъѣæbdeǝgikmnȣptuɐɑəɛɜŋɔɯvβγδφχρнɒcɕðfɟɡɥɨɩɪʝɭʟɱɰɲɳ" + + "ɴɵɸʂʃƫʉʊʋʌzʐʑʒθssάέήίόύώἀιἁιἂιἃιἄιἅιἆιἇιἠιἡιἢιἣιἤιἥιἦιἧιὠιὡιὢιὣιὤιὥιὦιὧ" + + "ιὰιαιάιᾶιι ̈͂ὴιηιήιῆι ̓̀ ̓́ ̓͂ΐ ̔̀ ̔́ ̔͂ΰ ̈̀`ὼιωιώιῶι′′′′′‵‵‵‵‵!!???!!?" + + "′′′′0456789+=()rsħnoqsmtmωåאבגדπ1⁄71⁄91⁄101⁄32⁄31⁄52⁄53⁄54⁄51⁄65⁄61⁄83" + + "⁄85⁄87⁄81⁄iiivviviiiixxi0⁄3∫∫∫∫∫∮∮∮∮∮1011121314151617181920(10)(11)(12" + + ")(13)(14)(15)(16)(17)(18)(19)(20)∫∫∫∫==⫝̸ɫɽȿɀ. ゙ ゚よりコト(ᄀ)(ᄂ)(ᄃ)(ᄅ)(ᄆ)(ᄇ)" + + "(ᄉ)(ᄋ)(ᄌ)(ᄎ)(ᄏ)(ᄐ)(ᄑ)(ᄒ)(가)(나)(다)(라)(마)(바)(사)(아)(자)(차)(카)(타)(파)(하)(주)(오전" + + ")(오후)(一)(二)(三)(四)(五)(六)(七)(八)(九)(十)(月)(火)(水)(木)(金)(土)(日)(株)(有)(社)(名)(特)(" + + "財)(祝)(労)(代)(呼)(学)(監)(企)(資)(協)(祭)(休)(自)(至)21222324252627282930313233343" + + "5참고주의3637383940414243444546474849501月2月3月4月5月6月7月8月9月10月11月12月hgev令和アパート" + + "アルファアンペアアールイニングインチウォンエスクードエーカーオンスオームカイリカラットカロリーガロンガンマギガギニーキュリーギルダーキロキロ" + + "グラムキロメートルキロワットグラムグラムトンクルゼイロクローネケースコルナコーポサイクルサンチームシリングセンチセントダースデシドルトンナノ" + + "ノットハイツパーセントパーツバーレルピアストルピクルピコビルファラッドフィートブッシェルフランヘクタールペソペニヒヘルツペンスページベータポ" + + "イントボルトホンポンドホールホーンマイクロマイルマッハマルクマンションミクロンミリミリバールメガメガトンメートルヤードヤールユアンリットルリ" + + "ラルピールーブルレムレントゲンワット0点1点2点3点4点5点6点7点8点9点10点11点12点13点14点15点16点17点18点19点20" + + "点21点22点23点24点daauovpcdmiu平成昭和大正明治株式会社panamakakbmbgbkcalpfnfmgkghzmldlk" + + "lfmnmmmcmkmm2m3m∕sm∕s2rad∕srad∕s2psnsmspvnvmvkvpwnwmwkwbqcccdc∕kgdbgyhah" + + "pinkkktlmlnlxphprsrsvwbv∕ma∕m1日2日3日4日5日6日7日8日9日10日11日12日13日14日15日16日17日1" + + "8日19日20日21日22日23日24日25日26日27日28日29日30日31日ьɦɬʞʇœʍ𤋮𢡊𢡄𣏕𥉉𥳐𧻓fffiflstմնմեմիվնմ" + + "խיִײַעהכלםרתשׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּטּיּךּכּלּמּנּסּףּפּצּקּרּשּתּו" + + "ֹבֿכֿפֿאלٱٻپڀٺٿٹڤڦڄڃچڇڍڌڎڈژڑکگڳڱںڻۀہھےۓڭۇۆۈۋۅۉېىئائەئوئۇئۆئۈئېئىیئجئحئم" + + "ئيبجبحبخبمبىبيتجتحتختمتىتيثجثمثىثيجحجمحجحمخجخحخمسجسحسخسمصحصمضجضحضخضمطحط" + + "مظمعجعمغجغمفجفحفخفمفىفيقحقمقىقيكاكجكحكخكلكمكىكيلجلحلخلملىليمجمحمخمممىمي" + + "نجنحنخنمنىنيهجهمهىهييجيحيخيميىييذٰرٰىٰ ٌّ ٍّ َّ ُّ ِّ ّٰئرئزئنبربزبنترت" + + "زتنثرثزثنمانرنزننيريزينئخئهبهتهصخلهنههٰيهثهسهشمشهـَّـُّـِّطىطيعىعيغىغيس" + + "ىسيشىشيحىحيجىجيخىخيصىصيضىضيشجشحشخشرسرصرضراًتجمتحجتحمتخمتمجتمحتمخجمححميح" + + "مىسحجسجحسجىسمحسمجسممصححصممشحمشجيشمخشممضحىضخمطمحطممطميعجمعممعمىغممغميغمى" + + "فخمقمحقمملحملحيلحىلججلخملمحمحجمحممحيمجحمجممخجمخممجخهمجهممنحمنحىنجمنجىنم" + + "ينمىيممبخيتجيتجىتخيتخىتميتمىجميجحىجمىسخىصحيشحيضحيلجيلمييحييجييميمميقمين" + + "حيعميكمينجحمخيلجمكممجحيحجيمجيفميبحيسخينجيصلےقلےاللهاكبرمحمدصلعمرسولعليه" + + "وسلمصلىصلى الله عليه وسلمجل جلالهریال,:!?_{}[]#&*-<>\\$%@ـًـَـُـِـّـْءآ" + + "أؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهويلآلألإلا\x22'/^|~¢£¬¦¥ːˑʙɓʣꭦʥʤɖɗᶑɘɞʩɤɢ" + + "ɠʛʜɧʄʪʫꞎɮʎøɶɷɺɾʀʨʦꭧʧʈⱱʏʡʢʘǀǁǂ𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅥𝅲𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯ıȷαεζηκ" + + "λμνξοστυψ∇∂ϝабгежзиклмпруфхцчшыэюꚉәіјөүӏґѕџҫꙑұٮڡٯ0,1,2,3,4,5,6,7,8,9,(a" + + ")(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)(y" + + ")(z)〔s〕wzhvsdppvwcmcmdmrdjほかココサ手字双デ二多解天交映無料前後再新初終生販声吹演投捕一三遊左中右指走打禁空合満有月申" + + "割営配〔本〕〔三〕〔二〕〔安〕〔点〕〔打〕〔盗〕〔勝〕〔敗〕得可丽丸乁你侮侻倂偺備僧像㒞免兔兤具㒹內冗冤仌冬况凵刃㓟刻剆剷㔕勇勉勤勺包匆北卉" + + "卑博即卽卿灰及叟叫叱吆咞吸呈周咢哶唐啓啣善喙喫喳嗂圖嘆圗噑噴切壮城埴堍型堲報墬売壷夆夢奢姬娛娧姘婦㛮嬈嬾寃寘寧寳寿将尢㞁屠屮峀岍嵃嵮嵫嵼巡巢" + + "㠯巽帨帽幩㡢㡼庰庳庶廊廾舁弢㣇形彫㣣徚忍志忹悁㤺㤜悔惇慈慌慎慺憎憲憤憯懞懲懶成戛扝抱拔捐挽拼捨掃揤搢揅掩㨮摩摾撝摷㩬敏敬旣書晉㬙暑㬈㫤冒冕最" + + "暜肭䏙朗望朡杞杓㭉柺枅桒梅梎栟椔㮝楂榣槪檨櫛㰘次歔㱎歲殟殺殻汎沿泍汧洖派海流浩浸涅洴港湮㴳滋滇淹潮濆瀹瀞瀛㶖灊災灷炭煅熜爨爵牐犀犕獺王㺬玥㺸" + + "瑇瑜瑱璅瓊㼛甤甾異瘐㿼䀈直眞真睊䀹瞋䁆䂖硎碌磌䃣祖福秫䄯穀穊穏䈂篆築䈧糒䊠糨糣紀絣䌁緇縂繅䌴䍙罺羕翺者聠聰䏕育脃䐋脾媵舄辞䑫芑芋芝劳花芳芽苦" + + "若茝荣莭茣莽菧著荓菊菌菜䔫蓱蓳蔖蕤䕝䕡䕫虐虜虧虩蚩蚈蜎蛢蝹蜨蝫螆蟡蠁䗹衠衣裗裞䘵裺㒻䚾䛇誠諭變豕貫賁贛起跋趼跰軔輸邔郱鄑鄛鈸鋗鋘鉼鏹鐕開䦕閷" + + "䧦雃嶲霣䩮䩶韠䪲頋頩飢䬳餩馧駂駾䯎鬒鱀鳽䳎䳭鵧䳸麻䵖黹黾鼅鼏鼖鼻" + +var mappingIndex = []uint16{ // 1729 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0001, 0x0004, 0x0005, 0x0008, 0x0009, 0x000a, + 0x000d, 0x0010, 0x0011, 0x0012, 0x0017, 0x001c, 0x0021, 0x0024, + 0x0027, 0x002a, 0x002b, 0x002e, 0x0031, 0x0034, 0x0035, 0x0036, + 0x0037, 0x0038, 0x0039, 0x003c, 0x003f, 0x0042, 0x0045, 0x0048, + 0x004b, 0x004c, 0x004d, 0x0051, 0x0054, 0x0055, 0x005a, 0x005e, + 0x0062, 0x0066, 0x006a, 0x006e, 0x0074, 0x007a, 0x0080, 0x0086, + 0x008c, 0x0092, 0x0098, 0x009e, 0x00a4, 0x00aa, 0x00b0, 0x00b6, + 0x00bc, 0x00c2, 0x00c8, 0x00ce, 0x00d4, 0x00da, 0x00e0, 0x00e6, + // Entry 40 - 7F + 0x00ec, 0x00f2, 0x00f8, 0x00fe, 0x0104, 0x010a, 0x0110, 0x0116, + 0x011c, 0x0122, 0x0128, 0x012e, 0x0137, 0x013d, 0x0146, 0x014c, + 0x0152, 0x0158, 0x015e, 0x0164, 0x016a, 0x0170, 0x0172, 0x0174, + 0x0176, 0x0178, 0x017a, 0x017c, 0x017e, 0x0180, 0x0181, 0x0182, + 0x0183, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018c, + 0x018d, 0x018e, 0x018f, 0x0191, 0x0193, 0x0195, 0x0197, 0x0199, + 0x019b, 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a6, 0x01a8, + 0x01aa, 0x01ac, 0x01ae, 0x01b0, 0x01b1, 0x01b3, 0x01b5, 0x01b6, + // Entry 80 - BF + 0x01b8, 0x01ba, 0x01bc, 0x01be, 0x01c0, 0x01c2, 0x01c4, 0x01c6, + 0x01c8, 0x01ca, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, 0x01d6, + 0x01d8, 0x01da, 0x01dc, 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e5, + 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f1, 0x01f3, 0x01f5, + 0x01f7, 0x01f9, 0x01fb, 0x01fd, 0x0202, 0x0207, 0x020c, 0x0211, + 0x0216, 0x021b, 0x0220, 0x0225, 0x022a, 0x022f, 0x0234, 0x0239, + 0x023e, 0x0243, 0x0248, 0x024d, 0x0252, 0x0257, 0x025c, 0x0261, + 0x0266, 0x026b, 0x0270, 0x0275, 0x027a, 0x027e, 0x0282, 0x0287, + // Entry C0 - FF + 0x0289, 0x028e, 0x0293, 0x0297, 0x029b, 0x02a0, 0x02a5, 0x02aa, + 0x02af, 0x02b1, 0x02b6, 0x02bb, 0x02c0, 0x02c2, 0x02c7, 0x02c8, + 0x02cd, 0x02d1, 0x02d5, 0x02da, 0x02e0, 0x02e9, 0x02ef, 0x02f8, + 0x02fa, 0x02fc, 0x02fe, 0x0300, 0x030c, 0x030d, 0x030e, 0x030f, + 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0319, 0x031b, 0x031d, 0x031e, 0x0320, 0x0322, 0x0324, 0x0326, + 0x0328, 0x032a, 0x032c, 0x032e, 0x0330, 0x0335, 0x033a, 0x0340, + 0x0345, 0x034a, 0x034f, 0x0354, 0x0359, 0x035e, 0x0363, 0x0368, + // Entry 100 - 13F + 0x036d, 0x0372, 0x0377, 0x037c, 0x0380, 0x0382, 0x0384, 0x0386, + 0x038a, 0x038c, 0x038e, 0x0393, 0x0399, 0x03a2, 0x03a8, 0x03b1, + 0x03b3, 0x03b5, 0x03b7, 0x03b9, 0x03bb, 0x03bd, 0x03bf, 0x03c1, + 0x03c3, 0x03c5, 0x03c7, 0x03cb, 0x03cf, 0x03d3, 0x03d7, 0x03db, + 0x03df, 0x03e3, 0x03e7, 0x03eb, 0x03ef, 0x03f3, 0x03ff, 0x0401, + 0x0406, 0x0408, 0x040a, 0x040c, 0x040e, 0x040f, 0x0413, 0x0417, + 0x041d, 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043c, 0x0441, + 0x0446, 0x044b, 0x0450, 0x0455, 0x045a, 0x045f, 0x0464, 0x0469, + // Entry 140 - 17F + 0x046e, 0x0473, 0x0478, 0x047d, 0x0482, 0x0487, 0x048c, 0x0491, + 0x0496, 0x049b, 0x04a0, 0x04a5, 0x04aa, 0x04af, 0x04b4, 0x04bc, + 0x04c4, 0x04c9, 0x04ce, 0x04d3, 0x04d8, 0x04dd, 0x04e2, 0x04e7, + 0x04ec, 0x04f1, 0x04f6, 0x04fb, 0x0500, 0x0505, 0x050a, 0x050f, + 0x0514, 0x0519, 0x051e, 0x0523, 0x0528, 0x052d, 0x0532, 0x0537, + 0x053c, 0x0541, 0x0546, 0x054b, 0x0550, 0x0555, 0x055a, 0x055f, + 0x0564, 0x0569, 0x056e, 0x0573, 0x0578, 0x057a, 0x057c, 0x057e, + 0x0580, 0x0582, 0x0584, 0x0586, 0x0588, 0x058a, 0x058c, 0x058e, + // Entry 180 - 1BF + 0x0590, 0x0592, 0x0594, 0x0596, 0x059c, 0x05a2, 0x05a4, 0x05a6, + 0x05a8, 0x05aa, 0x05ac, 0x05ae, 0x05b0, 0x05b2, 0x05b4, 0x05b6, + 0x05b8, 0x05ba, 0x05bc, 0x05be, 0x05c0, 0x05c4, 0x05c8, 0x05cc, + 0x05d0, 0x05d4, 0x05d8, 0x05dc, 0x05e0, 0x05e4, 0x05e9, 0x05ee, + 0x05f3, 0x05f5, 0x05f7, 0x05fd, 0x0609, 0x0615, 0x0621, 0x062a, + 0x0636, 0x063f, 0x0648, 0x0657, 0x0663, 0x066c, 0x0675, 0x067e, + 0x068a, 0x0696, 0x069f, 0x06a8, 0x06ae, 0x06b7, 0x06c3, 0x06cf, + 0x06d5, 0x06e4, 0x06f6, 0x0705, 0x070e, 0x071d, 0x072c, 0x0738, + // Entry 1C0 - 1FF + 0x0741, 0x074a, 0x0753, 0x075f, 0x076e, 0x077a, 0x0783, 0x078c, + 0x0795, 0x079b, 0x07a1, 0x07a7, 0x07ad, 0x07b6, 0x07bf, 0x07ce, + 0x07d7, 0x07e3, 0x07f2, 0x07fb, 0x0801, 0x0807, 0x0816, 0x0822, + 0x0831, 0x083a, 0x0849, 0x084f, 0x0858, 0x0861, 0x086a, 0x0873, + 0x087c, 0x0888, 0x0891, 0x0897, 0x08a0, 0x08a9, 0x08b2, 0x08be, + 0x08c7, 0x08d0, 0x08d9, 0x08e8, 0x08f4, 0x08fa, 0x0909, 0x090f, + 0x091b, 0x0927, 0x0930, 0x0939, 0x0942, 0x094e, 0x0954, 0x095d, + 0x0969, 0x096f, 0x097e, 0x0987, 0x098b, 0x098f, 0x0993, 0x0997, + // Entry 200 - 23F + 0x099b, 0x099f, 0x09a3, 0x09a7, 0x09ab, 0x09af, 0x09b4, 0x09b9, + 0x09be, 0x09c3, 0x09c8, 0x09cd, 0x09d2, 0x09d7, 0x09dc, 0x09e1, + 0x09e6, 0x09eb, 0x09f0, 0x09f5, 0x09fa, 0x09fc, 0x09fe, 0x0a00, + 0x0a02, 0x0a04, 0x0a06, 0x0a0c, 0x0a12, 0x0a18, 0x0a1e, 0x0a2a, + 0x0a2c, 0x0a2e, 0x0a30, 0x0a32, 0x0a34, 0x0a36, 0x0a38, 0x0a3c, + 0x0a3e, 0x0a40, 0x0a42, 0x0a44, 0x0a46, 0x0a48, 0x0a4a, 0x0a4c, + 0x0a4e, 0x0a50, 0x0a52, 0x0a54, 0x0a56, 0x0a58, 0x0a5a, 0x0a5f, + 0x0a65, 0x0a6c, 0x0a74, 0x0a76, 0x0a78, 0x0a7a, 0x0a7c, 0x0a7e, + // Entry 240 - 27F + 0x0a80, 0x0a82, 0x0a84, 0x0a86, 0x0a88, 0x0a8a, 0x0a8c, 0x0a8e, + 0x0a90, 0x0a96, 0x0a98, 0x0a9a, 0x0a9c, 0x0a9e, 0x0aa0, 0x0aa2, + 0x0aa4, 0x0aa6, 0x0aa8, 0x0aaa, 0x0aac, 0x0aae, 0x0ab0, 0x0ab2, + 0x0ab4, 0x0ab9, 0x0abe, 0x0ac2, 0x0ac6, 0x0aca, 0x0ace, 0x0ad2, + 0x0ad6, 0x0ada, 0x0ade, 0x0ae2, 0x0ae7, 0x0aec, 0x0af1, 0x0af6, + 0x0afb, 0x0b00, 0x0b05, 0x0b0a, 0x0b0f, 0x0b14, 0x0b19, 0x0b1e, + 0x0b23, 0x0b28, 0x0b2d, 0x0b32, 0x0b37, 0x0b3c, 0x0b41, 0x0b46, + 0x0b4b, 0x0b50, 0x0b52, 0x0b54, 0x0b56, 0x0b58, 0x0b5a, 0x0b5c, + // Entry 280 - 2BF + 0x0b5e, 0x0b62, 0x0b66, 0x0b6a, 0x0b6e, 0x0b72, 0x0b76, 0x0b7a, + 0x0b7c, 0x0b7e, 0x0b80, 0x0b82, 0x0b86, 0x0b8a, 0x0b8e, 0x0b92, + 0x0b96, 0x0b9a, 0x0b9e, 0x0ba0, 0x0ba2, 0x0ba4, 0x0ba6, 0x0ba8, + 0x0baa, 0x0bac, 0x0bb0, 0x0bb4, 0x0bba, 0x0bc0, 0x0bc4, 0x0bc8, + 0x0bcc, 0x0bd0, 0x0bd4, 0x0bd8, 0x0bdc, 0x0be0, 0x0be4, 0x0be8, + 0x0bec, 0x0bf0, 0x0bf4, 0x0bf8, 0x0bfc, 0x0c00, 0x0c04, 0x0c08, + 0x0c0c, 0x0c10, 0x0c14, 0x0c18, 0x0c1c, 0x0c20, 0x0c24, 0x0c28, + 0x0c2c, 0x0c30, 0x0c34, 0x0c36, 0x0c38, 0x0c3a, 0x0c3c, 0x0c3e, + // Entry 2C0 - 2FF + 0x0c40, 0x0c42, 0x0c44, 0x0c46, 0x0c48, 0x0c4a, 0x0c4c, 0x0c4e, + 0x0c50, 0x0c52, 0x0c54, 0x0c56, 0x0c58, 0x0c5a, 0x0c5c, 0x0c5e, + 0x0c60, 0x0c62, 0x0c64, 0x0c66, 0x0c68, 0x0c6a, 0x0c6c, 0x0c6e, + 0x0c70, 0x0c72, 0x0c74, 0x0c76, 0x0c78, 0x0c7a, 0x0c7c, 0x0c7e, + 0x0c80, 0x0c82, 0x0c86, 0x0c8a, 0x0c8e, 0x0c92, 0x0c96, 0x0c9a, + 0x0c9e, 0x0ca2, 0x0ca4, 0x0ca8, 0x0cac, 0x0cb0, 0x0cb4, 0x0cb8, + 0x0cbc, 0x0cc0, 0x0cc4, 0x0cc8, 0x0ccc, 0x0cd0, 0x0cd4, 0x0cd8, + 0x0cdc, 0x0ce0, 0x0ce4, 0x0ce8, 0x0cec, 0x0cf0, 0x0cf4, 0x0cf8, + // Entry 300 - 33F + 0x0cfc, 0x0d00, 0x0d04, 0x0d08, 0x0d0c, 0x0d10, 0x0d14, 0x0d18, + 0x0d1c, 0x0d20, 0x0d24, 0x0d28, 0x0d2c, 0x0d30, 0x0d34, 0x0d38, + 0x0d3c, 0x0d40, 0x0d44, 0x0d48, 0x0d4c, 0x0d50, 0x0d54, 0x0d58, + 0x0d5c, 0x0d60, 0x0d64, 0x0d68, 0x0d6c, 0x0d70, 0x0d74, 0x0d78, + 0x0d7c, 0x0d80, 0x0d84, 0x0d88, 0x0d8c, 0x0d90, 0x0d94, 0x0d98, + 0x0d9c, 0x0da0, 0x0da4, 0x0da8, 0x0dac, 0x0db0, 0x0db4, 0x0db8, + 0x0dbc, 0x0dc0, 0x0dc4, 0x0dc8, 0x0dcc, 0x0dd0, 0x0dd4, 0x0dd8, + 0x0ddc, 0x0de0, 0x0de4, 0x0de8, 0x0dec, 0x0df0, 0x0df4, 0x0df8, + // Entry 340 - 37F + 0x0dfc, 0x0e00, 0x0e04, 0x0e08, 0x0e0c, 0x0e10, 0x0e14, 0x0e18, + 0x0e1d, 0x0e22, 0x0e27, 0x0e2c, 0x0e31, 0x0e36, 0x0e3a, 0x0e3e, + 0x0e42, 0x0e46, 0x0e4a, 0x0e4e, 0x0e52, 0x0e56, 0x0e5a, 0x0e5e, + 0x0e62, 0x0e66, 0x0e6a, 0x0e6e, 0x0e72, 0x0e76, 0x0e7a, 0x0e7e, + 0x0e82, 0x0e86, 0x0e8a, 0x0e8e, 0x0e92, 0x0e96, 0x0e9a, 0x0e9e, + 0x0ea2, 0x0ea6, 0x0eaa, 0x0eae, 0x0eb2, 0x0eb6, 0x0ebc, 0x0ec2, + 0x0ec8, 0x0ecc, 0x0ed0, 0x0ed4, 0x0ed8, 0x0edc, 0x0ee0, 0x0ee4, + 0x0ee8, 0x0eec, 0x0ef0, 0x0ef4, 0x0ef8, 0x0efc, 0x0f00, 0x0f04, + // Entry 380 - 3BF + 0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, 0x0f20, 0x0f24, + 0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3e, 0x0f44, 0x0f4a, + 0x0f50, 0x0f56, 0x0f5c, 0x0f62, 0x0f68, 0x0f6e, 0x0f74, 0x0f7a, + 0x0f80, 0x0f86, 0x0f8c, 0x0f92, 0x0f98, 0x0f9e, 0x0fa4, 0x0faa, + 0x0fb0, 0x0fb6, 0x0fbc, 0x0fc2, 0x0fc8, 0x0fce, 0x0fd4, 0x0fda, + 0x0fe0, 0x0fe6, 0x0fec, 0x0ff2, 0x0ff8, 0x0ffe, 0x1004, 0x100a, + 0x1010, 0x1016, 0x101c, 0x1022, 0x1028, 0x102e, 0x1034, 0x103a, + 0x1040, 0x1046, 0x104c, 0x1052, 0x1058, 0x105e, 0x1064, 0x106a, + // Entry 3C0 - 3FF + 0x1070, 0x1076, 0x107c, 0x1082, 0x1088, 0x108e, 0x1094, 0x109a, + 0x10a0, 0x10a6, 0x10ac, 0x10b2, 0x10b8, 0x10be, 0x10c4, 0x10ca, + 0x10d0, 0x10d6, 0x10dc, 0x10e2, 0x10e8, 0x10ee, 0x10f4, 0x10fa, + 0x1100, 0x1106, 0x110c, 0x1112, 0x1118, 0x111e, 0x1124, 0x112a, + 0x1130, 0x1136, 0x113c, 0x1142, 0x1148, 0x114e, 0x1154, 0x115a, + 0x1160, 0x1166, 0x116c, 0x1172, 0x1178, 0x1180, 0x1188, 0x1190, + 0x1198, 0x11a0, 0x11a8, 0x11b0, 0x11b6, 0x11d7, 0x11e6, 0x11ee, + 0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, + // Entry 400 - 43F + 0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, + 0x11ff, 0x1200, 0x1201, 0x1205, 0x1209, 0x120d, 0x1211, 0x1215, + 0x1219, 0x121b, 0x121d, 0x121f, 0x1221, 0x1223, 0x1225, 0x1227, + 0x1229, 0x122b, 0x122d, 0x122f, 0x1231, 0x1233, 0x1235, 0x1237, + 0x1239, 0x123b, 0x123d, 0x123f, 0x1241, 0x1243, 0x1245, 0x1247, + 0x1249, 0x124b, 0x124d, 0x124f, 0x1251, 0x1253, 0x1255, 0x1257, + 0x1259, 0x125b, 0x125d, 0x125f, 0x1263, 0x1267, 0x126b, 0x126f, + 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1277, 0x1279, + // Entry 440 - 47F + 0x127b, 0x127d, 0x127f, 0x1281, 0x1283, 0x1285, 0x1287, 0x1289, + 0x128c, 0x128e, 0x1290, 0x1292, 0x1294, 0x1297, 0x1299, 0x129b, + 0x129d, 0x129f, 0x12a1, 0x12a3, 0x12a5, 0x12a7, 0x12a9, 0x12ab, + 0x12ad, 0x12af, 0x12b2, 0x12b4, 0x12b6, 0x12b8, 0x12ba, 0x12bc, + 0x12be, 0x12c0, 0x12c2, 0x12c4, 0x12c6, 0x12c9, 0x12cb, 0x12cd, + 0x12d0, 0x12d2, 0x12d4, 0x12d6, 0x12d8, 0x12da, 0x12dc, 0x12de, + 0x12e6, 0x12ee, 0x12fa, 0x1306, 0x1312, 0x131e, 0x132a, 0x1332, + 0x133a, 0x1346, 0x1352, 0x135e, 0x136a, 0x136c, 0x136e, 0x1370, + // Entry 480 - 4BF + 0x1372, 0x1374, 0x1376, 0x1378, 0x137a, 0x137c, 0x137e, 0x1380, + 0x1382, 0x1384, 0x1386, 0x1388, 0x138a, 0x138d, 0x1390, 0x1392, + 0x1394, 0x1396, 0x1398, 0x139a, 0x139c, 0x139e, 0x13a0, 0x13a2, + 0x13a4, 0x13a6, 0x13a8, 0x13aa, 0x13ac, 0x13ae, 0x13b0, 0x13b2, + 0x13b4, 0x13b6, 0x13b8, 0x13ba, 0x13bc, 0x13bf, 0x13c1, 0x13c3, + 0x13c5, 0x13c7, 0x13c9, 0x13cb, 0x13cd, 0x13cf, 0x13d1, 0x13d3, + 0x13d6, 0x13d8, 0x13da, 0x13dc, 0x13de, 0x13e0, 0x13e2, 0x13e4, + 0x13e6, 0x13e8, 0x13ea, 0x13ec, 0x13ee, 0x13f0, 0x13f2, 0x13f5, + // Entry 4C0 - 4FF + 0x13f8, 0x13fb, 0x13fe, 0x1401, 0x1404, 0x1407, 0x140a, 0x140d, + 0x1410, 0x1413, 0x1416, 0x1419, 0x141c, 0x141f, 0x1422, 0x1425, + 0x1428, 0x142b, 0x142e, 0x1431, 0x1434, 0x1437, 0x143a, 0x143d, + 0x1440, 0x1447, 0x1449, 0x144b, 0x144d, 0x1450, 0x1452, 0x1454, + 0x1456, 0x1458, 0x145a, 0x1460, 0x1466, 0x1469, 0x146c, 0x146f, + 0x1472, 0x1475, 0x1478, 0x147b, 0x147e, 0x1481, 0x1484, 0x1487, + 0x148a, 0x148d, 0x1490, 0x1493, 0x1496, 0x1499, 0x149c, 0x149f, + 0x14a2, 0x14a5, 0x14a8, 0x14ab, 0x14ae, 0x14b1, 0x14b4, 0x14b7, + // Entry 500 - 53F + 0x14ba, 0x14bd, 0x14c0, 0x14c3, 0x14c6, 0x14c9, 0x14cc, 0x14cf, + 0x14d2, 0x14d5, 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4, 0x14e7, + 0x14ea, 0x14ed, 0x14f6, 0x14ff, 0x1508, 0x1511, 0x151a, 0x1523, + 0x152c, 0x1535, 0x153e, 0x1541, 0x1544, 0x1547, 0x154a, 0x154d, + 0x1550, 0x1553, 0x1556, 0x1559, 0x155c, 0x155f, 0x1562, 0x1565, + 0x1568, 0x156b, 0x156e, 0x1571, 0x1574, 0x1577, 0x157a, 0x157d, + 0x1580, 0x1583, 0x1586, 0x1589, 0x158c, 0x158f, 0x1592, 0x1595, + 0x1598, 0x159b, 0x159e, 0x15a1, 0x15a4, 0x15a7, 0x15aa, 0x15ad, + // Entry 540 - 57F + 0x15b0, 0x15b3, 0x15b6, 0x15b9, 0x15bc, 0x15bf, 0x15c2, 0x15c5, + 0x15c8, 0x15cb, 0x15ce, 0x15d1, 0x15d4, 0x15d7, 0x15da, 0x15dd, + 0x15e0, 0x15e3, 0x15e6, 0x15e9, 0x15ec, 0x15ef, 0x15f2, 0x15f5, + 0x15f8, 0x15fb, 0x15fe, 0x1601, 0x1604, 0x1607, 0x160a, 0x160d, + 0x1610, 0x1613, 0x1616, 0x1619, 0x161c, 0x161f, 0x1622, 0x1625, + 0x1628, 0x162b, 0x162e, 0x1631, 0x1634, 0x1637, 0x163a, 0x163d, + 0x1640, 0x1643, 0x1646, 0x1649, 0x164c, 0x164f, 0x1652, 0x1655, + 0x1658, 0x165b, 0x165e, 0x1661, 0x1664, 0x1667, 0x166a, 0x166d, + // Entry 580 - 5BF + 0x1670, 0x1673, 0x1676, 0x1679, 0x167c, 0x167f, 0x1682, 0x1685, + 0x1688, 0x168b, 0x168e, 0x1691, 0x1694, 0x1697, 0x169a, 0x169d, + 0x16a0, 0x16a3, 0x16a6, 0x16a9, 0x16ac, 0x16af, 0x16b2, 0x16b5, + 0x16b8, 0x16bb, 0x16be, 0x16c1, 0x16c4, 0x16c7, 0x16ca, 0x16cd, + 0x16d0, 0x16d3, 0x16d6, 0x16d9, 0x16dc, 0x16df, 0x16e2, 0x16e5, + 0x16e8, 0x16eb, 0x16ee, 0x16f1, 0x16f4, 0x16f7, 0x16fa, 0x16fd, + 0x1700, 0x1703, 0x1706, 0x1709, 0x170c, 0x170f, 0x1712, 0x1715, + 0x1718, 0x171b, 0x171e, 0x1721, 0x1724, 0x1727, 0x172a, 0x172d, + // Entry 5C0 - 5FF + 0x1730, 0x1733, 0x1736, 0x1739, 0x173c, 0x173f, 0x1742, 0x1745, + 0x1748, 0x174b, 0x174e, 0x1751, 0x1754, 0x1757, 0x175a, 0x175d, + 0x1760, 0x1763, 0x1766, 0x1769, 0x176c, 0x176f, 0x1772, 0x1775, + 0x1778, 0x177b, 0x177e, 0x1781, 0x1784, 0x1787, 0x178a, 0x178d, + 0x1790, 0x1793, 0x1796, 0x1799, 0x179c, 0x179f, 0x17a2, 0x17a5, + 0x17a8, 0x17ab, 0x17ae, 0x17b1, 0x17b4, 0x17b7, 0x17ba, 0x17bd, + 0x17c0, 0x17c3, 0x17c6, 0x17c9, 0x17cc, 0x17cf, 0x17d2, 0x17d5, + 0x17d8, 0x17db, 0x17de, 0x17e1, 0x17e4, 0x17e7, 0x17ea, 0x17ed, + // Entry 600 - 63F + 0x17f0, 0x17f3, 0x17f6, 0x17f9, 0x17fc, 0x17ff, 0x1802, 0x1805, + 0x1808, 0x180b, 0x180e, 0x1811, 0x1814, 0x1817, 0x181a, 0x181d, + 0x1820, 0x1823, 0x1826, 0x1829, 0x182c, 0x182f, 0x1832, 0x1835, + 0x1838, 0x183b, 0x183e, 0x1841, 0x1844, 0x1847, 0x184a, 0x184d, + 0x1850, 0x1853, 0x1856, 0x1859, 0x185c, 0x185f, 0x1862, 0x1865, + 0x1868, 0x186b, 0x186e, 0x1871, 0x1874, 0x1877, 0x187a, 0x187d, + 0x1880, 0x1883, 0x1886, 0x1889, 0x188c, 0x188f, 0x1892, 0x1895, + 0x1898, 0x189b, 0x189e, 0x18a1, 0x18a4, 0x18a7, 0x18aa, 0x18ad, + // Entry 640 - 67F + 0x18b0, 0x18b3, 0x18b6, 0x18b9, 0x18bc, 0x18bf, 0x18c2, 0x18c5, + 0x18c8, 0x18cb, 0x18ce, 0x18d1, 0x18d4, 0x18d7, 0x18da, 0x18dd, + 0x18e0, 0x18e3, 0x18e6, 0x18e9, 0x18ec, 0x18ef, 0x18f2, 0x18f5, + 0x18f8, 0x18fb, 0x18fe, 0x1901, 0x1904, 0x1907, 0x190a, 0x190d, + 0x1910, 0x1913, 0x1916, 0x1919, 0x191c, 0x191f, 0x1922, 0x1925, + 0x1928, 0x192b, 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, + 0x1940, 0x1943, 0x1946, 0x1949, 0x194c, 0x194f, 0x1952, 0x1955, + 0x1958, 0x195b, 0x195e, 0x1961, 0x1964, 0x1967, 0x196a, 0x196d, + // Entry 680 - 6BF + 0x1970, 0x1973, 0x1976, 0x1979, 0x197c, 0x197f, 0x1982, 0x1985, + 0x1988, 0x198b, 0x198e, 0x1991, 0x1994, 0x1997, 0x199a, 0x199d, + 0x19a0, 0x19a3, 0x19a6, 0x19a9, 0x19ac, 0x19af, 0x19b2, 0x19b5, + 0x19b8, 0x19bb, 0x19be, 0x19c1, 0x19c4, 0x19c7, 0x19ca, 0x19cd, + 0x19d0, 0x19d3, 0x19d6, 0x19d9, 0x19dc, 0x19df, 0x19e2, 0x19e5, + 0x19e8, 0x19eb, 0x19ee, 0x19f1, 0x19f4, 0x19f7, 0x19fa, 0x19fd, + 0x1a00, 0x1a03, 0x1a06, 0x1a09, 0x1a0c, 0x1a0f, 0x1a12, 0x1a15, + 0x1a18, 0x1a1b, 0x1a1e, 0x1a21, 0x1a24, 0x1a27, 0x1a2a, 0x1a2d, + // Entry 6C0 - 6FF + 0x1a30, +} // Size: 3482 bytes + +var xorData string = "" + // Size: 4907 bytes + "\x02\x0c\x09\x02\xb0\xec\x02\xad\xd8\x02\xad\xd9\x02\x06\x07\x02\x0f\x12" + + "\x02\x0f\x1f\x02\x0f\x1d\x02\x01\x13\x02\x0f\x16\x02\x0f\x0b\x02\x0f3" + + "\x02\x0f7\x02\x0f?\x02\x0f/\x02\x0f*\x02\x0c&\x02\x0c*\x02\x0c;\x02\x0c9" + + "\x02\x0c%\x02\xab\xed\x02\xab\xe2\x02\xab\xe3\x02\xa9\xe0\x02\xa9\xe1" + + "\x02\xa9\xe6\x02\xa3\xcb\x02\xa3\xc8\x02\xa3\xc9\x02\x01#\x02\x01\x08" + + "\x02\x0e>\x02\x0e'\x02\x0f\x03\x02\x03\x0d\x02\x03\x09\x02\x03\x17\x02" + + "\x03\x0e\x02\x02\x03\x02\x011\x02\x01\x00\x02\x01\x10\x02\x03<\x02\x07" + + "\x0d\x02\x02\x0c\x02\x0c0\x02\x01\x03\x02\x01\x01\x02\x01 \x02\x01\x22" + + "\x02\x01)\x02\x01\x0a\x02\x01\x0c\x02\x02\x06\x02\x02\x02\x02\x03\x10" + + "\x03\x037 \x03\x0b+\x03\x021\x00\x02\x01\x04\x02\x01\x02\x02\x019\x02" + + "\x03\x1c\x02\x02$\x03\x80p$\x02\x03:\x02\x03\x0a\x03\xc1r.\x03\xc1r,\x03" + + "\xc1r\x02\x02\x02:\x02\x02>\x02\x02,\x02\x02\x10\x02\x02\x00\x03\xc1s<" + + "\x03\xc1s*\x03\xc2L$\x03\xc2L;\x02\x09)\x02\x0a\x19\x03\x83\xab\xe3\x03" + + "\x83\xab\xf2\x03 4\xe0\x03\x81\xab\xea\x03\x81\xab\xf3\x03 4\xef\x03\x96" + + "\xe1\xcd\x03\x84\xe5\xc3\x02\x0d\x11\x03\x8b\xec\xcb\x03\x94\xec\xcf\x03" + + "\x9a\xec\xc2\x03\x8b\xec\xdb\x03\x94\xec\xdf\x03\x9a\xec\xd2\x03\x01\x0c" + + "!\x03\x01\x0c#\x03ʠ\x9d\x03ʣ\x9c\x03ʢ\x9f\x03ʥ\x9e\x03ʤ\x91\x03ʧ\x90\x03" + + "ʦ\x93\x03ʩ\x92\x03ʨ\x95\x03\xca\xf3\xb5\x03\xca\xf0\xb4\x03\xca\xf1\xb7" + + "\x03\xca\xf6\xb6\x03\xca\xf7\x89\x03\xca\xf4\x88\x03\xca\xf5\x8b\x03\xca" + + "\xfa\x8a\x03\xca\xfb\x8d\x03\xca\xf8\x8c\x03\xca\xf9\x8f\x03\xca\xfe\x8e" + + "\x03\xca\xff\x81\x03\xca\xfc\x80\x03\xca\xfd\x83\x03\xca\xe2\x82\x03\xca" + + "\xe3\x85\x03\xca\xe0\x84\x03\xca\xe1\x87\x03\xca\xe6\x86\x03\xca\xe7\x99" + + "\x03\xca\xe4\x98\x03\xca\xe5\x9b\x03\xca\xea\x9a\x03\xca\xeb\x9d\x03\xca" + + "\xe8\x9c\x03ؓ\x89\x03ߔ\x8b\x02\x010\x03\x03\x04\x1e\x03\x04\x15\x12\x03" + + "\x0b\x05,\x03\x06\x04\x00\x03\x06\x04)\x03\x06\x044\x03\x06\x04<\x03\x06" + + "\x05\x1d\x03\x06\x06\x00\x03\x06\x06\x0a\x03\x06\x06'\x03\x06\x062\x03" + + "\x0786\x03\x079/\x03\x079 \x03\x07:\x0e\x03\x07:\x1b\x03\x07:%\x03\x07;/" + + "\x03\x07;%\x03\x074\x11\x03\x076\x09\x03\x077*\x03\x070\x01\x03\x070\x0f" + + "\x03\x070.\x03\x071\x16\x03\x071\x04\x03\x0710\x03\x072\x18\x03\x072-" + + "\x03\x073\x14\x03\x073>\x03\x07'\x09\x03\x07 \x00\x03\x07\x1f\x0b\x03" + + "\x07\x18#\x03\x07\x18(\x03\x07\x186\x03\x07\x18\x03\x03\x07\x19\x16\x03" + + "\x07\x116\x03\x07\x12'\x03\x07\x13\x10\x03\x07\x0c&\x03\x07\x0c\x08\x03" + + "\x07\x0c\x13\x03\x07\x0d\x02\x03\x07\x0d\x1c\x03\x07\x0b5\x03\x07\x0b" + + "\x0a\x03\x07\x0b\x01\x03\x07\x0b\x0f\x03\x07\x05\x00\x03\x07\x05\x09\x03" + + "\x07\x05\x0b\x03\x07\x07\x01\x03\x07\x07\x08\x03\x07\x00<\x03\x07\x00+" + + "\x03\x07\x01)\x03\x07\x01\x1b\x03\x07\x01\x08\x03\x07\x03?\x03\x0445\x03" + + "\x044\x08\x03\x0454\x03\x04)/\x03\x04)5\x03\x04+\x05\x03\x04+\x14\x03" + + "\x04+ \x03\x04+<\x03\x04*&\x03\x04*\x22\x03\x04&8\x03\x04!\x01\x03\x04!" + + "\x22\x03\x04\x11+\x03\x04\x10.\x03\x04\x104\x03\x04\x13=\x03\x04\x12\x04" + + "\x03\x04\x12\x0a\x03\x04\x0d\x1d\x03\x04\x0d\x07\x03\x04\x0d \x03\x05<>" + + "\x03\x055<\x03\x055!\x03\x055#\x03\x055&\x03\x054\x1d\x03\x054\x02\x03" + + "\x054\x07\x03\x0571\x03\x053\x1a\x03\x053\x16\x03\x05.<\x03\x05.\x07\x03" + + "\x05):\x03\x05)<\x03\x05)\x0c\x03\x05)\x15\x03\x05+-\x03\x05+5\x03\x05$" + + "\x1e\x03\x05$\x14\x03\x05'\x04\x03\x05'\x14\x03\x05&\x02\x03\x05\x226" + + "\x03\x05\x22\x0c\x03\x05\x22\x1c\x03\x05\x19\x0a\x03\x05\x1b\x09\x03\x05" + + "\x1b\x0c\x03\x05\x14\x07\x03\x05\x16?\x03\x05\x16\x0c\x03\x05\x0c\x05" + + "\x03\x05\x0e\x0f\x03\x05\x01\x0e\x03\x05\x00(\x03\x05\x030\x03\x05\x03" + + "\x06\x03\x0a==\x03\x0a=1\x03\x0a=,\x03\x0a=\x0c\x03\x0a??\x03\x0a<\x08" + + "\x03\x0a9!\x03\x0a9)\x03\x0a97\x03\x0a99\x03\x0a6\x0a\x03\x0a6\x1c\x03" + + "\x0a6\x17\x03\x0a7'\x03\x0a78\x03\x0a73\x03\x0a'\x01\x03\x0a'&\x03\x0a" + + "\x1f\x0e\x03\x0a\x1f\x03\x03\x0a\x1f3\x03\x0a\x1b/\x03\x0a\x18\x19\x03" + + "\x0a\x19\x01\x03\x0a\x16\x14\x03\x0a\x0e\x22\x03\x0a\x0f\x10\x03\x0a\x0f" + + "\x02\x03\x0a\x0f \x03\x0a\x0c\x04\x03\x0a\x0b>\x03\x0a\x0b+\x03\x0a\x08/" + + "\x03\x0a\x046\x03\x0a\x05\x14\x03\x0a\x00\x04\x03\x0a\x00\x10\x03\x0a" + + "\x00\x14\x03\x0b<3\x03\x0b;*\x03\x0b9\x22\x03\x0b9)\x03\x0b97\x03\x0b+" + + "\x10\x03\x0b((\x03\x0b&5\x03\x0b$\x1c\x03\x0b$\x12\x03\x0b%\x04\x03\x0b#" + + "<\x03\x0b#0\x03\x0b#\x0d\x03\x0b#\x19\x03\x0b!:\x03\x0b!\x1f\x03\x0b!" + + "\x00\x03\x0b\x1e5\x03\x0b\x1c\x1d\x03\x0b\x1d-\x03\x0b\x1d(\x03\x0b\x18." + + "\x03\x0b\x18 \x03\x0b\x18\x16\x03\x0b\x14\x13\x03\x0b\x15$\x03\x0b\x15" + + "\x22\x03\x0b\x12\x1b\x03\x0b\x12\x10\x03\x0b\x132\x03\x0b\x13=\x03\x0b" + + "\x12\x18\x03\x0b\x0c&\x03\x0b\x061\x03\x0b\x06:\x03\x0b\x05#\x03\x0b\x05" + + "<\x03\x0b\x04\x0b\x03\x0b\x04\x04\x03\x0b\x04\x1b\x03\x0b\x042\x03\x0b" + + "\x041\x03\x0b\x03\x03\x03\x0b\x03\x1d\x03\x0b\x03/\x03\x0b\x03+\x03\x0b" + + "\x02\x1b\x03\x0b\x02\x00\x03\x0b\x01\x1e\x03\x0b\x01\x08\x03\x0b\x015" + + "\x03\x06\x0d9\x03\x06\x0d=\x03\x06\x0d?\x03\x02\x001\x03\x02\x003\x03" + + "\x02\x02\x19\x03\x02\x006\x03\x02\x02\x1b\x03\x02\x004\x03\x02\x00<\x03" + + "\x02\x02\x0a\x03\x02\x02\x0e\x03\x02\x01\x1a\x03\x02\x01\x07\x03\x02\x01" + + "\x05\x03\x02\x01\x0b\x03\x02\x01%\x03\x02\x01\x0c\x03\x02\x01\x04\x03" + + "\x02\x01\x1c\x03\x02\x00.\x03\x02\x002\x03\x02\x00>\x03\x02\x00\x12\x03" + + "\x02\x00\x16\x03\x02\x011\x03\x02\x013\x03\x02\x02 \x03\x02\x02%\x03\x02" + + "\x02$\x03\x02\x028\x03\x02\x02;\x03\x02\x024\x03\x02\x012\x03\x02\x022" + + "\x03\x02\x02/\x03\x02\x01,\x03\x02\x01\x13\x03\x02\x01\x16\x03\x02\x01" + + "\x11\x03\x02\x01\x1e\x03\x02\x01\x15\x03\x02\x01\x17\x03\x02\x01\x0f\x03" + + "\x02\x01\x08\x03\x02\x00?\x03\x02\x03\x07\x03\x02\x03\x0d\x03\x02\x03" + + "\x13\x03\x02\x03\x1d\x03\x02\x03\x1f\x03\x02\x00\x03\x03\x02\x00\x0d\x03" + + "\x02\x00\x01\x03\x02\x00\x1b\x03\x02\x00\x19\x03\x02\x00\x18\x03\x02\x00" + + "\x13\x03\x02\x00/\x03\x07>\x12\x03\x07<\x1f\x03\x07>\x1d\x03\x06\x1d\x0e" + + "\x03\x07>\x1c\x03\x07>:\x03\x07>\x13\x03\x04\x12+\x03\x07?\x03\x03\x07>" + + "\x02\x03\x06\x224\x03\x06\x1a.\x03\x07<%\x03\x06\x1c\x0b\x03\x0609\x03" + + "\x05\x1f\x01\x03\x04'\x08\x03\x93\xfd\xf5\x03\x02\x0d \x03\x02\x0d#\x03" + + "\x02\x0d!\x03\x02\x0d&\x03\x02\x0d\x22\x03\x02\x0d/\x03\x02\x0d,\x03\x02" + + "\x0d$\x03\x02\x0d'\x03\x02\x0d%\x03\x02\x0d;\x03\x02\x0d=\x03\x02\x0d?" + + "\x03\x099.\x03\x08\x0b7\x03\x08\x02\x14\x03\x08\x14\x0d\x03\x08.:\x03" + + "\x089'\x03\x0f\x0b\x18\x03\x0f\x1c1\x03\x0f\x17&\x03\x0f9\x1f\x03\x0f0" + + "\x0c\x03\x0e\x0a9\x03\x0e\x056\x03\x0e\x1c#\x03\x0f\x13\x0e\x03\x072\x00" + + "\x03\x070\x0d\x03\x072\x0b\x03\x06\x11\x18\x03\x070\x10\x03\x06\x0f(\x03" + + "\x072\x05\x03\x06\x0f,\x03\x073\x15\x03\x06\x07\x08\x03\x05\x16\x02\x03" + + "\x04\x0b \x03\x05:8\x03\x05\x16%\x03\x0a\x0d\x1f\x03\x06\x16\x10\x03\x05" + + "\x1d5\x03\x05*;\x03\x05\x16\x1b\x03\x04.-\x03\x06\x1a\x19\x03\x04\x03," + + "\x03\x0b87\x03\x04/\x0a\x03\x06\x00,\x03\x04-\x01\x03\x04\x1e-\x03\x06/(" + + "\x03\x0a\x0b5\x03\x06\x0e7\x03\x06\x07.\x03\x0597\x03\x0a*%\x03\x0760" + + "\x03\x06\x0c;\x03\x05'\x00\x03\x072.\x03\x072\x08\x03\x06=\x01\x03\x06" + + "\x05\x1b\x03\x06\x06\x12\x03\x06$=\x03\x06'\x0d\x03\x04\x11\x0f\x03\x076" + + ",\x03\x06\x07;\x03\x06.,\x03\x86\xf9\xea\x03\x8f\xff\xeb\x02\x092\x02" + + "\x095\x02\x094\x02\x09;\x02\x09>\x02\x098\x02\x09*\x02\x09/\x02\x09,\x02" + + "\x09%\x02\x09&\x02\x09#\x02\x09 \x02\x08!\x02\x08%\x02\x08$\x02\x08+\x02" + + "\x08.\x02\x08*\x02\x08&\x02\x088\x02\x08>\x02\x084\x02\x086\x02\x080\x02" + + "\x08\x10\x02\x08\x17\x02\x08\x12\x02\x08\x1d\x02\x08\x1f\x02\x08\x13\x02" + + "\x08\x15\x02\x08\x14\x02\x08\x0c\x03\x8b\xfd\xd0\x03\x81\xec\xc6\x03\x87" + + "\xe0\x8a\x03-2\xe3\x03\x80\xef\xe4\x03-2\xea\x03\x88\xe6\xeb\x03\x8e\xe6" + + "\xe8\x03\x84\xe6\xe9\x03\x97\xe6\xee\x03-2\xf9\x03-2\xf6\x03\x8e\xe3\xad" + + "\x03\x80\xe3\x92\x03\x88\xe3\x90\x03\x8e\xe3\x90\x03\x80\xe3\x97\x03\x88" + + "\xe3\x95\x03\x88\xfe\xcb\x03\x8e\xfe\xca\x03\x84\xfe\xcd\x03\x91\xef\xc9" + + "\x03-2\xc1\x03-2\xc0\x03-2\xcb\x03\x88@\x09\x03\x8e@\x08\x03\x8f\xe0\xf5" + + "\x03\x8e\xe6\xf9\x03\x8e\xe0\xfa\x03\x93\xff\xf4\x03\x84\xee\xd3\x03\x0b" + + "(\x04\x023 \x03\x0b)\x08\x021;\x02\x01*\x03\x0b#\x10\x03\x0b 0\x03\x0b!" + + "\x10\x03\x0b!0\x03\x07\x15\x08\x03\x09?5\x03\x07\x1f\x08\x03\x07\x17\x0b" + + "\x03\x09\x1f\x15\x03\x0b\x1c7\x03\x0a+#\x03\x06\x1a\x1b\x03\x06\x1a\x14" + + "\x03\x0a\x01\x18\x03\x06#\x1b\x03\x0a2\x0c\x03\x0a\x01\x04\x03\x09#;\x03" + + "\x08='\x03\x08\x1a\x0a\x03\x07\x03\x0a\x111\x03\x09\x1b\x09\x03\x073.\x03\x07" + + "\x01\x00\x03\x09/,\x03\x07#>\x03\x07\x048\x03\x0a\x1f\x22\x03\x098>\x03" + + "\x09\x11\x00\x03\x08/\x17\x03\x06'\x22\x03\x0b\x1a+\x03\x0a\x22\x19\x03" + + "\x0a/1\x03\x0974\x03\x09\x0f\x22\x03\x08,\x22\x03\x08?\x14\x03\x07$5\x03" + + "\x07<3\x03\x07=*\x03\x07\x13\x18\x03\x068\x0a\x03\x06\x09\x16\x03\x06" + + "\x13\x00\x03\x08\x067\x03\x08\x01\x03\x03\x08\x12\x1d\x03\x07+7\x03\x06(" + + ";\x03\x06\x1c?\x03\x07\x0e\x17\x03\x0a\x06\x1d\x03\x0a\x19\x07\x03\x08" + + "\x14$\x03\x07$;\x03\x08,$\x03\x08\x06\x0d\x03\x07\x16\x0a\x03\x06>>\x03" + + "\x0a\x06\x12\x03\x0a\x14)\x03\x09\x0d\x1f\x03\x09\x12\x17\x03\x09\x19" + + "\x01\x03\x08\x11 \x03\x08\x1d'\x03\x06<\x1a\x03\x0a.\x00\x03\x07'\x18" + + "\x03\x0a\x22\x08\x03\x08\x0d\x0a\x03\x08\x13)\x03\x07*)\x03\x06<,\x03" + + "\x07\x0b\x1a\x03\x09.\x14\x03\x09\x0d\x1e\x03\x07\x0e#\x03\x0b\x1d'\x03" + + "\x0a\x0a8\x03\x09%2\x03\x08+&\x03\x080\x12\x03\x0a)4\x03\x08\x06\x1f\x03" + + "\x0b\x1b\x1a\x03\x0a\x1b\x0f\x03\x0b\x1d*\x03\x09\x16$\x03\x090\x11\x03" + + "\x08\x11\x08\x03\x0a*(\x03\x0a\x042\x03\x089,\x03\x074'\x03\x07\x0f\x05" + + "\x03\x09\x0b\x0a\x03\x07\x1b\x01\x03\x09\x17:\x03\x09.\x0d\x03\x07.\x11" + + "\x03\x09+\x15\x03\x080\x13\x03\x0b\x1f\x19\x03\x0a \x11\x03\x0a\x220\x03" + + "\x09\x07;\x03\x08\x16\x1c\x03\x07,\x13\x03\x07\x0e/\x03\x06\x221\x03\x0a" + + ".\x0a\x03\x0a7\x02\x03\x0a\x032\x03\x0a\x1d.\x03\x091\x06\x03\x09\x19:" + + "\x03\x08\x02/\x03\x060+\x03\x06\x0f-\x03\x06\x1c\x1f\x03\x06\x1d\x07\x03" + + "\x0a,\x11\x03\x09=\x0d\x03\x09\x0b;\x03\x07\x1b/\x03\x0a\x1f:\x03\x09 " + + "\x1f\x03\x09.\x10\x03\x094\x0b\x03\x09\x1a1\x03\x08#\x1a\x03\x084\x1d" + + "\x03\x08\x01\x1f\x03\x08\x11\x22\x03\x07'8\x03\x07\x1a>\x03\x0757\x03" + + "\x06&9\x03\x06+\x11\x03\x0a.\x0b\x03\x0a,>\x03\x0a4#\x03\x08%\x17\x03" + + "\x07\x05\x22\x03\x07\x0c\x0b\x03\x0a\x1d+\x03\x0a\x19\x16\x03\x09+\x1f" + + "\x03\x09\x08\x0b\x03\x08\x16\x18\x03\x08+\x12\x03\x0b\x1d\x0c\x03\x0a=" + + "\x10\x03\x0a\x09\x0d\x03\x0a\x10\x11\x03\x09&0\x03\x08(\x1f\x03\x087\x07" + + "\x03\x08\x185\x03\x07'6\x03\x06.\x05\x03\x06=\x04\x03\x06;;\x03\x06\x06," + + "\x03\x0b\x18>\x03\x08\x00\x18\x03\x06 \x03\x03\x06<\x00\x03\x09%\x18\x03" + + "\x0b\x1c<\x03\x0a%!\x03\x0a\x09\x12\x03\x0a\x16\x02\x03\x090'\x03\x09" + + "\x0e=\x03\x08 \x0e\x03\x08>\x03\x03\x074>\x03\x06&?\x03\x06\x19\x09\x03" + + "\x06?(\x03\x0a-\x0e\x03\x09:3\x03\x098:\x03\x09\x12\x0b\x03\x09\x1d\x17" + + "\x03\x087\x05\x03\x082\x14\x03\x08\x06%\x03\x08\x13\x1f\x03\x06\x06\x0e" + + "\x03\x0a\x22<\x03\x09/<\x03\x06>+\x03\x0a'?\x03\x0a\x13\x0c\x03\x09\x10<" + + "\x03\x07\x1b=\x03\x0a\x19\x13\x03\x09\x22\x1d\x03\x09\x07\x0d\x03\x08)" + + "\x1c\x03\x06=\x1a\x03\x0a/4\x03\x0a7\x11\x03\x0a\x16:\x03\x09?3\x03\x09:" + + "/\x03\x09\x05\x0a\x03\x09\x14\x06\x03\x087\x22\x03\x080\x07\x03\x08\x1a" + + "\x1f\x03\x07\x04(\x03\x07\x04\x09\x03\x06 %\x03\x06<\x08\x03\x0a+\x14" + + "\x03\x09\x1d\x16\x03\x0a70\x03\x08 >\x03\x0857\x03\x070\x0a\x03\x06=\x12" + + "\x03\x06\x16%\x03\x06\x1d,\x03\x099#\x03\x09\x10>\x03\x07 \x1e\x03\x08" + + "\x0c<\x03\x08\x0b\x18\x03\x08\x15+\x03\x08,:\x03\x08%\x22\x03\x07\x0a$" + + "\x03\x0b\x1c=\x03\x07+\x08\x03\x0a/\x05\x03\x0a \x07\x03\x0a\x12'\x03" + + "\x09#\x11\x03\x08\x1b\x15\x03\x0a\x06\x01\x03\x09\x1c\x1b\x03\x0922\x03" + + "\x07\x14<\x03\x07\x09\x04\x03\x061\x04\x03\x07\x0e\x01\x03\x0a\x13\x18" + + "\x03\x0a-\x0c\x03\x0a?\x0d\x03\x0a\x09\x0a\x03\x091&\x03\x0a/\x0b\x03" + + "\x08$<\x03\x083\x1d\x03\x08\x0c$\x03\x08\x0d\x07\x03\x08\x0d?\x03\x08" + + "\x0e\x14\x03\x065\x0a\x03\x08\x1a#\x03\x08\x16#\x03\x0702\x03\x07\x03" + + "\x1a\x03\x06(\x1d\x03\x06+\x1b\x03\x06\x0b\x05\x03\x06\x0b\x17\x03\x06" + + "\x0c\x04\x03\x06\x1e\x19\x03\x06+0\x03\x062\x18\x03\x0b\x16\x1e\x03\x0a+" + + "\x16\x03\x0a-?\x03\x0a#:\x03\x0a#\x10\x03\x0a%$\x03\x0a>+\x03\x0a01\x03" + + "\x0a1\x10\x03\x0a\x099\x03\x0a\x0a\x12\x03\x0a\x19\x1f\x03\x0a\x19\x12" + + "\x03\x09*)\x03\x09-\x16\x03\x09.1\x03\x09.2\x03\x09<\x0e\x03\x09> \x03" + + "\x093\x12\x03\x09\x0b\x01\x03\x09\x1c2\x03\x09\x11\x1c\x03\x09\x15%\x03" + + "\x08,&\x03\x08!\x22\x03\x089(\x03\x08\x0b\x1a\x03\x08\x0d2\x03\x08\x0c" + + "\x04\x03\x08\x0c\x06\x03\x08\x0c\x1f\x03\x08\x0c\x0c\x03\x08\x0f\x1f\x03" + + "\x08\x0f\x1d\x03\x08\x00\x14\x03\x08\x03\x14\x03\x08\x06\x16\x03\x08\x1e" + + "#\x03\x08\x11\x11\x03\x08\x10\x18\x03\x08\x14(\x03\x07)\x1e\x03\x07.1" + + "\x03\x07 $\x03\x07 '\x03\x078\x08\x03\x07\x0d0\x03\x07\x0f7\x03\x07\x05#" + + "\x03\x07\x05\x1a\x03\x07\x1a7\x03\x07\x1d-\x03\x07\x17\x10\x03\x06)\x1f" + + "\x03\x062\x0b\x03\x066\x16\x03\x06\x09\x11\x03\x09(\x1e\x03\x07!5\x03" + + "\x0b\x11\x16\x03\x0a/\x04\x03\x0a,\x1a\x03\x0b\x173\x03\x0a,1\x03\x0a/5" + + "\x03\x0a\x221\x03\x0a\x22\x0d\x03\x0a?%\x03\x0a<,\x03\x0a?#\x03\x0a>\x19" + + "\x03\x0a\x08&\x03\x0a\x0b\x0e\x03\x0a\x0c:\x03\x0a\x0c+\x03\x0a\x03\x22" + + "\x03\x0a\x06)\x03\x0a\x11\x10\x03\x0a\x11\x1a\x03\x0a\x17-\x03\x0a\x14(" + + "\x03\x09)\x1e\x03\x09/\x09\x03\x09.\x00\x03\x09,\x07\x03\x09/*\x03\x09-9" + + "\x03\x09\x228\x03\x09%\x09\x03\x09:\x12\x03\x09;\x1d\x03\x09?\x06\x03" + + "\x093%\x03\x096\x05\x03\x096\x08\x03\x097\x02\x03\x09\x07,\x03\x09\x04," + + "\x03\x09\x1f\x16\x03\x09\x11\x03\x03\x09\x11\x12\x03\x09\x168\x03\x08*" + + "\x05\x03\x08/2\x03\x084:\x03\x08\x22+\x03\x08 0\x03\x08&\x0a\x03\x08;" + + "\x10\x03\x08>$\x03\x08>\x18\x03\x0829\x03\x082:\x03\x081,\x03\x081<\x03" + + "\x081\x1c\x03\x087#\x03\x087*\x03\x08\x09'\x03\x08\x00\x1d\x03\x08\x05-" + + "\x03\x08\x1f4\x03\x08\x1d\x04\x03\x08\x16\x0f\x03\x07*7\x03\x07'!\x03" + + "\x07%\x1b\x03\x077\x0c\x03\x07\x0c1\x03\x07\x0c.\x03\x07\x00\x06\x03\x07" + + "\x01\x02\x03\x07\x010\x03\x07\x06=\x03\x07\x01\x03\x03\x07\x01\x13\x03" + + "\x07\x06\x06\x03\x07\x05\x0a\x03\x07\x1f\x09\x03\x07\x17:\x03\x06*1\x03" + + "\x06-\x1d\x03\x06\x223\x03\x062:\x03\x060$\x03\x066\x1e\x03\x064\x12\x03" + + "\x0645\x03\x06\x0b\x00\x03\x06\x0b7\x03\x06\x07\x1f\x03\x06\x15\x12\x03" + + "\x0c\x05\x0f\x03\x0b+\x0b\x03\x0b+-\x03\x06\x16\x1b\x03\x06\x15\x17\x03" + + "\x89\xca\xea\x03\x89\xca\xe8\x03\x0c8\x10\x03\x0c8\x01\x03\x0c8\x0f\x03" + + "\x0d8%\x03\x0d8!\x03\x0c8-\x03\x0c8/\x03\x0c8+\x03\x0c87\x03\x0c85\x03" + + "\x0c9\x09\x03\x0c9\x0d\x03\x0c9\x0f\x03\x0c9\x0b\x03\xcfu\x0c\x03\xcfu" + + "\x0f\x03\xcfu\x0e\x03\xcfu\x09\x03\x0c9\x10\x03\x0d9\x0c\x03\xcf`;\x03" + + "\xcf`>\x03\xcf`9\x03\xcf`8\x03\xcf`7\x03\xcf`*\x03\xcf`-\x03\xcf`,\x03" + + "\x0d\x1b\x1a\x03\x0d\x1b&\x03\x0c=.\x03\x0c=%\x03\x0c>\x1e\x03\x0c>\x14" + + "\x03\x0c?\x06\x03\x0c?\x0b\x03\x0c?\x0c\x03\x0c?\x0d\x03\x0c?\x02\x03" + + "\x0c>\x0f\x03\x0c>\x08\x03\x0c>\x09\x03\x0c>,\x03\x0c>\x0c\x03\x0c?\x13" + + "\x03\x0c?\x16\x03\x0c?\x15\x03\x0c?\x1c\x03\x0c?\x1f\x03\x0c?\x1d\x03" + + "\x0c?\x1a\x03\x0c?\x17\x03\x0c?\x08\x03\x0c?\x09\x03\x0c?\x0e\x03\x0c?" + + "\x04\x03\x0c?\x05\x03\x0c" + + "\x03\x0c=2\x03\x0c=6\x03\x0c<\x07\x03\x0c<\x05\x03\x0e:!\x03\x0e:#\x03" + + "\x0e8\x09\x03\x0e:&\x03\x0e8\x0b\x03\x0e:$\x03\x0e:,\x03\x0e8\x1a\x03" + + "\x0e8\x1e\x03\x0e:*\x03\x0e:7\x03\x0e:5\x03\x0e:;\x03\x0e:\x15\x03\x0e:<" + + "\x03\x0e:4\x03\x0e:'\x03\x0e:-\x03\x0e:%\x03\x0e:?\x03\x0e:=\x03\x0e:)" + + "\x03\x0e:/\x03\xcfs'\x03\x0d=\x0f\x03\x0d+*\x03\x0d99\x03\x0d9;\x03\x0d9" + + "?\x03\x0d)\x0d\x03\x0d(%\x02\x01\x18\x02\x01(\x02\x03'\x02\x03)\x02\x03+" + + "\x02\x03/\x02\x03\x19\x02\x03\x1b\x02\x03\x1f\x03\x0d\x22\x18\x03\x0d" + + "\x22\x1a\x03\x0d\x22'\x03\x0d\x22/\x03\x0d\x223\x03\x0d\x22$\x02\x01\x1e" + + "\x03\x0f$!\x03\x0f87\x03\x0f4\x0e\x03\x0f5\x1d\x03\x06'\x03\x03\x0f\x08" + + "\x18\x03\x0f\x0d\x1b\x03\x0e2=\x03\x0e;\x08\x03\x0e:\x0b\x03\x0e\x06$" + + "\x03\x0e\x0d)\x03\x0e\x16\x1f\x03\x0e\x16\x1b\x03\x0d$\x0a\x03\x05,\x1d" + + "\x03\x0d. \x03\x0d.#\x03\x0c(/\x03\x09%\x02\x03\x0d90\x03\x0d\x0e4\x03" + + "\x0d\x0d\x0f\x03\x0c#\x00\x03\x0c,\x1e\x03\x0c2\x0e\x03\x0c\x01\x17\x03" + + "\x0c\x09:\x03\x0e\x173\x03\x0c\x08\x03\x03\x0c\x11\x07\x03\x0c\x10\x18" + + "\x03\x0c\x1f\x1c\x03\x0c\x19\x0e\x03\x0c\x1a\x1f\x03\x0f0>\x03\x0b->\x03" + + "\x0b<+\x03\x0b8\x13\x03\x0b\x043\x03\x0b\x14\x03\x03\x0b\x16%\x03\x0d" + + "\x22&\x03\x0b\x1a\x1a\x03\x0b\x1a\x04\x03\x0a%9\x03\x0a&2\x03\x0a&0\x03" + + "\x0a!\x1a\x03\x0a!7\x03\x0a5\x10\x03\x0a=4\x03\x0a?\x0e\x03\x0a>\x10\x03" + + "\x0a\x00 \x03\x0a\x0f:\x03\x0a\x0f9\x03\x0a\x0b\x0a\x03\x0a\x17%\x03\x0a" + + "\x1b-\x03\x09-\x1a\x03\x09,4\x03\x09.,\x03\x09)\x09\x03\x096!\x03\x091" + + "\x1f\x03\x093\x16\x03\x0c+\x1f\x03\x098 \x03\x098=\x03\x0c(\x1a\x03\x0c(" + + "\x16\x03\x09\x0a+\x03\x09\x16\x12\x03\x09\x13\x0e\x03\x09\x153\x03\x08)!" + + "\x03\x09\x1a\x01\x03\x09\x18\x01\x03\x08%#\x03\x08>\x22\x03\x08\x05%\x03" + + "\x08\x02*\x03\x08\x15;\x03\x08\x1b7\x03\x0f\x07\x1d\x03\x0f\x04\x03\x03" + + "\x070\x0c\x03\x07;\x0b\x03\x07\x08\x17\x03\x07\x12\x06\x03\x06/-\x03\x06" + + "71\x03\x065+\x03\x06>7\x03\x06\x049\x03\x05+\x1e\x03\x05,\x17\x03\x05 " + + "\x1d\x03\x05\x22\x05\x03\x050\x1d" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *idnaTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return idnaValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := idnaIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = idnaIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = idnaIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *idnaTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return idnaValues[c0] + } + i := idnaIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = idnaIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// idnaTrie. Total size: 31598 bytes (30.86 KiB). Checksum: d3118eda0d6b5360. +type idnaTrie struct{} + +func newIdnaTrie(i int) *idnaTrie { + return &idnaTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *idnaTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 133: + return uint16(idnaValues[n<<6+uint32(b)]) + default: + n -= 133 + return uint16(idnaSparse.lookup(n, b)) + } +} + +// idnaValues: 135 blocks, 8640 entries, 17280 bytes +// The third block is the zero block. +var idnaValues = [8640]uint16{ + // Block 0x0, offset 0x0 + 0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080, + 0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080, + 0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080, + 0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080, + 0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080, + 0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080, + 0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080, + 0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080, + 0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008, + 0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080, + 0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080, + // Block 0x1, offset 0x40 + 0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105, + 0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105, + 0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105, + 0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105, + 0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080, + 0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008, + 0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008, + 0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008, + 0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008, + 0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080, + 0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018, + 0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x0012, 0xe9: 0x0018, + 0xea: 0x0019, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x0022, + 0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0029, 0xf3: 0x0031, 0xf4: 0x003a, 0xf5: 0x0005, + 0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x0042, 0xf9: 0x0049, 0xfa: 0x0051, 0xfb: 0x0018, + 0xfc: 0x0059, 0xfd: 0x0061, 0xfe: 0x0069, 0xff: 0x0018, + // Block 0x4, offset 0x100 + 0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008, + 0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008, + 0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008, + 0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008, + 0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008, + 0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008, + 0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008, + 0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008, + 0x130: 0x0071, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008, + 0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d, + 0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0079, + // Block 0x5, offset 0x140 + 0x140: 0x0079, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d, + 0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x0081, 0x14a: 0xe00d, 0x14b: 0x0008, + 0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008, + 0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008, + 0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008, + 0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008, + 0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008, + 0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008, + 0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008, + 0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d, + 0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x0089, + // Block 0x6, offset 0x180 + 0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008, + 0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d, + 0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d, + 0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d, + 0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155, + 0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008, + 0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d, + 0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd, + 0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d, + 0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008, + 0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x0091, 0x1c5: 0x0091, + 0x1c6: 0x0091, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d, + 0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d, + 0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d, + 0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008, + 0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008, + 0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008, + 0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008, + 0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008, + 0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008, + 0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008, + // Block 0x8, offset 0x200 + 0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008, + 0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008, + 0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008, + 0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008, + 0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008, + 0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008, + 0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008, + 0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008, + 0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008, + 0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0099, 0x23b: 0xe03d, + 0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x00a1, 0x23f: 0x0008, + // Block 0x9, offset 0x240 + 0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018, + 0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008, + 0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008, + 0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018, + 0x258: 0x00d2, 0x259: 0x00da, 0x25a: 0x00e2, 0x25b: 0x00ea, 0x25c: 0x00f2, 0x25d: 0x00fa, + 0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0101, 0x262: 0x0089, 0x263: 0x0109, + 0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018, + 0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018, + 0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018, + 0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018, + 0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018, + // Block 0xa, offset 0x280 + 0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0111, 0x285: 0x040d, + 0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308, + 0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308, + 0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308, + 0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308, + 0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308, + 0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308, + 0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308, + 0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008, + 0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x011a, 0x2bb: 0x0008, + 0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x0122, 0x2bf: 0x043d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x003a, 0x2c5: 0x012a, + 0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040, + 0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105, + 0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105, + 0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105, + 0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d, + 0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d, + 0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008, + 0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008, + 0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008, + 0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008, + // Block 0xc, offset 0x300 + 0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008, + 0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008, + 0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd, + 0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008, + 0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008, + 0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008, + 0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008, + 0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008, + 0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd, + 0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008, + 0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d, + // Block 0xd, offset 0x340 + 0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008, + 0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008, + 0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008, + 0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008, + 0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008, + 0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008, + 0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008, + 0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008, + 0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008, + 0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008, + 0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008, + // Block 0xe, offset 0x380 + 0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308, + 0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008, + 0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008, + 0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008, + 0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008, + 0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008, + 0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008, + 0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008, + 0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008, + 0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008, + 0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d, + 0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d, + 0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008, + 0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008, + 0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008, + 0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008, + 0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008, + 0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008, + 0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008, + 0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008, + 0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008, + // Block 0x10, offset 0x400 + 0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008, + 0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008, + 0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008, + 0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008, + 0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008, + 0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008, + 0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008, + 0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008, + 0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5, + 0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5, + 0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5, + // Block 0x11, offset 0x440 + 0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840, + 0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818, + 0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308, + 0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308, + 0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0818, + 0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08, + 0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08, + 0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08, + 0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08, + 0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08, + 0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08, + // Block 0x12, offset 0x480 + 0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08, + 0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308, + 0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308, + 0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308, + 0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308, + 0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808, + 0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808, + 0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08, + 0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0139, + 0x4b6: 0x0141, 0x4b7: 0x0149, 0x4b8: 0x0151, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08, + 0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08, + 0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08, + 0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08, + 0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308, + 0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840, + 0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308, + 0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018, + 0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08, + 0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008, + 0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08, + 0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08, + // Block 0x14, offset 0x500 + 0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818, + 0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818, + 0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308, + 0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08, + 0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08, + 0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08, + 0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08, + 0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08, + 0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308, + 0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308, + 0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308, + // Block 0x15, offset 0x540 + 0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08, + 0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08, + 0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08, + 0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0c08, 0x557: 0x0c08, + 0x558: 0x0c08, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040, + 0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08, + 0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08, + 0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040, + 0x570: 0x0c08, 0x571: 0x0c08, 0x572: 0x0c08, 0x573: 0x0c08, 0x574: 0x0c08, 0x575: 0x0c08, + 0x576: 0x0c08, 0x577: 0x0c08, 0x578: 0x0c08, 0x579: 0x0c08, 0x57a: 0x0c08, 0x57b: 0x0c08, + 0x57c: 0x0c08, 0x57d: 0x0c08, 0x57e: 0x0c08, 0x57f: 0x0c08, + // Block 0x16, offset 0x580 + 0x580: 0x0c08, 0x581: 0x0c08, 0x582: 0x0c08, 0x583: 0x0808, 0x584: 0x0808, 0x585: 0x0808, + 0x586: 0x0a08, 0x587: 0x0808, 0x588: 0x0818, 0x589: 0x0a08, 0x58a: 0x0a08, 0x58b: 0x0a08, + 0x58c: 0x0a08, 0x58d: 0x0a08, 0x58e: 0x0c08, 0x58f: 0x0040, 0x590: 0x0840, 0x591: 0x0840, + 0x592: 0x0040, 0x593: 0x0040, 0x594: 0x0040, 0x595: 0x0040, 0x596: 0x0040, 0x597: 0x0040, + 0x598: 0x3308, 0x599: 0x3308, 0x59a: 0x3308, 0x59b: 0x3308, 0x59c: 0x3308, 0x59d: 0x3308, + 0x59e: 0x3308, 0x59f: 0x3308, 0x5a0: 0x0a08, 0x5a1: 0x0a08, 0x5a2: 0x0a08, 0x5a3: 0x0a08, + 0x5a4: 0x0a08, 0x5a5: 0x0a08, 0x5a6: 0x0a08, 0x5a7: 0x0a08, 0x5a8: 0x0a08, 0x5a9: 0x0a08, + 0x5aa: 0x0c08, 0x5ab: 0x0c08, 0x5ac: 0x0c08, 0x5ad: 0x0808, 0x5ae: 0x0c08, 0x5af: 0x0a08, + 0x5b0: 0x0a08, 0x5b1: 0x0c08, 0x5b2: 0x0c08, 0x5b3: 0x0a08, 0x5b4: 0x0a08, 0x5b5: 0x0a08, + 0x5b6: 0x0a08, 0x5b7: 0x0a08, 0x5b8: 0x0a08, 0x5b9: 0x0c08, 0x5ba: 0x0a08, 0x5bb: 0x0a08, + 0x5bc: 0x0a08, 0x5bd: 0x0a08, 0x5be: 0x0a08, 0x5bf: 0x0a08, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3008, 0x5c1: 0x3308, 0x5c2: 0x3308, 0x5c3: 0x3308, 0x5c4: 0x3308, 0x5c5: 0x3308, + 0x5c6: 0x3308, 0x5c7: 0x3308, 0x5c8: 0x3308, 0x5c9: 0x3008, 0x5ca: 0x3008, 0x5cb: 0x3008, + 0x5cc: 0x3008, 0x5cd: 0x3b08, 0x5ce: 0x3008, 0x5cf: 0x3008, 0x5d0: 0x0008, 0x5d1: 0x3308, + 0x5d2: 0x3308, 0x5d3: 0x3308, 0x5d4: 0x3308, 0x5d5: 0x3308, 0x5d6: 0x3308, 0x5d7: 0x3308, + 0x5d8: 0x0159, 0x5d9: 0x0161, 0x5da: 0x0169, 0x5db: 0x0171, 0x5dc: 0x0179, 0x5dd: 0x0181, + 0x5de: 0x0189, 0x5df: 0x0191, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x3308, 0x5e3: 0x3308, + 0x5e4: 0x0018, 0x5e5: 0x0018, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0008, + 0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008, + 0x5f0: 0x0018, 0x5f1: 0x0008, 0x5f2: 0x0008, 0x5f3: 0x0008, 0x5f4: 0x0008, 0x5f5: 0x0008, + 0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0008, 0x5fb: 0x0008, + 0x5fc: 0x0008, 0x5fd: 0x0008, 0x5fe: 0x0008, 0x5ff: 0x0008, + // Block 0x18, offset 0x600 + 0x600: 0x0008, 0x601: 0x3308, 0x602: 0x3008, 0x603: 0x3008, 0x604: 0x0040, 0x605: 0x0008, + 0x606: 0x0008, 0x607: 0x0008, 0x608: 0x0008, 0x609: 0x0008, 0x60a: 0x0008, 0x60b: 0x0008, + 0x60c: 0x0008, 0x60d: 0x0040, 0x60e: 0x0040, 0x60f: 0x0008, 0x610: 0x0008, 0x611: 0x0040, + 0x612: 0x0040, 0x613: 0x0008, 0x614: 0x0008, 0x615: 0x0008, 0x616: 0x0008, 0x617: 0x0008, + 0x618: 0x0008, 0x619: 0x0008, 0x61a: 0x0008, 0x61b: 0x0008, 0x61c: 0x0008, 0x61d: 0x0008, + 0x61e: 0x0008, 0x61f: 0x0008, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x0008, 0x623: 0x0008, + 0x624: 0x0008, 0x625: 0x0008, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0040, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, 0x631: 0x0040, 0x632: 0x0008, 0x633: 0x0040, 0x634: 0x0040, 0x635: 0x0040, + 0x636: 0x0008, 0x637: 0x0008, 0x638: 0x0008, 0x639: 0x0008, 0x63a: 0x0040, 0x63b: 0x0040, + 0x63c: 0x3308, 0x63d: 0x0008, 0x63e: 0x3008, 0x63f: 0x3008, + // Block 0x19, offset 0x640 + 0x640: 0x3008, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3308, 0x644: 0x3308, 0x645: 0x0040, + 0x646: 0x0040, 0x647: 0x3008, 0x648: 0x3008, 0x649: 0x0040, 0x64a: 0x0040, 0x64b: 0x3008, + 0x64c: 0x3008, 0x64d: 0x3b08, 0x64e: 0x0008, 0x64f: 0x0040, 0x650: 0x0040, 0x651: 0x0040, + 0x652: 0x0040, 0x653: 0x0040, 0x654: 0x0040, 0x655: 0x0040, 0x656: 0x0040, 0x657: 0x3008, + 0x658: 0x0040, 0x659: 0x0040, 0x65a: 0x0040, 0x65b: 0x0040, 0x65c: 0x0199, 0x65d: 0x01a1, + 0x65e: 0x0040, 0x65f: 0x01a9, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x3308, 0x663: 0x3308, + 0x664: 0x0040, 0x665: 0x0040, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0008, + 0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0008, 0x672: 0x0018, 0x673: 0x0018, 0x674: 0x0018, 0x675: 0x0018, + 0x676: 0x0018, 0x677: 0x0018, 0x678: 0x0018, 0x679: 0x0018, 0x67a: 0x0018, 0x67b: 0x0018, + 0x67c: 0x0008, 0x67d: 0x0018, 0x67e: 0x3308, 0x67f: 0x0040, + // Block 0x1a, offset 0x680 + 0x680: 0x0040, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x3008, 0x684: 0x0040, 0x685: 0x0008, + 0x686: 0x0008, 0x687: 0x0008, 0x688: 0x0008, 0x689: 0x0008, 0x68a: 0x0008, 0x68b: 0x0040, + 0x68c: 0x0040, 0x68d: 0x0040, 0x68e: 0x0040, 0x68f: 0x0008, 0x690: 0x0008, 0x691: 0x0040, + 0x692: 0x0040, 0x693: 0x0008, 0x694: 0x0008, 0x695: 0x0008, 0x696: 0x0008, 0x697: 0x0008, + 0x698: 0x0008, 0x699: 0x0008, 0x69a: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008, + 0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008, + 0x6a4: 0x0008, 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0040, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008, + 0x6b0: 0x0008, 0x6b1: 0x0040, 0x6b2: 0x0008, 0x6b3: 0x01b1, 0x6b4: 0x0040, 0x6b5: 0x0008, + 0x6b6: 0x01b9, 0x6b7: 0x0040, 0x6b8: 0x0008, 0x6b9: 0x0008, 0x6ba: 0x0040, 0x6bb: 0x0040, + 0x6bc: 0x3308, 0x6bd: 0x0040, 0x6be: 0x3008, 0x6bf: 0x3008, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3008, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x0040, 0x6c4: 0x0040, 0x6c5: 0x0040, + 0x6c6: 0x0040, 0x6c7: 0x3308, 0x6c8: 0x3308, 0x6c9: 0x0040, 0x6ca: 0x0040, 0x6cb: 0x3308, + 0x6cc: 0x3308, 0x6cd: 0x3b08, 0x6ce: 0x0040, 0x6cf: 0x0040, 0x6d0: 0x0040, 0x6d1: 0x3308, + 0x6d2: 0x0040, 0x6d3: 0x0040, 0x6d4: 0x0040, 0x6d5: 0x0040, 0x6d6: 0x0040, 0x6d7: 0x0040, + 0x6d8: 0x0040, 0x6d9: 0x01c1, 0x6da: 0x01c9, 0x6db: 0x01d1, 0x6dc: 0x0008, 0x6dd: 0x0040, + 0x6de: 0x01d9, 0x6df: 0x0040, 0x6e0: 0x0040, 0x6e1: 0x0040, 0x6e2: 0x0040, 0x6e3: 0x0040, + 0x6e4: 0x0040, 0x6e5: 0x0040, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0008, + 0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008, + 0x6f0: 0x3308, 0x6f1: 0x3308, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0008, 0x6f5: 0x3308, + 0x6f6: 0x0018, 0x6f7: 0x0040, 0x6f8: 0x0040, 0x6f9: 0x0040, 0x6fa: 0x0040, 0x6fb: 0x0040, + 0x6fc: 0x0040, 0x6fd: 0x0040, 0x6fe: 0x0040, 0x6ff: 0x0040, + // Block 0x1c, offset 0x700 + 0x700: 0x0040, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3008, 0x704: 0x0040, 0x705: 0x0008, + 0x706: 0x0008, 0x707: 0x0008, 0x708: 0x0008, 0x709: 0x0008, 0x70a: 0x0008, 0x70b: 0x0008, + 0x70c: 0x0008, 0x70d: 0x0008, 0x70e: 0x0040, 0x70f: 0x0008, 0x710: 0x0008, 0x711: 0x0008, + 0x712: 0x0040, 0x713: 0x0008, 0x714: 0x0008, 0x715: 0x0008, 0x716: 0x0008, 0x717: 0x0008, + 0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008, + 0x71e: 0x0008, 0x71f: 0x0008, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x0008, 0x723: 0x0008, + 0x724: 0x0008, 0x725: 0x0008, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0040, + 0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008, + 0x730: 0x0008, 0x731: 0x0040, 0x732: 0x0008, 0x733: 0x0008, 0x734: 0x0040, 0x735: 0x0008, + 0x736: 0x0008, 0x737: 0x0008, 0x738: 0x0008, 0x739: 0x0008, 0x73a: 0x0040, 0x73b: 0x0040, + 0x73c: 0x3308, 0x73d: 0x0008, 0x73e: 0x3008, 0x73f: 0x3008, + // Block 0x1d, offset 0x740 + 0x740: 0x3008, 0x741: 0x3308, 0x742: 0x3308, 0x743: 0x3308, 0x744: 0x3308, 0x745: 0x3308, + 0x746: 0x0040, 0x747: 0x3308, 0x748: 0x3308, 0x749: 0x3008, 0x74a: 0x0040, 0x74b: 0x3008, + 0x74c: 0x3008, 0x74d: 0x3b08, 0x74e: 0x0040, 0x74f: 0x0040, 0x750: 0x0008, 0x751: 0x0040, + 0x752: 0x0040, 0x753: 0x0040, 0x754: 0x0040, 0x755: 0x0040, 0x756: 0x0040, 0x757: 0x0040, + 0x758: 0x0040, 0x759: 0x0040, 0x75a: 0x0040, 0x75b: 0x0040, 0x75c: 0x0040, 0x75d: 0x0040, + 0x75e: 0x0040, 0x75f: 0x0040, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x3308, 0x763: 0x3308, + 0x764: 0x0040, 0x765: 0x0040, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0018, 0x771: 0x0018, 0x772: 0x0040, 0x773: 0x0040, 0x774: 0x0040, 0x775: 0x0040, + 0x776: 0x0040, 0x777: 0x0040, 0x778: 0x0040, 0x779: 0x0008, 0x77a: 0x3308, 0x77b: 0x3308, + 0x77c: 0x3308, 0x77d: 0x3308, 0x77e: 0x3308, 0x77f: 0x3308, + // Block 0x1e, offset 0x780 + 0x780: 0x0040, 0x781: 0x3308, 0x782: 0x3008, 0x783: 0x3008, 0x784: 0x0040, 0x785: 0x0008, + 0x786: 0x0008, 0x787: 0x0008, 0x788: 0x0008, 0x789: 0x0008, 0x78a: 0x0008, 0x78b: 0x0008, + 0x78c: 0x0008, 0x78d: 0x0040, 0x78e: 0x0040, 0x78f: 0x0008, 0x790: 0x0008, 0x791: 0x0040, + 0x792: 0x0040, 0x793: 0x0008, 0x794: 0x0008, 0x795: 0x0008, 0x796: 0x0008, 0x797: 0x0008, + 0x798: 0x0008, 0x799: 0x0008, 0x79a: 0x0008, 0x79b: 0x0008, 0x79c: 0x0008, 0x79d: 0x0008, + 0x79e: 0x0008, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x0008, 0x7a3: 0x0008, + 0x7a4: 0x0008, 0x7a5: 0x0008, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0040, + 0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008, + 0x7b0: 0x0008, 0x7b1: 0x0040, 0x7b2: 0x0008, 0x7b3: 0x0008, 0x7b4: 0x0040, 0x7b5: 0x0008, + 0x7b6: 0x0008, 0x7b7: 0x0008, 0x7b8: 0x0008, 0x7b9: 0x0008, 0x7ba: 0x0040, 0x7bb: 0x0040, + 0x7bc: 0x3308, 0x7bd: 0x0008, 0x7be: 0x3008, 0x7bf: 0x3308, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x3008, 0x7c1: 0x3308, 0x7c2: 0x3308, 0x7c3: 0x3308, 0x7c4: 0x3308, 0x7c5: 0x0040, + 0x7c6: 0x0040, 0x7c7: 0x3008, 0x7c8: 0x3008, 0x7c9: 0x0040, 0x7ca: 0x0040, 0x7cb: 0x3008, + 0x7cc: 0x3008, 0x7cd: 0x3b08, 0x7ce: 0x0040, 0x7cf: 0x0040, 0x7d0: 0x0040, 0x7d1: 0x0040, + 0x7d2: 0x0040, 0x7d3: 0x0040, 0x7d4: 0x0040, 0x7d5: 0x3308, 0x7d6: 0x3308, 0x7d7: 0x3008, + 0x7d8: 0x0040, 0x7d9: 0x0040, 0x7da: 0x0040, 0x7db: 0x0040, 0x7dc: 0x01e1, 0x7dd: 0x01e9, + 0x7de: 0x0040, 0x7df: 0x0008, 0x7e0: 0x0008, 0x7e1: 0x0008, 0x7e2: 0x3308, 0x7e3: 0x3308, + 0x7e4: 0x0040, 0x7e5: 0x0040, 0x7e6: 0x0008, 0x7e7: 0x0008, 0x7e8: 0x0008, 0x7e9: 0x0008, + 0x7ea: 0x0008, 0x7eb: 0x0008, 0x7ec: 0x0008, 0x7ed: 0x0008, 0x7ee: 0x0008, 0x7ef: 0x0008, + 0x7f0: 0x0018, 0x7f1: 0x0008, 0x7f2: 0x0018, 0x7f3: 0x0018, 0x7f4: 0x0018, 0x7f5: 0x0018, + 0x7f6: 0x0018, 0x7f7: 0x0018, 0x7f8: 0x0040, 0x7f9: 0x0040, 0x7fa: 0x0040, 0x7fb: 0x0040, + 0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x0040, 0x7ff: 0x0040, + // Block 0x20, offset 0x800 + 0x800: 0x0040, 0x801: 0x0040, 0x802: 0x3308, 0x803: 0x0008, 0x804: 0x0040, 0x805: 0x0008, + 0x806: 0x0008, 0x807: 0x0008, 0x808: 0x0008, 0x809: 0x0008, 0x80a: 0x0008, 0x80b: 0x0040, + 0x80c: 0x0040, 0x80d: 0x0040, 0x80e: 0x0008, 0x80f: 0x0008, 0x810: 0x0008, 0x811: 0x0040, + 0x812: 0x0008, 0x813: 0x0008, 0x814: 0x0008, 0x815: 0x0008, 0x816: 0x0040, 0x817: 0x0040, + 0x818: 0x0040, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0008, 0x81d: 0x0040, + 0x81e: 0x0008, 0x81f: 0x0008, 0x820: 0x0040, 0x821: 0x0040, 0x822: 0x0040, 0x823: 0x0008, + 0x824: 0x0008, 0x825: 0x0040, 0x826: 0x0040, 0x827: 0x0040, 0x828: 0x0008, 0x829: 0x0008, + 0x82a: 0x0008, 0x82b: 0x0040, 0x82c: 0x0040, 0x82d: 0x0040, 0x82e: 0x0008, 0x82f: 0x0008, + 0x830: 0x0008, 0x831: 0x0008, 0x832: 0x0008, 0x833: 0x0008, 0x834: 0x0008, 0x835: 0x0008, + 0x836: 0x0008, 0x837: 0x0008, 0x838: 0x0008, 0x839: 0x0008, 0x83a: 0x0040, 0x83b: 0x0040, + 0x83c: 0x0040, 0x83d: 0x0040, 0x83e: 0x3008, 0x83f: 0x3008, + // Block 0x21, offset 0x840 + 0x840: 0x3308, 0x841: 0x3008, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x3008, 0x845: 0x0040, + 0x846: 0x3308, 0x847: 0x3308, 0x848: 0x3308, 0x849: 0x0040, 0x84a: 0x3308, 0x84b: 0x3308, + 0x84c: 0x3308, 0x84d: 0x3b08, 0x84e: 0x0040, 0x84f: 0x0040, 0x850: 0x0040, 0x851: 0x0040, + 0x852: 0x0040, 0x853: 0x0040, 0x854: 0x0040, 0x855: 0x3308, 0x856: 0x3308, 0x857: 0x0040, + 0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0040, 0x85c: 0x0040, 0x85d: 0x0008, + 0x85e: 0x0040, 0x85f: 0x0040, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x3308, 0x863: 0x3308, + 0x864: 0x0040, 0x865: 0x0040, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0008, + 0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008, + 0x870: 0x0040, 0x871: 0x0040, 0x872: 0x0040, 0x873: 0x0040, 0x874: 0x0040, 0x875: 0x0040, + 0x876: 0x0040, 0x877: 0x0018, 0x878: 0x0018, 0x879: 0x0018, 0x87a: 0x0018, 0x87b: 0x0018, + 0x87c: 0x0018, 0x87d: 0x0018, 0x87e: 0x0018, 0x87f: 0x0018, + // Block 0x22, offset 0x880 + 0x880: 0x0008, 0x881: 0x3308, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x0018, 0x885: 0x0008, + 0x886: 0x0008, 0x887: 0x0008, 0x888: 0x0008, 0x889: 0x0008, 0x88a: 0x0008, 0x88b: 0x0008, + 0x88c: 0x0008, 0x88d: 0x0040, 0x88e: 0x0008, 0x88f: 0x0008, 0x890: 0x0008, 0x891: 0x0040, + 0x892: 0x0008, 0x893: 0x0008, 0x894: 0x0008, 0x895: 0x0008, 0x896: 0x0008, 0x897: 0x0008, + 0x898: 0x0008, 0x899: 0x0008, 0x89a: 0x0008, 0x89b: 0x0008, 0x89c: 0x0008, 0x89d: 0x0008, + 0x89e: 0x0008, 0x89f: 0x0008, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x0008, 0x8a3: 0x0008, + 0x8a4: 0x0008, 0x8a5: 0x0008, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0040, + 0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008, + 0x8b0: 0x0008, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0008, 0x8b4: 0x0040, 0x8b5: 0x0008, + 0x8b6: 0x0008, 0x8b7: 0x0008, 0x8b8: 0x0008, 0x8b9: 0x0008, 0x8ba: 0x0040, 0x8bb: 0x0040, + 0x8bc: 0x3308, 0x8bd: 0x0008, 0x8be: 0x3008, 0x8bf: 0x3308, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x3008, 0x8c1: 0x3008, 0x8c2: 0x3008, 0x8c3: 0x3008, 0x8c4: 0x3008, 0x8c5: 0x0040, + 0x8c6: 0x3308, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008, + 0x8cc: 0x3308, 0x8cd: 0x3b08, 0x8ce: 0x0040, 0x8cf: 0x0040, 0x8d0: 0x0040, 0x8d1: 0x0040, + 0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0040, 0x8d5: 0x3008, 0x8d6: 0x3008, 0x8d7: 0x0040, + 0x8d8: 0x0040, 0x8d9: 0x0040, 0x8da: 0x0040, 0x8db: 0x0040, 0x8dc: 0x0040, 0x8dd: 0x0008, + 0x8de: 0x0008, 0x8df: 0x0040, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308, + 0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008, + 0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008, + 0x8f0: 0x0040, 0x8f1: 0x0008, 0x8f2: 0x0008, 0x8f3: 0x3008, 0x8f4: 0x0040, 0x8f5: 0x0040, + 0x8f6: 0x0040, 0x8f7: 0x0040, 0x8f8: 0x0040, 0x8f9: 0x0040, 0x8fa: 0x0040, 0x8fb: 0x0040, + 0x8fc: 0x0040, 0x8fd: 0x0040, 0x8fe: 0x0040, 0x8ff: 0x0040, + // Block 0x24, offset 0x900 + 0x900: 0x3008, 0x901: 0x3308, 0x902: 0x3308, 0x903: 0x3308, 0x904: 0x3308, 0x905: 0x0040, + 0x906: 0x3008, 0x907: 0x3008, 0x908: 0x3008, 0x909: 0x0040, 0x90a: 0x3008, 0x90b: 0x3008, + 0x90c: 0x3008, 0x90d: 0x3b08, 0x90e: 0x0008, 0x90f: 0x0018, 0x910: 0x0040, 0x911: 0x0040, + 0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x3008, + 0x918: 0x0018, 0x919: 0x0018, 0x91a: 0x0018, 0x91b: 0x0018, 0x91c: 0x0018, 0x91d: 0x0018, + 0x91e: 0x0018, 0x91f: 0x0008, 0x920: 0x0008, 0x921: 0x0008, 0x922: 0x3308, 0x923: 0x3308, + 0x924: 0x0040, 0x925: 0x0040, 0x926: 0x0008, 0x927: 0x0008, 0x928: 0x0008, 0x929: 0x0008, + 0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0008, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008, + 0x930: 0x0018, 0x931: 0x0018, 0x932: 0x0018, 0x933: 0x0018, 0x934: 0x0018, 0x935: 0x0018, + 0x936: 0x0018, 0x937: 0x0018, 0x938: 0x0018, 0x939: 0x0018, 0x93a: 0x0008, 0x93b: 0x0008, + 0x93c: 0x0008, 0x93d: 0x0008, 0x93e: 0x0008, 0x93f: 0x0008, + // Block 0x25, offset 0x940 + 0x940: 0x0040, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x0040, 0x944: 0x0008, 0x945: 0x0040, + 0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0008, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0040, + 0x94c: 0x0008, 0x94d: 0x0008, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008, + 0x952: 0x0008, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0008, + 0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0008, 0x95d: 0x0008, + 0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008, + 0x964: 0x0040, 0x965: 0x0008, 0x966: 0x0040, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0008, + 0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0008, 0x96e: 0x0008, 0x96f: 0x0008, + 0x970: 0x0008, 0x971: 0x3308, 0x972: 0x0008, 0x973: 0x01f9, 0x974: 0x3308, 0x975: 0x3308, + 0x976: 0x3308, 0x977: 0x3308, 0x978: 0x3308, 0x979: 0x3308, 0x97a: 0x3b08, 0x97b: 0x3308, + 0x97c: 0x3308, 0x97d: 0x0008, 0x97e: 0x0040, 0x97f: 0x0040, + // Block 0x26, offset 0x980 + 0x980: 0x0008, 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0211, 0x984: 0x0008, 0x985: 0x0008, + 0x986: 0x0008, 0x987: 0x0008, 0x988: 0x0040, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008, + 0x98c: 0x0008, 0x98d: 0x0219, 0x98e: 0x0008, 0x98f: 0x0008, 0x990: 0x0008, 0x991: 0x0008, + 0x992: 0x0221, 0x993: 0x0008, 0x994: 0x0008, 0x995: 0x0008, 0x996: 0x0008, 0x997: 0x0229, + 0x998: 0x0008, 0x999: 0x0008, 0x99a: 0x0008, 0x99b: 0x0008, 0x99c: 0x0231, 0x99d: 0x0008, + 0x99e: 0x0008, 0x99f: 0x0008, 0x9a0: 0x0008, 0x9a1: 0x0008, 0x9a2: 0x0008, 0x9a3: 0x0008, + 0x9a4: 0x0008, 0x9a5: 0x0008, 0x9a6: 0x0008, 0x9a7: 0x0008, 0x9a8: 0x0008, 0x9a9: 0x0239, + 0x9aa: 0x0008, 0x9ab: 0x0008, 0x9ac: 0x0008, 0x9ad: 0x0040, 0x9ae: 0x0040, 0x9af: 0x0040, + 0x9b0: 0x0040, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x0241, 0x9b4: 0x3308, 0x9b5: 0x0249, + 0x9b6: 0x0251, 0x9b7: 0x0259, 0x9b8: 0x0261, 0x9b9: 0x0269, 0x9ba: 0x3308, 0x9bb: 0x3308, + 0x9bc: 0x3308, 0x9bd: 0x3308, 0x9be: 0x3308, 0x9bf: 0x3008, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x3308, 0x9c1: 0x0271, 0x9c2: 0x3308, 0x9c3: 0x3308, 0x9c4: 0x3b08, 0x9c5: 0x0018, + 0x9c6: 0x3308, 0x9c7: 0x3308, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008, + 0x9cc: 0x0008, 0x9cd: 0x3308, 0x9ce: 0x3308, 0x9cf: 0x3308, 0x9d0: 0x3308, 0x9d1: 0x3308, + 0x9d2: 0x3308, 0x9d3: 0x0279, 0x9d4: 0x3308, 0x9d5: 0x3308, 0x9d6: 0x3308, 0x9d7: 0x3308, + 0x9d8: 0x0040, 0x9d9: 0x3308, 0x9da: 0x3308, 0x9db: 0x3308, 0x9dc: 0x3308, 0x9dd: 0x0281, + 0x9de: 0x3308, 0x9df: 0x3308, 0x9e0: 0x3308, 0x9e1: 0x3308, 0x9e2: 0x0289, 0x9e3: 0x3308, + 0x9e4: 0x3308, 0x9e5: 0x3308, 0x9e6: 0x3308, 0x9e7: 0x0291, 0x9e8: 0x3308, 0x9e9: 0x3308, + 0x9ea: 0x3308, 0x9eb: 0x3308, 0x9ec: 0x0299, 0x9ed: 0x3308, 0x9ee: 0x3308, 0x9ef: 0x3308, + 0x9f0: 0x3308, 0x9f1: 0x3308, 0x9f2: 0x3308, 0x9f3: 0x3308, 0x9f4: 0x3308, 0x9f5: 0x3308, + 0x9f6: 0x3308, 0x9f7: 0x3308, 0x9f8: 0x3308, 0x9f9: 0x02a1, 0x9fa: 0x3308, 0x9fb: 0x3308, + 0x9fc: 0x3308, 0x9fd: 0x0040, 0x9fe: 0x0018, 0x9ff: 0x0018, + // Block 0x28, offset 0xa00 + 0xa00: 0x0008, 0xa01: 0x0008, 0xa02: 0x0008, 0xa03: 0x0008, 0xa04: 0x0008, 0xa05: 0x0008, + 0xa06: 0x0008, 0xa07: 0x0008, 0xa08: 0x0008, 0xa09: 0x0008, 0xa0a: 0x0008, 0xa0b: 0x0008, + 0xa0c: 0x0008, 0xa0d: 0x0008, 0xa0e: 0x0008, 0xa0f: 0x0008, 0xa10: 0x0008, 0xa11: 0x0008, + 0xa12: 0x0008, 0xa13: 0x0008, 0xa14: 0x0008, 0xa15: 0x0008, 0xa16: 0x0008, 0xa17: 0x0008, + 0xa18: 0x0008, 0xa19: 0x0008, 0xa1a: 0x0008, 0xa1b: 0x0008, 0xa1c: 0x0008, 0xa1d: 0x0008, + 0xa1e: 0x0008, 0xa1f: 0x0008, 0xa20: 0x0008, 0xa21: 0x0008, 0xa22: 0x0008, 0xa23: 0x0008, + 0xa24: 0x0008, 0xa25: 0x0008, 0xa26: 0x0008, 0xa27: 0x0008, 0xa28: 0x0008, 0xa29: 0x0008, + 0xa2a: 0x0008, 0xa2b: 0x0008, 0xa2c: 0x0019, 0xa2d: 0x02e1, 0xa2e: 0x02e9, 0xa2f: 0x0008, + 0xa30: 0x02f1, 0xa31: 0x02f9, 0xa32: 0x0301, 0xa33: 0x0309, 0xa34: 0x00a9, 0xa35: 0x0311, + 0xa36: 0x00b1, 0xa37: 0x0319, 0xa38: 0x0101, 0xa39: 0x0321, 0xa3a: 0x0329, 0xa3b: 0x0008, + 0xa3c: 0x0051, 0xa3d: 0x0331, 0xa3e: 0x0339, 0xa3f: 0x00b9, + // Block 0x29, offset 0xa40 + 0xa40: 0x0341, 0xa41: 0x0349, 0xa42: 0x00c1, 0xa43: 0x0019, 0xa44: 0x0351, 0xa45: 0x0359, + 0xa46: 0x05b5, 0xa47: 0x02e9, 0xa48: 0x02f1, 0xa49: 0x02f9, 0xa4a: 0x0361, 0xa4b: 0x0369, + 0xa4c: 0x0371, 0xa4d: 0x0309, 0xa4e: 0x0008, 0xa4f: 0x0319, 0xa50: 0x0321, 0xa51: 0x0379, + 0xa52: 0x0051, 0xa53: 0x0381, 0xa54: 0x05cd, 0xa55: 0x05cd, 0xa56: 0x0339, 0xa57: 0x0341, + 0xa58: 0x0349, 0xa59: 0x05b5, 0xa5a: 0x0389, 0xa5b: 0x0391, 0xa5c: 0x05e5, 0xa5d: 0x0399, + 0xa5e: 0x03a1, 0xa5f: 0x03a9, 0xa60: 0x03b1, 0xa61: 0x03b9, 0xa62: 0x0311, 0xa63: 0x00b9, + 0xa64: 0x0349, 0xa65: 0x0391, 0xa66: 0x0399, 0xa67: 0x03a1, 0xa68: 0x03c1, 0xa69: 0x03b1, + 0xa6a: 0x03b9, 0xa6b: 0x0008, 0xa6c: 0x0008, 0xa6d: 0x0008, 0xa6e: 0x0008, 0xa6f: 0x0008, + 0xa70: 0x0008, 0xa71: 0x0008, 0xa72: 0x0008, 0xa73: 0x0008, 0xa74: 0x0008, 0xa75: 0x0008, + 0xa76: 0x0008, 0xa77: 0x0008, 0xa78: 0x03c9, 0xa79: 0x0008, 0xa7a: 0x0008, 0xa7b: 0x0008, + 0xa7c: 0x0008, 0xa7d: 0x0008, 0xa7e: 0x0008, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0008, 0xa81: 0x0008, 0xa82: 0x0008, 0xa83: 0x0008, 0xa84: 0x0008, 0xa85: 0x0008, + 0xa86: 0x0008, 0xa87: 0x0008, 0xa88: 0x0008, 0xa89: 0x0008, 0xa8a: 0x0008, 0xa8b: 0x0008, + 0xa8c: 0x0008, 0xa8d: 0x0008, 0xa8e: 0x0008, 0xa8f: 0x0008, 0xa90: 0x0008, 0xa91: 0x0008, + 0xa92: 0x0008, 0xa93: 0x0008, 0xa94: 0x0008, 0xa95: 0x0008, 0xa96: 0x0008, 0xa97: 0x0008, + 0xa98: 0x0008, 0xa99: 0x0008, 0xa9a: 0x0008, 0xa9b: 0x03d1, 0xa9c: 0x03d9, 0xa9d: 0x03e1, + 0xa9e: 0x03e9, 0xa9f: 0x0371, 0xaa0: 0x03f1, 0xaa1: 0x03f9, 0xaa2: 0x0401, 0xaa3: 0x0409, + 0xaa4: 0x0411, 0xaa5: 0x0419, 0xaa6: 0x0421, 0xaa7: 0x05fd, 0xaa8: 0x0429, 0xaa9: 0x0431, + 0xaaa: 0xe17d, 0xaab: 0x0439, 0xaac: 0x0441, 0xaad: 0x0449, 0xaae: 0x0451, 0xaaf: 0x0459, + 0xab0: 0x0461, 0xab1: 0x0469, 0xab2: 0x0471, 0xab3: 0x0479, 0xab4: 0x0481, 0xab5: 0x0489, + 0xab6: 0x0491, 0xab7: 0x0499, 0xab8: 0x0615, 0xab9: 0x04a1, 0xaba: 0x04a9, 0xabb: 0x04b1, + 0xabc: 0x04b9, 0xabd: 0x04c1, 0xabe: 0x04c9, 0xabf: 0x04d1, + // Block 0x2b, offset 0xac0 + 0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008, + 0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008, + 0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008, + 0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0xe00d, 0xad7: 0x0008, + 0xad8: 0xe00d, 0xad9: 0x0008, 0xada: 0xe00d, 0xadb: 0x0008, 0xadc: 0xe00d, 0xadd: 0x0008, + 0xade: 0xe00d, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008, + 0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008, + 0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008, + 0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008, + 0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008, + 0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0xe00d, 0xb01: 0x0008, 0xb02: 0xe00d, 0xb03: 0x0008, 0xb04: 0xe00d, 0xb05: 0x0008, + 0xb06: 0xe00d, 0xb07: 0x0008, 0xb08: 0xe00d, 0xb09: 0x0008, 0xb0a: 0xe00d, 0xb0b: 0x0008, + 0xb0c: 0xe00d, 0xb0d: 0x0008, 0xb0e: 0xe00d, 0xb0f: 0x0008, 0xb10: 0xe00d, 0xb11: 0x0008, + 0xb12: 0xe00d, 0xb13: 0x0008, 0xb14: 0xe00d, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008, + 0xb18: 0x0008, 0xb19: 0x0008, 0xb1a: 0x062d, 0xb1b: 0x064d, 0xb1c: 0x0008, 0xb1d: 0x0008, + 0xb1e: 0x04d9, 0xb1f: 0x0008, 0xb20: 0xe00d, 0xb21: 0x0008, 0xb22: 0xe00d, 0xb23: 0x0008, + 0xb24: 0xe00d, 0xb25: 0x0008, 0xb26: 0xe00d, 0xb27: 0x0008, 0xb28: 0xe00d, 0xb29: 0x0008, + 0xb2a: 0xe00d, 0xb2b: 0x0008, 0xb2c: 0xe00d, 0xb2d: 0x0008, 0xb2e: 0xe00d, 0xb2f: 0x0008, + 0xb30: 0xe00d, 0xb31: 0x0008, 0xb32: 0xe00d, 0xb33: 0x0008, 0xb34: 0xe00d, 0xb35: 0x0008, + 0xb36: 0xe00d, 0xb37: 0x0008, 0xb38: 0xe00d, 0xb39: 0x0008, 0xb3a: 0xe00d, 0xb3b: 0x0008, + 0xb3c: 0xe00d, 0xb3d: 0x0008, 0xb3e: 0xe00d, 0xb3f: 0x0008, + // Block 0x2d, offset 0xb40 + 0xb40: 0x0008, 0xb41: 0x0008, 0xb42: 0x0008, 0xb43: 0x0008, 0xb44: 0x0008, 0xb45: 0x0008, + 0xb46: 0x0040, 0xb47: 0x0040, 0xb48: 0xe045, 0xb49: 0xe045, 0xb4a: 0xe045, 0xb4b: 0xe045, + 0xb4c: 0xe045, 0xb4d: 0xe045, 0xb4e: 0x0040, 0xb4f: 0x0040, 0xb50: 0x0008, 0xb51: 0x0008, + 0xb52: 0x0008, 0xb53: 0x0008, 0xb54: 0x0008, 0xb55: 0x0008, 0xb56: 0x0008, 0xb57: 0x0008, + 0xb58: 0x0040, 0xb59: 0xe045, 0xb5a: 0x0040, 0xb5b: 0xe045, 0xb5c: 0x0040, 0xb5d: 0xe045, + 0xb5e: 0x0040, 0xb5f: 0xe045, 0xb60: 0x0008, 0xb61: 0x0008, 0xb62: 0x0008, 0xb63: 0x0008, + 0xb64: 0x0008, 0xb65: 0x0008, 0xb66: 0x0008, 0xb67: 0x0008, 0xb68: 0xe045, 0xb69: 0xe045, + 0xb6a: 0xe045, 0xb6b: 0xe045, 0xb6c: 0xe045, 0xb6d: 0xe045, 0xb6e: 0xe045, 0xb6f: 0xe045, + 0xb70: 0x0008, 0xb71: 0x04e1, 0xb72: 0x0008, 0xb73: 0x04e9, 0xb74: 0x0008, 0xb75: 0x04f1, + 0xb76: 0x0008, 0xb77: 0x04f9, 0xb78: 0x0008, 0xb79: 0x0501, 0xb7a: 0x0008, 0xb7b: 0x0509, + 0xb7c: 0x0008, 0xb7d: 0x0511, 0xb7e: 0x0040, 0xb7f: 0x0040, + // Block 0x2e, offset 0xb80 + 0xb80: 0x0519, 0xb81: 0x0521, 0xb82: 0x0529, 0xb83: 0x0531, 0xb84: 0x0539, 0xb85: 0x0541, + 0xb86: 0x0549, 0xb87: 0x0551, 0xb88: 0x0519, 0xb89: 0x0521, 0xb8a: 0x0529, 0xb8b: 0x0531, + 0xb8c: 0x0539, 0xb8d: 0x0541, 0xb8e: 0x0549, 0xb8f: 0x0551, 0xb90: 0x0559, 0xb91: 0x0561, + 0xb92: 0x0569, 0xb93: 0x0571, 0xb94: 0x0579, 0xb95: 0x0581, 0xb96: 0x0589, 0xb97: 0x0591, + 0xb98: 0x0559, 0xb99: 0x0561, 0xb9a: 0x0569, 0xb9b: 0x0571, 0xb9c: 0x0579, 0xb9d: 0x0581, + 0xb9e: 0x0589, 0xb9f: 0x0591, 0xba0: 0x0599, 0xba1: 0x05a1, 0xba2: 0x05a9, 0xba3: 0x05b1, + 0xba4: 0x05b9, 0xba5: 0x05c1, 0xba6: 0x05c9, 0xba7: 0x05d1, 0xba8: 0x0599, 0xba9: 0x05a1, + 0xbaa: 0x05a9, 0xbab: 0x05b1, 0xbac: 0x05b9, 0xbad: 0x05c1, 0xbae: 0x05c9, 0xbaf: 0x05d1, + 0xbb0: 0x0008, 0xbb1: 0x0008, 0xbb2: 0x05d9, 0xbb3: 0x05e1, 0xbb4: 0x05e9, 0xbb5: 0x0040, + 0xbb6: 0x0008, 0xbb7: 0x05f1, 0xbb8: 0xe045, 0xbb9: 0xe045, 0xbba: 0x0665, 0xbbb: 0x04e1, + 0xbbc: 0x05e1, 0xbbd: 0x067e, 0xbbe: 0x05f9, 0xbbf: 0x069e, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x06be, 0xbc1: 0x0602, 0xbc2: 0x0609, 0xbc3: 0x0611, 0xbc4: 0x0619, 0xbc5: 0x0040, + 0xbc6: 0x0008, 0xbc7: 0x0621, 0xbc8: 0x06dd, 0xbc9: 0x04e9, 0xbca: 0x06f5, 0xbcb: 0x04f1, + 0xbcc: 0x0611, 0xbcd: 0x062a, 0xbce: 0x0632, 0xbcf: 0x063a, 0xbd0: 0x0008, 0xbd1: 0x0008, + 0xbd2: 0x0008, 0xbd3: 0x0641, 0xbd4: 0x0040, 0xbd5: 0x0040, 0xbd6: 0x0008, 0xbd7: 0x0008, + 0xbd8: 0xe045, 0xbd9: 0xe045, 0xbda: 0x070d, 0xbdb: 0x04f9, 0xbdc: 0x0040, 0xbdd: 0x064a, + 0xbde: 0x0652, 0xbdf: 0x065a, 0xbe0: 0x0008, 0xbe1: 0x0008, 0xbe2: 0x0008, 0xbe3: 0x0661, + 0xbe4: 0x0008, 0xbe5: 0x0008, 0xbe6: 0x0008, 0xbe7: 0x0008, 0xbe8: 0xe045, 0xbe9: 0xe045, + 0xbea: 0x0725, 0xbeb: 0x0509, 0xbec: 0xe04d, 0xbed: 0x066a, 0xbee: 0x012a, 0xbef: 0x0672, + 0xbf0: 0x0040, 0xbf1: 0x0040, 0xbf2: 0x0679, 0xbf3: 0x0681, 0xbf4: 0x0689, 0xbf5: 0x0040, + 0xbf6: 0x0008, 0xbf7: 0x0691, 0xbf8: 0x073d, 0xbf9: 0x0501, 0xbfa: 0x0515, 0xbfb: 0x0511, + 0xbfc: 0x0681, 0xbfd: 0x0756, 0xbfe: 0x0776, 0xbff: 0x0040, + // Block 0x30, offset 0xc00 + 0xc00: 0x000a, 0xc01: 0x000a, 0xc02: 0x000a, 0xc03: 0x000a, 0xc04: 0x000a, 0xc05: 0x000a, + 0xc06: 0x000a, 0xc07: 0x000a, 0xc08: 0x000a, 0xc09: 0x000a, 0xc0a: 0x000a, 0xc0b: 0x03c0, + 0xc0c: 0x0003, 0xc0d: 0x0003, 0xc0e: 0x0340, 0xc0f: 0x0b40, 0xc10: 0x0018, 0xc11: 0xe00d, + 0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x0796, + 0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018, + 0xc1e: 0x0018, 0xc1f: 0x0018, 0xc20: 0x0018, 0xc21: 0x0018, 0xc22: 0x0018, 0xc23: 0x0018, + 0xc24: 0x0040, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0018, 0xc28: 0x0040, 0xc29: 0x0040, + 0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x000a, + 0xc30: 0x0018, 0xc31: 0x0018, 0xc32: 0x0018, 0xc33: 0x0699, 0xc34: 0x06a1, 0xc35: 0x0018, + 0xc36: 0x06a9, 0xc37: 0x06b1, 0xc38: 0x0018, 0xc39: 0x0018, 0xc3a: 0x0018, 0xc3b: 0x0018, + 0xc3c: 0x06ba, 0xc3d: 0x0018, 0xc3e: 0x07b6, 0xc3f: 0x0018, + // Block 0x31, offset 0xc40 + 0xc40: 0x0018, 0xc41: 0x0018, 0xc42: 0x0018, 0xc43: 0x0018, 0xc44: 0x0018, 0xc45: 0x0018, + 0xc46: 0x0018, 0xc47: 0x06c2, 0xc48: 0x06ca, 0xc49: 0x06d2, 0xc4a: 0x0018, 0xc4b: 0x0018, + 0xc4c: 0x0018, 0xc4d: 0x0018, 0xc4e: 0x0018, 0xc4f: 0x0018, 0xc50: 0x0018, 0xc51: 0x0018, + 0xc52: 0x0018, 0xc53: 0x0018, 0xc54: 0x0018, 0xc55: 0x0018, 0xc56: 0x0018, 0xc57: 0x06d9, + 0xc58: 0x0018, 0xc59: 0x0018, 0xc5a: 0x0018, 0xc5b: 0x0018, 0xc5c: 0x0018, 0xc5d: 0x0018, + 0xc5e: 0x0018, 0xc5f: 0x000a, 0xc60: 0x03c0, 0xc61: 0x0340, 0xc62: 0x0340, 0xc63: 0x0340, + 0xc64: 0x03c0, 0xc65: 0x0040, 0xc66: 0x0040, 0xc67: 0x0040, 0xc68: 0x0040, 0xc69: 0x0040, + 0xc6a: 0x0340, 0xc6b: 0x0340, 0xc6c: 0x0340, 0xc6d: 0x0340, 0xc6e: 0x0340, 0xc6f: 0x0340, + 0xc70: 0x06e1, 0xc71: 0x0311, 0xc72: 0x0040, 0xc73: 0x0040, 0xc74: 0x06e9, 0xc75: 0x06f1, + 0xc76: 0x06f9, 0xc77: 0x0701, 0xc78: 0x0709, 0xc79: 0x0711, 0xc7a: 0x071a, 0xc7b: 0x07d5, + 0xc7c: 0x0722, 0xc7d: 0x072a, 0xc7e: 0x0732, 0xc7f: 0x0329, + // Block 0x32, offset 0xc80 + 0xc80: 0x06e1, 0xc81: 0x0049, 0xc82: 0x0029, 0xc83: 0x0031, 0xc84: 0x06e9, 0xc85: 0x06f1, + 0xc86: 0x06f9, 0xc87: 0x0701, 0xc88: 0x0709, 0xc89: 0x0711, 0xc8a: 0x071a, 0xc8b: 0x07ed, + 0xc8c: 0x0722, 0xc8d: 0x072a, 0xc8e: 0x0732, 0xc8f: 0x0040, 0xc90: 0x0019, 0xc91: 0x02f9, + 0xc92: 0x0051, 0xc93: 0x0109, 0xc94: 0x0361, 0xc95: 0x00a9, 0xc96: 0x0319, 0xc97: 0x0101, + 0xc98: 0x0321, 0xc99: 0x0329, 0xc9a: 0x0339, 0xc9b: 0x0089, 0xc9c: 0x0341, 0xc9d: 0x0040, + 0xc9e: 0x0040, 0xc9f: 0x0040, 0xca0: 0x0018, 0xca1: 0x0018, 0xca2: 0x0018, 0xca3: 0x0018, + 0xca4: 0x0018, 0xca5: 0x0018, 0xca6: 0x0018, 0xca7: 0x0018, 0xca8: 0x0739, 0xca9: 0x0018, + 0xcaa: 0x0018, 0xcab: 0x0018, 0xcac: 0x0018, 0xcad: 0x0018, 0xcae: 0x0018, 0xcaf: 0x0018, + 0xcb0: 0x0018, 0xcb1: 0x0018, 0xcb2: 0x0018, 0xcb3: 0x0018, 0xcb4: 0x0018, 0xcb5: 0x0018, + 0xcb6: 0x0018, 0xcb7: 0x0018, 0xcb8: 0x0018, 0xcb9: 0x0018, 0xcba: 0x0018, 0xcbb: 0x0018, + 0xcbc: 0x0018, 0xcbd: 0x0018, 0xcbe: 0x0018, 0xcbf: 0x0018, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0806, 0xcc1: 0x0826, 0xcc2: 0x03d9, 0xcc3: 0x0845, 0xcc4: 0x0018, 0xcc5: 0x0866, + 0xcc6: 0x0886, 0xcc7: 0x0369, 0xcc8: 0x0018, 0xcc9: 0x08a5, 0xcca: 0x0309, 0xccb: 0x00a9, + 0xccc: 0x00a9, 0xccd: 0x00a9, 0xcce: 0x00a9, 0xccf: 0x0741, 0xcd0: 0x0311, 0xcd1: 0x0311, + 0xcd2: 0x0101, 0xcd3: 0x0101, 0xcd4: 0x0018, 0xcd5: 0x0329, 0xcd6: 0x0749, 0xcd7: 0x0018, + 0xcd8: 0x0018, 0xcd9: 0x0339, 0xcda: 0x0751, 0xcdb: 0x00b9, 0xcdc: 0x00b9, 0xcdd: 0x00b9, + 0xcde: 0x0018, 0xcdf: 0x0018, 0xce0: 0x0759, 0xce1: 0x08c5, 0xce2: 0x0761, 0xce3: 0x0018, + 0xce4: 0x04b1, 0xce5: 0x0018, 0xce6: 0x0769, 0xce7: 0x0018, 0xce8: 0x04b1, 0xce9: 0x0018, + 0xcea: 0x0319, 0xceb: 0x0771, 0xcec: 0x02e9, 0xced: 0x03d9, 0xcee: 0x0018, 0xcef: 0x02f9, + 0xcf0: 0x02f9, 0xcf1: 0x03f1, 0xcf2: 0x0040, 0xcf3: 0x0321, 0xcf4: 0x0051, 0xcf5: 0x0779, + 0xcf6: 0x0781, 0xcf7: 0x0789, 0xcf8: 0x0791, 0xcf9: 0x0311, 0xcfa: 0x0018, 0xcfb: 0x08e5, + 0xcfc: 0x0799, 0xcfd: 0x03a1, 0xcfe: 0x03a1, 0xcff: 0x0799, + // Block 0x34, offset 0xd00 + 0xd00: 0x0905, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x02f1, + 0xd06: 0x02f1, 0xd07: 0x02f9, 0xd08: 0x0311, 0xd09: 0x00b1, 0xd0a: 0x0018, 0xd0b: 0x0018, + 0xd0c: 0x0018, 0xd0d: 0x0018, 0xd0e: 0x0008, 0xd0f: 0x0018, 0xd10: 0x07a1, 0xd11: 0x07a9, + 0xd12: 0x07b1, 0xd13: 0x07b9, 0xd14: 0x07c1, 0xd15: 0x07c9, 0xd16: 0x07d1, 0xd17: 0x07d9, + 0xd18: 0x07e1, 0xd19: 0x07e9, 0xd1a: 0x07f1, 0xd1b: 0x07f9, 0xd1c: 0x0801, 0xd1d: 0x0809, + 0xd1e: 0x0811, 0xd1f: 0x0819, 0xd20: 0x0311, 0xd21: 0x0821, 0xd22: 0x091d, 0xd23: 0x0829, + 0xd24: 0x0391, 0xd25: 0x0831, 0xd26: 0x093d, 0xd27: 0x0839, 0xd28: 0x0841, 0xd29: 0x0109, + 0xd2a: 0x0849, 0xd2b: 0x095d, 0xd2c: 0x0101, 0xd2d: 0x03d9, 0xd2e: 0x02f1, 0xd2f: 0x0321, + 0xd30: 0x0311, 0xd31: 0x0821, 0xd32: 0x097d, 0xd33: 0x0829, 0xd34: 0x0391, 0xd35: 0x0831, + 0xd36: 0x099d, 0xd37: 0x0839, 0xd38: 0x0841, 0xd39: 0x0109, 0xd3a: 0x0849, 0xd3b: 0x09bd, + 0xd3c: 0x0101, 0xd3d: 0x03d9, 0xd3e: 0x02f1, 0xd3f: 0x0321, + // Block 0x35, offset 0xd40 + 0xd40: 0x0018, 0xd41: 0x0018, 0xd42: 0x0018, 0xd43: 0x0018, 0xd44: 0x0018, 0xd45: 0x0018, + 0xd46: 0x0018, 0xd47: 0x0018, 0xd48: 0x0018, 0xd49: 0x0018, 0xd4a: 0x0018, 0xd4b: 0x0040, + 0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040, + 0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040, + 0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0040, 0xd5d: 0x0040, + 0xd5e: 0x0040, 0xd5f: 0x0040, 0xd60: 0x0049, 0xd61: 0x0029, 0xd62: 0x0031, 0xd63: 0x06e9, + 0xd64: 0x06f1, 0xd65: 0x06f9, 0xd66: 0x0701, 0xd67: 0x0709, 0xd68: 0x0711, 0xd69: 0x0879, + 0xd6a: 0x0881, 0xd6b: 0x0889, 0xd6c: 0x0891, 0xd6d: 0x0899, 0xd6e: 0x08a1, 0xd6f: 0x08a9, + 0xd70: 0x08b1, 0xd71: 0x08b9, 0xd72: 0x08c1, 0xd73: 0x08c9, 0xd74: 0x0a1e, 0xd75: 0x0a3e, + 0xd76: 0x0a5e, 0xd77: 0x0a7e, 0xd78: 0x0a9e, 0xd79: 0x0abe, 0xd7a: 0x0ade, 0xd7b: 0x0afe, + 0xd7c: 0x0b1e, 0xd7d: 0x08d2, 0xd7e: 0x08da, 0xd7f: 0x08e2, + // Block 0x36, offset 0xd80 + 0xd80: 0x08ea, 0xd81: 0x08f2, 0xd82: 0x08fa, 0xd83: 0x0902, 0xd84: 0x090a, 0xd85: 0x0912, + 0xd86: 0x091a, 0xd87: 0x0922, 0xd88: 0x0040, 0xd89: 0x0040, 0xd8a: 0x0040, 0xd8b: 0x0040, + 0xd8c: 0x0040, 0xd8d: 0x0040, 0xd8e: 0x0040, 0xd8f: 0x0040, 0xd90: 0x0040, 0xd91: 0x0040, + 0xd92: 0x0040, 0xd93: 0x0040, 0xd94: 0x0040, 0xd95: 0x0040, 0xd96: 0x0040, 0xd97: 0x0040, + 0xd98: 0x0040, 0xd99: 0x0040, 0xd9a: 0x0040, 0xd9b: 0x0040, 0xd9c: 0x0b3e, 0xd9d: 0x0b5e, + 0xd9e: 0x0b7e, 0xd9f: 0x0b9e, 0xda0: 0x0bbe, 0xda1: 0x0bde, 0xda2: 0x0bfe, 0xda3: 0x0c1e, + 0xda4: 0x0c3e, 0xda5: 0x0c5e, 0xda6: 0x0c7e, 0xda7: 0x0c9e, 0xda8: 0x0cbe, 0xda9: 0x0cde, + 0xdaa: 0x0cfe, 0xdab: 0x0d1e, 0xdac: 0x0d3e, 0xdad: 0x0d5e, 0xdae: 0x0d7e, 0xdaf: 0x0d9e, + 0xdb0: 0x0dbe, 0xdb1: 0x0dde, 0xdb2: 0x0dfe, 0xdb3: 0x0e1e, 0xdb4: 0x0e3e, 0xdb5: 0x0e5e, + 0xdb6: 0x0019, 0xdb7: 0x02e9, 0xdb8: 0x03d9, 0xdb9: 0x02f1, 0xdba: 0x02f9, 0xdbb: 0x03f1, + 0xdbc: 0x0309, 0xdbd: 0x00a9, 0xdbe: 0x0311, 0xdbf: 0x00b1, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0319, 0xdc1: 0x0101, 0xdc2: 0x0321, 0xdc3: 0x0329, 0xdc4: 0x0051, 0xdc5: 0x0339, + 0xdc6: 0x0751, 0xdc7: 0x00b9, 0xdc8: 0x0089, 0xdc9: 0x0341, 0xdca: 0x0349, 0xdcb: 0x0391, + 0xdcc: 0x00c1, 0xdcd: 0x0109, 0xdce: 0x00c9, 0xdcf: 0x04b1, 0xdd0: 0x0019, 0xdd1: 0x02e9, + 0xdd2: 0x03d9, 0xdd3: 0x02f1, 0xdd4: 0x02f9, 0xdd5: 0x03f1, 0xdd6: 0x0309, 0xdd7: 0x00a9, + 0xdd8: 0x0311, 0xdd9: 0x00b1, 0xdda: 0x0319, 0xddb: 0x0101, 0xddc: 0x0321, 0xddd: 0x0329, + 0xdde: 0x0051, 0xddf: 0x0339, 0xde0: 0x0751, 0xde1: 0x00b9, 0xde2: 0x0089, 0xde3: 0x0341, + 0xde4: 0x0349, 0xde5: 0x0391, 0xde6: 0x00c1, 0xde7: 0x0109, 0xde8: 0x00c9, 0xde9: 0x04b1, + 0xdea: 0x06e1, 0xdeb: 0x0018, 0xdec: 0x0018, 0xded: 0x0018, 0xdee: 0x0018, 0xdef: 0x0018, + 0xdf0: 0x0018, 0xdf1: 0x0018, 0xdf2: 0x0018, 0xdf3: 0x0018, 0xdf4: 0x0018, 0xdf5: 0x0018, + 0xdf6: 0x0018, 0xdf7: 0x0018, 0xdf8: 0x0018, 0xdf9: 0x0018, 0xdfa: 0x0018, 0xdfb: 0x0018, + 0xdfc: 0x0018, 0xdfd: 0x0018, 0xdfe: 0x0018, 0xdff: 0x0018, + // Block 0x38, offset 0xe00 + 0xe00: 0x0008, 0xe01: 0x0008, 0xe02: 0x0008, 0xe03: 0x0008, 0xe04: 0x0008, 0xe05: 0x0008, + 0xe06: 0x0008, 0xe07: 0x0008, 0xe08: 0x0008, 0xe09: 0x0008, 0xe0a: 0x0008, 0xe0b: 0x0008, + 0xe0c: 0x0008, 0xe0d: 0x0008, 0xe0e: 0x0008, 0xe0f: 0x0008, 0xe10: 0x0008, 0xe11: 0x0008, + 0xe12: 0x0008, 0xe13: 0x0008, 0xe14: 0x0008, 0xe15: 0x0008, 0xe16: 0x0008, 0xe17: 0x0008, + 0xe18: 0x0008, 0xe19: 0x0008, 0xe1a: 0x0008, 0xe1b: 0x0008, 0xe1c: 0x0008, 0xe1d: 0x0008, + 0xe1e: 0x0008, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0x0941, 0xe23: 0x0ed5, + 0xe24: 0x0949, 0xe25: 0x0008, 0xe26: 0x0008, 0xe27: 0xe07d, 0xe28: 0x0008, 0xe29: 0xe01d, + 0xe2a: 0x0008, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0x0359, 0xe2e: 0x0441, 0xe2f: 0x0351, + 0xe30: 0x03d1, 0xe31: 0x0008, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0008, 0xe35: 0xe01d, + 0xe36: 0x0008, 0xe37: 0x0008, 0xe38: 0x0008, 0xe39: 0x0008, 0xe3a: 0x0008, 0xe3b: 0x0008, + 0xe3c: 0x00b1, 0xe3d: 0x0391, 0xe3e: 0x0951, 0xe3f: 0x0959, + // Block 0x39, offset 0xe40 + 0xe40: 0xe00d, 0xe41: 0x0008, 0xe42: 0xe00d, 0xe43: 0x0008, 0xe44: 0xe00d, 0xe45: 0x0008, + 0xe46: 0xe00d, 0xe47: 0x0008, 0xe48: 0xe00d, 0xe49: 0x0008, 0xe4a: 0xe00d, 0xe4b: 0x0008, + 0xe4c: 0xe00d, 0xe4d: 0x0008, 0xe4e: 0xe00d, 0xe4f: 0x0008, 0xe50: 0xe00d, 0xe51: 0x0008, + 0xe52: 0xe00d, 0xe53: 0x0008, 0xe54: 0xe00d, 0xe55: 0x0008, 0xe56: 0xe00d, 0xe57: 0x0008, + 0xe58: 0xe00d, 0xe59: 0x0008, 0xe5a: 0xe00d, 0xe5b: 0x0008, 0xe5c: 0xe00d, 0xe5d: 0x0008, + 0xe5e: 0xe00d, 0xe5f: 0x0008, 0xe60: 0xe00d, 0xe61: 0x0008, 0xe62: 0xe00d, 0xe63: 0x0008, + 0xe64: 0x0008, 0xe65: 0x0018, 0xe66: 0x0018, 0xe67: 0x0018, 0xe68: 0x0018, 0xe69: 0x0018, + 0xe6a: 0x0018, 0xe6b: 0xe03d, 0xe6c: 0x0008, 0xe6d: 0xe01d, 0xe6e: 0x0008, 0xe6f: 0x3308, + 0xe70: 0x3308, 0xe71: 0x3308, 0xe72: 0xe00d, 0xe73: 0x0008, 0xe74: 0x0040, 0xe75: 0x0040, + 0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0018, 0xe7a: 0x0018, 0xe7b: 0x0018, + 0xe7c: 0x0018, 0xe7d: 0x0018, 0xe7e: 0x0018, 0xe7f: 0x0018, + // Block 0x3a, offset 0xe80 + 0xe80: 0x2715, 0xe81: 0x2735, 0xe82: 0x2755, 0xe83: 0x2775, 0xe84: 0x2795, 0xe85: 0x27b5, + 0xe86: 0x27d5, 0xe87: 0x27f5, 0xe88: 0x2815, 0xe89: 0x2835, 0xe8a: 0x2855, 0xe8b: 0x2875, + 0xe8c: 0x2895, 0xe8d: 0x28b5, 0xe8e: 0x28d5, 0xe8f: 0x28f5, 0xe90: 0x2915, 0xe91: 0x2935, + 0xe92: 0x2955, 0xe93: 0x2975, 0xe94: 0x2995, 0xe95: 0x29b5, 0xe96: 0x0040, 0xe97: 0x0040, + 0xe98: 0x0040, 0xe99: 0x0040, 0xe9a: 0x0040, 0xe9b: 0x0040, 0xe9c: 0x0040, 0xe9d: 0x0040, + 0xe9e: 0x0040, 0xe9f: 0x0040, 0xea0: 0x0040, 0xea1: 0x0040, 0xea2: 0x0040, 0xea3: 0x0040, + 0xea4: 0x0040, 0xea5: 0x0040, 0xea6: 0x0040, 0xea7: 0x0040, 0xea8: 0x0040, 0xea9: 0x0040, + 0xeaa: 0x0040, 0xeab: 0x0040, 0xeac: 0x0040, 0xead: 0x0040, 0xeae: 0x0040, 0xeaf: 0x0040, + 0xeb0: 0x0040, 0xeb1: 0x0040, 0xeb2: 0x0040, 0xeb3: 0x0040, 0xeb4: 0x0040, 0xeb5: 0x0040, + 0xeb6: 0x0040, 0xeb7: 0x0040, 0xeb8: 0x0040, 0xeb9: 0x0040, 0xeba: 0x0040, 0xebb: 0x0040, + 0xebc: 0x0040, 0xebd: 0x0040, 0xebe: 0x0040, 0xebf: 0x0040, + // Block 0x3b, offset 0xec0 + 0xec0: 0x000a, 0xec1: 0x0018, 0xec2: 0x0961, 0xec3: 0x0018, 0xec4: 0x0018, 0xec5: 0x0008, + 0xec6: 0x0008, 0xec7: 0x0008, 0xec8: 0x0018, 0xec9: 0x0018, 0xeca: 0x0018, 0xecb: 0x0018, + 0xecc: 0x0018, 0xecd: 0x0018, 0xece: 0x0018, 0xecf: 0x0018, 0xed0: 0x0018, 0xed1: 0x0018, + 0xed2: 0x0018, 0xed3: 0x0018, 0xed4: 0x0018, 0xed5: 0x0018, 0xed6: 0x0018, 0xed7: 0x0018, + 0xed8: 0x0018, 0xed9: 0x0018, 0xeda: 0x0018, 0xedb: 0x0018, 0xedc: 0x0018, 0xedd: 0x0018, + 0xede: 0x0018, 0xedf: 0x0018, 0xee0: 0x0018, 0xee1: 0x0018, 0xee2: 0x0018, 0xee3: 0x0018, + 0xee4: 0x0018, 0xee5: 0x0018, 0xee6: 0x0018, 0xee7: 0x0018, 0xee8: 0x0018, 0xee9: 0x0018, + 0xeea: 0x3308, 0xeeb: 0x3308, 0xeec: 0x3308, 0xeed: 0x3308, 0xeee: 0x3018, 0xeef: 0x3018, + 0xef0: 0x0018, 0xef1: 0x0018, 0xef2: 0x0018, 0xef3: 0x0018, 0xef4: 0x0018, 0xef5: 0x0018, + 0xef6: 0xe125, 0xef7: 0x0018, 0xef8: 0x29d5, 0xef9: 0x29f5, 0xefa: 0x2a15, 0xefb: 0x0018, + 0xefc: 0x0008, 0xefd: 0x0018, 0xefe: 0x0018, 0xeff: 0x0018, + // Block 0x3c, offset 0xf00 + 0xf00: 0x2b55, 0xf01: 0x2b75, 0xf02: 0x2b95, 0xf03: 0x2bb5, 0xf04: 0x2bd5, 0xf05: 0x2bf5, + 0xf06: 0x2bf5, 0xf07: 0x2bf5, 0xf08: 0x2c15, 0xf09: 0x2c15, 0xf0a: 0x2c15, 0xf0b: 0x2c15, + 0xf0c: 0x2c35, 0xf0d: 0x2c35, 0xf0e: 0x2c35, 0xf0f: 0x2c55, 0xf10: 0x2c75, 0xf11: 0x2c75, + 0xf12: 0x2a95, 0xf13: 0x2a95, 0xf14: 0x2c75, 0xf15: 0x2c75, 0xf16: 0x2c95, 0xf17: 0x2c95, + 0xf18: 0x2c75, 0xf19: 0x2c75, 0xf1a: 0x2a95, 0xf1b: 0x2a95, 0xf1c: 0x2c75, 0xf1d: 0x2c75, + 0xf1e: 0x2c55, 0xf1f: 0x2c55, 0xf20: 0x2cb5, 0xf21: 0x2cb5, 0xf22: 0x2cd5, 0xf23: 0x2cd5, + 0xf24: 0x0040, 0xf25: 0x2cf5, 0xf26: 0x2d15, 0xf27: 0x2d35, 0xf28: 0x2d35, 0xf29: 0x2d55, + 0xf2a: 0x2d75, 0xf2b: 0x2d95, 0xf2c: 0x2db5, 0xf2d: 0x2dd5, 0xf2e: 0x2df5, 0xf2f: 0x2e15, + 0xf30: 0x2e35, 0xf31: 0x2e55, 0xf32: 0x2e55, 0xf33: 0x2e75, 0xf34: 0x2e95, 0xf35: 0x2e95, + 0xf36: 0x2eb5, 0xf37: 0x2ed5, 0xf38: 0x2e75, 0xf39: 0x2ef5, 0xf3a: 0x2f15, 0xf3b: 0x2ef5, + 0xf3c: 0x2e75, 0xf3d: 0x2f35, 0xf3e: 0x2f55, 0xf3f: 0x2f75, + // Block 0x3d, offset 0xf40 + 0xf40: 0x2f95, 0xf41: 0x2fb5, 0xf42: 0x2d15, 0xf43: 0x2cf5, 0xf44: 0x2fd5, 0xf45: 0x2ff5, + 0xf46: 0x3015, 0xf47: 0x3035, 0xf48: 0x3055, 0xf49: 0x3075, 0xf4a: 0x3095, 0xf4b: 0x30b5, + 0xf4c: 0x30d5, 0xf4d: 0x30f5, 0xf4e: 0x3115, 0xf4f: 0x0040, 0xf50: 0x0018, 0xf51: 0x0018, + 0xf52: 0x3135, 0xf53: 0x3155, 0xf54: 0x3175, 0xf55: 0x3195, 0xf56: 0x31b5, 0xf57: 0x31d5, + 0xf58: 0x31f5, 0xf59: 0x3215, 0xf5a: 0x3235, 0xf5b: 0x3255, 0xf5c: 0x3175, 0xf5d: 0x3275, + 0xf5e: 0x3295, 0xf5f: 0x32b5, 0xf60: 0x0008, 0xf61: 0x0008, 0xf62: 0x0008, 0xf63: 0x0008, + 0xf64: 0x0008, 0xf65: 0x0008, 0xf66: 0x0008, 0xf67: 0x0008, 0xf68: 0x0008, 0xf69: 0x0008, + 0xf6a: 0x0008, 0xf6b: 0x0008, 0xf6c: 0x0008, 0xf6d: 0x0008, 0xf6e: 0x0008, 0xf6f: 0x0008, + 0xf70: 0x0008, 0xf71: 0x0008, 0xf72: 0x0008, 0xf73: 0x0008, 0xf74: 0x0008, 0xf75: 0x0008, + 0xf76: 0x0008, 0xf77: 0x0008, 0xf78: 0x0008, 0xf79: 0x0008, 0xf7a: 0x0008, 0xf7b: 0x0008, + 0xf7c: 0x0008, 0xf7d: 0x0008, 0xf7e: 0x0008, 0xf7f: 0x0008, + // Block 0x3e, offset 0xf80 + 0xf80: 0x0b82, 0xf81: 0x0b8a, 0xf82: 0x0b92, 0xf83: 0x0b9a, 0xf84: 0x32d5, 0xf85: 0x32f5, + 0xf86: 0x3315, 0xf87: 0x3335, 0xf88: 0x0018, 0xf89: 0x0018, 0xf8a: 0x0018, 0xf8b: 0x0018, + 0xf8c: 0x0018, 0xf8d: 0x0018, 0xf8e: 0x0018, 0xf8f: 0x0018, 0xf90: 0x3355, 0xf91: 0x0ba1, + 0xf92: 0x0ba9, 0xf93: 0x0bb1, 0xf94: 0x0bb9, 0xf95: 0x0bc1, 0xf96: 0x0bc9, 0xf97: 0x0bd1, + 0xf98: 0x0bd9, 0xf99: 0x0be1, 0xf9a: 0x0be9, 0xf9b: 0x0bf1, 0xf9c: 0x0bf9, 0xf9d: 0x0c01, + 0xf9e: 0x0c09, 0xf9f: 0x0c11, 0xfa0: 0x3375, 0xfa1: 0x3395, 0xfa2: 0x33b5, 0xfa3: 0x33d5, + 0xfa4: 0x33f5, 0xfa5: 0x33f5, 0xfa6: 0x3415, 0xfa7: 0x3435, 0xfa8: 0x3455, 0xfa9: 0x3475, + 0xfaa: 0x3495, 0xfab: 0x34b5, 0xfac: 0x34d5, 0xfad: 0x34f5, 0xfae: 0x3515, 0xfaf: 0x3535, + 0xfb0: 0x3555, 0xfb1: 0x3575, 0xfb2: 0x3595, 0xfb3: 0x35b5, 0xfb4: 0x35d5, 0xfb5: 0x35f5, + 0xfb6: 0x3615, 0xfb7: 0x3635, 0xfb8: 0x3655, 0xfb9: 0x3675, 0xfba: 0x3695, 0xfbb: 0x36b5, + 0xfbc: 0x0c19, 0xfbd: 0x0c21, 0xfbe: 0x36d5, 0xfbf: 0x0018, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x36f5, 0xfc1: 0x3715, 0xfc2: 0x3735, 0xfc3: 0x3755, 0xfc4: 0x3775, 0xfc5: 0x3795, + 0xfc6: 0x37b5, 0xfc7: 0x37d5, 0xfc8: 0x37f5, 0xfc9: 0x3815, 0xfca: 0x3835, 0xfcb: 0x3855, + 0xfcc: 0x3875, 0xfcd: 0x3895, 0xfce: 0x38b5, 0xfcf: 0x38d5, 0xfd0: 0x38f5, 0xfd1: 0x3915, + 0xfd2: 0x3935, 0xfd3: 0x3955, 0xfd4: 0x3975, 0xfd5: 0x3995, 0xfd6: 0x39b5, 0xfd7: 0x39d5, + 0xfd8: 0x39f5, 0xfd9: 0x3a15, 0xfda: 0x3a35, 0xfdb: 0x3a55, 0xfdc: 0x3a75, 0xfdd: 0x3a95, + 0xfde: 0x3ab5, 0xfdf: 0x3ad5, 0xfe0: 0x3af5, 0xfe1: 0x3b15, 0xfe2: 0x3b35, 0xfe3: 0x3b55, + 0xfe4: 0x3b75, 0xfe5: 0x3b95, 0xfe6: 0x1295, 0xfe7: 0x3bb5, 0xfe8: 0x3bd5, 0xfe9: 0x3bf5, + 0xfea: 0x3c15, 0xfeb: 0x3c35, 0xfec: 0x3c55, 0xfed: 0x3c75, 0xfee: 0x23b5, 0xfef: 0x3c95, + 0xff0: 0x3cb5, 0xff1: 0x0c29, 0xff2: 0x0c31, 0xff3: 0x0c39, 0xff4: 0x0c41, 0xff5: 0x0c49, + 0xff6: 0x0c51, 0xff7: 0x0c59, 0xff8: 0x0c61, 0xff9: 0x0c69, 0xffa: 0x0c71, 0xffb: 0x0c79, + 0xffc: 0x0c81, 0xffd: 0x0c89, 0xffe: 0x0c91, 0xfff: 0x0c99, + // Block 0x40, offset 0x1000 + 0x1000: 0x0ca1, 0x1001: 0x0ca9, 0x1002: 0x0cb1, 0x1003: 0x0cb9, 0x1004: 0x0cc1, 0x1005: 0x0cc9, + 0x1006: 0x0cd1, 0x1007: 0x0cd9, 0x1008: 0x0ce1, 0x1009: 0x0ce9, 0x100a: 0x0cf1, 0x100b: 0x0cf9, + 0x100c: 0x0d01, 0x100d: 0x3cd5, 0x100e: 0x0d09, 0x100f: 0x3cf5, 0x1010: 0x3d15, 0x1011: 0x3d2d, + 0x1012: 0x3d45, 0x1013: 0x3d5d, 0x1014: 0x3d75, 0x1015: 0x3d75, 0x1016: 0x3d5d, 0x1017: 0x3d8d, + 0x1018: 0x07d5, 0x1019: 0x3da5, 0x101a: 0x3dbd, 0x101b: 0x3dd5, 0x101c: 0x3ded, 0x101d: 0x3e05, + 0x101e: 0x3e1d, 0x101f: 0x3e35, 0x1020: 0x3e4d, 0x1021: 0x3e65, 0x1022: 0x3e7d, 0x1023: 0x3e95, + 0x1024: 0x3ead, 0x1025: 0x3ead, 0x1026: 0x3ec5, 0x1027: 0x3ec5, 0x1028: 0x3edd, 0x1029: 0x3edd, + 0x102a: 0x3ef5, 0x102b: 0x3f0d, 0x102c: 0x3f25, 0x102d: 0x3f3d, 0x102e: 0x3f55, 0x102f: 0x3f55, + 0x1030: 0x3f6d, 0x1031: 0x3f6d, 0x1032: 0x3f6d, 0x1033: 0x3f85, 0x1034: 0x3f9d, 0x1035: 0x3fb5, + 0x1036: 0x3fcd, 0x1037: 0x3fb5, 0x1038: 0x3fe5, 0x1039: 0x3ffd, 0x103a: 0x3f85, 0x103b: 0x4015, + 0x103c: 0x402d, 0x103d: 0x402d, 0x103e: 0x402d, 0x103f: 0x0d11, + // Block 0x41, offset 0x1040 + 0x1040: 0x10f9, 0x1041: 0x1101, 0x1042: 0x40a5, 0x1043: 0x1109, 0x1044: 0x1111, 0x1045: 0x1119, + 0x1046: 0x1121, 0x1047: 0x1129, 0x1048: 0x40c5, 0x1049: 0x1131, 0x104a: 0x1139, 0x104b: 0x1141, + 0x104c: 0x40e5, 0x104d: 0x40e5, 0x104e: 0x1149, 0x104f: 0x1151, 0x1050: 0x1159, 0x1051: 0x4105, + 0x1052: 0x4125, 0x1053: 0x4145, 0x1054: 0x4165, 0x1055: 0x4185, 0x1056: 0x1161, 0x1057: 0x1169, + 0x1058: 0x1171, 0x1059: 0x1179, 0x105a: 0x1181, 0x105b: 0x41a5, 0x105c: 0x1189, 0x105d: 0x1191, + 0x105e: 0x1199, 0x105f: 0x41c5, 0x1060: 0x41e5, 0x1061: 0x11a1, 0x1062: 0x4205, 0x1063: 0x4225, + 0x1064: 0x4245, 0x1065: 0x11a9, 0x1066: 0x4265, 0x1067: 0x11b1, 0x1068: 0x11b9, 0x1069: 0x10f9, + 0x106a: 0x4285, 0x106b: 0x42a5, 0x106c: 0x42c5, 0x106d: 0x42e5, 0x106e: 0x11c1, 0x106f: 0x11c9, + 0x1070: 0x11d1, 0x1071: 0x11d9, 0x1072: 0x4305, 0x1073: 0x11e1, 0x1074: 0x11e9, 0x1075: 0x11f1, + 0x1076: 0x4325, 0x1077: 0x11f9, 0x1078: 0x1201, 0x1079: 0x11f9, 0x107a: 0x1209, 0x107b: 0x1211, + 0x107c: 0x4345, 0x107d: 0x1219, 0x107e: 0x1221, 0x107f: 0x1219, + // Block 0x42, offset 0x1080 + 0x1080: 0x4365, 0x1081: 0x4385, 0x1082: 0x0040, 0x1083: 0x1229, 0x1084: 0x1231, 0x1085: 0x1239, + 0x1086: 0x1241, 0x1087: 0x0040, 0x1088: 0x1249, 0x1089: 0x1251, 0x108a: 0x1259, 0x108b: 0x1261, + 0x108c: 0x1269, 0x108d: 0x1271, 0x108e: 0x1199, 0x108f: 0x1279, 0x1090: 0x1281, 0x1091: 0x1289, + 0x1092: 0x43a5, 0x1093: 0x1291, 0x1094: 0x1121, 0x1095: 0x43c5, 0x1096: 0x43e5, 0x1097: 0x1299, + 0x1098: 0x0040, 0x1099: 0x4405, 0x109a: 0x12a1, 0x109b: 0x12a9, 0x109c: 0x12b1, 0x109d: 0x12b9, + 0x109e: 0x12c1, 0x109f: 0x12c9, 0x10a0: 0x12d1, 0x10a1: 0x12d9, 0x10a2: 0x12e1, 0x10a3: 0x12e9, + 0x10a4: 0x12f1, 0x10a5: 0x12f9, 0x10a6: 0x1301, 0x10a7: 0x1309, 0x10a8: 0x1311, 0x10a9: 0x1319, + 0x10aa: 0x1321, 0x10ab: 0x1329, 0x10ac: 0x1331, 0x10ad: 0x1339, 0x10ae: 0x1341, 0x10af: 0x1349, + 0x10b0: 0x1351, 0x10b1: 0x1359, 0x10b2: 0x1361, 0x10b3: 0x1369, 0x10b4: 0x1371, 0x10b5: 0x1379, + 0x10b6: 0x1381, 0x10b7: 0x1389, 0x10b8: 0x1391, 0x10b9: 0x1399, 0x10ba: 0x13a1, 0x10bb: 0x13a9, + 0x10bc: 0x13b1, 0x10bd: 0x13b9, 0x10be: 0x13c1, 0x10bf: 0x4425, + // Block 0x43, offset 0x10c0 + 0x10c0: 0xe00d, 0x10c1: 0x0008, 0x10c2: 0xe00d, 0x10c3: 0x0008, 0x10c4: 0xe00d, 0x10c5: 0x0008, + 0x10c6: 0xe00d, 0x10c7: 0x0008, 0x10c8: 0xe00d, 0x10c9: 0x0008, 0x10ca: 0xe00d, 0x10cb: 0x0008, + 0x10cc: 0xe00d, 0x10cd: 0x0008, 0x10ce: 0xe00d, 0x10cf: 0x0008, 0x10d0: 0xe00d, 0x10d1: 0x0008, + 0x10d2: 0xe00d, 0x10d3: 0x0008, 0x10d4: 0xe00d, 0x10d5: 0x0008, 0x10d6: 0xe00d, 0x10d7: 0x0008, + 0x10d8: 0xe00d, 0x10d9: 0x0008, 0x10da: 0xe00d, 0x10db: 0x0008, 0x10dc: 0xe00d, 0x10dd: 0x0008, + 0x10de: 0xe00d, 0x10df: 0x0008, 0x10e0: 0xe00d, 0x10e1: 0x0008, 0x10e2: 0xe00d, 0x10e3: 0x0008, + 0x10e4: 0xe00d, 0x10e5: 0x0008, 0x10e6: 0xe00d, 0x10e7: 0x0008, 0x10e8: 0xe00d, 0x10e9: 0x0008, + 0x10ea: 0xe00d, 0x10eb: 0x0008, 0x10ec: 0xe00d, 0x10ed: 0x0008, 0x10ee: 0x0008, 0x10ef: 0x3308, + 0x10f0: 0x3318, 0x10f1: 0x3318, 0x10f2: 0x3318, 0x10f3: 0x0018, 0x10f4: 0x3308, 0x10f5: 0x3308, + 0x10f6: 0x3308, 0x10f7: 0x3308, 0x10f8: 0x3308, 0x10f9: 0x3308, 0x10fa: 0x3308, 0x10fb: 0x3308, + 0x10fc: 0x3308, 0x10fd: 0x3308, 0x10fe: 0x0018, 0x10ff: 0x0008, + // Block 0x44, offset 0x1100 + 0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008, + 0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008, + 0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008, + 0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008, + 0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0x02d1, 0x111d: 0x13c9, + 0x111e: 0x3308, 0x111f: 0x3308, 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, 0x1123: 0x0008, + 0x1124: 0x0008, 0x1125: 0x0008, 0x1126: 0x0008, 0x1127: 0x0008, 0x1128: 0x0008, 0x1129: 0x0008, + 0x112a: 0x0008, 0x112b: 0x0008, 0x112c: 0x0008, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x0008, + 0x1130: 0x0008, 0x1131: 0x0008, 0x1132: 0x0008, 0x1133: 0x0008, 0x1134: 0x0008, 0x1135: 0x0008, + 0x1136: 0x0008, 0x1137: 0x0008, 0x1138: 0x0008, 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008, + 0x113c: 0x0008, 0x113d: 0x0008, 0x113e: 0x0008, 0x113f: 0x0008, + // Block 0x45, offset 0x1140 + 0x1140: 0x0018, 0x1141: 0x0018, 0x1142: 0x0018, 0x1143: 0x0018, 0x1144: 0x0018, 0x1145: 0x0018, + 0x1146: 0x0018, 0x1147: 0x0018, 0x1148: 0x0018, 0x1149: 0x0018, 0x114a: 0x0018, 0x114b: 0x0018, + 0x114c: 0x0018, 0x114d: 0x0018, 0x114e: 0x0018, 0x114f: 0x0018, 0x1150: 0x0018, 0x1151: 0x0018, + 0x1152: 0x0018, 0x1153: 0x0018, 0x1154: 0x0018, 0x1155: 0x0018, 0x1156: 0x0018, 0x1157: 0x0008, + 0x1158: 0x0008, 0x1159: 0x0008, 0x115a: 0x0008, 0x115b: 0x0008, 0x115c: 0x0008, 0x115d: 0x0008, + 0x115e: 0x0008, 0x115f: 0x0008, 0x1160: 0x0018, 0x1161: 0x0018, 0x1162: 0xe00d, 0x1163: 0x0008, + 0x1164: 0xe00d, 0x1165: 0x0008, 0x1166: 0xe00d, 0x1167: 0x0008, 0x1168: 0xe00d, 0x1169: 0x0008, + 0x116a: 0xe00d, 0x116b: 0x0008, 0x116c: 0xe00d, 0x116d: 0x0008, 0x116e: 0xe00d, 0x116f: 0x0008, + 0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0xe00d, 0x1173: 0x0008, 0x1174: 0xe00d, 0x1175: 0x0008, + 0x1176: 0xe00d, 0x1177: 0x0008, 0x1178: 0xe00d, 0x1179: 0x0008, 0x117a: 0xe00d, 0x117b: 0x0008, + 0x117c: 0xe00d, 0x117d: 0x0008, 0x117e: 0xe00d, 0x117f: 0x0008, + // Block 0x46, offset 0x1180 + 0x1180: 0xe00d, 0x1181: 0x0008, 0x1182: 0xe00d, 0x1183: 0x0008, 0x1184: 0xe00d, 0x1185: 0x0008, + 0x1186: 0xe00d, 0x1187: 0x0008, 0x1188: 0xe00d, 0x1189: 0x0008, 0x118a: 0xe00d, 0x118b: 0x0008, + 0x118c: 0xe00d, 0x118d: 0x0008, 0x118e: 0xe00d, 0x118f: 0x0008, 0x1190: 0xe00d, 0x1191: 0x0008, + 0x1192: 0xe00d, 0x1193: 0x0008, 0x1194: 0xe00d, 0x1195: 0x0008, 0x1196: 0xe00d, 0x1197: 0x0008, + 0x1198: 0xe00d, 0x1199: 0x0008, 0x119a: 0xe00d, 0x119b: 0x0008, 0x119c: 0xe00d, 0x119d: 0x0008, + 0x119e: 0xe00d, 0x119f: 0x0008, 0x11a0: 0xe00d, 0x11a1: 0x0008, 0x11a2: 0xe00d, 0x11a3: 0x0008, + 0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008, + 0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008, + 0x11b0: 0xe0fd, 0x11b1: 0x0008, 0x11b2: 0x0008, 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008, + 0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0xe01d, 0x11ba: 0x0008, 0x11bb: 0xe03d, + 0x11bc: 0x0008, 0x11bd: 0x4445, 0x11be: 0xe00d, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008, + 0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0x0008, 0x11c9: 0x0018, 0x11ca: 0x0018, 0x11cb: 0xe03d, + 0x11cc: 0x0008, 0x11cd: 0x0409, 0x11ce: 0x0008, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008, + 0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0x0008, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008, + 0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008, + 0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008, + 0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008, + 0x11ea: 0x13d1, 0x11eb: 0x0371, 0x11ec: 0x0401, 0x11ed: 0x13d9, 0x11ee: 0x0421, 0x11ef: 0x0008, + 0x11f0: 0x13e1, 0x11f1: 0x13e9, 0x11f2: 0x0429, 0x11f3: 0x4465, 0x11f4: 0xe00d, 0x11f5: 0x0008, + 0x11f6: 0xe00d, 0x11f7: 0x0008, 0x11f8: 0xe00d, 0x11f9: 0x0008, 0x11fa: 0xe00d, 0x11fb: 0x0008, + 0x11fc: 0xe00d, 0x11fd: 0x0008, 0x11fe: 0xe00d, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0x03f5, 0x1205: 0x0479, + 0x1206: 0x447d, 0x1207: 0xe07d, 0x1208: 0x0008, 0x1209: 0xe01d, 0x120a: 0x0008, 0x120b: 0x0040, + 0x120c: 0x0040, 0x120d: 0x0040, 0x120e: 0x0040, 0x120f: 0x0040, 0x1210: 0xe00d, 0x1211: 0x0008, + 0x1212: 0x0040, 0x1213: 0x0008, 0x1214: 0x0040, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008, + 0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0x0040, 0x121b: 0x0040, 0x121c: 0x0040, 0x121d: 0x0040, + 0x121e: 0x0040, 0x121f: 0x0040, 0x1220: 0x0040, 0x1221: 0x0040, 0x1222: 0x0040, 0x1223: 0x0040, + 0x1224: 0x0040, 0x1225: 0x0040, 0x1226: 0x0040, 0x1227: 0x0040, 0x1228: 0x0040, 0x1229: 0x0040, + 0x122a: 0x0040, 0x122b: 0x0040, 0x122c: 0x0040, 0x122d: 0x0040, 0x122e: 0x0040, 0x122f: 0x0040, + 0x1230: 0x0040, 0x1231: 0x0040, 0x1232: 0x03d9, 0x1233: 0x03f1, 0x1234: 0x0751, 0x1235: 0xe01d, + 0x1236: 0x0008, 0x1237: 0x0008, 0x1238: 0x0741, 0x1239: 0x13f1, 0x123a: 0x0008, 0x123b: 0x0008, + 0x123c: 0x0008, 0x123d: 0x0008, 0x123e: 0x0008, 0x123f: 0x0008, + // Block 0x49, offset 0x1240 + 0x1240: 0x650d, 0x1241: 0x652d, 0x1242: 0x654d, 0x1243: 0x656d, 0x1244: 0x658d, 0x1245: 0x65ad, + 0x1246: 0x65cd, 0x1247: 0x65ed, 0x1248: 0x660d, 0x1249: 0x662d, 0x124a: 0x664d, 0x124b: 0x666d, + 0x124c: 0x668d, 0x124d: 0x66ad, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x66cd, 0x1251: 0x0008, + 0x1252: 0x66ed, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x670d, 0x1256: 0x672d, 0x1257: 0x674d, + 0x1258: 0x676d, 0x1259: 0x678d, 0x125a: 0x67ad, 0x125b: 0x67cd, 0x125c: 0x67ed, 0x125d: 0x680d, + 0x125e: 0x682d, 0x125f: 0x0008, 0x1260: 0x684d, 0x1261: 0x0008, 0x1262: 0x686d, 0x1263: 0x0008, + 0x1264: 0x0008, 0x1265: 0x688d, 0x1266: 0x68ad, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008, + 0x126a: 0x68cd, 0x126b: 0x68ed, 0x126c: 0x690d, 0x126d: 0x692d, 0x126e: 0x694d, 0x126f: 0x696d, + 0x1270: 0x698d, 0x1271: 0x69ad, 0x1272: 0x69cd, 0x1273: 0x69ed, 0x1274: 0x6a0d, 0x1275: 0x6a2d, + 0x1276: 0x6a4d, 0x1277: 0x6a6d, 0x1278: 0x6a8d, 0x1279: 0x6aad, 0x127a: 0x6acd, 0x127b: 0x6aed, + 0x127c: 0x6b0d, 0x127d: 0x6b2d, 0x127e: 0x6b4d, 0x127f: 0x6b6d, + // Block 0x4a, offset 0x1280 + 0x1280: 0x7acd, 0x1281: 0x7aed, 0x1282: 0x7b0d, 0x1283: 0x7b2d, 0x1284: 0x7b4d, 0x1285: 0x7b6d, + 0x1286: 0x7b8d, 0x1287: 0x7bad, 0x1288: 0x7bcd, 0x1289: 0x7bed, 0x128a: 0x7c0d, 0x128b: 0x7c2d, + 0x128c: 0x7c4d, 0x128d: 0x7c6d, 0x128e: 0x7c8d, 0x128f: 0x1409, 0x1290: 0x1411, 0x1291: 0x1419, + 0x1292: 0x7cad, 0x1293: 0x7ccd, 0x1294: 0x7ced, 0x1295: 0x1421, 0x1296: 0x1429, 0x1297: 0x1431, + 0x1298: 0x7d0d, 0x1299: 0x7d2d, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040, + 0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040, + 0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040, + 0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040, + 0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040, + 0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040, + 0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x1439, 0x12c1: 0x1441, 0x12c2: 0x1449, 0x12c3: 0x7d4d, 0x12c4: 0x7d6d, 0x12c5: 0x1451, + 0x12c6: 0x1451, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040, + 0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040, + 0x12d2: 0x0040, 0x12d3: 0x1459, 0x12d4: 0x1461, 0x12d5: 0x1469, 0x12d6: 0x1471, 0x12d7: 0x1479, + 0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x1481, + 0x12de: 0x3308, 0x12df: 0x1489, 0x12e0: 0x1491, 0x12e1: 0x0779, 0x12e2: 0x0791, 0x12e3: 0x1499, + 0x12e4: 0x14a1, 0x12e5: 0x14a9, 0x12e6: 0x14b1, 0x12e7: 0x14b9, 0x12e8: 0x14c1, 0x12e9: 0x071a, + 0x12ea: 0x14c9, 0x12eb: 0x14d1, 0x12ec: 0x14d9, 0x12ed: 0x14e1, 0x12ee: 0x14e9, 0x12ef: 0x14f1, + 0x12f0: 0x14f9, 0x12f1: 0x1501, 0x12f2: 0x1509, 0x12f3: 0x1511, 0x12f4: 0x1519, 0x12f5: 0x1521, + 0x12f6: 0x1529, 0x12f7: 0x0040, 0x12f8: 0x1531, 0x12f9: 0x1539, 0x12fa: 0x1541, 0x12fb: 0x1549, + 0x12fc: 0x1551, 0x12fd: 0x0040, 0x12fe: 0x1559, 0x12ff: 0x0040, + // Block 0x4c, offset 0x1300 + 0x1300: 0x1561, 0x1301: 0x1569, 0x1302: 0x0040, 0x1303: 0x1571, 0x1304: 0x1579, 0x1305: 0x0040, + 0x1306: 0x1581, 0x1307: 0x1589, 0x1308: 0x1591, 0x1309: 0x1599, 0x130a: 0x15a1, 0x130b: 0x15a9, + 0x130c: 0x15b1, 0x130d: 0x15b9, 0x130e: 0x15c1, 0x130f: 0x15c9, 0x1310: 0x15d1, 0x1311: 0x15d1, + 0x1312: 0x15d9, 0x1313: 0x15d9, 0x1314: 0x15d9, 0x1315: 0x15d9, 0x1316: 0x15e1, 0x1317: 0x15e1, + 0x1318: 0x15e1, 0x1319: 0x15e1, 0x131a: 0x15e9, 0x131b: 0x15e9, 0x131c: 0x15e9, 0x131d: 0x15e9, + 0x131e: 0x15f1, 0x131f: 0x15f1, 0x1320: 0x15f1, 0x1321: 0x15f1, 0x1322: 0x15f9, 0x1323: 0x15f9, + 0x1324: 0x15f9, 0x1325: 0x15f9, 0x1326: 0x1601, 0x1327: 0x1601, 0x1328: 0x1601, 0x1329: 0x1601, + 0x132a: 0x1609, 0x132b: 0x1609, 0x132c: 0x1609, 0x132d: 0x1609, 0x132e: 0x1611, 0x132f: 0x1611, + 0x1330: 0x1611, 0x1331: 0x1611, 0x1332: 0x1619, 0x1333: 0x1619, 0x1334: 0x1619, 0x1335: 0x1619, + 0x1336: 0x1621, 0x1337: 0x1621, 0x1338: 0x1621, 0x1339: 0x1621, 0x133a: 0x1629, 0x133b: 0x1629, + 0x133c: 0x1629, 0x133d: 0x1629, 0x133e: 0x1631, 0x133f: 0x1631, + // Block 0x4d, offset 0x1340 + 0x1340: 0x1631, 0x1341: 0x1631, 0x1342: 0x1639, 0x1343: 0x1639, 0x1344: 0x1641, 0x1345: 0x1641, + 0x1346: 0x1649, 0x1347: 0x1649, 0x1348: 0x1651, 0x1349: 0x1651, 0x134a: 0x1659, 0x134b: 0x1659, + 0x134c: 0x1661, 0x134d: 0x1661, 0x134e: 0x1669, 0x134f: 0x1669, 0x1350: 0x1669, 0x1351: 0x1669, + 0x1352: 0x1671, 0x1353: 0x1671, 0x1354: 0x1671, 0x1355: 0x1671, 0x1356: 0x1679, 0x1357: 0x1679, + 0x1358: 0x1679, 0x1359: 0x1679, 0x135a: 0x1681, 0x135b: 0x1681, 0x135c: 0x1681, 0x135d: 0x1681, + 0x135e: 0x1689, 0x135f: 0x1689, 0x1360: 0x1691, 0x1361: 0x1691, 0x1362: 0x1691, 0x1363: 0x1691, + 0x1364: 0x1699, 0x1365: 0x1699, 0x1366: 0x16a1, 0x1367: 0x16a1, 0x1368: 0x16a1, 0x1369: 0x16a1, + 0x136a: 0x16a9, 0x136b: 0x16a9, 0x136c: 0x16a9, 0x136d: 0x16a9, 0x136e: 0x16b1, 0x136f: 0x16b1, + 0x1370: 0x16b9, 0x1371: 0x16b9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818, + 0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818, + 0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0818, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040, + 0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040, + 0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040, + 0x1392: 0x0040, 0x1393: 0x16c1, 0x1394: 0x16c1, 0x1395: 0x16c1, 0x1396: 0x16c1, 0x1397: 0x16c9, + 0x1398: 0x16c9, 0x1399: 0x16d1, 0x139a: 0x16d1, 0x139b: 0x16d9, 0x139c: 0x16d9, 0x139d: 0x0149, + 0x139e: 0x16e1, 0x139f: 0x16e1, 0x13a0: 0x16e9, 0x13a1: 0x16e9, 0x13a2: 0x16f1, 0x13a3: 0x16f1, + 0x13a4: 0x16f9, 0x13a5: 0x16f9, 0x13a6: 0x16f9, 0x13a7: 0x16f9, 0x13a8: 0x1701, 0x13a9: 0x1701, + 0x13aa: 0x1709, 0x13ab: 0x1709, 0x13ac: 0x1711, 0x13ad: 0x1711, 0x13ae: 0x1719, 0x13af: 0x1719, + 0x13b0: 0x1721, 0x13b1: 0x1721, 0x13b2: 0x1729, 0x13b3: 0x1729, 0x13b4: 0x1731, 0x13b5: 0x1731, + 0x13b6: 0x1739, 0x13b7: 0x1739, 0x13b8: 0x1739, 0x13b9: 0x1741, 0x13ba: 0x1741, 0x13bb: 0x1741, + 0x13bc: 0x1749, 0x13bd: 0x1749, 0x13be: 0x1749, 0x13bf: 0x1749, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x1949, 0x13c1: 0x1951, 0x13c2: 0x1959, 0x13c3: 0x1961, 0x13c4: 0x1969, 0x13c5: 0x1971, + 0x13c6: 0x1979, 0x13c7: 0x1981, 0x13c8: 0x1989, 0x13c9: 0x1991, 0x13ca: 0x1999, 0x13cb: 0x19a1, + 0x13cc: 0x19a9, 0x13cd: 0x19b1, 0x13ce: 0x19b9, 0x13cf: 0x19c1, 0x13d0: 0x19c9, 0x13d1: 0x19d1, + 0x13d2: 0x19d9, 0x13d3: 0x19e1, 0x13d4: 0x19e9, 0x13d5: 0x19f1, 0x13d6: 0x19f9, 0x13d7: 0x1a01, + 0x13d8: 0x1a09, 0x13d9: 0x1a11, 0x13da: 0x1a19, 0x13db: 0x1a21, 0x13dc: 0x1a29, 0x13dd: 0x1a31, + 0x13de: 0x1a3a, 0x13df: 0x1a42, 0x13e0: 0x1a4a, 0x13e1: 0x1a52, 0x13e2: 0x1a5a, 0x13e3: 0x1a62, + 0x13e4: 0x1a69, 0x13e5: 0x1a71, 0x13e6: 0x1761, 0x13e7: 0x1a79, 0x13e8: 0x1741, 0x13e9: 0x1769, + 0x13ea: 0x1a81, 0x13eb: 0x1a89, 0x13ec: 0x1789, 0x13ed: 0x1a91, 0x13ee: 0x1791, 0x13ef: 0x1799, + 0x13f0: 0x1a99, 0x13f1: 0x1aa1, 0x13f2: 0x17b9, 0x13f3: 0x1aa9, 0x13f4: 0x17c1, 0x13f5: 0x17c9, + 0x13f6: 0x1ab1, 0x13f7: 0x1ab9, 0x13f8: 0x17d9, 0x13f9: 0x1ac1, 0x13fa: 0x17e1, 0x13fb: 0x17e9, + 0x13fc: 0x18d1, 0x13fd: 0x18d9, 0x13fe: 0x18f1, 0x13ff: 0x18f9, + // Block 0x50, offset 0x1400 + 0x1400: 0x1901, 0x1401: 0x1921, 0x1402: 0x1929, 0x1403: 0x1931, 0x1404: 0x1939, 0x1405: 0x1959, + 0x1406: 0x1961, 0x1407: 0x1969, 0x1408: 0x1ac9, 0x1409: 0x1989, 0x140a: 0x1ad1, 0x140b: 0x1ad9, + 0x140c: 0x19b9, 0x140d: 0x1ae1, 0x140e: 0x19c1, 0x140f: 0x19c9, 0x1410: 0x1a31, 0x1411: 0x1ae9, + 0x1412: 0x1af1, 0x1413: 0x1a09, 0x1414: 0x1af9, 0x1415: 0x1a11, 0x1416: 0x1a19, 0x1417: 0x1751, + 0x1418: 0x1759, 0x1419: 0x1b01, 0x141a: 0x1761, 0x141b: 0x1b09, 0x141c: 0x1771, 0x141d: 0x1779, + 0x141e: 0x1781, 0x141f: 0x1789, 0x1420: 0x1b11, 0x1421: 0x17a1, 0x1422: 0x17a9, 0x1423: 0x17b1, + 0x1424: 0x17b9, 0x1425: 0x1b19, 0x1426: 0x17d9, 0x1427: 0x17f1, 0x1428: 0x17f9, 0x1429: 0x1801, + 0x142a: 0x1809, 0x142b: 0x1811, 0x142c: 0x1821, 0x142d: 0x1829, 0x142e: 0x1831, 0x142f: 0x1839, + 0x1430: 0x1841, 0x1431: 0x1849, 0x1432: 0x1b21, 0x1433: 0x1851, 0x1434: 0x1859, 0x1435: 0x1861, + 0x1436: 0x1869, 0x1437: 0x1871, 0x1438: 0x1879, 0x1439: 0x1889, 0x143a: 0x1891, 0x143b: 0x1899, + 0x143c: 0x18a1, 0x143d: 0x18a9, 0x143e: 0x18b1, 0x143f: 0x18b9, + // Block 0x51, offset 0x1440 + 0x1440: 0x18c1, 0x1441: 0x18c9, 0x1442: 0x18e1, 0x1443: 0x18e9, 0x1444: 0x1909, 0x1445: 0x1911, + 0x1446: 0x1919, 0x1447: 0x1921, 0x1448: 0x1929, 0x1449: 0x1941, 0x144a: 0x1949, 0x144b: 0x1951, + 0x144c: 0x1959, 0x144d: 0x1b29, 0x144e: 0x1971, 0x144f: 0x1979, 0x1450: 0x1981, 0x1451: 0x1989, + 0x1452: 0x19a1, 0x1453: 0x19a9, 0x1454: 0x19b1, 0x1455: 0x19b9, 0x1456: 0x1b31, 0x1457: 0x19d1, + 0x1458: 0x19d9, 0x1459: 0x1b39, 0x145a: 0x19f1, 0x145b: 0x19f9, 0x145c: 0x1a01, 0x145d: 0x1a09, + 0x145e: 0x1b41, 0x145f: 0x1761, 0x1460: 0x1b09, 0x1461: 0x1789, 0x1462: 0x1b11, 0x1463: 0x17b9, + 0x1464: 0x1b19, 0x1465: 0x17d9, 0x1466: 0x1b49, 0x1467: 0x1841, 0x1468: 0x1b51, 0x1469: 0x1b59, + 0x146a: 0x1b61, 0x146b: 0x1921, 0x146c: 0x1929, 0x146d: 0x1959, 0x146e: 0x19b9, 0x146f: 0x1b31, + 0x1470: 0x1a09, 0x1471: 0x1b41, 0x1472: 0x1b69, 0x1473: 0x1b71, 0x1474: 0x1b79, 0x1475: 0x1b81, + 0x1476: 0x1b89, 0x1477: 0x1b91, 0x1478: 0x1b99, 0x1479: 0x1ba1, 0x147a: 0x1ba9, 0x147b: 0x1bb1, + 0x147c: 0x1bb9, 0x147d: 0x1bc1, 0x147e: 0x1bc9, 0x147f: 0x1bd1, + // Block 0x52, offset 0x1480 + 0x1480: 0x1bd9, 0x1481: 0x1be1, 0x1482: 0x1be9, 0x1483: 0x1bf1, 0x1484: 0x1bf9, 0x1485: 0x1c01, + 0x1486: 0x1c09, 0x1487: 0x1c11, 0x1488: 0x1c19, 0x1489: 0x1c21, 0x148a: 0x1c29, 0x148b: 0x1c31, + 0x148c: 0x1b59, 0x148d: 0x1c39, 0x148e: 0x1c41, 0x148f: 0x1c49, 0x1490: 0x1c51, 0x1491: 0x1b81, + 0x1492: 0x1b89, 0x1493: 0x1b91, 0x1494: 0x1b99, 0x1495: 0x1ba1, 0x1496: 0x1ba9, 0x1497: 0x1bb1, + 0x1498: 0x1bb9, 0x1499: 0x1bc1, 0x149a: 0x1bc9, 0x149b: 0x1bd1, 0x149c: 0x1bd9, 0x149d: 0x1be1, + 0x149e: 0x1be9, 0x149f: 0x1bf1, 0x14a0: 0x1bf9, 0x14a1: 0x1c01, 0x14a2: 0x1c09, 0x14a3: 0x1c11, + 0x14a4: 0x1c19, 0x14a5: 0x1c21, 0x14a6: 0x1c29, 0x14a7: 0x1c31, 0x14a8: 0x1b59, 0x14a9: 0x1c39, + 0x14aa: 0x1c41, 0x14ab: 0x1c49, 0x14ac: 0x1c51, 0x14ad: 0x1c21, 0x14ae: 0x1c29, 0x14af: 0x1c31, + 0x14b0: 0x1b59, 0x14b1: 0x1b51, 0x14b2: 0x1b61, 0x14b3: 0x1881, 0x14b4: 0x1829, 0x14b5: 0x1831, + 0x14b6: 0x1839, 0x14b7: 0x1c21, 0x14b8: 0x1c29, 0x14b9: 0x1c31, 0x14ba: 0x1881, 0x14bb: 0x1889, + 0x14bc: 0x1c59, 0x14bd: 0x1c59, 0x14be: 0x0018, 0x14bf: 0x0018, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0018, 0x14c1: 0x0018, 0x14c2: 0x0018, 0x14c3: 0x0018, 0x14c4: 0x0018, 0x14c5: 0x0018, + 0x14c6: 0x0018, 0x14c7: 0x0018, 0x14c8: 0x0018, 0x14c9: 0x0018, 0x14ca: 0x0018, 0x14cb: 0x0018, + 0x14cc: 0x0018, 0x14cd: 0x0018, 0x14ce: 0x0018, 0x14cf: 0x0018, 0x14d0: 0x1c61, 0x14d1: 0x1c69, + 0x14d2: 0x1c69, 0x14d3: 0x1c71, 0x14d4: 0x1c79, 0x14d5: 0x1c81, 0x14d6: 0x1c89, 0x14d7: 0x1c91, + 0x14d8: 0x1c99, 0x14d9: 0x1c99, 0x14da: 0x1ca1, 0x14db: 0x1ca9, 0x14dc: 0x1cb1, 0x14dd: 0x1cb9, + 0x14de: 0x1cc1, 0x14df: 0x1cc9, 0x14e0: 0x1cc9, 0x14e1: 0x1cd1, 0x14e2: 0x1cd9, 0x14e3: 0x1cd9, + 0x14e4: 0x1ce1, 0x14e5: 0x1ce1, 0x14e6: 0x1ce9, 0x14e7: 0x1cf1, 0x14e8: 0x1cf1, 0x14e9: 0x1cf9, + 0x14ea: 0x1d01, 0x14eb: 0x1d01, 0x14ec: 0x1d09, 0x14ed: 0x1d09, 0x14ee: 0x1d11, 0x14ef: 0x1d19, + 0x14f0: 0x1d19, 0x14f1: 0x1d21, 0x14f2: 0x1d21, 0x14f3: 0x1d29, 0x14f4: 0x1d31, 0x14f5: 0x1d39, + 0x14f6: 0x1d41, 0x14f7: 0x1d41, 0x14f8: 0x1d49, 0x14f9: 0x1d51, 0x14fa: 0x1d59, 0x14fb: 0x1d61, + 0x14fc: 0x1d69, 0x14fd: 0x1d69, 0x14fe: 0x1d71, 0x14ff: 0x1d79, + // Block 0x54, offset 0x1500 + 0x1500: 0x1f29, 0x1501: 0x1f31, 0x1502: 0x1f39, 0x1503: 0x1f11, 0x1504: 0x1d39, 0x1505: 0x1ce9, + 0x1506: 0x1f41, 0x1507: 0x1f49, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040, + 0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0018, 0x1510: 0x0040, 0x1511: 0x0040, + 0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040, + 0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040, + 0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040, + 0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040, + 0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040, + 0x1530: 0x1f51, 0x1531: 0x1f59, 0x1532: 0x1f61, 0x1533: 0x1f69, 0x1534: 0x1f71, 0x1535: 0x1f79, + 0x1536: 0x1f81, 0x1537: 0x1f89, 0x1538: 0x1f91, 0x1539: 0x1f99, 0x153a: 0x1fa2, 0x153b: 0x1faa, + 0x153c: 0x1fb1, 0x153d: 0x0018, 0x153e: 0x0018, 0x153f: 0x0018, + // Block 0x55, offset 0x1540 + 0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0, + 0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0, + 0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0x1fba, 0x1551: 0x7d8d, + 0x1552: 0x0040, 0x1553: 0x1fc2, 0x1554: 0x0122, 0x1555: 0x1fca, 0x1556: 0x1fd2, 0x1557: 0x7dad, + 0x1558: 0x7dcd, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040, + 0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308, + 0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308, + 0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308, + 0x1570: 0x0040, 0x1571: 0x7ded, 0x1572: 0x7e0d, 0x1573: 0x1fda, 0x1574: 0x1fda, 0x1575: 0x072a, + 0x1576: 0x0732, 0x1577: 0x1fe2, 0x1578: 0x1fea, 0x1579: 0x7e2d, 0x157a: 0x7e4d, 0x157b: 0x7e6d, + 0x157c: 0x7e2d, 0x157d: 0x7e8d, 0x157e: 0x7ead, 0x157f: 0x7e8d, + // Block 0x56, offset 0x1580 + 0x1580: 0x7ecd, 0x1581: 0x7eed, 0x1582: 0x7f0d, 0x1583: 0x7eed, 0x1584: 0x7f2d, 0x1585: 0x0018, + 0x1586: 0x0018, 0x1587: 0x1ff2, 0x1588: 0x1ffa, 0x1589: 0x7f4e, 0x158a: 0x7f6e, 0x158b: 0x7f8e, + 0x158c: 0x7fae, 0x158d: 0x1fda, 0x158e: 0x1fda, 0x158f: 0x1fda, 0x1590: 0x1fba, 0x1591: 0x7fcd, + 0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x0122, 0x1595: 0x1fc2, 0x1596: 0x1fd2, 0x1597: 0x1fca, + 0x1598: 0x7fed, 0x1599: 0x072a, 0x159a: 0x0732, 0x159b: 0x1fe2, 0x159c: 0x1fea, 0x159d: 0x7ecd, + 0x159e: 0x7f2d, 0x159f: 0x2002, 0x15a0: 0x200a, 0x15a1: 0x2012, 0x15a2: 0x071a, 0x15a3: 0x2019, + 0x15a4: 0x2022, 0x15a5: 0x202a, 0x15a6: 0x0722, 0x15a7: 0x0040, 0x15a8: 0x2032, 0x15a9: 0x203a, + 0x15aa: 0x2042, 0x15ab: 0x204a, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040, + 0x15b0: 0x800e, 0x15b1: 0x2051, 0x15b2: 0x802e, 0x15b3: 0x0808, 0x15b4: 0x804e, 0x15b5: 0x0040, + 0x15b6: 0x806e, 0x15b7: 0x2059, 0x15b8: 0x808e, 0x15b9: 0x2061, 0x15ba: 0x80ae, 0x15bb: 0x2069, + 0x15bc: 0x80ce, 0x15bd: 0x2071, 0x15be: 0x80ee, 0x15bf: 0x2079, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x2081, 0x15c1: 0x2089, 0x15c2: 0x2089, 0x15c3: 0x2091, 0x15c4: 0x2091, 0x15c5: 0x2099, + 0x15c6: 0x2099, 0x15c7: 0x20a1, 0x15c8: 0x20a1, 0x15c9: 0x20a9, 0x15ca: 0x20a9, 0x15cb: 0x20a9, + 0x15cc: 0x20a9, 0x15cd: 0x20b1, 0x15ce: 0x20b1, 0x15cf: 0x20b9, 0x15d0: 0x20b9, 0x15d1: 0x20b9, + 0x15d2: 0x20b9, 0x15d3: 0x20c1, 0x15d4: 0x20c1, 0x15d5: 0x20c9, 0x15d6: 0x20c9, 0x15d7: 0x20c9, + 0x15d8: 0x20c9, 0x15d9: 0x20d1, 0x15da: 0x20d1, 0x15db: 0x20d1, 0x15dc: 0x20d1, 0x15dd: 0x20d9, + 0x15de: 0x20d9, 0x15df: 0x20d9, 0x15e0: 0x20d9, 0x15e1: 0x20e1, 0x15e2: 0x20e1, 0x15e3: 0x20e1, + 0x15e4: 0x20e1, 0x15e5: 0x20e9, 0x15e6: 0x20e9, 0x15e7: 0x20e9, 0x15e8: 0x20e9, 0x15e9: 0x20f1, + 0x15ea: 0x20f1, 0x15eb: 0x20f9, 0x15ec: 0x20f9, 0x15ed: 0x2101, 0x15ee: 0x2101, 0x15ef: 0x2109, + 0x15f0: 0x2109, 0x15f1: 0x2111, 0x15f2: 0x2111, 0x15f3: 0x2111, 0x15f4: 0x2111, 0x15f5: 0x2119, + 0x15f6: 0x2119, 0x15f7: 0x2119, 0x15f8: 0x2119, 0x15f9: 0x2121, 0x15fa: 0x2121, 0x15fb: 0x2121, + 0x15fc: 0x2121, 0x15fd: 0x2129, 0x15fe: 0x2129, 0x15ff: 0x2129, + // Block 0x58, offset 0x1600 + 0x1600: 0x2129, 0x1601: 0x2131, 0x1602: 0x2131, 0x1603: 0x2131, 0x1604: 0x2131, 0x1605: 0x2139, + 0x1606: 0x2139, 0x1607: 0x2139, 0x1608: 0x2139, 0x1609: 0x2141, 0x160a: 0x2141, 0x160b: 0x2141, + 0x160c: 0x2141, 0x160d: 0x2149, 0x160e: 0x2149, 0x160f: 0x2149, 0x1610: 0x2149, 0x1611: 0x2151, + 0x1612: 0x2151, 0x1613: 0x2151, 0x1614: 0x2151, 0x1615: 0x2159, 0x1616: 0x2159, 0x1617: 0x2159, + 0x1618: 0x2159, 0x1619: 0x2161, 0x161a: 0x2161, 0x161b: 0x2161, 0x161c: 0x2161, 0x161d: 0x2169, + 0x161e: 0x2169, 0x161f: 0x2169, 0x1620: 0x2169, 0x1621: 0x2171, 0x1622: 0x2171, 0x1623: 0x2171, + 0x1624: 0x2171, 0x1625: 0x2179, 0x1626: 0x2179, 0x1627: 0x2179, 0x1628: 0x2179, 0x1629: 0x2181, + 0x162a: 0x2181, 0x162b: 0x2181, 0x162c: 0x2181, 0x162d: 0x2189, 0x162e: 0x2189, 0x162f: 0x1701, + 0x1630: 0x1701, 0x1631: 0x2191, 0x1632: 0x2191, 0x1633: 0x2191, 0x1634: 0x2191, 0x1635: 0x2199, + 0x1636: 0x2199, 0x1637: 0x21a1, 0x1638: 0x21a1, 0x1639: 0x21a9, 0x163a: 0x21a9, 0x163b: 0x21b1, + 0x163c: 0x21b1, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x0040, 0x1641: 0x1fca, 0x1642: 0x21ba, 0x1643: 0x2002, 0x1644: 0x203a, 0x1645: 0x2042, + 0x1646: 0x200a, 0x1647: 0x21c2, 0x1648: 0x072a, 0x1649: 0x0732, 0x164a: 0x2012, 0x164b: 0x071a, + 0x164c: 0x1fba, 0x164d: 0x2019, 0x164e: 0x0961, 0x164f: 0x21ca, 0x1650: 0x06e1, 0x1651: 0x0049, + 0x1652: 0x0029, 0x1653: 0x0031, 0x1654: 0x06e9, 0x1655: 0x06f1, 0x1656: 0x06f9, 0x1657: 0x0701, + 0x1658: 0x0709, 0x1659: 0x0711, 0x165a: 0x1fc2, 0x165b: 0x0122, 0x165c: 0x2022, 0x165d: 0x0722, + 0x165e: 0x202a, 0x165f: 0x1fd2, 0x1660: 0x204a, 0x1661: 0x0019, 0x1662: 0x02e9, 0x1663: 0x03d9, + 0x1664: 0x02f1, 0x1665: 0x02f9, 0x1666: 0x03f1, 0x1667: 0x0309, 0x1668: 0x00a9, 0x1669: 0x0311, + 0x166a: 0x00b1, 0x166b: 0x0319, 0x166c: 0x0101, 0x166d: 0x0321, 0x166e: 0x0329, 0x166f: 0x0051, + 0x1670: 0x0339, 0x1671: 0x0751, 0x1672: 0x00b9, 0x1673: 0x0089, 0x1674: 0x0341, 0x1675: 0x0349, + 0x1676: 0x0391, 0x1677: 0x00c1, 0x1678: 0x0109, 0x1679: 0x00c9, 0x167a: 0x04b1, 0x167b: 0x1ff2, + 0x167c: 0x2032, 0x167d: 0x1ffa, 0x167e: 0x21d2, 0x167f: 0x1fda, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0672, 0x1681: 0x0019, 0x1682: 0x02e9, 0x1683: 0x03d9, 0x1684: 0x02f1, 0x1685: 0x02f9, + 0x1686: 0x03f1, 0x1687: 0x0309, 0x1688: 0x00a9, 0x1689: 0x0311, 0x168a: 0x00b1, 0x168b: 0x0319, + 0x168c: 0x0101, 0x168d: 0x0321, 0x168e: 0x0329, 0x168f: 0x0051, 0x1690: 0x0339, 0x1691: 0x0751, + 0x1692: 0x00b9, 0x1693: 0x0089, 0x1694: 0x0341, 0x1695: 0x0349, 0x1696: 0x0391, 0x1697: 0x00c1, + 0x1698: 0x0109, 0x1699: 0x00c9, 0x169a: 0x04b1, 0x169b: 0x1fe2, 0x169c: 0x21da, 0x169d: 0x1fea, + 0x169e: 0x21e2, 0x169f: 0x810d, 0x16a0: 0x812d, 0x16a1: 0x0961, 0x16a2: 0x814d, 0x16a3: 0x814d, + 0x16a4: 0x816d, 0x16a5: 0x818d, 0x16a6: 0x81ad, 0x16a7: 0x81cd, 0x16a8: 0x81ed, 0x16a9: 0x820d, + 0x16aa: 0x822d, 0x16ab: 0x824d, 0x16ac: 0x826d, 0x16ad: 0x828d, 0x16ae: 0x82ad, 0x16af: 0x82cd, + 0x16b0: 0x82ed, 0x16b1: 0x830d, 0x16b2: 0x832d, 0x16b3: 0x834d, 0x16b4: 0x836d, 0x16b5: 0x838d, + 0x16b6: 0x83ad, 0x16b7: 0x83cd, 0x16b8: 0x83ed, 0x16b9: 0x840d, 0x16ba: 0x842d, 0x16bb: 0x844d, + 0x16bc: 0x81ed, 0x16bd: 0x846d, 0x16be: 0x848d, 0x16bf: 0x824d, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x84ad, 0x16c1: 0x84cd, 0x16c2: 0x84ed, 0x16c3: 0x850d, 0x16c4: 0x852d, 0x16c5: 0x854d, + 0x16c6: 0x856d, 0x16c7: 0x858d, 0x16c8: 0x850d, 0x16c9: 0x85ad, 0x16ca: 0x850d, 0x16cb: 0x85cd, + 0x16cc: 0x85cd, 0x16cd: 0x85ed, 0x16ce: 0x85ed, 0x16cf: 0x860d, 0x16d0: 0x854d, 0x16d1: 0x862d, + 0x16d2: 0x864d, 0x16d3: 0x862d, 0x16d4: 0x866d, 0x16d5: 0x864d, 0x16d6: 0x868d, 0x16d7: 0x868d, + 0x16d8: 0x86ad, 0x16d9: 0x86ad, 0x16da: 0x86cd, 0x16db: 0x86cd, 0x16dc: 0x864d, 0x16dd: 0x814d, + 0x16de: 0x86ed, 0x16df: 0x870d, 0x16e0: 0x0040, 0x16e1: 0x872d, 0x16e2: 0x874d, 0x16e3: 0x876d, + 0x16e4: 0x878d, 0x16e5: 0x876d, 0x16e6: 0x87ad, 0x16e7: 0x87cd, 0x16e8: 0x87ed, 0x16e9: 0x87ed, + 0x16ea: 0x880d, 0x16eb: 0x880d, 0x16ec: 0x882d, 0x16ed: 0x882d, 0x16ee: 0x880d, 0x16ef: 0x880d, + 0x16f0: 0x884d, 0x16f1: 0x886d, 0x16f2: 0x888d, 0x16f3: 0x88ad, 0x16f4: 0x88cd, 0x16f5: 0x88ed, + 0x16f6: 0x88ed, 0x16f7: 0x88ed, 0x16f8: 0x890d, 0x16f9: 0x890d, 0x16fa: 0x890d, 0x16fb: 0x890d, + 0x16fc: 0x87ed, 0x16fd: 0x87ed, 0x16fe: 0x87ed, 0x16ff: 0x0040, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x874d, 0x1703: 0x872d, 0x1704: 0x892d, 0x1705: 0x872d, + 0x1706: 0x874d, 0x1707: 0x872d, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x894d, 0x170b: 0x874d, + 0x170c: 0x896d, 0x170d: 0x892d, 0x170e: 0x896d, 0x170f: 0x874d, 0x1710: 0x0040, 0x1711: 0x0040, + 0x1712: 0x898d, 0x1713: 0x89ad, 0x1714: 0x88ad, 0x1715: 0x896d, 0x1716: 0x892d, 0x1717: 0x896d, + 0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x89cd, 0x171b: 0x89ed, 0x171c: 0x89cd, 0x171d: 0x0040, + 0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0x21e9, 0x1721: 0x21f1, 0x1722: 0x21f9, 0x1723: 0x8a0e, + 0x1724: 0x2201, 0x1725: 0x2209, 0x1726: 0x8a2d, 0x1727: 0x0040, 0x1728: 0x8a4d, 0x1729: 0x8a6d, + 0x172a: 0x8a8d, 0x172b: 0x8a6d, 0x172c: 0x8aad, 0x172d: 0x8acd, 0x172e: 0x8aed, 0x172f: 0x0040, + 0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040, + 0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340, + 0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0008, 0x1741: 0x0008, 0x1742: 0x0008, 0x1743: 0x0008, 0x1744: 0x0008, 0x1745: 0x0008, + 0x1746: 0x0008, 0x1747: 0x0008, 0x1748: 0x0008, 0x1749: 0x0008, 0x174a: 0x0008, 0x174b: 0x0008, + 0x174c: 0x0008, 0x174d: 0x0008, 0x174e: 0x0008, 0x174f: 0x0008, 0x1750: 0x0008, 0x1751: 0x0008, + 0x1752: 0x0008, 0x1753: 0x0008, 0x1754: 0x0008, 0x1755: 0x0008, 0x1756: 0x0008, 0x1757: 0x0008, + 0x1758: 0x0008, 0x1759: 0x0008, 0x175a: 0x0008, 0x175b: 0x0008, 0x175c: 0x0008, 0x175d: 0x0008, + 0x175e: 0x0008, 0x175f: 0x0008, 0x1760: 0x0008, 0x1761: 0x0008, 0x1762: 0x0008, 0x1763: 0x0008, + 0x1764: 0x0040, 0x1765: 0x0040, 0x1766: 0x0040, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040, + 0x176a: 0x0040, 0x176b: 0x0040, 0x176c: 0x0040, 0x176d: 0x0040, 0x176e: 0x0040, 0x176f: 0x0018, + 0x1770: 0x8b3d, 0x1771: 0x8b55, 0x1772: 0x8b6d, 0x1773: 0x8b55, 0x1774: 0x8b85, 0x1775: 0x8b55, + 0x1776: 0x8b6d, 0x1777: 0x8b55, 0x1778: 0x8b3d, 0x1779: 0x8b9d, 0x177a: 0x8bb5, 0x177b: 0x0040, + 0x177c: 0x8bcd, 0x177d: 0x8b9d, 0x177e: 0x8bb5, 0x177f: 0x8b9d, + // Block 0x5e, offset 0x1780 + 0x1780: 0xe13d, 0x1781: 0xe14d, 0x1782: 0xe15d, 0x1783: 0xe14d, 0x1784: 0xe17d, 0x1785: 0xe14d, + 0x1786: 0xe15d, 0x1787: 0xe14d, 0x1788: 0xe13d, 0x1789: 0xe1cd, 0x178a: 0xe1dd, 0x178b: 0x0040, + 0x178c: 0xe1fd, 0x178d: 0xe1cd, 0x178e: 0xe1dd, 0x178f: 0xe1cd, 0x1790: 0xe13d, 0x1791: 0xe14d, + 0x1792: 0xe15d, 0x1793: 0x0040, 0x1794: 0xe17d, 0x1795: 0xe14d, 0x1796: 0x0040, 0x1797: 0x0008, + 0x1798: 0x0008, 0x1799: 0x0008, 0x179a: 0x0008, 0x179b: 0x0008, 0x179c: 0x0008, 0x179d: 0x0008, + 0x179e: 0x0008, 0x179f: 0x0008, 0x17a0: 0x0008, 0x17a1: 0x0008, 0x17a2: 0x0040, 0x17a3: 0x0008, + 0x17a4: 0x0008, 0x17a5: 0x0008, 0x17a6: 0x0008, 0x17a7: 0x0008, 0x17a8: 0x0008, 0x17a9: 0x0008, + 0x17aa: 0x0008, 0x17ab: 0x0008, 0x17ac: 0x0008, 0x17ad: 0x0008, 0x17ae: 0x0008, 0x17af: 0x0008, + 0x17b0: 0x0008, 0x17b1: 0x0008, 0x17b2: 0x0040, 0x17b3: 0x0008, 0x17b4: 0x0008, 0x17b5: 0x0008, + 0x17b6: 0x0008, 0x17b7: 0x0008, 0x17b8: 0x0008, 0x17b9: 0x0008, 0x17ba: 0x0040, 0x17bb: 0x0008, + 0x17bc: 0x0008, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0008, 0x17c1: 0x2211, 0x17c2: 0x2219, 0x17c3: 0x02e1, 0x17c4: 0x2221, 0x17c5: 0x2229, + 0x17c6: 0x0040, 0x17c7: 0x2231, 0x17c8: 0x2239, 0x17c9: 0x2241, 0x17ca: 0x2249, 0x17cb: 0x2251, + 0x17cc: 0x2259, 0x17cd: 0x2261, 0x17ce: 0x2269, 0x17cf: 0x2271, 0x17d0: 0x2279, 0x17d1: 0x2281, + 0x17d2: 0x2289, 0x17d3: 0x2291, 0x17d4: 0x2299, 0x17d5: 0x0741, 0x17d6: 0x22a1, 0x17d7: 0x22a9, + 0x17d8: 0x22b1, 0x17d9: 0x22b9, 0x17da: 0x22c1, 0x17db: 0x13d9, 0x17dc: 0x8be5, 0x17dd: 0x22c9, + 0x17de: 0x22d1, 0x17df: 0x8c05, 0x17e0: 0x22d9, 0x17e1: 0x8c25, 0x17e2: 0x22e1, 0x17e3: 0x22e9, + 0x17e4: 0x22f1, 0x17e5: 0x0751, 0x17e6: 0x22f9, 0x17e7: 0x8c45, 0x17e8: 0x0949, 0x17e9: 0x2301, + 0x17ea: 0x2309, 0x17eb: 0x2311, 0x17ec: 0x2319, 0x17ed: 0x2321, 0x17ee: 0x2329, 0x17ef: 0x2331, + 0x17f0: 0x2339, 0x17f1: 0x0040, 0x17f2: 0x2341, 0x17f3: 0x2349, 0x17f4: 0x2351, 0x17f5: 0x2359, + 0x17f6: 0x2361, 0x17f7: 0x2369, 0x17f8: 0x2371, 0x17f9: 0x8c65, 0x17fa: 0x8c85, 0x17fb: 0x0040, + 0x17fc: 0x0040, 0x17fd: 0x0040, 0x17fe: 0x0040, 0x17ff: 0x0040, + // Block 0x60, offset 0x1800 + 0x1800: 0x0a08, 0x1801: 0x0a08, 0x1802: 0x0a08, 0x1803: 0x0a08, 0x1804: 0x0a08, 0x1805: 0x0c08, + 0x1806: 0x0808, 0x1807: 0x0c08, 0x1808: 0x0818, 0x1809: 0x0c08, 0x180a: 0x0c08, 0x180b: 0x0808, + 0x180c: 0x0808, 0x180d: 0x0908, 0x180e: 0x0c08, 0x180f: 0x0c08, 0x1810: 0x0c08, 0x1811: 0x0c08, + 0x1812: 0x0c08, 0x1813: 0x0a08, 0x1814: 0x0a08, 0x1815: 0x0a08, 0x1816: 0x0a08, 0x1817: 0x0908, + 0x1818: 0x0a08, 0x1819: 0x0a08, 0x181a: 0x0a08, 0x181b: 0x0a08, 0x181c: 0x0a08, 0x181d: 0x0c08, + 0x181e: 0x0a08, 0x181f: 0x0a08, 0x1820: 0x0a08, 0x1821: 0x0c08, 0x1822: 0x0808, 0x1823: 0x0808, + 0x1824: 0x0c08, 0x1825: 0x3308, 0x1826: 0x3308, 0x1827: 0x0040, 0x1828: 0x0040, 0x1829: 0x0040, + 0x182a: 0x0040, 0x182b: 0x0a18, 0x182c: 0x0a18, 0x182d: 0x0a18, 0x182e: 0x0a18, 0x182f: 0x0c18, + 0x1830: 0x0818, 0x1831: 0x0818, 0x1832: 0x0818, 0x1833: 0x0818, 0x1834: 0x0818, 0x1835: 0x0818, + 0x1836: 0x0818, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040, + 0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040, + // Block 0x61, offset 0x1840 + 0x1840: 0x0a08, 0x1841: 0x0c08, 0x1842: 0x0a08, 0x1843: 0x0c08, 0x1844: 0x0c08, 0x1845: 0x0c08, + 0x1846: 0x0a08, 0x1847: 0x0a08, 0x1848: 0x0a08, 0x1849: 0x0c08, 0x184a: 0x0a08, 0x184b: 0x0a08, + 0x184c: 0x0c08, 0x184d: 0x0a08, 0x184e: 0x0c08, 0x184f: 0x0c08, 0x1850: 0x0a08, 0x1851: 0x0c08, + 0x1852: 0x0040, 0x1853: 0x0040, 0x1854: 0x0040, 0x1855: 0x0040, 0x1856: 0x0040, 0x1857: 0x0040, + 0x1858: 0x0040, 0x1859: 0x0818, 0x185a: 0x0818, 0x185b: 0x0818, 0x185c: 0x0818, 0x185d: 0x0040, + 0x185e: 0x0040, 0x185f: 0x0040, 0x1860: 0x0040, 0x1861: 0x0040, 0x1862: 0x0040, 0x1863: 0x0040, + 0x1864: 0x0040, 0x1865: 0x0040, 0x1866: 0x0040, 0x1867: 0x0040, 0x1868: 0x0040, 0x1869: 0x0c18, + 0x186a: 0x0c18, 0x186b: 0x0c18, 0x186c: 0x0c18, 0x186d: 0x0a18, 0x186e: 0x0a18, 0x186f: 0x0818, + 0x1870: 0x0040, 0x1871: 0x0040, 0x1872: 0x0040, 0x1873: 0x0040, 0x1874: 0x0040, 0x1875: 0x0040, + 0x1876: 0x0040, 0x1877: 0x0040, 0x1878: 0x0040, 0x1879: 0x0040, 0x187a: 0x0040, 0x187b: 0x0040, + 0x187c: 0x0040, 0x187d: 0x0040, 0x187e: 0x0040, 0x187f: 0x0040, + // Block 0x62, offset 0x1880 + 0x1880: 0x3308, 0x1881: 0x3308, 0x1882: 0x3008, 0x1883: 0x3008, 0x1884: 0x0040, 0x1885: 0x0008, + 0x1886: 0x0008, 0x1887: 0x0008, 0x1888: 0x0008, 0x1889: 0x0008, 0x188a: 0x0008, 0x188b: 0x0008, + 0x188c: 0x0008, 0x188d: 0x0040, 0x188e: 0x0040, 0x188f: 0x0008, 0x1890: 0x0008, 0x1891: 0x0040, + 0x1892: 0x0040, 0x1893: 0x0008, 0x1894: 0x0008, 0x1895: 0x0008, 0x1896: 0x0008, 0x1897: 0x0008, + 0x1898: 0x0008, 0x1899: 0x0008, 0x189a: 0x0008, 0x189b: 0x0008, 0x189c: 0x0008, 0x189d: 0x0008, + 0x189e: 0x0008, 0x189f: 0x0008, 0x18a0: 0x0008, 0x18a1: 0x0008, 0x18a2: 0x0008, 0x18a3: 0x0008, + 0x18a4: 0x0008, 0x18a5: 0x0008, 0x18a6: 0x0008, 0x18a7: 0x0008, 0x18a8: 0x0008, 0x18a9: 0x0040, + 0x18aa: 0x0008, 0x18ab: 0x0008, 0x18ac: 0x0008, 0x18ad: 0x0008, 0x18ae: 0x0008, 0x18af: 0x0008, + 0x18b0: 0x0008, 0x18b1: 0x0040, 0x18b2: 0x0008, 0x18b3: 0x0008, 0x18b4: 0x0040, 0x18b5: 0x0008, + 0x18b6: 0x0008, 0x18b7: 0x0008, 0x18b8: 0x0008, 0x18b9: 0x0008, 0x18ba: 0x0040, 0x18bb: 0x3308, + 0x18bc: 0x3308, 0x18bd: 0x0008, 0x18be: 0x3008, 0x18bf: 0x3008, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x3308, 0x18c1: 0x3008, 0x18c2: 0x3008, 0x18c3: 0x3008, 0x18c4: 0x3008, 0x18c5: 0x0040, + 0x18c6: 0x0040, 0x18c7: 0x3008, 0x18c8: 0x3008, 0x18c9: 0x0040, 0x18ca: 0x0040, 0x18cb: 0x3008, + 0x18cc: 0x3008, 0x18cd: 0x3808, 0x18ce: 0x0040, 0x18cf: 0x0040, 0x18d0: 0x0008, 0x18d1: 0x0040, + 0x18d2: 0x0040, 0x18d3: 0x0040, 0x18d4: 0x0040, 0x18d5: 0x0040, 0x18d6: 0x0040, 0x18d7: 0x3008, + 0x18d8: 0x0040, 0x18d9: 0x0040, 0x18da: 0x0040, 0x18db: 0x0040, 0x18dc: 0x0040, 0x18dd: 0x0008, + 0x18de: 0x0008, 0x18df: 0x0008, 0x18e0: 0x0008, 0x18e1: 0x0008, 0x18e2: 0x3008, 0x18e3: 0x3008, + 0x18e4: 0x0040, 0x18e5: 0x0040, 0x18e6: 0x3308, 0x18e7: 0x3308, 0x18e8: 0x3308, 0x18e9: 0x3308, + 0x18ea: 0x3308, 0x18eb: 0x3308, 0x18ec: 0x3308, 0x18ed: 0x0040, 0x18ee: 0x0040, 0x18ef: 0x0040, + 0x18f0: 0x3308, 0x18f1: 0x3308, 0x18f2: 0x3308, 0x18f3: 0x3308, 0x18f4: 0x3308, 0x18f5: 0x0040, + 0x18f6: 0x0040, 0x18f7: 0x0040, 0x18f8: 0x0040, 0x18f9: 0x0040, 0x18fa: 0x0040, 0x18fb: 0x0040, + 0x18fc: 0x0040, 0x18fd: 0x0040, 0x18fe: 0x0040, 0x18ff: 0x0040, + // Block 0x64, offset 0x1900 + 0x1900: 0x0008, 0x1901: 0x0008, 0x1902: 0x0008, 0x1903: 0x0008, 0x1904: 0x0008, 0x1905: 0x0008, + 0x1906: 0x0008, 0x1907: 0x0040, 0x1908: 0x0040, 0x1909: 0x0008, 0x190a: 0x0040, 0x190b: 0x0040, + 0x190c: 0x0008, 0x190d: 0x0008, 0x190e: 0x0008, 0x190f: 0x0008, 0x1910: 0x0008, 0x1911: 0x0008, + 0x1912: 0x0008, 0x1913: 0x0008, 0x1914: 0x0040, 0x1915: 0x0008, 0x1916: 0x0008, 0x1917: 0x0040, + 0x1918: 0x0008, 0x1919: 0x0008, 0x191a: 0x0008, 0x191b: 0x0008, 0x191c: 0x0008, 0x191d: 0x0008, + 0x191e: 0x0008, 0x191f: 0x0008, 0x1920: 0x0008, 0x1921: 0x0008, 0x1922: 0x0008, 0x1923: 0x0008, + 0x1924: 0x0008, 0x1925: 0x0008, 0x1926: 0x0008, 0x1927: 0x0008, 0x1928: 0x0008, 0x1929: 0x0008, + 0x192a: 0x0008, 0x192b: 0x0008, 0x192c: 0x0008, 0x192d: 0x0008, 0x192e: 0x0008, 0x192f: 0x0008, + 0x1930: 0x3008, 0x1931: 0x3008, 0x1932: 0x3008, 0x1933: 0x3008, 0x1934: 0x3008, 0x1935: 0x3008, + 0x1936: 0x0040, 0x1937: 0x3008, 0x1938: 0x3008, 0x1939: 0x0040, 0x193a: 0x0040, 0x193b: 0x3308, + 0x193c: 0x3308, 0x193d: 0x3808, 0x193e: 0x3b08, 0x193f: 0x0008, + // Block 0x65, offset 0x1940 + 0x1940: 0x0019, 0x1941: 0x02e9, 0x1942: 0x03d9, 0x1943: 0x02f1, 0x1944: 0x02f9, 0x1945: 0x03f1, + 0x1946: 0x0309, 0x1947: 0x00a9, 0x1948: 0x0311, 0x1949: 0x00b1, 0x194a: 0x0319, 0x194b: 0x0101, + 0x194c: 0x0321, 0x194d: 0x0329, 0x194e: 0x0051, 0x194f: 0x0339, 0x1950: 0x0751, 0x1951: 0x00b9, + 0x1952: 0x0089, 0x1953: 0x0341, 0x1954: 0x0349, 0x1955: 0x0391, 0x1956: 0x00c1, 0x1957: 0x0109, + 0x1958: 0x00c9, 0x1959: 0x04b1, 0x195a: 0x0019, 0x195b: 0x02e9, 0x195c: 0x03d9, 0x195d: 0x02f1, + 0x195e: 0x02f9, 0x195f: 0x03f1, 0x1960: 0x0309, 0x1961: 0x00a9, 0x1962: 0x0311, 0x1963: 0x00b1, + 0x1964: 0x0319, 0x1965: 0x0101, 0x1966: 0x0321, 0x1967: 0x0329, 0x1968: 0x0051, 0x1969: 0x0339, + 0x196a: 0x0751, 0x196b: 0x00b9, 0x196c: 0x0089, 0x196d: 0x0341, 0x196e: 0x0349, 0x196f: 0x0391, + 0x1970: 0x00c1, 0x1971: 0x0109, 0x1972: 0x00c9, 0x1973: 0x04b1, 0x1974: 0x0019, 0x1975: 0x02e9, + 0x1976: 0x03d9, 0x1977: 0x02f1, 0x1978: 0x02f9, 0x1979: 0x03f1, 0x197a: 0x0309, 0x197b: 0x00a9, + 0x197c: 0x0311, 0x197d: 0x00b1, 0x197e: 0x0319, 0x197f: 0x0101, + // Block 0x66, offset 0x1980 + 0x1980: 0x0321, 0x1981: 0x0329, 0x1982: 0x0051, 0x1983: 0x0339, 0x1984: 0x0751, 0x1985: 0x00b9, + 0x1986: 0x0089, 0x1987: 0x0341, 0x1988: 0x0349, 0x1989: 0x0391, 0x198a: 0x00c1, 0x198b: 0x0109, + 0x198c: 0x00c9, 0x198d: 0x04b1, 0x198e: 0x0019, 0x198f: 0x02e9, 0x1990: 0x03d9, 0x1991: 0x02f1, + 0x1992: 0x02f9, 0x1993: 0x03f1, 0x1994: 0x0309, 0x1995: 0x0040, 0x1996: 0x0311, 0x1997: 0x00b1, + 0x1998: 0x0319, 0x1999: 0x0101, 0x199a: 0x0321, 0x199b: 0x0329, 0x199c: 0x0051, 0x199d: 0x0339, + 0x199e: 0x0751, 0x199f: 0x00b9, 0x19a0: 0x0089, 0x19a1: 0x0341, 0x19a2: 0x0349, 0x19a3: 0x0391, + 0x19a4: 0x00c1, 0x19a5: 0x0109, 0x19a6: 0x00c9, 0x19a7: 0x04b1, 0x19a8: 0x0019, 0x19a9: 0x02e9, + 0x19aa: 0x03d9, 0x19ab: 0x02f1, 0x19ac: 0x02f9, 0x19ad: 0x03f1, 0x19ae: 0x0309, 0x19af: 0x00a9, + 0x19b0: 0x0311, 0x19b1: 0x00b1, 0x19b2: 0x0319, 0x19b3: 0x0101, 0x19b4: 0x0321, 0x19b5: 0x0329, + 0x19b6: 0x0051, 0x19b7: 0x0339, 0x19b8: 0x0751, 0x19b9: 0x00b9, 0x19ba: 0x0089, 0x19bb: 0x0341, + 0x19bc: 0x0349, 0x19bd: 0x0391, 0x19be: 0x00c1, 0x19bf: 0x0109, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x00c9, 0x19c1: 0x04b1, 0x19c2: 0x0019, 0x19c3: 0x02e9, 0x19c4: 0x03d9, 0x19c5: 0x02f1, + 0x19c6: 0x02f9, 0x19c7: 0x03f1, 0x19c8: 0x0309, 0x19c9: 0x00a9, 0x19ca: 0x0311, 0x19cb: 0x00b1, + 0x19cc: 0x0319, 0x19cd: 0x0101, 0x19ce: 0x0321, 0x19cf: 0x0329, 0x19d0: 0x0051, 0x19d1: 0x0339, + 0x19d2: 0x0751, 0x19d3: 0x00b9, 0x19d4: 0x0089, 0x19d5: 0x0341, 0x19d6: 0x0349, 0x19d7: 0x0391, + 0x19d8: 0x00c1, 0x19d9: 0x0109, 0x19da: 0x00c9, 0x19db: 0x04b1, 0x19dc: 0x0019, 0x19dd: 0x0040, + 0x19de: 0x03d9, 0x19df: 0x02f1, 0x19e0: 0x0040, 0x19e1: 0x0040, 0x19e2: 0x0309, 0x19e3: 0x0040, + 0x19e4: 0x0040, 0x19e5: 0x00b1, 0x19e6: 0x0319, 0x19e7: 0x0040, 0x19e8: 0x0040, 0x19e9: 0x0329, + 0x19ea: 0x0051, 0x19eb: 0x0339, 0x19ec: 0x0751, 0x19ed: 0x0040, 0x19ee: 0x0089, 0x19ef: 0x0341, + 0x19f0: 0x0349, 0x19f1: 0x0391, 0x19f2: 0x00c1, 0x19f3: 0x0109, 0x19f4: 0x00c9, 0x19f5: 0x04b1, + 0x19f6: 0x0019, 0x19f7: 0x02e9, 0x19f8: 0x03d9, 0x19f9: 0x02f1, 0x19fa: 0x0040, 0x19fb: 0x03f1, + 0x19fc: 0x0040, 0x19fd: 0x00a9, 0x19fe: 0x0311, 0x19ff: 0x00b1, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0319, 0x1a01: 0x0101, 0x1a02: 0x0321, 0x1a03: 0x0329, 0x1a04: 0x0040, 0x1a05: 0x0339, + 0x1a06: 0x0751, 0x1a07: 0x00b9, 0x1a08: 0x0089, 0x1a09: 0x0341, 0x1a0a: 0x0349, 0x1a0b: 0x0391, + 0x1a0c: 0x00c1, 0x1a0d: 0x0109, 0x1a0e: 0x00c9, 0x1a0f: 0x04b1, 0x1a10: 0x0019, 0x1a11: 0x02e9, + 0x1a12: 0x03d9, 0x1a13: 0x02f1, 0x1a14: 0x02f9, 0x1a15: 0x03f1, 0x1a16: 0x0309, 0x1a17: 0x00a9, + 0x1a18: 0x0311, 0x1a19: 0x00b1, 0x1a1a: 0x0319, 0x1a1b: 0x0101, 0x1a1c: 0x0321, 0x1a1d: 0x0329, + 0x1a1e: 0x0051, 0x1a1f: 0x0339, 0x1a20: 0x0751, 0x1a21: 0x00b9, 0x1a22: 0x0089, 0x1a23: 0x0341, + 0x1a24: 0x0349, 0x1a25: 0x0391, 0x1a26: 0x00c1, 0x1a27: 0x0109, 0x1a28: 0x00c9, 0x1a29: 0x04b1, + 0x1a2a: 0x0019, 0x1a2b: 0x02e9, 0x1a2c: 0x03d9, 0x1a2d: 0x02f1, 0x1a2e: 0x02f9, 0x1a2f: 0x03f1, + 0x1a30: 0x0309, 0x1a31: 0x00a9, 0x1a32: 0x0311, 0x1a33: 0x00b1, 0x1a34: 0x0319, 0x1a35: 0x0101, + 0x1a36: 0x0321, 0x1a37: 0x0329, 0x1a38: 0x0051, 0x1a39: 0x0339, 0x1a3a: 0x0751, 0x1a3b: 0x00b9, + 0x1a3c: 0x0089, 0x1a3d: 0x0341, 0x1a3e: 0x0349, 0x1a3f: 0x0391, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x00c1, 0x1a41: 0x0109, 0x1a42: 0x00c9, 0x1a43: 0x04b1, 0x1a44: 0x0019, 0x1a45: 0x02e9, + 0x1a46: 0x0040, 0x1a47: 0x02f1, 0x1a48: 0x02f9, 0x1a49: 0x03f1, 0x1a4a: 0x0309, 0x1a4b: 0x0040, + 0x1a4c: 0x0040, 0x1a4d: 0x00b1, 0x1a4e: 0x0319, 0x1a4f: 0x0101, 0x1a50: 0x0321, 0x1a51: 0x0329, + 0x1a52: 0x0051, 0x1a53: 0x0339, 0x1a54: 0x0751, 0x1a55: 0x0040, 0x1a56: 0x0089, 0x1a57: 0x0341, + 0x1a58: 0x0349, 0x1a59: 0x0391, 0x1a5a: 0x00c1, 0x1a5b: 0x0109, 0x1a5c: 0x00c9, 0x1a5d: 0x0040, + 0x1a5e: 0x0019, 0x1a5f: 0x02e9, 0x1a60: 0x03d9, 0x1a61: 0x02f1, 0x1a62: 0x02f9, 0x1a63: 0x03f1, + 0x1a64: 0x0309, 0x1a65: 0x00a9, 0x1a66: 0x0311, 0x1a67: 0x00b1, 0x1a68: 0x0319, 0x1a69: 0x0101, + 0x1a6a: 0x0321, 0x1a6b: 0x0329, 0x1a6c: 0x0051, 0x1a6d: 0x0339, 0x1a6e: 0x0751, 0x1a6f: 0x00b9, + 0x1a70: 0x0089, 0x1a71: 0x0341, 0x1a72: 0x0349, 0x1a73: 0x0391, 0x1a74: 0x00c1, 0x1a75: 0x0109, + 0x1a76: 0x00c9, 0x1a77: 0x04b1, 0x1a78: 0x0019, 0x1a79: 0x02e9, 0x1a7a: 0x0040, 0x1a7b: 0x02f1, + 0x1a7c: 0x02f9, 0x1a7d: 0x03f1, 0x1a7e: 0x0309, 0x1a7f: 0x0040, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0311, 0x1a81: 0x00b1, 0x1a82: 0x0319, 0x1a83: 0x0101, 0x1a84: 0x0321, 0x1a85: 0x0040, + 0x1a86: 0x0051, 0x1a87: 0x0040, 0x1a88: 0x0040, 0x1a89: 0x0040, 0x1a8a: 0x0089, 0x1a8b: 0x0341, + 0x1a8c: 0x0349, 0x1a8d: 0x0391, 0x1a8e: 0x00c1, 0x1a8f: 0x0109, 0x1a90: 0x00c9, 0x1a91: 0x0040, + 0x1a92: 0x0019, 0x1a93: 0x02e9, 0x1a94: 0x03d9, 0x1a95: 0x02f1, 0x1a96: 0x02f9, 0x1a97: 0x03f1, + 0x1a98: 0x0309, 0x1a99: 0x00a9, 0x1a9a: 0x0311, 0x1a9b: 0x00b1, 0x1a9c: 0x0319, 0x1a9d: 0x0101, + 0x1a9e: 0x0321, 0x1a9f: 0x0329, 0x1aa0: 0x0051, 0x1aa1: 0x0339, 0x1aa2: 0x0751, 0x1aa3: 0x00b9, + 0x1aa4: 0x0089, 0x1aa5: 0x0341, 0x1aa6: 0x0349, 0x1aa7: 0x0391, 0x1aa8: 0x00c1, 0x1aa9: 0x0109, + 0x1aaa: 0x00c9, 0x1aab: 0x04b1, 0x1aac: 0x0019, 0x1aad: 0x02e9, 0x1aae: 0x03d9, 0x1aaf: 0x02f1, + 0x1ab0: 0x02f9, 0x1ab1: 0x03f1, 0x1ab2: 0x0309, 0x1ab3: 0x00a9, 0x1ab4: 0x0311, 0x1ab5: 0x00b1, + 0x1ab6: 0x0319, 0x1ab7: 0x0101, 0x1ab8: 0x0321, 0x1ab9: 0x0329, 0x1aba: 0x0051, 0x1abb: 0x0339, + 0x1abc: 0x0751, 0x1abd: 0x00b9, 0x1abe: 0x0089, 0x1abf: 0x0341, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0349, 0x1ac1: 0x0391, 0x1ac2: 0x00c1, 0x1ac3: 0x0109, 0x1ac4: 0x00c9, 0x1ac5: 0x04b1, + 0x1ac6: 0x0019, 0x1ac7: 0x02e9, 0x1ac8: 0x03d9, 0x1ac9: 0x02f1, 0x1aca: 0x02f9, 0x1acb: 0x03f1, + 0x1acc: 0x0309, 0x1acd: 0x00a9, 0x1ace: 0x0311, 0x1acf: 0x00b1, 0x1ad0: 0x0319, 0x1ad1: 0x0101, + 0x1ad2: 0x0321, 0x1ad3: 0x0329, 0x1ad4: 0x0051, 0x1ad5: 0x0339, 0x1ad6: 0x0751, 0x1ad7: 0x00b9, + 0x1ad8: 0x0089, 0x1ad9: 0x0341, 0x1ada: 0x0349, 0x1adb: 0x0391, 0x1adc: 0x00c1, 0x1add: 0x0109, + 0x1ade: 0x00c9, 0x1adf: 0x04b1, 0x1ae0: 0x0019, 0x1ae1: 0x02e9, 0x1ae2: 0x03d9, 0x1ae3: 0x02f1, + 0x1ae4: 0x02f9, 0x1ae5: 0x03f1, 0x1ae6: 0x0309, 0x1ae7: 0x00a9, 0x1ae8: 0x0311, 0x1ae9: 0x00b1, + 0x1aea: 0x0319, 0x1aeb: 0x0101, 0x1aec: 0x0321, 0x1aed: 0x0329, 0x1aee: 0x0051, 0x1aef: 0x0339, + 0x1af0: 0x0751, 0x1af1: 0x00b9, 0x1af2: 0x0089, 0x1af3: 0x0341, 0x1af4: 0x0349, 0x1af5: 0x0391, + 0x1af6: 0x00c1, 0x1af7: 0x0109, 0x1af8: 0x00c9, 0x1af9: 0x04b1, 0x1afa: 0x0019, 0x1afb: 0x02e9, + 0x1afc: 0x03d9, 0x1afd: 0x02f1, 0x1afe: 0x02f9, 0x1aff: 0x03f1, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x0309, 0x1b01: 0x00a9, 0x1b02: 0x0311, 0x1b03: 0x00b1, 0x1b04: 0x0319, 0x1b05: 0x0101, + 0x1b06: 0x0321, 0x1b07: 0x0329, 0x1b08: 0x0051, 0x1b09: 0x0339, 0x1b0a: 0x0751, 0x1b0b: 0x00b9, + 0x1b0c: 0x0089, 0x1b0d: 0x0341, 0x1b0e: 0x0349, 0x1b0f: 0x0391, 0x1b10: 0x00c1, 0x1b11: 0x0109, + 0x1b12: 0x00c9, 0x1b13: 0x04b1, 0x1b14: 0x0019, 0x1b15: 0x02e9, 0x1b16: 0x03d9, 0x1b17: 0x02f1, + 0x1b18: 0x02f9, 0x1b19: 0x03f1, 0x1b1a: 0x0309, 0x1b1b: 0x00a9, 0x1b1c: 0x0311, 0x1b1d: 0x00b1, + 0x1b1e: 0x0319, 0x1b1f: 0x0101, 0x1b20: 0x0321, 0x1b21: 0x0329, 0x1b22: 0x0051, 0x1b23: 0x0339, + 0x1b24: 0x0751, 0x1b25: 0x00b9, 0x1b26: 0x0089, 0x1b27: 0x0341, 0x1b28: 0x0349, 0x1b29: 0x0391, + 0x1b2a: 0x00c1, 0x1b2b: 0x0109, 0x1b2c: 0x00c9, 0x1b2d: 0x04b1, 0x1b2e: 0x0019, 0x1b2f: 0x02e9, + 0x1b30: 0x03d9, 0x1b31: 0x02f1, 0x1b32: 0x02f9, 0x1b33: 0x03f1, 0x1b34: 0x0309, 0x1b35: 0x00a9, + 0x1b36: 0x0311, 0x1b37: 0x00b1, 0x1b38: 0x0319, 0x1b39: 0x0101, 0x1b3a: 0x0321, 0x1b3b: 0x0329, + 0x1b3c: 0x0051, 0x1b3d: 0x0339, 0x1b3e: 0x0751, 0x1b3f: 0x00b9, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x0089, 0x1b41: 0x0341, 0x1b42: 0x0349, 0x1b43: 0x0391, 0x1b44: 0x00c1, 0x1b45: 0x0109, + 0x1b46: 0x00c9, 0x1b47: 0x04b1, 0x1b48: 0x0019, 0x1b49: 0x02e9, 0x1b4a: 0x03d9, 0x1b4b: 0x02f1, + 0x1b4c: 0x02f9, 0x1b4d: 0x03f1, 0x1b4e: 0x0309, 0x1b4f: 0x00a9, 0x1b50: 0x0311, 0x1b51: 0x00b1, + 0x1b52: 0x0319, 0x1b53: 0x0101, 0x1b54: 0x0321, 0x1b55: 0x0329, 0x1b56: 0x0051, 0x1b57: 0x0339, + 0x1b58: 0x0751, 0x1b59: 0x00b9, 0x1b5a: 0x0089, 0x1b5b: 0x0341, 0x1b5c: 0x0349, 0x1b5d: 0x0391, + 0x1b5e: 0x00c1, 0x1b5f: 0x0109, 0x1b60: 0x00c9, 0x1b61: 0x04b1, 0x1b62: 0x0019, 0x1b63: 0x02e9, + 0x1b64: 0x03d9, 0x1b65: 0x02f1, 0x1b66: 0x02f9, 0x1b67: 0x03f1, 0x1b68: 0x0309, 0x1b69: 0x00a9, + 0x1b6a: 0x0311, 0x1b6b: 0x00b1, 0x1b6c: 0x0319, 0x1b6d: 0x0101, 0x1b6e: 0x0321, 0x1b6f: 0x0329, + 0x1b70: 0x0051, 0x1b71: 0x0339, 0x1b72: 0x0751, 0x1b73: 0x00b9, 0x1b74: 0x0089, 0x1b75: 0x0341, + 0x1b76: 0x0349, 0x1b77: 0x0391, 0x1b78: 0x00c1, 0x1b79: 0x0109, 0x1b7a: 0x00c9, 0x1b7b: 0x04b1, + 0x1b7c: 0x0019, 0x1b7d: 0x02e9, 0x1b7e: 0x03d9, 0x1b7f: 0x02f1, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x02f9, 0x1b81: 0x03f1, 0x1b82: 0x0309, 0x1b83: 0x00a9, 0x1b84: 0x0311, 0x1b85: 0x00b1, + 0x1b86: 0x0319, 0x1b87: 0x0101, 0x1b88: 0x0321, 0x1b89: 0x0329, 0x1b8a: 0x0051, 0x1b8b: 0x0339, + 0x1b8c: 0x0751, 0x1b8d: 0x00b9, 0x1b8e: 0x0089, 0x1b8f: 0x0341, 0x1b90: 0x0349, 0x1b91: 0x0391, + 0x1b92: 0x00c1, 0x1b93: 0x0109, 0x1b94: 0x00c9, 0x1b95: 0x04b1, 0x1b96: 0x0019, 0x1b97: 0x02e9, + 0x1b98: 0x03d9, 0x1b99: 0x02f1, 0x1b9a: 0x02f9, 0x1b9b: 0x03f1, 0x1b9c: 0x0309, 0x1b9d: 0x00a9, + 0x1b9e: 0x0311, 0x1b9f: 0x00b1, 0x1ba0: 0x0319, 0x1ba1: 0x0101, 0x1ba2: 0x0321, 0x1ba3: 0x0329, + 0x1ba4: 0x0051, 0x1ba5: 0x0339, 0x1ba6: 0x0751, 0x1ba7: 0x00b9, 0x1ba8: 0x0089, 0x1ba9: 0x0341, + 0x1baa: 0x0349, 0x1bab: 0x0391, 0x1bac: 0x00c1, 0x1bad: 0x0109, 0x1bae: 0x00c9, 0x1baf: 0x04b1, + 0x1bb0: 0x0019, 0x1bb1: 0x02e9, 0x1bb2: 0x03d9, 0x1bb3: 0x02f1, 0x1bb4: 0x02f9, 0x1bb5: 0x03f1, + 0x1bb6: 0x0309, 0x1bb7: 0x00a9, 0x1bb8: 0x0311, 0x1bb9: 0x00b1, 0x1bba: 0x0319, 0x1bbb: 0x0101, + 0x1bbc: 0x0321, 0x1bbd: 0x0329, 0x1bbe: 0x0051, 0x1bbf: 0x0339, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0751, 0x1bc1: 0x00b9, 0x1bc2: 0x0089, 0x1bc3: 0x0341, 0x1bc4: 0x0349, 0x1bc5: 0x0391, + 0x1bc6: 0x00c1, 0x1bc7: 0x0109, 0x1bc8: 0x00c9, 0x1bc9: 0x04b1, 0x1bca: 0x0019, 0x1bcb: 0x02e9, + 0x1bcc: 0x03d9, 0x1bcd: 0x02f1, 0x1bce: 0x02f9, 0x1bcf: 0x03f1, 0x1bd0: 0x0309, 0x1bd1: 0x00a9, + 0x1bd2: 0x0311, 0x1bd3: 0x00b1, 0x1bd4: 0x0319, 0x1bd5: 0x0101, 0x1bd6: 0x0321, 0x1bd7: 0x0329, + 0x1bd8: 0x0051, 0x1bd9: 0x0339, 0x1bda: 0x0751, 0x1bdb: 0x00b9, 0x1bdc: 0x0089, 0x1bdd: 0x0341, + 0x1bde: 0x0349, 0x1bdf: 0x0391, 0x1be0: 0x00c1, 0x1be1: 0x0109, 0x1be2: 0x00c9, 0x1be3: 0x04b1, + 0x1be4: 0x23e1, 0x1be5: 0x23e9, 0x1be6: 0x0040, 0x1be7: 0x0040, 0x1be8: 0x23f1, 0x1be9: 0x0399, + 0x1bea: 0x03a1, 0x1beb: 0x03a9, 0x1bec: 0x23f9, 0x1bed: 0x2401, 0x1bee: 0x2409, 0x1bef: 0x04d1, + 0x1bf0: 0x05f9, 0x1bf1: 0x2411, 0x1bf2: 0x2419, 0x1bf3: 0x2421, 0x1bf4: 0x2429, 0x1bf5: 0x2431, + 0x1bf6: 0x2439, 0x1bf7: 0x0799, 0x1bf8: 0x03c1, 0x1bf9: 0x04d1, 0x1bfa: 0x2441, 0x1bfb: 0x2449, + 0x1bfc: 0x2451, 0x1bfd: 0x03b1, 0x1bfe: 0x03b9, 0x1bff: 0x2459, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0769, 0x1c01: 0x2461, 0x1c02: 0x23f1, 0x1c03: 0x0399, 0x1c04: 0x03a1, 0x1c05: 0x03a9, + 0x1c06: 0x23f9, 0x1c07: 0x2401, 0x1c08: 0x2409, 0x1c09: 0x04d1, 0x1c0a: 0x05f9, 0x1c0b: 0x2411, + 0x1c0c: 0x2419, 0x1c0d: 0x2421, 0x1c0e: 0x2429, 0x1c0f: 0x2431, 0x1c10: 0x2439, 0x1c11: 0x0799, + 0x1c12: 0x03c1, 0x1c13: 0x2441, 0x1c14: 0x2441, 0x1c15: 0x2449, 0x1c16: 0x2451, 0x1c17: 0x03b1, + 0x1c18: 0x03b9, 0x1c19: 0x2459, 0x1c1a: 0x0769, 0x1c1b: 0x2469, 0x1c1c: 0x23f9, 0x1c1d: 0x04d1, + 0x1c1e: 0x2411, 0x1c1f: 0x03b1, 0x1c20: 0x03c1, 0x1c21: 0x0799, 0x1c22: 0x23f1, 0x1c23: 0x0399, + 0x1c24: 0x03a1, 0x1c25: 0x03a9, 0x1c26: 0x23f9, 0x1c27: 0x2401, 0x1c28: 0x2409, 0x1c29: 0x04d1, + 0x1c2a: 0x05f9, 0x1c2b: 0x2411, 0x1c2c: 0x2419, 0x1c2d: 0x2421, 0x1c2e: 0x2429, 0x1c2f: 0x2431, + 0x1c30: 0x2439, 0x1c31: 0x0799, 0x1c32: 0x03c1, 0x1c33: 0x04d1, 0x1c34: 0x2441, 0x1c35: 0x2449, + 0x1c36: 0x2451, 0x1c37: 0x03b1, 0x1c38: 0x03b9, 0x1c39: 0x2459, 0x1c3a: 0x0769, 0x1c3b: 0x2461, + 0x1c3c: 0x23f1, 0x1c3d: 0x0399, 0x1c3e: 0x03a1, 0x1c3f: 0x03a9, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x23f9, 0x1c41: 0x2401, 0x1c42: 0x2409, 0x1c43: 0x04d1, 0x1c44: 0x05f9, 0x1c45: 0x2411, + 0x1c46: 0x2419, 0x1c47: 0x2421, 0x1c48: 0x2429, 0x1c49: 0x2431, 0x1c4a: 0x2439, 0x1c4b: 0x0799, + 0x1c4c: 0x03c1, 0x1c4d: 0x2441, 0x1c4e: 0x2441, 0x1c4f: 0x2449, 0x1c50: 0x2451, 0x1c51: 0x03b1, + 0x1c52: 0x03b9, 0x1c53: 0x2459, 0x1c54: 0x0769, 0x1c55: 0x2469, 0x1c56: 0x23f9, 0x1c57: 0x04d1, + 0x1c58: 0x2411, 0x1c59: 0x03b1, 0x1c5a: 0x03c1, 0x1c5b: 0x0799, 0x1c5c: 0x23f1, 0x1c5d: 0x0399, + 0x1c5e: 0x03a1, 0x1c5f: 0x03a9, 0x1c60: 0x23f9, 0x1c61: 0x2401, 0x1c62: 0x2409, 0x1c63: 0x04d1, + 0x1c64: 0x05f9, 0x1c65: 0x2411, 0x1c66: 0x2419, 0x1c67: 0x2421, 0x1c68: 0x2429, 0x1c69: 0x2431, + 0x1c6a: 0x2439, 0x1c6b: 0x0799, 0x1c6c: 0x03c1, 0x1c6d: 0x04d1, 0x1c6e: 0x2441, 0x1c6f: 0x2449, + 0x1c70: 0x2451, 0x1c71: 0x03b1, 0x1c72: 0x03b9, 0x1c73: 0x2459, 0x1c74: 0x0769, 0x1c75: 0x2461, + 0x1c76: 0x23f1, 0x1c77: 0x0399, 0x1c78: 0x03a1, 0x1c79: 0x03a9, 0x1c7a: 0x23f9, 0x1c7b: 0x2401, + 0x1c7c: 0x2409, 0x1c7d: 0x04d1, 0x1c7e: 0x05f9, 0x1c7f: 0x2411, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x2419, 0x1c81: 0x2421, 0x1c82: 0x2429, 0x1c83: 0x2431, 0x1c84: 0x2439, 0x1c85: 0x0799, + 0x1c86: 0x03c1, 0x1c87: 0x2441, 0x1c88: 0x2441, 0x1c89: 0x2449, 0x1c8a: 0x2451, 0x1c8b: 0x03b1, + 0x1c8c: 0x03b9, 0x1c8d: 0x2459, 0x1c8e: 0x0769, 0x1c8f: 0x2469, 0x1c90: 0x23f9, 0x1c91: 0x04d1, + 0x1c92: 0x2411, 0x1c93: 0x03b1, 0x1c94: 0x03c1, 0x1c95: 0x0799, 0x1c96: 0x23f1, 0x1c97: 0x0399, + 0x1c98: 0x03a1, 0x1c99: 0x03a9, 0x1c9a: 0x23f9, 0x1c9b: 0x2401, 0x1c9c: 0x2409, 0x1c9d: 0x04d1, + 0x1c9e: 0x05f9, 0x1c9f: 0x2411, 0x1ca0: 0x2419, 0x1ca1: 0x2421, 0x1ca2: 0x2429, 0x1ca3: 0x2431, + 0x1ca4: 0x2439, 0x1ca5: 0x0799, 0x1ca6: 0x03c1, 0x1ca7: 0x04d1, 0x1ca8: 0x2441, 0x1ca9: 0x2449, + 0x1caa: 0x2451, 0x1cab: 0x03b1, 0x1cac: 0x03b9, 0x1cad: 0x2459, 0x1cae: 0x0769, 0x1caf: 0x2461, + 0x1cb0: 0x23f1, 0x1cb1: 0x0399, 0x1cb2: 0x03a1, 0x1cb3: 0x03a9, 0x1cb4: 0x23f9, 0x1cb5: 0x2401, + 0x1cb6: 0x2409, 0x1cb7: 0x04d1, 0x1cb8: 0x05f9, 0x1cb9: 0x2411, 0x1cba: 0x2419, 0x1cbb: 0x2421, + 0x1cbc: 0x2429, 0x1cbd: 0x2431, 0x1cbe: 0x2439, 0x1cbf: 0x0799, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x03c1, 0x1cc1: 0x2441, 0x1cc2: 0x2441, 0x1cc3: 0x2449, 0x1cc4: 0x2451, 0x1cc5: 0x03b1, + 0x1cc6: 0x03b9, 0x1cc7: 0x2459, 0x1cc8: 0x0769, 0x1cc9: 0x2469, 0x1cca: 0x23f9, 0x1ccb: 0x04d1, + 0x1ccc: 0x2411, 0x1ccd: 0x03b1, 0x1cce: 0x03c1, 0x1ccf: 0x0799, 0x1cd0: 0x23f1, 0x1cd1: 0x0399, + 0x1cd2: 0x03a1, 0x1cd3: 0x03a9, 0x1cd4: 0x23f9, 0x1cd5: 0x2401, 0x1cd6: 0x2409, 0x1cd7: 0x04d1, + 0x1cd8: 0x05f9, 0x1cd9: 0x2411, 0x1cda: 0x2419, 0x1cdb: 0x2421, 0x1cdc: 0x2429, 0x1cdd: 0x2431, + 0x1cde: 0x2439, 0x1cdf: 0x0799, 0x1ce0: 0x03c1, 0x1ce1: 0x04d1, 0x1ce2: 0x2441, 0x1ce3: 0x2449, + 0x1ce4: 0x2451, 0x1ce5: 0x03b1, 0x1ce6: 0x03b9, 0x1ce7: 0x2459, 0x1ce8: 0x0769, 0x1ce9: 0x2461, + 0x1cea: 0x23f1, 0x1ceb: 0x0399, 0x1cec: 0x03a1, 0x1ced: 0x03a9, 0x1cee: 0x23f9, 0x1cef: 0x2401, + 0x1cf0: 0x2409, 0x1cf1: 0x04d1, 0x1cf2: 0x05f9, 0x1cf3: 0x2411, 0x1cf4: 0x2419, 0x1cf5: 0x2421, + 0x1cf6: 0x2429, 0x1cf7: 0x2431, 0x1cf8: 0x2439, 0x1cf9: 0x0799, 0x1cfa: 0x03c1, 0x1cfb: 0x2441, + 0x1cfc: 0x2441, 0x1cfd: 0x2449, 0x1cfe: 0x2451, 0x1cff: 0x03b1, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x03b9, 0x1d01: 0x2459, 0x1d02: 0x0769, 0x1d03: 0x2469, 0x1d04: 0x23f9, 0x1d05: 0x04d1, + 0x1d06: 0x2411, 0x1d07: 0x03b1, 0x1d08: 0x03c1, 0x1d09: 0x0799, 0x1d0a: 0x2471, 0x1d0b: 0x2471, + 0x1d0c: 0x0040, 0x1d0d: 0x0040, 0x1d0e: 0x06e1, 0x1d0f: 0x0049, 0x1d10: 0x0029, 0x1d11: 0x0031, + 0x1d12: 0x06e9, 0x1d13: 0x06f1, 0x1d14: 0x06f9, 0x1d15: 0x0701, 0x1d16: 0x0709, 0x1d17: 0x0711, + 0x1d18: 0x06e1, 0x1d19: 0x0049, 0x1d1a: 0x0029, 0x1d1b: 0x0031, 0x1d1c: 0x06e9, 0x1d1d: 0x06f1, + 0x1d1e: 0x06f9, 0x1d1f: 0x0701, 0x1d20: 0x0709, 0x1d21: 0x0711, 0x1d22: 0x06e1, 0x1d23: 0x0049, + 0x1d24: 0x0029, 0x1d25: 0x0031, 0x1d26: 0x06e9, 0x1d27: 0x06f1, 0x1d28: 0x06f9, 0x1d29: 0x0701, + 0x1d2a: 0x0709, 0x1d2b: 0x0711, 0x1d2c: 0x06e1, 0x1d2d: 0x0049, 0x1d2e: 0x0029, 0x1d2f: 0x0031, + 0x1d30: 0x06e9, 0x1d31: 0x06f1, 0x1d32: 0x06f9, 0x1d33: 0x0701, 0x1d34: 0x0709, 0x1d35: 0x0711, + 0x1d36: 0x06e1, 0x1d37: 0x0049, 0x1d38: 0x0029, 0x1d39: 0x0031, 0x1d3a: 0x06e9, 0x1d3b: 0x06f1, + 0x1d3c: 0x06f9, 0x1d3d: 0x0701, 0x1d3e: 0x0709, 0x1d3f: 0x0711, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x3308, 0x1d41: 0x3308, 0x1d42: 0x3308, 0x1d43: 0x3308, 0x1d44: 0x3308, 0x1d45: 0x3308, + 0x1d46: 0x3308, 0x1d47: 0x0040, 0x1d48: 0x3308, 0x1d49: 0x3308, 0x1d4a: 0x3308, 0x1d4b: 0x3308, + 0x1d4c: 0x3308, 0x1d4d: 0x3308, 0x1d4e: 0x3308, 0x1d4f: 0x3308, 0x1d50: 0x3308, 0x1d51: 0x3308, + 0x1d52: 0x3308, 0x1d53: 0x3308, 0x1d54: 0x3308, 0x1d55: 0x3308, 0x1d56: 0x3308, 0x1d57: 0x3308, + 0x1d58: 0x3308, 0x1d59: 0x0040, 0x1d5a: 0x0040, 0x1d5b: 0x3308, 0x1d5c: 0x3308, 0x1d5d: 0x3308, + 0x1d5e: 0x3308, 0x1d5f: 0x3308, 0x1d60: 0x3308, 0x1d61: 0x3308, 0x1d62: 0x0040, 0x1d63: 0x3308, + 0x1d64: 0x3308, 0x1d65: 0x0040, 0x1d66: 0x3308, 0x1d67: 0x3308, 0x1d68: 0x3308, 0x1d69: 0x3308, + 0x1d6a: 0x3308, 0x1d6b: 0x0040, 0x1d6c: 0x0040, 0x1d6d: 0x0040, 0x1d6e: 0x0040, 0x1d6f: 0x0040, + 0x1d70: 0x2479, 0x1d71: 0x2481, 0x1d72: 0x02a9, 0x1d73: 0x2489, 0x1d74: 0x02b1, 0x1d75: 0x2491, + 0x1d76: 0x2499, 0x1d77: 0x24a1, 0x1d78: 0x24a9, 0x1d79: 0x24b1, 0x1d7a: 0x24b9, 0x1d7b: 0x24c1, + 0x1d7c: 0x02b9, 0x1d7d: 0x24c9, 0x1d7e: 0x24d1, 0x1d7f: 0x02c1, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x02c9, 0x1d81: 0x24d9, 0x1d82: 0x24e1, 0x1d83: 0x24e9, 0x1d84: 0x24f1, 0x1d85: 0x24f9, + 0x1d86: 0x2501, 0x1d87: 0x2509, 0x1d88: 0x2511, 0x1d89: 0x2519, 0x1d8a: 0x2521, 0x1d8b: 0x2529, + 0x1d8c: 0x2531, 0x1d8d: 0x2539, 0x1d8e: 0x2541, 0x1d8f: 0x2549, 0x1d90: 0x2551, 0x1d91: 0x2479, + 0x1d92: 0x2481, 0x1d93: 0x02a9, 0x1d94: 0x2489, 0x1d95: 0x02b1, 0x1d96: 0x2491, 0x1d97: 0x2499, + 0x1d98: 0x24a1, 0x1d99: 0x24a9, 0x1d9a: 0x24b1, 0x1d9b: 0x24b9, 0x1d9c: 0x02b9, 0x1d9d: 0x24c9, + 0x1d9e: 0x02c1, 0x1d9f: 0x24d9, 0x1da0: 0x24e1, 0x1da1: 0x24e9, 0x1da2: 0x24f1, 0x1da3: 0x24f9, + 0x1da4: 0x2501, 0x1da5: 0x02d1, 0x1da6: 0x2509, 0x1da7: 0x2559, 0x1da8: 0x2531, 0x1da9: 0x2561, + 0x1daa: 0x2569, 0x1dab: 0x2571, 0x1dac: 0x2579, 0x1dad: 0x2581, 0x1dae: 0x0040, 0x1daf: 0x0040, + 0x1db0: 0x0040, 0x1db1: 0x0040, 0x1db2: 0x0040, 0x1db3: 0x0040, 0x1db4: 0x0040, 0x1db5: 0x0040, + 0x1db6: 0x0040, 0x1db7: 0x0040, 0x1db8: 0x0040, 0x1db9: 0x0040, 0x1dba: 0x0040, 0x1dbb: 0x0040, + 0x1dbc: 0x0040, 0x1dbd: 0x0040, 0x1dbe: 0x0040, 0x1dbf: 0x0040, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xe115, 0x1dc1: 0xe115, 0x1dc2: 0xe135, 0x1dc3: 0xe135, 0x1dc4: 0xe115, 0x1dc5: 0xe115, + 0x1dc6: 0xe175, 0x1dc7: 0xe175, 0x1dc8: 0xe115, 0x1dc9: 0xe115, 0x1dca: 0xe135, 0x1dcb: 0xe135, + 0x1dcc: 0xe115, 0x1dcd: 0xe115, 0x1dce: 0xe1f5, 0x1dcf: 0xe1f5, 0x1dd0: 0xe115, 0x1dd1: 0xe115, + 0x1dd2: 0xe135, 0x1dd3: 0xe135, 0x1dd4: 0xe115, 0x1dd5: 0xe115, 0x1dd6: 0xe175, 0x1dd7: 0xe175, + 0x1dd8: 0xe115, 0x1dd9: 0xe115, 0x1dda: 0xe135, 0x1ddb: 0xe135, 0x1ddc: 0xe115, 0x1ddd: 0xe115, + 0x1dde: 0x8ca5, 0x1ddf: 0x8ca5, 0x1de0: 0x04b5, 0x1de1: 0x04b5, 0x1de2: 0x0a08, 0x1de3: 0x0a08, + 0x1de4: 0x0a08, 0x1de5: 0x0a08, 0x1de6: 0x0a08, 0x1de7: 0x0a08, 0x1de8: 0x0a08, 0x1de9: 0x0a08, + 0x1dea: 0x0a08, 0x1deb: 0x0a08, 0x1dec: 0x0a08, 0x1ded: 0x0a08, 0x1dee: 0x0a08, 0x1def: 0x0a08, + 0x1df0: 0x0a08, 0x1df1: 0x0a08, 0x1df2: 0x0a08, 0x1df3: 0x0a08, 0x1df4: 0x0a08, 0x1df5: 0x0a08, + 0x1df6: 0x0a08, 0x1df7: 0x0a08, 0x1df8: 0x0a08, 0x1df9: 0x0a08, 0x1dfa: 0x0a08, 0x1dfb: 0x0a08, + 0x1dfc: 0x0a08, 0x1dfd: 0x0a08, 0x1dfe: 0x0a08, 0x1dff: 0x0a08, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x20b1, 0x1e01: 0x20b9, 0x1e02: 0x20d9, 0x1e03: 0x20f1, 0x1e04: 0x0040, 0x1e05: 0x2189, + 0x1e06: 0x2109, 0x1e07: 0x20e1, 0x1e08: 0x2131, 0x1e09: 0x2191, 0x1e0a: 0x2161, 0x1e0b: 0x2169, + 0x1e0c: 0x2171, 0x1e0d: 0x2179, 0x1e0e: 0x2111, 0x1e0f: 0x2141, 0x1e10: 0x2151, 0x1e11: 0x2121, + 0x1e12: 0x2159, 0x1e13: 0x2101, 0x1e14: 0x2119, 0x1e15: 0x20c9, 0x1e16: 0x20d1, 0x1e17: 0x20e9, + 0x1e18: 0x20f9, 0x1e19: 0x2129, 0x1e1a: 0x2139, 0x1e1b: 0x2149, 0x1e1c: 0x2589, 0x1e1d: 0x1689, + 0x1e1e: 0x2591, 0x1e1f: 0x2599, 0x1e20: 0x0040, 0x1e21: 0x20b9, 0x1e22: 0x20d9, 0x1e23: 0x0040, + 0x1e24: 0x2181, 0x1e25: 0x0040, 0x1e26: 0x0040, 0x1e27: 0x20e1, 0x1e28: 0x0040, 0x1e29: 0x2191, + 0x1e2a: 0x2161, 0x1e2b: 0x2169, 0x1e2c: 0x2171, 0x1e2d: 0x2179, 0x1e2e: 0x2111, 0x1e2f: 0x2141, + 0x1e30: 0x2151, 0x1e31: 0x2121, 0x1e32: 0x2159, 0x1e33: 0x0040, 0x1e34: 0x2119, 0x1e35: 0x20c9, + 0x1e36: 0x20d1, 0x1e37: 0x20e9, 0x1e38: 0x0040, 0x1e39: 0x2129, 0x1e3a: 0x0040, 0x1e3b: 0x2149, + 0x1e3c: 0x0040, 0x1e3d: 0x0040, 0x1e3e: 0x0040, 0x1e3f: 0x0040, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x0040, 0x1e41: 0x0040, 0x1e42: 0x20d9, 0x1e43: 0x0040, 0x1e44: 0x0040, 0x1e45: 0x0040, + 0x1e46: 0x0040, 0x1e47: 0x20e1, 0x1e48: 0x0040, 0x1e49: 0x2191, 0x1e4a: 0x0040, 0x1e4b: 0x2169, + 0x1e4c: 0x0040, 0x1e4d: 0x2179, 0x1e4e: 0x2111, 0x1e4f: 0x2141, 0x1e50: 0x0040, 0x1e51: 0x2121, + 0x1e52: 0x2159, 0x1e53: 0x0040, 0x1e54: 0x2119, 0x1e55: 0x0040, 0x1e56: 0x0040, 0x1e57: 0x20e9, + 0x1e58: 0x0040, 0x1e59: 0x2129, 0x1e5a: 0x0040, 0x1e5b: 0x2149, 0x1e5c: 0x0040, 0x1e5d: 0x1689, + 0x1e5e: 0x0040, 0x1e5f: 0x2599, 0x1e60: 0x0040, 0x1e61: 0x20b9, 0x1e62: 0x20d9, 0x1e63: 0x0040, + 0x1e64: 0x2181, 0x1e65: 0x0040, 0x1e66: 0x0040, 0x1e67: 0x20e1, 0x1e68: 0x2131, 0x1e69: 0x2191, + 0x1e6a: 0x2161, 0x1e6b: 0x0040, 0x1e6c: 0x2171, 0x1e6d: 0x2179, 0x1e6e: 0x2111, 0x1e6f: 0x2141, + 0x1e70: 0x2151, 0x1e71: 0x2121, 0x1e72: 0x2159, 0x1e73: 0x0040, 0x1e74: 0x2119, 0x1e75: 0x20c9, + 0x1e76: 0x20d1, 0x1e77: 0x20e9, 0x1e78: 0x0040, 0x1e79: 0x2129, 0x1e7a: 0x2139, 0x1e7b: 0x2149, + 0x1e7c: 0x2589, 0x1e7d: 0x0040, 0x1e7e: 0x2591, 0x1e7f: 0x0040, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x20b1, 0x1e81: 0x20b9, 0x1e82: 0x20d9, 0x1e83: 0x20f1, 0x1e84: 0x2181, 0x1e85: 0x2189, + 0x1e86: 0x2109, 0x1e87: 0x20e1, 0x1e88: 0x2131, 0x1e89: 0x2191, 0x1e8a: 0x0040, 0x1e8b: 0x2169, + 0x1e8c: 0x2171, 0x1e8d: 0x2179, 0x1e8e: 0x2111, 0x1e8f: 0x2141, 0x1e90: 0x2151, 0x1e91: 0x2121, + 0x1e92: 0x2159, 0x1e93: 0x2101, 0x1e94: 0x2119, 0x1e95: 0x20c9, 0x1e96: 0x20d1, 0x1e97: 0x20e9, + 0x1e98: 0x20f9, 0x1e99: 0x2129, 0x1e9a: 0x2139, 0x1e9b: 0x2149, 0x1e9c: 0x0040, 0x1e9d: 0x0040, + 0x1e9e: 0x0040, 0x1e9f: 0x0040, 0x1ea0: 0x0040, 0x1ea1: 0x20b9, 0x1ea2: 0x20d9, 0x1ea3: 0x20f1, + 0x1ea4: 0x0040, 0x1ea5: 0x2189, 0x1ea6: 0x2109, 0x1ea7: 0x20e1, 0x1ea8: 0x2131, 0x1ea9: 0x2191, + 0x1eaa: 0x0040, 0x1eab: 0x2169, 0x1eac: 0x2171, 0x1ead: 0x2179, 0x1eae: 0x2111, 0x1eaf: 0x2141, + 0x1eb0: 0x2151, 0x1eb1: 0x2121, 0x1eb2: 0x2159, 0x1eb3: 0x2101, 0x1eb4: 0x2119, 0x1eb5: 0x20c9, + 0x1eb6: 0x20d1, 0x1eb7: 0x20e9, 0x1eb8: 0x20f9, 0x1eb9: 0x2129, 0x1eba: 0x2139, 0x1ebb: 0x2149, + 0x1ebc: 0x0040, 0x1ebd: 0x0040, 0x1ebe: 0x0040, 0x1ebf: 0x0040, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x0040, 0x1ec1: 0x25a2, 0x1ec2: 0x25aa, 0x1ec3: 0x25b2, 0x1ec4: 0x25ba, 0x1ec5: 0x25c2, + 0x1ec6: 0x25ca, 0x1ec7: 0x25d2, 0x1ec8: 0x25da, 0x1ec9: 0x25e2, 0x1eca: 0x25ea, 0x1ecb: 0x0018, + 0x1ecc: 0x0018, 0x1ecd: 0x0018, 0x1ece: 0x0018, 0x1ecf: 0x0018, 0x1ed0: 0x25f2, 0x1ed1: 0x25fa, + 0x1ed2: 0x2602, 0x1ed3: 0x260a, 0x1ed4: 0x2612, 0x1ed5: 0x261a, 0x1ed6: 0x2622, 0x1ed7: 0x262a, + 0x1ed8: 0x2632, 0x1ed9: 0x263a, 0x1eda: 0x2642, 0x1edb: 0x264a, 0x1edc: 0x2652, 0x1edd: 0x265a, + 0x1ede: 0x2662, 0x1edf: 0x266a, 0x1ee0: 0x2672, 0x1ee1: 0x267a, 0x1ee2: 0x2682, 0x1ee3: 0x268a, + 0x1ee4: 0x2692, 0x1ee5: 0x269a, 0x1ee6: 0x26a2, 0x1ee7: 0x26aa, 0x1ee8: 0x26b2, 0x1ee9: 0x26ba, + 0x1eea: 0x26c1, 0x1eeb: 0x03d9, 0x1eec: 0x00b9, 0x1eed: 0x1239, 0x1eee: 0x26c9, 0x1eef: 0x0018, + 0x1ef0: 0x0019, 0x1ef1: 0x02e9, 0x1ef2: 0x03d9, 0x1ef3: 0x02f1, 0x1ef4: 0x02f9, 0x1ef5: 0x03f1, + 0x1ef6: 0x0309, 0x1ef7: 0x00a9, 0x1ef8: 0x0311, 0x1ef9: 0x00b1, 0x1efa: 0x0319, 0x1efb: 0x0101, + 0x1efc: 0x0321, 0x1efd: 0x0329, 0x1efe: 0x0051, 0x1eff: 0x0339, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x0751, 0x1f01: 0x00b9, 0x1f02: 0x0089, 0x1f03: 0x0341, 0x1f04: 0x0349, 0x1f05: 0x0391, + 0x1f06: 0x00c1, 0x1f07: 0x0109, 0x1f08: 0x00c9, 0x1f09: 0x04b1, 0x1f0a: 0x26d1, 0x1f0b: 0x11f9, + 0x1f0c: 0x26d9, 0x1f0d: 0x04d9, 0x1f0e: 0x26e1, 0x1f0f: 0x26e9, 0x1f10: 0x0018, 0x1f11: 0x0018, + 0x1f12: 0x0018, 0x1f13: 0x0018, 0x1f14: 0x0018, 0x1f15: 0x0018, 0x1f16: 0x0018, 0x1f17: 0x0018, + 0x1f18: 0x0018, 0x1f19: 0x0018, 0x1f1a: 0x0018, 0x1f1b: 0x0018, 0x1f1c: 0x0018, 0x1f1d: 0x0018, + 0x1f1e: 0x0018, 0x1f1f: 0x0018, 0x1f20: 0x0018, 0x1f21: 0x0018, 0x1f22: 0x0018, 0x1f23: 0x0018, + 0x1f24: 0x0018, 0x1f25: 0x0018, 0x1f26: 0x0018, 0x1f27: 0x0018, 0x1f28: 0x0018, 0x1f29: 0x0018, + 0x1f2a: 0x26f1, 0x1f2b: 0x26f9, 0x1f2c: 0x2701, 0x1f2d: 0x0018, 0x1f2e: 0x0018, 0x1f2f: 0x0018, + 0x1f30: 0x0018, 0x1f31: 0x0018, 0x1f32: 0x0018, 0x1f33: 0x0018, 0x1f34: 0x0018, 0x1f35: 0x0018, + 0x1f36: 0x0018, 0x1f37: 0x0018, 0x1f38: 0x0018, 0x1f39: 0x0018, 0x1f3a: 0x0018, 0x1f3b: 0x0018, + 0x1f3c: 0x0018, 0x1f3d: 0x0018, 0x1f3e: 0x0018, 0x1f3f: 0x0018, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x2711, 0x1f41: 0x2719, 0x1f42: 0x2721, 0x1f43: 0x0040, 0x1f44: 0x0040, 0x1f45: 0x0040, + 0x1f46: 0x0040, 0x1f47: 0x0040, 0x1f48: 0x0040, 0x1f49: 0x0040, 0x1f4a: 0x0040, 0x1f4b: 0x0040, + 0x1f4c: 0x0040, 0x1f4d: 0x0040, 0x1f4e: 0x0040, 0x1f4f: 0x0040, 0x1f50: 0x2729, 0x1f51: 0x2731, + 0x1f52: 0x2739, 0x1f53: 0x2741, 0x1f54: 0x2749, 0x1f55: 0x2751, 0x1f56: 0x2759, 0x1f57: 0x2761, + 0x1f58: 0x2769, 0x1f59: 0x2771, 0x1f5a: 0x2779, 0x1f5b: 0x2781, 0x1f5c: 0x2789, 0x1f5d: 0x2791, + 0x1f5e: 0x2799, 0x1f5f: 0x27a1, 0x1f60: 0x27a9, 0x1f61: 0x27b1, 0x1f62: 0x27b9, 0x1f63: 0x27c1, + 0x1f64: 0x27c9, 0x1f65: 0x27d1, 0x1f66: 0x27d9, 0x1f67: 0x27e1, 0x1f68: 0x27e9, 0x1f69: 0x27f1, + 0x1f6a: 0x27f9, 0x1f6b: 0x2801, 0x1f6c: 0x2809, 0x1f6d: 0x2811, 0x1f6e: 0x2819, 0x1f6f: 0x2821, + 0x1f70: 0x2829, 0x1f71: 0x2831, 0x1f72: 0x2839, 0x1f73: 0x2841, 0x1f74: 0x2849, 0x1f75: 0x2851, + 0x1f76: 0x2859, 0x1f77: 0x2861, 0x1f78: 0x2869, 0x1f79: 0x2871, 0x1f7a: 0x2879, 0x1f7b: 0x2881, + 0x1f7c: 0x0040, 0x1f7d: 0x0040, 0x1f7e: 0x0040, 0x1f7f: 0x0040, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x28e1, 0x1f81: 0x28e9, 0x1f82: 0x28f1, 0x1f83: 0x8cbd, 0x1f84: 0x28f9, 0x1f85: 0x2901, + 0x1f86: 0x2909, 0x1f87: 0x2911, 0x1f88: 0x2919, 0x1f89: 0x2921, 0x1f8a: 0x2929, 0x1f8b: 0x2931, + 0x1f8c: 0x2939, 0x1f8d: 0x8cdd, 0x1f8e: 0x2941, 0x1f8f: 0x2949, 0x1f90: 0x2951, 0x1f91: 0x2959, + 0x1f92: 0x8cfd, 0x1f93: 0x2961, 0x1f94: 0x2969, 0x1f95: 0x2799, 0x1f96: 0x8d1d, 0x1f97: 0x2971, + 0x1f98: 0x2979, 0x1f99: 0x2981, 0x1f9a: 0x2989, 0x1f9b: 0x2991, 0x1f9c: 0x8d3d, 0x1f9d: 0x2999, + 0x1f9e: 0x29a1, 0x1f9f: 0x29a9, 0x1fa0: 0x29b1, 0x1fa1: 0x29b9, 0x1fa2: 0x2871, 0x1fa3: 0x29c1, + 0x1fa4: 0x29c9, 0x1fa5: 0x29d1, 0x1fa6: 0x29d9, 0x1fa7: 0x29e1, 0x1fa8: 0x29e9, 0x1fa9: 0x29f1, + 0x1faa: 0x29f9, 0x1fab: 0x2a01, 0x1fac: 0x2a09, 0x1fad: 0x2a11, 0x1fae: 0x2a19, 0x1faf: 0x2a21, + 0x1fb0: 0x2a29, 0x1fb1: 0x2a31, 0x1fb2: 0x2a31, 0x1fb3: 0x2a31, 0x1fb4: 0x8d5d, 0x1fb5: 0x2a39, + 0x1fb6: 0x2a41, 0x1fb7: 0x2a49, 0x1fb8: 0x8d7d, 0x1fb9: 0x2a51, 0x1fba: 0x2a59, 0x1fbb: 0x2a61, + 0x1fbc: 0x2a69, 0x1fbd: 0x2a71, 0x1fbe: 0x2a79, 0x1fbf: 0x2a81, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x2a89, 0x1fc1: 0x2a91, 0x1fc2: 0x2a99, 0x1fc3: 0x2aa1, 0x1fc4: 0x2aa9, 0x1fc5: 0x2ab1, + 0x1fc6: 0x2ab1, 0x1fc7: 0x2ab9, 0x1fc8: 0x2ac1, 0x1fc9: 0x2ac9, 0x1fca: 0x2ad1, 0x1fcb: 0x2ad9, + 0x1fcc: 0x2ae1, 0x1fcd: 0x2ae9, 0x1fce: 0x2af1, 0x1fcf: 0x2af9, 0x1fd0: 0x2b01, 0x1fd1: 0x2b09, + 0x1fd2: 0x2b11, 0x1fd3: 0x2b19, 0x1fd4: 0x2b21, 0x1fd5: 0x2b29, 0x1fd6: 0x2b31, 0x1fd7: 0x2b39, + 0x1fd8: 0x2b41, 0x1fd9: 0x8d9d, 0x1fda: 0x2b49, 0x1fdb: 0x2b51, 0x1fdc: 0x2b59, 0x1fdd: 0x2751, + 0x1fde: 0x2b61, 0x1fdf: 0x2b69, 0x1fe0: 0x8dbd, 0x1fe1: 0x8ddd, 0x1fe2: 0x2b71, 0x1fe3: 0x2b79, + 0x1fe4: 0x2b81, 0x1fe5: 0x2b89, 0x1fe6: 0x2b91, 0x1fe7: 0x2b99, 0x1fe8: 0x2040, 0x1fe9: 0x2ba1, + 0x1fea: 0x2ba9, 0x1feb: 0x2ba9, 0x1fec: 0x8dfd, 0x1fed: 0x2bb1, 0x1fee: 0x2bb9, 0x1fef: 0x2bc1, + 0x1ff0: 0x2bc9, 0x1ff1: 0x8e1d, 0x1ff2: 0x2bd1, 0x1ff3: 0x2bd9, 0x1ff4: 0x2040, 0x1ff5: 0x2be1, + 0x1ff6: 0x2be9, 0x1ff7: 0x2bf1, 0x1ff8: 0x2bf9, 0x1ff9: 0x2c01, 0x1ffa: 0x2c09, 0x1ffb: 0x8e3d, + 0x1ffc: 0x2c11, 0x1ffd: 0x8e5d, 0x1ffe: 0x2c19, 0x1fff: 0x2c21, + // Block 0x80, offset 0x2000 + 0x2000: 0x2c29, 0x2001: 0x2c31, 0x2002: 0x2c39, 0x2003: 0x2c41, 0x2004: 0x2c49, 0x2005: 0x2c51, + 0x2006: 0x2c59, 0x2007: 0x2c61, 0x2008: 0x2c69, 0x2009: 0x8e7d, 0x200a: 0x2c71, 0x200b: 0x2c79, + 0x200c: 0x2c81, 0x200d: 0x2c89, 0x200e: 0x2c91, 0x200f: 0x8e9d, 0x2010: 0x2c99, 0x2011: 0x8ebd, + 0x2012: 0x8edd, 0x2013: 0x2ca1, 0x2014: 0x2ca9, 0x2015: 0x2ca9, 0x2016: 0x2cb1, 0x2017: 0x8efd, + 0x2018: 0x8f1d, 0x2019: 0x2cb9, 0x201a: 0x2cc1, 0x201b: 0x2cc9, 0x201c: 0x2cd1, 0x201d: 0x2cd9, + 0x201e: 0x2ce1, 0x201f: 0x2ce9, 0x2020: 0x2cf1, 0x2021: 0x2cf9, 0x2022: 0x2d01, 0x2023: 0x2d09, + 0x2024: 0x8f3d, 0x2025: 0x2d11, 0x2026: 0x2d19, 0x2027: 0x2d21, 0x2028: 0x2d29, 0x2029: 0x2d21, + 0x202a: 0x2d31, 0x202b: 0x2d39, 0x202c: 0x2d41, 0x202d: 0x2d49, 0x202e: 0x2d51, 0x202f: 0x2d59, + 0x2030: 0x2d61, 0x2031: 0x2d69, 0x2032: 0x2d71, 0x2033: 0x2d79, 0x2034: 0x2d81, 0x2035: 0x2d89, + 0x2036: 0x2d91, 0x2037: 0x2d99, 0x2038: 0x8f5d, 0x2039: 0x2da1, 0x203a: 0x2da9, 0x203b: 0x2db1, + 0x203c: 0x2db9, 0x203d: 0x2dc1, 0x203e: 0x8f7d, 0x203f: 0x2dc9, + // Block 0x81, offset 0x2040 + 0x2040: 0x2dd1, 0x2041: 0x2dd9, 0x2042: 0x2de1, 0x2043: 0x2de9, 0x2044: 0x2df1, 0x2045: 0x2df9, + 0x2046: 0x2e01, 0x2047: 0x2e09, 0x2048: 0x2e11, 0x2049: 0x2e19, 0x204a: 0x8f9d, 0x204b: 0x2e21, + 0x204c: 0x2e29, 0x204d: 0x2e31, 0x204e: 0x2e39, 0x204f: 0x2e41, 0x2050: 0x2e49, 0x2051: 0x2e51, + 0x2052: 0x2e59, 0x2053: 0x2e61, 0x2054: 0x2e69, 0x2055: 0x2e71, 0x2056: 0x2e79, 0x2057: 0x2e81, + 0x2058: 0x2e89, 0x2059: 0x2e91, 0x205a: 0x2e99, 0x205b: 0x2ea1, 0x205c: 0x2ea9, 0x205d: 0x8fbd, + 0x205e: 0x2eb1, 0x205f: 0x2eb9, 0x2060: 0x2ec1, 0x2061: 0x2ec9, 0x2062: 0x2ed1, 0x2063: 0x8fdd, + 0x2064: 0x2ed9, 0x2065: 0x2ee1, 0x2066: 0x2ee9, 0x2067: 0x2ef1, 0x2068: 0x2ef9, 0x2069: 0x2f01, + 0x206a: 0x2f09, 0x206b: 0x2f11, 0x206c: 0x7f0d, 0x206d: 0x2f19, 0x206e: 0x2f21, 0x206f: 0x2f29, + 0x2070: 0x8ffd, 0x2071: 0x2f31, 0x2072: 0x2f39, 0x2073: 0x2f41, 0x2074: 0x2f49, 0x2075: 0x2f51, + 0x2076: 0x2f59, 0x2077: 0x901d, 0x2078: 0x903d, 0x2079: 0x905d, 0x207a: 0x2f61, 0x207b: 0x907d, + 0x207c: 0x2f69, 0x207d: 0x2f71, 0x207e: 0x2f79, 0x207f: 0x2f81, + // Block 0x82, offset 0x2080 + 0x2080: 0x2f89, 0x2081: 0x2f91, 0x2082: 0x2f99, 0x2083: 0x2fa1, 0x2084: 0x2fa9, 0x2085: 0x2fb1, + 0x2086: 0x909d, 0x2087: 0x2fb9, 0x2088: 0x2fc1, 0x2089: 0x2fc9, 0x208a: 0x2fd1, 0x208b: 0x2fd9, + 0x208c: 0x2fe1, 0x208d: 0x90bd, 0x208e: 0x2fe9, 0x208f: 0x2ff1, 0x2090: 0x90dd, 0x2091: 0x90fd, + 0x2092: 0x2ff9, 0x2093: 0x3001, 0x2094: 0x3009, 0x2095: 0x3011, 0x2096: 0x3019, 0x2097: 0x3021, + 0x2098: 0x3029, 0x2099: 0x3031, 0x209a: 0x3039, 0x209b: 0x911d, 0x209c: 0x3041, 0x209d: 0x913d, + 0x209e: 0x3049, 0x209f: 0x2040, 0x20a0: 0x3051, 0x20a1: 0x3059, 0x20a2: 0x3061, 0x20a3: 0x915d, + 0x20a4: 0x3069, 0x20a5: 0x3071, 0x20a6: 0x917d, 0x20a7: 0x919d, 0x20a8: 0x3079, 0x20a9: 0x3081, + 0x20aa: 0x3089, 0x20ab: 0x3091, 0x20ac: 0x3099, 0x20ad: 0x3099, 0x20ae: 0x30a1, 0x20af: 0x30a9, + 0x20b0: 0x30b1, 0x20b1: 0x30b9, 0x20b2: 0x30c1, 0x20b3: 0x30c9, 0x20b4: 0x30d1, 0x20b5: 0x91bd, + 0x20b6: 0x30d9, 0x20b7: 0x91dd, 0x20b8: 0x30e1, 0x20b9: 0x91fd, 0x20ba: 0x30e9, 0x20bb: 0x921d, + 0x20bc: 0x923d, 0x20bd: 0x925d, 0x20be: 0x30f1, 0x20bf: 0x30f9, + // Block 0x83, offset 0x20c0 + 0x20c0: 0x3101, 0x20c1: 0x927d, 0x20c2: 0x929d, 0x20c3: 0x92bd, 0x20c4: 0x92dd, 0x20c5: 0x3109, + 0x20c6: 0x3111, 0x20c7: 0x3111, 0x20c8: 0x3119, 0x20c9: 0x3121, 0x20ca: 0x3129, 0x20cb: 0x3131, + 0x20cc: 0x3139, 0x20cd: 0x92fd, 0x20ce: 0x3141, 0x20cf: 0x3149, 0x20d0: 0x3151, 0x20d1: 0x3159, + 0x20d2: 0x931d, 0x20d3: 0x3161, 0x20d4: 0x933d, 0x20d5: 0x935d, 0x20d6: 0x3169, 0x20d7: 0x3171, + 0x20d8: 0x3179, 0x20d9: 0x3181, 0x20da: 0x3189, 0x20db: 0x3191, 0x20dc: 0x937d, 0x20dd: 0x939d, + 0x20de: 0x93bd, 0x20df: 0x2040, 0x20e0: 0x3199, 0x20e1: 0x93dd, 0x20e2: 0x31a1, 0x20e3: 0x31a9, + 0x20e4: 0x31b1, 0x20e5: 0x93fd, 0x20e6: 0x31b9, 0x20e7: 0x31c1, 0x20e8: 0x31c9, 0x20e9: 0x31d1, + 0x20ea: 0x31d9, 0x20eb: 0x941d, 0x20ec: 0x31e1, 0x20ed: 0x31e9, 0x20ee: 0x31f1, 0x20ef: 0x31f9, + 0x20f0: 0x3201, 0x20f1: 0x3209, 0x20f2: 0x943d, 0x20f3: 0x945d, 0x20f4: 0x3211, 0x20f5: 0x947d, + 0x20f6: 0x3219, 0x20f7: 0x949d, 0x20f8: 0x3221, 0x20f9: 0x3229, 0x20fa: 0x3231, 0x20fb: 0x94bd, + 0x20fc: 0x94dd, 0x20fd: 0x3239, 0x20fe: 0x94fd, 0x20ff: 0x3241, + // Block 0x84, offset 0x2100 + 0x2100: 0x951d, 0x2101: 0x3249, 0x2102: 0x3251, 0x2103: 0x3259, 0x2104: 0x3261, 0x2105: 0x3269, + 0x2106: 0x3271, 0x2107: 0x953d, 0x2108: 0x955d, 0x2109: 0x957d, 0x210a: 0x959d, 0x210b: 0x2ca1, + 0x210c: 0x3279, 0x210d: 0x3281, 0x210e: 0x3289, 0x210f: 0x3291, 0x2110: 0x3299, 0x2111: 0x32a1, + 0x2112: 0x32a9, 0x2113: 0x32b1, 0x2114: 0x32b9, 0x2115: 0x32c1, 0x2116: 0x32c9, 0x2117: 0x95bd, + 0x2118: 0x32d1, 0x2119: 0x32d9, 0x211a: 0x32e1, 0x211b: 0x32e9, 0x211c: 0x32f1, 0x211d: 0x32f9, + 0x211e: 0x3301, 0x211f: 0x3309, 0x2120: 0x3311, 0x2121: 0x3319, 0x2122: 0x3321, 0x2123: 0x3329, + 0x2124: 0x95dd, 0x2125: 0x95fd, 0x2126: 0x961d, 0x2127: 0x3331, 0x2128: 0x3339, 0x2129: 0x3341, + 0x212a: 0x3349, 0x212b: 0x963d, 0x212c: 0x3351, 0x212d: 0x965d, 0x212e: 0x3359, 0x212f: 0x3361, + 0x2130: 0x967d, 0x2131: 0x969d, 0x2132: 0x3369, 0x2133: 0x3371, 0x2134: 0x3379, 0x2135: 0x3381, + 0x2136: 0x3389, 0x2137: 0x3391, 0x2138: 0x3399, 0x2139: 0x33a1, 0x213a: 0x33a9, 0x213b: 0x33b1, + 0x213c: 0x33b9, 0x213d: 0x33c1, 0x213e: 0x33c9, 0x213f: 0x2040, + // Block 0x85, offset 0x2140 + 0x2140: 0x33d1, 0x2141: 0x33d9, 0x2142: 0x33e1, 0x2143: 0x33e9, 0x2144: 0x33f1, 0x2145: 0x96bd, + 0x2146: 0x33f9, 0x2147: 0x3401, 0x2148: 0x3409, 0x2149: 0x3411, 0x214a: 0x3419, 0x214b: 0x96dd, + 0x214c: 0x96fd, 0x214d: 0x3421, 0x214e: 0x3429, 0x214f: 0x3431, 0x2150: 0x3439, 0x2151: 0x3441, + 0x2152: 0x3449, 0x2153: 0x971d, 0x2154: 0x3451, 0x2155: 0x3459, 0x2156: 0x3461, 0x2157: 0x3469, + 0x2158: 0x973d, 0x2159: 0x975d, 0x215a: 0x3471, 0x215b: 0x3479, 0x215c: 0x3481, 0x215d: 0x977d, + 0x215e: 0x3489, 0x215f: 0x3491, 0x2160: 0x684d, 0x2161: 0x979d, 0x2162: 0x3499, 0x2163: 0x34a1, + 0x2164: 0x34a9, 0x2165: 0x97bd, 0x2166: 0x34b1, 0x2167: 0x34b9, 0x2168: 0x34c1, 0x2169: 0x34c9, + 0x216a: 0x34d1, 0x216b: 0x34d9, 0x216c: 0x34e1, 0x216d: 0x97dd, 0x216e: 0x34e9, 0x216f: 0x34f1, + 0x2170: 0x34f9, 0x2171: 0x97fd, 0x2172: 0x3501, 0x2173: 0x3509, 0x2174: 0x3511, 0x2175: 0x3519, + 0x2176: 0x7b6d, 0x2177: 0x981d, 0x2178: 0x3521, 0x2179: 0x3529, 0x217a: 0x3531, 0x217b: 0x983d, + 0x217c: 0x3539, 0x217d: 0x985d, 0x217e: 0x3541, 0x217f: 0x3541, + // Block 0x86, offset 0x2180 + 0x2180: 0x3549, 0x2181: 0x987d, 0x2182: 0x3551, 0x2183: 0x3559, 0x2184: 0x3561, 0x2185: 0x3569, + 0x2186: 0x3571, 0x2187: 0x3579, 0x2188: 0x3581, 0x2189: 0x989d, 0x218a: 0x3589, 0x218b: 0x3591, + 0x218c: 0x3599, 0x218d: 0x35a1, 0x218e: 0x35a9, 0x218f: 0x35b1, 0x2190: 0x98bd, 0x2191: 0x35b9, + 0x2192: 0x98dd, 0x2193: 0x98fd, 0x2194: 0x991d, 0x2195: 0x35c1, 0x2196: 0x35c9, 0x2197: 0x35d1, + 0x2198: 0x35d9, 0x2199: 0x35e1, 0x219a: 0x35e9, 0x219b: 0x35f1, 0x219c: 0x35f9, 0x219d: 0x993d, + 0x219e: 0x0040, 0x219f: 0x0040, 0x21a0: 0x0040, 0x21a1: 0x0040, 0x21a2: 0x0040, 0x21a3: 0x0040, + 0x21a4: 0x0040, 0x21a5: 0x0040, 0x21a6: 0x0040, 0x21a7: 0x0040, 0x21a8: 0x0040, 0x21a9: 0x0040, + 0x21aa: 0x0040, 0x21ab: 0x0040, 0x21ac: 0x0040, 0x21ad: 0x0040, 0x21ae: 0x0040, 0x21af: 0x0040, + 0x21b0: 0x0040, 0x21b1: 0x0040, 0x21b2: 0x0040, 0x21b3: 0x0040, 0x21b4: 0x0040, 0x21b5: 0x0040, + 0x21b6: 0x0040, 0x21b7: 0x0040, 0x21b8: 0x0040, 0x21b9: 0x0040, 0x21ba: 0x0040, 0x21bb: 0x0040, + 0x21bc: 0x0040, 0x21bd: 0x0040, 0x21be: 0x0040, 0x21bf: 0x0040, +} + +// idnaIndex: 39 blocks, 2496 entries, 4992 bytes +// Block 0 is the zero block. +var idnaIndex = [2496]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x85, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05, + 0xc8: 0x06, 0xc9: 0x86, 0xca: 0x87, 0xcb: 0x07, 0xcc: 0x88, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a, + 0xd0: 0x89, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x8a, 0xd6: 0x8b, 0xd7: 0x8c, + 0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x8d, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x8e, 0xde: 0x8f, 0xdf: 0x90, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x09, 0xee: 0x0a, 0xef: 0x0b, + 0xf0: 0x20, 0xf1: 0x21, 0xf2: 0x21, 0xf3: 0x23, 0xf4: 0x24, + // Block 0x4, offset 0x100 + 0x120: 0x91, 0x121: 0x13, 0x122: 0x14, 0x123: 0x92, 0x124: 0x93, 0x125: 0x15, 0x126: 0x16, 0x127: 0x17, + 0x128: 0x18, 0x129: 0x19, 0x12a: 0x1a, 0x12b: 0x1b, 0x12c: 0x1c, 0x12d: 0x1d, 0x12e: 0x1e, 0x12f: 0x94, + 0x130: 0x95, 0x131: 0x1f, 0x132: 0x20, 0x133: 0x21, 0x134: 0x96, 0x135: 0x22, 0x136: 0x97, 0x137: 0x98, + 0x138: 0x99, 0x139: 0x9a, 0x13a: 0x23, 0x13b: 0x9b, 0x13c: 0x9c, 0x13d: 0x24, 0x13e: 0x25, 0x13f: 0x9d, + // Block 0x5, offset 0x140 + 0x140: 0x9e, 0x141: 0x9f, 0x142: 0xa0, 0x143: 0xa1, 0x144: 0xa2, 0x145: 0xa3, 0x146: 0xa4, 0x147: 0xa5, + 0x148: 0xa6, 0x149: 0xa7, 0x14a: 0xa8, 0x14b: 0xa9, 0x14c: 0xaa, 0x14d: 0xab, 0x14e: 0xac, 0x14f: 0xad, + 0x150: 0xae, 0x151: 0xa6, 0x152: 0xa6, 0x153: 0xa6, 0x154: 0xa6, 0x155: 0xa6, 0x156: 0xa6, 0x157: 0xa6, + 0x158: 0xa6, 0x159: 0xaf, 0x15a: 0xb0, 0x15b: 0xb1, 0x15c: 0xb2, 0x15d: 0xb3, 0x15e: 0xb4, 0x15f: 0xb5, + 0x160: 0xb6, 0x161: 0xb7, 0x162: 0xb8, 0x163: 0xb9, 0x164: 0xba, 0x165: 0xbb, 0x166: 0xbc, 0x167: 0xbd, + 0x168: 0xbe, 0x169: 0xbf, 0x16a: 0xc0, 0x16b: 0xc1, 0x16c: 0xc2, 0x16d: 0xc3, 0x16e: 0xc4, 0x16f: 0xc5, + 0x170: 0xc6, 0x171: 0xc7, 0x172: 0xc8, 0x173: 0xc9, 0x174: 0x26, 0x175: 0x27, 0x176: 0x28, 0x177: 0x88, + 0x178: 0x29, 0x179: 0x29, 0x17a: 0x2a, 0x17b: 0x29, 0x17c: 0xca, 0x17d: 0x2b, 0x17e: 0x2c, 0x17f: 0x2d, + // Block 0x6, offset 0x180 + 0x180: 0x2e, 0x181: 0x2f, 0x182: 0x30, 0x183: 0xcb, 0x184: 0x31, 0x185: 0x32, 0x186: 0xcc, 0x187: 0xa2, + 0x188: 0xcd, 0x189: 0xce, 0x18a: 0xa2, 0x18b: 0xa2, 0x18c: 0xcf, 0x18d: 0xa2, 0x18e: 0xa2, 0x18f: 0xa2, + 0x190: 0xd0, 0x191: 0x33, 0x192: 0x34, 0x193: 0x35, 0x194: 0xa2, 0x195: 0xa2, 0x196: 0xa2, 0x197: 0xa2, + 0x198: 0xa2, 0x199: 0xa2, 0x19a: 0xa2, 0x19b: 0xa2, 0x19c: 0xa2, 0x19d: 0xa2, 0x19e: 0xa2, 0x19f: 0xa2, + 0x1a0: 0xa2, 0x1a1: 0xa2, 0x1a2: 0xa2, 0x1a3: 0xa2, 0x1a4: 0xa2, 0x1a5: 0xa2, 0x1a6: 0xa2, 0x1a7: 0xa2, + 0x1a8: 0xd1, 0x1a9: 0xd2, 0x1aa: 0xa2, 0x1ab: 0xd3, 0x1ac: 0xa2, 0x1ad: 0xd4, 0x1ae: 0xd5, 0x1af: 0xa2, + 0x1b0: 0xd6, 0x1b1: 0x36, 0x1b2: 0x29, 0x1b3: 0x37, 0x1b4: 0xd7, 0x1b5: 0xd8, 0x1b6: 0xd9, 0x1b7: 0xda, + 0x1b8: 0xdb, 0x1b9: 0xdc, 0x1ba: 0xdd, 0x1bb: 0xde, 0x1bc: 0xdf, 0x1bd: 0xe0, 0x1be: 0xe1, 0x1bf: 0x38, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x39, 0x1c1: 0xe2, 0x1c2: 0xe3, 0x1c3: 0xe4, 0x1c4: 0xe5, 0x1c5: 0x3a, 0x1c6: 0x3b, 0x1c7: 0xe6, + 0x1c8: 0xe7, 0x1c9: 0x3c, 0x1ca: 0x3d, 0x1cb: 0x3e, 0x1cc: 0xe8, 0x1cd: 0xe9, 0x1ce: 0x3f, 0x1cf: 0x40, + 0x1d0: 0xa6, 0x1d1: 0xa6, 0x1d2: 0xa6, 0x1d3: 0xa6, 0x1d4: 0xa6, 0x1d5: 0xa6, 0x1d6: 0xa6, 0x1d7: 0xa6, + 0x1d8: 0xa6, 0x1d9: 0xa6, 0x1da: 0xa6, 0x1db: 0xa6, 0x1dc: 0xa6, 0x1dd: 0xa6, 0x1de: 0xa6, 0x1df: 0xa6, + 0x1e0: 0xa6, 0x1e1: 0xa6, 0x1e2: 0xa6, 0x1e3: 0xa6, 0x1e4: 0xa6, 0x1e5: 0xa6, 0x1e6: 0xa6, 0x1e7: 0xa6, + 0x1e8: 0xa6, 0x1e9: 0xa6, 0x1ea: 0xa6, 0x1eb: 0xa6, 0x1ec: 0xa6, 0x1ed: 0xa6, 0x1ee: 0xa6, 0x1ef: 0xa6, + 0x1f0: 0xa6, 0x1f1: 0xa6, 0x1f2: 0xa6, 0x1f3: 0xa6, 0x1f4: 0xa6, 0x1f5: 0xa6, 0x1f6: 0xa6, 0x1f7: 0xa6, + 0x1f8: 0xa6, 0x1f9: 0xa6, 0x1fa: 0xa6, 0x1fb: 0xa6, 0x1fc: 0xa6, 0x1fd: 0xa6, 0x1fe: 0xa6, 0x1ff: 0xa6, + // Block 0x8, offset 0x200 + 0x200: 0xa6, 0x201: 0xa6, 0x202: 0xa6, 0x203: 0xa6, 0x204: 0xa6, 0x205: 0xa6, 0x206: 0xa6, 0x207: 0xa6, + 0x208: 0xa6, 0x209: 0xa6, 0x20a: 0xa6, 0x20b: 0xa6, 0x20c: 0xa6, 0x20d: 0xa6, 0x20e: 0xa6, 0x20f: 0xa6, + 0x210: 0xa6, 0x211: 0xa6, 0x212: 0xa6, 0x213: 0xa6, 0x214: 0xa6, 0x215: 0xa6, 0x216: 0xa6, 0x217: 0xa6, + 0x218: 0xa6, 0x219: 0xa6, 0x21a: 0xa6, 0x21b: 0xa6, 0x21c: 0xa6, 0x21d: 0xa6, 0x21e: 0xa6, 0x21f: 0xa6, + 0x220: 0xa6, 0x221: 0xa6, 0x222: 0xa6, 0x223: 0xa6, 0x224: 0xa6, 0x225: 0xa6, 0x226: 0xa6, 0x227: 0xa6, + 0x228: 0xa6, 0x229: 0xa6, 0x22a: 0xa6, 0x22b: 0xa6, 0x22c: 0xa6, 0x22d: 0xa6, 0x22e: 0xa6, 0x22f: 0xa6, + 0x230: 0xa6, 0x231: 0xa6, 0x232: 0xa6, 0x233: 0xa6, 0x234: 0xa6, 0x235: 0xa6, 0x236: 0xa6, 0x237: 0xa2, + 0x238: 0xa6, 0x239: 0xa6, 0x23a: 0xa6, 0x23b: 0xa6, 0x23c: 0xa6, 0x23d: 0xa6, 0x23e: 0xa6, 0x23f: 0xa6, + // Block 0x9, offset 0x240 + 0x240: 0xa6, 0x241: 0xa6, 0x242: 0xa6, 0x243: 0xa6, 0x244: 0xa6, 0x245: 0xa6, 0x246: 0xa6, 0x247: 0xa6, + 0x248: 0xa6, 0x249: 0xa6, 0x24a: 0xa6, 0x24b: 0xa6, 0x24c: 0xa6, 0x24d: 0xa6, 0x24e: 0xa6, 0x24f: 0xa6, + 0x250: 0xa6, 0x251: 0xa6, 0x252: 0xa6, 0x253: 0xa6, 0x254: 0xa6, 0x255: 0xa6, 0x256: 0xa6, 0x257: 0xa6, + 0x258: 0xa6, 0x259: 0xa6, 0x25a: 0xa6, 0x25b: 0xa6, 0x25c: 0xa6, 0x25d: 0xa6, 0x25e: 0xa6, 0x25f: 0xa6, + 0x260: 0xa6, 0x261: 0xa6, 0x262: 0xa6, 0x263: 0xa6, 0x264: 0xa6, 0x265: 0xa6, 0x266: 0xa6, 0x267: 0xa6, + 0x268: 0xa6, 0x269: 0xa6, 0x26a: 0xa6, 0x26b: 0xa6, 0x26c: 0xa6, 0x26d: 0xa6, 0x26e: 0xa6, 0x26f: 0xa6, + 0x270: 0xa6, 0x271: 0xa6, 0x272: 0xa6, 0x273: 0xa6, 0x274: 0xa6, 0x275: 0xa6, 0x276: 0xa6, 0x277: 0xa6, + 0x278: 0xa6, 0x279: 0xa6, 0x27a: 0xa6, 0x27b: 0xa6, 0x27c: 0xa6, 0x27d: 0xa6, 0x27e: 0xa6, 0x27f: 0xa6, + // Block 0xa, offset 0x280 + 0x280: 0xa6, 0x281: 0xa6, 0x282: 0xa6, 0x283: 0xa6, 0x284: 0xa6, 0x285: 0xa6, 0x286: 0xa6, 0x287: 0xa6, + 0x288: 0xa6, 0x289: 0xa6, 0x28a: 0xa6, 0x28b: 0xa6, 0x28c: 0xa6, 0x28d: 0xa6, 0x28e: 0xa6, 0x28f: 0xa6, + 0x290: 0xa6, 0x291: 0xa6, 0x292: 0xea, 0x293: 0xeb, 0x294: 0xa6, 0x295: 0xa6, 0x296: 0xa6, 0x297: 0xa6, + 0x298: 0xec, 0x299: 0x41, 0x29a: 0x42, 0x29b: 0xed, 0x29c: 0x43, 0x29d: 0x44, 0x29e: 0x45, 0x29f: 0x46, + 0x2a0: 0xee, 0x2a1: 0xef, 0x2a2: 0xf0, 0x2a3: 0xf1, 0x2a4: 0xf2, 0x2a5: 0xf3, 0x2a6: 0xf4, 0x2a7: 0xf5, + 0x2a8: 0xf6, 0x2a9: 0xf7, 0x2aa: 0xf8, 0x2ab: 0xf9, 0x2ac: 0xfa, 0x2ad: 0xfb, 0x2ae: 0xfc, 0x2af: 0xfd, + 0x2b0: 0xa6, 0x2b1: 0xa6, 0x2b2: 0xa6, 0x2b3: 0xa6, 0x2b4: 0xa6, 0x2b5: 0xa6, 0x2b6: 0xa6, 0x2b7: 0xa6, + 0x2b8: 0xa6, 0x2b9: 0xa6, 0x2ba: 0xa6, 0x2bb: 0xa6, 0x2bc: 0xa6, 0x2bd: 0xa6, 0x2be: 0xa6, 0x2bf: 0xa6, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xa6, 0x2c1: 0xa6, 0x2c2: 0xa6, 0x2c3: 0xa6, 0x2c4: 0xa6, 0x2c5: 0xa6, 0x2c6: 0xa6, 0x2c7: 0xa6, + 0x2c8: 0xa6, 0x2c9: 0xa6, 0x2ca: 0xa6, 0x2cb: 0xa6, 0x2cc: 0xa6, 0x2cd: 0xa6, 0x2ce: 0xa6, 0x2cf: 0xa6, + 0x2d0: 0xa6, 0x2d1: 0xa6, 0x2d2: 0xa6, 0x2d3: 0xa6, 0x2d4: 0xa6, 0x2d5: 0xa6, 0x2d6: 0xa6, 0x2d7: 0xa6, + 0x2d8: 0xa6, 0x2d9: 0xa6, 0x2da: 0xa6, 0x2db: 0xa6, 0x2dc: 0xa6, 0x2dd: 0xa6, 0x2de: 0xfe, 0x2df: 0xff, + // Block 0xc, offset 0x300 + 0x300: 0x100, 0x301: 0x100, 0x302: 0x100, 0x303: 0x100, 0x304: 0x100, 0x305: 0x100, 0x306: 0x100, 0x307: 0x100, + 0x308: 0x100, 0x309: 0x100, 0x30a: 0x100, 0x30b: 0x100, 0x30c: 0x100, 0x30d: 0x100, 0x30e: 0x100, 0x30f: 0x100, + 0x310: 0x100, 0x311: 0x100, 0x312: 0x100, 0x313: 0x100, 0x314: 0x100, 0x315: 0x100, 0x316: 0x100, 0x317: 0x100, + 0x318: 0x100, 0x319: 0x100, 0x31a: 0x100, 0x31b: 0x100, 0x31c: 0x100, 0x31d: 0x100, 0x31e: 0x100, 0x31f: 0x100, + 0x320: 0x100, 0x321: 0x100, 0x322: 0x100, 0x323: 0x100, 0x324: 0x100, 0x325: 0x100, 0x326: 0x100, 0x327: 0x100, + 0x328: 0x100, 0x329: 0x100, 0x32a: 0x100, 0x32b: 0x100, 0x32c: 0x100, 0x32d: 0x100, 0x32e: 0x100, 0x32f: 0x100, + 0x330: 0x100, 0x331: 0x100, 0x332: 0x100, 0x333: 0x100, 0x334: 0x100, 0x335: 0x100, 0x336: 0x100, 0x337: 0x100, + 0x338: 0x100, 0x339: 0x100, 0x33a: 0x100, 0x33b: 0x100, 0x33c: 0x100, 0x33d: 0x100, 0x33e: 0x100, 0x33f: 0x100, + // Block 0xd, offset 0x340 + 0x340: 0x100, 0x341: 0x100, 0x342: 0x100, 0x343: 0x100, 0x344: 0x100, 0x345: 0x100, 0x346: 0x100, 0x347: 0x100, + 0x348: 0x100, 0x349: 0x100, 0x34a: 0x100, 0x34b: 0x100, 0x34c: 0x100, 0x34d: 0x100, 0x34e: 0x100, 0x34f: 0x100, + 0x350: 0x100, 0x351: 0x100, 0x352: 0x100, 0x353: 0x100, 0x354: 0x100, 0x355: 0x100, 0x356: 0x100, 0x357: 0x100, + 0x358: 0x100, 0x359: 0x100, 0x35a: 0x100, 0x35b: 0x100, 0x35c: 0x100, 0x35d: 0x100, 0x35e: 0x100, 0x35f: 0x100, + 0x360: 0x100, 0x361: 0x100, 0x362: 0x100, 0x363: 0x100, 0x364: 0x101, 0x365: 0x102, 0x366: 0x103, 0x367: 0x104, + 0x368: 0x47, 0x369: 0x105, 0x36a: 0x106, 0x36b: 0x48, 0x36c: 0x49, 0x36d: 0x4a, 0x36e: 0x4b, 0x36f: 0x4c, + 0x370: 0x107, 0x371: 0x4d, 0x372: 0x4e, 0x373: 0x4f, 0x374: 0x50, 0x375: 0x51, 0x376: 0x108, 0x377: 0x52, + 0x378: 0x53, 0x379: 0x54, 0x37a: 0x55, 0x37b: 0x56, 0x37c: 0x57, 0x37d: 0x58, 0x37e: 0x59, 0x37f: 0x5a, + // Block 0xe, offset 0x380 + 0x380: 0x109, 0x381: 0x10a, 0x382: 0xa6, 0x383: 0x10b, 0x384: 0x10c, 0x385: 0xa2, 0x386: 0x10d, 0x387: 0x10e, + 0x388: 0x100, 0x389: 0x100, 0x38a: 0x10f, 0x38b: 0x110, 0x38c: 0x111, 0x38d: 0x112, 0x38e: 0x113, 0x38f: 0x114, + 0x390: 0x115, 0x391: 0xa6, 0x392: 0x116, 0x393: 0x117, 0x394: 0x118, 0x395: 0x5b, 0x396: 0x5c, 0x397: 0x100, + 0x398: 0xa6, 0x399: 0xa6, 0x39a: 0xa6, 0x39b: 0xa6, 0x39c: 0x119, 0x39d: 0x11a, 0x39e: 0x5d, 0x39f: 0x100, + 0x3a0: 0x11b, 0x3a1: 0x11c, 0x3a2: 0x11d, 0x3a3: 0x11e, 0x3a4: 0x11f, 0x3a5: 0x100, 0x3a6: 0x120, 0x3a7: 0x121, + 0x3a8: 0x122, 0x3a9: 0x123, 0x3aa: 0x124, 0x3ab: 0x5e, 0x3ac: 0x125, 0x3ad: 0x126, 0x3ae: 0x5f, 0x3af: 0x100, + 0x3b0: 0x127, 0x3b1: 0x128, 0x3b2: 0x129, 0x3b3: 0x12a, 0x3b4: 0x12b, 0x3b5: 0x100, 0x3b6: 0x100, 0x3b7: 0x100, + 0x3b8: 0x100, 0x3b9: 0x12c, 0x3ba: 0x12d, 0x3bb: 0x12e, 0x3bc: 0x12f, 0x3bd: 0x130, 0x3be: 0x131, 0x3bf: 0x132, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x133, 0x3c1: 0x134, 0x3c2: 0x135, 0x3c3: 0x136, 0x3c4: 0x137, 0x3c5: 0x138, 0x3c6: 0x139, 0x3c7: 0x13a, + 0x3c8: 0x13b, 0x3c9: 0x13c, 0x3ca: 0x13d, 0x3cb: 0x13e, 0x3cc: 0x60, 0x3cd: 0x61, 0x3ce: 0x100, 0x3cf: 0x100, + 0x3d0: 0x13f, 0x3d1: 0x140, 0x3d2: 0x141, 0x3d3: 0x142, 0x3d4: 0x100, 0x3d5: 0x100, 0x3d6: 0x143, 0x3d7: 0x144, + 0x3d8: 0x145, 0x3d9: 0x146, 0x3da: 0x147, 0x3db: 0x148, 0x3dc: 0x149, 0x3dd: 0x14a, 0x3de: 0x100, 0x3df: 0x100, + 0x3e0: 0x14b, 0x3e1: 0x100, 0x3e2: 0x14c, 0x3e3: 0x14d, 0x3e4: 0x62, 0x3e5: 0x14e, 0x3e6: 0x14f, 0x3e7: 0x150, + 0x3e8: 0x151, 0x3e9: 0x152, 0x3ea: 0x153, 0x3eb: 0x154, 0x3ec: 0x155, 0x3ed: 0x100, 0x3ee: 0x100, 0x3ef: 0x100, + 0x3f0: 0x156, 0x3f1: 0x157, 0x3f2: 0x158, 0x3f3: 0x100, 0x3f4: 0x159, 0x3f5: 0x15a, 0x3f6: 0x15b, 0x3f7: 0x100, + 0x3f8: 0x100, 0x3f9: 0x100, 0x3fa: 0x100, 0x3fb: 0x15c, 0x3fc: 0x15d, 0x3fd: 0x15e, 0x3fe: 0x15f, 0x3ff: 0x160, + // Block 0x10, offset 0x400 + 0x400: 0xa6, 0x401: 0xa6, 0x402: 0xa6, 0x403: 0xa6, 0x404: 0xa6, 0x405: 0xa6, 0x406: 0xa6, 0x407: 0xa6, + 0x408: 0xa6, 0x409: 0xa6, 0x40a: 0xa6, 0x40b: 0xa6, 0x40c: 0xa6, 0x40d: 0xa6, 0x40e: 0x161, 0x40f: 0x100, + 0x410: 0xa2, 0x411: 0x162, 0x412: 0xa6, 0x413: 0xa6, 0x414: 0xa6, 0x415: 0x163, 0x416: 0x100, 0x417: 0x100, + 0x418: 0x100, 0x419: 0x100, 0x41a: 0x100, 0x41b: 0x100, 0x41c: 0x100, 0x41d: 0x100, 0x41e: 0x100, 0x41f: 0x100, + 0x420: 0x100, 0x421: 0x100, 0x422: 0x100, 0x423: 0x100, 0x424: 0x100, 0x425: 0x100, 0x426: 0x100, 0x427: 0x100, + 0x428: 0x100, 0x429: 0x100, 0x42a: 0x100, 0x42b: 0x100, 0x42c: 0x100, 0x42d: 0x100, 0x42e: 0x100, 0x42f: 0x100, + 0x430: 0x100, 0x431: 0x100, 0x432: 0x100, 0x433: 0x100, 0x434: 0x100, 0x435: 0x100, 0x436: 0x100, 0x437: 0x100, + 0x438: 0x100, 0x439: 0x100, 0x43a: 0x100, 0x43b: 0x100, 0x43c: 0x100, 0x43d: 0x100, 0x43e: 0x164, 0x43f: 0x165, + // Block 0x11, offset 0x440 + 0x440: 0xa6, 0x441: 0xa6, 0x442: 0xa6, 0x443: 0xa6, 0x444: 0xa6, 0x445: 0xa6, 0x446: 0xa6, 0x447: 0xa6, + 0x448: 0xa6, 0x449: 0xa6, 0x44a: 0xa6, 0x44b: 0xa6, 0x44c: 0xa6, 0x44d: 0xa6, 0x44e: 0xa6, 0x44f: 0xa6, + 0x450: 0x166, 0x451: 0x167, 0x452: 0x100, 0x453: 0x100, 0x454: 0x100, 0x455: 0x100, 0x456: 0x100, 0x457: 0x100, + 0x458: 0x100, 0x459: 0x100, 0x45a: 0x100, 0x45b: 0x100, 0x45c: 0x100, 0x45d: 0x100, 0x45e: 0x100, 0x45f: 0x100, + 0x460: 0x100, 0x461: 0x100, 0x462: 0x100, 0x463: 0x100, 0x464: 0x100, 0x465: 0x100, 0x466: 0x100, 0x467: 0x100, + 0x468: 0x100, 0x469: 0x100, 0x46a: 0x100, 0x46b: 0x100, 0x46c: 0x100, 0x46d: 0x100, 0x46e: 0x100, 0x46f: 0x100, + 0x470: 0x100, 0x471: 0x100, 0x472: 0x100, 0x473: 0x100, 0x474: 0x100, 0x475: 0x100, 0x476: 0x100, 0x477: 0x100, + 0x478: 0x100, 0x479: 0x100, 0x47a: 0x100, 0x47b: 0x100, 0x47c: 0x100, 0x47d: 0x100, 0x47e: 0x100, 0x47f: 0x100, + // Block 0x12, offset 0x480 + 0x480: 0x100, 0x481: 0x100, 0x482: 0x100, 0x483: 0x100, 0x484: 0x100, 0x485: 0x100, 0x486: 0x100, 0x487: 0x100, + 0x488: 0x100, 0x489: 0x100, 0x48a: 0x100, 0x48b: 0x100, 0x48c: 0x100, 0x48d: 0x100, 0x48e: 0x100, 0x48f: 0x100, + 0x490: 0xa6, 0x491: 0xa6, 0x492: 0xa6, 0x493: 0xa6, 0x494: 0xa6, 0x495: 0xa6, 0x496: 0xa6, 0x497: 0xa6, + 0x498: 0xa6, 0x499: 0x14a, 0x49a: 0x100, 0x49b: 0x100, 0x49c: 0x100, 0x49d: 0x100, 0x49e: 0x100, 0x49f: 0x100, + 0x4a0: 0x100, 0x4a1: 0x100, 0x4a2: 0x100, 0x4a3: 0x100, 0x4a4: 0x100, 0x4a5: 0x100, 0x4a6: 0x100, 0x4a7: 0x100, + 0x4a8: 0x100, 0x4a9: 0x100, 0x4aa: 0x100, 0x4ab: 0x100, 0x4ac: 0x100, 0x4ad: 0x100, 0x4ae: 0x100, 0x4af: 0x100, + 0x4b0: 0x100, 0x4b1: 0x100, 0x4b2: 0x100, 0x4b3: 0x100, 0x4b4: 0x100, 0x4b5: 0x100, 0x4b6: 0x100, 0x4b7: 0x100, + 0x4b8: 0x100, 0x4b9: 0x100, 0x4ba: 0x100, 0x4bb: 0x100, 0x4bc: 0x100, 0x4bd: 0x100, 0x4be: 0x100, 0x4bf: 0x100, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x100, 0x4c1: 0x100, 0x4c2: 0x100, 0x4c3: 0x100, 0x4c4: 0x100, 0x4c5: 0x100, 0x4c6: 0x100, 0x4c7: 0x100, + 0x4c8: 0x100, 0x4c9: 0x100, 0x4ca: 0x100, 0x4cb: 0x100, 0x4cc: 0x100, 0x4cd: 0x100, 0x4ce: 0x100, 0x4cf: 0x100, + 0x4d0: 0x100, 0x4d1: 0x100, 0x4d2: 0x100, 0x4d3: 0x100, 0x4d4: 0x100, 0x4d5: 0x100, 0x4d6: 0x100, 0x4d7: 0x100, + 0x4d8: 0x100, 0x4d9: 0x100, 0x4da: 0x100, 0x4db: 0x100, 0x4dc: 0x100, 0x4dd: 0x100, 0x4de: 0x100, 0x4df: 0x100, + 0x4e0: 0xa6, 0x4e1: 0xa6, 0x4e2: 0xa6, 0x4e3: 0xa6, 0x4e4: 0xa6, 0x4e5: 0xa6, 0x4e6: 0xa6, 0x4e7: 0xa6, + 0x4e8: 0x154, 0x4e9: 0x168, 0x4ea: 0x169, 0x4eb: 0x16a, 0x4ec: 0x16b, 0x4ed: 0x16c, 0x4ee: 0x16d, 0x4ef: 0x100, + 0x4f0: 0x100, 0x4f1: 0x100, 0x4f2: 0x100, 0x4f3: 0x100, 0x4f4: 0x100, 0x4f5: 0x100, 0x4f6: 0x100, 0x4f7: 0x100, + 0x4f8: 0x100, 0x4f9: 0x16e, 0x4fa: 0x16f, 0x4fb: 0x100, 0x4fc: 0xa6, 0x4fd: 0x170, 0x4fe: 0x171, 0x4ff: 0x172, + // Block 0x14, offset 0x500 + 0x500: 0xa6, 0x501: 0xa6, 0x502: 0xa6, 0x503: 0xa6, 0x504: 0xa6, 0x505: 0xa6, 0x506: 0xa6, 0x507: 0xa6, + 0x508: 0xa6, 0x509: 0xa6, 0x50a: 0xa6, 0x50b: 0xa6, 0x50c: 0xa6, 0x50d: 0xa6, 0x50e: 0xa6, 0x50f: 0xa6, + 0x510: 0xa6, 0x511: 0xa6, 0x512: 0xa6, 0x513: 0xa6, 0x514: 0xa6, 0x515: 0xa6, 0x516: 0xa6, 0x517: 0xa6, + 0x518: 0xa6, 0x519: 0xa6, 0x51a: 0xa6, 0x51b: 0xa6, 0x51c: 0xa6, 0x51d: 0xa6, 0x51e: 0xa6, 0x51f: 0x173, + 0x520: 0xa6, 0x521: 0xa6, 0x522: 0xa6, 0x523: 0xa6, 0x524: 0xa6, 0x525: 0xa6, 0x526: 0xa6, 0x527: 0xa6, + 0x528: 0xa6, 0x529: 0xa6, 0x52a: 0xa6, 0x52b: 0xa6, 0x52c: 0xa6, 0x52d: 0xa6, 0x52e: 0xa6, 0x52f: 0xa6, + 0x530: 0xa6, 0x531: 0xa6, 0x532: 0xa6, 0x533: 0x174, 0x534: 0x175, 0x535: 0x100, 0x536: 0x100, 0x537: 0x100, + 0x538: 0x100, 0x539: 0x100, 0x53a: 0x100, 0x53b: 0x100, 0x53c: 0x100, 0x53d: 0x100, 0x53e: 0x100, 0x53f: 0x100, + // Block 0x15, offset 0x540 + 0x540: 0x100, 0x541: 0x100, 0x542: 0x100, 0x543: 0x100, 0x544: 0x100, 0x545: 0x100, 0x546: 0x100, 0x547: 0x100, + 0x548: 0x100, 0x549: 0x100, 0x54a: 0x100, 0x54b: 0x100, 0x54c: 0x100, 0x54d: 0x100, 0x54e: 0x100, 0x54f: 0x100, + 0x550: 0x100, 0x551: 0x100, 0x552: 0x100, 0x553: 0x100, 0x554: 0x100, 0x555: 0x100, 0x556: 0x100, 0x557: 0x100, + 0x558: 0x100, 0x559: 0x100, 0x55a: 0x100, 0x55b: 0x100, 0x55c: 0x100, 0x55d: 0x100, 0x55e: 0x100, 0x55f: 0x100, + 0x560: 0x100, 0x561: 0x100, 0x562: 0x100, 0x563: 0x100, 0x564: 0x100, 0x565: 0x100, 0x566: 0x100, 0x567: 0x100, + 0x568: 0x100, 0x569: 0x100, 0x56a: 0x100, 0x56b: 0x100, 0x56c: 0x100, 0x56d: 0x100, 0x56e: 0x100, 0x56f: 0x100, + 0x570: 0x100, 0x571: 0x100, 0x572: 0x100, 0x573: 0x100, 0x574: 0x100, 0x575: 0x100, 0x576: 0x100, 0x577: 0x100, + 0x578: 0x100, 0x579: 0x100, 0x57a: 0x100, 0x57b: 0x100, 0x57c: 0x100, 0x57d: 0x100, 0x57e: 0x100, 0x57f: 0x176, + // Block 0x16, offset 0x580 + 0x580: 0xa6, 0x581: 0xa6, 0x582: 0xa6, 0x583: 0xa6, 0x584: 0x177, 0x585: 0x178, 0x586: 0xa6, 0x587: 0xa6, + 0x588: 0xa6, 0x589: 0xa6, 0x58a: 0xa6, 0x58b: 0x179, 0x58c: 0x100, 0x58d: 0x100, 0x58e: 0x100, 0x58f: 0x100, + 0x590: 0x100, 0x591: 0x100, 0x592: 0x100, 0x593: 0x100, 0x594: 0x100, 0x595: 0x100, 0x596: 0x100, 0x597: 0x100, + 0x598: 0x100, 0x599: 0x100, 0x59a: 0x100, 0x59b: 0x100, 0x59c: 0x100, 0x59d: 0x100, 0x59e: 0x100, 0x59f: 0x100, + 0x5a0: 0x100, 0x5a1: 0x100, 0x5a2: 0x100, 0x5a3: 0x100, 0x5a4: 0x100, 0x5a5: 0x100, 0x5a6: 0x100, 0x5a7: 0x100, + 0x5a8: 0x100, 0x5a9: 0x100, 0x5aa: 0x100, 0x5ab: 0x100, 0x5ac: 0x100, 0x5ad: 0x100, 0x5ae: 0x100, 0x5af: 0x100, + 0x5b0: 0xa6, 0x5b1: 0x17a, 0x5b2: 0x17b, 0x5b3: 0x100, 0x5b4: 0x100, 0x5b5: 0x100, 0x5b6: 0x100, 0x5b7: 0x100, + 0x5b8: 0x100, 0x5b9: 0x100, 0x5ba: 0x100, 0x5bb: 0x100, 0x5bc: 0x100, 0x5bd: 0x100, 0x5be: 0x100, 0x5bf: 0x100, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x100, 0x5c1: 0x100, 0x5c2: 0x100, 0x5c3: 0x100, 0x5c4: 0x100, 0x5c5: 0x100, 0x5c6: 0x100, 0x5c7: 0x100, + 0x5c8: 0x100, 0x5c9: 0x100, 0x5ca: 0x100, 0x5cb: 0x100, 0x5cc: 0x100, 0x5cd: 0x100, 0x5ce: 0x100, 0x5cf: 0x100, + 0x5d0: 0x100, 0x5d1: 0x100, 0x5d2: 0x100, 0x5d3: 0x100, 0x5d4: 0x100, 0x5d5: 0x100, 0x5d6: 0x100, 0x5d7: 0x100, + 0x5d8: 0x100, 0x5d9: 0x100, 0x5da: 0x100, 0x5db: 0x100, 0x5dc: 0x100, 0x5dd: 0x100, 0x5de: 0x100, 0x5df: 0x100, + 0x5e0: 0x100, 0x5e1: 0x100, 0x5e2: 0x100, 0x5e3: 0x100, 0x5e4: 0x100, 0x5e5: 0x100, 0x5e6: 0x100, 0x5e7: 0x100, + 0x5e8: 0x100, 0x5e9: 0x100, 0x5ea: 0x100, 0x5eb: 0x100, 0x5ec: 0x100, 0x5ed: 0x100, 0x5ee: 0x100, 0x5ef: 0x100, + 0x5f0: 0x100, 0x5f1: 0x100, 0x5f2: 0x100, 0x5f3: 0x100, 0x5f4: 0x100, 0x5f5: 0x100, 0x5f6: 0x100, 0x5f7: 0x100, + 0x5f8: 0x100, 0x5f9: 0x100, 0x5fa: 0x100, 0x5fb: 0x100, 0x5fc: 0x17c, 0x5fd: 0x17d, 0x5fe: 0xa2, 0x5ff: 0x17e, + // Block 0x18, offset 0x600 + 0x600: 0xa2, 0x601: 0xa2, 0x602: 0xa2, 0x603: 0x17f, 0x604: 0x180, 0x605: 0x181, 0x606: 0x182, 0x607: 0x183, + 0x608: 0xa2, 0x609: 0x184, 0x60a: 0x100, 0x60b: 0x185, 0x60c: 0xa2, 0x60d: 0x186, 0x60e: 0x100, 0x60f: 0x100, + 0x610: 0x63, 0x611: 0x64, 0x612: 0x65, 0x613: 0x66, 0x614: 0x67, 0x615: 0x68, 0x616: 0x69, 0x617: 0x6a, + 0x618: 0x6b, 0x619: 0x6c, 0x61a: 0x6d, 0x61b: 0x6e, 0x61c: 0x6f, 0x61d: 0x70, 0x61e: 0x71, 0x61f: 0x72, + 0x620: 0xa2, 0x621: 0xa2, 0x622: 0xa2, 0x623: 0xa2, 0x624: 0xa2, 0x625: 0xa2, 0x626: 0xa2, 0x627: 0xa2, + 0x628: 0x187, 0x629: 0x188, 0x62a: 0x189, 0x62b: 0x100, 0x62c: 0x100, 0x62d: 0x100, 0x62e: 0x100, 0x62f: 0x100, + 0x630: 0x100, 0x631: 0x100, 0x632: 0x100, 0x633: 0x100, 0x634: 0x100, 0x635: 0x100, 0x636: 0x100, 0x637: 0x100, + 0x638: 0x100, 0x639: 0x100, 0x63a: 0x100, 0x63b: 0x100, 0x63c: 0x18a, 0x63d: 0x100, 0x63e: 0x100, 0x63f: 0x100, + // Block 0x19, offset 0x640 + 0x640: 0x73, 0x641: 0x74, 0x642: 0x18b, 0x643: 0x100, 0x644: 0x18c, 0x645: 0x18d, 0x646: 0x100, 0x647: 0x100, + 0x648: 0x100, 0x649: 0x100, 0x64a: 0x18e, 0x64b: 0x18f, 0x64c: 0x100, 0x64d: 0x100, 0x64e: 0x100, 0x64f: 0x100, + 0x650: 0x100, 0x651: 0x100, 0x652: 0x100, 0x653: 0x190, 0x654: 0x100, 0x655: 0x100, 0x656: 0x100, 0x657: 0x100, + 0x658: 0x100, 0x659: 0x100, 0x65a: 0x100, 0x65b: 0x100, 0x65c: 0x100, 0x65d: 0x100, 0x65e: 0x100, 0x65f: 0x191, + 0x660: 0x127, 0x661: 0x127, 0x662: 0x127, 0x663: 0x192, 0x664: 0x75, 0x665: 0x193, 0x666: 0x100, 0x667: 0x100, + 0x668: 0x100, 0x669: 0x100, 0x66a: 0x100, 0x66b: 0x100, 0x66c: 0x100, 0x66d: 0x100, 0x66e: 0x100, 0x66f: 0x100, + 0x670: 0x100, 0x671: 0x194, 0x672: 0x195, 0x673: 0x100, 0x674: 0x196, 0x675: 0x100, 0x676: 0x100, 0x677: 0x100, + 0x678: 0x76, 0x679: 0x77, 0x67a: 0x78, 0x67b: 0x197, 0x67c: 0x100, 0x67d: 0x100, 0x67e: 0x100, 0x67f: 0x100, + // Block 0x1a, offset 0x680 + 0x680: 0x198, 0x681: 0xa2, 0x682: 0x199, 0x683: 0x19a, 0x684: 0x79, 0x685: 0x7a, 0x686: 0x19b, 0x687: 0x19c, + 0x688: 0x7b, 0x689: 0x19d, 0x68a: 0x100, 0x68b: 0x100, 0x68c: 0xa2, 0x68d: 0xa2, 0x68e: 0xa2, 0x68f: 0xa2, + 0x690: 0xa2, 0x691: 0xa2, 0x692: 0xa2, 0x693: 0xa2, 0x694: 0xa2, 0x695: 0xa2, 0x696: 0xa2, 0x697: 0xa2, + 0x698: 0xa2, 0x699: 0xa2, 0x69a: 0xa2, 0x69b: 0x19e, 0x69c: 0xa2, 0x69d: 0x19f, 0x69e: 0xa2, 0x69f: 0x1a0, + 0x6a0: 0x1a1, 0x6a1: 0x1a2, 0x6a2: 0x1a3, 0x6a3: 0x100, 0x6a4: 0xa2, 0x6a5: 0xa2, 0x6a6: 0xa2, 0x6a7: 0xa2, + 0x6a8: 0xa2, 0x6a9: 0x1a4, 0x6aa: 0x1a5, 0x6ab: 0x1a6, 0x6ac: 0xa2, 0x6ad: 0xa2, 0x6ae: 0x1a7, 0x6af: 0x1a8, + 0x6b0: 0x100, 0x6b1: 0x100, 0x6b2: 0x100, 0x6b3: 0x100, 0x6b4: 0x100, 0x6b5: 0x100, 0x6b6: 0x100, 0x6b7: 0x100, + 0x6b8: 0x100, 0x6b9: 0x100, 0x6ba: 0x100, 0x6bb: 0x100, 0x6bc: 0x100, 0x6bd: 0x100, 0x6be: 0x100, 0x6bf: 0x100, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0xa6, 0x6c1: 0xa6, 0x6c2: 0xa6, 0x6c3: 0xa6, 0x6c4: 0xa6, 0x6c5: 0xa6, 0x6c6: 0xa6, 0x6c7: 0xa6, + 0x6c8: 0xa6, 0x6c9: 0xa6, 0x6ca: 0xa6, 0x6cb: 0xa6, 0x6cc: 0xa6, 0x6cd: 0xa6, 0x6ce: 0xa6, 0x6cf: 0xa6, + 0x6d0: 0xa6, 0x6d1: 0xa6, 0x6d2: 0xa6, 0x6d3: 0xa6, 0x6d4: 0xa6, 0x6d5: 0xa6, 0x6d6: 0xa6, 0x6d7: 0xa6, + 0x6d8: 0xa6, 0x6d9: 0xa6, 0x6da: 0xa6, 0x6db: 0x1a9, 0x6dc: 0xa6, 0x6dd: 0xa6, 0x6de: 0xa6, 0x6df: 0xa6, + 0x6e0: 0xa6, 0x6e1: 0xa6, 0x6e2: 0xa6, 0x6e3: 0xa6, 0x6e4: 0xa6, 0x6e5: 0xa6, 0x6e6: 0xa6, 0x6e7: 0xa6, + 0x6e8: 0xa6, 0x6e9: 0xa6, 0x6ea: 0xa6, 0x6eb: 0xa6, 0x6ec: 0xa6, 0x6ed: 0xa6, 0x6ee: 0xa6, 0x6ef: 0xa6, + 0x6f0: 0xa6, 0x6f1: 0xa6, 0x6f2: 0xa6, 0x6f3: 0xa6, 0x6f4: 0xa6, 0x6f5: 0xa6, 0x6f6: 0xa6, 0x6f7: 0xa6, + 0x6f8: 0xa6, 0x6f9: 0xa6, 0x6fa: 0xa6, 0x6fb: 0xa6, 0x6fc: 0xa6, 0x6fd: 0xa6, 0x6fe: 0xa6, 0x6ff: 0xa6, + // Block 0x1c, offset 0x700 + 0x700: 0xa6, 0x701: 0xa6, 0x702: 0xa6, 0x703: 0xa6, 0x704: 0xa6, 0x705: 0xa6, 0x706: 0xa6, 0x707: 0xa6, + 0x708: 0xa6, 0x709: 0xa6, 0x70a: 0xa6, 0x70b: 0xa6, 0x70c: 0xa6, 0x70d: 0xa6, 0x70e: 0xa6, 0x70f: 0xa6, + 0x710: 0xa6, 0x711: 0xa6, 0x712: 0xa6, 0x713: 0xa6, 0x714: 0xa6, 0x715: 0xa6, 0x716: 0xa6, 0x717: 0xa6, + 0x718: 0xa6, 0x719: 0xa6, 0x71a: 0xa6, 0x71b: 0xa6, 0x71c: 0x1aa, 0x71d: 0xa6, 0x71e: 0xa6, 0x71f: 0xa6, + 0x720: 0x1ab, 0x721: 0xa6, 0x722: 0xa6, 0x723: 0xa6, 0x724: 0xa6, 0x725: 0xa6, 0x726: 0xa6, 0x727: 0xa6, + 0x728: 0xa6, 0x729: 0xa6, 0x72a: 0xa6, 0x72b: 0xa6, 0x72c: 0xa6, 0x72d: 0xa6, 0x72e: 0xa6, 0x72f: 0xa6, + 0x730: 0xa6, 0x731: 0xa6, 0x732: 0xa6, 0x733: 0xa6, 0x734: 0xa6, 0x735: 0xa6, 0x736: 0xa6, 0x737: 0xa6, + 0x738: 0xa6, 0x739: 0xa6, 0x73a: 0xa6, 0x73b: 0xa6, 0x73c: 0xa6, 0x73d: 0xa6, 0x73e: 0xa6, 0x73f: 0xa6, + // Block 0x1d, offset 0x740 + 0x740: 0xa6, 0x741: 0xa6, 0x742: 0xa6, 0x743: 0xa6, 0x744: 0xa6, 0x745: 0xa6, 0x746: 0xa6, 0x747: 0xa6, + 0x748: 0xa6, 0x749: 0xa6, 0x74a: 0xa6, 0x74b: 0xa6, 0x74c: 0xa6, 0x74d: 0xa6, 0x74e: 0xa6, 0x74f: 0xa6, + 0x750: 0xa6, 0x751: 0xa6, 0x752: 0xa6, 0x753: 0xa6, 0x754: 0xa6, 0x755: 0xa6, 0x756: 0xa6, 0x757: 0xa6, + 0x758: 0xa6, 0x759: 0xa6, 0x75a: 0xa6, 0x75b: 0xa6, 0x75c: 0xa6, 0x75d: 0xa6, 0x75e: 0xa6, 0x75f: 0xa6, + 0x760: 0xa6, 0x761: 0xa6, 0x762: 0xa6, 0x763: 0xa6, 0x764: 0xa6, 0x765: 0xa6, 0x766: 0xa6, 0x767: 0xa6, + 0x768: 0xa6, 0x769: 0xa6, 0x76a: 0xa6, 0x76b: 0xa6, 0x76c: 0xa6, 0x76d: 0xa6, 0x76e: 0xa6, 0x76f: 0xa6, + 0x770: 0xa6, 0x771: 0xa6, 0x772: 0xa6, 0x773: 0xa6, 0x774: 0xa6, 0x775: 0xa6, 0x776: 0xa6, 0x777: 0xa6, + 0x778: 0xa6, 0x779: 0xa6, 0x77a: 0x1ac, 0x77b: 0xa6, 0x77c: 0xa6, 0x77d: 0xa6, 0x77e: 0xa6, 0x77f: 0xa6, + // Block 0x1e, offset 0x780 + 0x780: 0xa6, 0x781: 0xa6, 0x782: 0xa6, 0x783: 0xa6, 0x784: 0xa6, 0x785: 0xa6, 0x786: 0xa6, 0x787: 0xa6, + 0x788: 0xa6, 0x789: 0xa6, 0x78a: 0xa6, 0x78b: 0xa6, 0x78c: 0xa6, 0x78d: 0xa6, 0x78e: 0xa6, 0x78f: 0xa6, + 0x790: 0xa6, 0x791: 0xa6, 0x792: 0xa6, 0x793: 0xa6, 0x794: 0xa6, 0x795: 0xa6, 0x796: 0xa6, 0x797: 0xa6, + 0x798: 0xa6, 0x799: 0xa6, 0x79a: 0xa6, 0x79b: 0xa6, 0x79c: 0xa6, 0x79d: 0xa6, 0x79e: 0xa6, 0x79f: 0xa6, + 0x7a0: 0xa6, 0x7a1: 0xa6, 0x7a2: 0xa6, 0x7a3: 0xa6, 0x7a4: 0xa6, 0x7a5: 0xa6, 0x7a6: 0xa6, 0x7a7: 0xa6, + 0x7a8: 0xa6, 0x7a9: 0xa6, 0x7aa: 0xa6, 0x7ab: 0xa6, 0x7ac: 0xa6, 0x7ad: 0xa6, 0x7ae: 0xa6, 0x7af: 0x1ad, + 0x7b0: 0x100, 0x7b1: 0x100, 0x7b2: 0x100, 0x7b3: 0x100, 0x7b4: 0x100, 0x7b5: 0x100, 0x7b6: 0x100, 0x7b7: 0x100, + 0x7b8: 0x100, 0x7b9: 0x100, 0x7ba: 0x100, 0x7bb: 0x100, 0x7bc: 0x100, 0x7bd: 0x100, 0x7be: 0x100, 0x7bf: 0x100, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x100, 0x7c1: 0x100, 0x7c2: 0x100, 0x7c3: 0x100, 0x7c4: 0x100, 0x7c5: 0x100, 0x7c6: 0x100, 0x7c7: 0x100, + 0x7c8: 0x100, 0x7c9: 0x100, 0x7ca: 0x100, 0x7cb: 0x100, 0x7cc: 0x100, 0x7cd: 0x100, 0x7ce: 0x100, 0x7cf: 0x100, + 0x7d0: 0x100, 0x7d1: 0x100, 0x7d2: 0x100, 0x7d3: 0x100, 0x7d4: 0x100, 0x7d5: 0x100, 0x7d6: 0x100, 0x7d7: 0x100, + 0x7d8: 0x100, 0x7d9: 0x100, 0x7da: 0x100, 0x7db: 0x100, 0x7dc: 0x100, 0x7dd: 0x100, 0x7de: 0x100, 0x7df: 0x100, + 0x7e0: 0x7c, 0x7e1: 0x7d, 0x7e2: 0x7e, 0x7e3: 0x7f, 0x7e4: 0x80, 0x7e5: 0x81, 0x7e6: 0x82, 0x7e7: 0x83, + 0x7e8: 0x84, 0x7e9: 0x100, 0x7ea: 0x100, 0x7eb: 0x100, 0x7ec: 0x100, 0x7ed: 0x100, 0x7ee: 0x100, 0x7ef: 0x100, + 0x7f0: 0x100, 0x7f1: 0x100, 0x7f2: 0x100, 0x7f3: 0x100, 0x7f4: 0x100, 0x7f5: 0x100, 0x7f6: 0x100, 0x7f7: 0x100, + 0x7f8: 0x100, 0x7f9: 0x100, 0x7fa: 0x100, 0x7fb: 0x100, 0x7fc: 0x100, 0x7fd: 0x100, 0x7fe: 0x100, 0x7ff: 0x100, + // Block 0x20, offset 0x800 + 0x800: 0xa6, 0x801: 0xa6, 0x802: 0xa6, 0x803: 0xa6, 0x804: 0xa6, 0x805: 0xa6, 0x806: 0xa6, 0x807: 0xa6, + 0x808: 0xa6, 0x809: 0xa6, 0x80a: 0xa6, 0x80b: 0xa6, 0x80c: 0xa6, 0x80d: 0x1ae, 0x80e: 0xa6, 0x80f: 0xa6, + 0x810: 0xa6, 0x811: 0xa6, 0x812: 0xa6, 0x813: 0xa6, 0x814: 0xa6, 0x815: 0xa6, 0x816: 0xa6, 0x817: 0xa6, + 0x818: 0xa6, 0x819: 0xa6, 0x81a: 0xa6, 0x81b: 0xa6, 0x81c: 0xa6, 0x81d: 0xa6, 0x81e: 0xa6, 0x81f: 0xa6, + 0x820: 0xa6, 0x821: 0xa6, 0x822: 0xa6, 0x823: 0xa6, 0x824: 0xa6, 0x825: 0xa6, 0x826: 0xa6, 0x827: 0xa6, + 0x828: 0xa6, 0x829: 0xa6, 0x82a: 0xa6, 0x82b: 0xa6, 0x82c: 0xa6, 0x82d: 0xa6, 0x82e: 0xa6, 0x82f: 0xa6, + 0x830: 0xa6, 0x831: 0xa6, 0x832: 0xa6, 0x833: 0xa6, 0x834: 0xa6, 0x835: 0xa6, 0x836: 0xa6, 0x837: 0xa6, + 0x838: 0xa6, 0x839: 0xa6, 0x83a: 0xa6, 0x83b: 0xa6, 0x83c: 0xa6, 0x83d: 0xa6, 0x83e: 0xa6, 0x83f: 0xa6, + // Block 0x21, offset 0x840 + 0x840: 0xa6, 0x841: 0xa6, 0x842: 0xa6, 0x843: 0xa6, 0x844: 0xa6, 0x845: 0xa6, 0x846: 0xa6, 0x847: 0xa6, + 0x848: 0xa6, 0x849: 0xa6, 0x84a: 0xa6, 0x84b: 0xa6, 0x84c: 0xa6, 0x84d: 0xa6, 0x84e: 0x1af, 0x84f: 0x100, + 0x850: 0x100, 0x851: 0x100, 0x852: 0x100, 0x853: 0x100, 0x854: 0x100, 0x855: 0x100, 0x856: 0x100, 0x857: 0x100, + 0x858: 0x100, 0x859: 0x100, 0x85a: 0x100, 0x85b: 0x100, 0x85c: 0x100, 0x85d: 0x100, 0x85e: 0x100, 0x85f: 0x100, + 0x860: 0x100, 0x861: 0x100, 0x862: 0x100, 0x863: 0x100, 0x864: 0x100, 0x865: 0x100, 0x866: 0x100, 0x867: 0x100, + 0x868: 0x100, 0x869: 0x100, 0x86a: 0x100, 0x86b: 0x100, 0x86c: 0x100, 0x86d: 0x100, 0x86e: 0x100, 0x86f: 0x100, + 0x870: 0x100, 0x871: 0x100, 0x872: 0x100, 0x873: 0x100, 0x874: 0x100, 0x875: 0x100, 0x876: 0x100, 0x877: 0x100, + 0x878: 0x100, 0x879: 0x100, 0x87a: 0x100, 0x87b: 0x100, 0x87c: 0x100, 0x87d: 0x100, 0x87e: 0x100, 0x87f: 0x100, + // Block 0x22, offset 0x880 + 0x890: 0x0c, 0x891: 0x0d, 0x892: 0x0e, 0x893: 0x0f, 0x894: 0x10, 0x895: 0x0a, 0x896: 0x11, 0x897: 0x07, + 0x898: 0x12, 0x899: 0x0a, 0x89a: 0x13, 0x89b: 0x14, 0x89c: 0x15, 0x89d: 0x16, 0x89e: 0x17, 0x89f: 0x18, + 0x8a0: 0x07, 0x8a1: 0x07, 0x8a2: 0x07, 0x8a3: 0x07, 0x8a4: 0x07, 0x8a5: 0x07, 0x8a6: 0x07, 0x8a7: 0x07, + 0x8a8: 0x07, 0x8a9: 0x07, 0x8aa: 0x19, 0x8ab: 0x1a, 0x8ac: 0x1b, 0x8ad: 0x07, 0x8ae: 0x1c, 0x8af: 0x1d, + 0x8b0: 0x07, 0x8b1: 0x1e, 0x8b2: 0x1f, 0x8b3: 0x0a, 0x8b4: 0x0a, 0x8b5: 0x0a, 0x8b6: 0x0a, 0x8b7: 0x0a, + 0x8b8: 0x0a, 0x8b9: 0x0a, 0x8ba: 0x0a, 0x8bb: 0x0a, 0x8bc: 0x0a, 0x8bd: 0x0a, 0x8be: 0x0a, 0x8bf: 0x0a, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0a, 0x8c1: 0x0a, 0x8c2: 0x0a, 0x8c3: 0x0a, 0x8c4: 0x0a, 0x8c5: 0x0a, 0x8c6: 0x0a, 0x8c7: 0x0a, + 0x8c8: 0x0a, 0x8c9: 0x0a, 0x8ca: 0x0a, 0x8cb: 0x0a, 0x8cc: 0x0a, 0x8cd: 0x0a, 0x8ce: 0x0a, 0x8cf: 0x0a, + 0x8d0: 0x0a, 0x8d1: 0x0a, 0x8d2: 0x0a, 0x8d3: 0x0a, 0x8d4: 0x0a, 0x8d5: 0x0a, 0x8d6: 0x0a, 0x8d7: 0x0a, + 0x8d8: 0x0a, 0x8d9: 0x0a, 0x8da: 0x0a, 0x8db: 0x0a, 0x8dc: 0x0a, 0x8dd: 0x0a, 0x8de: 0x0a, 0x8df: 0x0a, + 0x8e0: 0x0a, 0x8e1: 0x0a, 0x8e2: 0x0a, 0x8e3: 0x0a, 0x8e4: 0x0a, 0x8e5: 0x0a, 0x8e6: 0x0a, 0x8e7: 0x0a, + 0x8e8: 0x0a, 0x8e9: 0x0a, 0x8ea: 0x0a, 0x8eb: 0x0a, 0x8ec: 0x0a, 0x8ed: 0x0a, 0x8ee: 0x0a, 0x8ef: 0x0a, + 0x8f0: 0x0a, 0x8f1: 0x0a, 0x8f2: 0x0a, 0x8f3: 0x0a, 0x8f4: 0x0a, 0x8f5: 0x0a, 0x8f6: 0x0a, 0x8f7: 0x0a, + 0x8f8: 0x0a, 0x8f9: 0x0a, 0x8fa: 0x0a, 0x8fb: 0x0a, 0x8fc: 0x0a, 0x8fd: 0x0a, 0x8fe: 0x0a, 0x8ff: 0x0a, + // Block 0x24, offset 0x900 + 0x900: 0x1b0, 0x901: 0x1b1, 0x902: 0x100, 0x903: 0x100, 0x904: 0x1b2, 0x905: 0x1b2, 0x906: 0x1b2, 0x907: 0x1b3, + 0x908: 0x100, 0x909: 0x100, 0x90a: 0x100, 0x90b: 0x100, 0x90c: 0x100, 0x90d: 0x100, 0x90e: 0x100, 0x90f: 0x100, + 0x910: 0x100, 0x911: 0x100, 0x912: 0x100, 0x913: 0x100, 0x914: 0x100, 0x915: 0x100, 0x916: 0x100, 0x917: 0x100, + 0x918: 0x100, 0x919: 0x100, 0x91a: 0x100, 0x91b: 0x100, 0x91c: 0x100, 0x91d: 0x100, 0x91e: 0x100, 0x91f: 0x100, + 0x920: 0x100, 0x921: 0x100, 0x922: 0x100, 0x923: 0x100, 0x924: 0x100, 0x925: 0x100, 0x926: 0x100, 0x927: 0x100, + 0x928: 0x100, 0x929: 0x100, 0x92a: 0x100, 0x92b: 0x100, 0x92c: 0x100, 0x92d: 0x100, 0x92e: 0x100, 0x92f: 0x100, + 0x930: 0x100, 0x931: 0x100, 0x932: 0x100, 0x933: 0x100, 0x934: 0x100, 0x935: 0x100, 0x936: 0x100, 0x937: 0x100, + 0x938: 0x100, 0x939: 0x100, 0x93a: 0x100, 0x93b: 0x100, 0x93c: 0x100, 0x93d: 0x100, 0x93e: 0x100, 0x93f: 0x100, + // Block 0x25, offset 0x940 + 0x940: 0x0a, 0x941: 0x0a, 0x942: 0x0a, 0x943: 0x0a, 0x944: 0x0a, 0x945: 0x0a, 0x946: 0x0a, 0x947: 0x0a, + 0x948: 0x0a, 0x949: 0x0a, 0x94a: 0x0a, 0x94b: 0x0a, 0x94c: 0x0a, 0x94d: 0x0a, 0x94e: 0x0a, 0x94f: 0x0a, + 0x950: 0x0a, 0x951: 0x0a, 0x952: 0x0a, 0x953: 0x0a, 0x954: 0x0a, 0x955: 0x0a, 0x956: 0x0a, 0x957: 0x0a, + 0x958: 0x0a, 0x959: 0x0a, 0x95a: 0x0a, 0x95b: 0x0a, 0x95c: 0x0a, 0x95d: 0x0a, 0x95e: 0x0a, 0x95f: 0x0a, + 0x960: 0x22, 0x961: 0x0a, 0x962: 0x0a, 0x963: 0x0a, 0x964: 0x0a, 0x965: 0x0a, 0x966: 0x0a, 0x967: 0x0a, + 0x968: 0x0a, 0x969: 0x0a, 0x96a: 0x0a, 0x96b: 0x0a, 0x96c: 0x0a, 0x96d: 0x0a, 0x96e: 0x0a, 0x96f: 0x0a, + 0x970: 0x0a, 0x971: 0x0a, 0x972: 0x0a, 0x973: 0x0a, 0x974: 0x0a, 0x975: 0x0a, 0x976: 0x0a, 0x977: 0x0a, + 0x978: 0x0a, 0x979: 0x0a, 0x97a: 0x0a, 0x97b: 0x0a, 0x97c: 0x0a, 0x97d: 0x0a, 0x97e: 0x0a, 0x97f: 0x0a, + // Block 0x26, offset 0x980 + 0x980: 0x0a, 0x981: 0x0a, 0x982: 0x0a, 0x983: 0x0a, 0x984: 0x0a, 0x985: 0x0a, 0x986: 0x0a, 0x987: 0x0a, + 0x988: 0x0a, 0x989: 0x0a, 0x98a: 0x0a, 0x98b: 0x0a, 0x98c: 0x0a, 0x98d: 0x0a, 0x98e: 0x0a, 0x98f: 0x0a, +} + +// idnaSparseOffset: 303 entries, 606 bytes +var idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x33, 0x3e, 0x4a, 0x4e, 0x5d, 0x62, 0x6c, 0x78, 0x7e, 0x87, 0x97, 0xa6, 0xb1, 0xbe, 0xcf, 0xd9, 0xe0, 0xed, 0xfe, 0x105, 0x110, 0x11f, 0x12d, 0x137, 0x139, 0x13e, 0x141, 0x144, 0x146, 0x152, 0x15d, 0x165, 0x16b, 0x171, 0x176, 0x17b, 0x17e, 0x182, 0x188, 0x18d, 0x198, 0x1a2, 0x1a8, 0x1b9, 0x1c4, 0x1c7, 0x1cf, 0x1d2, 0x1df, 0x1e7, 0x1eb, 0x1f2, 0x1fa, 0x20a, 0x216, 0x219, 0x223, 0x22f, 0x23b, 0x247, 0x24f, 0x254, 0x261, 0x272, 0x27d, 0x282, 0x28b, 0x293, 0x299, 0x29e, 0x2a1, 0x2a5, 0x2ab, 0x2af, 0x2b3, 0x2b7, 0x2bc, 0x2c4, 0x2cb, 0x2d6, 0x2e0, 0x2e4, 0x2e7, 0x2ed, 0x2f1, 0x2f3, 0x2f6, 0x2f8, 0x2fb, 0x305, 0x308, 0x317, 0x31b, 0x31f, 0x321, 0x32a, 0x32e, 0x333, 0x338, 0x33e, 0x34e, 0x354, 0x358, 0x367, 0x36c, 0x374, 0x37e, 0x389, 0x391, 0x3a2, 0x3ab, 0x3bb, 0x3c8, 0x3d4, 0x3d9, 0x3e6, 0x3ea, 0x3ef, 0x3f1, 0x3f3, 0x3f7, 0x3f9, 0x3fd, 0x406, 0x40c, 0x410, 0x420, 0x42a, 0x42f, 0x432, 0x438, 0x43f, 0x444, 0x448, 0x44e, 0x453, 0x45c, 0x461, 0x467, 0x46e, 0x475, 0x47c, 0x480, 0x483, 0x488, 0x494, 0x49a, 0x49f, 0x4a6, 0x4ae, 0x4b3, 0x4b7, 0x4c7, 0x4ce, 0x4d2, 0x4d6, 0x4dd, 0x4df, 0x4e2, 0x4e5, 0x4e9, 0x4f2, 0x4f6, 0x4fe, 0x501, 0x509, 0x514, 0x523, 0x52f, 0x535, 0x542, 0x54e, 0x556, 0x55f, 0x56a, 0x571, 0x580, 0x58d, 0x591, 0x59e, 0x5a7, 0x5ab, 0x5ba, 0x5c2, 0x5cd, 0x5d6, 0x5dc, 0x5e4, 0x5ed, 0x5f9, 0x5fc, 0x608, 0x60b, 0x614, 0x617, 0x61c, 0x625, 0x62a, 0x637, 0x642, 0x64b, 0x656, 0x659, 0x65c, 0x666, 0x66f, 0x67b, 0x688, 0x695, 0x6a3, 0x6aa, 0x6b5, 0x6bc, 0x6c0, 0x6c4, 0x6c7, 0x6cc, 0x6cf, 0x6d2, 0x6d6, 0x6d9, 0x6de, 0x6e5, 0x6e8, 0x6f0, 0x6f4, 0x6ff, 0x702, 0x705, 0x708, 0x70e, 0x714, 0x71d, 0x720, 0x723, 0x726, 0x72e, 0x733, 0x73c, 0x73f, 0x744, 0x74e, 0x752, 0x756, 0x759, 0x75c, 0x760, 0x76f, 0x77b, 0x77f, 0x784, 0x789, 0x78e, 0x792, 0x797, 0x7a0, 0x7a5, 0x7a9, 0x7af, 0x7b5, 0x7ba, 0x7c0, 0x7c6, 0x7d0, 0x7d6, 0x7df, 0x7e2, 0x7e5, 0x7e9, 0x7ed, 0x7f1, 0x7f7, 0x7fd, 0x802, 0x805, 0x815, 0x81c, 0x820, 0x827, 0x82b, 0x831, 0x838, 0x83f, 0x845, 0x84e, 0x852, 0x860, 0x863, 0x866, 0x86a, 0x86e, 0x871, 0x875, 0x878, 0x87d, 0x87f, 0x881} + +// idnaSparseValues: 2180 entries, 8720 bytes +var idnaSparseValues = [2180]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x07}, + {value: 0xe105, lo: 0x80, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0x97}, + {value: 0xe105, lo: 0x98, hi: 0x9e}, + {value: 0x001f, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbf}, + // Block 0x1, offset 0x8 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0xe01d, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0335, lo: 0x83, hi: 0x83}, + {value: 0x034d, lo: 0x84, hi: 0x84}, + {value: 0x0365, lo: 0x85, hi: 0x85}, + {value: 0xe00d, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0xe00d, lo: 0x88, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x89}, + {value: 0xe00d, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe00d, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0x8d}, + {value: 0xe00d, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0xbf}, + // Block 0x2, offset 0x19 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x00a9, lo: 0xb0, hi: 0xb0}, + {value: 0x037d, lo: 0xb1, hi: 0xb1}, + {value: 0x00b1, lo: 0xb2, hi: 0xb2}, + {value: 0x00b9, lo: 0xb3, hi: 0xb3}, + {value: 0x034d, lo: 0xb4, hi: 0xb4}, + {value: 0x0395, lo: 0xb5, hi: 0xb5}, + {value: 0xe1bd, lo: 0xb6, hi: 0xb6}, + {value: 0x00c1, lo: 0xb7, hi: 0xb7}, + {value: 0x00c9, lo: 0xb8, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbf}, + // Block 0x3, offset 0x25 + {value: 0x0000, lo: 0x01}, + {value: 0x3308, lo: 0x80, hi: 0xbf}, + // Block 0x4, offset 0x27 + {value: 0x0000, lo: 0x04}, + {value: 0x03f5, lo: 0x80, hi: 0x8f}, + {value: 0xe105, lo: 0x90, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x5, offset 0x2c + {value: 0x0000, lo: 0x06}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x0545, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x0008, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x6, offset 0x33 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0131, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0018, lo: 0x89, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x7, offset 0x3e + {value: 0x0000, lo: 0x0b}, + {value: 0x0818, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x82}, + {value: 0x0818, lo: 0x83, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xae}, + {value: 0x0808, lo: 0xaf, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x8, offset 0x4a + {value: 0x0000, lo: 0x03}, + {value: 0x0a08, lo: 0x80, hi: 0x87}, + {value: 0x0c08, lo: 0x88, hi: 0x99}, + {value: 0x0a08, lo: 0x9a, hi: 0xbf}, + // Block 0x9, offset 0x4e + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8c}, + {value: 0x0c08, lo: 0x8d, hi: 0x8d}, + {value: 0x0a08, lo: 0x8e, hi: 0x98}, + {value: 0x0c08, lo: 0x99, hi: 0x9b}, + {value: 0x0a08, lo: 0x9c, hi: 0xaa}, + {value: 0x0c08, lo: 0xab, hi: 0xac}, + {value: 0x0a08, lo: 0xad, hi: 0xb0}, + {value: 0x0c08, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb4}, + {value: 0x0a08, lo: 0xb5, hi: 0xb7}, + {value: 0x0c08, lo: 0xb8, hi: 0xb9}, + {value: 0x0a08, lo: 0xba, hi: 0xbf}, + // Block 0xa, offset 0x5d + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xb, offset 0x62 + {value: 0x0000, lo: 0x09}, + {value: 0x0808, lo: 0x80, hi: 0x89}, + {value: 0x0a08, lo: 0x8a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0818, lo: 0xbe, hi: 0xbf}, + // Block 0xc, offset 0x6c + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x99}, + {value: 0x0808, lo: 0x9a, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0xa3}, + {value: 0x0808, lo: 0xa4, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa7}, + {value: 0x0808, lo: 0xa8, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0818, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xd, offset 0x78 + {value: 0x0000, lo: 0x05}, + {value: 0x0a08, lo: 0x80, hi: 0x88}, + {value: 0x0808, lo: 0x89, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0xa1}, + {value: 0x0840, lo: 0xa2, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xbf}, + // Block 0xe, offset 0x7e + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0xf, offset 0x87 + {value: 0x0000, lo: 0x0f}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x85}, + {value: 0x3008, lo: 0x86, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8c}, + {value: 0x3b08, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x10, offset 0x97 + {value: 0x0000, lo: 0x0e}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x11, offset 0xa6 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xba}, + {value: 0x3b08, lo: 0xbb, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x12, offset 0xb1 + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x13, offset 0xbe + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x89}, + {value: 0x3b08, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x94}, + {value: 0x0040, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x3008, lo: 0x98, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x14, offset 0xcf + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x01f1, lo: 0xb3, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb9}, + {value: 0x3b08, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x15, offset 0xd9 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0xbf}, + // Block 0x16, offset 0xe0 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x3308, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0201, lo: 0x9c, hi: 0x9c}, + {value: 0x0209, lo: 0x9d, hi: 0x9d}, + {value: 0x0008, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x17, offset 0xed + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0x8b}, + {value: 0xe03d, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x18, offset 0xfe + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0x19, offset 0x105 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x1a, offset 0x110 + {value: 0x0000, lo: 0x0e}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x3008, lo: 0xa2, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbf}, + // Block 0x1b, offset 0x11f + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x8c}, + {value: 0x3308, lo: 0x8d, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x3008, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x3008, lo: 0x9a, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x1c, offset 0x12d + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x86}, + {value: 0x055d, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8c}, + {value: 0x055d, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0xe105, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0x1d, offset 0x137 + {value: 0x0000, lo: 0x01}, + {value: 0x0018, lo: 0x80, hi: 0xbf}, + // Block 0x1e, offset 0x139 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa0}, + {value: 0x2018, lo: 0xa1, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x1f, offset 0x13e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa7}, + {value: 0x2018, lo: 0xa8, hi: 0xbf}, + // Block 0x20, offset 0x141 + {value: 0x0000, lo: 0x02}, + {value: 0x2018, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0xbf}, + // Block 0x21, offset 0x144 + {value: 0x0000, lo: 0x01}, + {value: 0x0008, lo: 0x80, hi: 0xbf}, + // Block 0x22, offset 0x146 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x99}, + {value: 0x0008, lo: 0x9a, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x23, offset 0x152 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x24, offset 0x15d + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x25, offset 0x165 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbf}, + // Block 0x26, offset 0x16b + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x27, offset 0x171 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x28, offset 0x176 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x29, offset 0x17b + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x2a, offset 0x17e + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xbf}, + // Block 0x2b, offset 0x182 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x2c, offset 0x188 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x2d, offset 0x18d + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x3b08, lo: 0x94, hi: 0x94}, + {value: 0x3808, lo: 0x95, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3808, lo: 0xb4, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x2e, offset 0x198 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x2f, offset 0x1a2 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xb3}, + {value: 0x3340, lo: 0xb4, hi: 0xb5}, + {value: 0x3008, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x30, offset 0x1a8 + {value: 0x0000, lo: 0x10}, + {value: 0x3008, lo: 0x80, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x3008, lo: 0x87, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x91}, + {value: 0x3b08, lo: 0x92, hi: 0x92}, + {value: 0x3308, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0x96}, + {value: 0x0008, lo: 0x97, hi: 0x97}, + {value: 0x0018, lo: 0x98, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x31, offset 0x1b9 + {value: 0x0000, lo: 0x0a}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x86}, + {value: 0x0218, lo: 0x87, hi: 0x87}, + {value: 0x0018, lo: 0x88, hi: 0x8a}, + {value: 0x33c0, lo: 0x8b, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x33c0, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0208, lo: 0xa0, hi: 0xbf}, + // Block 0x32, offset 0x1c4 + {value: 0x0000, lo: 0x02}, + {value: 0x0208, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x33, offset 0x1c7 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0208, lo: 0x87, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xa9}, + {value: 0x0208, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x34, offset 0x1cf + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x35, offset 0x1d2 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb8}, + {value: 0x3308, lo: 0xb9, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x36, offset 0x1df + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x37, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x38, offset 0x1eb + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0028, lo: 0x9a, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xbf}, + // Block 0x39, offset 0x1f2 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x3308, lo: 0x97, hi: 0x98}, + {value: 0x3008, lo: 0x99, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x3a, offset 0x1fa + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x94}, + {value: 0x3008, lo: 0x95, hi: 0x95}, + {value: 0x3308, lo: 0x96, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xac}, + {value: 0x3008, lo: 0xad, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3b, offset 0x20a + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbd}, + {value: 0x3318, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x3c, offset 0x216 + {value: 0x0000, lo: 0x02}, + {value: 0x3308, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0xbf}, + // Block 0x3d, offset 0x219 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3008, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbf}, + // Block 0x3e, offset 0x223 + {value: 0x0000, lo: 0x0b}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x3808, lo: 0x84, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x3f, offset 0x22f + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3808, lo: 0xaa, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xbf}, + // Block 0x40, offset 0x23b + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa9}, + {value: 0x3008, lo: 0xaa, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3808, lo: 0xb2, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbf}, + // Block 0x41, offset 0x247 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x42, offset 0x24f + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x43, offset 0x254 + {value: 0x0000, lo: 0x0c}, + {value: 0x02a9, lo: 0x80, hi: 0x80}, + {value: 0x02b1, lo: 0x81, hi: 0x81}, + {value: 0x02b9, lo: 0x82, hi: 0x82}, + {value: 0x02c1, lo: 0x83, hi: 0x83}, + {value: 0x02c9, lo: 0x84, hi: 0x85}, + {value: 0x02d1, lo: 0x86, hi: 0x86}, + {value: 0x02d9, lo: 0x87, hi: 0x87}, + {value: 0x057d, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x059d, lo: 0x90, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbc}, + {value: 0x059d, lo: 0xbd, hi: 0xbf}, + // Block 0x44, offset 0x261 + {value: 0x0000, lo: 0x10}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x92}, + {value: 0x0018, lo: 0x93, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0xa0}, + {value: 0x3008, lo: 0xa1, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa8}, + {value: 0x0008, lo: 0xa9, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x0008, lo: 0xae, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x45, offset 0x272 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x87}, + {value: 0xe045, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0xe045, lo: 0x98, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0xe045, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb7}, + {value: 0xe045, lo: 0xb8, hi: 0xbf}, + // Block 0x46, offset 0x27d + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x80}, + {value: 0x0040, lo: 0x81, hi: 0x8f}, + {value: 0x3318, lo: 0x90, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x47, offset 0x282 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x0851, lo: 0x89, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x48, offset 0x28b + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0859, lo: 0xac, hi: 0xac}, + {value: 0x0861, lo: 0xad, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xae}, + {value: 0x0869, lo: 0xaf, hi: 0xaf}, + {value: 0x0871, lo: 0xb0, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x49, offset 0x293 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x9f}, + {value: 0x0080, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xad}, + {value: 0x0080, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x4a, offset 0x299 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xa8}, + {value: 0x09dd, lo: 0xa9, hi: 0xa9}, + {value: 0x09fd, lo: 0xaa, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xbf}, + // Block 0x4b, offset 0x29e + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xbf}, + // Block 0x4c, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0929, lo: 0x8c, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0xbf}, + // Block 0x4d, offset 0x2a5 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0e7e, lo: 0xb4, hi: 0xb4}, + {value: 0x0932, lo: 0xb5, hi: 0xb5}, + {value: 0x0e9e, lo: 0xb6, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x4e, offset 0x2ab + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x9b}, + {value: 0x0939, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0xbf}, + // Block 0x4f, offset 0x2af + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x50, offset 0x2b3 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0018, lo: 0x97, hi: 0xbf}, + // Block 0x51, offset 0x2b7 + {value: 0x0000, lo: 0x04}, + {value: 0xe185, lo: 0x80, hi: 0x8f}, + {value: 0x03f5, lo: 0x90, hi: 0x9f}, + {value: 0x0ebd, lo: 0xa0, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x52, offset 0x2bc + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x53, offset 0x2c4 + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xae}, + {value: 0xe075, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x54, offset 0x2cb + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x55, offset 0x2d6 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xbf}, + // Block 0x56, offset 0x2e0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0008, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x57, offset 0x2e4 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x58, offset 0x2e7 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9e}, + {value: 0x0ef5, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x59, offset 0x2ed + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb2}, + {value: 0x0f15, lo: 0xb3, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x5a, offset 0x2f1 + {value: 0x0020, lo: 0x01}, + {value: 0x0f35, lo: 0x80, hi: 0xbf}, + // Block 0x5b, offset 0x2f3 + {value: 0x0020, lo: 0x02}, + {value: 0x1735, lo: 0x80, hi: 0x8f}, + {value: 0x1915, lo: 0x90, hi: 0xbf}, + // Block 0x5c, offset 0x2f6 + {value: 0x0020, lo: 0x01}, + {value: 0x1f15, lo: 0x80, hi: 0xbf}, + // Block 0x5d, offset 0x2f8 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0xbf}, + // Block 0x5e, offset 0x2fb + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9a}, + {value: 0x096a, lo: 0x9b, hi: 0x9b}, + {value: 0x0972, lo: 0x9c, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9e}, + {value: 0x0979, lo: 0x9f, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xbf}, + // Block 0x5f, offset 0x305 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x0981, lo: 0xbf, hi: 0xbf}, + // Block 0x60, offset 0x308 + {value: 0x0000, lo: 0x0e}, + {value: 0x0040, lo: 0x80, hi: 0x84}, + {value: 0x0008, lo: 0x85, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xb0}, + {value: 0x2a35, lo: 0xb1, hi: 0xb1}, + {value: 0x2a55, lo: 0xb2, hi: 0xb2}, + {value: 0x2a75, lo: 0xb3, hi: 0xb3}, + {value: 0x2a95, lo: 0xb4, hi: 0xb4}, + {value: 0x2a75, lo: 0xb5, hi: 0xb5}, + {value: 0x2ab5, lo: 0xb6, hi: 0xb6}, + {value: 0x2ad5, lo: 0xb7, hi: 0xb7}, + {value: 0x2af5, lo: 0xb8, hi: 0xb9}, + {value: 0x2b15, lo: 0xba, hi: 0xbb}, + {value: 0x2b35, lo: 0xbc, hi: 0xbd}, + {value: 0x2b15, lo: 0xbe, hi: 0xbf}, + // Block 0x61, offset 0x317 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x62, offset 0x31b + {value: 0x0008, lo: 0x03}, + {value: 0x098a, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0a82, lo: 0xa0, hi: 0xbf}, + // Block 0x63, offset 0x31f + {value: 0x0008, lo: 0x01}, + {value: 0x0d19, lo: 0x80, hi: 0xbf}, + // Block 0x64, offset 0x321 + {value: 0x0008, lo: 0x08}, + {value: 0x0f19, lo: 0x80, hi: 0xb0}, + {value: 0x4045, lo: 0xb1, hi: 0xb1}, + {value: 0x10a1, lo: 0xb2, hi: 0xb3}, + {value: 0x4065, lo: 0xb4, hi: 0xb4}, + {value: 0x10b1, lo: 0xb5, hi: 0xb7}, + {value: 0x4085, lo: 0xb8, hi: 0xb8}, + {value: 0x4085, lo: 0xb9, hi: 0xb9}, + {value: 0x10c9, lo: 0xba, hi: 0xbf}, + // Block 0x65, offset 0x32a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0040, lo: 0x8d, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x66, offset 0x32e + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0x67, offset 0x333 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xbf}, + // Block 0x68, offset 0x338 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb1}, + {value: 0x0018, lo: 0xb2, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x69, offset 0x33e + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x3308, lo: 0x8b, hi: 0x8b}, + {value: 0x0008, lo: 0x8c, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa6}, + {value: 0x3008, lo: 0xa7, hi: 0xa7}, + {value: 0x0018, lo: 0xa8, hi: 0xab}, + {value: 0x3b08, lo: 0xac, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x6a, offset 0x34e + {value: 0x0000, lo: 0x05}, + {value: 0x0208, lo: 0x80, hi: 0xb1}, + {value: 0x0108, lo: 0xb2, hi: 0xb2}, + {value: 0x0008, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0x6b, offset 0x354 + {value: 0x0000, lo: 0x03}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xbf}, + // Block 0x6c, offset 0x358 + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xba}, + {value: 0x0008, lo: 0xbb, hi: 0xbb}, + {value: 0x0018, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0x6d, offset 0x367 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa5}, + {value: 0x3308, lo: 0xa6, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x6e, offset 0x36c + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x91}, + {value: 0x3008, lo: 0x92, hi: 0x92}, + {value: 0x3808, lo: 0x93, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x6f, offset 0x374 + {value: 0x0000, lo: 0x09}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb9}, + {value: 0x3008, lo: 0xba, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0x70, offset 0x37e + {value: 0x0000, lo: 0x0a}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x71, offset 0x389 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xa8}, + {value: 0x3308, lo: 0xa9, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x72, offset 0x391 + {value: 0x0000, lo: 0x10}, + {value: 0x0008, lo: 0x80, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8c}, + {value: 0x3008, lo: 0x8d, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbc}, + {value: 0x3008, lo: 0xbd, hi: 0xbd}, + {value: 0x0008, lo: 0xbe, hi: 0xbf}, + // Block 0x73, offset 0x3a2 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb8}, + {value: 0x0008, lo: 0xb9, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbf}, + // Block 0x74, offset 0x3ab + {value: 0x0000, lo: 0x0f}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x9a}, + {value: 0x0008, lo: 0x9b, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xaa}, + {value: 0x3008, lo: 0xab, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb5}, + {value: 0x3b08, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x75, offset 0x3bb + {value: 0x0000, lo: 0x0c}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x88}, + {value: 0x0008, lo: 0x89, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x90}, + {value: 0x0008, lo: 0x91, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x76, offset 0x3c8 + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x449d, lo: 0x9c, hi: 0x9c}, + {value: 0x44b5, lo: 0x9d, hi: 0x9d}, + {value: 0x0941, lo: 0x9e, hi: 0x9e}, + {value: 0xe06d, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa8}, + {value: 0x13f9, lo: 0xa9, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x44cd, lo: 0xb0, hi: 0xbf}, + // Block 0x77, offset 0x3d4 + {value: 0x0000, lo: 0x04}, + {value: 0x44ed, lo: 0x80, hi: 0x8f}, + {value: 0x450d, lo: 0x90, hi: 0x9f}, + {value: 0x452d, lo: 0xa0, hi: 0xaf}, + {value: 0x450d, lo: 0xb0, hi: 0xbf}, + // Block 0x78, offset 0x3d9 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x3008, lo: 0xa3, hi: 0xa4}, + {value: 0x3308, lo: 0xa5, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa7}, + {value: 0x3308, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xaa}, + {value: 0x0018, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3b08, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x79, offset 0x3e6 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x7a, offset 0x3ea + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x7b, offset 0x3ef + {value: 0x0000, lo: 0x01}, + {value: 0x0040, lo: 0x80, hi: 0xbf}, + // Block 0x7c, offset 0x3f1 + {value: 0x0020, lo: 0x01}, + {value: 0x454d, lo: 0x80, hi: 0xbf}, + // Block 0x7d, offset 0x3f3 + {value: 0x0020, lo: 0x03}, + {value: 0x4d4d, lo: 0x80, hi: 0x94}, + {value: 0x4b0d, lo: 0x95, hi: 0x95}, + {value: 0x4fed, lo: 0x96, hi: 0xbf}, + // Block 0x7e, offset 0x3f7 + {value: 0x0020, lo: 0x01}, + {value: 0x552d, lo: 0x80, hi: 0xbf}, + // Block 0x7f, offset 0x3f9 + {value: 0x0020, lo: 0x03}, + {value: 0x5d2d, lo: 0x80, hi: 0x84}, + {value: 0x568d, lo: 0x85, hi: 0x85}, + {value: 0x5dcd, lo: 0x86, hi: 0xbf}, + // Block 0x80, offset 0x3fd + {value: 0x0020, lo: 0x08}, + {value: 0x6b8d, lo: 0x80, hi: 0x8f}, + {value: 0x6d4d, lo: 0x90, hi: 0x90}, + {value: 0x6d8d, lo: 0x91, hi: 0xab}, + {value: 0x1401, lo: 0xac, hi: 0xac}, + {value: 0x70ed, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x710d, lo: 0xb0, hi: 0xbf}, + // Block 0x81, offset 0x406 + {value: 0x0020, lo: 0x05}, + {value: 0x730d, lo: 0x80, hi: 0xad}, + {value: 0x656d, lo: 0xae, hi: 0xae}, + {value: 0x78cd, lo: 0xaf, hi: 0xb5}, + {value: 0x6f8d, lo: 0xb6, hi: 0xb6}, + {value: 0x79ad, lo: 0xb7, hi: 0xbf}, + // Block 0x82, offset 0x40c + {value: 0x0008, lo: 0x03}, + {value: 0x1751, lo: 0x80, hi: 0x82}, + {value: 0x1741, lo: 0x83, hi: 0x83}, + {value: 0x1769, lo: 0x84, hi: 0xbf}, + // Block 0x83, offset 0x410 + {value: 0x0008, lo: 0x0f}, + {value: 0x1d81, lo: 0x80, hi: 0x83}, + {value: 0x1d99, lo: 0x84, hi: 0x85}, + {value: 0x1da1, lo: 0x86, hi: 0x87}, + {value: 0x1da9, lo: 0x88, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x1de9, lo: 0x92, hi: 0x97}, + {value: 0x1e11, lo: 0x98, hi: 0x9c}, + {value: 0x1e31, lo: 0x9d, hi: 0xb3}, + {value: 0x1d71, lo: 0xb4, hi: 0xb4}, + {value: 0x1d81, lo: 0xb5, hi: 0xb5}, + {value: 0x1ee9, lo: 0xb6, hi: 0xbb}, + {value: 0x1f09, lo: 0xbc, hi: 0xbc}, + {value: 0x1ef9, lo: 0xbd, hi: 0xbd}, + {value: 0x1f19, lo: 0xbe, hi: 0xbf}, + // Block 0x84, offset 0x420 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8c}, + {value: 0x0008, lo: 0x8d, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x0008, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0x85, offset 0x42a + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0x86, offset 0x42f + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x87, offset 0x432 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0x88, offset 0x438 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x89, offset 0x43f + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x8a, offset 0x444 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9c}, + {value: 0x0040, lo: 0x9d, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8b, offset 0x448 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x9f}, + {value: 0x3308, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x8c, offset 0x44e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xbf}, + // Block 0x8d, offset 0x453 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x89}, + {value: 0x0018, lo: 0x8a, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbf}, + // Block 0x8e, offset 0x45c + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x8f, offset 0x461 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0x90, offset 0x467 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x97}, + {value: 0x8b0d, lo: 0x98, hi: 0x9f}, + {value: 0x8b25, lo: 0xa0, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xbf}, + // Block 0x91, offset 0x46e + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x8b25, lo: 0xb0, hi: 0xb7}, + {value: 0x8b0d, lo: 0xb8, hi: 0xbf}, + // Block 0x92, offset 0x475 + {value: 0x0000, lo: 0x06}, + {value: 0xe145, lo: 0x80, hi: 0x87}, + {value: 0xe1c5, lo: 0x88, hi: 0x8f}, + {value: 0xe145, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0x93, offset 0x47c + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x94, offset 0x480 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0x95, offset 0x483 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xbf}, + // Block 0x96, offset 0x488 + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x87}, + {value: 0x0808, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0808, lo: 0x8a, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbb}, + {value: 0x0808, lo: 0xbc, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbe}, + {value: 0x0808, lo: 0xbf, hi: 0xbf}, + // Block 0x97, offset 0x494 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x96}, + {value: 0x0818, lo: 0x97, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0818, lo: 0xb7, hi: 0xbf}, + // Block 0x98, offset 0x49a + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa6}, + {value: 0x0818, lo: 0xa7, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x99, offset 0x49f + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb3}, + {value: 0x0808, lo: 0xb4, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xba}, + {value: 0x0818, lo: 0xbb, hi: 0xbf}, + // Block 0x9a, offset 0x4a6 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0818, lo: 0x96, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0818, lo: 0xbf, hi: 0xbf}, + // Block 0x9b, offset 0x4ae + {value: 0x0000, lo: 0x04}, + {value: 0x0808, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbb}, + {value: 0x0818, lo: 0xbc, hi: 0xbd}, + {value: 0x0808, lo: 0xbe, hi: 0xbf}, + // Block 0x9c, offset 0x4b3 + {value: 0x0000, lo: 0x03}, + {value: 0x0818, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x0818, lo: 0x92, hi: 0xbf}, + // Block 0x9d, offset 0x4b7 + {value: 0x0000, lo: 0x0f}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0x84}, + {value: 0x3308, lo: 0x85, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8b}, + {value: 0x3308, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x94}, + {value: 0x0808, lo: 0x95, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x98}, + {value: 0x0808, lo: 0x99, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x4c7 + {value: 0x0000, lo: 0x06}, + {value: 0x0818, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0818, lo: 0x90, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xbc}, + {value: 0x0818, lo: 0xbd, hi: 0xbf}, + // Block 0x9f, offset 0x4ce + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xa0, offset 0x4d2 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xbf}, + // Block 0xa1, offset 0x4d6 + {value: 0x0000, lo: 0x06}, + {value: 0x0808, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0x97}, + {value: 0x0818, lo: 0x98, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb7}, + {value: 0x0818, lo: 0xb8, hi: 0xbf}, + // Block 0xa2, offset 0x4dd + {value: 0x0000, lo: 0x01}, + {value: 0x0808, lo: 0x80, hi: 0xbf}, + // Block 0xa3, offset 0x4df + {value: 0x0000, lo: 0x02}, + {value: 0x0808, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xa4, offset 0x4e2 + {value: 0x0000, lo: 0x02}, + {value: 0x03dd, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xa5, offset 0x4e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0808, lo: 0x80, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xb9}, + {value: 0x0818, lo: 0xba, hi: 0xbf}, + // Block 0xa6, offset 0x4e9 + {value: 0x0000, lo: 0x08}, + {value: 0x0908, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0xa1}, + {value: 0x0c08, lo: 0xa2, hi: 0xa2}, + {value: 0x0a08, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xa7, offset 0x4f2 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0818, lo: 0xa0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xa8, offset 0x4f6 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xac}, + {value: 0x0818, lo: 0xad, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0808, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xa9, offset 0x4fe + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbf}, + // Block 0xaa, offset 0x501 + {value: 0x0000, lo: 0x07}, + {value: 0x0808, lo: 0x80, hi: 0x9c}, + {value: 0x0818, lo: 0x9d, hi: 0xa6}, + {value: 0x0808, lo: 0xa7, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb2}, + {value: 0x0c08, lo: 0xb3, hi: 0xb3}, + {value: 0x0a08, lo: 0xb4, hi: 0xbf}, + // Block 0xab, offset 0x509 + {value: 0x0000, lo: 0x0a}, + {value: 0x0a08, lo: 0x80, hi: 0x84}, + {value: 0x0808, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x90}, + {value: 0x0a18, lo: 0x91, hi: 0x93}, + {value: 0x0c18, lo: 0x94, hi: 0x94}, + {value: 0x0818, lo: 0x95, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb3}, + {value: 0x0c08, lo: 0xb4, hi: 0xb5}, + {value: 0x0a08, lo: 0xb6, hi: 0xbf}, + // Block 0xac, offset 0x514 + {value: 0x0000, lo: 0x0e}, + {value: 0x0a08, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x85}, + {value: 0x0818, lo: 0x86, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xaf}, + {value: 0x0a08, lo: 0xb0, hi: 0xb0}, + {value: 0x0808, lo: 0xb1, hi: 0xb1}, + {value: 0x0a08, lo: 0xb2, hi: 0xb3}, + {value: 0x0c08, lo: 0xb4, hi: 0xb6}, + {value: 0x0808, lo: 0xb7, hi: 0xb7}, + {value: 0x0a08, lo: 0xb8, hi: 0xb8}, + {value: 0x0c08, lo: 0xb9, hi: 0xba}, + {value: 0x0a08, lo: 0xbb, hi: 0xbc}, + {value: 0x0c08, lo: 0xbd, hi: 0xbd}, + {value: 0x0a08, lo: 0xbe, hi: 0xbf}, + // Block 0xad, offset 0x523 + {value: 0x0000, lo: 0x0b}, + {value: 0x0808, lo: 0x80, hi: 0x80}, + {value: 0x0a08, lo: 0x81, hi: 0x81}, + {value: 0x0c08, lo: 0x82, hi: 0x83}, + {value: 0x0a08, lo: 0x84, hi: 0x84}, + {value: 0x0818, lo: 0x85, hi: 0x88}, + {value: 0x0c18, lo: 0x89, hi: 0x89}, + {value: 0x0a18, lo: 0x8a, hi: 0x8a}, + {value: 0x0918, lo: 0x8b, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9f}, + {value: 0x0808, lo: 0xa0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xae, offset 0x52f + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xaf, offset 0x535 + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x85}, + {value: 0x3b08, lo: 0x86, hi: 0x86}, + {value: 0x0018, lo: 0x87, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x91}, + {value: 0x0018, lo: 0x92, hi: 0xa5}, + {value: 0x0008, lo: 0xa6, hi: 0xaf}, + {value: 0x3b08, lo: 0xb0, hi: 0xb0}, + {value: 0x0008, lo: 0xb1, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xb0, offset 0x542 + {value: 0x0000, lo: 0x0b}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb6}, + {value: 0x3008, lo: 0xb7, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbd}, + {value: 0x0018, lo: 0xbe, hi: 0xbf}, + // Block 0xb1, offset 0x54e + {value: 0x0000, lo: 0x07}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3308, lo: 0x82, hi: 0x82}, + {value: 0x0040, lo: 0x83, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xb2, offset 0x556 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xb2}, + {value: 0x3b08, lo: 0xb3, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xbf}, + // Block 0xb3, offset 0x55f + {value: 0x0000, lo: 0x0a}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x0018, lo: 0xb4, hi: 0xb5}, + {value: 0x0008, lo: 0xb6, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xb4, offset 0x56a + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x0008, lo: 0x83, hi: 0xb2}, + {value: 0x3008, lo: 0xb3, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xbe}, + {value: 0x3008, lo: 0xbf, hi: 0xbf}, + // Block 0xb5, offset 0x571 + {value: 0x0000, lo: 0x0e}, + {value: 0x3808, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x88}, + {value: 0x3308, lo: 0x89, hi: 0x8c}, + {value: 0x0018, lo: 0x8d, hi: 0x8d}, + {value: 0x3008, lo: 0x8e, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x0018, lo: 0xa1, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xb6, offset 0x580 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb1}, + {value: 0x3008, lo: 0xb2, hi: 0xb3}, + {value: 0x3308, lo: 0xb4, hi: 0xb4}, + {value: 0x3808, lo: 0xb5, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xb7}, + {value: 0x0018, lo: 0xb8, hi: 0xbd}, + {value: 0x3308, lo: 0xbe, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xb7, offset 0x58d + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0xbf}, + // Block 0xb8, offset 0x591 + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0x8d}, + {value: 0x0040, lo: 0x8e, hi: 0x8e}, + {value: 0x0008, lo: 0x8f, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xb9, offset 0x59e + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x3308, lo: 0x9f, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa2}, + {value: 0x3308, lo: 0xa3, hi: 0xa9}, + {value: 0x3b08, lo: 0xaa, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xba, offset 0x5a7 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbf}, + // Block 0xbb, offset 0x5ab + {value: 0x0000, lo: 0x0e}, + {value: 0x3008, lo: 0x80, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x84}, + {value: 0x3008, lo: 0x85, hi: 0x85}, + {value: 0x3308, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x8a}, + {value: 0x0018, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9c}, + {value: 0x0018, lo: 0x9d, hi: 0x9d}, + {value: 0x3308, lo: 0x9e, hi: 0x9e}, + {value: 0x0008, lo: 0x9f, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xbf}, + // Block 0xbc, offset 0x5ba + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xbd, offset 0x5c2 + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3008, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x85}, + {value: 0x0018, lo: 0x86, hi: 0x86}, + {value: 0x0008, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xbe, offset 0x5cd + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xbf, offset 0x5d6 + {value: 0x0000, lo: 0x05}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x9b}, + {value: 0x3308, lo: 0x9c, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0xbf}, + // Block 0xc0, offset 0x5dc + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xba}, + {value: 0x3008, lo: 0xbb, hi: 0xbc}, + {value: 0x3308, lo: 0xbd, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xc1, offset 0x5e4 + {value: 0x0000, lo: 0x08}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xbf}, + // Block 0xc2, offset 0x5ed + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x3308, lo: 0xab, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xac}, + {value: 0x3308, lo: 0xad, hi: 0xad}, + {value: 0x3008, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb5}, + {value: 0x3808, lo: 0xb6, hi: 0xb6}, + {value: 0x3308, lo: 0xb7, hi: 0xb7}, + {value: 0x0008, lo: 0xb8, hi: 0xb8}, + {value: 0x0018, lo: 0xb9, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0xc3, offset 0x5f9 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xc4, offset 0x5fc + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9f}, + {value: 0x3008, lo: 0xa0, hi: 0xa1}, + {value: 0x3308, lo: 0xa2, hi: 0xa5}, + {value: 0x3008, lo: 0xa6, hi: 0xa6}, + {value: 0x3308, lo: 0xa7, hi: 0xaa}, + {value: 0x3b08, lo: 0xab, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0018, lo: 0xba, hi: 0xbf}, + // Block 0xc5, offset 0x608 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0xbf}, + // Block 0xc6, offset 0x60b + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3008, lo: 0xac, hi: 0xae}, + {value: 0x3308, lo: 0xaf, hi: 0xb7}, + {value: 0x3008, lo: 0xb8, hi: 0xb8}, + {value: 0x3b08, lo: 0xb9, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xc7, offset 0x614 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x049d, lo: 0xa0, hi: 0xbf}, + // Block 0xc8, offset 0x617 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbe}, + {value: 0x0008, lo: 0xbf, hi: 0xbf}, + // Block 0xc9, offset 0x61c + {value: 0x0000, lo: 0x08}, + {value: 0x3008, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x81}, + {value: 0x3008, lo: 0x82, hi: 0x82}, + {value: 0x3308, lo: 0x83, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xca, offset 0x625 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xcb, offset 0x62a + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0x93}, + {value: 0x3308, lo: 0x94, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x99}, + {value: 0x3308, lo: 0x9a, hi: 0x9b}, + {value: 0x3008, lo: 0x9c, hi: 0x9f}, + {value: 0x3b08, lo: 0xa0, hi: 0xa0}, + {value: 0x0008, lo: 0xa1, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x3008, lo: 0xa4, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xbf}, + // Block 0xcc, offset 0x637 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x3308, lo: 0x81, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb3}, + {value: 0x3b08, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb8}, + {value: 0x3008, lo: 0xb9, hi: 0xb9}, + {value: 0x0008, lo: 0xba, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xcd, offset 0x642 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x86}, + {value: 0x3b08, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3308, lo: 0x91, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x98}, + {value: 0x3308, lo: 0x99, hi: 0x9b}, + {value: 0x0008, lo: 0x9c, hi: 0xbf}, + // Block 0xce, offset 0x64b + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3308, lo: 0x8a, hi: 0x96}, + {value: 0x3008, lo: 0x97, hi: 0x97}, + {value: 0x3308, lo: 0x98, hi: 0x98}, + {value: 0x3b08, lo: 0x99, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0x9c}, + {value: 0x0008, lo: 0x9d, hi: 0x9d}, + {value: 0x0018, lo: 0x9e, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xcf, offset 0x656 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd0, offset 0x659 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0xbf}, + // Block 0xd1, offset 0x65c + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x89}, + {value: 0x0008, lo: 0x8a, hi: 0xae}, + {value: 0x3008, lo: 0xaf, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb7}, + {value: 0x3308, lo: 0xb8, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbe}, + {value: 0x3b08, lo: 0xbf, hi: 0xbf}, + // Block 0xd2, offset 0x666 + {value: 0x0000, lo: 0x08}, + {value: 0x0008, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0018, lo: 0x9a, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xbf}, + // Block 0xd3, offset 0x66f + {value: 0x0000, lo: 0x0b}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x91}, + {value: 0x3308, lo: 0x92, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xa8}, + {value: 0x3008, lo: 0xa9, hi: 0xa9}, + {value: 0x3308, lo: 0xaa, hi: 0xb0}, + {value: 0x3008, lo: 0xb1, hi: 0xb1}, + {value: 0x3308, lo: 0xb2, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xbf}, + // Block 0xd4, offset 0x67b + {value: 0x0000, lo: 0x0c}, + {value: 0x0008, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x87}, + {value: 0x0008, lo: 0x88, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8a}, + {value: 0x0008, lo: 0x8b, hi: 0xb0}, + {value: 0x3308, lo: 0xb1, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xb9}, + {value: 0x3308, lo: 0xba, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbb}, + {value: 0x3308, lo: 0xbc, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x3308, lo: 0xbf, hi: 0xbf}, + // Block 0xd5, offset 0x688 + {value: 0x0000, lo: 0x0c}, + {value: 0x3308, lo: 0x80, hi: 0x83}, + {value: 0x3b08, lo: 0x84, hi: 0x85}, + {value: 0x0008, lo: 0x86, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xa6}, + {value: 0x0008, lo: 0xa7, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xa9}, + {value: 0x0008, lo: 0xaa, hi: 0xbf}, + // Block 0xd6, offset 0x695 + {value: 0x0000, lo: 0x0d}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x3008, lo: 0x8a, hi: 0x8e}, + {value: 0x0040, lo: 0x8f, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x92}, + {value: 0x3008, lo: 0x93, hi: 0x94}, + {value: 0x3308, lo: 0x95, hi: 0x95}, + {value: 0x3008, lo: 0x96, hi: 0x96}, + {value: 0x3b08, lo: 0x97, hi: 0x97}, + {value: 0x0008, lo: 0x98, hi: 0x98}, + {value: 0x0040, lo: 0x99, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xbf}, + // Block 0xd7, offset 0x6a3 + {value: 0x0000, lo: 0x06}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xb2}, + {value: 0x3308, lo: 0xb3, hi: 0xb4}, + {value: 0x3008, lo: 0xb5, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0xd8, offset 0x6aa + {value: 0x0000, lo: 0x0a}, + {value: 0x3308, lo: 0x80, hi: 0x81}, + {value: 0x0008, lo: 0x82, hi: 0x82}, + {value: 0x3008, lo: 0x83, hi: 0x83}, + {value: 0x0008, lo: 0x84, hi: 0x90}, + {value: 0x0040, lo: 0x91, hi: 0x91}, + {value: 0x0008, lo: 0x92, hi: 0xb3}, + {value: 0x3008, lo: 0xb4, hi: 0xb5}, + {value: 0x3308, lo: 0xb6, hi: 0xba}, + {value: 0x0040, lo: 0xbb, hi: 0xbd}, + {value: 0x3008, lo: 0xbe, hi: 0xbf}, + // Block 0xd9, offset 0x6b5 + {value: 0x0000, lo: 0x06}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x3808, lo: 0x81, hi: 0x81}, + {value: 0x3b08, lo: 0x82, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xda, offset 0x6bc + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0xdb, offset 0x6c0 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x6c4 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0xbf}, + // Block 0xdd, offset 0x6c7 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0xde, offset 0x6cc + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xdf, offset 0x6cf + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbf}, + // Block 0xe0, offset 0x6d2 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xe1, offset 0x6d6 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0340, lo: 0xb0, hi: 0xbf}, + // Block 0xe2, offset 0x6d9 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0x80}, + {value: 0x0008, lo: 0x81, hi: 0x86}, + {value: 0x3308, lo: 0x87, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0xe3, offset 0x6de + {value: 0x0000, lo: 0x06}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa9}, + {value: 0x0040, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xe4, offset 0x6e5 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xe5, offset 0x6e8 + {value: 0x0000, lo: 0x07}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb4}, + {value: 0x0018, lo: 0xb5, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xe6, offset 0x6f0 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xbf}, + // Block 0xe7, offset 0x6f4 + {value: 0x0000, lo: 0x0a}, + {value: 0x0008, lo: 0x80, hi: 0x83}, + {value: 0x0018, lo: 0x84, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9a}, + {value: 0x0018, lo: 0x9b, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbf}, + // Block 0xe8, offset 0x6ff + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0xe9, offset 0x702 + {value: 0x0000, lo: 0x02}, + {value: 0xe105, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0xea, offset 0x705 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x9a}, + {value: 0x0040, lo: 0x9b, hi: 0xbf}, + // Block 0xeb, offset 0x708 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x90}, + {value: 0x3008, lo: 0x91, hi: 0xbf}, + // Block 0xec, offset 0x70e + {value: 0x0000, lo: 0x05}, + {value: 0x3008, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x92}, + {value: 0x0008, lo: 0x93, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0xed, offset 0x714 + {value: 0x0000, lo: 0x08}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa1}, + {value: 0x0018, lo: 0xa2, hi: 0xa2}, + {value: 0x0008, lo: 0xa3, hi: 0xa3}, + {value: 0x3308, lo: 0xa4, hi: 0xa4}, + {value: 0x0040, lo: 0xa5, hi: 0xaf}, + {value: 0x3008, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0xee, offset 0x71d + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb7}, + {value: 0x0040, lo: 0xb8, hi: 0xbf}, + // Block 0xef, offset 0x720 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xbf}, + // Block 0xf0, offset 0x723 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0xbf}, + // Block 0xf1, offset 0x726 + {value: 0x0000, lo: 0x07}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xb4}, + {value: 0x0008, lo: 0xb5, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbc}, + {value: 0x0008, lo: 0xbd, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0xf2, offset 0x72e + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xa2}, + {value: 0x0040, lo: 0xa3, hi: 0xb1}, + {value: 0x0008, lo: 0xb2, hi: 0xb2}, + {value: 0x0040, lo: 0xb3, hi: 0xbf}, + // Block 0xf3, offset 0x733 + {value: 0x0000, lo: 0x08}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x94}, + {value: 0x0008, lo: 0x95, hi: 0x95}, + {value: 0x0040, lo: 0x96, hi: 0xa3}, + {value: 0x0008, lo: 0xa4, hi: 0xa7}, + {value: 0x0040, lo: 0xa8, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0xf4, offset 0x73c + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xbb}, + {value: 0x0040, lo: 0xbc, hi: 0xbf}, + // Block 0xf5, offset 0x73f + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0xf6, offset 0x744 + {value: 0x0000, lo: 0x09}, + {value: 0x0008, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0x9c}, + {value: 0x3308, lo: 0x9d, hi: 0x9e}, + {value: 0x0018, lo: 0x9f, hi: 0x9f}, + {value: 0x03c0, lo: 0xa0, hi: 0xa3}, + {value: 0x0040, lo: 0xa4, hi: 0xbf}, + // Block 0xf7, offset 0x74e + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xbf}, + // Block 0xf8, offset 0x752 + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0x86}, + {value: 0x0040, lo: 0x87, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0xf9, offset 0x756 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x0040, lo: 0x84, hi: 0xbf}, + // Block 0xfa, offset 0x759 + {value: 0x0000, lo: 0x02}, + {value: 0x0018, lo: 0x80, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0xfb, offset 0x75c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa8}, + {value: 0x0018, lo: 0xa9, hi: 0xbf}, + // Block 0xfc, offset 0x760 + {value: 0x0000, lo: 0x0e}, + {value: 0x0018, lo: 0x80, hi: 0x9d}, + {value: 0x2379, lo: 0x9e, hi: 0x9e}, + {value: 0x2381, lo: 0x9f, hi: 0x9f}, + {value: 0x2389, lo: 0xa0, hi: 0xa0}, + {value: 0x2391, lo: 0xa1, hi: 0xa1}, + {value: 0x2399, lo: 0xa2, hi: 0xa2}, + {value: 0x23a1, lo: 0xa3, hi: 0xa3}, + {value: 0x23a9, lo: 0xa4, hi: 0xa4}, + {value: 0x3018, lo: 0xa5, hi: 0xa6}, + {value: 0x3318, lo: 0xa7, hi: 0xa9}, + {value: 0x0018, lo: 0xaa, hi: 0xac}, + {value: 0x3018, lo: 0xad, hi: 0xb2}, + {value: 0x0340, lo: 0xb3, hi: 0xba}, + {value: 0x3318, lo: 0xbb, hi: 0xbf}, + // Block 0xfd, offset 0x76f + {value: 0x0000, lo: 0x0b}, + {value: 0x3318, lo: 0x80, hi: 0x82}, + {value: 0x0018, lo: 0x83, hi: 0x84}, + {value: 0x3318, lo: 0x85, hi: 0x8b}, + {value: 0x0018, lo: 0x8c, hi: 0xa9}, + {value: 0x3318, lo: 0xaa, hi: 0xad}, + {value: 0x0018, lo: 0xae, hi: 0xba}, + {value: 0x23b1, lo: 0xbb, hi: 0xbb}, + {value: 0x23b9, lo: 0xbc, hi: 0xbc}, + {value: 0x23c1, lo: 0xbd, hi: 0xbd}, + {value: 0x23c9, lo: 0xbe, hi: 0xbe}, + {value: 0x23d1, lo: 0xbf, hi: 0xbf}, + // Block 0xfe, offset 0x77b + {value: 0x0000, lo: 0x03}, + {value: 0x23d9, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0xff, offset 0x77f + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x81}, + {value: 0x3318, lo: 0x82, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0xbf}, + // Block 0x100, offset 0x784 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb3}, + {value: 0x0040, lo: 0xb4, hi: 0xbf}, + // Block 0x101, offset 0x789 + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x102, offset 0x78e + {value: 0x0000, lo: 0x03}, + {value: 0x3308, lo: 0x80, hi: 0xb6}, + {value: 0x0018, lo: 0xb7, hi: 0xba}, + {value: 0x3308, lo: 0xbb, hi: 0xbf}, + // Block 0x103, offset 0x792 + {value: 0x0000, lo: 0x04}, + {value: 0x3308, lo: 0x80, hi: 0xac}, + {value: 0x0018, lo: 0xad, hi: 0xb4}, + {value: 0x3308, lo: 0xb5, hi: 0xb5}, + {value: 0x0018, lo: 0xb6, hi: 0xbf}, + // Block 0x104, offset 0x797 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x84}, + {value: 0x0018, lo: 0x85, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x9a}, + {value: 0x3308, lo: 0x9b, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xa0}, + {value: 0x3308, lo: 0xa1, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x105, offset 0x7a0 + {value: 0x0000, lo: 0x04}, + {value: 0x0008, lo: 0x80, hi: 0x9e}, + {value: 0x0040, lo: 0x9f, hi: 0xa4}, + {value: 0x0008, lo: 0xa5, hi: 0xaa}, + {value: 0x0040, lo: 0xab, hi: 0xbf}, + // Block 0x106, offset 0x7a5 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x8e}, + {value: 0x3308, lo: 0x8f, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0x107, offset 0x7a9 + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x3308, lo: 0xb0, hi: 0xb6}, + {value: 0x0008, lo: 0xb7, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x108, offset 0x7af + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0x89}, + {value: 0x0040, lo: 0x8a, hi: 0x8d}, + {value: 0x0008, lo: 0x8e, hi: 0x8e}, + {value: 0x0018, lo: 0x8f, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0xbf}, + // Block 0x109, offset 0x7b5 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xad}, + {value: 0x3308, lo: 0xae, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xbf}, + // Block 0x10a, offset 0x7ba + {value: 0x0000, lo: 0x05}, + {value: 0x0008, lo: 0x80, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x10b, offset 0x7c0 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xab}, + {value: 0x3308, lo: 0xac, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x10c, offset 0x7c6 + {value: 0x0000, lo: 0x09}, + {value: 0x0040, lo: 0x80, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xa6}, + {value: 0x0040, lo: 0xa7, hi: 0xa7}, + {value: 0x0008, lo: 0xa8, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xac}, + {value: 0x0008, lo: 0xad, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbe}, + {value: 0x0040, lo: 0xbf, hi: 0xbf}, + // Block 0x10d, offset 0x7d0 + {value: 0x0000, lo: 0x05}, + {value: 0x0808, lo: 0x80, hi: 0x84}, + {value: 0x0040, lo: 0x85, hi: 0x86}, + {value: 0x0818, lo: 0x87, hi: 0x8f}, + {value: 0x3308, lo: 0x90, hi: 0x96}, + {value: 0x0040, lo: 0x97, hi: 0xbf}, + // Block 0x10e, offset 0x7d6 + {value: 0x0000, lo: 0x08}, + {value: 0x0a08, lo: 0x80, hi: 0x83}, + {value: 0x3308, lo: 0x84, hi: 0x8a}, + {value: 0x0b08, lo: 0x8b, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0808, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9d}, + {value: 0x0818, lo: 0x9e, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x10f, offset 0x7df + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xb0}, + {value: 0x0818, lo: 0xb1, hi: 0xbf}, + // Block 0x110, offset 0x7e2 + {value: 0x0000, lo: 0x02}, + {value: 0x0818, lo: 0x80, hi: 0xb4}, + {value: 0x0040, lo: 0xb5, hi: 0xbf}, + // Block 0x111, offset 0x7e5 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0818, lo: 0x81, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbf}, + // Block 0x112, offset 0x7e9 + {value: 0x0000, lo: 0x03}, + {value: 0x0040, lo: 0x80, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0x113, offset 0x7ed + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbf}, + // Block 0x114, offset 0x7f1 + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xae}, + {value: 0x0040, lo: 0xaf, hi: 0xb0}, + {value: 0x0018, lo: 0xb1, hi: 0xbf}, + // Block 0x115, offset 0x7f7 + {value: 0x0000, lo: 0x05}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0018, lo: 0x81, hi: 0x8f}, + {value: 0x0040, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xb5}, + {value: 0x0040, lo: 0xb6, hi: 0xbf}, + // Block 0x116, offset 0x7fd + {value: 0x0000, lo: 0x04}, + {value: 0x0018, lo: 0x80, hi: 0x8f}, + {value: 0x2709, lo: 0x90, hi: 0x90}, + {value: 0x0018, lo: 0x91, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xbf}, + // Block 0x117, offset 0x802 + {value: 0x0000, lo: 0x02}, + {value: 0x0040, lo: 0x80, hi: 0xa5}, + {value: 0x0018, lo: 0xa6, hi: 0xbf}, + // Block 0x118, offset 0x805 + {value: 0x0000, lo: 0x0f}, + {value: 0x2889, lo: 0x80, hi: 0x80}, + {value: 0x2891, lo: 0x81, hi: 0x81}, + {value: 0x2899, lo: 0x82, hi: 0x82}, + {value: 0x28a1, lo: 0x83, hi: 0x83}, + {value: 0x28a9, lo: 0x84, hi: 0x84}, + {value: 0x28b1, lo: 0x85, hi: 0x85}, + {value: 0x28b9, lo: 0x86, hi: 0x86}, + {value: 0x28c1, lo: 0x87, hi: 0x87}, + {value: 0x28c9, lo: 0x88, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x28d1, lo: 0x90, hi: 0x90}, + {value: 0x28d9, lo: 0x91, hi: 0x91}, + {value: 0x0040, lo: 0x92, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa5}, + {value: 0x0040, lo: 0xa6, hi: 0xbf}, + // Block 0x119, offset 0x815 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x97}, + {value: 0x0040, lo: 0x98, hi: 0x9b}, + {value: 0x0018, lo: 0x9c, hi: 0xac}, + {value: 0x0040, lo: 0xad, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x11a, offset 0x81c + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0xb6}, + {value: 0x0040, lo: 0xb7, hi: 0xba}, + {value: 0x0018, lo: 0xbb, hi: 0xbf}, + // Block 0x11b, offset 0x820 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xab}, + {value: 0x0040, lo: 0xac, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb0}, + {value: 0x0040, lo: 0xb1, hi: 0xbf}, + // Block 0x11c, offset 0x827 + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x8b}, + {value: 0x0040, lo: 0x8c, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbf}, + // Block 0x11d, offset 0x82b + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0x99}, + {value: 0x0040, lo: 0x9a, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xbf}, + // Block 0x11e, offset 0x831 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x87}, + {value: 0x0040, lo: 0x88, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb1}, + {value: 0x0040, lo: 0xb2, hi: 0xbf}, + // Block 0x11f, offset 0x838 + {value: 0x0000, lo: 0x06}, + {value: 0x0018, lo: 0x80, hi: 0x93}, + {value: 0x0040, lo: 0x94, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xad}, + {value: 0x0040, lo: 0xae, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xbc}, + {value: 0x0040, lo: 0xbd, hi: 0xbf}, + // Block 0x120, offset 0x83f + {value: 0x0000, lo: 0x05}, + {value: 0x0018, lo: 0x80, hi: 0x88}, + {value: 0x0040, lo: 0x89, hi: 0x8f}, + {value: 0x0018, lo: 0x90, hi: 0xbd}, + {value: 0x0040, lo: 0xbe, hi: 0xbe}, + {value: 0x0018, lo: 0xbf, hi: 0xbf}, + // Block 0x121, offset 0x845 + {value: 0x0000, lo: 0x08}, + {value: 0x0018, lo: 0x80, hi: 0x85}, + {value: 0x0040, lo: 0x86, hi: 0x8d}, + {value: 0x0018, lo: 0x8e, hi: 0x9b}, + {value: 0x0040, lo: 0x9c, hi: 0x9f}, + {value: 0x0018, lo: 0xa0, hi: 0xa8}, + {value: 0x0040, lo: 0xa9, hi: 0xaf}, + {value: 0x0018, lo: 0xb0, hi: 0xb8}, + {value: 0x0040, lo: 0xb9, hi: 0xbf}, + // Block 0x122, offset 0x84e + {value: 0x0000, lo: 0x03}, + {value: 0x0018, lo: 0x80, hi: 0x92}, + {value: 0x0040, lo: 0x93, hi: 0x93}, + {value: 0x0018, lo: 0x94, hi: 0xbf}, + // Block 0x123, offset 0x852 + {value: 0x0000, lo: 0x0d}, + {value: 0x0018, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0xaf}, + {value: 0x06e1, lo: 0xb0, hi: 0xb0}, + {value: 0x0049, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb2, hi: 0xb2}, + {value: 0x0031, lo: 0xb3, hi: 0xb3}, + {value: 0x06e9, lo: 0xb4, hi: 0xb4}, + {value: 0x06f1, lo: 0xb5, hi: 0xb5}, + {value: 0x06f9, lo: 0xb6, hi: 0xb6}, + {value: 0x0701, lo: 0xb7, hi: 0xb7}, + {value: 0x0709, lo: 0xb8, hi: 0xb8}, + {value: 0x0711, lo: 0xb9, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x124, offset 0x860 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0x9f}, + {value: 0x0040, lo: 0xa0, hi: 0xbf}, + // Block 0x125, offset 0x863 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xb9}, + {value: 0x0040, lo: 0xba, hi: 0xbf}, + // Block 0x126, offset 0x866 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x9d}, + {value: 0x0040, lo: 0x9e, hi: 0x9f}, + {value: 0x0008, lo: 0xa0, hi: 0xbf}, + // Block 0x127, offset 0x86a + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0xa1}, + {value: 0x0040, lo: 0xa2, hi: 0xaf}, + {value: 0x0008, lo: 0xb0, hi: 0xbf}, + // Block 0x128, offset 0x86e + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xa0}, + {value: 0x0040, lo: 0xa1, hi: 0xbf}, + // Block 0x129, offset 0x871 + {value: 0x0000, lo: 0x03}, + {value: 0x0008, lo: 0x80, hi: 0x8a}, + {value: 0x0040, lo: 0x8b, hi: 0x8f}, + {value: 0x0008, lo: 0x90, hi: 0xbf}, + // Block 0x12a, offset 0x875 + {value: 0x0000, lo: 0x02}, + {value: 0x0008, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, + // Block 0x12b, offset 0x878 + {value: 0x0000, lo: 0x04}, + {value: 0x0040, lo: 0x80, hi: 0x80}, + {value: 0x0340, lo: 0x81, hi: 0x81}, + {value: 0x0040, lo: 0x82, hi: 0x9f}, + {value: 0x0340, lo: 0xa0, hi: 0xbf}, + // Block 0x12c, offset 0x87d + {value: 0x0000, lo: 0x01}, + {value: 0x0340, lo: 0x80, hi: 0xbf}, + // Block 0x12d, offset 0x87f + {value: 0x0000, lo: 0x01}, + {value: 0x33c0, lo: 0x80, hi: 0xbf}, + // Block 0x12e, offset 0x881 + {value: 0x0000, lo: 0x02}, + {value: 0x33c0, lo: 0x80, hi: 0xaf}, + {value: 0x0040, lo: 0xb0, hi: 0xbf}, +} + +// Total table size 46723 bytes (45KiB); checksum: 4CF3143A diff --git a/vendor/golang.org/x/net/idna/trie.go b/vendor/golang.org/x/net/idna/trie.go index c4ef847e7..421274172 100644 --- a/vendor/golang.org/x/net/idna/trie.go +++ b/vendor/golang.org/x/net/idna/trie.go @@ -6,27 +6,6 @@ package idna -// appendMapping appends the mapping for the respective rune. isMapped must be -// true. A mapping is a categorization of a rune as defined in UTS #46. -func (c info) appendMapping(b []byte, s string) []byte { - index := int(c >> indexShift) - if c&xorBit == 0 { - s := mappings[index:] - return append(b, s[1:s[0]+1]...) - } - b = append(b, s...) - if c&inlineXOR == inlineXOR { - // TODO: support and handle two-byte inline masks - b[len(b)-1] ^= byte(index) - } else { - for p := len(b) - int(xorData[index]); p < len(b); p++ { - index++ - b[p] ^= xorData[index] - } - } - return b -} - // Sparse block handling code. type valueRange struct { diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go new file mode 100644 index 000000000..bb63f904b --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie12.0.0.go @@ -0,0 +1,31 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.16 +// +build !go1.16 + +package idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + s := mappings[index:] + return append(b, s[1:s[0]+1]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go new file mode 100644 index 000000000..7d68a8dc1 --- /dev/null +++ b/vendor/golang.org/x/net/idna/trie13.0.0.go @@ -0,0 +1,31 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.16 +// +build go1.16 + +package idna + +// appendMapping appends the mapping for the respective rune. isMapped must be +// true. A mapping is a categorization of a rune as defined in UTS #46. +func (c info) appendMapping(b []byte, s string) []byte { + index := int(c >> indexShift) + if c&xorBit == 0 { + p := index + return append(b, mappings[mappingIndex[p]:mappingIndex[p+1]]...) + } + b = append(b, s...) + if c&inlineXOR == inlineXOR { + // TODO: support and handle two-byte inline masks + b[len(b)-1] ^= byte(index) + } else { + for p := len(b) - int(xorData[index]); p < len(b); p++ { + index++ + b[p] ^= xorData[index] + } + } + return b +} diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go index 83f112c4c..4756ad5f7 100644 --- a/vendor/golang.org/x/sys/cpu/cpu.go +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -38,7 +38,7 @@ var X86 struct { HasAVX512F bool // Advanced vector extension 512 Foundation Instructions HasAVX512CD bool // Advanced vector extension 512 Conflict Detection Instructions HasAVX512ER bool // Advanced vector extension 512 Exponential and Reciprocal Instructions - HasAVX512PF bool // Advanced vector extension 512 Prefetch Instructions Instructions + HasAVX512PF bool // Advanced vector extension 512 Prefetch Instructions HasAVX512VL bool // Advanced vector extension 512 Vector Length Extensions HasAVX512BW bool // Advanced vector extension 512 Byte and Word Instructions HasAVX512DQ bool // Advanced vector extension 512 Doubleword and Quadword Instructions @@ -54,6 +54,9 @@ var X86 struct { HasAVX512VBMI2 bool // Advanced vector extension 512 Vector Byte Manipulation Instructions 2 HasAVX512BITALG bool // Advanced vector extension 512 Bit Algorithms HasAVX512BF16 bool // Advanced vector extension 512 BFloat16 Instructions + HasAMXTile bool // Advanced Matrix Extension Tile instructions + HasAMXInt8 bool // Advanced Matrix Extension Int8 instructions + HasAMXBF16 bool // Advanced Matrix Extension BFloat16 instructions HasBMI1 bool // Bit manipulation instruction set 1 HasBMI2 bool // Bit manipulation instruction set 2 HasCX16 bool // Compare and exchange 16 Bytes diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go index bd6c128af..ff7da60eb 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -7,6 +7,6 @@ package cpu -const cacheLineSize = 32 +const cacheLineSize = 64 func initOptions() {} diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go index f5aacfc82..2dcde8285 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -37,6 +37,9 @@ func initOptions() { {Name: "avx512vbmi2", Feature: &X86.HasAVX512VBMI2}, {Name: "avx512bitalg", Feature: &X86.HasAVX512BITALG}, {Name: "avx512bf16", Feature: &X86.HasAVX512BF16}, + {Name: "amxtile", Feature: &X86.HasAMXTile}, + {Name: "amxint8", Feature: &X86.HasAMXInt8}, + {Name: "amxbf16", Feature: &X86.HasAMXBF16}, {Name: "bmi1", Feature: &X86.HasBMI1}, {Name: "bmi2", Feature: &X86.HasBMI2}, {Name: "cx16", Feature: &X86.HasCX16}, @@ -138,6 +141,10 @@ func archInit() { eax71, _, _, _ := cpuid(7, 1) X86.HasAVX512BF16 = isSet(5, eax71) } + + X86.HasAMXTile = isSet(24, edx7) + X86.HasAMXInt8 = isSet(25, edx7) + X86.HasAMXBF16 = isSet(22, edx7) } func isSet(bitpos uint, value uint32) bool { diff --git a/vendor/golang.org/x/sys/cpu/hwcap_linux.go b/vendor/golang.org/x/sys/cpu/hwcap_linux.go index 1d9d91f3e..34e49f955 100644 --- a/vendor/golang.org/x/sys/cpu/hwcap_linux.go +++ b/vendor/golang.org/x/sys/cpu/hwcap_linux.go @@ -5,7 +5,7 @@ package cpu import ( - "io/ioutil" + "os" ) const ( @@ -39,7 +39,7 @@ func readHWCAP() error { return nil } - buf, err := ioutil.ReadFile(procAuxv) + buf, err := os.ReadFile(procAuxv) if err != nil { // e.g. on android /proc/self/auxv is not accessible, so silently // ignore the error and leave Initialized = false. On some diff --git a/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go b/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go deleted file mode 100644 index e07899b90..000000000 --- a/vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package unsafeheader contains header declarations for the Go runtime's -// slice and string implementations. -// -// This package allows x/sys to use types equivalent to -// reflect.SliceHeader and reflect.StringHeader without introducing -// a dependency on the (relatively heavy) "reflect" package. -package unsafeheader - -import ( - "unsafe" -) - -// Slice is the runtime representation of a slice. -// It cannot be used safely or portably and its representation may change in a later release. -type Slice struct { - Data unsafe.Pointer - Len int - Cap int -} - -// String is the runtime representation of a string. -// It cannot be used safely or portably and its representation may change in a later release. -type String struct { - Data unsafe.Pointer - Len int -} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 315646271..47fa6a7eb 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -519,7 +519,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || $2 ~ /^RAW_PAYLOAD_/ || @@ -583,6 +583,7 @@ ccflags="$@" $2 ~ /^PERF_/ || $2 ~ /^SECCOMP_MODE_/ || $2 ~ /^SEEK_/ || + $2 ~ /^SCHED_/ || $2 ~ /^SPLICE_/ || $2 ~ /^SYNC_FILE_RANGE_/ || $2 !~ /IOC_MAGIC/ && @@ -624,7 +625,7 @@ ccflags="$@" $2 ~ /^MEM/ || $2 ~ /^WG/ || $2 ~ /^FIB_RULE_/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE|IOMIN$|IOOPT$|ALIGNOFF$|DISCARD|ROTATIONAL$|ZEROOUT$|GETDISKSEQ$)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/vendor/golang.org/x/sys/unix/mmap_nomremap.go new file mode 100644 index 000000000..ca0513632 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mmap_nomremap.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin || dragonfly || freebsd || openbsd || solaris +// +build aix darwin dragonfly freebsd openbsd solaris + +package unix + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 000000000..fa93d0aa9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,53 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux || netbsd +// +build linux netbsd + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, +} + +func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&mremapFixed != 0 { + return nil, EINVAL + } + + pOld := &oldData[cap(oldData)-1] + m.Lock() + defer m.Unlock() + bOld := m.active[pOld] + if bOld == nil || &bOld[0] != &oldData[0] { + return nil, EINVAL + } + newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0) + if errno != nil { + return nil, errno + } + bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength) + pNew := &bNew[cap(bNew)-1] + if flags&mremapDontunmap == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} + +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} diff --git a/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/vendor/golang.org/x/sys/unix/ptrace_darwin.go index 39dba6ca6..463c3eff7 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_darwin.go +++ b/vendor/golang.org/x/sys/unix/ptrace_darwin.go @@ -7,12 +7,6 @@ package unix -import "unsafe" - func ptrace(request int, pid int, addr uintptr, data uintptr) error { return ptrace1(request, pid, addr, data) } - -func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) error { - return ptrace1Ptr(request, pid, addr, data) -} diff --git a/vendor/golang.org/x/sys/unix/ptrace_ios.go b/vendor/golang.org/x/sys/unix/ptrace_ios.go index 9ea66330a..ed0509a01 100644 --- a/vendor/golang.org/x/sys/unix/ptrace_ios.go +++ b/vendor/golang.org/x/sys/unix/ptrace_ios.go @@ -7,12 +7,6 @@ package unix -import "unsafe" - func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { return ENOTSUP } - -func ptracePtr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - return ENOTSUP -} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index c406ae00f..e94e6cdac 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -487,8 +487,6 @@ func Fsync(fd int) error { //sys Unlinkat(dirfd int, path string, flags int) (err error) //sys Ustat(dev int, ubuf *Ustat_t) (err error) //sys write(fd int, p []byte) (n int, err error) -//sys readlen(fd int, p *byte, np int) (n int, err error) = read -//sys writelen(fd int, p *byte, np int) (n int, err error) = write //sys Dup2(oldfd int, newfd int) (err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 @@ -535,21 +533,6 @@ func Fsync(fd int) error { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 7705c3270..4217de518 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -601,20 +601,6 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { // Gethostuuid(uuid *byte, timeout *Timespec) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, behav int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 206921504..59542a897 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -510,30 +510,36 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { return nil, err } - // Find size. - n := uintptr(0) - if err := sysctl(mib, nil, &n, nil, 0); err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + for { + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // Read into buffer of that size. - buf := make([]KinfoProc, n/SizeofKinfoProc) - if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { - return nil, err - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + // Read into buffer of that size. + buf := make([]KinfoProc, n/SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { + if err == ENOMEM { + // Process table grew. Try again. + continue + } + return nil, err + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // The actual call may return less than the original reported required - // size so ensure we deal with that. - return buf[:n/SizeofKinfoProc], nil + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n/SizeofKinfoProc], nil + } } //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) @@ -638,189 +644,3 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE - -/* - * Unimplemented - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Ioctl -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// sendfile -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Poll_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 9fa879806..b37310ce9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -47,6 +47,5 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace -//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index f17b8c526..d51ec9963 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -47,6 +47,5 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT //sys Lstat(path string, stat *Stat_t) (err error) //sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace -//sys ptrace1Ptr(request int, pid int, addr unsafe.Pointer, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index d4ce988e7..97cb916f2 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -343,203 +343,5 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - * TODO(jsing): Update this list for DragonFly. - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Mount -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Setattrlist -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Getxattr -// Fgetxattr -// Setxattr -// Fsetxattr -// Removexattr -// Fremovexattr -// Listxattr -// Flistxattr -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shmat -// Shmctl -// Shmdt -// Shmget -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index afb10106f..64d1bb4db 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -449,197 +449,5 @@ func Dup3(oldfd, newfd, flags int) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - */ -// Profil -// Sigaction -// Sigprocmask -// Getlogin -// Sigpending -// Sigaltstack -// Ioctl -// Reboot -// Execve -// Vfork -// Sbrk -// Sstk -// Ovadvise -// Mincore -// Setitimer -// Swapon -// Select -// Sigsuspend -// Readv -// Writev -// Nfssvc -// Getfh -// Quotactl -// Mount -// Csops -// Waitid -// Add_profil -// Kdebug_trace -// Sigreturn -// Atsocket -// Kqueue_from_portset_np -// Kqueue_portset -// Getattrlist -// Setattrlist -// Getdents -// Getdirentriesattr -// Searchfs -// Delete -// Copyfile -// Watchevent -// Waitevent -// Modwatch -// Fsctl -// Initgroups -// Posix_spawn -// Nfsclnt -// Fhopen -// Minherit -// Semsys -// Msgsys -// Shmsys -// Semctl -// Semget -// Semop -// Msgctl -// Msgget -// Msgsnd -// Msgrcv -// Shmat -// Shmctl -// Shmdt -// Shmget -// Shm_open -// Shm_unlink -// Sem_open -// Sem_close -// Sem_unlink -// Sem_wait -// Sem_trywait -// Sem_post -// Sem_getvalue -// Sem_init -// Sem_destroy -// Open_extended -// Umask_extended -// Stat_extended -// Lstat_extended -// Fstat_extended -// Chmod_extended -// Fchmod_extended -// Access_extended -// Settid -// Gettid -// Setsgroups -// Getsgroups -// Setwgroups -// Getwgroups -// Mkfifo_extended -// Mkdir_extended -// Identitysvc -// Shared_region_check_np -// Shared_region_map_np -// __pthread_mutex_destroy -// __pthread_mutex_init -// __pthread_mutex_lock -// __pthread_mutex_trylock -// __pthread_mutex_unlock -// __pthread_cond_init -// __pthread_cond_destroy -// __pthread_cond_broadcast -// __pthread_cond_signal -// Setsid_with_pid -// __pthread_cond_timedwait -// Aio_fsync -// Aio_return -// Aio_suspend -// Aio_cancel -// Aio_error -// Aio_read -// Aio_write -// Lio_listio -// __pthread_cond_wait -// Iopolicysys -// __pthread_kill -// __pthread_sigmask -// __sigwait -// __disable_threadsignal -// __pthread_markcancel -// __pthread_canceled -// __semwait_signal -// Proc_info -// Stat64_extended -// Lstat64_extended -// Fstat64_extended -// __pthread_chdir -// __pthread_fchdir -// Audit -// Auditon -// Getauid -// Setauid -// Getaudit -// Setaudit -// Getaudit_addr -// Setaudit_addr -// Auditctl -// Bsdthread_create -// Bsdthread_terminate -// Stack_snapshot -// Bsdthread_register -// Workq_open -// Workq_ops -// __mac_execve -// __mac_syscall -// __mac_get_file -// __mac_set_file -// __mac_get_link -// __mac_set_link -// __mac_get_proc -// __mac_set_proc -// __mac_get_fd -// __mac_set_fd -// __mac_get_pid -// __mac_get_lcid -// __mac_get_lctx -// __mac_set_lctx -// Setlcid -// Read_nocancel -// Write_nocancel -// Open_nocancel -// Close_nocancel -// Wait4_nocancel -// Recvmsg_nocancel -// Sendmsg_nocancel -// Recvfrom_nocancel -// Accept_nocancel -// Fcntl_nocancel -// Select_nocancel -// Fsync_nocancel -// Connect_nocancel -// Sigsuspend_nocancel -// Readv_nocancel -// Writev_nocancel -// Sendto_nocancel -// Pread_nocancel -// Pwrite_nocancel -// Waitid_nocancel -// Poll_nocancel -// Msgsnd_nocancel -// Msgrcv_nocancel -// Sem_wait_nocancel -// Aio_suspend_nocancel -// __sigwait_nocancel -// __semwait_signal_nocancel -// __mac_mount -// __mac_get_mount -// __mac_getfsstat diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 6de486bef..fb4e50224 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -693,10 +693,10 @@ type SockaddrALG struct { func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { // Leave room for NUL byte terminator. - if len(sa.Type) > 13 { + if len(sa.Type) > len(sa.raw.Type)-1 { return nil, 0, EINVAL } - if len(sa.Name) > 63 { + if len(sa.Name) > len(sa.raw.Name)-1 { return nil, 0, EINVAL } @@ -704,17 +704,8 @@ func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Feat = sa.Feature sa.raw.Mask = sa.Mask - typ, err := ByteSliceFromString(sa.Type) - if err != nil { - return nil, 0, err - } - name, err := ByteSliceFromString(sa.Name) - if err != nil { - return nil, 0, err - } - - copy(sa.raw.Type[:], typ) - copy(sa.raw.Name[:], name) + copy(sa.raw.Type[:], sa.Type) + copy(sa.raw.Name[:], sa.Name) return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil } @@ -1885,7 +1876,7 @@ func Getpgrp() (pid int) { //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) -//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) @@ -1988,8 +1979,6 @@ func Signalfd(fd int, sigmask *Sigset_t, flags int) (newfd int, err error) { //sys Unshare(flags int) (err error) //sys write(fd int, p []byte) (n int, err error) //sys exitThread(code int) (err error) = SYS_EXIT -//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ -//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE //sys readv(fd int, iovs []Iovec) (n int, err error) = SYS_READV //sys writev(fd int, iovs []Iovec) (n int, err error) = SYS_WRITEV //sys preadv(fd int, iovs []Iovec, offs_l uintptr, offs_h uintptr) (n int, err error) = SYS_PREADV @@ -2124,21 +2113,7 @@ func writevRacedetect(iovecs []Iovec, n int) { // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - +//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) @@ -2147,6 +2122,12 @@ func Munmap(b []byte) (err error) { //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) +const ( + mremapFixed = MREMAP_FIXED + mremapDontunmap = MREMAP_DONTUNMAP + mremapMaymove = MREMAP_MAYMOVE +) + // Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, // using the specified flags. func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { @@ -2446,99 +2427,58 @@ func Getresgid() (rgid, egid, sgid int) { return int(r), int(e), int(s) } -/* - * Unimplemented - */ -// AfsSyscall -// ArchPrctl -// Brk -// ClockNanosleep -// ClockSettime -// Clone -// EpollCtlOld -// EpollPwait -// EpollWaitOld -// Execve -// Fork -// Futex -// GetKernelSyms -// GetMempolicy -// GetRobustList -// GetThreadArea -// Getpmsg -// IoCancel -// IoDestroy -// IoGetevents -// IoSetup -// IoSubmit -// IoprioGet -// IoprioSet -// KexecLoad -// LookupDcookie -// Mbind -// MigratePages -// Mincore -// ModifyLdt -// Mount -// MovePages -// MqGetsetattr -// MqNotify -// MqOpen -// MqTimedreceive -// MqTimedsend -// MqUnlink -// Mremap -// Msgctl -// Msgget -// Msgrcv -// Msgsnd -// Nfsservctl -// Personality -// Pselect6 -// Ptrace -// Putpmsg -// Quotactl -// Readahead -// Readv -// RemapFilePages -// RestartSyscall -// RtSigaction -// RtSigpending -// RtSigqueueinfo -// RtSigreturn -// RtSigsuspend -// RtSigtimedwait -// SchedGetPriorityMax -// SchedGetPriorityMin -// SchedGetparam -// SchedGetscheduler -// SchedRrGetInterval -// SchedSetparam -// SchedYield -// Security -// Semctl -// Semget -// Semop -// Semtimedop -// SetMempolicy -// SetRobustList -// SetThreadArea -// SetTidAddress -// Sigaltstack -// Swapoff -// Swapon -// Sysfs -// TimerCreate -// TimerDelete -// TimerGetoverrun -// TimerGettime -// TimerSettime -// Tkill (obsolete) -// Tuxcall -// Umount2 -// Uselib -// Utimensat -// Vfork -// Vhangup -// Vserver -// _Sysctl +// Pselect is a wrapper around the Linux pselect6 system call. +// This version does not modify the timeout argument. +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + // Per https://man7.org/linux/man-pages/man2/select.2.html#NOTES, + // The Linux pselect6() system call modifies its timeout argument. + // [Not modifying the argument] is the behavior required by POSIX.1-2001. + var mutableTimeout *Timespec + if timeout != nil { + mutableTimeout = new(Timespec) + *mutableTimeout = *timeout + } + + // The final argument of the pselect6() system call is not a + // sigset_t * pointer, but is instead a structure + var kernelMask *sigset_argpack + if sigmask != nil { + wordBits := 32 << (^uintptr(0) >> 63) // see math.intSize + + // A sigset stores one bit per signal, + // offset by 1 (because signal 0 does not exist). + // So the number of words needed is ⌈__C_NSIG - 1 / wordBits⌉. + sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + + sigsetBytes := uintptr(sigsetWords * (wordBits / 8)) + kernelMask = &sigset_argpack{ + ss: sigmask, + ssLen: sigsetBytes, + } + } + + return pselect6(nfd, r, w, e, mutableTimeout, kernelMask) +} + +//sys schedSetattr(pid int, attr *SchedAttr, flags uint) (err error) +//sys schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) + +// SchedSetAttr is a wrapper for sched_setattr(2) syscall. +// https://man7.org/linux/man-pages/man2/sched_setattr.2.html +func SchedSetAttr(pid int, attr *SchedAttr, flags uint) error { + if attr == nil { + return EINVAL + } + attr.Size = SizeofSchedAttr + return schedSetattr(pid, attr, flags) +} + +// SchedGetAttr is a wrapper for sched_getattr(2) syscall. +// https://man7.org/linux/man-pages/man2/sched_getattr.2.html +func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { + attr := &SchedAttr{} + if err := schedGetattr(pid, attr, SizeofSchedAttr, flags); err != nil { + return nil, err + } + return attr, nil +} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 5b21fcfd7..70601ce36 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -40,7 +40,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index a81f5742b..f5266689a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -33,7 +33,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 69d2d7c3d..f6ab02ec1 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -28,7 +28,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 76d564095..93fe59d25 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -31,7 +31,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 35851ef70..5e6ceee12 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -32,7 +32,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) @@ -177,3 +177,14 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +//sys riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) + +func RISCVHWProbe(pairs []RISCVHWProbePairs, set *CPUSet, flags uint) (err error) { + var setSize uintptr + + if set != nil { + setSize = uintptr(unsafe.Sizeof(*set)) + } + return riscvHWProbe(pairs, setSize, set, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 018d7d478..88162099a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -356,266 +356,16 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) -/* - * Unimplemented - */ -// ____semctl13 -// __clone -// __fhopen40 -// __fhstat40 -// __fhstatvfs140 -// __fstat30 -// __getcwd -// __getfh30 -// __getlogin -// __lstat30 -// __mount50 -// __msgctl13 -// __msync13 -// __ntp_gettime30 -// __posix_chown -// __posix_fchown -// __posix_lchown -// __posix_rename -// __setlogin -// __shmctl13 -// __sigaction_sigtramp -// __sigaltstack14 -// __sigpending14 -// __sigprocmask14 -// __sigsuspend14 -// __sigtimedwait -// __stat30 -// __syscall -// __vfork14 -// _ksem_close -// _ksem_destroy -// _ksem_getvalue -// _ksem_init -// _ksem_open -// _ksem_post -// _ksem_trywait -// _ksem_unlink -// _ksem_wait -// _lwp_continue -// _lwp_create -// _lwp_ctl -// _lwp_detach -// _lwp_exit -// _lwp_getname -// _lwp_getprivate -// _lwp_kill -// _lwp_park -// _lwp_self -// _lwp_setname -// _lwp_setprivate -// _lwp_suspend -// _lwp_unpark -// _lwp_unpark_all -// _lwp_wait -// _lwp_wakeup -// _pset_bind -// _sched_getaffinity -// _sched_getparam -// _sched_setaffinity -// _sched_setparam -// acct -// aio_cancel -// aio_error -// aio_fsync -// aio_read -// aio_return -// aio_suspend -// aio_write -// break -// clock_getres -// clock_gettime -// clock_settime -// compat_09_ogetdomainname -// compat_09_osetdomainname -// compat_09_ouname -// compat_10_omsgsys -// compat_10_osemsys -// compat_10_oshmsys -// compat_12_fstat12 -// compat_12_getdirentries -// compat_12_lstat12 -// compat_12_msync -// compat_12_oreboot -// compat_12_oswapon -// compat_12_stat12 -// compat_13_sigaction13 -// compat_13_sigaltstack13 -// compat_13_sigpending13 -// compat_13_sigprocmask13 -// compat_13_sigreturn13 -// compat_13_sigsuspend13 -// compat_14___semctl -// compat_14_msgctl -// compat_14_shmctl -// compat_16___sigaction14 -// compat_16___sigreturn14 -// compat_20_fhstatfs -// compat_20_fstatfs -// compat_20_getfsstat -// compat_20_statfs -// compat_30___fhstat30 -// compat_30___fstat13 -// compat_30___lstat13 -// compat_30___stat13 -// compat_30_fhopen -// compat_30_fhstat -// compat_30_fhstatvfs1 -// compat_30_getdents -// compat_30_getfh -// compat_30_ntp_gettime -// compat_30_socket -// compat_40_mount -// compat_43_fstat43 -// compat_43_lstat43 -// compat_43_oaccept -// compat_43_ocreat -// compat_43_oftruncate -// compat_43_ogetdirentries -// compat_43_ogetdtablesize -// compat_43_ogethostid -// compat_43_ogethostname -// compat_43_ogetkerninfo -// compat_43_ogetpagesize -// compat_43_ogetpeername -// compat_43_ogetrlimit -// compat_43_ogetsockname -// compat_43_okillpg -// compat_43_olseek -// compat_43_ommap -// compat_43_oquota -// compat_43_orecv -// compat_43_orecvfrom -// compat_43_orecvmsg -// compat_43_osend -// compat_43_osendmsg -// compat_43_osethostid -// compat_43_osethostname -// compat_43_osigblock -// compat_43_osigsetmask -// compat_43_osigstack -// compat_43_osigvec -// compat_43_otruncate -// compat_43_owait -// compat_43_stat43 -// execve -// extattr_delete_fd -// extattr_delete_file -// extattr_delete_link -// extattr_get_fd -// extattr_get_file -// extattr_get_link -// extattr_list_fd -// extattr_list_file -// extattr_list_link -// extattr_set_fd -// extattr_set_file -// extattr_set_link -// extattrctl -// fchroot -// fdatasync -// fgetxattr -// fktrace -// flistxattr -// fork -// fremovexattr -// fsetxattr -// fstatvfs1 -// fsync_range -// getcontext -// getitimer -// getvfsstat -// getxattr -// ktrace -// lchflags -// lchmod -// lfs_bmapv -// lfs_markv -// lfs_segclean -// lfs_segwait -// lgetxattr -// lio_listio -// listxattr -// llistxattr -// lremovexattr -// lseek -// lsetxattr -// lutimes -// madvise -// mincore -// minherit -// modctl -// mq_close -// mq_getattr -// mq_notify -// mq_open -// mq_receive -// mq_send -// mq_setattr -// mq_timedreceive -// mq_timedsend -// mq_unlink -// mremap -// msgget -// msgrcv -// msgsnd -// nfssvc -// ntp_adjtime -// pmc_control -// pmc_get_info -// pollts -// preadv -// profil -// pselect -// pset_assign -// pset_create -// pset_destroy -// ptrace -// pwritev -// quotactl -// rasctl -// readv -// reboot -// removexattr -// sa_enable -// sa_preempt -// sa_register -// sa_setconcurrency -// sa_stacks -// sa_yield -// sbrk -// sched_yield -// semconfig -// semget -// semop -// setcontext -// setitimer -// setxattr -// shmat -// shmdt -// shmget -// sstk -// statvfs1 -// swapctl -// sysarch -// syscall -// timer_create -// timer_delete -// timer_getoverrun -// timer_gettime -// timer_settime -// undelete -// utrace -// uuidgen -// vadvise -// vfork -// writev +const ( + mremapFixed = MAP_FIXED + mremapDontunmap = 0 + mremapMaymove = 0 +) + +//sys mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) = SYS_MREMAP + +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (uintptr, error) { + return mremapNetBSD(oldaddr, oldlength, newaddr, newlength, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index c5f166a11..6f34479b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -326,78 +326,4 @@ func Uname(uname *Utsname) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) - -/* - * Unimplemented - */ -// __getcwd -// __semctl -// __syscall -// __sysctl -// adjfreq -// break -// clock_getres -// clock_gettime -// clock_settime -// closefrom -// execve -// fhopen -// fhstat -// fhstatfs -// fork -// futimens -// getfh -// getgid -// getitimer -// getlogin -// getthrid -// ktrace -// lfs_bmapv -// lfs_markv -// lfs_segclean -// lfs_segwait -// mincore -// minherit -// mount -// mquery -// msgctl -// msgget -// msgrcv -// msgsnd -// nfssvc -// nnpfspioctl -// preadv -// profil -// pwritev -// quotactl -// readv -// reboot -// renameat -// rfork -// sched_yield -// semget -// semop -// setgroups -// setitimer -// setsockopt -// shmat -// shmctl -// shmdt -// shmget -// sigaction -// sigaltstack -// sigpending -// sigprocmask -// sigreturn -// sigsuspend -// sysarch -// syscall -// threxit -// thrsigdivert -// thrsleep -// thrwakeup -// vfork -// writev diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index b600a289d..b99cfa134 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -698,38 +698,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) - n = int(r0) - if e1 != 0 { - err = e1 - } - return -} - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) - n = int(r0) - if e1 != 0 { - err = e1 - } - return -} - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - // Event Ports type fileObjCookie struct { diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 8e48c29ec..f6eda2705 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -147,6 +147,14 @@ func (m *mmapper) Munmap(data []byte) (err error) { return nil } +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + func Read(fd int, p []byte) (n int, err error) { n, err = read(fd, p) if raceenabled { @@ -541,6 +549,9 @@ func SetNonblock(fd int, nonblocking bool) (err error) { if err != nil { return err } + if (flag&O_NONBLOCK != 0) == nonblocking { + return nil + } if nonblocking { flag |= O_NONBLOCK } else { diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d3d49ec3e..4596d041c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -192,7 +192,6 @@ func (cmsg *Cmsghdr) SetLen(length int) { //sys fcntl(fd int, cmd int, arg int) (val int, err error) //sys read(fd int, p []byte) (n int, err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ //sys write(fd int, p []byte) (n int, err error) //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = SYS___ACCEPT_A @@ -285,25 +284,11 @@ func Close(fd int) (err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - // Dummy function: there are no semantics for Madvise on z/OS func Madvise(b []byte, advice int) (err error) { return } -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index de936b677..f9c7f479b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -493,6 +493,7 @@ const ( BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_DEV_BOUND_ONLY = 0x40 BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 @@ -826,9 +827,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2022-07-28)" + DM_VERSION_EXTRA = "-ioctl (2023-03-01)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2f + DM_VERSION_MINOR = 0x30 DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -1197,6 +1198,7 @@ const ( FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_FS_ERROR = 0x8000 + FAN_INFO = 0x20 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 FAN_MARK_EVICTABLE = 0x200 @@ -1233,6 +1235,8 @@ const ( FAN_REPORT_PIDFD = 0x80 FAN_REPORT_TARGET_FID = 0x1000 FAN_REPORT_TID = 0x100 + FAN_RESPONSE_INFO_AUDIT_RULE = 0x1 + FAN_RESPONSE_INFO_NONE = 0x0 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 @@ -1860,6 +1864,7 @@ const ( MEMWRITEOOB64 = 0xc0184d15 MFD_ALLOW_SEALING = 0x2 MFD_CLOEXEC = 0x1 + MFD_EXEC = 0x10 MFD_HUGETLB = 0x4 MFD_HUGE_16GB = 0x88000000 MFD_HUGE_16MB = 0x60000000 @@ -1875,6 +1880,7 @@ const ( MFD_HUGE_8MB = 0x5c000000 MFD_HUGE_MASK = 0x3f MFD_HUGE_SHIFT = 0x1a + MFD_NOEXEC_SEAL = 0x8 MINIX2_SUPER_MAGIC = 0x2468 MINIX2_SUPER_MAGIC2 = 0x2478 MINIX3_SUPER_MAGIC = 0x4d5a @@ -1898,6 +1904,9 @@ const ( MOUNT_ATTR_SIZE_VER0 = 0x20 MOUNT_ATTR_STRICTATIME = 0x20 MOUNT_ATTR__ATIME = 0x70 + MREMAP_DONTUNMAP = 0x4 + MREMAP_FIXED = 0x2 + MREMAP_MAYMOVE = 0x1 MSDOS_SUPER_MAGIC = 0x4d44 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 @@ -2204,6 +2213,7 @@ const ( PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf + PACKET_VNET_HDR_SZ = 0x18 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 @@ -2221,6 +2231,7 @@ const ( PERF_ATTR_SIZE_VER5 = 0x70 PERF_ATTR_SIZE_VER6 = 0x78 PERF_ATTR_SIZE_VER7 = 0x80 + PERF_ATTR_SIZE_VER8 = 0x88 PERF_AUX_FLAG_COLLISION = 0x8 PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT = 0x0 PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW = 0x100 @@ -2361,6 +2372,7 @@ const ( PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 + PR_GET_AUXV = 0x41555856 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 @@ -2369,6 +2381,8 @@ const ( PR_GET_FP_MODE = 0x2e PR_GET_IO_FLUSHER = 0x3a PR_GET_KEEPCAPS = 0x7 + PR_GET_MDWE = 0x42 + PR_GET_MEMORY_MERGE = 0x44 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 @@ -2389,6 +2403,7 @@ const ( PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 + PR_MDWE_REFUSE_EXEC_GAIN = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_MTE_TAG_MASK = 0x7fff8 @@ -2406,6 +2421,15 @@ const ( PR_PAC_GET_ENABLED_KEYS = 0x3d PR_PAC_RESET_KEYS = 0x36 PR_PAC_SET_ENABLED_KEYS = 0x3c + PR_RISCV_V_GET_CONTROL = 0x46 + PR_RISCV_V_SET_CONTROL = 0x45 + PR_RISCV_V_VSTATE_CTRL_CUR_MASK = 0x3 + PR_RISCV_V_VSTATE_CTRL_DEFAULT = 0x0 + PR_RISCV_V_VSTATE_CTRL_INHERIT = 0x10 + PR_RISCV_V_VSTATE_CTRL_MASK = 0x1f + PR_RISCV_V_VSTATE_CTRL_NEXT_MASK = 0xc + PR_RISCV_V_VSTATE_CTRL_OFF = 0x1 + PR_RISCV_V_VSTATE_CTRL_ON = 0x2 PR_SCHED_CORE = 0x3e PR_SCHED_CORE_CREATE = 0x1 PR_SCHED_CORE_GET = 0x0 @@ -2423,6 +2447,8 @@ const ( PR_SET_FP_MODE = 0x2d PR_SET_IO_FLUSHER = 0x39 PR_SET_KEEPCAPS = 0x8 + PR_SET_MDWE = 0x41 + PR_SET_MEMORY_MERGE = 0x43 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 @@ -2506,6 +2532,7 @@ const ( PTRACE_GETSIGMASK = 0x420a PTRACE_GET_RSEQ_CONFIGURATION = 0x420f PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG = 0x4211 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -2536,6 +2563,7 @@ const ( PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG = 0x4210 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSCALL_INFO_ENTRY = 0x1 @@ -2802,6 +2830,23 @@ const ( RWF_SUPPORTED = 0x1f RWF_SYNC = 0x4 RWF_WRITE_LIFE_NOT_SET = 0x0 + SCHED_BATCH = 0x3 + SCHED_DEADLINE = 0x6 + SCHED_FIFO = 0x1 + SCHED_FLAG_ALL = 0x7f + SCHED_FLAG_DL_OVERRUN = 0x4 + SCHED_FLAG_KEEP_ALL = 0x18 + SCHED_FLAG_KEEP_PARAMS = 0x10 + SCHED_FLAG_KEEP_POLICY = 0x8 + SCHED_FLAG_RECLAIM = 0x2 + SCHED_FLAG_RESET_ON_FORK = 0x1 + SCHED_FLAG_UTIL_CLAMP = 0x60 + SCHED_FLAG_UTIL_CLAMP_MAX = 0x40 + SCHED_FLAG_UTIL_CLAMP_MIN = 0x20 + SCHED_IDLE = 0x5 + SCHED_NORMAL = 0x0 + SCHED_RESET_ON_FORK = 0x40000000 + SCHED_RR = 0x2 SCM_CREDENTIALS = 0x2 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x1d @@ -3072,7 +3117,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xd + TASKSTATS_VERSION = 0xe TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -3238,6 +3283,7 @@ const ( TP_STATUS_COPY = 0x2 TP_STATUS_CSUMNOTREADY = 0x8 TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_GSO_TCP = 0x100 TP_STATUS_KERNEL = 0x0 TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index a46df0f1e..30aee00a5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6cd4a3ea9..8ebfa5127 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -318,10 +327,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c7ebee24d..271a21cdc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -324,10 +333,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9d5352c3e..910c330a3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -314,10 +323,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 @@ -443,6 +454,7 @@ const ( TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 + TPIDR2_MAGIC = 0x54504902 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETDEVNETNS = 0x54e3 @@ -515,6 +527,7 @@ const ( XCASE = 0x4 XTABS = 0x1800 ZA_MAGIC = 0x54366345 + ZT_MAGIC = 0x5a544e01 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index f26a164f4..a640798c9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -109,6 +118,8 @@ const ( IUCLC = 0x200 IXOFF = 0x1000 IXON = 0x400 + LASX_CTX_MAGIC = 0x41535801 + LSX_CTX_MAGIC = 0x53580001 MAP_ANON = 0x20 MAP_ANONYMOUS = 0x20 MAP_DENYWRITE = 0x800 @@ -308,10 +319,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 890bc3c9b..0d5925d34 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 549f26ac6..d72a00e0b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index e0365e32c..02ba129f8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index fdccce15c..8daa6dd96 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -317,10 +326,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x12 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x1028 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index b2205c83f..63c8fa2f7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -372,10 +381,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 81aa5ad0f..930799ec1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -376,10 +385,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 76807a1fd..8605a7dd7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 @@ -376,10 +385,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x15 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index d4a5ab9e4..95a016f1c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -305,10 +314,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 66e65db95..1ae0108f5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -380,10 +389,12 @@ const ( SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 + SO_PASSPIDFD = 0x4c SO_PASSSEC = 0x22 SO_PEEK_OFF = 0x2a SO_PEERCRED = 0x11 SO_PEERGROUPS = 0x3b + SO_PEERPIDFD = 0x4d SO_PEERSEC = 0x1f SO_PREFER_BUSY_POLL = 0x45 SO_PROTOCOL = 0x26 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 48984202c..1bb7c6333 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -30,22 +30,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -419,10 +428,12 @@ const ( SO_NOFCS = 0x27 SO_OOBINLINE = 0x100 SO_PASSCRED = 0x2 + SO_PASSPIDFD = 0x55 SO_PASSSEC = 0x1f SO_PEEK_OFF = 0x26 SO_PEERCRED = 0x40 SO_PEERGROUPS = 0x3d + SO_PEERPIDFD = 0x56 SO_PEERSEC = 0x1e SO_PREFER_BUSY_POLL = 0x48 SO_PROTOCOL = 0x1028 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 9a257219d..d1d1d2331 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -817,28 +817,6 @@ func write(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, er := C.read(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) - n = int(r0) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, er := C.write(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) - n = int(r0) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Dup2(oldfd int, newfd int) (err error) { r0, er := C.dup2(C.int(oldfd), C.int(newfd)) if r0 == -1 && er != nil { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index 6de80c20c..f99a18adc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -762,28 +762,6 @@ func write(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, e1 := callread(fd, uintptr(unsafe.Pointer(p)), np) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, e1 := callwrite(fd, uintptr(unsafe.Pointer(p)), np) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Dup2(oldfd int, newfd int) (err error) { _, e1 := calldup2(oldfd, newfd) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 4037ccf7a..1cad561e9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -725,6 +725,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -733,10 +739,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2410,28 +2412,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall_syscall(libc_fstat64_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2521,14 +2501,6 @@ func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { return } -func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - _, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - var libc_ptrace_trampoline_addr uintptr //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 4baaed0bc..8b8bb2840 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -5,703 +5,586 @@ TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fdopendir(SB) - GLOBL ·libc_fdopendir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB) TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgroups(SB) - GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgroups(SB) - GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_wait4(SB) - GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_accept(SB) - GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_bind(SB) - GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_connect(SB) - GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socket(SB) - GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockopt(SB) - GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsockopt(SB) - GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpeername(SB) - GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockname(SB) - GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shutdown(SB) - GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socketpair(SB) - GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvfrom(SB) - GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendto(SB) - GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvmsg(SB) - GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) - GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) - GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) - GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) - GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_poll(SB) - GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_madvise(SB) - GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlock(SB) - GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlockall(SB) - GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mprotect(SB) - GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_msync(SB) - GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) - GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) - GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_closedir(SB) - GLOBL ·libc_closedir_trampoline_addr(SB), RODATA, $8 DATA ·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB) TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readdir_r(SB) - GLOBL ·libc_readdir_r_trampoline_addr(SB), RODATA, $8 DATA ·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB) TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pipe(SB) - GLOBL ·libc_pipe_trampoline_addr(SB), RODATA, $8 DATA ·libc_pipe_trampoline_addr(SB)/8, $libc_pipe_trampoline<>(SB) TEXT libc_getxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getxattr(SB) - GLOBL ·libc_getxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_getxattr_trampoline_addr(SB)/8, $libc_getxattr_trampoline<>(SB) TEXT libc_fgetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fgetxattr(SB) - GLOBL ·libc_fgetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fgetxattr_trampoline_addr(SB)/8, $libc_fgetxattr_trampoline<>(SB) TEXT libc_setxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setxattr(SB) - GLOBL ·libc_setxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_setxattr_trampoline_addr(SB)/8, $libc_setxattr_trampoline<>(SB) TEXT libc_fsetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsetxattr(SB) - GLOBL ·libc_fsetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsetxattr_trampoline_addr(SB)/8, $libc_fsetxattr_trampoline<>(SB) TEXT libc_removexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_removexattr(SB) - GLOBL ·libc_removexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_removexattr_trampoline_addr(SB)/8, $libc_removexattr_trampoline<>(SB) TEXT libc_fremovexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fremovexattr(SB) - GLOBL ·libc_fremovexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fremovexattr_trampoline_addr(SB)/8, $libc_fremovexattr_trampoline<>(SB) TEXT libc_listxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listxattr(SB) - GLOBL ·libc_listxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_listxattr_trampoline_addr(SB)/8, $libc_listxattr_trampoline<>(SB) TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) - GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) - GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kill(SB) - GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) - GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) - GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmat(SB) - GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmctl(SB) - GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmdt(SB) - GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmget(SB) - GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) - GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_adjtime(SB) - GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chdir(SB) - GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chflags(SB) - GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chmod(SB) - GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chown(SB) - GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) - GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clock_gettime(SB) - GLOBL ·libc_clock_gettime_trampoline_addr(SB), RODATA, $8 DATA ·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB) TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_close(SB) - GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) TEXT libc_clonefile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefile(SB) - GLOBL ·libc_clonefile_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefile_trampoline_addr(SB)/8, $libc_clonefile_trampoline<>(SB) TEXT libc_clonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefileat(SB) - GLOBL ·libc_clonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefileat_trampoline_addr(SB)/8, $libc_clonefileat_trampoline<>(SB) TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup(SB) - GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup2(SB) - GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) TEXT libc_exchangedata_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exchangedata(SB) - GLOBL ·libc_exchangedata_trampoline_addr(SB), RODATA, $8 DATA ·libc_exchangedata_trampoline_addr(SB)/8, $libc_exchangedata_trampoline<>(SB) TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exit(SB) - GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_faccessat(SB) - GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchdir(SB) - GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchflags(SB) - GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmod(SB) - GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmodat(SB) - GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchown(SB) - GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchownat(SB) - GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) TEXT libc_fclonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fclonefileat(SB) - GLOBL ·libc_fclonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fclonefileat_trampoline_addr(SB)/8, $libc_fclonefileat_trampoline<>(SB) TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flock(SB) - GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fpathconf(SB) - GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsync(SB) - GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ftruncate(SB) - GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getcwd(SB) - GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) TEXT libc_getdtablesize_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getdtablesize(SB) - GLOBL ·libc_getdtablesize_trampoline_addr(SB), RODATA, $8 DATA ·libc_getdtablesize_trampoline_addr(SB)/8, $libc_getdtablesize_trampoline<>(SB) TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getegid(SB) - GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_geteuid(SB) - GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgid(SB) - GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgid(SB) - GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgrp(SB) - GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpid(SB) - GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getppid(SB) - GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpriority(SB) - GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrlimit(SB) - GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrusage(SB) - GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsid(SB) - GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) - GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getuid(SB) - GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_issetugid(SB) - GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kqueue(SB) - GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lchown(SB) - GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_link(SB) - GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_linkat(SB) - GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listen(SB) - GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdir(SB) - GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdirat(SB) - GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkfifo(SB) - GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mknod(SB) - GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mount(SB) - GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) - GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_openat(SB) - GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pathconf(SB) - GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pread(SB) - GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) - GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_read(SB) - GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) - GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlinkat(SB) - GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rename(SB) - GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_renameat(SB) - GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_revoke(SB) - GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rmdir(SB) - GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lseek(SB) - GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_select(SB) - GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) @@ -712,192 +595,160 @@ DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) - GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_seteuid(SB) - GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgid(SB) - GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setlogin(SB) - GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpgid(SB) - GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpriority(SB) - GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) TEXT libc_setprivexec_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setprivexec(SB) - GLOBL ·libc_setprivexec_trampoline_addr(SB), RODATA, $8 DATA ·libc_setprivexec_trampoline_addr(SB)/8, $libc_setprivexec_trampoline<>(SB) TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setregid(SB) - GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setreuid(SB) - GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) - GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_settimeofday(SB) - GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setuid(SB) - GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlink(SB) - GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlinkat(SB) - GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sync(SB) - GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_truncate(SB) - GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_umask(SB) - GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) TEXT libc_undelete_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_undelete(SB) - GLOBL ·libc_undelete_trampoline_addr(SB), RODATA, $8 DATA ·libc_undelete_trampoline_addr(SB)/8, $libc_undelete_trampoline<>(SB) TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlink(SB) - GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlinkat(SB) - GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) - GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_write(SB) - GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) - GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) TEXT libc_fstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstat64(SB) - GLOBL ·libc_fstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstat64_trampoline_addr(SB)/8, $libc_fstat64_trampoline<>(SB) TEXT libc_fstatat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatat64(SB) - GLOBL ·libc_fstatat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatat64_trampoline_addr(SB)/8, $libc_fstatat64_trampoline<>(SB) TEXT libc_fstatfs64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) - GLOBL ·libc_fstatfs64_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatfs64_trampoline_addr(SB)/8, $libc_fstatfs64_trampoline<>(SB) TEXT libc_getfsstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) - GLOBL ·libc_getfsstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_getfsstat64_trampoline_addr(SB)/8, $libc_getfsstat64_trampoline<>(SB) TEXT libc_lstat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lstat64(SB) - GLOBL ·libc_lstat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_lstat64_trampoline_addr(SB)/8, $libc_lstat64_trampoline<>(SB) TEXT libc_ptrace_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ptrace(SB) - GLOBL ·libc_ptrace_trampoline_addr(SB), RODATA, $8 DATA ·libc_ptrace_trampoline_addr(SB)/8, $libc_ptrace_trampoline<>(SB) TEXT libc_stat64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_stat64(SB) - GLOBL ·libc_stat64_trampoline_addr(SB), RODATA, $8 DATA ·libc_stat64_trampoline_addr(SB)/8, $libc_stat64_trampoline<>(SB) TEXT libc_statfs64_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_statfs64(SB) - GLOBL ·libc_statfs64_trampoline_addr(SB), RODATA, $8 DATA ·libc_statfs64_trampoline_addr(SB)/8, $libc_statfs64_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 51d6f3fb2..b18edbd0e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -725,6 +725,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -733,10 +739,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2410,28 +2412,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2521,14 +2501,6 @@ func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { return } -func ptrace1Ptr(request int, pid int, addr uintptr, data unsafe.Pointer) (err error) { - _, _, e1 := syscall_syscall6(libc_ptrace_trampoline_addr, uintptr(request), uintptr(pid), addr, uintptr(data), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - var libc_ptrace_trampoline_addr uintptr //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index c3b82c037..08362c1ab 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -5,703 +5,586 @@ TEXT libc_fdopendir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fdopendir(SB) - GLOBL ·libc_fdopendir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fdopendir_trampoline_addr(SB)/8, $libc_fdopendir_trampoline<>(SB) TEXT libc_getgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgroups(SB) - GLOBL ·libc_getgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgroups_trampoline_addr(SB)/8, $libc_getgroups_trampoline<>(SB) TEXT libc_setgroups_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgroups(SB) - GLOBL ·libc_setgroups_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgroups_trampoline_addr(SB)/8, $libc_setgroups_trampoline<>(SB) TEXT libc_wait4_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_wait4(SB) - GLOBL ·libc_wait4_trampoline_addr(SB), RODATA, $8 DATA ·libc_wait4_trampoline_addr(SB)/8, $libc_wait4_trampoline<>(SB) TEXT libc_accept_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_accept(SB) - GLOBL ·libc_accept_trampoline_addr(SB), RODATA, $8 DATA ·libc_accept_trampoline_addr(SB)/8, $libc_accept_trampoline<>(SB) TEXT libc_bind_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_bind(SB) - GLOBL ·libc_bind_trampoline_addr(SB), RODATA, $8 DATA ·libc_bind_trampoline_addr(SB)/8, $libc_bind_trampoline<>(SB) TEXT libc_connect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_connect(SB) - GLOBL ·libc_connect_trampoline_addr(SB), RODATA, $8 DATA ·libc_connect_trampoline_addr(SB)/8, $libc_connect_trampoline<>(SB) TEXT libc_socket_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socket(SB) - GLOBL ·libc_socket_trampoline_addr(SB), RODATA, $8 DATA ·libc_socket_trampoline_addr(SB)/8, $libc_socket_trampoline<>(SB) TEXT libc_getsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockopt(SB) - GLOBL ·libc_getsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockopt_trampoline_addr(SB)/8, $libc_getsockopt_trampoline<>(SB) TEXT libc_setsockopt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsockopt(SB) - GLOBL ·libc_setsockopt_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsockopt_trampoline_addr(SB)/8, $libc_setsockopt_trampoline<>(SB) TEXT libc_getpeername_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpeername(SB) - GLOBL ·libc_getpeername_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpeername_trampoline_addr(SB)/8, $libc_getpeername_trampoline<>(SB) TEXT libc_getsockname_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsockname(SB) - GLOBL ·libc_getsockname_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsockname_trampoline_addr(SB)/8, $libc_getsockname_trampoline<>(SB) TEXT libc_shutdown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shutdown(SB) - GLOBL ·libc_shutdown_trampoline_addr(SB), RODATA, $8 DATA ·libc_shutdown_trampoline_addr(SB)/8, $libc_shutdown_trampoline<>(SB) TEXT libc_socketpair_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_socketpair(SB) - GLOBL ·libc_socketpair_trampoline_addr(SB), RODATA, $8 DATA ·libc_socketpair_trampoline_addr(SB)/8, $libc_socketpair_trampoline<>(SB) TEXT libc_recvfrom_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvfrom(SB) - GLOBL ·libc_recvfrom_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvfrom_trampoline_addr(SB)/8, $libc_recvfrom_trampoline<>(SB) TEXT libc_sendto_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendto(SB) - GLOBL ·libc_sendto_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendto_trampoline_addr(SB)/8, $libc_sendto_trampoline<>(SB) TEXT libc_recvmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_recvmsg(SB) - GLOBL ·libc_recvmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_recvmsg_trampoline_addr(SB)/8, $libc_recvmsg_trampoline<>(SB) TEXT libc_sendmsg_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendmsg(SB) - GLOBL ·libc_sendmsg_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendmsg_trampoline_addr(SB)/8, $libc_sendmsg_trampoline<>(SB) TEXT libc_kevent_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kevent(SB) - GLOBL ·libc_kevent_trampoline_addr(SB), RODATA, $8 DATA ·libc_kevent_trampoline_addr(SB)/8, $libc_kevent_trampoline<>(SB) TEXT libc_utimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimes(SB) - GLOBL ·libc_utimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimes_trampoline_addr(SB)/8, $libc_utimes_trampoline<>(SB) TEXT libc_futimes_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_futimes(SB) - GLOBL ·libc_futimes_trampoline_addr(SB), RODATA, $8 DATA ·libc_futimes_trampoline_addr(SB)/8, $libc_futimes_trampoline<>(SB) TEXT libc_poll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_poll(SB) - GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) TEXT libc_madvise_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_madvise(SB) - GLOBL ·libc_madvise_trampoline_addr(SB), RODATA, $8 DATA ·libc_madvise_trampoline_addr(SB)/8, $libc_madvise_trampoline<>(SB) TEXT libc_mlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlock(SB) - GLOBL ·libc_mlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlock_trampoline_addr(SB)/8, $libc_mlock_trampoline<>(SB) TEXT libc_mlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mlockall(SB) - GLOBL ·libc_mlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_mlockall_trampoline_addr(SB)/8, $libc_mlockall_trampoline<>(SB) TEXT libc_mprotect_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mprotect(SB) - GLOBL ·libc_mprotect_trampoline_addr(SB), RODATA, $8 DATA ·libc_mprotect_trampoline_addr(SB)/8, $libc_mprotect_trampoline<>(SB) TEXT libc_msync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_msync(SB) - GLOBL ·libc_msync_trampoline_addr(SB), RODATA, $8 DATA ·libc_msync_trampoline_addr(SB)/8, $libc_msync_trampoline<>(SB) TEXT libc_munlock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlock(SB) - GLOBL ·libc_munlock_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlock_trampoline_addr(SB)/8, $libc_munlock_trampoline<>(SB) TEXT libc_munlockall_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munlockall(SB) - GLOBL ·libc_munlockall_trampoline_addr(SB), RODATA, $8 DATA ·libc_munlockall_trampoline_addr(SB)/8, $libc_munlockall_trampoline<>(SB) TEXT libc_closedir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_closedir(SB) - GLOBL ·libc_closedir_trampoline_addr(SB), RODATA, $8 DATA ·libc_closedir_trampoline_addr(SB)/8, $libc_closedir_trampoline<>(SB) TEXT libc_readdir_r_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readdir_r(SB) - GLOBL ·libc_readdir_r_trampoline_addr(SB), RODATA, $8 DATA ·libc_readdir_r_trampoline_addr(SB)/8, $libc_readdir_r_trampoline<>(SB) TEXT libc_pipe_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pipe(SB) - GLOBL ·libc_pipe_trampoline_addr(SB), RODATA, $8 DATA ·libc_pipe_trampoline_addr(SB)/8, $libc_pipe_trampoline<>(SB) TEXT libc_getxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getxattr(SB) - GLOBL ·libc_getxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_getxattr_trampoline_addr(SB)/8, $libc_getxattr_trampoline<>(SB) TEXT libc_fgetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fgetxattr(SB) - GLOBL ·libc_fgetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fgetxattr_trampoline_addr(SB)/8, $libc_fgetxattr_trampoline<>(SB) TEXT libc_setxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setxattr(SB) - GLOBL ·libc_setxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_setxattr_trampoline_addr(SB)/8, $libc_setxattr_trampoline<>(SB) TEXT libc_fsetxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsetxattr(SB) - GLOBL ·libc_fsetxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsetxattr_trampoline_addr(SB)/8, $libc_fsetxattr_trampoline<>(SB) TEXT libc_removexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_removexattr(SB) - GLOBL ·libc_removexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_removexattr_trampoline_addr(SB)/8, $libc_removexattr_trampoline<>(SB) TEXT libc_fremovexattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fremovexattr(SB) - GLOBL ·libc_fremovexattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_fremovexattr_trampoline_addr(SB)/8, $libc_fremovexattr_trampoline<>(SB) TEXT libc_listxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listxattr(SB) - GLOBL ·libc_listxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_listxattr_trampoline_addr(SB)/8, $libc_listxattr_trampoline<>(SB) TEXT libc_flistxattr_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flistxattr(SB) - GLOBL ·libc_flistxattr_trampoline_addr(SB), RODATA, $8 DATA ·libc_flistxattr_trampoline_addr(SB)/8, $libc_flistxattr_trampoline<>(SB) TEXT libc_utimensat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_utimensat(SB) - GLOBL ·libc_utimensat_trampoline_addr(SB), RODATA, $8 DATA ·libc_utimensat_trampoline_addr(SB)/8, $libc_utimensat_trampoline<>(SB) TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fcntl(SB) - GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) TEXT libc_kill_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kill(SB) - GLOBL ·libc_kill_trampoline_addr(SB), RODATA, $8 DATA ·libc_kill_trampoline_addr(SB)/8, $libc_kill_trampoline<>(SB) TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ioctl(SB) - GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) - GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) - GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmat(SB) - GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmctl(SB) - GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmdt(SB) - GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_shmget(SB) - GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) - GLOBL ·libc_access_trampoline_addr(SB), RODATA, $8 DATA ·libc_access_trampoline_addr(SB)/8, $libc_access_trampoline<>(SB) TEXT libc_adjtime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_adjtime(SB) - GLOBL ·libc_adjtime_trampoline_addr(SB), RODATA, $8 DATA ·libc_adjtime_trampoline_addr(SB)/8, $libc_adjtime_trampoline<>(SB) TEXT libc_chdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chdir(SB) - GLOBL ·libc_chdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_chdir_trampoline_addr(SB)/8, $libc_chdir_trampoline<>(SB) TEXT libc_chflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chflags(SB) - GLOBL ·libc_chflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_chflags_trampoline_addr(SB)/8, $libc_chflags_trampoline<>(SB) TEXT libc_chmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chmod(SB) - GLOBL ·libc_chmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_chmod_trampoline_addr(SB)/8, $libc_chmod_trampoline<>(SB) TEXT libc_chown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chown(SB) - GLOBL ·libc_chown_trampoline_addr(SB), RODATA, $8 DATA ·libc_chown_trampoline_addr(SB)/8, $libc_chown_trampoline<>(SB) TEXT libc_chroot_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) - GLOBL ·libc_chroot_trampoline_addr(SB), RODATA, $8 DATA ·libc_chroot_trampoline_addr(SB)/8, $libc_chroot_trampoline<>(SB) TEXT libc_clock_gettime_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clock_gettime(SB) - GLOBL ·libc_clock_gettime_trampoline_addr(SB), RODATA, $8 DATA ·libc_clock_gettime_trampoline_addr(SB)/8, $libc_clock_gettime_trampoline<>(SB) TEXT libc_close_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_close(SB) - GLOBL ·libc_close_trampoline_addr(SB), RODATA, $8 DATA ·libc_close_trampoline_addr(SB)/8, $libc_close_trampoline<>(SB) TEXT libc_clonefile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefile(SB) - GLOBL ·libc_clonefile_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefile_trampoline_addr(SB)/8, $libc_clonefile_trampoline<>(SB) TEXT libc_clonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_clonefileat(SB) - GLOBL ·libc_clonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_clonefileat_trampoline_addr(SB)/8, $libc_clonefileat_trampoline<>(SB) TEXT libc_dup_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup(SB) - GLOBL ·libc_dup_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup_trampoline_addr(SB)/8, $libc_dup_trampoline<>(SB) TEXT libc_dup2_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_dup2(SB) - GLOBL ·libc_dup2_trampoline_addr(SB), RODATA, $8 DATA ·libc_dup2_trampoline_addr(SB)/8, $libc_dup2_trampoline<>(SB) TEXT libc_exchangedata_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exchangedata(SB) - GLOBL ·libc_exchangedata_trampoline_addr(SB), RODATA, $8 DATA ·libc_exchangedata_trampoline_addr(SB)/8, $libc_exchangedata_trampoline<>(SB) TEXT libc_exit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_exit(SB) - GLOBL ·libc_exit_trampoline_addr(SB), RODATA, $8 DATA ·libc_exit_trampoline_addr(SB)/8, $libc_exit_trampoline<>(SB) TEXT libc_faccessat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_faccessat(SB) - GLOBL ·libc_faccessat_trampoline_addr(SB), RODATA, $8 DATA ·libc_faccessat_trampoline_addr(SB)/8, $libc_faccessat_trampoline<>(SB) TEXT libc_fchdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchdir(SB) - GLOBL ·libc_fchdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchdir_trampoline_addr(SB)/8, $libc_fchdir_trampoline<>(SB) TEXT libc_fchflags_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchflags(SB) - GLOBL ·libc_fchflags_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchflags_trampoline_addr(SB)/8, $libc_fchflags_trampoline<>(SB) TEXT libc_fchmod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmod(SB) - GLOBL ·libc_fchmod_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmod_trampoline_addr(SB)/8, $libc_fchmod_trampoline<>(SB) TEXT libc_fchmodat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchmodat(SB) - GLOBL ·libc_fchmodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchmodat_trampoline_addr(SB)/8, $libc_fchmodat_trampoline<>(SB) TEXT libc_fchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchown(SB) - GLOBL ·libc_fchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchown_trampoline_addr(SB)/8, $libc_fchown_trampoline<>(SB) TEXT libc_fchownat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fchownat(SB) - GLOBL ·libc_fchownat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fchownat_trampoline_addr(SB)/8, $libc_fchownat_trampoline<>(SB) TEXT libc_fclonefileat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fclonefileat(SB) - GLOBL ·libc_fclonefileat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fclonefileat_trampoline_addr(SB)/8, $libc_fclonefileat_trampoline<>(SB) TEXT libc_flock_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_flock(SB) - GLOBL ·libc_flock_trampoline_addr(SB), RODATA, $8 DATA ·libc_flock_trampoline_addr(SB)/8, $libc_flock_trampoline<>(SB) TEXT libc_fpathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fpathconf(SB) - GLOBL ·libc_fpathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_fpathconf_trampoline_addr(SB)/8, $libc_fpathconf_trampoline<>(SB) TEXT libc_fsync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fsync(SB) - GLOBL ·libc_fsync_trampoline_addr(SB), RODATA, $8 DATA ·libc_fsync_trampoline_addr(SB)/8, $libc_fsync_trampoline<>(SB) TEXT libc_ftruncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ftruncate(SB) - GLOBL ·libc_ftruncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_ftruncate_trampoline_addr(SB)/8, $libc_ftruncate_trampoline<>(SB) TEXT libc_getcwd_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getcwd(SB) - GLOBL ·libc_getcwd_trampoline_addr(SB), RODATA, $8 DATA ·libc_getcwd_trampoline_addr(SB)/8, $libc_getcwd_trampoline<>(SB) TEXT libc_getdtablesize_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getdtablesize(SB) - GLOBL ·libc_getdtablesize_trampoline_addr(SB), RODATA, $8 DATA ·libc_getdtablesize_trampoline_addr(SB)/8, $libc_getdtablesize_trampoline<>(SB) TEXT libc_getegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getegid(SB) - GLOBL ·libc_getegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getegid_trampoline_addr(SB)/8, $libc_getegid_trampoline<>(SB) TEXT libc_geteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_geteuid(SB) - GLOBL ·libc_geteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_geteuid_trampoline_addr(SB)/8, $libc_geteuid_trampoline<>(SB) TEXT libc_getgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getgid(SB) - GLOBL ·libc_getgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getgid_trampoline_addr(SB)/8, $libc_getgid_trampoline<>(SB) TEXT libc_getpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgid(SB) - GLOBL ·libc_getpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgid_trampoline_addr(SB)/8, $libc_getpgid_trampoline<>(SB) TEXT libc_getpgrp_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpgrp(SB) - GLOBL ·libc_getpgrp_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpgrp_trampoline_addr(SB)/8, $libc_getpgrp_trampoline<>(SB) TEXT libc_getpid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpid(SB) - GLOBL ·libc_getpid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpid_trampoline_addr(SB)/8, $libc_getpid_trampoline<>(SB) TEXT libc_getppid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getppid(SB) - GLOBL ·libc_getppid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getppid_trampoline_addr(SB)/8, $libc_getppid_trampoline<>(SB) TEXT libc_getpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getpriority(SB) - GLOBL ·libc_getpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_getpriority_trampoline_addr(SB)/8, $libc_getpriority_trampoline<>(SB) TEXT libc_getrlimit_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrlimit(SB) - GLOBL ·libc_getrlimit_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrlimit_trampoline_addr(SB)/8, $libc_getrlimit_trampoline<>(SB) TEXT libc_getrusage_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getrusage(SB) - GLOBL ·libc_getrusage_trampoline_addr(SB), RODATA, $8 DATA ·libc_getrusage_trampoline_addr(SB)/8, $libc_getrusage_trampoline<>(SB) TEXT libc_getsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getsid(SB) - GLOBL ·libc_getsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getsid_trampoline_addr(SB)/8, $libc_getsid_trampoline<>(SB) TEXT libc_gettimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) - GLOBL ·libc_gettimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_gettimeofday_trampoline_addr(SB)/8, $libc_gettimeofday_trampoline<>(SB) TEXT libc_getuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getuid(SB) - GLOBL ·libc_getuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_getuid_trampoline_addr(SB)/8, $libc_getuid_trampoline<>(SB) TEXT libc_issetugid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_issetugid(SB) - GLOBL ·libc_issetugid_trampoline_addr(SB), RODATA, $8 DATA ·libc_issetugid_trampoline_addr(SB)/8, $libc_issetugid_trampoline<>(SB) TEXT libc_kqueue_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_kqueue(SB) - GLOBL ·libc_kqueue_trampoline_addr(SB), RODATA, $8 DATA ·libc_kqueue_trampoline_addr(SB)/8, $libc_kqueue_trampoline<>(SB) TEXT libc_lchown_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lchown(SB) - GLOBL ·libc_lchown_trampoline_addr(SB), RODATA, $8 DATA ·libc_lchown_trampoline_addr(SB)/8, $libc_lchown_trampoline<>(SB) TEXT libc_link_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_link(SB) - GLOBL ·libc_link_trampoline_addr(SB), RODATA, $8 DATA ·libc_link_trampoline_addr(SB)/8, $libc_link_trampoline<>(SB) TEXT libc_linkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_linkat(SB) - GLOBL ·libc_linkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_linkat_trampoline_addr(SB)/8, $libc_linkat_trampoline<>(SB) TEXT libc_listen_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_listen(SB) - GLOBL ·libc_listen_trampoline_addr(SB), RODATA, $8 DATA ·libc_listen_trampoline_addr(SB)/8, $libc_listen_trampoline<>(SB) TEXT libc_mkdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdir(SB) - GLOBL ·libc_mkdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdir_trampoline_addr(SB)/8, $libc_mkdir_trampoline<>(SB) TEXT libc_mkdirat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkdirat(SB) - GLOBL ·libc_mkdirat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkdirat_trampoline_addr(SB)/8, $libc_mkdirat_trampoline<>(SB) TEXT libc_mkfifo_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mkfifo(SB) - GLOBL ·libc_mkfifo_trampoline_addr(SB), RODATA, $8 DATA ·libc_mkfifo_trampoline_addr(SB)/8, $libc_mkfifo_trampoline<>(SB) TEXT libc_mknod_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mknod(SB) - GLOBL ·libc_mknod_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknod_trampoline_addr(SB)/8, $libc_mknod_trampoline<>(SB) TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mount(SB) - GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) TEXT libc_open_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_open(SB) - GLOBL ·libc_open_trampoline_addr(SB), RODATA, $8 DATA ·libc_open_trampoline_addr(SB)/8, $libc_open_trampoline<>(SB) TEXT libc_openat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_openat(SB) - GLOBL ·libc_openat_trampoline_addr(SB), RODATA, $8 DATA ·libc_openat_trampoline_addr(SB)/8, $libc_openat_trampoline<>(SB) TEXT libc_pathconf_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pathconf(SB) - GLOBL ·libc_pathconf_trampoline_addr(SB), RODATA, $8 DATA ·libc_pathconf_trampoline_addr(SB)/8, $libc_pathconf_trampoline<>(SB) TEXT libc_pread_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pread(SB) - GLOBL ·libc_pread_trampoline_addr(SB), RODATA, $8 DATA ·libc_pread_trampoline_addr(SB)/8, $libc_pread_trampoline<>(SB) TEXT libc_pwrite_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) - GLOBL ·libc_pwrite_trampoline_addr(SB), RODATA, $8 DATA ·libc_pwrite_trampoline_addr(SB)/8, $libc_pwrite_trampoline<>(SB) TEXT libc_read_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_read(SB) - GLOBL ·libc_read_trampoline_addr(SB), RODATA, $8 DATA ·libc_read_trampoline_addr(SB)/8, $libc_read_trampoline<>(SB) TEXT libc_readlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) - GLOBL ·libc_readlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlink_trampoline_addr(SB)/8, $libc_readlink_trampoline<>(SB) TEXT libc_readlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_readlinkat(SB) - GLOBL ·libc_readlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_readlinkat_trampoline_addr(SB)/8, $libc_readlinkat_trampoline<>(SB) TEXT libc_rename_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rename(SB) - GLOBL ·libc_rename_trampoline_addr(SB), RODATA, $8 DATA ·libc_rename_trampoline_addr(SB)/8, $libc_rename_trampoline<>(SB) TEXT libc_renameat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_renameat(SB) - GLOBL ·libc_renameat_trampoline_addr(SB), RODATA, $8 DATA ·libc_renameat_trampoline_addr(SB)/8, $libc_renameat_trampoline<>(SB) TEXT libc_revoke_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_revoke(SB) - GLOBL ·libc_revoke_trampoline_addr(SB), RODATA, $8 DATA ·libc_revoke_trampoline_addr(SB)/8, $libc_revoke_trampoline<>(SB) TEXT libc_rmdir_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_rmdir(SB) - GLOBL ·libc_rmdir_trampoline_addr(SB), RODATA, $8 DATA ·libc_rmdir_trampoline_addr(SB)/8, $libc_rmdir_trampoline<>(SB) TEXT libc_lseek_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lseek(SB) - GLOBL ·libc_lseek_trampoline_addr(SB), RODATA, $8 DATA ·libc_lseek_trampoline_addr(SB)/8, $libc_lseek_trampoline<>(SB) TEXT libc_select_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_select(SB) - GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) @@ -712,192 +595,160 @@ DATA ·libc_setattrlist_trampoline_addr(SB)/8, $libc_setattrlist_trampoline<>(SB TEXT libc_setegid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setegid(SB) - GLOBL ·libc_setegid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setegid_trampoline_addr(SB)/8, $libc_setegid_trampoline<>(SB) TEXT libc_seteuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_seteuid(SB) - GLOBL ·libc_seteuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_seteuid_trampoline_addr(SB)/8, $libc_seteuid_trampoline<>(SB) TEXT libc_setgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setgid(SB) - GLOBL ·libc_setgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setgid_trampoline_addr(SB)/8, $libc_setgid_trampoline<>(SB) TEXT libc_setlogin_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setlogin(SB) - GLOBL ·libc_setlogin_trampoline_addr(SB), RODATA, $8 DATA ·libc_setlogin_trampoline_addr(SB)/8, $libc_setlogin_trampoline<>(SB) TEXT libc_setpgid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpgid(SB) - GLOBL ·libc_setpgid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpgid_trampoline_addr(SB)/8, $libc_setpgid_trampoline<>(SB) TEXT libc_setpriority_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setpriority(SB) - GLOBL ·libc_setpriority_trampoline_addr(SB), RODATA, $8 DATA ·libc_setpriority_trampoline_addr(SB)/8, $libc_setpriority_trampoline<>(SB) TEXT libc_setprivexec_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setprivexec(SB) - GLOBL ·libc_setprivexec_trampoline_addr(SB), RODATA, $8 DATA ·libc_setprivexec_trampoline_addr(SB)/8, $libc_setprivexec_trampoline<>(SB) TEXT libc_setregid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setregid(SB) - GLOBL ·libc_setregid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setregid_trampoline_addr(SB)/8, $libc_setregid_trampoline<>(SB) TEXT libc_setreuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setreuid(SB) - GLOBL ·libc_setreuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setreuid_trampoline_addr(SB)/8, $libc_setreuid_trampoline<>(SB) TEXT libc_setsid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setsid(SB) - GLOBL ·libc_setsid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setsid_trampoline_addr(SB)/8, $libc_setsid_trampoline<>(SB) TEXT libc_settimeofday_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_settimeofday(SB) - GLOBL ·libc_settimeofday_trampoline_addr(SB), RODATA, $8 DATA ·libc_settimeofday_trampoline_addr(SB)/8, $libc_settimeofday_trampoline<>(SB) TEXT libc_setuid_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_setuid(SB) - GLOBL ·libc_setuid_trampoline_addr(SB), RODATA, $8 DATA ·libc_setuid_trampoline_addr(SB)/8, $libc_setuid_trampoline<>(SB) TEXT libc_symlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlink(SB) - GLOBL ·libc_symlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlink_trampoline_addr(SB)/8, $libc_symlink_trampoline<>(SB) TEXT libc_symlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_symlinkat(SB) - GLOBL ·libc_symlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_symlinkat_trampoline_addr(SB)/8, $libc_symlinkat_trampoline<>(SB) TEXT libc_sync_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sync(SB) - GLOBL ·libc_sync_trampoline_addr(SB), RODATA, $8 DATA ·libc_sync_trampoline_addr(SB)/8, $libc_sync_trampoline<>(SB) TEXT libc_truncate_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_truncate(SB) - GLOBL ·libc_truncate_trampoline_addr(SB), RODATA, $8 DATA ·libc_truncate_trampoline_addr(SB)/8, $libc_truncate_trampoline<>(SB) TEXT libc_umask_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_umask(SB) - GLOBL ·libc_umask_trampoline_addr(SB), RODATA, $8 DATA ·libc_umask_trampoline_addr(SB)/8, $libc_umask_trampoline<>(SB) TEXT libc_undelete_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_undelete(SB) - GLOBL ·libc_undelete_trampoline_addr(SB), RODATA, $8 DATA ·libc_undelete_trampoline_addr(SB)/8, $libc_undelete_trampoline<>(SB) TEXT libc_unlink_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlink(SB) - GLOBL ·libc_unlink_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlink_trampoline_addr(SB)/8, $libc_unlink_trampoline<>(SB) TEXT libc_unlinkat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unlinkat(SB) - GLOBL ·libc_unlinkat_trampoline_addr(SB), RODATA, $8 DATA ·libc_unlinkat_trampoline_addr(SB)/8, $libc_unlinkat_trampoline<>(SB) TEXT libc_unmount_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) - GLOBL ·libc_unmount_trampoline_addr(SB), RODATA, $8 DATA ·libc_unmount_trampoline_addr(SB)/8, $libc_unmount_trampoline<>(SB) TEXT libc_write_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_write(SB) - GLOBL ·libc_write_trampoline_addr(SB), RODATA, $8 DATA ·libc_write_trampoline_addr(SB)/8, $libc_write_trampoline<>(SB) TEXT libc_mmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) - GLOBL ·libc_mmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_mmap_trampoline_addr(SB)/8, $libc_mmap_trampoline<>(SB) TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_munmap(SB) - GLOBL ·libc_munmap_trampoline_addr(SB), RODATA, $8 DATA ·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB) TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstat(SB) - GLOBL ·libc_fstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstat_trampoline_addr(SB)/8, $libc_fstat_trampoline<>(SB) TEXT libc_fstatat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatat(SB) - GLOBL ·libc_fstatat_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatat_trampoline_addr(SB)/8, $libc_fstatat_trampoline<>(SB) TEXT libc_fstatfs_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_fstatfs(SB) - GLOBL ·libc_fstatfs_trampoline_addr(SB), RODATA, $8 DATA ·libc_fstatfs_trampoline_addr(SB)/8, $libc_fstatfs_trampoline<>(SB) TEXT libc_getfsstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_getfsstat(SB) - GLOBL ·libc_getfsstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_getfsstat_trampoline_addr(SB)/8, $libc_getfsstat_trampoline<>(SB) TEXT libc_lstat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_lstat(SB) - GLOBL ·libc_lstat_trampoline_addr(SB), RODATA, $8 DATA ·libc_lstat_trampoline_addr(SB)/8, $libc_lstat_trampoline<>(SB) TEXT libc_ptrace_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ptrace(SB) - GLOBL ·libc_ptrace_trampoline_addr(SB), RODATA, $8 DATA ·libc_ptrace_trampoline_addr(SB)/8, $libc_ptrace_trampoline<>(SB) TEXT libc_stat_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_stat(SB) - GLOBL ·libc_stat_trampoline_addr(SB), RODATA, $8 DATA ·libc_stat_trampoline_addr(SB)/8, $libc_stat_trampoline<>(SB) TEXT libc_statfs_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_statfs(SB) - GLOBL ·libc_statfs_trampoline_addr(SB), RODATA, $8 DATA ·libc_statfs_trampoline_addr(SB)/8, $libc_statfs_trampoline<>(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 0eabac7ad..0c67df64a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1642,28 +1642,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index ee313eb00..e6e05d145 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index 4c986e448..7508accac 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index 555216944..7b56aead4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go index 67a226fbf..cc623dcaa 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go index f0b9ddaaa..581849197 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_riscv64.go @@ -1862,28 +1862,6 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go index b57c7050d..6be25cd19 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go @@ -40,7 +40,7 @@ func readv(fd int, iovs []Iovec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procreadv)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -55,7 +55,7 @@ func preadv(fd int, iovs []Iovec, off int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpreadv)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), uintptr(off), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -70,7 +70,7 @@ func writev(fd int, iovs []Iovec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwritev)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -85,7 +85,7 @@ func pwritev(fd int, iovs []Iovec, off int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwritev)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovs)), uintptr(off), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -96,7 +96,7 @@ func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept4)), 4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 722c29a00..1ff3aec74 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1356,7 +1356,7 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { +func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { @@ -1734,28 +1734,6 @@ func exitThread(code int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, p *byte, np int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, p *byte, np int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func readv(fd int, iovs []Iovec) (n int, err error) { var _p0 unsafe.Pointer if len(iovs) > 0 { @@ -1868,6 +1846,17 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldaddr), uintptr(oldlength), uintptr(newlength), uintptr(flags), uintptr(newaddr), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { @@ -2186,3 +2175,23 @@ func getresgid(rgid *_C_int, egid *_C_int, sgid *_C_int) { RawSyscallNoError(SYS_GETRESGID, uintptr(unsafe.Pointer(rgid)), uintptr(unsafe.Pointer(egid)), uintptr(unsafe.Pointer(sgid))) return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func schedSetattr(pid int, attr *SchedAttr, flags uint) (err error) { + _, _, e1 := Syscall(SYS_SCHED_SETATTR, uintptr(pid), uintptr(unsafe.Pointer(attr)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func schedGetattr(pid int, attr *SchedAttr, size uint, flags uint) (err error) { + _, _, e1 := Syscall6(SYS_SCHED_GETATTR, uintptr(pid), uintptr(unsafe.Pointer(attr)), uintptr(size), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 0b2923958..0ab4f2ed7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -531,3 +531,19 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) { + var _p0 unsafe.Pointer + if len(pairs) > 0 { + _p0 = unsafe.Pointer(&pairs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_RISCV_HWPROBE, uintptr(_p0), uintptr(len(pairs)), uintptr(cpuCount), uintptr(unsafe.Pointer(cpus)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index cdb2af5ae..2df3c5bac 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 9d25f76b0..a60556bab 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index d3f803516..9f788917a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 887188a52..82a4cb2dc 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1824,20 +1824,13 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -1846,13 +1839,9 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 9ab9abf72..66b3b6456 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 915761eab..c5c4cc112 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -2213,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index 8e87fdf15..93bfbb328 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 12a7a2160..a107b8fda 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index b19e8aa03..c427de509 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index fb99594c9..60c1a99ae 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 32cbbbc52..52eba360f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -549,6 +549,12 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { return } +var libc_ioctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { _, _, e1 := syscall_syscall(libc_ioctl_trampoline_addr, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { @@ -557,10 +563,6 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { return } -var libc_ioctl_trampoline_addr uintptr - -//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" - // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -2211,28 +2213,6 @@ var libc_munmap_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_read_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(libc_write_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 609d1c598..b40189464 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -436,7 +436,7 @@ func pipe(p *[2]_C_int) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -446,7 +446,7 @@ func pipe(p *[2]_C_int) (n int, err error) { func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -456,7 +456,7 @@ func pipe2(p *[2]_C_int, flags int) (err error) { func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -471,7 +471,7 @@ func Getcwd(buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -482,7 +482,7 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -492,7 +492,7 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func setgroups(ngid int, gid *_Gid_t) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -503,7 +503,7 @@ func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int32(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -518,7 +518,7 @@ func gethostname(buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -533,7 +533,7 @@ func utimes(path string, times *[2]Timeval) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -548,7 +548,7 @@ func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -559,7 +559,7 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -569,7 +569,7 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -580,7 +580,7 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -591,7 +591,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -602,7 +602,7 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -612,7 +612,7 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func acct(path *byte) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -647,7 +647,7 @@ func ioctlRet(fd int, req int, arg uintptr) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -658,7 +658,7 @@ func ioctlPtrRet(fd int, req int, arg unsafe.Pointer) (ret int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) ret = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -669,7 +669,7 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -684,7 +684,7 @@ func Access(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -694,7 +694,7 @@ func Access(path string, mode uint32) (err error) { func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -709,7 +709,7 @@ func Chdir(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -724,7 +724,7 @@ func Chmod(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -739,7 +739,7 @@ func Chown(path string, uid int, gid int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -754,7 +754,7 @@ func Chroot(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -764,7 +764,7 @@ func Chroot(path string) (err error) { func ClockGettime(clockid int32, time *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClockGettime)), 2, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -774,7 +774,7 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func Close(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -790,7 +790,7 @@ func Creat(path string, mode uint32) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -801,7 +801,7 @@ func Dup(fd int) (nfd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) nfd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -811,7 +811,7 @@ func Dup(fd int) (nfd int, err error) { func Dup2(oldfd int, newfd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -833,7 +833,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFaccessat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -843,7 +843,7 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func Fchdir(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -853,7 +853,7 @@ func Fchdir(fd int) (err error) { func Fchmod(fd int, mode uint32) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -868,7 +868,7 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -878,7 +878,7 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -893,7 +893,7 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -903,7 +903,7 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func Fdatasync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -913,7 +913,7 @@ func Fdatasync(fd int) (err error) { func Flock(fd int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -924,7 +924,7 @@ func Fpathconf(fd int, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -934,7 +934,7 @@ func Fpathconf(fd int, name int) (val int, err error) { func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -949,7 +949,7 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -959,7 +959,7 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -974,7 +974,7 @@ func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1001,7 +1001,7 @@ func Getpgid(pid int) (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1012,7 +1012,7 @@ func Getpgrp() (pgid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) pgid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1047,7 +1047,7 @@ func Getpriority(which int, who int) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1057,7 +1057,7 @@ func Getpriority(which int, who int) (n int, err error) { func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1067,7 +1067,7 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1078,7 +1078,7 @@ func Getsid(pid int) (sid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetsid)), 1, uintptr(pid), 0, 0, 0, 0, 0) sid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1088,7 +1088,7 @@ func Getsid(pid int) (sid int, err error) { func Gettimeofday(tv *Timeval) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1106,7 +1106,7 @@ func Getuid() (uid int) { func Kill(pid int, signum syscall.Signal) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1121,7 +1121,7 @@ func Lchown(path string, uid int, gid int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1141,7 +1141,7 @@ func Link(path string, link string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1151,7 +1151,7 @@ func Link(path string, link string) (err error) { func Listen(s int, backlog int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1166,7 +1166,7 @@ func Lstat(path string, stat *Stat_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1180,7 +1180,7 @@ func Madvise(b []byte, advice int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1195,7 +1195,7 @@ func Mkdir(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1210,7 +1210,7 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1225,7 +1225,7 @@ func Mkfifo(path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1240,7 +1240,7 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1255,7 +1255,7 @@ func Mknod(path string, mode uint32, dev int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1270,7 +1270,7 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1284,7 +1284,7 @@ func Mlock(b []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1294,7 +1294,7 @@ func Mlock(b []byte) (err error) { func Mlockall(flags int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1308,7 +1308,7 @@ func Mprotect(b []byte, prot int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1322,7 +1322,7 @@ func Msync(b []byte, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1336,7 +1336,7 @@ func Munlock(b []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1346,7 +1346,7 @@ func Munlock(b []byte) (err error) { func Munlockall() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1356,7 +1356,7 @@ func Munlockall() (err error) { func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1372,7 +1372,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1388,7 +1388,7 @@ func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1404,7 +1404,7 @@ func Pathconf(path string, name int) (val int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) val = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1414,7 +1414,7 @@ func Pathconf(path string, name int) (val int, err error) { func Pause() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1429,7 +1429,7 @@ func pread(fd int, p []byte, offset int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1444,7 +1444,7 @@ func pwrite(fd int, p []byte, offset int64) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1459,7 +1459,7 @@ func read(fd int, p []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1479,7 +1479,7 @@ func Readlink(path string, buf []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1499,7 +1499,7 @@ func Rename(from string, to string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1519,7 +1519,7 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1534,7 +1534,7 @@ func Rmdir(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1545,7 +1545,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) newoffset = int64(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1556,7 +1556,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1566,7 +1566,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func Setegid(egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1576,7 +1576,7 @@ func Setegid(egid int) (err error) { func Seteuid(euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1586,7 +1586,7 @@ func Seteuid(euid int) (err error) { func Setgid(gid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1600,7 +1600,7 @@ func Sethostname(p []byte) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1610,7 +1610,7 @@ func Sethostname(p []byte) (err error) { func Setpgid(pid int, pgid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1620,7 +1620,7 @@ func Setpgid(pid int, pgid int) (err error) { func Setpriority(which int, who int, prio int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1630,7 +1630,7 @@ func Setpriority(which int, who int, prio int) (err error) { func Setregid(rgid int, egid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1640,7 +1640,7 @@ func Setregid(rgid int, egid int) (err error) { func Setreuid(ruid int, euid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1651,7 +1651,7 @@ func Setsid() (pid int, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) pid = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1661,7 +1661,7 @@ func Setsid() (pid int, err error) { func Setuid(uid int) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1671,7 +1671,7 @@ func Setuid(uid int) (err error) { func Shutdown(s int, how int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1686,7 +1686,7 @@ func Stat(path string, stat *Stat_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1701,7 +1701,7 @@ func Statvfs(path string, vfsstat *Statvfs_t) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1721,7 +1721,7 @@ func Symlink(path string, link string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1731,7 +1731,7 @@ func Symlink(path string, link string) (err error) { func Sync() (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1742,7 +1742,7 @@ func Sysconf(which int) (n int64, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSysconf)), 1, uintptr(which), 0, 0, 0, 0, 0) n = int64(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1753,7 +1753,7 @@ func Times(tms *Tms) (ticks uintptr, err error) { r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) ticks = uintptr(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1768,7 +1768,7 @@ func Truncate(path string, length int64) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1778,7 +1778,7 @@ func Truncate(path string, length int64) (err error) { func Fsync(fd int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1788,7 +1788,7 @@ func Fsync(fd int) (err error) { func Ftruncate(fd int, length int64) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1806,7 +1806,7 @@ func Umask(mask int) (oldmask int) { func Uname(buf *Utsname) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1821,7 +1821,7 @@ func Unmount(target string, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1836,7 +1836,7 @@ func Unlink(path string) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1851,7 +1851,7 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1861,7 +1861,7 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func Ustat(dev int, ubuf *Ustat_t) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1876,7 +1876,7 @@ func Utime(path string, buf *Utimbuf) (err error) { } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1886,7 +1886,7 @@ func Utime(path string, buf *Utimbuf) (err error) { func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1896,7 +1896,7 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1907,7 +1907,7 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1917,7 +1917,7 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func munmap(addr uintptr, length uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1928,7 +1928,7 @@ func sendfile(outfd int, infd int, offset *int64, count int) (written int, err e r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendfile)), 4, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1942,7 +1942,7 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1953,7 +1953,7 @@ func socket(domain int, typ int, proto int) (fd int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) fd = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1963,7 +1963,7 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1978,7 +1978,7 @@ func write(fd int, p []byte) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1988,7 +1988,7 @@ func write(fd int, p []byte) (n int, err error) { func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -1998,7 +1998,7 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2008,7 +2008,7 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2023,7 +2023,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2034,7 +2034,7 @@ func port_create() (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_create)), 0, 0, 0, 0, 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2045,7 +2045,7 @@ func port_associate(port int, source int, object uintptr, events int, user *byte r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_associate)), 5, uintptr(port), uintptr(source), uintptr(object), uintptr(events), uintptr(unsafe.Pointer(user)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2056,7 +2056,7 @@ func port_dissociate(port int, source int, object uintptr) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_dissociate)), 3, uintptr(port), uintptr(source), uintptr(object), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2067,7 +2067,7 @@ func port_get(port int, pe *portEvent, timeout *Timespec) (n int, err error) { r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_get)), 3, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(unsafe.Pointer(timeout)), 0, 0, 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2078,7 +2078,7 @@ func port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Times r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_getn)), 5, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(max), uintptr(unsafe.Pointer(nget)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2088,7 +2088,7 @@ func port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Times func putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procputmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(flags), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } @@ -2098,7 +2098,7 @@ func putmsg(fd int, clptr *strbuf, dataptr *strbuf, flags int) (err error) { func getmsg(fd int, clptr *strbuf, dataptr *strbuf, flags *int) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetmsg)), 4, uintptr(fd), uintptr(unsafe.Pointer(clptr)), uintptr(unsafe.Pointer(dataptr)), uintptr(unsafe.Pointer(flags)), 0, 0) if e1 != 0 { - err = e1 + err = errnoErr(e1) } return } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go index c31681743..1d8fe1d4b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_zos_s390x.go @@ -40,17 +40,6 @@ func read(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall_syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func write(fd int, p []byte) (n int, err error) { var _p0 unsafe.Pointer if len(p) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index c9c4ad031..9862853d3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -447,4 +447,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 12ff3417c..8901f0f4e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -369,4 +369,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index c3fb5e77a..6902c37ee 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -411,4 +411,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 358c847a4..a6d3dff81 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -314,4 +314,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index 81c4849b1..b18f3f710 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -308,4 +308,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 202a57e90..0302e5e3d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -431,4 +431,5 @@ const ( SYS_PROCESS_MRELEASE = 4448 SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 + SYS_CACHESTAT = 4451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 1fbceb52d..6693ba4a0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -361,4 +361,5 @@ const ( SYS_PROCESS_MRELEASE = 5448 SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 + SYS_CACHESTAT = 5451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index b4ffb7a20..fd93f4987 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -361,4 +361,5 @@ const ( SYS_PROCESS_MRELEASE = 5448 SYS_FUTEX_WAITV = 5449 SYS_SET_MEMPOLICY_HOME_NODE = 5450 + SYS_CACHESTAT = 5451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 867985f9b..760ddcadc 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -431,4 +431,5 @@ const ( SYS_PROCESS_MRELEASE = 4448 SYS_FUTEX_WAITV = 4449 SYS_SET_MEMPOLICY_HOME_NODE = 4450 + SYS_CACHESTAT = 4451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index a8cce69ed..cff2b2555 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -438,4 +438,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index d44c5b39d..a4b2405d0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -410,4 +410,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 4214dd9c0..aca54b4e3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -410,4 +410,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 3e594a8c0..9d1738d64 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -251,6 +251,8 @@ const ( SYS_ACCEPT4 = 242 SYS_RECVMMSG = 243 SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_RISCV_HWPROBE = 258 + SYS_RISCV_FLUSH_ICACHE = 259 SYS_WAIT4 = 260 SYS_PRLIMIT64 = 261 SYS_FANOTIFY_INIT = 262 @@ -313,4 +315,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 7ea465204..022878dc8 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -372,7 +372,9 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 92f628ef4..4100a761c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -389,4 +389,5 @@ const ( SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 + SYS_CACHESTAT = 451 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 00c3b8c20..18aa70b42 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -866,6 +866,11 @@ const ( POLLNVAL = 0x20 ) +type sigset_argpack struct { + ss *Sigset_t + ssLen uintptr +} + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1538,6 +1543,10 @@ const ( IFLA_GRO_MAX_SIZE = 0x3a IFLA_TSO_MAX_SIZE = 0x3b IFLA_TSO_MAX_SEGS = 0x3c + IFLA_ALLMULTI = 0x3d + IFLA_DEVLINK_PORT = 0x3e + IFLA_GSO_IPV4_MAX_SIZE = 0x3f + IFLA_GRO_IPV4_MAX_SIZE = 0x40 IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -1968,7 +1977,7 @@ const ( NFT_MSG_GETFLOWTABLE = 0x17 NFT_MSG_DELFLOWTABLE = 0x18 NFT_MSG_GETRULE_RESET = 0x19 - NFT_MSG_MAX = 0x1a + NFT_MSG_MAX = 0x22 NFTA_LIST_UNSPEC = 0x0 NFTA_LIST_ELEM = 0x1 NFTA_HOOK_UNSPEC = 0x0 @@ -3651,7 +3660,7 @@ const ( ETHTOOL_MSG_PSE_GET = 0x24 ETHTOOL_MSG_PSE_SET = 0x25 ETHTOOL_MSG_RSS_GET = 0x26 - ETHTOOL_MSG_USER_MAX = 0x26 + ETHTOOL_MSG_USER_MAX = 0x2b ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3691,7 +3700,7 @@ const ( ETHTOOL_MSG_MODULE_NTF = 0x24 ETHTOOL_MSG_PSE_GET_REPLY = 0x25 ETHTOOL_MSG_RSS_GET_REPLY = 0x26 - ETHTOOL_MSG_KERNEL_MAX = 0x26 + ETHTOOL_MSG_KERNEL_MAX = 0x2b ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3795,7 +3804,7 @@ const ( ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb ETHTOOL_A_RINGS_CQE_SIZE = 0xc ETHTOOL_A_RINGS_TX_PUSH = 0xd - ETHTOOL_A_RINGS_MAX = 0xd + ETHTOOL_A_RINGS_MAX = 0x10 ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -3833,14 +3842,14 @@ const ( ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 - ETHTOOL_A_COALESCE_MAX = 0x19 + ETHTOOL_A_COALESCE_MAX = 0x1c ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 ETHTOOL_A_PAUSE_RX = 0x3 ETHTOOL_A_PAUSE_TX = 0x4 ETHTOOL_A_PAUSE_STATS = 0x5 - ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x6 ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 ETHTOOL_A_PAUSE_STAT_PAD = 0x1 ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 @@ -4490,7 +4499,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x141 + NL80211_ATTR_MAX = 0x146 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4719,7 +4728,7 @@ const ( NL80211_BAND_ATTR_HT_CAPA = 0x4 NL80211_BAND_ATTR_HT_MCS_SET = 0x3 NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 - NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_MAX = 0xd NL80211_BAND_ATTR_RATES = 0x2 NL80211_BAND_ATTR_VHT_CAPA = 0x8 NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 @@ -4860,7 +4869,7 @@ const ( NL80211_CMD_LEAVE_IBSS = 0x2c NL80211_CMD_LEAVE_MESH = 0x45 NL80211_CMD_LEAVE_OCB = 0x6d - NL80211_CMD_MAX = 0x98 + NL80211_CMD_MAX = 0x9a NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 NL80211_CMD_MODIFY_LINK_STA = 0x97 NL80211_CMD_NAN_MATCH = 0x78 @@ -5494,7 +5503,7 @@ const ( NL80211_RATE_INFO_HE_RU_ALLOC_52 = 0x1 NL80211_RATE_INFO_HE_RU_ALLOC_996 = 0x5 NL80211_RATE_INFO_HE_RU_ALLOC = 0x11 - NL80211_RATE_INFO_MAX = 0x16 + NL80211_RATE_INFO_MAX = 0x1d NL80211_RATE_INFO_MCS = 0x2 NL80211_RATE_INFO_SHORT_GI = 0x4 NL80211_RATE_INFO_VHT_MCS = 0x6 @@ -5841,6 +5850,8 @@ const ( TUN_F_TSO6 = 0x4 TUN_F_TSO_ECN = 0x8 TUN_F_UFO = 0x10 + TUN_F_USO4 = 0x20 + TUN_F_USO6 = 0x40 ) const ( @@ -5850,9 +5861,25 @@ const ( ) const ( - VIRTIO_NET_HDR_GSO_NONE = 0x0 - VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 - VIRTIO_NET_HDR_GSO_UDP = 0x3 - VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 - VIRTIO_NET_HDR_GSO_ECN = 0x80 + VIRTIO_NET_HDR_GSO_NONE = 0x0 + VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 + VIRTIO_NET_HDR_GSO_UDP = 0x3 + VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 + VIRTIO_NET_HDR_GSO_UDP_L4 = 0x5 + VIRTIO_NET_HDR_GSO_ECN = 0x80 ) + +type SchedAttr struct { + Size uint32 + Policy uint32 + Flags uint64 + Nice int32 + Priority uint32 + Runtime uint64 + Deadline uint64 + Period uint64 + Util_min uint32 + Util_max uint32 +} + +const SizeofSchedAttr = 0x38 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4ecc1495c..6d8acbcc5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -337,6 +337,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 34fddff96..59293c688 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -350,6 +350,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 3b14a6031..40cfa38c2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -328,6 +328,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0517651ab..055bc4216 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -329,6 +329,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 3b0c51813..f28affbc6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -330,6 +330,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index fccdf4dd0..9d71e7ccd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 500de8fc0..fd5ccd332 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index d0434cd2c..7704de77a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 84206ba53..df00b8757 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index ab078cf1f..0942840db 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -340,6 +340,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 42eb2c4ce..034874395 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 31304a4e8..bad067047 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c311f9612..1b4c97c32 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -357,6 +357,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 @@ -716,3 +718,30 @@ type SysvShmDesc struct { _ uint64 _ uint64 } + +type RISCVHWProbePairs struct { + Key int64 + Value uint64 +} + +const ( + RISCV_HWPROBE_KEY_MVENDORID = 0x0 + RISCV_HWPROBE_KEY_MARCHID = 0x1 + RISCV_HWPROBE_KEY_MIMPID = 0x2 + RISCV_HWPROBE_KEY_BASE_BEHAVIOR = 0x3 + RISCV_HWPROBE_BASE_BEHAVIOR_IMA = 0x1 + RISCV_HWPROBE_KEY_IMA_EXT_0 = 0x4 + RISCV_HWPROBE_IMA_FD = 0x1 + RISCV_HWPROBE_IMA_C = 0x2 + RISCV_HWPROBE_IMA_V = 0x4 + RISCV_HWPROBE_EXT_ZBA = 0x8 + RISCV_HWPROBE_EXT_ZBB = 0x10 + RISCV_HWPROBE_EXT_ZBS = 0x20 + RISCV_HWPROBE_KEY_CPUPERF_0 = 0x5 + RISCV_HWPROBE_MISALIGNED_UNKNOWN = 0x0 + RISCV_HWPROBE_MISALIGNED_EMULATED = 0x1 + RISCV_HWPROBE_MISALIGNED_SLOW = 0x2 + RISCV_HWPROBE_MISALIGNED_FAST = 0x3 + RISCV_HWPROBE_MISALIGNED_UNSUPPORTED = 0x4 + RISCV_HWPROBE_MISALIGNED_MASK = 0x7 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index bba3cefac..aa268d025 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -352,6 +352,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index ad8a01380..444045b6c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -334,6 +334,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go index a52e0331d..9cabbb694 100644 --- a/vendor/golang.org/x/sys/windows/exec_windows.go +++ b/vendor/golang.org/x/sys/windows/exec_windows.go @@ -22,7 +22,7 @@ import ( // but only if there is space or tab inside s. func EscapeArg(s string) string { if len(s) == 0 { - return "\"\"" + return `""` } n := len(s) hasSpace := false @@ -35,7 +35,7 @@ func EscapeArg(s string) string { } } if hasSpace { - n += 2 + n += 2 // Reserve space for quotes. } if n == len(s) { return s @@ -82,20 +82,68 @@ func EscapeArg(s string) string { // in CreateProcess's CommandLine argument, CreateService/ChangeServiceConfig's BinaryPathName argument, // or any program that uses CommandLineToArgv. func ComposeCommandLine(args []string) string { - var commandLine string - for i := range args { - if i > 0 { - commandLine += " " + if len(args) == 0 { + return "" + } + + // Per https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw: + // “This function accepts command lines that contain a program name; the + // program name can be enclosed in quotation marks or not.” + // + // Unfortunately, it provides no means of escaping interior quotation marks + // within that program name, and we have no way to report them here. + prog := args[0] + mustQuote := len(prog) == 0 + for i := 0; i < len(prog); i++ { + c := prog[i] + if c <= ' ' || (c == '"' && i == 0) { + // Force quotes for not only the ASCII space and tab as described in the + // MSDN article, but also ASCII control characters. + // The documentation for CommandLineToArgvW doesn't say what happens when + // the first argument is not a valid program name, but it empirically + // seems to drop unquoted control characters. + mustQuote = true + break + } + } + var commandLine []byte + if mustQuote { + commandLine = make([]byte, 0, len(prog)+2) + commandLine = append(commandLine, '"') + for i := 0; i < len(prog); i++ { + c := prog[i] + if c == '"' { + // This quote would interfere with our surrounding quotes. + // We have no way to report an error, so just strip out + // the offending character instead. + continue + } + commandLine = append(commandLine, c) } - commandLine += EscapeArg(args[i]) + commandLine = append(commandLine, '"') + } else { + if len(args) == 1 { + // args[0] is a valid command line representing itself. + // No need to allocate a new slice or string for it. + return prog + } + commandLine = []byte(prog) } - return commandLine + + for _, arg := range args[1:] { + commandLine = append(commandLine, ' ') + // TODO(bcmills): since we're already appending to a slice, it would be nice + // to avoid the intermediate allocations of EscapeArg. + // Perhaps we can factor out an appendEscapedArg function. + commandLine = append(commandLine, EscapeArg(arg)...) + } + return string(commandLine) } // DecomposeCommandLine breaks apart its argument command line into unescaped parts using CommandLineToArgv, // as gathered from GetCommandLine, QUERY_SERVICE_CONFIG's BinaryPathName argument, or elsewhere that // command lines are passed around. -// DecomposeCommandLine returns error if commandLine contains NUL. +// DecomposeCommandLine returns an error if commandLine contains NUL. func DecomposeCommandLine(commandLine string) ([]string, error) { if len(commandLine) == 0 { return []string{}, nil @@ -105,18 +153,35 @@ func DecomposeCommandLine(commandLine string) ([]string, error) { return nil, errorspkg.New("string with NUL passed to DecomposeCommandLine") } var argc int32 - argv, err := CommandLineToArgv(&utf16CommandLine[0], &argc) + argv, err := commandLineToArgv(&utf16CommandLine[0], &argc) if err != nil { return nil, err } defer LocalFree(Handle(unsafe.Pointer(argv))) + var args []string - for _, v := range (*argv)[:argc] { - args = append(args, UTF16ToString((*v)[:])) + for _, p := range unsafe.Slice(argv, argc) { + args = append(args, UTF16PtrToString(p)) } return args, nil } +// CommandLineToArgv parses a Unicode command line string and sets +// argc to the number of parsed arguments. +// +// The returned memory should be freed using a single call to LocalFree. +// +// Note that although the return type of CommandLineToArgv indicates 8192 +// entries of up to 8192 characters each, the actual count of parsed arguments +// may exceed 8192, and the documentation for CommandLineToArgvW does not mention +// any bound on the lengths of the individual argument strings. +// (See https://go.dev/issue/63236.) +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + argp, err := commandLineToArgv(cmd, argc) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(argp)) + return argv, err +} + func CloseOnExec(fd Handle) { SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) } diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index d414ef13b..26be94a8a 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -7,8 +7,6 @@ package windows import ( "syscall" "unsafe" - - "golang.org/x/sys/internal/unsafeheader" ) const ( @@ -1341,21 +1339,14 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() sdLen = min } - var src []byte - h := (*unsafeheader.Slice)(unsafe.Pointer(&src)) - h.Data = unsafe.Pointer(selfRelativeSD) - h.Len = sdLen - h.Cap = sdLen - + src := unsafe.Slice((*byte)(unsafe.Pointer(selfRelativeSD)), sdLen) + // SECURITY_DESCRIPTOR has pointers in it, which means checkptr expects for it to + // be aligned properly. When we're copying a Windows-allocated struct to a + // Go-allocated one, make sure that the Go allocation is aligned to the + // pointer size. const psize = int(unsafe.Sizeof(uintptr(0))) - - var dst []byte - h = (*unsafeheader.Slice)(unsafe.Pointer(&dst)) alloc := make([]uintptr, (sdLen+psize-1)/psize) - h.Data = (*unsafeheader.Slice)(unsafe.Pointer(&alloc)).Data - h.Len = sdLen - h.Cap = sdLen - + dst := unsafe.Slice((*byte)(unsafe.Pointer(&alloc[0])), sdLen) copy(dst, src) return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&dst[0])) } diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index c964b6848..c44a1b963 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -218,6 +218,10 @@ type SERVICE_FAILURE_ACTIONS struct { Actions *SC_ACTION } +type SERVICE_FAILURE_ACTIONS_FLAG struct { + FailureActionsOnNonCrashFailures int32 +} + type SC_ACTION struct { Type uint32 Delay uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 964590075..35cfc57ca 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -15,8 +15,6 @@ import ( "time" "unicode/utf16" "unsafe" - - "golang.org/x/sys/internal/unsafeheader" ) type Handle uintptr @@ -135,14 +133,14 @@ func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } @@ -216,7 +214,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) -//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys getStartupInfo(startupInfo *StartupInfo) = GetStartupInfoW //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] @@ -240,7 +238,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW //sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW //sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW -//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW //sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] //sys LocalAlloc(flags uint32, length uint32) (ptr uintptr, err error) //sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) @@ -299,12 +297,15 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue //sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId +//sys ClosePseudoConsole(console Handle) = kernel32.ClosePseudoConsole +//sys createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) = kernel32.CreatePseudoConsole //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo //sys setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot //sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW //sys Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW @@ -437,6 +438,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute //sys DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute +// Windows Multimedia API +//sys TimeBeginPeriod (period uint32) (err error) [failretval != 0] = winmm.timeBeginPeriod +//sys TimeEndPeriod (period uint32) (err error) [failretval != 0] = winmm.timeEndPeriod + // syscall interface implementation for other packages // GetCurrentProcess returns the handle for the current process. @@ -1624,6 +1629,11 @@ func SetConsoleCursorPosition(console Handle, position Coord) error { return setConsoleCursorPosition(console, *((*uint32)(unsafe.Pointer(&position)))) } +func GetStartupInfo(startupInfo *StartupInfo) error { + getStartupInfo(startupInfo) + return nil +} + func (s NTStatus) Errno() syscall.Errno { return rtlNtStatusToDosErrorNoTeb(s) } @@ -1658,12 +1668,8 @@ func NewNTUnicodeString(s string) (*NTUnicodeString, error) { // Slice returns a uint16 slice that aliases the data in the NTUnicodeString. func (s *NTUnicodeString) Slice() []uint16 { - var slice []uint16 - hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) - hdr.Data = unsafe.Pointer(s.Buffer) - hdr.Len = int(s.Length) - hdr.Cap = int(s.MaximumLength) - return slice + slice := unsafe.Slice(s.Buffer, s.MaximumLength) + return slice[:s.Length] } func (s *NTUnicodeString) String() string { @@ -1686,12 +1692,8 @@ func NewNTString(s string) (*NTString, error) { // Slice returns a byte slice that aliases the data in the NTString. func (s *NTString) Slice() []byte { - var slice []byte - hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice)) - hdr.Data = unsafe.Pointer(s.Buffer) - hdr.Len = int(s.Length) - hdr.Cap = int(s.MaximumLength) - return slice + slice := unsafe.Slice(s.Buffer, s.MaximumLength) + return slice[:s.Length] } func (s *NTString) String() string { @@ -1743,10 +1745,7 @@ func LoadResourceData(module, resInfo Handle) (data []byte, err error) { if err != nil { return } - h := (*unsafeheader.Slice)(unsafe.Pointer(&data)) - h.Data = unsafe.Pointer(ptr) - h.Len = int(size) - h.Cap = int(size) + data = unsafe.Slice((*byte)(unsafe.Pointer(ptr)), size) return } @@ -1817,3 +1816,17 @@ type PSAPI_WORKING_SET_EX_INFORMATION struct { // A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress. VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK } + +// CreatePseudoConsole creates a windows pseudo console. +func CreatePseudoConsole(size Coord, in Handle, out Handle, flags uint32, pconsole *Handle) error { + // We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only + // accept arguments that can be casted to uintptr, and Coord can't. + return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), in, out, flags, pconsole) +} + +// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`. +func ResizePseudoConsole(pconsole Handle, size Coord) error { + // We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only + // accept arguments that can be casted to uintptr, and Coord can't. + return resizePseudoConsole(pconsole, *((*uint32)(unsafe.Pointer(&size)))) +} diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 88e62a638..b88dc7c85 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -247,6 +247,7 @@ const ( PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY = 0x00020007 PROC_THREAD_ATTRIBUTE_UMS_THREAD = 0x00030006 PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL = 0x0002000b + PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x00020016 ) const ( @@ -2139,6 +2140,12 @@ const ( ENABLE_LVB_GRID_WORLDWIDE = 0x10 ) +// Pseudo console related constants used for the flags parameter to +// CreatePseudoConsole. See: https://learn.microsoft.com/en-us/windows/console/createpseudoconsole +const ( + PSEUDOCONSOLE_INHERIT_CURSOR = 0x1 +) + type Coord struct { X int16 Y int16 diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 566dd3e31..8b1688de4 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -55,6 +55,7 @@ var ( moduser32 = NewLazySystemDLL("user32.dll") moduserenv = NewLazySystemDLL("userenv.dll") modversion = NewLazySystemDLL("version.dll") + modwinmm = NewLazySystemDLL("winmm.dll") modwintrust = NewLazySystemDLL("wintrust.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") @@ -187,6 +188,7 @@ var ( procCancelIo = modkernel32.NewProc("CancelIo") procCancelIoEx = modkernel32.NewProc("CancelIoEx") procCloseHandle = modkernel32.NewProc("CloseHandle") + procClosePseudoConsole = modkernel32.NewProc("ClosePseudoConsole") procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe") procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") procCreateEventExW = modkernel32.NewProc("CreateEventExW") @@ -201,6 +203,7 @@ var ( procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW") procCreatePipe = modkernel32.NewProc("CreatePipe") procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procCreatePseudoConsole = modkernel32.NewProc("CreatePseudoConsole") procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") @@ -327,6 +330,7 @@ var ( procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") procResetEvent = modkernel32.NewProc("ResetEvent") + procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") procResumeThread = modkernel32.NewProc("ResumeThread") procSetCommTimeouts = modkernel32.NewProc("SetCommTimeouts") procSetConsoleCursorPosition = modkernel32.NewProc("SetConsoleCursorPosition") @@ -468,6 +472,8 @@ var ( procGetFileVersionInfoSizeW = modversion.NewProc("GetFileVersionInfoSizeW") procGetFileVersionInfoW = modversion.NewProc("GetFileVersionInfoW") procVerQueryValueW = modversion.NewProc("VerQueryValueW") + proctimeBeginPeriod = modwinmm.NewProc("timeBeginPeriod") + proctimeEndPeriod = modwinmm.NewProc("timeEndPeriod") procWinVerifyTrustEx = modwintrust.NewProc("WinVerifyTrustEx") procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") @@ -1630,6 +1636,11 @@ func CloseHandle(handle Handle) (err error) { return } +func ClosePseudoConsole(console Handle) { + syscall.Syscall(procClosePseudoConsole.Addr(), 1, uintptr(console), 0, 0) + return +} + func ConnectNamedPipe(pipe Handle, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(pipe), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { @@ -1759,6 +1770,14 @@ func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityA return } +func createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) { + r0, _, _ := syscall.Syscall6(procCreatePseudoConsole.Addr(), 5, uintptr(size), uintptr(in), uintptr(out), uintptr(flags), uintptr(unsafe.Pointer(pconsole)), 0) + if r0 != 0 { + hr = syscall.Errno(r0) + } + return +} + func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) if r1&0xff == 0 { @@ -2367,11 +2386,8 @@ func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uin return } -func GetStartupInfo(startupInfo *StartupInfo) (err error) { - r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) - if r1 == 0 { - err = errnoErr(e1) - } +func getStartupInfo(startupInfo *StartupInfo) { + syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) return } @@ -2862,6 +2878,14 @@ func ResetEvent(event Handle) (err error) { return } +func resizePseudoConsole(pconsole Handle, size uint32) (hr error) { + r0, _, _ := syscall.Syscall(procResizePseudoConsole.Addr(), 2, uintptr(pconsole), uintptr(size), 0) + if r0 != 0 { + hr = syscall.Errno(r0) + } + return +} + func ResumeThread(thread Handle) (ret uint32, err error) { r0, _, e1 := syscall.Syscall(procResumeThread.Addr(), 1, uintptr(thread), 0, 0) ret = uint32(r0) @@ -3820,9 +3844,9 @@ func setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (er return } -func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { +func commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) { r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) - argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + argv = (**uint16)(unsafe.Pointer(r0)) if argv == nil { err = errnoErr(e1) } @@ -4017,6 +4041,22 @@ func _VerQueryValue(block unsafe.Pointer, subBlock *uint16, pointerToBufferPoint return } +func TimeBeginPeriod(period uint32) (err error) { + r1, _, e1 := syscall.Syscall(proctimeBeginPeriod.Addr(), 1, uintptr(period), 0, 0) + if r1 != 0 { + err = errnoErr(e1) + } + return +} + +func TimeEndPeriod(period uint32) (err error) { + r1, _, e1 := syscall.Syscall(proctimeEndPeriod.Addr(), 1, uintptr(period), 0, 0) + if r1 != 0 { + err = errnoErr(e1) + } + return +} + func WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) { r0, _, _ := syscall.Syscall(procWinVerifyTrustEx.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(actionId)), uintptr(unsafe.Pointer(data))) if r0 != 0 { diff --git a/vendor/golang.org/x/term/term_unix.go b/vendor/golang.org/x/term/term_unix.go index a4e31ab1b..62c2b3f41 100644 --- a/vendor/golang.org/x/term/term_unix.go +++ b/vendor/golang.org/x/term/term_unix.go @@ -60,7 +60,7 @@ func restore(fd int, state *State) error { func getSize(fd int) (width, height int, err error) { ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) if err != nil { - return -1, -1, err + return 0, 0, err } return int(ws.Col), int(ws.Row), nil } diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index f248effae..ffadb7beb 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go new file mode 100644 index 000000000..92cce5802 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go @@ -0,0 +1,2043 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 19904 bytes (19.44 KiB). Checksum: b1f201ed2debb6c8. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 259 blocks, 16576 entries, 16576 bytes +// The third block is the zero block. +var bidiValues = [16576]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x000d, 0x5f1: 0x000d, 0x5f2: 0x000d, 0x5f3: 0x000d, 0x5f4: 0x000d, 0x5f5: 0x000d, + 0x5f6: 0x000d, 0x5f7: 0x000d, 0x5f8: 0x000d, 0x5f9: 0x000d, 0x5fa: 0x000d, 0x5fb: 0x000d, + 0x5fc: 0x000d, 0x5fd: 0x000d, 0x5fe: 0x000d, 0x5ff: 0x000d, + // Block 0x18, offset 0x600 + 0x600: 0x000d, 0x601: 0x000d, 0x602: 0x000d, 0x603: 0x000d, 0x604: 0x000d, 0x605: 0x000d, + 0x606: 0x000d, 0x607: 0x000d, 0x608: 0x000d, 0x609: 0x000d, 0x60a: 0x000d, 0x60b: 0x000d, + 0x60c: 0x000d, 0x60d: 0x000d, 0x60e: 0x000d, 0x60f: 0x0001, 0x610: 0x0005, 0x611: 0x0005, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x000c, 0x619: 0x000c, 0x61a: 0x000c, 0x61b: 0x000c, 0x61c: 0x000c, 0x61d: 0x000c, + 0x61e: 0x000c, 0x61f: 0x000c, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000c, 0x64b: 0x000c, + 0x64c: 0x000c, 0x64d: 0x000c, 0x64e: 0x000c, 0x64f: 0x000c, 0x650: 0x000c, 0x651: 0x000c, + 0x652: 0x000c, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x895: 0x000c, 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97c: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa81: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaca: 0x000c, + 0xad2: 0x000c, 0xad3: 0x000c, 0xad4: 0x000c, 0xad6: 0x000c, + // Block 0x2c, offset 0xb00 + 0xb31: 0x000c, 0xb34: 0x000c, 0xb35: 0x000c, + 0xb36: 0x000c, 0xb37: 0x000c, 0xb38: 0x000c, 0xb39: 0x000c, 0xb3a: 0x000c, + 0xb3f: 0x0004, + // Block 0x2d, offset 0xb40 + 0xb47: 0x000c, 0xb48: 0x000c, 0xb49: 0x000c, 0xb4a: 0x000c, 0xb4b: 0x000c, + 0xb4c: 0x000c, 0xb4d: 0x000c, 0xb4e: 0x000c, + // Block 0x2e, offset 0xb80 + 0xbb1: 0x000c, 0xbb4: 0x000c, 0xbb5: 0x000c, + 0xbb6: 0x000c, 0xbb7: 0x000c, 0xbb8: 0x000c, 0xbb9: 0x000c, 0xbba: 0x000c, 0xbbb: 0x000c, + 0xbbc: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbc8: 0x000c, 0xbc9: 0x000c, 0xbca: 0x000c, 0xbcb: 0x000c, + 0xbcc: 0x000c, 0xbcd: 0x000c, 0xbce: 0x000c, + // Block 0x30, offset 0xc00 + 0xc18: 0x000c, 0xc19: 0x000c, + 0xc35: 0x000c, + 0xc37: 0x000c, 0xc39: 0x000c, 0xc3a: 0x003a, 0xc3b: 0x002a, + 0xc3c: 0x003a, 0xc3d: 0x002a, + // Block 0x31, offset 0xc40 + 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, 0xc7d: 0x000c, 0xc7e: 0x000c, + // Block 0x32, offset 0xc80 + 0xc80: 0x000c, 0xc81: 0x000c, 0xc82: 0x000c, 0xc83: 0x000c, 0xc84: 0x000c, + 0xc86: 0x000c, 0xc87: 0x000c, + 0xc8d: 0x000c, 0xc8e: 0x000c, 0xc8f: 0x000c, 0xc90: 0x000c, 0xc91: 0x000c, + 0xc92: 0x000c, 0xc93: 0x000c, 0xc94: 0x000c, 0xc95: 0x000c, 0xc96: 0x000c, 0xc97: 0x000c, + 0xc99: 0x000c, 0xc9a: 0x000c, 0xc9b: 0x000c, 0xc9c: 0x000c, 0xc9d: 0x000c, + 0xc9e: 0x000c, 0xc9f: 0x000c, 0xca0: 0x000c, 0xca1: 0x000c, 0xca2: 0x000c, 0xca3: 0x000c, + 0xca4: 0x000c, 0xca5: 0x000c, 0xca6: 0x000c, 0xca7: 0x000c, 0xca8: 0x000c, 0xca9: 0x000c, + 0xcaa: 0x000c, 0xcab: 0x000c, 0xcac: 0x000c, 0xcad: 0x000c, 0xcae: 0x000c, 0xcaf: 0x000c, + 0xcb0: 0x000c, 0xcb1: 0x000c, 0xcb2: 0x000c, 0xcb3: 0x000c, 0xcb4: 0x000c, 0xcb5: 0x000c, + 0xcb6: 0x000c, 0xcb7: 0x000c, 0xcb8: 0x000c, 0xcb9: 0x000c, 0xcba: 0x000c, 0xcbb: 0x000c, + 0xcbc: 0x000c, + // Block 0x33, offset 0xcc0 + 0xcc6: 0x000c, + // Block 0x34, offset 0xd00 + 0xd2d: 0x000c, 0xd2e: 0x000c, 0xd2f: 0x000c, + 0xd30: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, 0xd35: 0x000c, + 0xd36: 0x000c, 0xd37: 0x000c, 0xd39: 0x000c, 0xd3a: 0x000c, + 0xd3d: 0x000c, 0xd3e: 0x000c, + // Block 0x35, offset 0xd40 + 0xd58: 0x000c, 0xd59: 0x000c, + 0xd5e: 0x000c, 0xd5f: 0x000c, 0xd60: 0x000c, + 0xd71: 0x000c, 0xd72: 0x000c, 0xd73: 0x000c, 0xd74: 0x000c, + // Block 0x36, offset 0xd80 + 0xd82: 0x000c, 0xd85: 0x000c, + 0xd86: 0x000c, + 0xd8d: 0x000c, + 0xd9d: 0x000c, + // Block 0x37, offset 0xdc0 + 0xddd: 0x000c, + 0xdde: 0x000c, 0xddf: 0x000c, + // Block 0x38, offset 0xe00 + 0xe10: 0x000a, 0xe11: 0x000a, + 0xe12: 0x000a, 0xe13: 0x000a, 0xe14: 0x000a, 0xe15: 0x000a, 0xe16: 0x000a, 0xe17: 0x000a, + 0xe18: 0x000a, 0xe19: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x000a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0009, + 0xe9b: 0x007a, 0xe9c: 0x006a, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, 0xed4: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf12: 0x000c, 0xf13: 0x000c, + 0xf32: 0x000c, 0xf33: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf74: 0x000c, 0xf75: 0x000c, + 0xf77: 0x000c, 0xf78: 0x000c, 0xf79: 0x000c, 0xf7a: 0x000c, 0xf7b: 0x000c, + 0xf7c: 0x000c, 0xf7d: 0x000c, + // Block 0x3e, offset 0xf80 + 0xf86: 0x000c, 0xf89: 0x000c, 0xf8a: 0x000c, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000c, 0xf8f: 0x000c, 0xf90: 0x000c, 0xf91: 0x000c, + 0xf92: 0x000c, 0xf93: 0x000c, + 0xf9b: 0x0004, 0xf9d: 0x000c, + 0xfb0: 0x000a, 0xfb1: 0x000a, 0xfb2: 0x000a, 0xfb3: 0x000a, 0xfb4: 0x000a, 0xfb5: 0x000a, + 0xfb6: 0x000a, 0xfb7: 0x000a, 0xfb8: 0x000a, 0xfb9: 0x000a, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x000a, 0xfc1: 0x000a, 0xfc2: 0x000a, 0xfc3: 0x000a, 0xfc4: 0x000a, 0xfc5: 0x000a, + 0xfc6: 0x000a, 0xfc7: 0x000a, 0xfc8: 0x000a, 0xfc9: 0x000a, 0xfca: 0x000a, 0xfcb: 0x000c, + 0xfcc: 0x000c, 0xfcd: 0x000c, 0xfce: 0x000b, 0xfcf: 0x000c, + // Block 0x40, offset 0x1000 + 0x1005: 0x000c, + 0x1006: 0x000c, + 0x1029: 0x000c, + // Block 0x41, offset 0x1040 + 0x1060: 0x000c, 0x1061: 0x000c, 0x1062: 0x000c, + 0x1067: 0x000c, 0x1068: 0x000c, + 0x1072: 0x000c, + 0x1079: 0x000c, 0x107a: 0x000c, 0x107b: 0x000c, + // Block 0x42, offset 0x1080 + 0x1080: 0x000a, 0x1084: 0x000a, 0x1085: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10de: 0x000a, 0x10df: 0x000a, 0x10e0: 0x000a, 0x10e1: 0x000a, 0x10e2: 0x000a, 0x10e3: 0x000a, + 0x10e4: 0x000a, 0x10e5: 0x000a, 0x10e6: 0x000a, 0x10e7: 0x000a, 0x10e8: 0x000a, 0x10e9: 0x000a, + 0x10ea: 0x000a, 0x10eb: 0x000a, 0x10ec: 0x000a, 0x10ed: 0x000a, 0x10ee: 0x000a, 0x10ef: 0x000a, + 0x10f0: 0x000a, 0x10f1: 0x000a, 0x10f2: 0x000a, 0x10f3: 0x000a, 0x10f4: 0x000a, 0x10f5: 0x000a, + 0x10f6: 0x000a, 0x10f7: 0x000a, 0x10f8: 0x000a, 0x10f9: 0x000a, 0x10fa: 0x000a, 0x10fb: 0x000a, + 0x10fc: 0x000a, 0x10fd: 0x000a, 0x10fe: 0x000a, 0x10ff: 0x000a, + // Block 0x44, offset 0x1100 + 0x1117: 0x000c, + 0x1118: 0x000c, 0x111b: 0x000c, + // Block 0x45, offset 0x1140 + 0x1156: 0x000c, + 0x1158: 0x000c, 0x1159: 0x000c, 0x115a: 0x000c, 0x115b: 0x000c, 0x115c: 0x000c, 0x115d: 0x000c, + 0x115e: 0x000c, 0x1160: 0x000c, 0x1162: 0x000c, + 0x1165: 0x000c, 0x1166: 0x000c, 0x1167: 0x000c, 0x1168: 0x000c, 0x1169: 0x000c, + 0x116a: 0x000c, 0x116b: 0x000c, 0x116c: 0x000c, + 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117f: 0x000c, + // Block 0x46, offset 0x1180 + 0x11b0: 0x000c, 0x11b1: 0x000c, 0x11b2: 0x000c, 0x11b3: 0x000c, 0x11b4: 0x000c, 0x11b5: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bb: 0x000c, + 0x11bc: 0x000c, 0x11bd: 0x000c, 0x11be: 0x000c, 0x11bf: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x000c, 0x11c1: 0x000c, 0x11c2: 0x000c, 0x11c3: 0x000c, 0x11c4: 0x000c, 0x11c5: 0x000c, + 0x11c6: 0x000c, 0x11c7: 0x000c, 0x11c8: 0x000c, 0x11c9: 0x000c, 0x11ca: 0x000c, 0x11cb: 0x000c, + 0x11cc: 0x000c, 0x11cd: 0x000c, 0x11ce: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, 0x1202: 0x000c, 0x1203: 0x000c, + 0x1234: 0x000c, + 0x1236: 0x000c, 0x1237: 0x000c, 0x1238: 0x000c, 0x1239: 0x000c, 0x123a: 0x000c, + 0x123c: 0x000c, + // Block 0x49, offset 0x1240 + 0x1242: 0x000c, + 0x126b: 0x000c, 0x126c: 0x000c, 0x126d: 0x000c, 0x126e: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, 0x1272: 0x000c, 0x1273: 0x000c, + // Block 0x4a, offset 0x1280 + 0x1280: 0x000c, 0x1281: 0x000c, + 0x12a2: 0x000c, 0x12a3: 0x000c, + 0x12a4: 0x000c, 0x12a5: 0x000c, 0x12a8: 0x000c, 0x12a9: 0x000c, + 0x12ab: 0x000c, 0x12ac: 0x000c, 0x12ad: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12e6: 0x000c, 0x12e8: 0x000c, 0x12e9: 0x000c, + 0x12ed: 0x000c, 0x12ef: 0x000c, + 0x12f0: 0x000c, 0x12f1: 0x000c, + // Block 0x4c, offset 0x1300 + 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, + // Block 0x4d, offset 0x1340 + 0x1350: 0x000c, 0x1351: 0x000c, + 0x1352: 0x000c, 0x1354: 0x000c, 0x1355: 0x000c, 0x1356: 0x000c, 0x1357: 0x000c, + 0x1358: 0x000c, 0x1359: 0x000c, 0x135a: 0x000c, 0x135b: 0x000c, 0x135c: 0x000c, 0x135d: 0x000c, + 0x135e: 0x000c, 0x135f: 0x000c, 0x1360: 0x000c, 0x1362: 0x000c, 0x1363: 0x000c, + 0x1364: 0x000c, 0x1365: 0x000c, 0x1366: 0x000c, 0x1367: 0x000c, 0x1368: 0x000c, + 0x136d: 0x000c, + 0x1374: 0x000c, + 0x1378: 0x000c, 0x1379: 0x000c, + // Block 0x4e, offset 0x1380 + 0x13bd: 0x000a, 0x13bf: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x000a, 0x13c1: 0x000a, + 0x13cd: 0x000a, 0x13ce: 0x000a, 0x13cf: 0x000a, + 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, + 0x13ed: 0x000a, 0x13ee: 0x000a, 0x13ef: 0x000a, + 0x13fd: 0x000a, 0x13fe: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x0009, 0x1401: 0x0009, 0x1402: 0x0009, 0x1403: 0x0009, 0x1404: 0x0009, 0x1405: 0x0009, + 0x1406: 0x0009, 0x1407: 0x0009, 0x1408: 0x0009, 0x1409: 0x0009, 0x140a: 0x0009, 0x140b: 0x000b, + 0x140c: 0x000b, 0x140d: 0x000b, 0x140f: 0x0001, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x000a, 0x1420: 0x000a, 0x1421: 0x000a, 0x1422: 0x000a, 0x1423: 0x000a, + 0x1424: 0x000a, 0x1425: 0x000a, 0x1426: 0x000a, 0x1427: 0x000a, 0x1428: 0x0009, 0x1429: 0x0007, + 0x142a: 0x000e, 0x142b: 0x000e, 0x142c: 0x000e, 0x142d: 0x000e, 0x142e: 0x000e, 0x142f: 0x0006, + 0x1430: 0x0004, 0x1431: 0x0004, 0x1432: 0x0004, 0x1433: 0x0004, 0x1434: 0x0004, 0x1435: 0x000a, + 0x1436: 0x000a, 0x1437: 0x000a, 0x1438: 0x000a, 0x1439: 0x000a, 0x143a: 0x000a, 0x143b: 0x000a, + 0x143c: 0x000a, 0x143d: 0x000a, 0x143e: 0x000a, 0x143f: 0x000a, + // Block 0x51, offset 0x1440 + 0x1440: 0x000a, 0x1441: 0x000a, 0x1442: 0x000a, 0x1443: 0x000a, 0x1444: 0x0006, 0x1445: 0x009a, + 0x1446: 0x008a, 0x1447: 0x000a, 0x1448: 0x000a, 0x1449: 0x000a, 0x144a: 0x000a, 0x144b: 0x000a, + 0x144c: 0x000a, 0x144d: 0x000a, 0x144e: 0x000a, 0x144f: 0x000a, 0x1450: 0x000a, 0x1451: 0x000a, + 0x1452: 0x000a, 0x1453: 0x000a, 0x1454: 0x000a, 0x1455: 0x000a, 0x1456: 0x000a, 0x1457: 0x000a, + 0x1458: 0x000a, 0x1459: 0x000a, 0x145a: 0x000a, 0x145b: 0x000a, 0x145c: 0x000a, 0x145d: 0x000a, + 0x145e: 0x000a, 0x145f: 0x0009, 0x1460: 0x000b, 0x1461: 0x000b, 0x1462: 0x000b, 0x1463: 0x000b, + 0x1464: 0x000b, 0x1465: 0x000b, 0x1466: 0x000e, 0x1467: 0x000e, 0x1468: 0x000e, 0x1469: 0x000e, + 0x146a: 0x000b, 0x146b: 0x000b, 0x146c: 0x000b, 0x146d: 0x000b, 0x146e: 0x000b, 0x146f: 0x000b, + 0x1470: 0x0002, 0x1474: 0x0002, 0x1475: 0x0002, + 0x1476: 0x0002, 0x1477: 0x0002, 0x1478: 0x0002, 0x1479: 0x0002, 0x147a: 0x0003, 0x147b: 0x0003, + 0x147c: 0x000a, 0x147d: 0x009a, 0x147e: 0x008a, + // Block 0x52, offset 0x1480 + 0x1480: 0x0002, 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, 0x1485: 0x0002, + 0x1486: 0x0002, 0x1487: 0x0002, 0x1488: 0x0002, 0x1489: 0x0002, 0x148a: 0x0003, 0x148b: 0x0003, + 0x148c: 0x000a, 0x148d: 0x009a, 0x148e: 0x008a, + 0x14a0: 0x0004, 0x14a1: 0x0004, 0x14a2: 0x0004, 0x14a3: 0x0004, + 0x14a4: 0x0004, 0x14a5: 0x0004, 0x14a6: 0x0004, 0x14a7: 0x0004, 0x14a8: 0x0004, 0x14a9: 0x0004, + 0x14aa: 0x0004, 0x14ab: 0x0004, 0x14ac: 0x0004, 0x14ad: 0x0004, 0x14ae: 0x0004, 0x14af: 0x0004, + 0x14b0: 0x0004, 0x14b1: 0x0004, 0x14b2: 0x0004, 0x14b3: 0x0004, 0x14b4: 0x0004, 0x14b5: 0x0004, + 0x14b6: 0x0004, 0x14b7: 0x0004, 0x14b8: 0x0004, 0x14b9: 0x0004, 0x14ba: 0x0004, 0x14bb: 0x0004, + 0x14bc: 0x0004, 0x14bd: 0x0004, 0x14be: 0x0004, 0x14bf: 0x0004, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0004, 0x14c1: 0x0004, 0x14c2: 0x0004, 0x14c3: 0x0004, 0x14c4: 0x0004, 0x14c5: 0x0004, + 0x14c6: 0x0004, 0x14c7: 0x0004, 0x14c8: 0x0004, 0x14c9: 0x0004, 0x14ca: 0x0004, 0x14cb: 0x0004, + 0x14cc: 0x0004, 0x14cd: 0x0004, 0x14ce: 0x0004, 0x14cf: 0x0004, 0x14d0: 0x000c, 0x14d1: 0x000c, + 0x14d2: 0x000c, 0x14d3: 0x000c, 0x14d4: 0x000c, 0x14d5: 0x000c, 0x14d6: 0x000c, 0x14d7: 0x000c, + 0x14d8: 0x000c, 0x14d9: 0x000c, 0x14da: 0x000c, 0x14db: 0x000c, 0x14dc: 0x000c, 0x14dd: 0x000c, + 0x14de: 0x000c, 0x14df: 0x000c, 0x14e0: 0x000c, 0x14e1: 0x000c, 0x14e2: 0x000c, 0x14e3: 0x000c, + 0x14e4: 0x000c, 0x14e5: 0x000c, 0x14e6: 0x000c, 0x14e7: 0x000c, 0x14e8: 0x000c, 0x14e9: 0x000c, + 0x14ea: 0x000c, 0x14eb: 0x000c, 0x14ec: 0x000c, 0x14ed: 0x000c, 0x14ee: 0x000c, 0x14ef: 0x000c, + 0x14f0: 0x000c, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x1505: 0x000a, + 0x1506: 0x000a, 0x1508: 0x000a, 0x1509: 0x000a, + 0x1514: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, 0x1520: 0x000a, 0x1521: 0x000a, 0x1522: 0x000a, 0x1523: 0x000a, + 0x1525: 0x000a, 0x1527: 0x000a, 0x1529: 0x000a, + 0x152e: 0x0004, + 0x153a: 0x000a, 0x153b: 0x000a, + // Block 0x55, offset 0x1540 + 0x1540: 0x000a, 0x1541: 0x000a, 0x1542: 0x000a, 0x1543: 0x000a, 0x1544: 0x000a, + 0x154a: 0x000a, 0x154b: 0x000a, + 0x154c: 0x000a, 0x154d: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x000a, 0x15d3: 0x000a, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x000a, 0x1609: 0x000a, 0x160a: 0x000a, 0x160b: 0x000a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x0003, 0x1613: 0x0004, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x000a, + 0x162a: 0x000a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + 0x1636: 0x000a, 0x1637: 0x000a, 0x1638: 0x000a, 0x1639: 0x000a, 0x163a: 0x000a, 0x163b: 0x000a, + 0x163c: 0x000a, 0x163d: 0x000a, 0x163e: 0x000a, 0x163f: 0x000a, + // Block 0x59, offset 0x1640 + 0x1640: 0x000a, 0x1641: 0x000a, 0x1642: 0x000a, 0x1643: 0x000a, 0x1644: 0x000a, 0x1645: 0x000a, + 0x1646: 0x000a, 0x1647: 0x000a, 0x1648: 0x003a, 0x1649: 0x002a, 0x164a: 0x003a, 0x164b: 0x002a, + 0x164c: 0x000a, 0x164d: 0x000a, 0x164e: 0x000a, 0x164f: 0x000a, 0x1650: 0x000a, 0x1651: 0x000a, + 0x1652: 0x000a, 0x1653: 0x000a, 0x1654: 0x000a, 0x1655: 0x000a, 0x1656: 0x000a, 0x1657: 0x000a, + 0x1658: 0x000a, 0x1659: 0x000a, 0x165a: 0x000a, 0x165b: 0x000a, 0x165c: 0x000a, 0x165d: 0x000a, + 0x165e: 0x000a, 0x165f: 0x000a, 0x1660: 0x000a, 0x1661: 0x000a, 0x1662: 0x000a, 0x1663: 0x000a, + 0x1664: 0x000a, 0x1665: 0x000a, 0x1666: 0x000a, 0x1667: 0x000a, 0x1668: 0x000a, 0x1669: 0x009a, + 0x166a: 0x008a, 0x166b: 0x000a, 0x166c: 0x000a, 0x166d: 0x000a, 0x166e: 0x000a, 0x166f: 0x000a, + 0x1670: 0x000a, 0x1671: 0x000a, 0x1672: 0x000a, 0x1673: 0x000a, 0x1674: 0x000a, 0x1675: 0x000a, + // Block 0x5a, offset 0x1680 + 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, + 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, 0x16ff: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1997: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x009a, 0x1ad6: 0x008a, 0x1ad7: 0x00ba, + 0x1ad8: 0x00aa, 0x1ad9: 0x009a, 0x1ada: 0x008a, 0x1adb: 0x007a, 0x1adc: 0x006a, 0x1add: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, 0x206c: 0x000c, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + 0x20ff: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, 0x21bd: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x232a: 0x000a, 0x232b: 0x000a, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a, + 0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a, + 0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x000d, 0x2451: 0x000d, + 0x2452: 0x000d, 0x2453: 0x000d, 0x2454: 0x000d, 0x2455: 0x000d, 0x2456: 0x000d, 0x2457: 0x000d, + 0x2458: 0x000d, 0x2459: 0x000d, 0x245a: 0x000d, 0x245b: 0x000d, 0x245c: 0x000d, 0x245d: 0x000d, + 0x245e: 0x000d, 0x245f: 0x000d, 0x2460: 0x000d, 0x2461: 0x000d, 0x2462: 0x000d, 0x2463: 0x000d, + 0x2464: 0x000d, 0x2465: 0x000d, 0x2466: 0x000d, 0x2467: 0x000d, 0x2468: 0x000d, 0x2469: 0x000d, + 0x246a: 0x000d, 0x246b: 0x000d, 0x246c: 0x000d, 0x246d: 0x000d, 0x246e: 0x000d, 0x246f: 0x000d, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d, + 0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d, + 0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000a, 0x2490: 0x000b, 0x2491: 0x000b, + 0x2492: 0x000b, 0x2493: 0x000b, 0x2494: 0x000b, 0x2495: 0x000b, 0x2496: 0x000b, 0x2497: 0x000b, + 0x2498: 0x000b, 0x2499: 0x000b, 0x249a: 0x000b, 0x249b: 0x000b, 0x249c: 0x000b, 0x249d: 0x000b, + 0x249e: 0x000b, 0x249f: 0x000b, 0x24a0: 0x000b, 0x24a1: 0x000b, 0x24a2: 0x000b, 0x24a3: 0x000b, + 0x24a4: 0x000b, 0x24a5: 0x000b, 0x24a6: 0x000b, 0x24a7: 0x000b, 0x24a8: 0x000b, 0x24a9: 0x000b, + 0x24aa: 0x000b, 0x24ab: 0x000b, 0x24ac: 0x000b, 0x24ad: 0x000b, 0x24ae: 0x000b, 0x24af: 0x000b, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000c, 0x24c1: 0x000c, 0x24c2: 0x000c, 0x24c3: 0x000c, 0x24c4: 0x000c, 0x24c5: 0x000c, + 0x24c6: 0x000c, 0x24c7: 0x000c, 0x24c8: 0x000c, 0x24c9: 0x000c, 0x24ca: 0x000c, 0x24cb: 0x000c, + 0x24cc: 0x000c, 0x24cd: 0x000c, 0x24ce: 0x000c, 0x24cf: 0x000c, 0x24d0: 0x000a, 0x24d1: 0x000a, + 0x24d2: 0x000a, 0x24d3: 0x000a, 0x24d4: 0x000a, 0x24d5: 0x000a, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x000a, + 0x24e0: 0x000c, 0x24e1: 0x000c, 0x24e2: 0x000c, 0x24e3: 0x000c, + 0x24e4: 0x000c, 0x24e5: 0x000c, 0x24e6: 0x000c, 0x24e7: 0x000c, 0x24e8: 0x000c, 0x24e9: 0x000c, + 0x24ea: 0x000c, 0x24eb: 0x000c, 0x24ec: 0x000c, 0x24ed: 0x000c, 0x24ee: 0x000c, 0x24ef: 0x000c, + 0x24f0: 0x000a, 0x24f1: 0x000a, 0x24f2: 0x000a, 0x24f3: 0x000a, 0x24f4: 0x000a, 0x24f5: 0x000a, + 0x24f6: 0x000a, 0x24f7: 0x000a, 0x24f8: 0x000a, 0x24f9: 0x000a, 0x24fa: 0x000a, 0x24fb: 0x000a, + 0x24fc: 0x000a, 0x24fd: 0x000a, 0x24fe: 0x000a, 0x24ff: 0x000a, + // Block 0x94, offset 0x2500 + 0x2500: 0x000a, 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x000a, 0x2504: 0x000a, 0x2505: 0x000a, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x000a, 0x2509: 0x000a, 0x250a: 0x000a, 0x250b: 0x000a, + 0x250c: 0x000a, 0x250d: 0x000a, 0x250e: 0x000a, 0x250f: 0x000a, 0x2510: 0x0006, 0x2511: 0x000a, + 0x2512: 0x0006, 0x2514: 0x000a, 0x2515: 0x0006, 0x2516: 0x000a, 0x2517: 0x000a, + 0x2518: 0x000a, 0x2519: 0x009a, 0x251a: 0x008a, 0x251b: 0x007a, 0x251c: 0x006a, 0x251d: 0x009a, + 0x251e: 0x008a, 0x251f: 0x0004, 0x2520: 0x000a, 0x2521: 0x000a, 0x2522: 0x0003, 0x2523: 0x0003, + 0x2524: 0x000a, 0x2525: 0x000a, 0x2526: 0x000a, 0x2528: 0x000a, 0x2529: 0x0004, + 0x252a: 0x0004, 0x252b: 0x000a, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000d, + // Block 0x95, offset 0x2540 + 0x2540: 0x000d, 0x2541: 0x000d, 0x2542: 0x000d, 0x2543: 0x000d, 0x2544: 0x000d, 0x2545: 0x000d, + 0x2546: 0x000d, 0x2547: 0x000d, 0x2548: 0x000d, 0x2549: 0x000d, 0x254a: 0x000d, 0x254b: 0x000d, + 0x254c: 0x000d, 0x254d: 0x000d, 0x254e: 0x000d, 0x254f: 0x000d, 0x2550: 0x000d, 0x2551: 0x000d, + 0x2552: 0x000d, 0x2553: 0x000d, 0x2554: 0x000d, 0x2555: 0x000d, 0x2556: 0x000d, 0x2557: 0x000d, + 0x2558: 0x000d, 0x2559: 0x000d, 0x255a: 0x000d, 0x255b: 0x000d, 0x255c: 0x000d, 0x255d: 0x000d, + 0x255e: 0x000d, 0x255f: 0x000d, 0x2560: 0x000d, 0x2561: 0x000d, 0x2562: 0x000d, 0x2563: 0x000d, + 0x2564: 0x000d, 0x2565: 0x000d, 0x2566: 0x000d, 0x2567: 0x000d, 0x2568: 0x000d, 0x2569: 0x000d, + 0x256a: 0x000d, 0x256b: 0x000d, 0x256c: 0x000d, 0x256d: 0x000d, 0x256e: 0x000d, 0x256f: 0x000d, + 0x2570: 0x000d, 0x2571: 0x000d, 0x2572: 0x000d, 0x2573: 0x000d, 0x2574: 0x000d, 0x2575: 0x000d, + 0x2576: 0x000d, 0x2577: 0x000d, 0x2578: 0x000d, 0x2579: 0x000d, 0x257a: 0x000d, 0x257b: 0x000d, + 0x257c: 0x000d, 0x257d: 0x000d, 0x257e: 0x000d, 0x257f: 0x000b, + // Block 0x96, offset 0x2580 + 0x2581: 0x000a, 0x2582: 0x000a, 0x2583: 0x0004, 0x2584: 0x0004, 0x2585: 0x0004, + 0x2586: 0x000a, 0x2587: 0x000a, 0x2588: 0x003a, 0x2589: 0x002a, 0x258a: 0x000a, 0x258b: 0x0003, + 0x258c: 0x0006, 0x258d: 0x0003, 0x258e: 0x0006, 0x258f: 0x0006, 0x2590: 0x0002, 0x2591: 0x0002, + 0x2592: 0x0002, 0x2593: 0x0002, 0x2594: 0x0002, 0x2595: 0x0002, 0x2596: 0x0002, 0x2597: 0x0002, + 0x2598: 0x0002, 0x2599: 0x0002, 0x259a: 0x0006, 0x259b: 0x000a, 0x259c: 0x000a, 0x259d: 0x000a, + 0x259e: 0x000a, 0x259f: 0x000a, 0x25a0: 0x000a, + 0x25bb: 0x005a, + 0x25bc: 0x000a, 0x25bd: 0x004a, 0x25be: 0x000a, 0x25bf: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x000a, + 0x25db: 0x005a, 0x25dc: 0x000a, 0x25dd: 0x004a, + 0x25de: 0x000a, 0x25df: 0x00fa, 0x25e0: 0x00ea, 0x25e1: 0x000a, 0x25e2: 0x003a, 0x25e3: 0x002a, + 0x25e4: 0x000a, 0x25e5: 0x000a, + // Block 0x98, offset 0x2600 + 0x2620: 0x0004, 0x2621: 0x0004, 0x2622: 0x000a, 0x2623: 0x000a, + 0x2624: 0x000a, 0x2625: 0x0004, 0x2626: 0x0004, 0x2628: 0x000a, 0x2629: 0x000a, + 0x262a: 0x000a, 0x262b: 0x000a, 0x262c: 0x000a, 0x262d: 0x000a, 0x262e: 0x000a, + 0x2630: 0x000b, 0x2631: 0x000b, 0x2632: 0x000b, 0x2633: 0x000b, 0x2634: 0x000b, 0x2635: 0x000b, + 0x2636: 0x000b, 0x2637: 0x000b, 0x2638: 0x000b, 0x2639: 0x000a, 0x263a: 0x000a, 0x263b: 0x000a, + 0x263c: 0x000a, 0x263d: 0x000a, 0x263e: 0x000b, 0x263f: 0x000b, + // Block 0x99, offset 0x2640 + 0x2641: 0x000a, + // Block 0x9a, offset 0x2680 + 0x2680: 0x000a, 0x2681: 0x000a, 0x2682: 0x000a, 0x2683: 0x000a, 0x2684: 0x000a, 0x2685: 0x000a, + 0x2686: 0x000a, 0x2687: 0x000a, 0x2688: 0x000a, 0x2689: 0x000a, 0x268a: 0x000a, 0x268b: 0x000a, + 0x268c: 0x000a, 0x2690: 0x000a, 0x2691: 0x000a, + 0x2692: 0x000a, 0x2693: 0x000a, 0x2694: 0x000a, 0x2695: 0x000a, 0x2696: 0x000a, 0x2697: 0x000a, + 0x2698: 0x000a, 0x2699: 0x000a, 0x269a: 0x000a, 0x269b: 0x000a, 0x269c: 0x000a, + 0x26a0: 0x000a, + // Block 0x9b, offset 0x26c0 + 0x26fd: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2720: 0x000c, 0x2721: 0x0002, 0x2722: 0x0002, 0x2723: 0x0002, + 0x2724: 0x0002, 0x2725: 0x0002, 0x2726: 0x0002, 0x2727: 0x0002, 0x2728: 0x0002, 0x2729: 0x0002, + 0x272a: 0x0002, 0x272b: 0x0002, 0x272c: 0x0002, 0x272d: 0x0002, 0x272e: 0x0002, 0x272f: 0x0002, + 0x2730: 0x0002, 0x2731: 0x0002, 0x2732: 0x0002, 0x2733: 0x0002, 0x2734: 0x0002, 0x2735: 0x0002, + 0x2736: 0x0002, 0x2737: 0x0002, 0x2738: 0x0002, 0x2739: 0x0002, 0x273a: 0x0002, 0x273b: 0x0002, + // Block 0x9d, offset 0x2740 + 0x2776: 0x000c, 0x2777: 0x000c, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x000a, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x000c, 0x2802: 0x000c, 0x2803: 0x000c, 0x2804: 0x0001, 0x2805: 0x000c, + 0x2806: 0x000c, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x000c, 0x280d: 0x000c, 0x280e: 0x000c, 0x280f: 0x000c, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x000c, 0x2839: 0x000c, 0x283a: 0x000c, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x000c, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x0001, 0x287a: 0x0001, 0x287b: 0x0001, + 0x287c: 0x0001, 0x287d: 0x0001, 0x287e: 0x0001, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001, + 0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001, + 0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001, + 0x28b0: 0x0001, 0x28b1: 0x0001, 0x28b2: 0x0001, 0x28b3: 0x0001, 0x28b4: 0x0001, 0x28b5: 0x0001, + 0x28b6: 0x0001, 0x28b7: 0x0001, 0x28b8: 0x0001, 0x28b9: 0x000a, 0x28ba: 0x000a, 0x28bb: 0x000a, + 0x28bc: 0x000a, 0x28bd: 0x000a, 0x28be: 0x000a, 0x28bf: 0x000a, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d, + 0x28c6: 0x000d, 0x28c7: 0x000d, 0x28c8: 0x000d, 0x28c9: 0x000d, 0x28ca: 0x000d, 0x28cb: 0x000d, + 0x28cc: 0x000d, 0x28cd: 0x000d, 0x28ce: 0x000d, 0x28cf: 0x000d, 0x28d0: 0x000d, 0x28d1: 0x000d, + 0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d, + 0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d, + 0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d, + 0x28e4: 0x000c, 0x28e5: 0x000c, 0x28e6: 0x000c, 0x28e7: 0x000c, 0x28e8: 0x0001, 0x28e9: 0x0001, + 0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001, + 0x28f0: 0x0005, 0x28f1: 0x0005, 0x28f2: 0x0005, 0x28f3: 0x0005, 0x28f4: 0x0005, 0x28f5: 0x0005, + 0x28f6: 0x0005, 0x28f7: 0x0005, 0x28f8: 0x0005, 0x28f9: 0x0005, 0x28fa: 0x0001, 0x28fb: 0x0001, + 0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001, + // Block 0xa4, offset 0x2900 + 0x2900: 0x0001, 0x2901: 0x0001, 0x2902: 0x0001, 0x2903: 0x0001, 0x2904: 0x0001, 0x2905: 0x0001, + 0x2906: 0x0001, 0x2907: 0x0001, 0x2908: 0x0001, 0x2909: 0x0001, 0x290a: 0x0001, 0x290b: 0x0001, + 0x290c: 0x0001, 0x290d: 0x0001, 0x290e: 0x0001, 0x290f: 0x0001, 0x2910: 0x0001, 0x2911: 0x0001, + 0x2912: 0x0001, 0x2913: 0x0001, 0x2914: 0x0001, 0x2915: 0x0001, 0x2916: 0x0001, 0x2917: 0x0001, + 0x2918: 0x0001, 0x2919: 0x0001, 0x291a: 0x0001, 0x291b: 0x0001, 0x291c: 0x0001, 0x291d: 0x0001, + 0x291e: 0x0001, 0x291f: 0x0001, 0x2920: 0x0005, 0x2921: 0x0005, 0x2922: 0x0005, 0x2923: 0x0005, + 0x2924: 0x0005, 0x2925: 0x0005, 0x2926: 0x0005, 0x2927: 0x0005, 0x2928: 0x0005, 0x2929: 0x0005, + 0x292a: 0x0005, 0x292b: 0x0005, 0x292c: 0x0005, 0x292d: 0x0005, 0x292e: 0x0005, 0x292f: 0x0005, + 0x2930: 0x0005, 0x2931: 0x0005, 0x2932: 0x0005, 0x2933: 0x0005, 0x2934: 0x0005, 0x2935: 0x0005, + 0x2936: 0x0005, 0x2937: 0x0005, 0x2938: 0x0005, 0x2939: 0x0005, 0x293a: 0x0005, 0x293b: 0x0005, + 0x293c: 0x0005, 0x293d: 0x0005, 0x293e: 0x0005, 0x293f: 0x0001, + // Block 0xa5, offset 0x2940 + 0x2940: 0x0001, 0x2941: 0x0001, 0x2942: 0x0001, 0x2943: 0x0001, 0x2944: 0x0001, 0x2945: 0x0001, + 0x2946: 0x0001, 0x2947: 0x0001, 0x2948: 0x0001, 0x2949: 0x0001, 0x294a: 0x0001, 0x294b: 0x0001, + 0x294c: 0x0001, 0x294d: 0x0001, 0x294e: 0x0001, 0x294f: 0x0001, 0x2950: 0x0001, 0x2951: 0x0001, + 0x2952: 0x0001, 0x2953: 0x0001, 0x2954: 0x0001, 0x2955: 0x0001, 0x2956: 0x0001, 0x2957: 0x0001, + 0x2958: 0x0001, 0x2959: 0x0001, 0x295a: 0x0001, 0x295b: 0x0001, 0x295c: 0x0001, 0x295d: 0x0001, + 0x295e: 0x0001, 0x295f: 0x0001, 0x2960: 0x0001, 0x2961: 0x0001, 0x2962: 0x0001, 0x2963: 0x0001, + 0x2964: 0x0001, 0x2965: 0x0001, 0x2966: 0x0001, 0x2967: 0x0001, 0x2968: 0x0001, 0x2969: 0x0001, + 0x296a: 0x0001, 0x296b: 0x000c, 0x296c: 0x000c, 0x296d: 0x0001, 0x296e: 0x0001, 0x296f: 0x0001, + 0x2970: 0x0001, 0x2971: 0x0001, 0x2972: 0x0001, 0x2973: 0x0001, 0x2974: 0x0001, 0x2975: 0x0001, + 0x2976: 0x0001, 0x2977: 0x0001, 0x2978: 0x0001, 0x2979: 0x0001, 0x297a: 0x0001, 0x297b: 0x0001, + 0x297c: 0x0001, 0x297d: 0x0001, 0x297e: 0x0001, 0x297f: 0x0001, + // Block 0xa6, offset 0x2980 + 0x2980: 0x0001, 0x2981: 0x0001, 0x2982: 0x0001, 0x2983: 0x0001, 0x2984: 0x0001, 0x2985: 0x0001, + 0x2986: 0x0001, 0x2987: 0x0001, 0x2988: 0x0001, 0x2989: 0x0001, 0x298a: 0x0001, 0x298b: 0x0001, + 0x298c: 0x0001, 0x298d: 0x0001, 0x298e: 0x0001, 0x298f: 0x0001, 0x2990: 0x0001, 0x2991: 0x0001, + 0x2992: 0x0001, 0x2993: 0x0001, 0x2994: 0x0001, 0x2995: 0x0001, 0x2996: 0x0001, 0x2997: 0x0001, + 0x2998: 0x0001, 0x2999: 0x0001, 0x299a: 0x0001, 0x299b: 0x0001, 0x299c: 0x0001, 0x299d: 0x0001, + 0x299e: 0x0001, 0x299f: 0x0001, 0x29a0: 0x0001, 0x29a1: 0x0001, 0x29a2: 0x0001, 0x29a3: 0x0001, + 0x29a4: 0x0001, 0x29a5: 0x0001, 0x29a6: 0x0001, 0x29a7: 0x0001, 0x29a8: 0x0001, 0x29a9: 0x0001, + 0x29aa: 0x0001, 0x29ab: 0x0001, 0x29ac: 0x0001, 0x29ad: 0x0001, 0x29ae: 0x0001, 0x29af: 0x0001, + 0x29b0: 0x0001, 0x29b1: 0x0001, 0x29b2: 0x0001, 0x29b3: 0x0001, 0x29b4: 0x0001, 0x29b5: 0x0001, + 0x29b6: 0x0001, 0x29b7: 0x0001, 0x29b8: 0x0001, 0x29b9: 0x0001, 0x29ba: 0x0001, 0x29bb: 0x0001, + 0x29bc: 0x0001, 0x29bd: 0x000c, 0x29be: 0x000c, 0x29bf: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0001, 0x29c1: 0x0001, 0x29c2: 0x0001, 0x29c3: 0x0001, 0x29c4: 0x0001, 0x29c5: 0x0001, + 0x29c6: 0x0001, 0x29c7: 0x0001, 0x29c8: 0x0001, 0x29c9: 0x0001, 0x29ca: 0x0001, 0x29cb: 0x0001, + 0x29cc: 0x0001, 0x29cd: 0x0001, 0x29ce: 0x0001, 0x29cf: 0x0001, 0x29d0: 0x0001, 0x29d1: 0x0001, + 0x29d2: 0x0001, 0x29d3: 0x0001, 0x29d4: 0x0001, 0x29d5: 0x0001, 0x29d6: 0x0001, 0x29d7: 0x0001, + 0x29d8: 0x0001, 0x29d9: 0x0001, 0x29da: 0x0001, 0x29db: 0x0001, 0x29dc: 0x0001, 0x29dd: 0x0001, + 0x29de: 0x0001, 0x29df: 0x0001, 0x29e0: 0x0001, 0x29e1: 0x0001, 0x29e2: 0x0001, 0x29e3: 0x0001, + 0x29e4: 0x0001, 0x29e5: 0x0001, 0x29e6: 0x0001, 0x29e7: 0x0001, 0x29e8: 0x0001, 0x29e9: 0x0001, + 0x29ea: 0x0001, 0x29eb: 0x0001, 0x29ec: 0x0001, 0x29ed: 0x0001, 0x29ee: 0x0001, 0x29ef: 0x0001, + 0x29f0: 0x000d, 0x29f1: 0x000d, 0x29f2: 0x000d, 0x29f3: 0x000d, 0x29f4: 0x000d, 0x29f5: 0x000d, + 0x29f6: 0x000d, 0x29f7: 0x000d, 0x29f8: 0x000d, 0x29f9: 0x000d, 0x29fa: 0x000d, 0x29fb: 0x000d, + 0x29fc: 0x000d, 0x29fd: 0x000d, 0x29fe: 0x000d, 0x29ff: 0x000d, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000d, 0x2a01: 0x000d, 0x2a02: 0x000d, 0x2a03: 0x000d, 0x2a04: 0x000d, 0x2a05: 0x000d, + 0x2a06: 0x000c, 0x2a07: 0x000c, 0x2a08: 0x000c, 0x2a09: 0x000c, 0x2a0a: 0x000c, 0x2a0b: 0x000c, + 0x2a0c: 0x000c, 0x2a0d: 0x000c, 0x2a0e: 0x000c, 0x2a0f: 0x000c, 0x2a10: 0x000c, 0x2a11: 0x000d, + 0x2a12: 0x000d, 0x2a13: 0x000d, 0x2a14: 0x000d, 0x2a15: 0x000d, 0x2a16: 0x000d, 0x2a17: 0x000d, + 0x2a18: 0x000d, 0x2a19: 0x000d, 0x2a1a: 0x0001, 0x2a1b: 0x0001, 0x2a1c: 0x0001, 0x2a1d: 0x0001, + 0x2a1e: 0x0001, 0x2a1f: 0x0001, 0x2a20: 0x0001, 0x2a21: 0x0001, 0x2a22: 0x0001, 0x2a23: 0x0001, + 0x2a24: 0x0001, 0x2a25: 0x0001, 0x2a26: 0x0001, 0x2a27: 0x0001, 0x2a28: 0x0001, 0x2a29: 0x0001, + 0x2a2a: 0x0001, 0x2a2b: 0x0001, 0x2a2c: 0x0001, 0x2a2d: 0x0001, 0x2a2e: 0x0001, 0x2a2f: 0x0001, + 0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001, + 0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001, + 0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x000c, 0x2a43: 0x000c, 0x2a44: 0x000c, 0x2a45: 0x000c, + 0x2a46: 0x0001, 0x2a47: 0x0001, 0x2a48: 0x0001, 0x2a49: 0x0001, 0x2a4a: 0x0001, 0x2a4b: 0x0001, + 0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001, + 0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001, + 0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001, + 0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001, + 0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001, + 0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001, + 0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001, + 0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001, + 0x2a7c: 0x0001, 0x2a7d: 0x0001, 0x2a7e: 0x0001, 0x2a7f: 0x0001, + // Block 0xaa, offset 0x2a80 + 0x2a81: 0x000c, + 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c, + 0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, 0x2abf: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2ac2: 0x000c, 0x2ac3: 0x000c, 0x2ac4: 0x000c, 0x2ac5: 0x000c, + 0x2ac6: 0x000c, + 0x2ad2: 0x000a, 0x2ad3: 0x000a, 0x2ad4: 0x000a, 0x2ad5: 0x000a, 0x2ad6: 0x000a, 0x2ad7: 0x000a, + 0x2ad8: 0x000a, 0x2ad9: 0x000a, 0x2ada: 0x000a, 0x2adb: 0x000a, 0x2adc: 0x000a, 0x2add: 0x000a, + 0x2ade: 0x000a, 0x2adf: 0x000a, 0x2ae0: 0x000a, 0x2ae1: 0x000a, 0x2ae2: 0x000a, 0x2ae3: 0x000a, + 0x2ae4: 0x000a, 0x2ae5: 0x000a, + 0x2af0: 0x000c, 0x2af3: 0x000c, 0x2af4: 0x000c, + 0x2aff: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b33: 0x000c, 0x2b34: 0x000c, 0x2b35: 0x000c, + 0x2b36: 0x000c, 0x2b39: 0x000c, 0x2b3a: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, 0x2b41: 0x000c, 0x2b42: 0x000c, + 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6d: 0x000c, 0x2b6e: 0x000c, 0x2b6f: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x000c, 0x2bc1: 0x000c, + 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c, + 0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c09: 0x000c, 0x2c0a: 0x000c, 0x2c0b: 0x000c, + 0x2c0c: 0x000c, 0x2c0f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c6f: 0x000c, + 0x2c70: 0x000c, 0x2c71: 0x000c, 0x2c74: 0x000c, + 0x2c76: 0x000c, 0x2c77: 0x000c, + 0x2c7e: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c9f: 0x000c, 0x2ca3: 0x000c, + 0x2ca4: 0x000c, 0x2ca5: 0x000c, 0x2ca6: 0x000c, 0x2ca7: 0x000c, 0x2ca8: 0x000c, 0x2ca9: 0x000c, + 0x2caa: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2ce6: 0x000c, 0x2ce7: 0x000c, 0x2ce8: 0x000c, 0x2ce9: 0x000c, + 0x2cea: 0x000c, 0x2ceb: 0x000c, 0x2cec: 0x000c, + 0x2cf0: 0x000c, 0x2cf1: 0x000c, 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3b: 0x000c, + 0x2d3c: 0x000c, 0x2d3d: 0x000c, 0x2d3e: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d42: 0x000c, 0x2d43: 0x000c, 0x2d44: 0x000c, + 0x2d46: 0x000c, + 0x2d5e: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db6: 0x000c, 0x2db7: 0x000c, 0x2db8: 0x000c, 0x2dba: 0x000c, + 0x2dbf: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e3c: 0x000c, 0x2e3d: 0x000c, 0x2e3f: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x000c, + 0x2e5c: 0x000c, 0x2e5d: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, + 0x2ebd: 0x000c, 0x2ebf: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x000c, + 0x2ee0: 0x000a, 0x2ee1: 0x000a, 0x2ee2: 0x000a, 0x2ee3: 0x000a, + 0x2ee4: 0x000a, 0x2ee5: 0x000a, 0x2ee6: 0x000a, 0x2ee7: 0x000a, 0x2ee8: 0x000a, 0x2ee9: 0x000a, + 0x2eea: 0x000a, 0x2eeb: 0x000a, 0x2eec: 0x000a, + // Block 0xbc, offset 0x2f00 + 0x2f2b: 0x000c, 0x2f2d: 0x000c, + 0x2f30: 0x000c, 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, + 0x2f37: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f5d: 0x000c, + 0x2f5e: 0x000c, 0x2f5f: 0x000c, 0x2f62: 0x000c, 0x2f63: 0x000c, + 0x2f64: 0x000c, 0x2f65: 0x000c, 0x2f67: 0x000c, 0x2f68: 0x000c, 0x2f69: 0x000c, + 0x2f6a: 0x000c, 0x2f6b: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, 0x2fb7: 0x000c, 0x2fb9: 0x000c, 0x2fba: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ffb: 0x000c, + 0x2ffc: 0x000c, 0x2ffe: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3003: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3054: 0x000c, 0x3055: 0x000c, 0x3056: 0x000c, 0x3057: 0x000c, + 0x305a: 0x000c, 0x305b: 0x000c, + 0x3060: 0x000c, + // Block 0xc2, offset 0x3080 + 0x3081: 0x000c, 0x3082: 0x000c, 0x3083: 0x000c, 0x3084: 0x000c, 0x3085: 0x000c, + 0x3086: 0x000c, 0x3089: 0x000c, 0x308a: 0x000c, + 0x30b3: 0x000c, 0x30b4: 0x000c, 0x30b5: 0x000c, + 0x30b6: 0x000c, 0x30b7: 0x000c, 0x30b8: 0x000c, 0x30bb: 0x000c, + 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30c7: 0x000c, + 0x30d1: 0x000c, + 0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c, + 0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c, + // Block 0xc4, offset 0x3100 + 0x310a: 0x000c, 0x310b: 0x000c, + 0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c, + 0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c, + 0x3118: 0x000c, 0x3119: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c, + 0x3176: 0x000c, 0x3178: 0x000c, 0x3179: 0x000c, 0x317a: 0x000c, 0x317b: 0x000c, + 0x317c: 0x000c, 0x317d: 0x000c, + // Block 0xc6, offset 0x3180 + 0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x000c, + 0x3198: 0x000c, 0x3199: 0x000c, 0x319a: 0x000c, 0x319b: 0x000c, 0x319c: 0x000c, 0x319d: 0x000c, + 0x319e: 0x000c, 0x319f: 0x000c, 0x31a0: 0x000c, 0x31a1: 0x000c, 0x31a2: 0x000c, 0x31a3: 0x000c, + 0x31a4: 0x000c, 0x31a5: 0x000c, 0x31a6: 0x000c, 0x31a7: 0x000c, + 0x31aa: 0x000c, 0x31ab: 0x000c, 0x31ac: 0x000c, 0x31ad: 0x000c, 0x31ae: 0x000c, 0x31af: 0x000c, + 0x31b0: 0x000c, 0x31b2: 0x000c, 0x31b3: 0x000c, 0x31b5: 0x000c, + 0x31b6: 0x000c, + // Block 0xc7, offset 0x31c0 + 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, + 0x31f6: 0x000c, 0x31fa: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, + 0x3207: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3250: 0x000c, 0x3251: 0x000c, + 0x3255: 0x000c, 0x3257: 0x000c, + // Block 0xca, offset 0x3280 + 0x32b3: 0x000c, 0x32b4: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, + 0x32f6: 0x000c, 0x32f7: 0x000c, 0x32f8: 0x000c, 0x32f9: 0x000c, 0x32fa: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000c, 0x3302: 0x000c, + // Block 0xcd, offset 0x3340 + 0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a, + 0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x0004, + 0x335e: 0x0004, 0x335f: 0x0004, 0x3360: 0x0004, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a, + 0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a, + 0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a, + 0x3370: 0x000a, 0x3371: 0x000a, + // Block 0xce, offset 0x3380 + 0x3380: 0x000c, + 0x3387: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, + 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, + 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, + // Block 0xcf, offset 0x33c0 + 0x33f0: 0x000c, 0x33f1: 0x000c, 0x33f2: 0x000c, 0x33f3: 0x000c, 0x33f4: 0x000c, + // Block 0xd0, offset 0x3400 + 0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c, + 0x3436: 0x000c, + // Block 0xd1, offset 0x3440 + 0x344f: 0x000c, + // Block 0xd2, offset 0x3480 + 0x348f: 0x000c, 0x3490: 0x000c, 0x3491: 0x000c, + 0x3492: 0x000c, + // Block 0xd3, offset 0x34c0 + 0x34e2: 0x000a, + 0x34e4: 0x000c, + // Block 0xd4, offset 0x3500 + 0x351d: 0x000c, + 0x351e: 0x000c, 0x3520: 0x000b, 0x3521: 0x000b, 0x3522: 0x000b, 0x3523: 0x000b, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000c, 0x3541: 0x000c, 0x3542: 0x000c, 0x3543: 0x000c, 0x3544: 0x000c, 0x3545: 0x000c, + 0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x000c, + 0x354c: 0x000c, 0x354d: 0x000c, 0x354e: 0x000c, 0x354f: 0x000c, 0x3550: 0x000c, 0x3551: 0x000c, + 0x3552: 0x000c, 0x3553: 0x000c, 0x3554: 0x000c, 0x3555: 0x000c, 0x3556: 0x000c, 0x3557: 0x000c, + 0x3558: 0x000c, 0x3559: 0x000c, 0x355a: 0x000c, 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c, + 0x355e: 0x000c, 0x355f: 0x000c, 0x3560: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c, + 0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c, + 0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c, + 0x3570: 0x000c, 0x3571: 0x000c, 0x3572: 0x000c, 0x3573: 0x000c, 0x3574: 0x000c, 0x3575: 0x000c, + 0x3576: 0x000c, 0x3577: 0x000c, 0x3578: 0x000c, 0x3579: 0x000c, 0x357a: 0x000c, 0x357b: 0x000c, + 0x357c: 0x000c, 0x357d: 0x000c, 0x357e: 0x000c, 0x357f: 0x000c, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c, + 0x3586: 0x000c, + // Block 0xd7, offset 0x35c0 + 0x35e7: 0x000c, 0x35e8: 0x000c, 0x35e9: 0x000c, + 0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b, + 0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000c, + 0x35fc: 0x000c, 0x35fd: 0x000c, 0x35fe: 0x000c, 0x35ff: 0x000c, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3605: 0x000c, + 0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c, + 0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c, + // Block 0xd9, offset 0x3640 + 0x3669: 0x000a, + 0x366a: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000c, 0x3683: 0x000c, 0x3684: 0x000c, 0x3685: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, + 0x36c6: 0x000a, 0x36c7: 0x000a, 0x36c8: 0x000a, 0x36c9: 0x000a, 0x36ca: 0x000a, 0x36cb: 0x000a, + 0x36cc: 0x000a, 0x36cd: 0x000a, 0x36ce: 0x000a, 0x36cf: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a, + 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, + // Block 0xdc, offset 0x3700 + 0x371b: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3755: 0x000a, + // Block 0xde, offset 0x3780 + 0x378f: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c9: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3803: 0x000a, + 0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002, + 0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002, + 0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002, + 0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, + 0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002, + 0x382a: 0x0002, 0x382b: 0x0002, 0x382c: 0x0002, 0x382d: 0x0002, 0x382e: 0x0002, 0x382f: 0x0002, + 0x3830: 0x0002, 0x3831: 0x0002, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002, + 0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002, + 0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0002, 0x383f: 0x0002, + // Block 0xe1, offset 0x3840 + 0x3840: 0x000c, 0x3841: 0x000c, 0x3842: 0x000c, 0x3843: 0x000c, 0x3844: 0x000c, 0x3845: 0x000c, + 0x3846: 0x000c, 0x3847: 0x000c, 0x3848: 0x000c, 0x3849: 0x000c, 0x384a: 0x000c, 0x384b: 0x000c, + 0x384c: 0x000c, 0x384d: 0x000c, 0x384e: 0x000c, 0x384f: 0x000c, 0x3850: 0x000c, 0x3851: 0x000c, + 0x3852: 0x000c, 0x3853: 0x000c, 0x3854: 0x000c, 0x3855: 0x000c, 0x3856: 0x000c, 0x3857: 0x000c, + 0x3858: 0x000c, 0x3859: 0x000c, 0x385a: 0x000c, 0x385b: 0x000c, 0x385c: 0x000c, 0x385d: 0x000c, + 0x385e: 0x000c, 0x385f: 0x000c, 0x3860: 0x000c, 0x3861: 0x000c, 0x3862: 0x000c, 0x3863: 0x000c, + 0x3864: 0x000c, 0x3865: 0x000c, 0x3866: 0x000c, 0x3867: 0x000c, 0x3868: 0x000c, 0x3869: 0x000c, + 0x386a: 0x000c, 0x386b: 0x000c, 0x386c: 0x000c, 0x386d: 0x000c, 0x386e: 0x000c, 0x386f: 0x000c, + 0x3870: 0x000c, 0x3871: 0x000c, 0x3872: 0x000c, 0x3873: 0x000c, 0x3874: 0x000c, 0x3875: 0x000c, + 0x3876: 0x000c, 0x387b: 0x000c, + 0x387c: 0x000c, 0x387d: 0x000c, 0x387e: 0x000c, 0x387f: 0x000c, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000c, 0x3881: 0x000c, 0x3882: 0x000c, 0x3883: 0x000c, 0x3884: 0x000c, 0x3885: 0x000c, + 0x3886: 0x000c, 0x3887: 0x000c, 0x3888: 0x000c, 0x3889: 0x000c, 0x388a: 0x000c, 0x388b: 0x000c, + 0x388c: 0x000c, 0x388d: 0x000c, 0x388e: 0x000c, 0x388f: 0x000c, 0x3890: 0x000c, 0x3891: 0x000c, + 0x3892: 0x000c, 0x3893: 0x000c, 0x3894: 0x000c, 0x3895: 0x000c, 0x3896: 0x000c, 0x3897: 0x000c, + 0x3898: 0x000c, 0x3899: 0x000c, 0x389a: 0x000c, 0x389b: 0x000c, 0x389c: 0x000c, 0x389d: 0x000c, + 0x389e: 0x000c, 0x389f: 0x000c, 0x38a0: 0x000c, 0x38a1: 0x000c, 0x38a2: 0x000c, 0x38a3: 0x000c, + 0x38a4: 0x000c, 0x38a5: 0x000c, 0x38a6: 0x000c, 0x38a7: 0x000c, 0x38a8: 0x000c, 0x38a9: 0x000c, + 0x38aa: 0x000c, 0x38ab: 0x000c, 0x38ac: 0x000c, + 0x38b5: 0x000c, + // Block 0xe3, offset 0x38c0 + 0x38c4: 0x000c, + 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, + 0x38de: 0x000c, 0x38df: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, + 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, + 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000c, 0x3901: 0x000c, 0x3902: 0x000c, 0x3903: 0x000c, 0x3904: 0x000c, 0x3905: 0x000c, + 0x3906: 0x000c, 0x3908: 0x000c, 0x3909: 0x000c, 0x390a: 0x000c, 0x390b: 0x000c, + 0x390c: 0x000c, 0x390d: 0x000c, 0x390e: 0x000c, 0x390f: 0x000c, 0x3910: 0x000c, 0x3911: 0x000c, + 0x3912: 0x000c, 0x3913: 0x000c, 0x3914: 0x000c, 0x3915: 0x000c, 0x3916: 0x000c, 0x3917: 0x000c, + 0x3918: 0x000c, 0x391b: 0x000c, 0x391c: 0x000c, 0x391d: 0x000c, + 0x391e: 0x000c, 0x391f: 0x000c, 0x3920: 0x000c, 0x3921: 0x000c, 0x3923: 0x000c, + 0x3924: 0x000c, 0x3926: 0x000c, 0x3927: 0x000c, 0x3928: 0x000c, 0x3929: 0x000c, + 0x392a: 0x000c, + // Block 0xe5, offset 0x3940 + 0x396e: 0x000c, + // Block 0xe6, offset 0x3980 + 0x39ac: 0x000c, 0x39ad: 0x000c, 0x39ae: 0x000c, 0x39af: 0x000c, + 0x39bf: 0x0004, + // Block 0xe7, offset 0x39c0 + 0x39ec: 0x000c, 0x39ed: 0x000c, 0x39ee: 0x000c, 0x39ef: 0x000c, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0001, 0x3a01: 0x0001, 0x3a02: 0x0001, 0x3a03: 0x0001, 0x3a04: 0x0001, 0x3a05: 0x0001, + 0x3a06: 0x0001, 0x3a07: 0x0001, 0x3a08: 0x0001, 0x3a09: 0x0001, 0x3a0a: 0x0001, 0x3a0b: 0x0001, + 0x3a0c: 0x0001, 0x3a0d: 0x0001, 0x3a0e: 0x0001, 0x3a0f: 0x0001, 0x3a10: 0x000c, 0x3a11: 0x000c, + 0x3a12: 0x000c, 0x3a13: 0x000c, 0x3a14: 0x000c, 0x3a15: 0x000c, 0x3a16: 0x000c, 0x3a17: 0x0001, + 0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001, + 0x3a1e: 0x0001, 0x3a1f: 0x0001, 0x3a20: 0x0001, 0x3a21: 0x0001, 0x3a22: 0x0001, 0x3a23: 0x0001, + 0x3a24: 0x0001, 0x3a25: 0x0001, 0x3a26: 0x0001, 0x3a27: 0x0001, 0x3a28: 0x0001, 0x3a29: 0x0001, + 0x3a2a: 0x0001, 0x3a2b: 0x0001, 0x3a2c: 0x0001, 0x3a2d: 0x0001, 0x3a2e: 0x0001, 0x3a2f: 0x0001, + 0x3a30: 0x0001, 0x3a31: 0x0001, 0x3a32: 0x0001, 0x3a33: 0x0001, 0x3a34: 0x0001, 0x3a35: 0x0001, + 0x3a36: 0x0001, 0x3a37: 0x0001, 0x3a38: 0x0001, 0x3a39: 0x0001, 0x3a3a: 0x0001, 0x3a3b: 0x0001, + 0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0001, 0x3a41: 0x0001, 0x3a42: 0x0001, 0x3a43: 0x0001, 0x3a44: 0x000c, 0x3a45: 0x000c, + 0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x0001, + 0x3a4c: 0x0001, 0x3a4d: 0x0001, 0x3a4e: 0x0001, 0x3a4f: 0x0001, 0x3a50: 0x0001, 0x3a51: 0x0001, + 0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001, + 0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0001, 0x3a5b: 0x0001, 0x3a5c: 0x0001, 0x3a5d: 0x0001, + 0x3a5e: 0x0001, 0x3a5f: 0x0001, 0x3a60: 0x0001, 0x3a61: 0x0001, 0x3a62: 0x0001, 0x3a63: 0x0001, + 0x3a64: 0x0001, 0x3a65: 0x0001, 0x3a66: 0x0001, 0x3a67: 0x0001, 0x3a68: 0x0001, 0x3a69: 0x0001, + 0x3a6a: 0x0001, 0x3a6b: 0x0001, 0x3a6c: 0x0001, 0x3a6d: 0x0001, 0x3a6e: 0x0001, 0x3a6f: 0x0001, + 0x3a70: 0x0001, 0x3a71: 0x0001, 0x3a72: 0x0001, 0x3a73: 0x0001, 0x3a74: 0x0001, 0x3a75: 0x0001, + 0x3a76: 0x0001, 0x3a77: 0x0001, 0x3a78: 0x0001, 0x3a79: 0x0001, 0x3a7a: 0x0001, 0x3a7b: 0x0001, + 0x3a7c: 0x0001, 0x3a7d: 0x0001, 0x3a7e: 0x0001, 0x3a7f: 0x0001, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001, + 0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0001, 0x3a8b: 0x0001, + 0x3a8c: 0x0001, 0x3a8d: 0x0001, 0x3a8e: 0x0001, 0x3a8f: 0x0001, 0x3a90: 0x0001, 0x3a91: 0x0001, + 0x3a92: 0x0001, 0x3a93: 0x0001, 0x3a94: 0x0001, 0x3a95: 0x0001, 0x3a96: 0x0001, 0x3a97: 0x0001, + 0x3a98: 0x0001, 0x3a99: 0x0001, 0x3a9a: 0x0001, 0x3a9b: 0x0001, 0x3a9c: 0x0001, 0x3a9d: 0x0001, + 0x3a9e: 0x0001, 0x3a9f: 0x0001, 0x3aa0: 0x0001, 0x3aa1: 0x0001, 0x3aa2: 0x0001, 0x3aa3: 0x0001, + 0x3aa4: 0x0001, 0x3aa5: 0x0001, 0x3aa6: 0x0001, 0x3aa7: 0x0001, 0x3aa8: 0x0001, 0x3aa9: 0x0001, + 0x3aaa: 0x0001, 0x3aab: 0x0001, 0x3aac: 0x0001, 0x3aad: 0x0001, 0x3aae: 0x0001, 0x3aaf: 0x0001, + 0x3ab0: 0x0001, 0x3ab1: 0x000d, 0x3ab2: 0x000d, 0x3ab3: 0x000d, 0x3ab4: 0x000d, 0x3ab5: 0x000d, + 0x3ab6: 0x000d, 0x3ab7: 0x000d, 0x3ab8: 0x000d, 0x3ab9: 0x000d, 0x3aba: 0x000d, 0x3abb: 0x000d, + 0x3abc: 0x000d, 0x3abd: 0x000d, 0x3abe: 0x000d, 0x3abf: 0x000d, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x000d, 0x3ac1: 0x000d, 0x3ac2: 0x000d, 0x3ac3: 0x000d, 0x3ac4: 0x000d, 0x3ac5: 0x000d, + 0x3ac6: 0x000d, 0x3ac7: 0x000d, 0x3ac8: 0x000d, 0x3ac9: 0x000d, 0x3aca: 0x000d, 0x3acb: 0x000d, + 0x3acc: 0x000d, 0x3acd: 0x000d, 0x3ace: 0x000d, 0x3acf: 0x000d, 0x3ad0: 0x000d, 0x3ad1: 0x000d, + 0x3ad2: 0x000d, 0x3ad3: 0x000d, 0x3ad4: 0x000d, 0x3ad5: 0x000d, 0x3ad6: 0x000d, 0x3ad7: 0x000d, + 0x3ad8: 0x000d, 0x3ad9: 0x000d, 0x3ada: 0x000d, 0x3adb: 0x000d, 0x3adc: 0x000d, 0x3add: 0x000d, + 0x3ade: 0x000d, 0x3adf: 0x000d, 0x3ae0: 0x000d, 0x3ae1: 0x000d, 0x3ae2: 0x000d, 0x3ae3: 0x000d, + 0x3ae4: 0x000d, 0x3ae5: 0x000d, 0x3ae6: 0x000d, 0x3ae7: 0x000d, 0x3ae8: 0x000d, 0x3ae9: 0x000d, + 0x3aea: 0x000d, 0x3aeb: 0x000d, 0x3aec: 0x000d, 0x3aed: 0x000d, 0x3aee: 0x000d, 0x3aef: 0x000d, + 0x3af0: 0x000d, 0x3af1: 0x000d, 0x3af2: 0x000d, 0x3af3: 0x000d, 0x3af4: 0x000d, 0x3af5: 0x0001, + 0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0001, 0x3afb: 0x0001, + 0x3afc: 0x0001, 0x3afd: 0x0001, 0x3afe: 0x0001, 0x3aff: 0x0001, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0001, 0x3b01: 0x000d, 0x3b02: 0x000d, 0x3b03: 0x000d, 0x3b04: 0x000d, 0x3b05: 0x000d, + 0x3b06: 0x000d, 0x3b07: 0x000d, 0x3b08: 0x000d, 0x3b09: 0x000d, 0x3b0a: 0x000d, 0x3b0b: 0x000d, + 0x3b0c: 0x000d, 0x3b0d: 0x000d, 0x3b0e: 0x000d, 0x3b0f: 0x000d, 0x3b10: 0x000d, 0x3b11: 0x000d, + 0x3b12: 0x000d, 0x3b13: 0x000d, 0x3b14: 0x000d, 0x3b15: 0x000d, 0x3b16: 0x000d, 0x3b17: 0x000d, + 0x3b18: 0x000d, 0x3b19: 0x000d, 0x3b1a: 0x000d, 0x3b1b: 0x000d, 0x3b1c: 0x000d, 0x3b1d: 0x000d, + 0x3b1e: 0x000d, 0x3b1f: 0x000d, 0x3b20: 0x000d, 0x3b21: 0x000d, 0x3b22: 0x000d, 0x3b23: 0x000d, + 0x3b24: 0x000d, 0x3b25: 0x000d, 0x3b26: 0x000d, 0x3b27: 0x000d, 0x3b28: 0x000d, 0x3b29: 0x000d, + 0x3b2a: 0x000d, 0x3b2b: 0x000d, 0x3b2c: 0x000d, 0x3b2d: 0x000d, 0x3b2e: 0x000d, 0x3b2f: 0x000d, + 0x3b30: 0x000d, 0x3b31: 0x000d, 0x3b32: 0x000d, 0x3b33: 0x000d, 0x3b34: 0x000d, 0x3b35: 0x000d, + 0x3b36: 0x000d, 0x3b37: 0x000d, 0x3b38: 0x000d, 0x3b39: 0x000d, 0x3b3a: 0x000d, 0x3b3b: 0x000d, + 0x3b3c: 0x000d, 0x3b3d: 0x000d, 0x3b3e: 0x0001, 0x3b3f: 0x0001, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x000d, 0x3b41: 0x000d, 0x3b42: 0x000d, 0x3b43: 0x000d, 0x3b44: 0x000d, 0x3b45: 0x000d, + 0x3b46: 0x000d, 0x3b47: 0x000d, 0x3b48: 0x000d, 0x3b49: 0x000d, 0x3b4a: 0x000d, 0x3b4b: 0x000d, + 0x3b4c: 0x000d, 0x3b4d: 0x000d, 0x3b4e: 0x000d, 0x3b4f: 0x000d, 0x3b50: 0x000d, 0x3b51: 0x000d, + 0x3b52: 0x000d, 0x3b53: 0x000d, 0x3b54: 0x000d, 0x3b55: 0x000d, 0x3b56: 0x000d, 0x3b57: 0x000d, + 0x3b58: 0x000d, 0x3b59: 0x000d, 0x3b5a: 0x000d, 0x3b5b: 0x000d, 0x3b5c: 0x000d, 0x3b5d: 0x000d, + 0x3b5e: 0x000d, 0x3b5f: 0x000d, 0x3b60: 0x000d, 0x3b61: 0x000d, 0x3b62: 0x000d, 0x3b63: 0x000d, + 0x3b64: 0x000d, 0x3b65: 0x000d, 0x3b66: 0x000d, 0x3b67: 0x000d, 0x3b68: 0x000d, 0x3b69: 0x000d, + 0x3b6a: 0x000d, 0x3b6b: 0x000d, 0x3b6c: 0x000d, 0x3b6d: 0x000d, 0x3b6e: 0x000d, 0x3b6f: 0x000d, + 0x3b70: 0x000a, 0x3b71: 0x000a, 0x3b72: 0x000d, 0x3b73: 0x000d, 0x3b74: 0x000d, 0x3b75: 0x000d, + 0x3b76: 0x000d, 0x3b77: 0x000d, 0x3b78: 0x000d, 0x3b79: 0x000d, 0x3b7a: 0x000d, 0x3b7b: 0x000d, + 0x3b7c: 0x000d, 0x3b7d: 0x000d, 0x3b7e: 0x000d, 0x3b7f: 0x000d, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x000a, 0x3b81: 0x000a, 0x3b82: 0x000a, 0x3b83: 0x000a, 0x3b84: 0x000a, 0x3b85: 0x000a, + 0x3b86: 0x000a, 0x3b87: 0x000a, 0x3b88: 0x000a, 0x3b89: 0x000a, 0x3b8a: 0x000a, 0x3b8b: 0x000a, + 0x3b8c: 0x000a, 0x3b8d: 0x000a, 0x3b8e: 0x000a, 0x3b8f: 0x000a, 0x3b90: 0x000a, 0x3b91: 0x000a, + 0x3b92: 0x000a, 0x3b93: 0x000a, 0x3b94: 0x000a, 0x3b95: 0x000a, 0x3b96: 0x000a, 0x3b97: 0x000a, + 0x3b98: 0x000a, 0x3b99: 0x000a, 0x3b9a: 0x000a, 0x3b9b: 0x000a, 0x3b9c: 0x000a, 0x3b9d: 0x000a, + 0x3b9e: 0x000a, 0x3b9f: 0x000a, 0x3ba0: 0x000a, 0x3ba1: 0x000a, 0x3ba2: 0x000a, 0x3ba3: 0x000a, + 0x3ba4: 0x000a, 0x3ba5: 0x000a, 0x3ba6: 0x000a, 0x3ba7: 0x000a, 0x3ba8: 0x000a, 0x3ba9: 0x000a, + 0x3baa: 0x000a, 0x3bab: 0x000a, + 0x3bb0: 0x000a, 0x3bb1: 0x000a, 0x3bb2: 0x000a, 0x3bb3: 0x000a, 0x3bb4: 0x000a, 0x3bb5: 0x000a, + 0x3bb6: 0x000a, 0x3bb7: 0x000a, 0x3bb8: 0x000a, 0x3bb9: 0x000a, 0x3bba: 0x000a, 0x3bbb: 0x000a, + 0x3bbc: 0x000a, 0x3bbd: 0x000a, 0x3bbe: 0x000a, 0x3bbf: 0x000a, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x000a, 0x3bc1: 0x000a, 0x3bc2: 0x000a, 0x3bc3: 0x000a, 0x3bc4: 0x000a, 0x3bc5: 0x000a, + 0x3bc6: 0x000a, 0x3bc7: 0x000a, 0x3bc8: 0x000a, 0x3bc9: 0x000a, 0x3bca: 0x000a, 0x3bcb: 0x000a, + 0x3bcc: 0x000a, 0x3bcd: 0x000a, 0x3bce: 0x000a, 0x3bcf: 0x000a, 0x3bd0: 0x000a, 0x3bd1: 0x000a, + 0x3bd2: 0x000a, 0x3bd3: 0x000a, + 0x3be0: 0x000a, 0x3be1: 0x000a, 0x3be2: 0x000a, 0x3be3: 0x000a, + 0x3be4: 0x000a, 0x3be5: 0x000a, 0x3be6: 0x000a, 0x3be7: 0x000a, 0x3be8: 0x000a, 0x3be9: 0x000a, + 0x3bea: 0x000a, 0x3beb: 0x000a, 0x3bec: 0x000a, 0x3bed: 0x000a, 0x3bee: 0x000a, + 0x3bf1: 0x000a, 0x3bf2: 0x000a, 0x3bf3: 0x000a, 0x3bf4: 0x000a, 0x3bf5: 0x000a, + 0x3bf6: 0x000a, 0x3bf7: 0x000a, 0x3bf8: 0x000a, 0x3bf9: 0x000a, 0x3bfa: 0x000a, 0x3bfb: 0x000a, + 0x3bfc: 0x000a, 0x3bfd: 0x000a, 0x3bfe: 0x000a, 0x3bff: 0x000a, + // Block 0xf0, offset 0x3c00 + 0x3c01: 0x000a, 0x3c02: 0x000a, 0x3c03: 0x000a, 0x3c04: 0x000a, 0x3c05: 0x000a, + 0x3c06: 0x000a, 0x3c07: 0x000a, 0x3c08: 0x000a, 0x3c09: 0x000a, 0x3c0a: 0x000a, 0x3c0b: 0x000a, + 0x3c0c: 0x000a, 0x3c0d: 0x000a, 0x3c0e: 0x000a, 0x3c0f: 0x000a, 0x3c11: 0x000a, + 0x3c12: 0x000a, 0x3c13: 0x000a, 0x3c14: 0x000a, 0x3c15: 0x000a, 0x3c16: 0x000a, 0x3c17: 0x000a, + 0x3c18: 0x000a, 0x3c19: 0x000a, 0x3c1a: 0x000a, 0x3c1b: 0x000a, 0x3c1c: 0x000a, 0x3c1d: 0x000a, + 0x3c1e: 0x000a, 0x3c1f: 0x000a, 0x3c20: 0x000a, 0x3c21: 0x000a, 0x3c22: 0x000a, 0x3c23: 0x000a, + 0x3c24: 0x000a, 0x3c25: 0x000a, 0x3c26: 0x000a, 0x3c27: 0x000a, 0x3c28: 0x000a, 0x3c29: 0x000a, + 0x3c2a: 0x000a, 0x3c2b: 0x000a, 0x3c2c: 0x000a, 0x3c2d: 0x000a, 0x3c2e: 0x000a, 0x3c2f: 0x000a, + 0x3c30: 0x000a, 0x3c31: 0x000a, 0x3c32: 0x000a, 0x3c33: 0x000a, 0x3c34: 0x000a, 0x3c35: 0x000a, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0002, 0x3c41: 0x0002, 0x3c42: 0x0002, 0x3c43: 0x0002, 0x3c44: 0x0002, 0x3c45: 0x0002, + 0x3c46: 0x0002, 0x3c47: 0x0002, 0x3c48: 0x0002, 0x3c49: 0x0002, 0x3c4a: 0x0002, 0x3c4b: 0x000a, + 0x3c4c: 0x000a, 0x3c4d: 0x000a, 0x3c4e: 0x000a, 0x3c4f: 0x000a, + 0x3c6f: 0x000a, + // Block 0xf2, offset 0x3c80 + 0x3caa: 0x000a, 0x3cab: 0x000a, 0x3cac: 0x000a, 0x3cad: 0x000a, 0x3cae: 0x000a, 0x3caf: 0x000a, + // Block 0xf3, offset 0x3cc0 + 0x3ced: 0x000a, + // Block 0xf4, offset 0x3d00 + 0x3d20: 0x000a, 0x3d21: 0x000a, 0x3d22: 0x000a, 0x3d23: 0x000a, + 0x3d24: 0x000a, 0x3d25: 0x000a, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x000a, 0x3d41: 0x000a, 0x3d42: 0x000a, 0x3d43: 0x000a, 0x3d44: 0x000a, 0x3d45: 0x000a, + 0x3d46: 0x000a, 0x3d47: 0x000a, 0x3d48: 0x000a, 0x3d49: 0x000a, 0x3d4a: 0x000a, 0x3d4b: 0x000a, + 0x3d4c: 0x000a, 0x3d4d: 0x000a, 0x3d4e: 0x000a, 0x3d4f: 0x000a, 0x3d50: 0x000a, 0x3d51: 0x000a, + 0x3d52: 0x000a, 0x3d53: 0x000a, 0x3d54: 0x000a, 0x3d55: 0x000a, 0x3d56: 0x000a, 0x3d57: 0x000a, + 0x3d5c: 0x000a, 0x3d5d: 0x000a, + 0x3d5e: 0x000a, 0x3d5f: 0x000a, 0x3d60: 0x000a, 0x3d61: 0x000a, 0x3d62: 0x000a, 0x3d63: 0x000a, + 0x3d64: 0x000a, 0x3d65: 0x000a, 0x3d66: 0x000a, 0x3d67: 0x000a, 0x3d68: 0x000a, 0x3d69: 0x000a, + 0x3d6a: 0x000a, 0x3d6b: 0x000a, 0x3d6c: 0x000a, + 0x3d70: 0x000a, 0x3d71: 0x000a, 0x3d72: 0x000a, 0x3d73: 0x000a, 0x3d74: 0x000a, 0x3d75: 0x000a, + 0x3d76: 0x000a, 0x3d77: 0x000a, 0x3d78: 0x000a, 0x3d79: 0x000a, 0x3d7a: 0x000a, 0x3d7b: 0x000a, + 0x3d7c: 0x000a, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x000a, 0x3d81: 0x000a, 0x3d82: 0x000a, 0x3d83: 0x000a, 0x3d84: 0x000a, 0x3d85: 0x000a, + 0x3d86: 0x000a, 0x3d87: 0x000a, 0x3d88: 0x000a, 0x3d89: 0x000a, 0x3d8a: 0x000a, 0x3d8b: 0x000a, + 0x3d8c: 0x000a, 0x3d8d: 0x000a, 0x3d8e: 0x000a, 0x3d8f: 0x000a, 0x3d90: 0x000a, 0x3d91: 0x000a, + 0x3d92: 0x000a, 0x3d93: 0x000a, 0x3d94: 0x000a, 0x3d95: 0x000a, 0x3d96: 0x000a, 0x3d97: 0x000a, + 0x3d98: 0x000a, 0x3d99: 0x000a, 0x3d9a: 0x000a, 0x3d9b: 0x000a, 0x3d9c: 0x000a, 0x3d9d: 0x000a, + 0x3d9e: 0x000a, 0x3d9f: 0x000a, 0x3da0: 0x000a, 0x3da1: 0x000a, 0x3da2: 0x000a, 0x3da3: 0x000a, + 0x3da4: 0x000a, 0x3da5: 0x000a, 0x3da6: 0x000a, 0x3da7: 0x000a, 0x3da8: 0x000a, 0x3da9: 0x000a, + 0x3daa: 0x000a, 0x3dab: 0x000a, 0x3dac: 0x000a, 0x3dad: 0x000a, 0x3dae: 0x000a, 0x3daf: 0x000a, + 0x3db0: 0x000a, 0x3db1: 0x000a, 0x3db2: 0x000a, 0x3db3: 0x000a, 0x3db4: 0x000a, 0x3db5: 0x000a, + 0x3db6: 0x000a, 0x3dbb: 0x000a, + 0x3dbc: 0x000a, 0x3dbd: 0x000a, 0x3dbe: 0x000a, 0x3dbf: 0x000a, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x000a, 0x3dc1: 0x000a, 0x3dc2: 0x000a, 0x3dc3: 0x000a, 0x3dc4: 0x000a, 0x3dc5: 0x000a, + 0x3dc6: 0x000a, 0x3dc7: 0x000a, 0x3dc8: 0x000a, 0x3dc9: 0x000a, 0x3dca: 0x000a, 0x3dcb: 0x000a, + 0x3dcc: 0x000a, 0x3dcd: 0x000a, 0x3dce: 0x000a, 0x3dcf: 0x000a, 0x3dd0: 0x000a, 0x3dd1: 0x000a, + 0x3dd2: 0x000a, 0x3dd3: 0x000a, 0x3dd4: 0x000a, 0x3dd5: 0x000a, 0x3dd6: 0x000a, 0x3dd7: 0x000a, + 0x3dd8: 0x000a, 0x3dd9: 0x000a, + 0x3de0: 0x000a, 0x3de1: 0x000a, 0x3de2: 0x000a, 0x3de3: 0x000a, + 0x3de4: 0x000a, 0x3de5: 0x000a, 0x3de6: 0x000a, 0x3de7: 0x000a, 0x3de8: 0x000a, 0x3de9: 0x000a, + 0x3dea: 0x000a, 0x3deb: 0x000a, + 0x3df0: 0x000a, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x000a, 0x3e01: 0x000a, 0x3e02: 0x000a, 0x3e03: 0x000a, 0x3e04: 0x000a, 0x3e05: 0x000a, + 0x3e06: 0x000a, 0x3e07: 0x000a, 0x3e08: 0x000a, 0x3e09: 0x000a, 0x3e0a: 0x000a, 0x3e0b: 0x000a, + 0x3e10: 0x000a, 0x3e11: 0x000a, + 0x3e12: 0x000a, 0x3e13: 0x000a, 0x3e14: 0x000a, 0x3e15: 0x000a, 0x3e16: 0x000a, 0x3e17: 0x000a, + 0x3e18: 0x000a, 0x3e19: 0x000a, 0x3e1a: 0x000a, 0x3e1b: 0x000a, 0x3e1c: 0x000a, 0x3e1d: 0x000a, + 0x3e1e: 0x000a, 0x3e1f: 0x000a, 0x3e20: 0x000a, 0x3e21: 0x000a, 0x3e22: 0x000a, 0x3e23: 0x000a, + 0x3e24: 0x000a, 0x3e25: 0x000a, 0x3e26: 0x000a, 0x3e27: 0x000a, 0x3e28: 0x000a, 0x3e29: 0x000a, + 0x3e2a: 0x000a, 0x3e2b: 0x000a, 0x3e2c: 0x000a, 0x3e2d: 0x000a, 0x3e2e: 0x000a, 0x3e2f: 0x000a, + 0x3e30: 0x000a, 0x3e31: 0x000a, 0x3e32: 0x000a, 0x3e33: 0x000a, 0x3e34: 0x000a, 0x3e35: 0x000a, + 0x3e36: 0x000a, 0x3e37: 0x000a, 0x3e38: 0x000a, 0x3e39: 0x000a, 0x3e3a: 0x000a, 0x3e3b: 0x000a, + 0x3e3c: 0x000a, 0x3e3d: 0x000a, 0x3e3e: 0x000a, 0x3e3f: 0x000a, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x000a, 0x3e41: 0x000a, 0x3e42: 0x000a, 0x3e43: 0x000a, 0x3e44: 0x000a, 0x3e45: 0x000a, + 0x3e46: 0x000a, 0x3e47: 0x000a, + 0x3e50: 0x000a, 0x3e51: 0x000a, + 0x3e52: 0x000a, 0x3e53: 0x000a, 0x3e54: 0x000a, 0x3e55: 0x000a, 0x3e56: 0x000a, 0x3e57: 0x000a, + 0x3e58: 0x000a, 0x3e59: 0x000a, + 0x3e60: 0x000a, 0x3e61: 0x000a, 0x3e62: 0x000a, 0x3e63: 0x000a, + 0x3e64: 0x000a, 0x3e65: 0x000a, 0x3e66: 0x000a, 0x3e67: 0x000a, 0x3e68: 0x000a, 0x3e69: 0x000a, + 0x3e6a: 0x000a, 0x3e6b: 0x000a, 0x3e6c: 0x000a, 0x3e6d: 0x000a, 0x3e6e: 0x000a, 0x3e6f: 0x000a, + 0x3e70: 0x000a, 0x3e71: 0x000a, 0x3e72: 0x000a, 0x3e73: 0x000a, 0x3e74: 0x000a, 0x3e75: 0x000a, + 0x3e76: 0x000a, 0x3e77: 0x000a, 0x3e78: 0x000a, 0x3e79: 0x000a, 0x3e7a: 0x000a, 0x3e7b: 0x000a, + 0x3e7c: 0x000a, 0x3e7d: 0x000a, 0x3e7e: 0x000a, 0x3e7f: 0x000a, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x000a, 0x3e81: 0x000a, 0x3e82: 0x000a, 0x3e83: 0x000a, 0x3e84: 0x000a, 0x3e85: 0x000a, + 0x3e86: 0x000a, 0x3e87: 0x000a, + 0x3e90: 0x000a, 0x3e91: 0x000a, + 0x3e92: 0x000a, 0x3e93: 0x000a, 0x3e94: 0x000a, 0x3e95: 0x000a, 0x3e96: 0x000a, 0x3e97: 0x000a, + 0x3e98: 0x000a, 0x3e99: 0x000a, 0x3e9a: 0x000a, 0x3e9b: 0x000a, 0x3e9c: 0x000a, 0x3e9d: 0x000a, + 0x3e9e: 0x000a, 0x3e9f: 0x000a, 0x3ea0: 0x000a, 0x3ea1: 0x000a, 0x3ea2: 0x000a, 0x3ea3: 0x000a, + 0x3ea4: 0x000a, 0x3ea5: 0x000a, 0x3ea6: 0x000a, 0x3ea7: 0x000a, 0x3ea8: 0x000a, 0x3ea9: 0x000a, + 0x3eaa: 0x000a, 0x3eab: 0x000a, 0x3eac: 0x000a, 0x3ead: 0x000a, + 0x3eb0: 0x000a, 0x3eb1: 0x000a, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x000a, 0x3ec1: 0x000a, 0x3ec2: 0x000a, 0x3ec3: 0x000a, 0x3ec4: 0x000a, 0x3ec5: 0x000a, + 0x3ec6: 0x000a, 0x3ec7: 0x000a, 0x3ec8: 0x000a, 0x3ec9: 0x000a, 0x3eca: 0x000a, 0x3ecb: 0x000a, + 0x3ecc: 0x000a, 0x3ecd: 0x000a, 0x3ece: 0x000a, 0x3ecf: 0x000a, 0x3ed0: 0x000a, 0x3ed1: 0x000a, + 0x3ed2: 0x000a, 0x3ed3: 0x000a, + 0x3ee0: 0x000a, 0x3ee1: 0x000a, 0x3ee2: 0x000a, 0x3ee3: 0x000a, + 0x3ee4: 0x000a, 0x3ee5: 0x000a, 0x3ee6: 0x000a, 0x3ee7: 0x000a, 0x3ee8: 0x000a, 0x3ee9: 0x000a, + 0x3eea: 0x000a, 0x3eeb: 0x000a, 0x3eec: 0x000a, 0x3eed: 0x000a, + 0x3ef0: 0x000a, 0x3ef1: 0x000a, 0x3ef2: 0x000a, 0x3ef3: 0x000a, 0x3ef4: 0x000a, 0x3ef5: 0x000a, + 0x3ef6: 0x000a, 0x3ef7: 0x000a, 0x3ef8: 0x000a, 0x3ef9: 0x000a, 0x3efa: 0x000a, 0x3efb: 0x000a, + 0x3efc: 0x000a, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x000a, 0x3f01: 0x000a, 0x3f02: 0x000a, 0x3f03: 0x000a, 0x3f04: 0x000a, 0x3f05: 0x000a, + 0x3f06: 0x000a, 0x3f07: 0x000a, 0x3f08: 0x000a, + 0x3f10: 0x000a, 0x3f11: 0x000a, + 0x3f12: 0x000a, 0x3f13: 0x000a, 0x3f14: 0x000a, 0x3f15: 0x000a, 0x3f16: 0x000a, 0x3f17: 0x000a, + 0x3f18: 0x000a, 0x3f19: 0x000a, 0x3f1a: 0x000a, 0x3f1b: 0x000a, 0x3f1c: 0x000a, 0x3f1d: 0x000a, + 0x3f1e: 0x000a, 0x3f1f: 0x000a, 0x3f20: 0x000a, 0x3f21: 0x000a, 0x3f22: 0x000a, 0x3f23: 0x000a, + 0x3f24: 0x000a, 0x3f25: 0x000a, 0x3f26: 0x000a, 0x3f27: 0x000a, 0x3f28: 0x000a, 0x3f29: 0x000a, + 0x3f2a: 0x000a, 0x3f2b: 0x000a, 0x3f2c: 0x000a, 0x3f2d: 0x000a, 0x3f2e: 0x000a, 0x3f2f: 0x000a, + 0x3f30: 0x000a, 0x3f31: 0x000a, 0x3f32: 0x000a, 0x3f33: 0x000a, 0x3f34: 0x000a, 0x3f35: 0x000a, + 0x3f36: 0x000a, 0x3f37: 0x000a, 0x3f38: 0x000a, 0x3f39: 0x000a, 0x3f3a: 0x000a, 0x3f3b: 0x000a, + 0x3f3c: 0x000a, 0x3f3d: 0x000a, 0x3f3f: 0x000a, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x000a, 0x3f41: 0x000a, 0x3f42: 0x000a, 0x3f43: 0x000a, 0x3f44: 0x000a, 0x3f45: 0x000a, + 0x3f4e: 0x000a, 0x3f4f: 0x000a, 0x3f50: 0x000a, 0x3f51: 0x000a, + 0x3f52: 0x000a, 0x3f53: 0x000a, 0x3f54: 0x000a, 0x3f55: 0x000a, 0x3f56: 0x000a, 0x3f57: 0x000a, + 0x3f58: 0x000a, 0x3f59: 0x000a, 0x3f5a: 0x000a, 0x3f5b: 0x000a, + 0x3f60: 0x000a, 0x3f61: 0x000a, 0x3f62: 0x000a, 0x3f63: 0x000a, + 0x3f64: 0x000a, 0x3f65: 0x000a, 0x3f66: 0x000a, 0x3f67: 0x000a, 0x3f68: 0x000a, + 0x3f70: 0x000a, 0x3f71: 0x000a, 0x3f72: 0x000a, 0x3f73: 0x000a, 0x3f74: 0x000a, 0x3f75: 0x000a, + 0x3f76: 0x000a, 0x3f77: 0x000a, 0x3f78: 0x000a, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x000a, 0x3f81: 0x000a, 0x3f82: 0x000a, 0x3f83: 0x000a, 0x3f84: 0x000a, 0x3f85: 0x000a, + 0x3f86: 0x000a, 0x3f87: 0x000a, 0x3f88: 0x000a, 0x3f89: 0x000a, 0x3f8a: 0x000a, 0x3f8b: 0x000a, + 0x3f8c: 0x000a, 0x3f8d: 0x000a, 0x3f8e: 0x000a, 0x3f8f: 0x000a, 0x3f90: 0x000a, 0x3f91: 0x000a, + 0x3f92: 0x000a, 0x3f94: 0x000a, 0x3f95: 0x000a, 0x3f96: 0x000a, 0x3f97: 0x000a, + 0x3f98: 0x000a, 0x3f99: 0x000a, 0x3f9a: 0x000a, 0x3f9b: 0x000a, 0x3f9c: 0x000a, 0x3f9d: 0x000a, + 0x3f9e: 0x000a, 0x3f9f: 0x000a, 0x3fa0: 0x000a, 0x3fa1: 0x000a, 0x3fa2: 0x000a, 0x3fa3: 0x000a, + 0x3fa4: 0x000a, 0x3fa5: 0x000a, 0x3fa6: 0x000a, 0x3fa7: 0x000a, 0x3fa8: 0x000a, 0x3fa9: 0x000a, + 0x3faa: 0x000a, 0x3fab: 0x000a, 0x3fac: 0x000a, 0x3fad: 0x000a, 0x3fae: 0x000a, 0x3faf: 0x000a, + 0x3fb0: 0x000a, 0x3fb1: 0x000a, 0x3fb2: 0x000a, 0x3fb3: 0x000a, 0x3fb4: 0x000a, 0x3fb5: 0x000a, + 0x3fb6: 0x000a, 0x3fb7: 0x000a, 0x3fb8: 0x000a, 0x3fb9: 0x000a, 0x3fba: 0x000a, 0x3fbb: 0x000a, + 0x3fbc: 0x000a, 0x3fbd: 0x000a, 0x3fbe: 0x000a, 0x3fbf: 0x000a, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x000a, 0x3fc1: 0x000a, 0x3fc2: 0x000a, 0x3fc3: 0x000a, 0x3fc4: 0x000a, 0x3fc5: 0x000a, + 0x3fc6: 0x000a, 0x3fc7: 0x000a, 0x3fc8: 0x000a, 0x3fc9: 0x000a, 0x3fca: 0x000a, + 0x3ff0: 0x0002, 0x3ff1: 0x0002, 0x3ff2: 0x0002, 0x3ff3: 0x0002, 0x3ff4: 0x0002, 0x3ff5: 0x0002, + 0x3ff6: 0x0002, 0x3ff7: 0x0002, 0x3ff8: 0x0002, 0x3ff9: 0x0002, + // Block 0x100, offset 0x4000 + 0x403e: 0x000b, 0x403f: 0x000b, + // Block 0x101, offset 0x4040 + 0x4040: 0x000b, 0x4041: 0x000b, 0x4042: 0x000b, 0x4043: 0x000b, 0x4044: 0x000b, 0x4045: 0x000b, + 0x4046: 0x000b, 0x4047: 0x000b, 0x4048: 0x000b, 0x4049: 0x000b, 0x404a: 0x000b, 0x404b: 0x000b, + 0x404c: 0x000b, 0x404d: 0x000b, 0x404e: 0x000b, 0x404f: 0x000b, 0x4050: 0x000b, 0x4051: 0x000b, + 0x4052: 0x000b, 0x4053: 0x000b, 0x4054: 0x000b, 0x4055: 0x000b, 0x4056: 0x000b, 0x4057: 0x000b, + 0x4058: 0x000b, 0x4059: 0x000b, 0x405a: 0x000b, 0x405b: 0x000b, 0x405c: 0x000b, 0x405d: 0x000b, + 0x405e: 0x000b, 0x405f: 0x000b, 0x4060: 0x000b, 0x4061: 0x000b, 0x4062: 0x000b, 0x4063: 0x000b, + 0x4064: 0x000b, 0x4065: 0x000b, 0x4066: 0x000b, 0x4067: 0x000b, 0x4068: 0x000b, 0x4069: 0x000b, + 0x406a: 0x000b, 0x406b: 0x000b, 0x406c: 0x000b, 0x406d: 0x000b, 0x406e: 0x000b, 0x406f: 0x000b, + 0x4070: 0x000b, 0x4071: 0x000b, 0x4072: 0x000b, 0x4073: 0x000b, 0x4074: 0x000b, 0x4075: 0x000b, + 0x4076: 0x000b, 0x4077: 0x000b, 0x4078: 0x000b, 0x4079: 0x000b, 0x407a: 0x000b, 0x407b: 0x000b, + 0x407c: 0x000b, 0x407d: 0x000b, 0x407e: 0x000b, 0x407f: 0x000b, + // Block 0x102, offset 0x4080 + 0x4080: 0x000c, 0x4081: 0x000c, 0x4082: 0x000c, 0x4083: 0x000c, 0x4084: 0x000c, 0x4085: 0x000c, + 0x4086: 0x000c, 0x4087: 0x000c, 0x4088: 0x000c, 0x4089: 0x000c, 0x408a: 0x000c, 0x408b: 0x000c, + 0x408c: 0x000c, 0x408d: 0x000c, 0x408e: 0x000c, 0x408f: 0x000c, 0x4090: 0x000c, 0x4091: 0x000c, + 0x4092: 0x000c, 0x4093: 0x000c, 0x4094: 0x000c, 0x4095: 0x000c, 0x4096: 0x000c, 0x4097: 0x000c, + 0x4098: 0x000c, 0x4099: 0x000c, 0x409a: 0x000c, 0x409b: 0x000c, 0x409c: 0x000c, 0x409d: 0x000c, + 0x409e: 0x000c, 0x409f: 0x000c, 0x40a0: 0x000c, 0x40a1: 0x000c, 0x40a2: 0x000c, 0x40a3: 0x000c, + 0x40a4: 0x000c, 0x40a5: 0x000c, 0x40a6: 0x000c, 0x40a7: 0x000c, 0x40a8: 0x000c, 0x40a9: 0x000c, + 0x40aa: 0x000c, 0x40ab: 0x000c, 0x40ac: 0x000c, 0x40ad: 0x000c, 0x40ae: 0x000c, 0x40af: 0x000c, + 0x40b0: 0x000b, 0x40b1: 0x000b, 0x40b2: 0x000b, 0x40b3: 0x000b, 0x40b4: 0x000b, 0x40b5: 0x000b, + 0x40b6: 0x000b, 0x40b7: 0x000b, 0x40b8: 0x000b, 0x40b9: 0x000b, 0x40ba: 0x000b, 0x40bb: 0x000b, + 0x40bc: 0x000b, 0x40bd: 0x000b, 0x40be: 0x000b, 0x40bf: 0x000b, +} + +// bidiIndex: 26 blocks, 1664 entries, 3328 bytes +// Block 0 is the zero block. +var bidiIndex = [1664]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x13, 0xf1: 0x14, 0xf2: 0x14, 0xf3: 0x16, 0xf4: 0x17, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x136: 0x28, 0x137: 0x29, + 0x138: 0x2a, 0x139: 0x2b, 0x13a: 0x2c, 0x13b: 0x2d, 0x13c: 0x2e, 0x13d: 0x2f, 0x13e: 0x30, 0x13f: 0x31, + // Block 0x5, offset 0x140 + 0x140: 0x32, 0x141: 0x33, 0x142: 0x34, + 0x14d: 0x35, 0x14e: 0x36, + 0x150: 0x37, + 0x15a: 0x38, 0x15c: 0x39, 0x15d: 0x3a, 0x15e: 0x3b, 0x15f: 0x3c, + 0x160: 0x3d, 0x162: 0x3e, 0x164: 0x3f, 0x165: 0x40, 0x167: 0x41, + 0x168: 0x42, 0x169: 0x43, 0x16a: 0x44, 0x16b: 0x45, 0x16c: 0x46, 0x16d: 0x47, 0x16e: 0x48, 0x16f: 0x49, + 0x170: 0x4a, 0x173: 0x4b, 0x177: 0x05, + 0x17e: 0x4c, 0x17f: 0x4d, + // Block 0x6, offset 0x180 + 0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55, + 0x188: 0x56, 0x189: 0x55, 0x18a: 0x55, 0x18b: 0x55, 0x18c: 0x57, 0x18d: 0x58, 0x18e: 0x59, 0x18f: 0x55, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x55, 0x195: 0x55, 0x196: 0x55, 0x197: 0x55, + 0x198: 0x55, 0x199: 0x55, 0x19a: 0x5e, 0x19b: 0x55, 0x19c: 0x55, 0x19d: 0x5f, 0x19e: 0x55, 0x19f: 0x60, + 0x1a4: 0x55, 0x1a5: 0x55, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x55, 0x1a9: 0x55, 0x1aa: 0x55, 0x1ab: 0x55, 0x1ac: 0x55, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x55, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x55, 0x1bd: 0x55, 0x1be: 0x55, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x55, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26d: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x8f, 0x2b6: 0x0e, 0x2b7: 0x90, + 0x2b8: 0x91, 0x2b9: 0x92, 0x2ba: 0x0e, 0x2bb: 0x93, 0x2bc: 0x94, 0x2bd: 0x95, 0x2bf: 0x96, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x97, 0x2c5: 0x55, 0x2c6: 0x98, 0x2c7: 0x99, + 0x2cb: 0x9a, 0x2cd: 0x9b, + 0x2e0: 0x9c, 0x2e1: 0x9c, 0x2e2: 0x9c, 0x2e3: 0x9c, 0x2e4: 0x9d, 0x2e5: 0x9c, 0x2e6: 0x9c, 0x2e7: 0x9c, + 0x2e8: 0x9e, 0x2e9: 0x9c, 0x2ea: 0x9c, 0x2eb: 0x9f, 0x2ec: 0xa0, 0x2ed: 0x9c, 0x2ee: 0x9c, 0x2ef: 0x9c, + 0x2f0: 0x9c, 0x2f1: 0x9c, 0x2f2: 0x9c, 0x2f3: 0x9c, 0x2f4: 0xa1, 0x2f5: 0x9c, 0x2f6: 0x9c, 0x2f7: 0x9c, + 0x2f8: 0x9c, 0x2f9: 0xa2, 0x2fa: 0xa3, 0x2fb: 0xa4, 0x2fc: 0xa5, 0x2fd: 0xa6, 0x2fe: 0xa7, 0x2ff: 0x9c, + // Block 0xc, offset 0x300 + 0x300: 0xa8, 0x301: 0xa9, 0x302: 0xaa, 0x303: 0x21, 0x304: 0xab, 0x305: 0xac, 0x306: 0xad, 0x307: 0xae, + 0x308: 0xaf, 0x309: 0x28, 0x30b: 0xb0, 0x30c: 0x26, 0x30d: 0xb1, + 0x310: 0xb2, 0x311: 0xb3, 0x312: 0xb4, 0x313: 0xb5, 0x316: 0xb6, 0x317: 0xb7, + 0x318: 0xb8, 0x319: 0xb9, 0x31a: 0xba, 0x31c: 0xbb, + 0x320: 0xbc, 0x324: 0xbd, 0x325: 0xbe, 0x327: 0xbf, + 0x328: 0xc0, 0x329: 0xc1, 0x32a: 0xc2, + 0x330: 0xc3, 0x332: 0xc4, 0x334: 0xc5, 0x335: 0xc6, 0x336: 0xc7, + 0x33b: 0xc8, 0x33c: 0xc9, 0x33d: 0xca, 0x33f: 0xcb, + // Block 0xd, offset 0x340 + 0x351: 0xcc, + // Block 0xe, offset 0x380 + 0x3ab: 0xcd, 0x3ac: 0xce, + 0x3bd: 0xcf, 0x3be: 0xd0, 0x3bf: 0xd1, + // Block 0xf, offset 0x3c0 + 0x3f2: 0xd2, + // Block 0x10, offset 0x400 + 0x43c: 0xd3, 0x43d: 0xd4, + // Block 0x11, offset 0x440 + 0x445: 0xd5, 0x446: 0xd6, 0x447: 0xd7, + 0x448: 0x55, 0x449: 0xd8, 0x44c: 0x55, 0x44d: 0xd9, + 0x45b: 0xda, 0x45c: 0xdb, 0x45d: 0xdc, 0x45e: 0xdd, 0x45f: 0xde, + 0x468: 0xdf, 0x469: 0xe0, 0x46a: 0xe1, + // Block 0x12, offset 0x480 + 0x480: 0xe2, 0x482: 0xcf, 0x484: 0xce, + 0x48a: 0xe3, 0x48b: 0xe4, + 0x493: 0xe5, + 0x4a0: 0x9c, 0x4a1: 0x9c, 0x4a2: 0x9c, 0x4a3: 0xe6, 0x4a4: 0x9c, 0x4a5: 0xe7, 0x4a6: 0x9c, 0x4a7: 0x9c, + 0x4a8: 0x9c, 0x4a9: 0x9c, 0x4aa: 0x9c, 0x4ab: 0x9c, 0x4ac: 0x9c, 0x4ad: 0x9c, 0x4ae: 0x9c, 0x4af: 0x9c, + 0x4b0: 0x9c, 0x4b1: 0xe8, 0x4b2: 0xe9, 0x4b3: 0x9c, 0x4b4: 0xea, 0x4b5: 0x9c, 0x4b6: 0x9c, 0x4b7: 0x9c, + 0x4b8: 0x0e, 0x4b9: 0x0e, 0x4ba: 0x0e, 0x4bb: 0xeb, 0x4bc: 0x9c, 0x4bd: 0x9c, 0x4be: 0x9c, 0x4bf: 0x9c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xec, 0x4c1: 0x55, 0x4c2: 0xed, 0x4c3: 0xee, 0x4c4: 0xef, 0x4c5: 0xf0, 0x4c6: 0xf1, + 0x4c9: 0xf2, 0x4cc: 0x55, 0x4cd: 0x55, 0x4ce: 0x55, 0x4cf: 0x55, + 0x4d0: 0x55, 0x4d1: 0x55, 0x4d2: 0x55, 0x4d3: 0x55, 0x4d4: 0x55, 0x4d5: 0x55, 0x4d6: 0x55, 0x4d7: 0x55, + 0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0xf3, 0x4dc: 0x55, 0x4dd: 0xf4, 0x4de: 0x55, 0x4df: 0xf5, + 0x4e0: 0xf6, 0x4e1: 0xf7, 0x4e2: 0xf8, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55, + 0x4e8: 0x55, 0x4e9: 0xf9, 0x4ea: 0xfa, 0x4eb: 0xfb, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0xfc, 0x4ef: 0xfd, + 0x4ff: 0xfe, + // Block 0x14, offset 0x500 + 0x53f: 0xfe, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x553: 0x0b, 0x556: 0x0c, + 0x55b: 0x0d, 0x55c: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x58f: 0x12, + 0x59f: 0x12, + 0x5af: 0x12, + 0x5bf: 0x12, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xff, 0x5c1: 0xff, 0x5c2: 0xff, 0x5c3: 0xff, 0x5c4: 0x05, 0x5c5: 0x05, 0x5c6: 0x05, 0x5c7: 0x100, + 0x5c8: 0xff, 0x5c9: 0xff, 0x5ca: 0xff, 0x5cb: 0xff, 0x5cc: 0xff, 0x5cd: 0xff, 0x5ce: 0xff, 0x5cf: 0xff, + 0x5d0: 0xff, 0x5d1: 0xff, 0x5d2: 0xff, 0x5d3: 0xff, 0x5d4: 0xff, 0x5d5: 0xff, 0x5d6: 0xff, 0x5d7: 0xff, + 0x5d8: 0xff, 0x5d9: 0xff, 0x5da: 0xff, 0x5db: 0xff, 0x5dc: 0xff, 0x5dd: 0xff, 0x5de: 0xff, 0x5df: 0xff, + 0x5e0: 0xff, 0x5e1: 0xff, 0x5e2: 0xff, 0x5e3: 0xff, 0x5e4: 0xff, 0x5e5: 0xff, 0x5e6: 0xff, 0x5e7: 0xff, + 0x5e8: 0xff, 0x5e9: 0xff, 0x5ea: 0xff, 0x5eb: 0xff, 0x5ec: 0xff, 0x5ed: 0xff, 0x5ee: 0xff, 0x5ef: 0xff, + 0x5f0: 0xff, 0x5f1: 0xff, 0x5f2: 0xff, 0x5f3: 0xff, 0x5f4: 0xff, 0x5f5: 0xff, 0x5f6: 0xff, 0x5f7: 0xff, + 0x5f8: 0xff, 0x5f9: 0xff, 0x5fa: 0xff, 0x5fb: 0xff, 0x5fc: 0xff, 0x5fd: 0xff, 0x5fe: 0xff, 0x5ff: 0xff, + // Block 0x18, offset 0x600 + 0x60f: 0x12, + 0x61f: 0x12, + 0x620: 0x15, + 0x62f: 0x12, + 0x63f: 0x12, + // Block 0x19, offset 0x640 + 0x64f: 0x12, +} + +// Total table size 19960 bytes (19KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index 9115ef257..f65785e8a 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go new file mode 100644 index 000000000..e1858b879 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go @@ -0,0 +1,7908 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "15.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [56]uint8{ + 0, 1, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 84, 91, 103, 107, 118, 122, 129, + 130, 132, 202, 214, 216, 218, 220, 222, + 224, 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x199A + firstCCC = 0x2DD5 + endMulti = 0x30A1 + firstLeadingCCC = 0x4AEF + firstCCCZeroExcept = 0x4BB9 + firstStarterWithNLead = 0x4BE0 + lastDecomp = 0x4BE2 + maxDecomp = 0x8000 +) + +// decomps: 19426 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xA6, 0x42, + 0xC3, 0xB0, 0x42, 0xC3, 0xB8, 0x42, 0xC4, 0xA6, + 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, + 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, + 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC7, 0x80, + 0x42, 0xC7, 0x81, 0x42, 0xC7, 0x82, 0x42, 0xC8, + // Bytes 100 - 13f + 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, + 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, 0x93, + 0x42, 0xC9, 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, + 0x96, 0x42, 0xC9, 0x97, 0x42, 0xC9, 0x98, 0x42, + 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, + 0x42, 0xC9, 0x9E, 0x42, 0xC9, 0x9F, 0x42, 0xC9, + 0xA0, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA2, 0x42, + 0xC9, 0xA3, 0x42, 0xC9, 0xA4, 0x42, 0xC9, 0xA5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA7, 0x42, 0xC9, + 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, + 0xC9, 0xAB, 0x42, 0xC9, 0xAC, 0x42, 0xC9, 0xAD, + 0x42, 0xC9, 0xAE, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + 0x42, 0xC9, 0xB6, 0x42, 0xC9, 0xB7, 0x42, 0xC9, + 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBA, 0x42, + // Bytes 180 - 1bf + 0xC9, 0xBB, 0x42, 0xC9, 0xBD, 0x42, 0xC9, 0xBE, + 0x42, 0xCA, 0x80, 0x42, 0xCA, 0x81, 0x42, 0xCA, + 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x84, 0x42, + 0xCA, 0x88, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x8D, 0x42, 0xCA, 0x8E, 0x42, 0xCA, 0x8F, 0x42, + 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, + 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x98, 0x42, 0xCA, + // Bytes 1c0 - 1ff + 0x99, 0x42, 0xCA, 0x9B, 0x42, 0xCA, 0x9C, 0x42, + 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xA1, + 0x42, 0xCA, 0xA2, 0x42, 0xCA, 0xA3, 0x42, 0xCA, + 0xA4, 0x42, 0xCA, 0xA5, 0x42, 0xCA, 0xA6, 0x42, + 0xCA, 0xA7, 0x42, 0xCA, 0xA8, 0x42, 0xCA, 0xA9, + 0x42, 0xCA, 0xAA, 0x42, 0xCA, 0xAB, 0x42, 0xCA, + 0xB9, 0x42, 0xCB, 0x90, 0x42, 0xCB, 0x91, 0x42, + 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, + // Bytes 200 - 23f + 0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, 0xCE, + 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, + 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, + 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, + 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, + 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, + 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, + 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, + // Bytes 240 - 27f + 0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, 0xB3, + 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, + 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, + 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, + 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, + 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, + 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, + 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, + // Bytes 280 - 2bf + 0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, 0x42, + 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, + 0x42, 0xD0, 0xB0, 0x42, 0xD0, 0xB1, 0x42, 0xD0, + 0xB2, 0x42, 0xD0, 0xB3, 0x42, 0xD0, 0xB4, 0x42, + 0xD0, 0xB5, 0x42, 0xD0, 0xB6, 0x42, 0xD0, 0xB7, + 0x42, 0xD0, 0xB8, 0x42, 0xD0, 0xBA, 0x42, 0xD0, + 0xBB, 0x42, 0xD0, 0xBC, 0x42, 0xD0, 0xBD, 0x42, + 0xD0, 0xBE, 0x42, 0xD0, 0xBF, 0x42, 0xD1, 0x80, + // Bytes 2c0 - 2ff + 0x42, 0xD1, 0x81, 0x42, 0xD1, 0x82, 0x42, 0xD1, + 0x83, 0x42, 0xD1, 0x84, 0x42, 0xD1, 0x85, 0x42, + 0xD1, 0x86, 0x42, 0xD1, 0x87, 0x42, 0xD1, 0x88, + 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8B, 0x42, 0xD1, + 0x8C, 0x42, 0xD1, 0x8D, 0x42, 0xD1, 0x8E, 0x42, + 0xD1, 0x95, 0x42, 0xD1, 0x96, 0x42, 0xD1, 0x98, + 0x42, 0xD1, 0x9F, 0x42, 0xD2, 0x91, 0x42, 0xD2, + 0xAB, 0x42, 0xD2, 0xAF, 0x42, 0xD2, 0xB1, 0x42, + // Bytes 300 - 33f + 0xD3, 0x8F, 0x42, 0xD3, 0x99, 0x42, 0xD3, 0xA9, + 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, + 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, + 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, + 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, + 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, + 0xD8, 0xA8, 0x42, 0xD8, 0xA9, 0x42, 0xD8, 0xAA, + 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, + // Bytes 340 - 37f + 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, + 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, + 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, + 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, + 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, + 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, + 0x83, 0x42, 0xD9, 0x84, 0x42, 0xD9, 0x85, 0x42, + 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, + // Bytes 380 - 3bf + 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, + 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, + 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, + 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, + 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, + 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, + 0x42, 0xDA, 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA, + 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, + // Bytes 3c0 - 3ff + 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, + 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, + 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, + 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, + 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, + 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, + 0xDB, 0x89, 0x42, 0xDB, 0x8B, 0x42, 0xDB, 0x8C, + 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, + // Bytes 400 - 43f + 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, + 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, + 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, + 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, + 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, + 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, + 0x84, 0x8A, 0x43, 0xE1, 0x84, 0x8B, 0x43, 0xE1, + 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, + // Bytes 440 - 47f + 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, + 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, + 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, + 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, + 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, + 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, + 0x84, 0xA1, 0x43, 0xE1, 0x84, 0xA2, 0x43, 0xE1, + 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, + // Bytes 480 - 4bf + 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, + 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, + 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, + 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, + 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, + 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, + 0x85, 0x98, 0x43, 0xE1, 0x85, 0x99, 0x43, 0xE1, + 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, + // Bytes 4c0 - 4ff + 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, + 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, + 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, + 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, + 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, + 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, + 0x87, 0x97, 0x43, 0xE1, 0x87, 0x99, 0x43, 0xE1, + 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, + // Bytes 500 - 53f + 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, + 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, + 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, + 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, + 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE1, + 0xB6, 0x91, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, + 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2, + 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, + // Bytes 540 - 57f + 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, + 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, + 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, + 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, + 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, + 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, + 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2, + 0xB1, 0xB1, 0x43, 0xE2, 0xB5, 0xA1, 0x43, 0xE3, + // Bytes 580 - 5bf + 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, + 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, + 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, + 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, + 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, + 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, + 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, + 0x80, 0x95, 0x43, 0xE3, 0x80, 0x96, 0x43, 0xE3, + // Bytes 5c0 - 5ff + 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, + 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, + 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, + 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, + 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, + 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, + 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, + 0x82, 0xB1, 0x43, 0xE3, 0x82, 0xB3, 0x43, 0xE3, + // Bytes 600 - 63f + 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, + 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, + 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, + 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, + 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, + 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, + 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, + 0x83, 0x8D, 0x43, 0xE3, 0x83, 0x8E, 0x43, 0xE3, + // Bytes 640 - 67f + 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, + 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, + 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, + 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, + 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, + 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, + 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, + 0x83, 0xA7, 0x43, 0xE3, 0x83, 0xA8, 0x43, 0xE3, + // Bytes 680 - 6bf + 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, + 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, + 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, + 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, + 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, + 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, + 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, + 0x92, 0xBB, 0x43, 0xE3, 0x93, 0x9F, 0x43, 0xE3, + // Bytes 6c0 - 6ff + 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, + 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, + 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, + 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, + 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, + 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, + 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, + 0xAC, 0x88, 0x43, 0xE3, 0xAC, 0x99, 0x43, 0xE3, + // Bytes 700 - 73f + 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, + 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, + 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, + 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, + 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, + 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, + 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, + 0x82, 0x96, 0x43, 0xE4, 0x83, 0xA3, 0x43, 0xE4, + // Bytes 740 - 77f + 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, + 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, + 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, + 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, + 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, + 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, + 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, + 0x95, 0xAB, 0x43, 0xE4, 0x97, 0x97, 0x43, 0xE4, + // Bytes 780 - 7bf + 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, + 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, + 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, + 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, + 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, + 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, + 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, + 0xB5, 0x96, 0x43, 0xE4, 0xB8, 0x80, 0x43, 0xE4, + // Bytes 7c0 - 7ff + 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, + 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, + 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, + 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, + 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, + 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, + 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, + 0xB8, 0xBD, 0x43, 0xE4, 0xB8, 0xBF, 0x43, 0xE4, + // Bytes 800 - 83f + 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, + 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, + 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, + 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, + 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, + 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, + 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, + 0xBB, 0xA4, 0x43, 0xE4, 0xBC, 0x81, 0x43, 0xE4, + // Bytes 840 - 87f + 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, + 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, + 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, + 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, + 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, + 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, + 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, + 0x83, 0xA7, 0x43, 0xE5, 0x84, 0xAA, 0x43, 0xE5, + // Bytes 880 - 8bf + 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, + 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, + 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, + 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, + 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, + 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, + 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, + 0x86, 0x82, 0x43, 0xE5, 0x86, 0x8D, 0x43, 0xE5, + // Bytes 8c0 - 8ff + 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, + 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, + 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, + 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, + 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, + 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, + 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, + 0x87, 0xA0, 0x43, 0xE5, 0x87, 0xB5, 0x43, 0xE5, + // Bytes 900 - 93f + 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, + 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, + 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, + 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, + 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, + 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, + 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, + 0x8A, 0xA3, 0x43, 0xE5, 0x8A, 0xB3, 0x43, 0xE5, + // Bytes 940 - 97f + 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, + 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, + 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, + 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, + 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, + 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, + 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, + 0x8C, 0xB8, 0x43, 0xE5, 0x8C, 0xBB, 0x43, 0xE5, + // Bytes 980 - 9bf + 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, + 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, + 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, + 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, + 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, + 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, + 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, + 0x8D, 0xBF, 0x43, 0xE5, 0x8E, 0x82, 0x43, 0xE5, + // Bytes 9c0 - 9ff + 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, + 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, + 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, + 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, + 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, + 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, + 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, + 0x90, 0x8D, 0x43, 0xE5, 0x90, 0x8F, 0x43, 0xE5, + // Bytes a00 - a3f + 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, + 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, + 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, + 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, + 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, + 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, + 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, + 0x95, 0xA3, 0x43, 0xE5, 0x96, 0x84, 0x43, 0xE5, + // Bytes a40 - a7f + 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, + 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, + 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, + 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, + 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, + 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, + 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, + 0x9B, 0x9B, 0x43, 0xE5, 0x9B, 0xB9, 0x43, 0xE5, + // Bytes a80 - abf + 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, + 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, + 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, + 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, + 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, + 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, + 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, + 0xA2, 0xAC, 0x43, 0xE5, 0xA2, 0xB3, 0x43, 0xE5, + // Bytes ac0 - aff + 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, + 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, + 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, + 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, + 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, + 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, + 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, + 0xA4, 0xA7, 0x43, 0xE5, 0xA4, 0xA9, 0x43, 0xE5, + // Bytes b00 - b3f + 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, + 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, + 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, + 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, + 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, + 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, + 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, + 0xAC, 0xA8, 0x43, 0xE5, 0xAC, 0xBE, 0x43, 0xE5, + // Bytes b40 - b7f + 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, + 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, + 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, + 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, + 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, + 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, + 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, + 0xB0, 0x8F, 0x43, 0xE5, 0xB0, 0xA2, 0x43, 0xE5, + // Bytes b80 - bbf + 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, + 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, + 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, + 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, + 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, + 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, + 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, + 0xB5, 0xAE, 0x43, 0xE5, 0xB5, 0xBC, 0x43, 0xE5, + // Bytes bc0 - bff + 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, + 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, + 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, + 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, + 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, + 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, + 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, + 0xB9, 0xB4, 0x43, 0xE5, 0xB9, 0xBA, 0x43, 0xE5, + // Bytes c00 - c3f + 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, + 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, + 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, + 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, + 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, + 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, + 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, + 0xBC, 0x84, 0x43, 0xE5, 0xBC, 0x8B, 0x43, 0xE5, + // Bytes c40 - c7f + 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, + 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, + 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, + 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, + 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, + 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, + 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, + 0xBE, 0xAD, 0x43, 0xE5, 0xBF, 0x83, 0x43, 0xE5, + // Bytes c80 - cbf + 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, + 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, + 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, + 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, + 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, + 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, + 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, + 0x85, 0x88, 0x43, 0xE6, 0x85, 0x8C, 0x43, 0xE6, + // Bytes cc0 - cff + 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, + 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, + 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, + 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, + 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, + 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, + 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, + 0x88, 0x90, 0x43, 0xE6, 0x88, 0x9B, 0x43, 0xE6, + // Bytes d00 - d3f + 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, + 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, + 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, + 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, + 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, + 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, + 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, + 0x8C, 0x87, 0x43, 0xE6, 0x8C, 0xBD, 0x43, 0xE6, + // Bytes d40 - d7f + 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, + 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, + 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, + 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, + 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, + 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, + 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, + 0x91, 0xB7, 0x43, 0xE6, 0x91, 0xBE, 0x43, 0xE6, + // Bytes d80 - dbf + 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, + 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, + 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, + 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, + 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, + 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, + 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, + 0x96, 0xB9, 0x43, 0xE6, 0x97, 0x85, 0x43, 0xE6, + // Bytes dc0 - dff + 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, + 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, + 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, + 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, + 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, + 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, + 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, + 0x9B, 0xB4, 0x43, 0xE6, 0x9B, 0xB8, 0x43, 0xE6, + // Bytes e00 - e3f + 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, + 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, + 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, + 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, + 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, + 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, + 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, + 0x9F, 0xB3, 0x43, 0xE6, 0x9F, 0xBA, 0x43, 0xE6, + // Bytes e40 - e7f + 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, + 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, + 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, + 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, + 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, + 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, + 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, + 0xAA, 0xA8, 0x43, 0xE6, 0xAB, 0x93, 0x43, 0xE6, + // Bytes e80 - ebf + 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, + 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, + 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, + 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, + 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, + 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, + 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, + 0xAE, 0xBB, 0x43, 0xE6, 0xAF, 0x8B, 0x43, 0xE6, + // Bytes ec0 - eff + 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, + 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, + 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, + 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, + 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, + 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, + 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, + 0xB4, 0x96, 0x43, 0xE6, 0xB4, 0x9B, 0x43, 0xE6, + // Bytes f00 - f3f + 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, + 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, + 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, + 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, + 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, + 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, + 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, + 0xB8, 0xAF, 0x43, 0xE6, 0xB9, 0xAE, 0x43, 0xE6, + // Bytes f40 - f7f + 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, + 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, + 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, + 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, + 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, + 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, + 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, + 0xBF, 0xBE, 0x43, 0xE7, 0x80, 0x9B, 0x43, 0xE7, + // Bytes f80 - fbf + 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, + 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, + 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, + 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, + 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, + 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, + 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, + 0x85, 0xAE, 0x43, 0xE7, 0x86, 0x9C, 0x43, 0xE7, + // Bytes fc0 - fff + 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, + 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, + 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, + 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, + 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, + 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, + 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, + 0x89, 0x9B, 0x43, 0xE7, 0x89, 0xA2, 0x43, 0xE7, + // Bytes 1000 - 103f + 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, + 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, + 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, + 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, + 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, + 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, + 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, + 0x8E, 0xA5, 0x43, 0xE7, 0x8E, 0xB2, 0x43, 0xE7, + // Bytes 1040 - 107f + 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, + 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, + 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, + 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, + 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, + 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, + 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, + 0x94, 0x86, 0x43, 0xE7, 0x94, 0x98, 0x43, 0xE7, + // Bytes 1080 - 10bf + 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, + 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, + 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, + 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, + 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, + 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, + 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, + 0x97, 0xA2, 0x43, 0xE7, 0x98, 0x90, 0x43, 0xE7, + // Bytes 10c0 - 10ff + 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, + 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, + 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, + 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, + 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, + 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, + 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, + 0x9C, 0x81, 0x43, 0xE7, 0x9C, 0x9E, 0x43, 0xE7, + // Bytes 1100 - 113f + 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, + 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, + 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, + 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, + 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, + 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, + 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, + 0xA3, 0xBB, 0x43, 0xE7, 0xA4, 0xAA, 0x43, 0xE7, + // Bytes 1140 - 117f + 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, + 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, + 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, + 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, + 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, + 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, + 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, + 0xA6, 0x8F, 0x43, 0xE7, 0xA6, 0xAE, 0x43, 0xE7, + // Bytes 1180 - 11bf + 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, + 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, + 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, + 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, + 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, + 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, + 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, + 0xAB, 0xAE, 0x43, 0xE7, 0xAB, 0xB9, 0x43, 0xE7, + // Bytes 11c0 - 11ff + 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, + 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, + 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, + 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, + 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, + 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, + 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, + 0xB3, 0xA7, 0x43, 0xE7, 0xB3, 0xA8, 0x43, 0xE7, + // Bytes 1200 - 123f + 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, + 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, + 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, + 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, + 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, + 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, + 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, + 0xB8, 0xB7, 0x43, 0xE7, 0xB9, 0x81, 0x43, 0xE7, + // Bytes 1240 - 127f + 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, + 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, + 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, + 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, + 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, + 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, + 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, + 0x80, 0x85, 0x43, 0xE8, 0x80, 0x8C, 0x43, 0xE8, + // Bytes 1280 - 12bf + 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, + 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, + 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, + 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, + 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, + 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, + 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, + 0x87, 0x98, 0x43, 0xE8, 0x87, 0xA3, 0x43, 0xE8, + // Bytes 12c0 - 12ff + 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, + 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, + 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, + 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, + 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, + 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, + 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, + 0x89, 0xB8, 0x43, 0xE8, 0x89, 0xB9, 0x43, 0xE8, + // Bytes 1300 - 133f + 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, + 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, + 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, + 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, + 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, + 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, + 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, + 0x8E, 0xAD, 0x43, 0xE8, 0x8E, 0xBD, 0x43, 0xE8, + // Bytes 1340 - 137f + 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, + 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, + 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, + 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, + 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, + 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, + 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, + 0x94, 0x96, 0x43, 0xE8, 0x95, 0xA4, 0x43, 0xE8, + // Bytes 1380 - 13bf + 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, + 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, + 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, + 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, + 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, + 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, + 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, + 0x9B, 0xA2, 0x43, 0xE8, 0x9C, 0x8E, 0x43, 0xE8, + // Bytes 13c0 - 13ff + 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, + 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, + 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, + 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, + 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, + 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, + 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, + 0xA3, 0x97, 0x43, 0xE8, 0xA3, 0x9E, 0x43, 0xE8, + // Bytes 1400 - 143f + 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, + 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, + 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, + 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, + 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, + 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, + 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, + 0xAA, 0xAA, 0x43, 0xE8, 0xAA, 0xBF, 0x43, 0xE8, + // Bytes 1440 - 147f + 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, + 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, + 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, + 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, + 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, + 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, + 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, + 0xB1, 0x95, 0x43, 0xE8, 0xB1, 0xB8, 0x43, 0xE8, + // Bytes 1480 - 14bf + 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, + 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, + 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, + 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, + 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, + 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, + 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, + 0xB6, 0xB3, 0x43, 0xE8, 0xB6, 0xBC, 0x43, 0xE8, + // Bytes 14c0 - 14ff + 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, + 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, + 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, + 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, + 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, + 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, + 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, + 0xBE, 0xB5, 0x43, 0xE8, 0xBE, 0xB6, 0x43, 0xE9, + // Bytes 1500 - 153f + 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, + 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, + 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, + 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, + 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, + 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, + 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, + 0x84, 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9, + // Bytes 1540 - 157f + 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, + 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, + 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, + 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, + 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, + 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, + 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, + 0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, 0xE9, + // Bytes 1580 - 15bf + 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, + 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, + 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, + 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, + 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, + 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, + 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, + 0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, 0xE9, + // Bytes 15c0 - 15ff + 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, + 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, + 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, + 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, + 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, + 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, + 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, + 0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9, + // Bytes 1600 - 163f + 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, + 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, + 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, + 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, + 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, + 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, + 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, + 0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9, + // Bytes 1640 - 167f + 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, + 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, + 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, + 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, + 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, + 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, + 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, + 0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9, + // Bytes 1680 - 16bf + 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, + 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, + 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, + 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, + 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, + 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, + 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, + 0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9, + // Bytes 16c0 - 16ff + 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, + 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, + 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, + 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, + 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, + 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, + 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, + 0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9, + // Bytes 1700 - 173f + 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, + 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, + 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, + 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, + 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, + 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, + 0xBE, 0xA0, 0x43, 0xEA, 0x99, 0x91, 0x43, 0xEA, + 0x9A, 0x89, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, + // Bytes 1740 - 177f + 0x9D, 0xAF, 0x43, 0xEA, 0x9E, 0x8E, 0x43, 0xEA, + 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x43, 0xEA, + 0xAD, 0xA6, 0x43, 0xEA, 0xAD, 0xA7, 0x44, 0xF0, + 0x9D, 0xBC, 0x84, 0x44, 0xF0, 0x9D, 0xBC, 0x85, + 0x44, 0xF0, 0x9D, 0xBC, 0x86, 0x44, 0xF0, 0x9D, + 0xBC, 0x88, 0x44, 0xF0, 0x9D, 0xBC, 0x8A, 0x44, + 0xF0, 0x9D, 0xBC, 0x9E, 0x44, 0xF0, 0xA0, 0x84, + 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, + // Bytes 1780 - 17bf + 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, + 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, + 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, + 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, + 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, + 0xA1, 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA, + 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, + 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, + // Bytes 17c0 - 17ff + 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, + 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, + 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, + 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, + 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, + 0xF0, 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF, + 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, + 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, + // Bytes 1800 - 183f + 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, + 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, + 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, + 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, + 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, + 0x44, 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3, + 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, + 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, + // Bytes 1840 - 187f + 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, + 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, + 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, + 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, + 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, + 0xB6, 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0, + 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, + 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, + // Bytes 1880 - 18bf + 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, + 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, + 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, + 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, + 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, + 0x9B, 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44, + 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, + 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, + // Bytes 18c0 - 18ff + 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, + 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, + 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, + 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, + 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, + 0xA6, 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8, + 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, + 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, + // Bytes 1900 - 193f + 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, + 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, + 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, + 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, + 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, + 0xF0, 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5, + 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, + 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, + // Bytes 1940 - 197f + 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, + 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, + 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, + 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, + 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, + 0x44, 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9, + 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, + 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, + // Bytes 1980 - 19bf + 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, + 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, + 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, + 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, + 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, + 0x2E, 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42, + 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, + 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, + // Bytes 19c0 - 19ff + 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, + 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, + 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, + 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, + 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, + 0x42, 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32, + 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, + 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, + // Bytes 1a00 - 1a3f + 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, + 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, + 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, + 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, + 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, + 0x34, 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36, + 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, + 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, + // Bytes 1a40 - 1a7f + 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, + 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, + 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, + 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, + 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, + 0x71, 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42, + 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, + 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, + // Bytes 1a80 - 1abf + 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, + 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, + 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, + 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, + 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, + 0x42, 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D, + 0x52, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, + 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, + // Bytes 1ac0 - 1aff + 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, + 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, + 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, + 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, + 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, + 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, + 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, + 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, + // Bytes 1b00 - 1b3f + 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, + 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, + 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, + 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, + 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, + 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, + 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, + 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, + // Bytes 1b40 - 1b7f + 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, + 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, + 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, + 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, + 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, + 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, + 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, + 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, + // Bytes 1b80 - 1bbf + 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, + 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, + 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, + 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, + 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, + 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, + 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, + 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, + // Bytes 1bc0 - 1bff + 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, + 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, + 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, + 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, + 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, + 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, + 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, + 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, + // Bytes 1c00 - 1c3f + 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, + 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, + 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, + 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, + 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, + 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, + 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, + 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, + // Bytes 1c40 - 1c7f + 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, + 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, + 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, + 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, + 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, + 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, + 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, + 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, + // Bytes 1c80 - 1cbf + 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, + 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, + 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, + 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, + 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, + 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, + 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, + 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, + // Bytes 1cc0 - 1cff + 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, + 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, + 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, + 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, + 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, + 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, + 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, + // Bytes 1d00 - 1d3f + 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, + 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, + 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, + 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, + 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, + 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, + 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, + 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, + // Bytes 1d40 - 1d7f + 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, + 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, + 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, + 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, + 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, + 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, + 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, + 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, + // Bytes 1d80 - 1dbf + 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, + 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, + 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, + 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, + 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, + 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, + 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, + 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, + // Bytes 1dc0 - 1dff + 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, + 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, + 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, + 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, + 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, + 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, + 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, + 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, + // Bytes 1e00 - 1e3f + 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, + 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, + 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, + 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, + 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, + 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, + 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, + 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, + // Bytes 1e40 - 1e7f + 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, + 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, + 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, + 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, + 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, + 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, + 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, + 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, + // Bytes 1e80 - 1ebf + 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, + 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, + 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, + 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, + 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, + 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, + 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, + 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, + // Bytes 1ec0 - 1eff + 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, + 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, + 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, + 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, + 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, + 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, + 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, + 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, + // Bytes 1f00 - 1f3f + 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, + 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, + 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, + 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, + 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, + 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, + 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, + 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, + // Bytes 1f40 - 1f7f + 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, + 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, + 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, + 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, + 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, + 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, + 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, + 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, + // Bytes 1f80 - 1fbf + 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, + 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, + 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, + 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, + 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, + 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, + 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, + 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, + // Bytes 1fc0 - 1fff + 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, + 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, + 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, + 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, + 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, + 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, + 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, + 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, + // Bytes 2000 - 203f + 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, + 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, + 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, + 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, + 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, + 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, + 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, + 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, + // Bytes 2040 - 207f + 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, + 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, + 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, + 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, + 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, + 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, + 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, + 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, + // Bytes 2080 - 20bf + 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, + 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, + 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, + 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, + 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, + 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, + 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, + 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, + // Bytes 20c0 - 20ff + 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, + 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, + 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, + 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, + 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, + 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, + 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, + 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, + // Bytes 2100 - 213f + 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, + 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, + 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, + 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, + 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, + 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, + 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, + 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, + // Bytes 2140 - 217f + 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, + 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, + 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, + 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, + 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, + 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, + 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, + 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, + // Bytes 2180 - 21bf + 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, + 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, + // Bytes 21c0 - 21ff + 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, + 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, + 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, + 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, + // Bytes 2200 - 223f + 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, + 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, + 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, + 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, + 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, + 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, + 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, + // Bytes 2240 - 227f + 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, + 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, + 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, + 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, + 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, + 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, + // Bytes 2280 - 22bf + 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, + 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, + 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, + 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, + 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, + // Bytes 22c0 - 22ff + 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, + 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 2300 - 233f + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, + // Bytes 2340 - 237f + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, + 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, + // Bytes 2380 - 23bf + 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, + // Bytes 23c0 - 23ff + 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, + 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, + // Bytes 2400 - 243f + 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, + 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, + 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, + 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, + 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, + // Bytes 2440 - 247f + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, + 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, + // Bytes 2480 - 24bf + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, + 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, + 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + // Bytes 24c0 - 24ff + 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, + 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, + // Bytes 2500 - 253f + 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, + // Bytes 2540 - 257f + 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, + 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, + 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, + 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, + // Bytes 2580 - 25bf + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, + 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, + 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, + // Bytes 25c0 - 25ff + 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, + // Bytes 2600 - 263f + 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, + 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, + 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, + // Bytes 2640 - 267f + 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, + 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + // Bytes 2680 - 26bf + 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, + 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + // Bytes 26c0 - 26ff + 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, + // Bytes 2700 - 273f + 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + // Bytes 2740 - 277f + 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, + 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, + 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, + 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, + 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, + // Bytes 2780 - 27bf + 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, + 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, + // Bytes 27c0 - 27ff + 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, + 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, + 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, + 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, + // Bytes 2800 - 283f + 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, + 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, + 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, + 0x83, 0xA0, 0x46, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, + 0x8C, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, + 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, + // Bytes 2840 - 287f + 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, + 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, + 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, + 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, + 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + // Bytes 2880 - 28bf + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, + // Bytes 28c0 - 28ff + 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, + 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, + 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, + // Bytes 2900 - 293f + 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, + 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, + 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, + 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, + // Bytes 2940 - 297f + 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, + 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, 0x9D, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, + // Bytes 2980 - 29bf + 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, + 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + // Bytes 29c0 - 29ff + 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, + 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, + 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, 0xE3, + 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, + // Bytes 2a00 - 2a3f + 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, + 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, + 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, + // Bytes 2a40 - 2a7f + 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, + 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, + 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, + // Bytes 2a80 - 2abf + 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, + 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, + 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, + // Bytes 2ac0 - 2aff + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, + 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + // Bytes 2b00 - 2b3f + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, 0xE3, + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, + // Bytes 2b40 - 2b7f + 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, + // Bytes 2b80 - 2bbf + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, + 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, + // Bytes 2bc0 - 2bff + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, + 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + // Bytes 2c00 - 2c3f + 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, + 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, + 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, + 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, 0x84, + 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, + // Bytes 2c40 - 2c7f + 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, + // Bytes 2c80 - 2cbf + 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, + // Bytes 2cc0 - 2cff + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, + 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, + // Bytes 2d00 - 2d3f + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, + // Bytes 2d40 - 2d7f + 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, + 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, + 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, + // Bytes 2d80 - 2dbf + 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, 0x84, + 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, + // Bytes 2dc0 - 2dff + 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, + 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, + // Bytes 2e00 - 2e3f + 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, + 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, 0xB5, + 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, + // Bytes 2e40 - 2e7f + 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, + 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, + 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, + 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, + 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + // Bytes 2e80 - 2ebf + 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, + 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, 0x91, + 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, + // Bytes 2ec0 - 2eff + 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, + 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, + 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, + 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, + 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, + 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, + 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, + 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, + // Bytes 2f00 - 2f3f + 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, + 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, + 0xF0, 0x91, 0xA4, 0xB5, 0xF0, 0x91, 0xA4, 0xB0, + 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x16, 0x44, + 0x44, 0x5A, 0xCC, 0x8C, 0xCD, 0x44, 0x44, 0x7A, + 0xCC, 0x8C, 0xCD, 0x44, 0x64, 0x7A, 0xCC, 0x8C, + // Bytes 2f40 - 2f7f + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, + // Bytes 2f80 - 2fbf + 0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, + 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, + // Bytes 2fc0 - 2fff + 0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, + 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0x11, 0x4C, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x11, + 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 3000 - 303f + 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x11, 0x4C, 0xE3, + 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, + 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE3, + 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, + // Bytes 3040 - 307f + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x11, + 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x11, 0x52, 0xE3, 0x83, + // Bytes 3080 - 30bf + 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, + 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, + 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, + 0x03, 0x41, 0xCC, 0x80, 0xCD, 0x03, 0x41, 0xCC, + 0x81, 0xCD, 0x03, 0x41, 0xCC, 0x83, 0xCD, 0x03, + // Bytes 30c0 - 30ff + 0x41, 0xCC, 0x84, 0xCD, 0x03, 0x41, 0xCC, 0x89, + 0xCD, 0x03, 0x41, 0xCC, 0x8C, 0xCD, 0x03, 0x41, + 0xCC, 0x8F, 0xCD, 0x03, 0x41, 0xCC, 0x91, 0xCD, + 0x03, 0x41, 0xCC, 0xA5, 0xB9, 0x03, 0x41, 0xCC, + 0xA8, 0xA9, 0x03, 0x42, 0xCC, 0x87, 0xCD, 0x03, + 0x42, 0xCC, 0xA3, 0xB9, 0x03, 0x42, 0xCC, 0xB1, + 0xB9, 0x03, 0x43, 0xCC, 0x81, 0xCD, 0x03, 0x43, + 0xCC, 0x82, 0xCD, 0x03, 0x43, 0xCC, 0x87, 0xCD, + // Bytes 3100 - 313f + 0x03, 0x43, 0xCC, 0x8C, 0xCD, 0x03, 0x44, 0xCC, + 0x87, 0xCD, 0x03, 0x44, 0xCC, 0x8C, 0xCD, 0x03, + 0x44, 0xCC, 0xA3, 0xB9, 0x03, 0x44, 0xCC, 0xA7, + 0xA9, 0x03, 0x44, 0xCC, 0xAD, 0xB9, 0x03, 0x44, + 0xCC, 0xB1, 0xB9, 0x03, 0x45, 0xCC, 0x80, 0xCD, + 0x03, 0x45, 0xCC, 0x81, 0xCD, 0x03, 0x45, 0xCC, + 0x83, 0xCD, 0x03, 0x45, 0xCC, 0x86, 0xCD, 0x03, + 0x45, 0xCC, 0x87, 0xCD, 0x03, 0x45, 0xCC, 0x88, + // Bytes 3140 - 317f + 0xCD, 0x03, 0x45, 0xCC, 0x89, 0xCD, 0x03, 0x45, + 0xCC, 0x8C, 0xCD, 0x03, 0x45, 0xCC, 0x8F, 0xCD, + 0x03, 0x45, 0xCC, 0x91, 0xCD, 0x03, 0x45, 0xCC, + 0xA8, 0xA9, 0x03, 0x45, 0xCC, 0xAD, 0xB9, 0x03, + 0x45, 0xCC, 0xB0, 0xB9, 0x03, 0x46, 0xCC, 0x87, + 0xCD, 0x03, 0x47, 0xCC, 0x81, 0xCD, 0x03, 0x47, + 0xCC, 0x82, 0xCD, 0x03, 0x47, 0xCC, 0x84, 0xCD, + 0x03, 0x47, 0xCC, 0x86, 0xCD, 0x03, 0x47, 0xCC, + // Bytes 3180 - 31bf + 0x87, 0xCD, 0x03, 0x47, 0xCC, 0x8C, 0xCD, 0x03, + 0x47, 0xCC, 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0x82, + 0xCD, 0x03, 0x48, 0xCC, 0x87, 0xCD, 0x03, 0x48, + 0xCC, 0x88, 0xCD, 0x03, 0x48, 0xCC, 0x8C, 0xCD, + 0x03, 0x48, 0xCC, 0xA3, 0xB9, 0x03, 0x48, 0xCC, + 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0xAE, 0xB9, 0x03, + 0x49, 0xCC, 0x80, 0xCD, 0x03, 0x49, 0xCC, 0x81, + 0xCD, 0x03, 0x49, 0xCC, 0x82, 0xCD, 0x03, 0x49, + // Bytes 31c0 - 31ff + 0xCC, 0x83, 0xCD, 0x03, 0x49, 0xCC, 0x84, 0xCD, + 0x03, 0x49, 0xCC, 0x86, 0xCD, 0x03, 0x49, 0xCC, + 0x87, 0xCD, 0x03, 0x49, 0xCC, 0x89, 0xCD, 0x03, + 0x49, 0xCC, 0x8C, 0xCD, 0x03, 0x49, 0xCC, 0x8F, + 0xCD, 0x03, 0x49, 0xCC, 0x91, 0xCD, 0x03, 0x49, + 0xCC, 0xA3, 0xB9, 0x03, 0x49, 0xCC, 0xA8, 0xA9, + 0x03, 0x49, 0xCC, 0xB0, 0xB9, 0x03, 0x4A, 0xCC, + 0x82, 0xCD, 0x03, 0x4B, 0xCC, 0x81, 0xCD, 0x03, + // Bytes 3200 - 323f + 0x4B, 0xCC, 0x8C, 0xCD, 0x03, 0x4B, 0xCC, 0xA3, + 0xB9, 0x03, 0x4B, 0xCC, 0xA7, 0xA9, 0x03, 0x4B, + 0xCC, 0xB1, 0xB9, 0x03, 0x4C, 0xCC, 0x81, 0xCD, + 0x03, 0x4C, 0xCC, 0x8C, 0xCD, 0x03, 0x4C, 0xCC, + 0xA7, 0xA9, 0x03, 0x4C, 0xCC, 0xAD, 0xB9, 0x03, + 0x4C, 0xCC, 0xB1, 0xB9, 0x03, 0x4D, 0xCC, 0x81, + 0xCD, 0x03, 0x4D, 0xCC, 0x87, 0xCD, 0x03, 0x4D, + 0xCC, 0xA3, 0xB9, 0x03, 0x4E, 0xCC, 0x80, 0xCD, + // Bytes 3240 - 327f + 0x03, 0x4E, 0xCC, 0x81, 0xCD, 0x03, 0x4E, 0xCC, + 0x83, 0xCD, 0x03, 0x4E, 0xCC, 0x87, 0xCD, 0x03, + 0x4E, 0xCC, 0x8C, 0xCD, 0x03, 0x4E, 0xCC, 0xA3, + 0xB9, 0x03, 0x4E, 0xCC, 0xA7, 0xA9, 0x03, 0x4E, + 0xCC, 0xAD, 0xB9, 0x03, 0x4E, 0xCC, 0xB1, 0xB9, + 0x03, 0x4F, 0xCC, 0x80, 0xCD, 0x03, 0x4F, 0xCC, + 0x81, 0xCD, 0x03, 0x4F, 0xCC, 0x86, 0xCD, 0x03, + 0x4F, 0xCC, 0x89, 0xCD, 0x03, 0x4F, 0xCC, 0x8B, + // Bytes 3280 - 32bf + 0xCD, 0x03, 0x4F, 0xCC, 0x8C, 0xCD, 0x03, 0x4F, + 0xCC, 0x8F, 0xCD, 0x03, 0x4F, 0xCC, 0x91, 0xCD, + 0x03, 0x50, 0xCC, 0x81, 0xCD, 0x03, 0x50, 0xCC, + 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x81, 0xCD, 0x03, + 0x52, 0xCC, 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x8C, + 0xCD, 0x03, 0x52, 0xCC, 0x8F, 0xCD, 0x03, 0x52, + 0xCC, 0x91, 0xCD, 0x03, 0x52, 0xCC, 0xA7, 0xA9, + 0x03, 0x52, 0xCC, 0xB1, 0xB9, 0x03, 0x53, 0xCC, + // Bytes 32c0 - 32ff + 0x82, 0xCD, 0x03, 0x53, 0xCC, 0x87, 0xCD, 0x03, + 0x53, 0xCC, 0xA6, 0xB9, 0x03, 0x53, 0xCC, 0xA7, + 0xA9, 0x03, 0x54, 0xCC, 0x87, 0xCD, 0x03, 0x54, + 0xCC, 0x8C, 0xCD, 0x03, 0x54, 0xCC, 0xA3, 0xB9, + 0x03, 0x54, 0xCC, 0xA6, 0xB9, 0x03, 0x54, 0xCC, + 0xA7, 0xA9, 0x03, 0x54, 0xCC, 0xAD, 0xB9, 0x03, + 0x54, 0xCC, 0xB1, 0xB9, 0x03, 0x55, 0xCC, 0x80, + 0xCD, 0x03, 0x55, 0xCC, 0x81, 0xCD, 0x03, 0x55, + // Bytes 3300 - 333f + 0xCC, 0x82, 0xCD, 0x03, 0x55, 0xCC, 0x86, 0xCD, + 0x03, 0x55, 0xCC, 0x89, 0xCD, 0x03, 0x55, 0xCC, + 0x8A, 0xCD, 0x03, 0x55, 0xCC, 0x8B, 0xCD, 0x03, + 0x55, 0xCC, 0x8C, 0xCD, 0x03, 0x55, 0xCC, 0x8F, + 0xCD, 0x03, 0x55, 0xCC, 0x91, 0xCD, 0x03, 0x55, + 0xCC, 0xA3, 0xB9, 0x03, 0x55, 0xCC, 0xA4, 0xB9, + 0x03, 0x55, 0xCC, 0xA8, 0xA9, 0x03, 0x55, 0xCC, + 0xAD, 0xB9, 0x03, 0x55, 0xCC, 0xB0, 0xB9, 0x03, + // Bytes 3340 - 337f + 0x56, 0xCC, 0x83, 0xCD, 0x03, 0x56, 0xCC, 0xA3, + 0xB9, 0x03, 0x57, 0xCC, 0x80, 0xCD, 0x03, 0x57, + 0xCC, 0x81, 0xCD, 0x03, 0x57, 0xCC, 0x82, 0xCD, + 0x03, 0x57, 0xCC, 0x87, 0xCD, 0x03, 0x57, 0xCC, + 0x88, 0xCD, 0x03, 0x57, 0xCC, 0xA3, 0xB9, 0x03, + 0x58, 0xCC, 0x87, 0xCD, 0x03, 0x58, 0xCC, 0x88, + 0xCD, 0x03, 0x59, 0xCC, 0x80, 0xCD, 0x03, 0x59, + 0xCC, 0x81, 0xCD, 0x03, 0x59, 0xCC, 0x82, 0xCD, + // Bytes 3380 - 33bf + 0x03, 0x59, 0xCC, 0x83, 0xCD, 0x03, 0x59, 0xCC, + 0x84, 0xCD, 0x03, 0x59, 0xCC, 0x87, 0xCD, 0x03, + 0x59, 0xCC, 0x88, 0xCD, 0x03, 0x59, 0xCC, 0x89, + 0xCD, 0x03, 0x59, 0xCC, 0xA3, 0xB9, 0x03, 0x5A, + 0xCC, 0x81, 0xCD, 0x03, 0x5A, 0xCC, 0x82, 0xCD, + 0x03, 0x5A, 0xCC, 0x87, 0xCD, 0x03, 0x5A, 0xCC, + 0x8C, 0xCD, 0x03, 0x5A, 0xCC, 0xA3, 0xB9, 0x03, + 0x5A, 0xCC, 0xB1, 0xB9, 0x03, 0x61, 0xCC, 0x80, + // Bytes 33c0 - 33ff + 0xCD, 0x03, 0x61, 0xCC, 0x81, 0xCD, 0x03, 0x61, + 0xCC, 0x83, 0xCD, 0x03, 0x61, 0xCC, 0x84, 0xCD, + 0x03, 0x61, 0xCC, 0x89, 0xCD, 0x03, 0x61, 0xCC, + 0x8C, 0xCD, 0x03, 0x61, 0xCC, 0x8F, 0xCD, 0x03, + 0x61, 0xCC, 0x91, 0xCD, 0x03, 0x61, 0xCC, 0xA5, + 0xB9, 0x03, 0x61, 0xCC, 0xA8, 0xA9, 0x03, 0x62, + 0xCC, 0x87, 0xCD, 0x03, 0x62, 0xCC, 0xA3, 0xB9, + 0x03, 0x62, 0xCC, 0xB1, 0xB9, 0x03, 0x63, 0xCC, + // Bytes 3400 - 343f + 0x81, 0xCD, 0x03, 0x63, 0xCC, 0x82, 0xCD, 0x03, + 0x63, 0xCC, 0x87, 0xCD, 0x03, 0x63, 0xCC, 0x8C, + 0xCD, 0x03, 0x64, 0xCC, 0x87, 0xCD, 0x03, 0x64, + 0xCC, 0x8C, 0xCD, 0x03, 0x64, 0xCC, 0xA3, 0xB9, + 0x03, 0x64, 0xCC, 0xA7, 0xA9, 0x03, 0x64, 0xCC, + 0xAD, 0xB9, 0x03, 0x64, 0xCC, 0xB1, 0xB9, 0x03, + 0x65, 0xCC, 0x80, 0xCD, 0x03, 0x65, 0xCC, 0x81, + 0xCD, 0x03, 0x65, 0xCC, 0x83, 0xCD, 0x03, 0x65, + // Bytes 3440 - 347f + 0xCC, 0x86, 0xCD, 0x03, 0x65, 0xCC, 0x87, 0xCD, + 0x03, 0x65, 0xCC, 0x88, 0xCD, 0x03, 0x65, 0xCC, + 0x89, 0xCD, 0x03, 0x65, 0xCC, 0x8C, 0xCD, 0x03, + 0x65, 0xCC, 0x8F, 0xCD, 0x03, 0x65, 0xCC, 0x91, + 0xCD, 0x03, 0x65, 0xCC, 0xA8, 0xA9, 0x03, 0x65, + 0xCC, 0xAD, 0xB9, 0x03, 0x65, 0xCC, 0xB0, 0xB9, + 0x03, 0x66, 0xCC, 0x87, 0xCD, 0x03, 0x67, 0xCC, + 0x81, 0xCD, 0x03, 0x67, 0xCC, 0x82, 0xCD, 0x03, + // Bytes 3480 - 34bf + 0x67, 0xCC, 0x84, 0xCD, 0x03, 0x67, 0xCC, 0x86, + 0xCD, 0x03, 0x67, 0xCC, 0x87, 0xCD, 0x03, 0x67, + 0xCC, 0x8C, 0xCD, 0x03, 0x67, 0xCC, 0xA7, 0xA9, + 0x03, 0x68, 0xCC, 0x82, 0xCD, 0x03, 0x68, 0xCC, + 0x87, 0xCD, 0x03, 0x68, 0xCC, 0x88, 0xCD, 0x03, + 0x68, 0xCC, 0x8C, 0xCD, 0x03, 0x68, 0xCC, 0xA3, + 0xB9, 0x03, 0x68, 0xCC, 0xA7, 0xA9, 0x03, 0x68, + 0xCC, 0xAE, 0xB9, 0x03, 0x68, 0xCC, 0xB1, 0xB9, + // Bytes 34c0 - 34ff + 0x03, 0x69, 0xCC, 0x80, 0xCD, 0x03, 0x69, 0xCC, + 0x81, 0xCD, 0x03, 0x69, 0xCC, 0x82, 0xCD, 0x03, + 0x69, 0xCC, 0x83, 0xCD, 0x03, 0x69, 0xCC, 0x84, + 0xCD, 0x03, 0x69, 0xCC, 0x86, 0xCD, 0x03, 0x69, + 0xCC, 0x89, 0xCD, 0x03, 0x69, 0xCC, 0x8C, 0xCD, + 0x03, 0x69, 0xCC, 0x8F, 0xCD, 0x03, 0x69, 0xCC, + 0x91, 0xCD, 0x03, 0x69, 0xCC, 0xA3, 0xB9, 0x03, + 0x69, 0xCC, 0xA8, 0xA9, 0x03, 0x69, 0xCC, 0xB0, + // Bytes 3500 - 353f + 0xB9, 0x03, 0x6A, 0xCC, 0x82, 0xCD, 0x03, 0x6A, + 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, 0x81, 0xCD, + 0x03, 0x6B, 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, + 0xA3, 0xB9, 0x03, 0x6B, 0xCC, 0xA7, 0xA9, 0x03, + 0x6B, 0xCC, 0xB1, 0xB9, 0x03, 0x6C, 0xCC, 0x81, + 0xCD, 0x03, 0x6C, 0xCC, 0x8C, 0xCD, 0x03, 0x6C, + 0xCC, 0xA7, 0xA9, 0x03, 0x6C, 0xCC, 0xAD, 0xB9, + 0x03, 0x6C, 0xCC, 0xB1, 0xB9, 0x03, 0x6D, 0xCC, + // Bytes 3540 - 357f + 0x81, 0xCD, 0x03, 0x6D, 0xCC, 0x87, 0xCD, 0x03, + 0x6D, 0xCC, 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0x80, + 0xCD, 0x03, 0x6E, 0xCC, 0x81, 0xCD, 0x03, 0x6E, + 0xCC, 0x83, 0xCD, 0x03, 0x6E, 0xCC, 0x87, 0xCD, + 0x03, 0x6E, 0xCC, 0x8C, 0xCD, 0x03, 0x6E, 0xCC, + 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0xA7, 0xA9, 0x03, + 0x6E, 0xCC, 0xAD, 0xB9, 0x03, 0x6E, 0xCC, 0xB1, + 0xB9, 0x03, 0x6F, 0xCC, 0x80, 0xCD, 0x03, 0x6F, + // Bytes 3580 - 35bf + 0xCC, 0x81, 0xCD, 0x03, 0x6F, 0xCC, 0x86, 0xCD, + 0x03, 0x6F, 0xCC, 0x89, 0xCD, 0x03, 0x6F, 0xCC, + 0x8B, 0xCD, 0x03, 0x6F, 0xCC, 0x8C, 0xCD, 0x03, + 0x6F, 0xCC, 0x8F, 0xCD, 0x03, 0x6F, 0xCC, 0x91, + 0xCD, 0x03, 0x70, 0xCC, 0x81, 0xCD, 0x03, 0x70, + 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, 0x81, 0xCD, + 0x03, 0x72, 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, + 0x8C, 0xCD, 0x03, 0x72, 0xCC, 0x8F, 0xCD, 0x03, + // Bytes 35c0 - 35ff + 0x72, 0xCC, 0x91, 0xCD, 0x03, 0x72, 0xCC, 0xA7, + 0xA9, 0x03, 0x72, 0xCC, 0xB1, 0xB9, 0x03, 0x73, + 0xCC, 0x82, 0xCD, 0x03, 0x73, 0xCC, 0x87, 0xCD, + 0x03, 0x73, 0xCC, 0xA6, 0xB9, 0x03, 0x73, 0xCC, + 0xA7, 0xA9, 0x03, 0x74, 0xCC, 0x87, 0xCD, 0x03, + 0x74, 0xCC, 0x88, 0xCD, 0x03, 0x74, 0xCC, 0x8C, + 0xCD, 0x03, 0x74, 0xCC, 0xA3, 0xB9, 0x03, 0x74, + 0xCC, 0xA6, 0xB9, 0x03, 0x74, 0xCC, 0xA7, 0xA9, + // Bytes 3600 - 363f + 0x03, 0x74, 0xCC, 0xAD, 0xB9, 0x03, 0x74, 0xCC, + 0xB1, 0xB9, 0x03, 0x75, 0xCC, 0x80, 0xCD, 0x03, + 0x75, 0xCC, 0x81, 0xCD, 0x03, 0x75, 0xCC, 0x82, + 0xCD, 0x03, 0x75, 0xCC, 0x86, 0xCD, 0x03, 0x75, + 0xCC, 0x89, 0xCD, 0x03, 0x75, 0xCC, 0x8A, 0xCD, + 0x03, 0x75, 0xCC, 0x8B, 0xCD, 0x03, 0x75, 0xCC, + 0x8C, 0xCD, 0x03, 0x75, 0xCC, 0x8F, 0xCD, 0x03, + 0x75, 0xCC, 0x91, 0xCD, 0x03, 0x75, 0xCC, 0xA3, + // Bytes 3640 - 367f + 0xB9, 0x03, 0x75, 0xCC, 0xA4, 0xB9, 0x03, 0x75, + 0xCC, 0xA8, 0xA9, 0x03, 0x75, 0xCC, 0xAD, 0xB9, + 0x03, 0x75, 0xCC, 0xB0, 0xB9, 0x03, 0x76, 0xCC, + 0x83, 0xCD, 0x03, 0x76, 0xCC, 0xA3, 0xB9, 0x03, + 0x77, 0xCC, 0x80, 0xCD, 0x03, 0x77, 0xCC, 0x81, + 0xCD, 0x03, 0x77, 0xCC, 0x82, 0xCD, 0x03, 0x77, + 0xCC, 0x87, 0xCD, 0x03, 0x77, 0xCC, 0x88, 0xCD, + 0x03, 0x77, 0xCC, 0x8A, 0xCD, 0x03, 0x77, 0xCC, + // Bytes 3680 - 36bf + 0xA3, 0xB9, 0x03, 0x78, 0xCC, 0x87, 0xCD, 0x03, + 0x78, 0xCC, 0x88, 0xCD, 0x03, 0x79, 0xCC, 0x80, + 0xCD, 0x03, 0x79, 0xCC, 0x81, 0xCD, 0x03, 0x79, + 0xCC, 0x82, 0xCD, 0x03, 0x79, 0xCC, 0x83, 0xCD, + 0x03, 0x79, 0xCC, 0x84, 0xCD, 0x03, 0x79, 0xCC, + 0x87, 0xCD, 0x03, 0x79, 0xCC, 0x88, 0xCD, 0x03, + 0x79, 0xCC, 0x89, 0xCD, 0x03, 0x79, 0xCC, 0x8A, + 0xCD, 0x03, 0x79, 0xCC, 0xA3, 0xB9, 0x03, 0x7A, + // Bytes 36c0 - 36ff + 0xCC, 0x81, 0xCD, 0x03, 0x7A, 0xCC, 0x82, 0xCD, + 0x03, 0x7A, 0xCC, 0x87, 0xCD, 0x03, 0x7A, 0xCC, + 0x8C, 0xCD, 0x03, 0x7A, 0xCC, 0xA3, 0xB9, 0x03, + 0x7A, 0xCC, 0xB1, 0xB9, 0x04, 0xC2, 0xA8, 0xCC, + 0x80, 0xCE, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, + 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCE, 0x04, 0xC3, + 0x86, 0xCC, 0x81, 0xCD, 0x04, 0xC3, 0x86, 0xCC, + 0x84, 0xCD, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xCD, + // Bytes 3700 - 373f + 0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xCD, 0x04, 0xC3, + 0xA6, 0xCC, 0x84, 0xCD, 0x04, 0xC3, 0xB8, 0xCC, + 0x81, 0xCD, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xCD, + 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xCD, 0x04, 0xCA, + 0x92, 0xCC, 0x8C, 0xCD, 0x04, 0xCE, 0x91, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0x91, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0x91, 0xCD, + // Bytes 3740 - 377f + 0x85, 0xDD, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0x97, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x97, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xDD, + 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0x99, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0x99, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + // Bytes 3780 - 37bf + 0x9F, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x9F, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0xA5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + 0xA9, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0xA9, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xDD, + // Bytes 37c0 - 37ff + 0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB1, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB1, 0xCD, + 0x85, 0xDD, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0xB7, 0xCD, 0x85, 0xDD, 0x04, 0xCE, 0xB9, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB9, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB9, 0xCD, + // Bytes 3800 - 383f + 0x82, 0xCD, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x81, 0xCC, 0x93, 0xCD, 0x04, 0xCF, 0x81, 0xCC, + 0x94, 0xCD, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xCD, + 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x85, 0xCC, 0x84, 0xCD, 0x04, 0xCF, 0x85, 0xCC, + 0x86, 0xCD, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xCD, + 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xDD, 0x04, 0xCF, + // Bytes 3840 - 387f + 0x92, 0xCC, 0x81, 0xCD, 0x04, 0xCF, 0x92, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x90, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x93, 0xCC, + 0x81, 0xCD, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x95, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x96, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xCD, + // Bytes 3880 - 38bf + 0x04, 0xD0, 0x97, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x98, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0x98, 0xCC, + 0x84, 0xCD, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xCD, + 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x9A, 0xCC, 0x81, 0xCD, 0x04, 0xD0, 0x9E, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xCD, + 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0xA3, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, + // Bytes 38c0 - 38ff + 0x8B, 0xCD, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0xAD, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xCD, 0x04, 0xD0, + 0xB5, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + // Bytes 3900 - 393f + 0xB6, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB7, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xCD, 0x04, 0xD0, + 0xB8, 0xCC, 0x86, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xCD, + 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0x83, 0xCC, 0x84, 0xCD, 0x04, 0xD1, 0x83, 0xCC, + 0x86, 0xCD, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xCD, + // Bytes 3940 - 397f + 0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xCD, 0x04, 0xD1, + 0x87, 0xCC, 0x88, 0xCD, 0x04, 0xD1, 0x8B, 0xCC, + 0x88, 0xCD, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xCD, + 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0xB4, 0xCC, 0x8F, 0xCD, 0x04, 0xD1, 0xB5, 0xCC, + 0x8F, 0xCD, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xCD, + 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xD3, + 0xA8, 0xCC, 0x88, 0xCD, 0x04, 0xD3, 0xA9, 0xCC, + // Bytes 3980 - 39bf + 0x88, 0xCD, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xCD, + 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xCD, 0x04, 0xD8, + 0xA7, 0xD9, 0x95, 0xB9, 0x04, 0xD9, 0x88, 0xD9, + 0x94, 0xCD, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xCD, + 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xCD, 0x04, 0xDB, + 0x92, 0xD9, 0x94, 0xCD, 0x04, 0xDB, 0x95, 0xD9, + 0x94, 0xCD, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + // Bytes 39c0 - 39ff + 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x81, 0xCE, 0x05, 0x41, 0xCC, 0x86, + 0xCC, 0x83, 0xCE, 0x05, 0x41, 0xCC, 0x86, 0xCC, + 0x89, 0xCE, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, + 0xCE, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCE, + 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, + // Bytes 3a00 - 3a3f + 0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x41, + 0xCC, 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x43, 0xCC, + 0xA7, 0xCC, 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x80, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, + 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCE, + 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, + 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x45, + // Bytes 3a40 - 3a7f + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x45, 0xCC, + 0xA7, 0xCC, 0x86, 0xCE, 0x05, 0x49, 0xCC, 0x88, + 0xCC, 0x81, 0xCE, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, + 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x4F, + 0xCC, 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + // Bytes 3a80 - 3abf + 0x83, 0xCC, 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x83, + 0xCC, 0x88, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, + 0x80, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, + 0xCE, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x4F, + 0xCC, 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0x83, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, + // Bytes 3ac0 - 3aff + 0xCC, 0x89, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, + 0xA3, 0xBA, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, + 0xCE, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, + 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, + 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x53, + 0xCC, 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x53, 0xCC, + 0xA3, 0xCC, 0x87, 0xCE, 0x05, 0x55, 0xCC, 0x83, + 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x84, 0xCC, + // Bytes 3b00 - 3b3f + 0x88, 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, + // Bytes 3b40 - 3b7f + 0xBA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x61, + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x81, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, + 0x83, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, + 0xCE, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + // Bytes 3b80 - 3bbf + 0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, 0x61, + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x61, 0xCC, + 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x63, 0xCC, 0xA7, + 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x80, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, + 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCE, + 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, + // Bytes 3bc0 - 3bff + 0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, 0x65, + 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, + 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x65, 0xCC, 0xA7, + 0xCC, 0x86, 0xCE, 0x05, 0x69, 0xCC, 0x88, 0xCC, + 0x81, 0xCE, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, + 0xCE, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x6F, + // Bytes 3c00 - 3c3f + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x6F, 0xCC, + 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x83, + 0xCC, 0x84, 0xCE, 0x05, 0x6F, 0xCC, 0x83, 0xCC, + 0x88, 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, + 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCE, + 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, 0x05, + 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x6F, 0xCC, + // Bytes 3c40 - 3c7f + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, + 0xBA, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, + 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, 0x05, + 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, 0x73, + 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, + 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, 0xA3, + // Bytes 3c80 - 3cbf + 0xCC, 0x87, 0xCE, 0x05, 0x75, 0xCC, 0x83, 0xCC, + 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, + 0xCE, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCE, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x05, + 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x75, + 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x75, 0xCC, + 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + // Bytes 3cc0 - 3cff + 0x83, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, + 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xBA, + 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCE, 0x05, + 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCE, 0x05, 0xE1, + 0xBE, 0xBF, 0xCD, 0x82, 0xCE, 0x05, 0xE1, 0xBF, + 0xBE, 0xCC, 0x80, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, + 0xCC, 0x81, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, + 0x82, 0xCE, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, + // Bytes 3d00 - 3d3f + 0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, + 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, + // Bytes 3d40 - 3d7f + 0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3d80 - 3dbf + 0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + // Bytes 3dc0 - 3dff + 0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + // Bytes 3e00 - 3e3f + 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, + 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, + // Bytes 3e40 - 3e7f + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3e80 - 3ebf + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 3ec0 - 3eff + 0xCE, 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, + // Bytes 3f00 - 3f3f + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 3f40 - 3f7f + 0xDE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3f80 - 3fbf + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, + // Bytes 3fc0 - 3fff + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, + // Bytes 4000 - 403f + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, + 0x89, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, + // Bytes 4040 - 407f + 0x15, 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, + // Bytes 4080 - 40bf + 0x11, 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, + // Bytes 40c0 - 40ff + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, + // Bytes 4100 - 413f + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4140 - 417f + 0x11, 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, + // Bytes 4180 - 41bf + 0x11, 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + // Bytes 41c0 - 41ff + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4200 - 423f + 0x11, 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 4240 - 427f + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + // Bytes 4280 - 42bf + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, + // Bytes 42c0 - 42ff + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 4300 - 433f + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + // Bytes 4340 - 437f + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, + // Bytes 4380 - 43bf + 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, 0x82, 0x9B, + 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, + 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x42, + 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xCD, + 0x43, 0x20, 0xCC, 0x83, 0xCD, 0x43, 0x20, 0xCC, + 0x84, 0xCD, 0x43, 0x20, 0xCC, 0x85, 0xCD, 0x43, + 0x20, 0xCC, 0x86, 0xCD, 0x43, 0x20, 0xCC, 0x87, + 0xCD, 0x43, 0x20, 0xCC, 0x88, 0xCD, 0x43, 0x20, + // Bytes 43c0 - 43ff + 0xCC, 0x8A, 0xCD, 0x43, 0x20, 0xCC, 0x8B, 0xCD, + 0x43, 0x20, 0xCC, 0x93, 0xCD, 0x43, 0x20, 0xCC, + 0x94, 0xCD, 0x43, 0x20, 0xCC, 0xA7, 0xA9, 0x43, + 0x20, 0xCC, 0xA8, 0xA9, 0x43, 0x20, 0xCC, 0xB3, + 0xB9, 0x43, 0x20, 0xCD, 0x82, 0xCD, 0x43, 0x20, + 0xCD, 0x85, 0xDD, 0x43, 0x20, 0xD9, 0x8B, 0x5D, + 0x43, 0x20, 0xD9, 0x8C, 0x61, 0x43, 0x20, 0xD9, + 0x8D, 0x65, 0x43, 0x20, 0xD9, 0x8E, 0x69, 0x43, + // Bytes 4400 - 443f + 0x20, 0xD9, 0x8F, 0x6D, 0x43, 0x20, 0xD9, 0x90, + 0x71, 0x43, 0x20, 0xD9, 0x91, 0x75, 0x43, 0x20, + 0xD9, 0x92, 0x79, 0x43, 0x41, 0xCC, 0x8A, 0xCD, + 0x43, 0x73, 0xCC, 0x87, 0xCD, 0x44, 0x20, 0xE3, + 0x82, 0x99, 0x11, 0x44, 0x20, 0xE3, 0x82, 0x9A, + 0x11, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, 0x44, + 0xCE, 0x91, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x95, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x97, 0xCC, 0x81, + // Bytes 4440 - 447f + 0xCD, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0x9F, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, 0xCC, 0x88, + 0xCD, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB7, 0xCC, 0x81, + 0xCD, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x85, + // Bytes 4480 - 44bf + 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x89, 0xCC, 0x81, + 0xCD, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x35, 0x44, + 0xD7, 0x90, 0xD6, 0xB8, 0x39, 0x44, 0xD7, 0x90, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x92, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x93, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x94, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x3D, 0x44, + // Bytes 44c0 - 44ff + 0xD7, 0x95, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x96, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x98, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x29, 0x44, + 0xD7, 0x99, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9A, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x9C, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9E, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, + // Bytes 4500 - 453f + 0x45, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA3, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, + 0x4D, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA7, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA8, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x51, 0x44, + 0xD7, 0xA9, 0xD7, 0x82, 0x55, 0x44, 0xD7, 0xAA, + // Bytes 4540 - 457f + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, + 0x35, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x5D, 0x44, + 0xD8, 0xA7, 0xD9, 0x93, 0xCD, 0x44, 0xD8, 0xA7, + 0xD9, 0x94, 0xCD, 0x44, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x7D, 0x44, + 0xD8, 0xB1, 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x80, + 0xD9, 0x8B, 0x5D, 0x44, 0xD9, 0x80, 0xD9, 0x8E, + 0x69, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x6D, 0x44, + // Bytes 4580 - 45bf + 0xD9, 0x80, 0xD9, 0x90, 0x71, 0x44, 0xD9, 0x80, + 0xD9, 0x91, 0x75, 0x44, 0xD9, 0x80, 0xD9, 0x92, + 0x79, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x7D, 0x44, + 0xD9, 0x88, 0xD9, 0x94, 0xCD, 0x44, 0xD9, 0x89, + 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x8A, 0xD9, 0x94, + 0xCD, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xCD, 0x44, + 0xDB, 0x95, 0xD9, 0x94, 0xCD, 0x45, 0x20, 0xCC, + 0x88, 0xCC, 0x80, 0xCE, 0x45, 0x20, 0xCC, 0x88, + // Bytes 45c0 - 45ff + 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, 0x88, 0xCD, + 0x82, 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCE, + 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x45, + 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, + 0x94, 0xCD, 0x82, 0xCE, 0x45, 0x20, 0xD9, 0x8C, + 0xD9, 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8D, 0xD9, + // Bytes 4600 - 463f + 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, + 0x76, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x76, + 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x45, + 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7E, 0x45, 0xE2, + 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xCF, 0x85, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xD7, 0xA9, + 0xD6, 0xBC, 0xD7, 0x81, 0x52, 0x46, 0xD7, 0xA9, + // Bytes 4640 - 467f + 0xD6, 0xBC, 0xD7, 0x82, 0x56, 0x46, 0xD9, 0x80, + 0xD9, 0x8E, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x8F, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x46, 0xE0, 0xA4, + 0x95, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x96, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x97, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x9C, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + // Bytes 4680 - 46bf + 0xA1, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xA2, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAB, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAF, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA1, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA2, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xAF, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x96, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + // Bytes 46c0 - 46ff + 0x97, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x9C, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xAB, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB2, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB8, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA1, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA2, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE0, 0xBE, + // Bytes 4700 - 473f + 0xB3, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE3, 0x83, + 0x86, 0xE3, 0x82, 0x99, 0x11, 0x48, 0xF0, 0x9D, + 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x48, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xBA, + 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x49, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, + // Bytes 4740 - 477f + 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, + 0xBE, 0x80, 0xA2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, + 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xB0, 0xB2, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + // Bytes 4780 - 47bf + 0x85, 0xB1, 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, + 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xB2, 0x4C, + 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, 0xF0, 0x9D, + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAE, 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, + // Bytes 47c0 - 47ff + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, + 0xB2, 0x83, 0x41, 0xCC, 0x82, 0xCD, 0x83, 0x41, + 0xCC, 0x86, 0xCD, 0x83, 0x41, 0xCC, 0x87, 0xCD, + 0x83, 0x41, 0xCC, 0x88, 0xCD, 0x83, 0x41, 0xCC, + 0x8A, 0xCD, 0x83, 0x41, 0xCC, 0xA3, 0xB9, 0x83, + 0x43, 0xCC, 0xA7, 0xA9, 0x83, 0x45, 0xCC, 0x82, + 0xCD, 0x83, 0x45, 0xCC, 0x84, 0xCD, 0x83, 0x45, + 0xCC, 0xA3, 0xB9, 0x83, 0x45, 0xCC, 0xA7, 0xA9, + // Bytes 4800 - 483f + 0x83, 0x49, 0xCC, 0x88, 0xCD, 0x83, 0x4C, 0xCC, + 0xA3, 0xB9, 0x83, 0x4F, 0xCC, 0x82, 0xCD, 0x83, + 0x4F, 0xCC, 0x83, 0xCD, 0x83, 0x4F, 0xCC, 0x84, + 0xCD, 0x83, 0x4F, 0xCC, 0x87, 0xCD, 0x83, 0x4F, + 0xCC, 0x88, 0xCD, 0x83, 0x4F, 0xCC, 0x9B, 0xB1, + 0x83, 0x4F, 0xCC, 0xA3, 0xB9, 0x83, 0x4F, 0xCC, + 0xA8, 0xA9, 0x83, 0x52, 0xCC, 0xA3, 0xB9, 0x83, + 0x53, 0xCC, 0x81, 0xCD, 0x83, 0x53, 0xCC, 0x8C, + // Bytes 4840 - 487f + 0xCD, 0x83, 0x53, 0xCC, 0xA3, 0xB9, 0x83, 0x55, + 0xCC, 0x83, 0xCD, 0x83, 0x55, 0xCC, 0x84, 0xCD, + 0x83, 0x55, 0xCC, 0x88, 0xCD, 0x83, 0x55, 0xCC, + 0x9B, 0xB1, 0x83, 0x61, 0xCC, 0x82, 0xCD, 0x83, + 0x61, 0xCC, 0x86, 0xCD, 0x83, 0x61, 0xCC, 0x87, + 0xCD, 0x83, 0x61, 0xCC, 0x88, 0xCD, 0x83, 0x61, + 0xCC, 0x8A, 0xCD, 0x83, 0x61, 0xCC, 0xA3, 0xB9, + 0x83, 0x63, 0xCC, 0xA7, 0xA9, 0x83, 0x65, 0xCC, + // Bytes 4880 - 48bf + 0x82, 0xCD, 0x83, 0x65, 0xCC, 0x84, 0xCD, 0x83, + 0x65, 0xCC, 0xA3, 0xB9, 0x83, 0x65, 0xCC, 0xA7, + 0xA9, 0x83, 0x69, 0xCC, 0x88, 0xCD, 0x83, 0x6C, + 0xCC, 0xA3, 0xB9, 0x83, 0x6F, 0xCC, 0x82, 0xCD, + 0x83, 0x6F, 0xCC, 0x83, 0xCD, 0x83, 0x6F, 0xCC, + 0x84, 0xCD, 0x83, 0x6F, 0xCC, 0x87, 0xCD, 0x83, + 0x6F, 0xCC, 0x88, 0xCD, 0x83, 0x6F, 0xCC, 0x9B, + 0xB1, 0x83, 0x6F, 0xCC, 0xA3, 0xB9, 0x83, 0x6F, + // Bytes 48c0 - 48ff + 0xCC, 0xA8, 0xA9, 0x83, 0x72, 0xCC, 0xA3, 0xB9, + 0x83, 0x73, 0xCC, 0x81, 0xCD, 0x83, 0x73, 0xCC, + 0x8C, 0xCD, 0x83, 0x73, 0xCC, 0xA3, 0xB9, 0x83, + 0x75, 0xCC, 0x83, 0xCD, 0x83, 0x75, 0xCC, 0x84, + 0xCD, 0x83, 0x75, 0xCC, 0x88, 0xCD, 0x83, 0x75, + 0xCC, 0x9B, 0xB1, 0x84, 0xCE, 0x91, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x95, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x95, + // Bytes 4900 - 493f + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x99, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xA9, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x84, + // Bytes 4940 - 497f + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x84, 0xCE, 0xB1, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x84, + 0xCE, 0xB5, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB5, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x80, + 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x84, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB7, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCD, 0x82, + // Bytes 4980 - 49bf + 0xCD, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x84, + 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB9, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xCD, 0x84, + 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x84, 0xCF, 0x85, + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x85, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x84, + 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x84, 0xCF, 0x89, + // Bytes 49c0 - 49ff + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4a00 - 4a3f + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + // Bytes 4a40 - 4a7f + 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + // Bytes 4a80 - 4abf + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4ac0 - 4aff + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x42, + 0xCC, 0x80, 0xCD, 0x33, 0x42, 0xCC, 0x81, 0xCD, + 0x33, 0x42, 0xCC, 0x93, 0xCD, 0x33, 0x43, 0xE1, + // Bytes 4b00 - 4b3f + 0x85, 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, + // Bytes 4b40 - 4b7f + 0x43, 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, + // Bytes 4b80 - 4bbf + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, + 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x33, 0x43, 0xE3, 0x82, 0x99, 0x11, 0x04, 0x43, + // Bytes 4bc0 - 4bff + 0xE3, 0x82, 0x9A, 0x11, 0x04, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB2, 0xA2, 0x27, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA6, 0x27, 0x46, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, 0x27, + 0x00, 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10798 bytes (10.54 KiB). Checksum: b5981cc85e3bd14. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, + // Block 0x5, offset 0x140 + 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x36e2, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3862, 0x2c1: 0x386e, 0x2c3: 0x385c, + 0x2c6: 0xa000, 0x2c7: 0x384a, + 0x2cc: 0x389e, 0x2cd: 0x3886, 0x2ce: 0x38b0, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3892, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x3916, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3874, 0x302: 0x38f8, + 0x310: 0x3850, 0x311: 0x38d4, + 0x312: 0x3856, 0x313: 0x38da, 0x316: 0x3868, 0x317: 0x38ec, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x396a, 0x31b: 0x3970, 0x31c: 0x387a, 0x31d: 0x38fe, + 0x31e: 0x3880, 0x31f: 0x3904, 0x322: 0x388c, 0x323: 0x3910, + 0x324: 0x3898, 0x325: 0x391c, 0x326: 0x38a4, 0x327: 0x3928, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3976, 0x32b: 0x397c, 0x32c: 0x38ce, 0x32d: 0x3952, 0x32e: 0x38aa, 0x32f: 0x392e, + 0x330: 0x38b6, 0x331: 0x393a, 0x332: 0x38bc, 0x333: 0x3940, 0x334: 0x38c2, 0x335: 0x3946, + 0x338: 0x38c8, 0x339: 0x394c, + // Block 0xd, offset 0x340 + 0x351: 0x812e, + 0x352: 0x8133, 0x353: 0x8133, 0x354: 0x8133, 0x355: 0x8133, 0x356: 0x812e, 0x357: 0x8133, + 0x358: 0x8133, 0x359: 0x8133, 0x35a: 0x812f, 0x35b: 0x812e, 0x35c: 0x8133, 0x35d: 0x8133, + 0x35e: 0x8133, 0x35f: 0x8133, 0x360: 0x8133, 0x361: 0x8133, 0x362: 0x812e, 0x363: 0x812e, + 0x364: 0x812e, 0x365: 0x812e, 0x366: 0x812e, 0x367: 0x812e, 0x368: 0x8133, 0x369: 0x8133, + 0x36a: 0x812e, 0x36b: 0x8133, 0x36c: 0x8133, 0x36d: 0x812f, 0x36e: 0x8132, 0x36f: 0x8133, + 0x370: 0x8106, 0x371: 0x8107, 0x372: 0x8108, 0x373: 0x8109, 0x374: 0x810a, 0x375: 0x810b, + 0x376: 0x810c, 0x377: 0x810d, 0x378: 0x810e, 0x379: 0x810f, 0x37a: 0x810f, 0x37b: 0x8110, + 0x37c: 0x8111, 0x37d: 0x8112, 0x37f: 0x8113, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8117, + 0x38c: 0x8118, 0x38d: 0x8119, 0x38e: 0x811a, 0x38f: 0x811b, 0x390: 0x811c, 0x391: 0x811d, + 0x392: 0x811e, 0x393: 0x9933, 0x394: 0x9933, 0x395: 0x992e, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x8133, 0x39b: 0x8133, 0x39c: 0x812e, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x812e, + 0x3b0: 0x811f, + // Block 0xf, offset 0x3c0 + 0x3ca: 0x8133, 0x3cb: 0x8133, + 0x3cc: 0x8133, 0x3cd: 0x8133, 0x3ce: 0x8133, 0x3cf: 0x812e, 0x3d0: 0x812e, 0x3d1: 0x812e, + 0x3d2: 0x812e, 0x3d3: 0x812e, 0x3d4: 0x8133, 0x3d5: 0x8133, 0x3d6: 0x8133, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x8133, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x8133, 0x3e0: 0x8133, 0x3e1: 0x8133, 0x3e3: 0x812e, + 0x3e4: 0x8133, 0x3e5: 0x8133, 0x3e6: 0x812e, 0x3e7: 0x8133, 0x3e8: 0x8133, 0x3e9: 0x812e, + 0x3ea: 0x8133, 0x3eb: 0x8133, 0x3ec: 0x8133, 0x3ed: 0x812e, 0x3ee: 0x812e, 0x3ef: 0x812e, + 0x3f0: 0x8117, 0x3f1: 0x8118, 0x3f2: 0x8119, 0x3f3: 0x8133, 0x3f4: 0x8133, 0x3f5: 0x8133, + 0x3f6: 0x812e, 0x3f7: 0x8133, 0x3f8: 0x8133, 0x3f9: 0x812e, 0x3fa: 0x812e, 0x3fb: 0x8133, + 0x3fc: 0x8133, 0x3fd: 0x8133, 0x3fe: 0x8133, 0x3ff: 0x8133, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2e5d, 0x407: 0xa000, 0x408: 0x2e65, 0x409: 0xa000, 0x40a: 0x2e6d, 0x40b: 0xa000, + 0x40c: 0x2e75, 0x40d: 0xa000, 0x40e: 0x2e7d, 0x411: 0xa000, + 0x412: 0x2e85, + 0x434: 0x8103, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2e8d, + 0x43c: 0xa000, 0x43d: 0x2e95, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8133, 0x441: 0x8133, 0x442: 0x812e, 0x443: 0x8133, 0x444: 0x8133, 0x445: 0x8133, + 0x446: 0x8133, 0x447: 0x8133, 0x448: 0x8133, 0x449: 0x8133, 0x44a: 0x812e, 0x44b: 0x8133, + 0x44c: 0x8133, 0x44d: 0x8136, 0x44e: 0x812b, 0x44f: 0x812e, 0x450: 0x812a, 0x451: 0x8133, + 0x452: 0x8133, 0x453: 0x8133, 0x454: 0x8133, 0x455: 0x8133, 0x456: 0x8133, 0x457: 0x8133, + 0x458: 0x8133, 0x459: 0x8133, 0x45a: 0x8133, 0x45b: 0x8133, 0x45c: 0x8133, 0x45d: 0x8133, + 0x45e: 0x8133, 0x45f: 0x8133, 0x460: 0x8133, 0x461: 0x8133, 0x462: 0x8133, 0x463: 0x8133, + 0x464: 0x8133, 0x465: 0x8133, 0x466: 0x8133, 0x467: 0x8133, 0x468: 0x8133, 0x469: 0x8133, + 0x46a: 0x8133, 0x46b: 0x8133, 0x46c: 0x8133, 0x46d: 0x8133, 0x46e: 0x8133, 0x46f: 0x8133, + 0x470: 0x8133, 0x471: 0x8133, 0x472: 0x8133, 0x473: 0x8133, 0x474: 0x8133, 0x475: 0x8133, + 0x476: 0x8134, 0x477: 0x8132, 0x478: 0x8132, 0x479: 0x812e, 0x47a: 0x812d, 0x47b: 0x8133, + 0x47c: 0x8135, 0x47d: 0x812e, 0x47e: 0x8133, 0x47f: 0x812e, + // Block 0x12, offset 0x480 + 0x480: 0x30d8, 0x481: 0x33e4, 0x482: 0x30e2, 0x483: 0x33ee, 0x484: 0x30e7, 0x485: 0x33f3, + 0x486: 0x30ec, 0x487: 0x33f8, 0x488: 0x3a0d, 0x489: 0x3b9c, 0x48a: 0x3105, 0x48b: 0x3411, + 0x48c: 0x310f, 0x48d: 0x341b, 0x48e: 0x311e, 0x48f: 0x342a, 0x490: 0x3114, 0x491: 0x3420, + 0x492: 0x3119, 0x493: 0x3425, 0x494: 0x3a30, 0x495: 0x3bbf, 0x496: 0x3a37, 0x497: 0x3bc6, + 0x498: 0x315a, 0x499: 0x3466, 0x49a: 0x315f, 0x49b: 0x346b, 0x49c: 0x3a45, 0x49d: 0x3bd4, + 0x49e: 0x3164, 0x49f: 0x3470, 0x4a0: 0x3173, 0x4a1: 0x347f, 0x4a2: 0x3191, 0x4a3: 0x349d, + 0x4a4: 0x31a0, 0x4a5: 0x34ac, 0x4a6: 0x3196, 0x4a7: 0x34a2, 0x4a8: 0x31a5, 0x4a9: 0x34b1, + 0x4aa: 0x31aa, 0x4ab: 0x34b6, 0x4ac: 0x31f0, 0x4ad: 0x34fc, 0x4ae: 0x3a4c, 0x4af: 0x3bdb, + 0x4b0: 0x31fa, 0x4b1: 0x350b, 0x4b2: 0x3204, 0x4b3: 0x3515, 0x4b4: 0x320e, 0x4b5: 0x351f, + 0x4b6: 0x4805, 0x4b7: 0x4896, 0x4b8: 0x3a53, 0x4b9: 0x3be2, 0x4ba: 0x3227, 0x4bb: 0x3538, + 0x4bc: 0x3222, 0x4bd: 0x3533, 0x4be: 0x322c, 0x4bf: 0x353d, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x3231, 0x4c1: 0x3542, 0x4c2: 0x3236, 0x4c3: 0x3547, 0x4c4: 0x324a, 0x4c5: 0x355b, + 0x4c6: 0x3254, 0x4c7: 0x3565, 0x4c8: 0x3263, 0x4c9: 0x3574, 0x4ca: 0x325e, 0x4cb: 0x356f, + 0x4cc: 0x3a76, 0x4cd: 0x3c05, 0x4ce: 0x3a84, 0x4cf: 0x3c13, 0x4d0: 0x3a8b, 0x4d1: 0x3c1a, + 0x4d2: 0x3a92, 0x4d3: 0x3c21, 0x4d4: 0x3290, 0x4d5: 0x35a1, 0x4d6: 0x3295, 0x4d7: 0x35a6, + 0x4d8: 0x329f, 0x4d9: 0x35b0, 0x4da: 0x4832, 0x4db: 0x48c3, 0x4dc: 0x3ad8, 0x4dd: 0x3c67, + 0x4de: 0x32b8, 0x4df: 0x35c9, 0x4e0: 0x32c2, 0x4e1: 0x35d3, 0x4e2: 0x4841, 0x4e3: 0x48d2, + 0x4e4: 0x3adf, 0x4e5: 0x3c6e, 0x4e6: 0x3ae6, 0x4e7: 0x3c75, 0x4e8: 0x3aed, 0x4e9: 0x3c7c, + 0x4ea: 0x32d1, 0x4eb: 0x35e2, 0x4ec: 0x32db, 0x4ed: 0x35f1, 0x4ee: 0x32ef, 0x4ef: 0x3605, + 0x4f0: 0x32ea, 0x4f1: 0x3600, 0x4f2: 0x332b, 0x4f3: 0x3641, 0x4f4: 0x333a, 0x4f5: 0x3650, + 0x4f6: 0x3335, 0x4f7: 0x364b, 0x4f8: 0x3af4, 0x4f9: 0x3c83, 0x4fa: 0x3afb, 0x4fb: 0x3c8a, + 0x4fc: 0x333f, 0x4fd: 0x3655, 0x4fe: 0x3344, 0x4ff: 0x365a, + // Block 0x14, offset 0x500 + 0x500: 0x3349, 0x501: 0x365f, 0x502: 0x334e, 0x503: 0x3664, 0x504: 0x335d, 0x505: 0x3673, + 0x506: 0x3358, 0x507: 0x366e, 0x508: 0x3362, 0x509: 0x367d, 0x50a: 0x3367, 0x50b: 0x3682, + 0x50c: 0x336c, 0x50d: 0x3687, 0x50e: 0x338a, 0x50f: 0x36a5, 0x510: 0x33a3, 0x511: 0x36c3, + 0x512: 0x33b2, 0x513: 0x36d2, 0x514: 0x33b7, 0x515: 0x36d7, 0x516: 0x34bb, 0x517: 0x35e7, + 0x518: 0x3678, 0x519: 0x36b4, 0x51b: 0x3712, + 0x520: 0x47e2, 0x521: 0x4873, 0x522: 0x30c4, 0x523: 0x33d0, + 0x524: 0x39b9, 0x525: 0x3b48, 0x526: 0x39b2, 0x527: 0x3b41, 0x528: 0x39c7, 0x529: 0x3b56, + 0x52a: 0x39c0, 0x52b: 0x3b4f, 0x52c: 0x39ff, 0x52d: 0x3b8e, 0x52e: 0x39d5, 0x52f: 0x3b64, + 0x530: 0x39ce, 0x531: 0x3b5d, 0x532: 0x39e3, 0x533: 0x3b72, 0x534: 0x39dc, 0x535: 0x3b6b, + 0x536: 0x3a06, 0x537: 0x3b95, 0x538: 0x47f6, 0x539: 0x4887, 0x53a: 0x3141, 0x53b: 0x344d, + 0x53c: 0x312d, 0x53d: 0x3439, 0x53e: 0x3a1b, 0x53f: 0x3baa, + // Block 0x15, offset 0x540 + 0x540: 0x3a14, 0x541: 0x3ba3, 0x542: 0x3a29, 0x543: 0x3bb8, 0x544: 0x3a22, 0x545: 0x3bb1, + 0x546: 0x3a3e, 0x547: 0x3bcd, 0x548: 0x31d2, 0x549: 0x34de, 0x54a: 0x31e6, 0x54b: 0x34f2, + 0x54c: 0x4828, 0x54d: 0x48b9, 0x54e: 0x3277, 0x54f: 0x3588, 0x550: 0x3a61, 0x551: 0x3bf0, + 0x552: 0x3a5a, 0x553: 0x3be9, 0x554: 0x3a6f, 0x555: 0x3bfe, 0x556: 0x3a68, 0x557: 0x3bf7, + 0x558: 0x3aca, 0x559: 0x3c59, 0x55a: 0x3aae, 0x55b: 0x3c3d, 0x55c: 0x3aa7, 0x55d: 0x3c36, + 0x55e: 0x3abc, 0x55f: 0x3c4b, 0x560: 0x3ab5, 0x561: 0x3c44, 0x562: 0x3ac3, 0x563: 0x3c52, + 0x564: 0x3326, 0x565: 0x363c, 0x566: 0x3308, 0x567: 0x361e, 0x568: 0x3b25, 0x569: 0x3cb4, + 0x56a: 0x3b1e, 0x56b: 0x3cad, 0x56c: 0x3b33, 0x56d: 0x3cc2, 0x56e: 0x3b2c, 0x56f: 0x3cbb, + 0x570: 0x3b3a, 0x571: 0x3cc9, 0x572: 0x3371, 0x573: 0x368c, 0x574: 0x3399, 0x575: 0x36b9, + 0x576: 0x3394, 0x577: 0x36af, 0x578: 0x3380, 0x579: 0x369b, + // Block 0x16, offset 0x580 + 0x580: 0x4945, 0x581: 0x494b, 0x582: 0x4a5f, 0x583: 0x4a77, 0x584: 0x4a67, 0x585: 0x4a7f, + 0x586: 0x4a6f, 0x587: 0x4a87, 0x588: 0x48eb, 0x589: 0x48f1, 0x58a: 0x49cf, 0x58b: 0x49e7, + 0x58c: 0x49d7, 0x58d: 0x49ef, 0x58e: 0x49df, 0x58f: 0x49f7, 0x590: 0x4957, 0x591: 0x495d, + 0x592: 0x3ef9, 0x593: 0x3f09, 0x594: 0x3f01, 0x595: 0x3f11, + 0x598: 0x48f7, 0x599: 0x48fd, 0x59a: 0x3e29, 0x59b: 0x3e39, 0x59c: 0x3e31, 0x59d: 0x3e41, + 0x5a0: 0x496f, 0x5a1: 0x4975, 0x5a2: 0x4a8f, 0x5a3: 0x4aa7, + 0x5a4: 0x4a97, 0x5a5: 0x4aaf, 0x5a6: 0x4a9f, 0x5a7: 0x4ab7, 0x5a8: 0x4903, 0x5a9: 0x4909, + 0x5aa: 0x49ff, 0x5ab: 0x4a17, 0x5ac: 0x4a07, 0x5ad: 0x4a1f, 0x5ae: 0x4a0f, 0x5af: 0x4a27, + 0x5b0: 0x4987, 0x5b1: 0x498d, 0x5b2: 0x3f59, 0x5b3: 0x3f71, 0x5b4: 0x3f61, 0x5b5: 0x3f79, + 0x5b6: 0x3f69, 0x5b7: 0x3f81, 0x5b8: 0x490f, 0x5b9: 0x4915, 0x5ba: 0x3e59, 0x5bb: 0x3e71, + 0x5bc: 0x3e61, 0x5bd: 0x3e79, 0x5be: 0x3e69, 0x5bf: 0x3e81, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4993, 0x5c1: 0x4999, 0x5c2: 0x3f89, 0x5c3: 0x3f99, 0x5c4: 0x3f91, 0x5c5: 0x3fa1, + 0x5c8: 0x491b, 0x5c9: 0x4921, 0x5ca: 0x3e89, 0x5cb: 0x3e99, + 0x5cc: 0x3e91, 0x5cd: 0x3ea1, 0x5d0: 0x49a5, 0x5d1: 0x49ab, + 0x5d2: 0x3fc1, 0x5d3: 0x3fd9, 0x5d4: 0x3fc9, 0x5d5: 0x3fe1, 0x5d6: 0x3fd1, 0x5d7: 0x3fe9, + 0x5d9: 0x4927, 0x5db: 0x3ea9, 0x5dd: 0x3eb1, + 0x5df: 0x3eb9, 0x5e0: 0x49bd, 0x5e1: 0x49c3, 0x5e2: 0x4abf, 0x5e3: 0x4ad7, + 0x5e4: 0x4ac7, 0x5e5: 0x4adf, 0x5e6: 0x4acf, 0x5e7: 0x4ae7, 0x5e8: 0x492d, 0x5e9: 0x4933, + 0x5ea: 0x4a2f, 0x5eb: 0x4a47, 0x5ec: 0x4a37, 0x5ed: 0x4a4f, 0x5ee: 0x4a3f, 0x5ef: 0x4a57, + 0x5f0: 0x4939, 0x5f1: 0x445f, 0x5f2: 0x37d2, 0x5f3: 0x4465, 0x5f4: 0x4963, 0x5f5: 0x446b, + 0x5f6: 0x37e4, 0x5f7: 0x4471, 0x5f8: 0x3802, 0x5f9: 0x4477, 0x5fa: 0x381a, 0x5fb: 0x447d, + 0x5fc: 0x49b1, 0x5fd: 0x4483, + // Block 0x18, offset 0x600 + 0x600: 0x3ee1, 0x601: 0x3ee9, 0x602: 0x42c5, 0x603: 0x42e3, 0x604: 0x42cf, 0x605: 0x42ed, + 0x606: 0x42d9, 0x607: 0x42f7, 0x608: 0x3e19, 0x609: 0x3e21, 0x60a: 0x4211, 0x60b: 0x422f, + 0x60c: 0x421b, 0x60d: 0x4239, 0x60e: 0x4225, 0x60f: 0x4243, 0x610: 0x3f29, 0x611: 0x3f31, + 0x612: 0x4301, 0x613: 0x431f, 0x614: 0x430b, 0x615: 0x4329, 0x616: 0x4315, 0x617: 0x4333, + 0x618: 0x3e49, 0x619: 0x3e51, 0x61a: 0x424d, 0x61b: 0x426b, 0x61c: 0x4257, 0x61d: 0x4275, + 0x61e: 0x4261, 0x61f: 0x427f, 0x620: 0x4001, 0x621: 0x4009, 0x622: 0x433d, 0x623: 0x435b, + 0x624: 0x4347, 0x625: 0x4365, 0x626: 0x4351, 0x627: 0x436f, 0x628: 0x3ec1, 0x629: 0x3ec9, + 0x62a: 0x4289, 0x62b: 0x42a7, 0x62c: 0x4293, 0x62d: 0x42b1, 0x62e: 0x429d, 0x62f: 0x42bb, + 0x630: 0x37c6, 0x631: 0x37c0, 0x632: 0x3ed1, 0x633: 0x37cc, 0x634: 0x3ed9, + 0x636: 0x4951, 0x637: 0x3ef1, 0x638: 0x3736, 0x639: 0x3730, 0x63a: 0x3724, 0x63b: 0x442f, + 0x63c: 0x373c, 0x63d: 0x8100, 0x63e: 0x0257, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x36e8, 0x642: 0x3f19, 0x643: 0x37de, 0x644: 0x3f21, + 0x646: 0x497b, 0x647: 0x3f39, 0x648: 0x3742, 0x649: 0x4435, 0x64a: 0x374e, 0x64b: 0x443b, + 0x64c: 0x375a, 0x64d: 0x3cd0, 0x64e: 0x3cd7, 0x64f: 0x3cde, 0x650: 0x37f6, 0x651: 0x37f0, + 0x652: 0x3f41, 0x653: 0x4625, 0x656: 0x37fc, 0x657: 0x3f51, + 0x658: 0x3772, 0x659: 0x376c, 0x65a: 0x3760, 0x65b: 0x4441, 0x65d: 0x3ce5, + 0x65e: 0x3cec, 0x65f: 0x3cf3, 0x660: 0x382c, 0x661: 0x3826, 0x662: 0x3fa9, 0x663: 0x462d, + 0x664: 0x380e, 0x665: 0x3814, 0x666: 0x3832, 0x667: 0x3fb9, 0x668: 0x37a2, 0x669: 0x379c, + 0x66a: 0x3790, 0x66b: 0x444d, 0x66c: 0x378a, 0x66d: 0x36dc, 0x66e: 0x4429, 0x66f: 0x0081, + 0x672: 0x3ff1, 0x673: 0x3838, 0x674: 0x3ff9, + 0x676: 0x49c9, 0x677: 0x4011, 0x678: 0x377e, 0x679: 0x4447, 0x67a: 0x37ae, 0x67b: 0x4459, + 0x67c: 0x37ba, 0x67d: 0x4397, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3d47, 0x683: 0xa000, 0x684: 0x3d4e, 0x685: 0xa000, + 0x687: 0x3d55, 0x688: 0xa000, 0x689: 0x3d5c, + 0x68d: 0xa000, + 0x6a0: 0x30a6, 0x6a1: 0xa000, 0x6a2: 0x3d6a, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3d63, 0x6ae: 0x30a1, 0x6af: 0x30ab, + 0x6b0: 0x3d71, 0x6b1: 0x3d78, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3d7f, 0x6b5: 0x3d86, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3d8d, 0x6b9: 0x3d94, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3d9b, 0x6c1: 0x3da2, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3db7, 0x6c5: 0x3dbe, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3dc5, 0x6c9: 0x3dcc, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3de1, 0x6ed: 0x3de8, 0x6ee: 0x3def, 0x6ef: 0x3df6, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x4049, 0x70d: 0xa000, 0x70e: 0x4051, 0x70f: 0xa000, 0x710: 0x4059, 0x711: 0xa000, + 0x712: 0x4061, 0x713: 0xa000, 0x714: 0x4069, 0x715: 0xa000, 0x716: 0x4071, 0x717: 0xa000, + 0x718: 0x4079, 0x719: 0xa000, 0x71a: 0x4081, 0x71b: 0xa000, 0x71c: 0x4089, 0x71d: 0xa000, + 0x71e: 0x4091, 0x71f: 0xa000, 0x720: 0x4099, 0x721: 0xa000, 0x722: 0x40a1, + 0x724: 0xa000, 0x725: 0x40a9, 0x726: 0xa000, 0x727: 0x40b1, 0x728: 0xa000, 0x729: 0x40b9, + 0x72f: 0xa000, + 0x730: 0x40c1, 0x731: 0x40c9, 0x732: 0xa000, 0x733: 0x40d1, 0x734: 0x40d9, 0x735: 0xa000, + 0x736: 0x40e1, 0x737: 0x40e9, 0x738: 0xa000, 0x739: 0x40f1, 0x73a: 0x40f9, 0x73b: 0xa000, + 0x73c: 0x4101, 0x73d: 0x4109, + // Block 0x1d, offset 0x740 + 0x754: 0x4041, + 0x759: 0x9904, 0x75a: 0x9904, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x4111, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x4121, 0x76d: 0xa000, 0x76e: 0x4129, 0x76f: 0xa000, + 0x770: 0x4131, 0x771: 0xa000, 0x772: 0x4139, 0x773: 0xa000, 0x774: 0x4141, 0x775: 0xa000, + 0x776: 0x4149, 0x777: 0xa000, 0x778: 0x4151, 0x779: 0xa000, 0x77a: 0x4159, 0x77b: 0xa000, + 0x77c: 0x4161, 0x77d: 0xa000, 0x77e: 0x4169, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4171, 0x781: 0xa000, 0x782: 0x4179, 0x784: 0xa000, 0x785: 0x4181, + 0x786: 0xa000, 0x787: 0x4189, 0x788: 0xa000, 0x789: 0x4191, + 0x78f: 0xa000, 0x790: 0x4199, 0x791: 0x41a1, + 0x792: 0xa000, 0x793: 0x41a9, 0x794: 0x41b1, 0x795: 0xa000, 0x796: 0x41b9, 0x797: 0x41c1, + 0x798: 0xa000, 0x799: 0x41c9, 0x79a: 0x41d1, 0x79b: 0xa000, 0x79c: 0x41d9, 0x79d: 0x41e1, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x4119, + 0x7b7: 0x41e9, 0x7b8: 0x41f1, 0x7b9: 0x41f9, 0x7ba: 0x4201, + 0x7bd: 0xa000, 0x7be: 0x4209, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1472, 0x7c1: 0x0df6, 0x7c2: 0x14ce, 0x7c3: 0x149a, 0x7c4: 0x0f52, 0x7c5: 0x07e6, + 0x7c6: 0x09da, 0x7c7: 0x1726, 0x7c8: 0x1726, 0x7c9: 0x0b06, 0x7ca: 0x155a, 0x7cb: 0x0a3e, + 0x7cc: 0x0b02, 0x7cd: 0x0cea, 0x7ce: 0x10ca, 0x7cf: 0x125a, 0x7d0: 0x1392, 0x7d1: 0x13ce, + 0x7d2: 0x1402, 0x7d3: 0x1516, 0x7d4: 0x0e6e, 0x7d5: 0x0efa, 0x7d6: 0x0fa6, 0x7d7: 0x103e, + 0x7d8: 0x135a, 0x7d9: 0x1542, 0x7da: 0x166e, 0x7db: 0x080a, 0x7dc: 0x09ae, 0x7dd: 0x0e82, + 0x7de: 0x0fca, 0x7df: 0x138e, 0x7e0: 0x16be, 0x7e1: 0x0bae, 0x7e2: 0x0f72, 0x7e3: 0x137e, + 0x7e4: 0x1412, 0x7e5: 0x0d1e, 0x7e6: 0x12b6, 0x7e7: 0x13da, 0x7e8: 0x0c1a, 0x7e9: 0x0e0a, + 0x7ea: 0x0f12, 0x7eb: 0x1016, 0x7ec: 0x1522, 0x7ed: 0x084a, 0x7ee: 0x08e2, 0x7ef: 0x094e, + 0x7f0: 0x0d86, 0x7f1: 0x0e7a, 0x7f2: 0x0fc6, 0x7f3: 0x10ea, 0x7f4: 0x1272, 0x7f5: 0x1386, + 0x7f6: 0x139e, 0x7f7: 0x14c2, 0x7f8: 0x15ea, 0x7f9: 0x169e, 0x7fa: 0x16ba, 0x7fb: 0x1126, + 0x7fc: 0x1166, 0x7fd: 0x121e, 0x7fe: 0x133e, 0x7ff: 0x1576, + // Block 0x20, offset 0x800 + 0x800: 0x16c6, 0x801: 0x1446, 0x802: 0x0ac2, 0x803: 0x0c36, 0x804: 0x11d6, 0x805: 0x1296, + 0x806: 0x0ffa, 0x807: 0x112e, 0x808: 0x1492, 0x809: 0x15e2, 0x80a: 0x0abe, 0x80b: 0x0b8a, + 0x80c: 0x0e72, 0x80d: 0x0f26, 0x80e: 0x0f5a, 0x80f: 0x120e, 0x810: 0x1236, 0x811: 0x15a2, + 0x812: 0x094a, 0x813: 0x12a2, 0x814: 0x08ee, 0x815: 0x08ea, 0x816: 0x1192, 0x817: 0x1222, + 0x818: 0x1356, 0x819: 0x15aa, 0x81a: 0x1462, 0x81b: 0x0d22, 0x81c: 0x0e6e, 0x81d: 0x1452, + 0x81e: 0x07f2, 0x81f: 0x0b5e, 0x820: 0x0c8e, 0x821: 0x102a, 0x822: 0x10aa, 0x823: 0x096e, + 0x824: 0x1136, 0x825: 0x085a, 0x826: 0x0c72, 0x827: 0x07d2, 0x828: 0x0ee6, 0x829: 0x0d9e, + 0x82a: 0x120a, 0x82b: 0x09c2, 0x82c: 0x0aae, 0x82d: 0x10f6, 0x82e: 0x135e, 0x82f: 0x1436, + 0x830: 0x0eb2, 0x831: 0x14f2, 0x832: 0x0ede, 0x833: 0x0d32, 0x834: 0x1316, 0x835: 0x0d52, + 0x836: 0x10a6, 0x837: 0x0826, 0x838: 0x08a2, 0x839: 0x08e6, 0x83a: 0x0e4e, 0x83b: 0x11f6, + 0x83c: 0x12ee, 0x83d: 0x1442, 0x83e: 0x1556, 0x83f: 0x0956, + // Block 0x21, offset 0x840 + 0x840: 0x0a0a, 0x841: 0x0b12, 0x842: 0x0c2a, 0x843: 0x0dba, 0x844: 0x0f76, 0x845: 0x113a, + 0x846: 0x1592, 0x847: 0x1676, 0x848: 0x16ca, 0x849: 0x16e2, 0x84a: 0x0932, 0x84b: 0x0dee, + 0x84c: 0x0e9e, 0x84d: 0x14e6, 0x84e: 0x0bf6, 0x84f: 0x0cd2, 0x850: 0x0cee, 0x851: 0x0d7e, + 0x852: 0x0f66, 0x853: 0x0fb2, 0x854: 0x1062, 0x855: 0x1186, 0x856: 0x122a, 0x857: 0x128e, + 0x858: 0x14d6, 0x859: 0x1366, 0x85a: 0x14fe, 0x85b: 0x157a, 0x85c: 0x090a, 0x85d: 0x0936, + 0x85e: 0x0a1e, 0x85f: 0x0fa2, 0x860: 0x13ee, 0x861: 0x1436, 0x862: 0x0c16, 0x863: 0x0c86, + 0x864: 0x0d4a, 0x865: 0x0eaa, 0x866: 0x11d2, 0x867: 0x101e, 0x868: 0x0836, 0x869: 0x0a7a, + 0x86a: 0x0b5e, 0x86b: 0x0bc2, 0x86c: 0x0c92, 0x86d: 0x103a, 0x86e: 0x1056, 0x86f: 0x1266, + 0x870: 0x1286, 0x871: 0x155e, 0x872: 0x15de, 0x873: 0x15ee, 0x874: 0x162a, 0x875: 0x084e, + 0x876: 0x117a, 0x877: 0x154a, 0x878: 0x15c6, 0x879: 0x0caa, 0x87a: 0x0812, 0x87b: 0x0872, + 0x87c: 0x0b62, 0x87d: 0x0b82, 0x87e: 0x0daa, 0x87f: 0x0e6e, + // Block 0x22, offset 0x880 + 0x880: 0x0fbe, 0x881: 0x10c6, 0x882: 0x1372, 0x883: 0x1512, 0x884: 0x171e, 0x885: 0x0dde, + 0x886: 0x159e, 0x887: 0x092e, 0x888: 0x0e2a, 0x889: 0x0e36, 0x88a: 0x0f0a, 0x88b: 0x0f42, + 0x88c: 0x1046, 0x88d: 0x10a2, 0x88e: 0x1122, 0x88f: 0x1206, 0x890: 0x1636, 0x891: 0x08aa, + 0x892: 0x0cfe, 0x893: 0x15ae, 0x894: 0x0862, 0x895: 0x0ba6, 0x896: 0x0f2a, 0x897: 0x14da, + 0x898: 0x0c62, 0x899: 0x0cb2, 0x89a: 0x0e3e, 0x89b: 0x102a, 0x89c: 0x15b6, 0x89d: 0x0912, + 0x89e: 0x09fa, 0x89f: 0x0b92, 0x8a0: 0x0dce, 0x8a1: 0x0e1a, 0x8a2: 0x0e5a, 0x8a3: 0x0eee, + 0x8a4: 0x1042, 0x8a5: 0x10b6, 0x8a6: 0x1252, 0x8a7: 0x13f2, 0x8a8: 0x13fe, 0x8a9: 0x1552, + 0x8aa: 0x15d2, 0x8ab: 0x097e, 0x8ac: 0x0f46, 0x8ad: 0x09fe, 0x8ae: 0x0fc2, 0x8af: 0x1066, + 0x8b0: 0x1382, 0x8b1: 0x15ba, 0x8b2: 0x16a6, 0x8b3: 0x16ce, 0x8b4: 0x0e32, 0x8b5: 0x0f22, + 0x8b6: 0x12be, 0x8b7: 0x11b2, 0x8b8: 0x11be, 0x8b9: 0x11e2, 0x8ba: 0x1012, 0x8bb: 0x0f9a, + 0x8bc: 0x145e, 0x8bd: 0x082e, 0x8be: 0x1326, 0x8bf: 0x0916, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0906, 0x8c1: 0x0c06, 0x8c2: 0x0d26, 0x8c3: 0x11ee, 0x8c4: 0x0b4e, 0x8c5: 0x0efe, + 0x8c6: 0x0dea, 0x8c7: 0x14e2, 0x8c8: 0x13e2, 0x8c9: 0x15a6, 0x8ca: 0x141e, 0x8cb: 0x0c22, + 0x8cc: 0x0882, 0x8cd: 0x0a56, 0x8d0: 0x0aaa, + 0x8d2: 0x0dda, 0x8d5: 0x08f2, 0x8d6: 0x101a, 0x8d7: 0x10de, + 0x8d8: 0x1142, 0x8d9: 0x115e, 0x8da: 0x1162, 0x8db: 0x1176, 0x8dc: 0x15f6, 0x8dd: 0x11e6, + 0x8de: 0x126a, 0x8e0: 0x138a, 0x8e2: 0x144e, + 0x8e5: 0x1502, 0x8e6: 0x152e, + 0x8ea: 0x164a, 0x8eb: 0x164e, 0x8ec: 0x1652, 0x8ed: 0x16b6, 0x8ee: 0x1526, 0x8ef: 0x15c2, + 0x8f0: 0x0852, 0x8f1: 0x0876, 0x8f2: 0x088a, 0x8f3: 0x0946, 0x8f4: 0x0952, 0x8f5: 0x0992, + 0x8f6: 0x0a46, 0x8f7: 0x0a62, 0x8f8: 0x0a6a, 0x8f9: 0x0aa6, 0x8fa: 0x0ab2, 0x8fb: 0x0b8e, + 0x8fc: 0x0b96, 0x8fd: 0x0c9e, 0x8fe: 0x0cc6, 0x8ff: 0x0cce, + // Block 0x24, offset 0x900 + 0x900: 0x0ce6, 0x901: 0x0d92, 0x902: 0x0dc2, 0x903: 0x0de2, 0x904: 0x0e52, 0x905: 0x0f16, + 0x906: 0x0f32, 0x907: 0x0f62, 0x908: 0x0fb6, 0x909: 0x0fd6, 0x90a: 0x104a, 0x90b: 0x112a, + 0x90c: 0x1146, 0x90d: 0x114e, 0x90e: 0x114a, 0x90f: 0x1152, 0x910: 0x1156, 0x911: 0x115a, + 0x912: 0x116e, 0x913: 0x1172, 0x914: 0x1196, 0x915: 0x11aa, 0x916: 0x11c6, 0x917: 0x122a, + 0x918: 0x1232, 0x919: 0x123a, 0x91a: 0x124e, 0x91b: 0x1276, 0x91c: 0x12c6, 0x91d: 0x12fa, + 0x91e: 0x12fa, 0x91f: 0x1362, 0x920: 0x140a, 0x921: 0x1422, 0x922: 0x1456, 0x923: 0x145a, + 0x924: 0x149e, 0x925: 0x14a2, 0x926: 0x14fa, 0x927: 0x1502, 0x928: 0x15d6, 0x929: 0x161a, + 0x92a: 0x1632, 0x92b: 0x0c96, 0x92c: 0x184b, 0x92d: 0x12de, + 0x930: 0x07da, 0x931: 0x08de, 0x932: 0x089e, 0x933: 0x0846, 0x934: 0x0886, 0x935: 0x08b2, + 0x936: 0x0942, 0x937: 0x095e, 0x938: 0x0a46, 0x939: 0x0a32, 0x93a: 0x0a42, 0x93b: 0x0a5e, + 0x93c: 0x0aaa, 0x93d: 0x0aba, 0x93e: 0x0afe, 0x93f: 0x0b0a, + // Block 0x25, offset 0x940 + 0x940: 0x0b26, 0x941: 0x0b36, 0x942: 0x0c1e, 0x943: 0x0c26, 0x944: 0x0c56, 0x945: 0x0c76, + 0x946: 0x0ca6, 0x947: 0x0cbe, 0x948: 0x0cae, 0x949: 0x0cce, 0x94a: 0x0cc2, 0x94b: 0x0ce6, + 0x94c: 0x0d02, 0x94d: 0x0d5a, 0x94e: 0x0d66, 0x94f: 0x0d6e, 0x950: 0x0d96, 0x951: 0x0dda, + 0x952: 0x0e0a, 0x953: 0x0e0e, 0x954: 0x0e22, 0x955: 0x0ea2, 0x956: 0x0eb2, 0x957: 0x0f0a, + 0x958: 0x0f56, 0x959: 0x0f4e, 0x95a: 0x0f62, 0x95b: 0x0f7e, 0x95c: 0x0fb6, 0x95d: 0x110e, + 0x95e: 0x0fda, 0x95f: 0x100e, 0x960: 0x101a, 0x961: 0x105a, 0x962: 0x1076, 0x963: 0x109a, + 0x964: 0x10be, 0x965: 0x10c2, 0x966: 0x10de, 0x967: 0x10e2, 0x968: 0x10f2, 0x969: 0x1106, + 0x96a: 0x1102, 0x96b: 0x1132, 0x96c: 0x11ae, 0x96d: 0x11c6, 0x96e: 0x11de, 0x96f: 0x1216, + 0x970: 0x122a, 0x971: 0x1246, 0x972: 0x1276, 0x973: 0x132a, 0x974: 0x1352, 0x975: 0x13c6, + 0x976: 0x140e, 0x977: 0x141a, 0x978: 0x1422, 0x979: 0x143a, 0x97a: 0x144e, 0x97b: 0x143e, + 0x97c: 0x1456, 0x97d: 0x1452, 0x97e: 0x144a, 0x97f: 0x145a, + // Block 0x26, offset 0x980 + 0x980: 0x1466, 0x981: 0x14a2, 0x982: 0x14de, 0x983: 0x150e, 0x984: 0x1546, 0x985: 0x1566, + 0x986: 0x15b2, 0x987: 0x15d6, 0x988: 0x15f6, 0x989: 0x160a, 0x98a: 0x161a, 0x98b: 0x1626, + 0x98c: 0x1632, 0x98d: 0x1686, 0x98e: 0x1726, 0x98f: 0x17e2, 0x990: 0x17dd, 0x991: 0x180f, + 0x992: 0x0702, 0x993: 0x072a, 0x994: 0x072e, 0x995: 0x1891, 0x996: 0x18be, 0x997: 0x1936, + 0x998: 0x1712, 0x999: 0x1722, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x07f6, 0x9c1: 0x07ee, 0x9c2: 0x07fe, 0x9c3: 0x1774, 0x9c4: 0x0842, 0x9c5: 0x0852, + 0x9c6: 0x0856, 0x9c7: 0x085e, 0x9c8: 0x0866, 0x9c9: 0x086a, 0x9ca: 0x0876, 0x9cb: 0x086e, + 0x9cc: 0x06ae, 0x9cd: 0x1788, 0x9ce: 0x088a, 0x9cf: 0x088e, 0x9d0: 0x0892, 0x9d1: 0x08ae, + 0x9d2: 0x1779, 0x9d3: 0x06b2, 0x9d4: 0x089a, 0x9d5: 0x08ba, 0x9d6: 0x1783, 0x9d7: 0x08ca, + 0x9d8: 0x08d2, 0x9d9: 0x0832, 0x9da: 0x08da, 0x9db: 0x08de, 0x9dc: 0x195e, 0x9dd: 0x08fa, + 0x9de: 0x0902, 0x9df: 0x06ba, 0x9e0: 0x091a, 0x9e1: 0x091e, 0x9e2: 0x0926, 0x9e3: 0x092a, + 0x9e4: 0x06be, 0x9e5: 0x0942, 0x9e6: 0x0946, 0x9e7: 0x0952, 0x9e8: 0x095e, 0x9e9: 0x0962, + 0x9ea: 0x0966, 0x9eb: 0x096e, 0x9ec: 0x098e, 0x9ed: 0x0992, 0x9ee: 0x099a, 0x9ef: 0x09aa, + 0x9f0: 0x09b2, 0x9f1: 0x09b6, 0x9f2: 0x09b6, 0x9f3: 0x09b6, 0x9f4: 0x1797, 0x9f5: 0x0f8e, + 0x9f6: 0x09ca, 0x9f7: 0x09d2, 0x9f8: 0x179c, 0x9f9: 0x09de, 0x9fa: 0x09e6, 0x9fb: 0x09ee, + 0x9fc: 0x0a16, 0x9fd: 0x0a02, 0x9fe: 0x0a0e, 0x9ff: 0x0a12, + // Block 0x28, offset 0xa00 + 0xa00: 0x0a1a, 0xa01: 0x0a22, 0xa02: 0x0a26, 0xa03: 0x0a2e, 0xa04: 0x0a36, 0xa05: 0x0a3a, + 0xa06: 0x0a3a, 0xa07: 0x0a42, 0xa08: 0x0a4a, 0xa09: 0x0a4e, 0xa0a: 0x0a5a, 0xa0b: 0x0a7e, + 0xa0c: 0x0a62, 0xa0d: 0x0a82, 0xa0e: 0x0a66, 0xa0f: 0x0a6e, 0xa10: 0x0906, 0xa11: 0x0aca, + 0xa12: 0x0a92, 0xa13: 0x0a96, 0xa14: 0x0a9a, 0xa15: 0x0a8e, 0xa16: 0x0aa2, 0xa17: 0x0a9e, + 0xa18: 0x0ab6, 0xa19: 0x17a1, 0xa1a: 0x0ad2, 0xa1b: 0x0ad6, 0xa1c: 0x0ade, 0xa1d: 0x0aea, + 0xa1e: 0x0af2, 0xa1f: 0x0b0e, 0xa20: 0x17a6, 0xa21: 0x17ab, 0xa22: 0x0b1a, 0xa23: 0x0b1e, + 0xa24: 0x0b22, 0xa25: 0x0b16, 0xa26: 0x0b2a, 0xa27: 0x06c2, 0xa28: 0x06c6, 0xa29: 0x0b32, + 0xa2a: 0x0b3a, 0xa2b: 0x0b3a, 0xa2c: 0x17b0, 0xa2d: 0x0b56, 0xa2e: 0x0b5a, 0xa2f: 0x0b5e, + 0xa30: 0x0b66, 0xa31: 0x17b5, 0xa32: 0x0b6e, 0xa33: 0x0b72, 0xa34: 0x0c4a, 0xa35: 0x0b7a, + 0xa36: 0x06ca, 0xa37: 0x0b86, 0xa38: 0x0b96, 0xa39: 0x0ba2, 0xa3a: 0x0b9e, 0xa3b: 0x17bf, + 0xa3c: 0x0baa, 0xa3d: 0x17c4, 0xa3e: 0x0bb6, 0xa3f: 0x0bb2, + // Block 0x29, offset 0xa40 + 0xa40: 0x0bba, 0xa41: 0x0bca, 0xa42: 0x0bce, 0xa43: 0x06ce, 0xa44: 0x0bde, 0xa45: 0x0be6, + 0xa46: 0x0bea, 0xa47: 0x0bee, 0xa48: 0x06d2, 0xa49: 0x17c9, 0xa4a: 0x06d6, 0xa4b: 0x0c0a, + 0xa4c: 0x0c0e, 0xa4d: 0x0c12, 0xa4e: 0x0c1a, 0xa4f: 0x1990, 0xa50: 0x0c32, 0xa51: 0x17d3, + 0xa52: 0x17d3, 0xa53: 0x12d2, 0xa54: 0x0c42, 0xa55: 0x0c42, 0xa56: 0x06da, 0xa57: 0x17f6, + 0xa58: 0x18c8, 0xa59: 0x0c52, 0xa5a: 0x0c5a, 0xa5b: 0x06de, 0xa5c: 0x0c6e, 0xa5d: 0x0c7e, + 0xa5e: 0x0c82, 0xa5f: 0x0c8a, 0xa60: 0x0c9a, 0xa61: 0x06e6, 0xa62: 0x06e2, 0xa63: 0x0c9e, + 0xa64: 0x17d8, 0xa65: 0x0ca2, 0xa66: 0x0cb6, 0xa67: 0x0cba, 0xa68: 0x0cbe, 0xa69: 0x0cba, + 0xa6a: 0x0cca, 0xa6b: 0x0cce, 0xa6c: 0x0cde, 0xa6d: 0x0cd6, 0xa6e: 0x0cda, 0xa6f: 0x0ce2, + 0xa70: 0x0ce6, 0xa71: 0x0cea, 0xa72: 0x0cf6, 0xa73: 0x0cfa, 0xa74: 0x0d12, 0xa75: 0x0d1a, + 0xa76: 0x0d2a, 0xa77: 0x0d3e, 0xa78: 0x17e7, 0xa79: 0x0d3a, 0xa7a: 0x0d2e, 0xa7b: 0x0d46, + 0xa7c: 0x0d4e, 0xa7d: 0x0d62, 0xa7e: 0x17ec, 0xa7f: 0x0d6a, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0d5e, 0xa81: 0x0d56, 0xa82: 0x06ea, 0xa83: 0x0d72, 0xa84: 0x0d7a, 0xa85: 0x0d82, + 0xa86: 0x0d76, 0xa87: 0x06ee, 0xa88: 0x0d92, 0xa89: 0x0d9a, 0xa8a: 0x17f1, 0xa8b: 0x0dc6, + 0xa8c: 0x0dfa, 0xa8d: 0x0dd6, 0xa8e: 0x06fa, 0xa8f: 0x0de2, 0xa90: 0x06f6, 0xa91: 0x06f2, + 0xa92: 0x08be, 0xa93: 0x08c2, 0xa94: 0x0dfe, 0xa95: 0x0de6, 0xa96: 0x12a6, 0xa97: 0x075e, + 0xa98: 0x0e0a, 0xa99: 0x0e0e, 0xa9a: 0x0e12, 0xa9b: 0x0e26, 0xa9c: 0x0e1e, 0xa9d: 0x180a, + 0xa9e: 0x06fe, 0xa9f: 0x0e3a, 0xaa0: 0x0e2e, 0xaa1: 0x0e4a, 0xaa2: 0x0e52, 0xaa3: 0x1814, + 0xaa4: 0x0e56, 0xaa5: 0x0e42, 0xaa6: 0x0e5e, 0xaa7: 0x0702, 0xaa8: 0x0e62, 0xaa9: 0x0e66, + 0xaaa: 0x0e6a, 0xaab: 0x0e76, 0xaac: 0x1819, 0xaad: 0x0e7e, 0xaae: 0x0706, 0xaaf: 0x0e8a, + 0xab0: 0x181e, 0xab1: 0x0e8e, 0xab2: 0x070a, 0xab3: 0x0e9a, 0xab4: 0x0ea6, 0xab5: 0x0eb2, + 0xab6: 0x0eb6, 0xab7: 0x1823, 0xab8: 0x17ba, 0xab9: 0x1828, 0xaba: 0x0ed6, 0xabb: 0x182d, + 0xabc: 0x0ee2, 0xabd: 0x0eea, 0xabe: 0x0eda, 0xabf: 0x0ef6, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0f06, 0xac1: 0x0f16, 0xac2: 0x0f0a, 0xac3: 0x0f0e, 0xac4: 0x0f1a, 0xac5: 0x0f1e, + 0xac6: 0x1832, 0xac7: 0x0f02, 0xac8: 0x0f36, 0xac9: 0x0f3a, 0xaca: 0x070e, 0xacb: 0x0f4e, + 0xacc: 0x0f4a, 0xacd: 0x1837, 0xace: 0x0f2e, 0xacf: 0x0f6a, 0xad0: 0x183c, 0xad1: 0x1841, + 0xad2: 0x0f6e, 0xad3: 0x0f82, 0xad4: 0x0f7e, 0xad5: 0x0f7a, 0xad6: 0x0712, 0xad7: 0x0f86, + 0xad8: 0x0f96, 0xad9: 0x0f92, 0xada: 0x0f9e, 0xadb: 0x177e, 0xadc: 0x0fae, 0xadd: 0x1846, + 0xade: 0x0fba, 0xadf: 0x1850, 0xae0: 0x0fce, 0xae1: 0x0fda, 0xae2: 0x0fee, 0xae3: 0x1855, + 0xae4: 0x1002, 0xae5: 0x1006, 0xae6: 0x185a, 0xae7: 0x185f, 0xae8: 0x1022, 0xae9: 0x1032, + 0xaea: 0x0716, 0xaeb: 0x1036, 0xaec: 0x071a, 0xaed: 0x071a, 0xaee: 0x104e, 0xaef: 0x1052, + 0xaf0: 0x105a, 0xaf1: 0x105e, 0xaf2: 0x106a, 0xaf3: 0x071e, 0xaf4: 0x1082, 0xaf5: 0x1864, + 0xaf6: 0x109e, 0xaf7: 0x1869, 0xaf8: 0x10aa, 0xaf9: 0x17ce, 0xafa: 0x10ba, 0xafb: 0x186e, + 0xafc: 0x1873, 0xafd: 0x1878, 0xafe: 0x0722, 0xaff: 0x0726, + // Block 0x2c, offset 0xb00 + 0xb00: 0x10f2, 0xb01: 0x1882, 0xb02: 0x187d, 0xb03: 0x1887, 0xb04: 0x188c, 0xb05: 0x10fa, + 0xb06: 0x10fe, 0xb07: 0x10fe, 0xb08: 0x1106, 0xb09: 0x072e, 0xb0a: 0x110a, 0xb0b: 0x0732, + 0xb0c: 0x0736, 0xb0d: 0x1896, 0xb0e: 0x111e, 0xb0f: 0x1126, 0xb10: 0x1132, 0xb11: 0x073a, + 0xb12: 0x189b, 0xb13: 0x1156, 0xb14: 0x18a0, 0xb15: 0x18a5, 0xb16: 0x1176, 0xb17: 0x118e, + 0xb18: 0x073e, 0xb19: 0x1196, 0xb1a: 0x119a, 0xb1b: 0x119e, 0xb1c: 0x18aa, 0xb1d: 0x18af, + 0xb1e: 0x18af, 0xb1f: 0x11b6, 0xb20: 0x0742, 0xb21: 0x18b4, 0xb22: 0x11ca, 0xb23: 0x11ce, + 0xb24: 0x0746, 0xb25: 0x18b9, 0xb26: 0x11ea, 0xb27: 0x074a, 0xb28: 0x11fa, 0xb29: 0x11f2, + 0xb2a: 0x1202, 0xb2b: 0x18c3, 0xb2c: 0x121a, 0xb2d: 0x074e, 0xb2e: 0x1226, 0xb2f: 0x122e, + 0xb30: 0x123e, 0xb31: 0x0752, 0xb32: 0x18cd, 0xb33: 0x18d2, 0xb34: 0x0756, 0xb35: 0x18d7, + 0xb36: 0x1256, 0xb37: 0x18dc, 0xb38: 0x1262, 0xb39: 0x126e, 0xb3a: 0x1276, 0xb3b: 0x18e1, + 0xb3c: 0x18e6, 0xb3d: 0x128a, 0xb3e: 0x18eb, 0xb3f: 0x1292, + // Block 0x2d, offset 0xb40 + 0xb40: 0x17fb, 0xb41: 0x075a, 0xb42: 0x12aa, 0xb43: 0x12ae, 0xb44: 0x0762, 0xb45: 0x12b2, + 0xb46: 0x0b2e, 0xb47: 0x18f0, 0xb48: 0x18f5, 0xb49: 0x1800, 0xb4a: 0x1805, 0xb4b: 0x12d2, + 0xb4c: 0x12d6, 0xb4d: 0x14ee, 0xb4e: 0x0766, 0xb4f: 0x1302, 0xb50: 0x12fe, 0xb51: 0x1306, + 0xb52: 0x093a, 0xb53: 0x130a, 0xb54: 0x130e, 0xb55: 0x1312, 0xb56: 0x131a, 0xb57: 0x18fa, + 0xb58: 0x1316, 0xb59: 0x131e, 0xb5a: 0x1332, 0xb5b: 0x1336, 0xb5c: 0x1322, 0xb5d: 0x133a, + 0xb5e: 0x134e, 0xb5f: 0x1362, 0xb60: 0x132e, 0xb61: 0x1342, 0xb62: 0x1346, 0xb63: 0x134a, + 0xb64: 0x18ff, 0xb65: 0x1909, 0xb66: 0x1904, 0xb67: 0x076a, 0xb68: 0x136a, 0xb69: 0x136e, + 0xb6a: 0x1376, 0xb6b: 0x191d, 0xb6c: 0x137a, 0xb6d: 0x190e, 0xb6e: 0x076e, 0xb6f: 0x0772, + 0xb70: 0x1913, 0xb71: 0x1918, 0xb72: 0x0776, 0xb73: 0x139a, 0xb74: 0x139e, 0xb75: 0x13a2, + 0xb76: 0x13a6, 0xb77: 0x13b2, 0xb78: 0x13ae, 0xb79: 0x13ba, 0xb7a: 0x13b6, 0xb7b: 0x13c6, + 0xb7c: 0x13be, 0xb7d: 0x13c2, 0xb7e: 0x13ca, 0xb7f: 0x077a, + // Block 0x2e, offset 0xb80 + 0xb80: 0x13d2, 0xb81: 0x13d6, 0xb82: 0x077e, 0xb83: 0x13e6, 0xb84: 0x13ea, 0xb85: 0x1922, + 0xb86: 0x13f6, 0xb87: 0x13fa, 0xb88: 0x0782, 0xb89: 0x1406, 0xb8a: 0x06b6, 0xb8b: 0x1927, + 0xb8c: 0x192c, 0xb8d: 0x0786, 0xb8e: 0x078a, 0xb8f: 0x1432, 0xb90: 0x144a, 0xb91: 0x1466, + 0xb92: 0x1476, 0xb93: 0x1931, 0xb94: 0x148a, 0xb95: 0x148e, 0xb96: 0x14a6, 0xb97: 0x14b2, + 0xb98: 0x193b, 0xb99: 0x178d, 0xb9a: 0x14be, 0xb9b: 0x14ba, 0xb9c: 0x14c6, 0xb9d: 0x1792, + 0xb9e: 0x14d2, 0xb9f: 0x14de, 0xba0: 0x1940, 0xba1: 0x1945, 0xba2: 0x151e, 0xba3: 0x152a, + 0xba4: 0x1532, 0xba5: 0x194a, 0xba6: 0x1536, 0xba7: 0x1562, 0xba8: 0x156e, 0xba9: 0x1572, + 0xbaa: 0x156a, 0xbab: 0x157e, 0xbac: 0x1582, 0xbad: 0x194f, 0xbae: 0x158e, 0xbaf: 0x078e, + 0xbb0: 0x1596, 0xbb1: 0x1954, 0xbb2: 0x0792, 0xbb3: 0x15ce, 0xbb4: 0x0bbe, 0xbb5: 0x15e6, + 0xbb6: 0x1959, 0xbb7: 0x1963, 0xbb8: 0x0796, 0xbb9: 0x079a, 0xbba: 0x160e, 0xbbb: 0x1968, + 0xbbc: 0x079e, 0xbbd: 0x196d, 0xbbe: 0x1626, 0xbbf: 0x1626, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x162e, 0xbc1: 0x1972, 0xbc2: 0x1646, 0xbc3: 0x07a2, 0xbc4: 0x1656, 0xbc5: 0x1662, + 0xbc6: 0x166a, 0xbc7: 0x1672, 0xbc8: 0x07a6, 0xbc9: 0x1977, 0xbca: 0x1686, 0xbcb: 0x16a2, + 0xbcc: 0x16ae, 0xbcd: 0x07aa, 0xbce: 0x07ae, 0xbcf: 0x16b2, 0xbd0: 0x197c, 0xbd1: 0x07b2, + 0xbd2: 0x1981, 0xbd3: 0x1986, 0xbd4: 0x198b, 0xbd5: 0x16d6, 0xbd6: 0x07b6, 0xbd7: 0x16ea, + 0xbd8: 0x16f2, 0xbd9: 0x16f6, 0xbda: 0x16fe, 0xbdb: 0x1706, 0xbdc: 0x170e, 0xbdd: 0x1995, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x122: 0x3d, 0x123: 0x0d, 0x124: 0x3e, 0x125: 0x3f, 0x126: 0x40, 0x127: 0x41, + 0x128: 0x42, 0x129: 0x43, 0x12a: 0x44, 0x12b: 0x45, 0x12c: 0x40, 0x12d: 0x46, 0x12e: 0x47, 0x12f: 0x48, + 0x130: 0x44, 0x131: 0x49, 0x132: 0x4a, 0x133: 0x4b, 0x134: 0x4c, 0x135: 0x4d, 0x137: 0x4e, + 0x138: 0x4f, 0x139: 0x50, 0x13a: 0x51, 0x13b: 0x52, 0x13c: 0x53, 0x13d: 0x54, 0x13e: 0x55, 0x13f: 0x56, + // Block 0x5, offset 0x140 + 0x140: 0x57, 0x142: 0x58, 0x144: 0x59, 0x145: 0x5a, 0x146: 0x5b, 0x147: 0x5c, + 0x14d: 0x5d, + 0x15c: 0x5e, 0x15f: 0x5f, + 0x162: 0x60, 0x164: 0x61, + 0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16b: 0x65, 0x16c: 0x0e, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68, + 0x170: 0x69, 0x173: 0x6a, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x6b, 0x183: 0x6c, 0x184: 0x6d, 0x186: 0x6e, 0x187: 0x6f, + 0x188: 0x70, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x71, 0x18c: 0x72, + 0x1ab: 0x73, + 0x1b3: 0x74, 0x1b5: 0x75, 0x1b7: 0x76, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x77, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x78, 0x1c5: 0x79, + 0x1c9: 0x7a, 0x1cc: 0x7b, 0x1cd: 0x7c, + // Block 0x8, offset 0x200 + 0x219: 0x7d, 0x21a: 0x7e, 0x21b: 0x7f, + 0x220: 0x80, 0x223: 0x81, 0x224: 0x82, 0x225: 0x83, 0x226: 0x84, 0x227: 0x85, + 0x22a: 0x86, 0x22b: 0x87, 0x22f: 0x88, + 0x230: 0x89, 0x231: 0x8a, 0x232: 0x8b, 0x233: 0x8c, 0x234: 0x8d, 0x235: 0x8e, 0x236: 0x8f, 0x237: 0x89, + 0x238: 0x8a, 0x239: 0x8b, 0x23a: 0x8c, 0x23b: 0x8d, 0x23c: 0x8e, 0x23d: 0x8f, 0x23e: 0x89, 0x23f: 0x8a, + // Block 0x9, offset 0x240 + 0x240: 0x8b, 0x241: 0x8c, 0x242: 0x8d, 0x243: 0x8e, 0x244: 0x8f, 0x245: 0x89, 0x246: 0x8a, 0x247: 0x8b, + 0x248: 0x8c, 0x249: 0x8d, 0x24a: 0x8e, 0x24b: 0x8f, 0x24c: 0x89, 0x24d: 0x8a, 0x24e: 0x8b, 0x24f: 0x8c, + 0x250: 0x8d, 0x251: 0x8e, 0x252: 0x8f, 0x253: 0x89, 0x254: 0x8a, 0x255: 0x8b, 0x256: 0x8c, 0x257: 0x8d, + 0x258: 0x8e, 0x259: 0x8f, 0x25a: 0x89, 0x25b: 0x8a, 0x25c: 0x8b, 0x25d: 0x8c, 0x25e: 0x8d, 0x25f: 0x8e, + 0x260: 0x8f, 0x261: 0x89, 0x262: 0x8a, 0x263: 0x8b, 0x264: 0x8c, 0x265: 0x8d, 0x266: 0x8e, 0x267: 0x8f, + 0x268: 0x89, 0x269: 0x8a, 0x26a: 0x8b, 0x26b: 0x8c, 0x26c: 0x8d, 0x26d: 0x8e, 0x26e: 0x8f, 0x26f: 0x89, + 0x270: 0x8a, 0x271: 0x8b, 0x272: 0x8c, 0x273: 0x8d, 0x274: 0x8e, 0x275: 0x8f, 0x276: 0x89, 0x277: 0x8a, + 0x278: 0x8b, 0x279: 0x8c, 0x27a: 0x8d, 0x27b: 0x8e, 0x27c: 0x8f, 0x27d: 0x89, 0x27e: 0x8a, 0x27f: 0x8b, + // Block 0xa, offset 0x280 + 0x280: 0x8c, 0x281: 0x8d, 0x282: 0x8e, 0x283: 0x8f, 0x284: 0x89, 0x285: 0x8a, 0x286: 0x8b, 0x287: 0x8c, + 0x288: 0x8d, 0x289: 0x8e, 0x28a: 0x8f, 0x28b: 0x89, 0x28c: 0x8a, 0x28d: 0x8b, 0x28e: 0x8c, 0x28f: 0x8d, + 0x290: 0x8e, 0x291: 0x8f, 0x292: 0x89, 0x293: 0x8a, 0x294: 0x8b, 0x295: 0x8c, 0x296: 0x8d, 0x297: 0x8e, + 0x298: 0x8f, 0x299: 0x89, 0x29a: 0x8a, 0x29b: 0x8b, 0x29c: 0x8c, 0x29d: 0x8d, 0x29e: 0x8e, 0x29f: 0x8f, + 0x2a0: 0x89, 0x2a1: 0x8a, 0x2a2: 0x8b, 0x2a3: 0x8c, 0x2a4: 0x8d, 0x2a5: 0x8e, 0x2a6: 0x8f, 0x2a7: 0x89, + 0x2a8: 0x8a, 0x2a9: 0x8b, 0x2aa: 0x8c, 0x2ab: 0x8d, 0x2ac: 0x8e, 0x2ad: 0x8f, 0x2ae: 0x89, 0x2af: 0x8a, + 0x2b0: 0x8b, 0x2b1: 0x8c, 0x2b2: 0x8d, 0x2b3: 0x8e, 0x2b4: 0x8f, 0x2b5: 0x89, 0x2b6: 0x8a, 0x2b7: 0x8b, + 0x2b8: 0x8c, 0x2b9: 0x8d, 0x2ba: 0x8e, 0x2bb: 0x8f, 0x2bc: 0x89, 0x2bd: 0x8a, 0x2be: 0x8b, 0x2bf: 0x8c, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8d, 0x2c1: 0x8e, 0x2c2: 0x8f, 0x2c3: 0x89, 0x2c4: 0x8a, 0x2c5: 0x8b, 0x2c6: 0x8c, 0x2c7: 0x8d, + 0x2c8: 0x8e, 0x2c9: 0x8f, 0x2ca: 0x89, 0x2cb: 0x8a, 0x2cc: 0x8b, 0x2cd: 0x8c, 0x2ce: 0x8d, 0x2cf: 0x8e, + 0x2d0: 0x8f, 0x2d1: 0x89, 0x2d2: 0x8a, 0x2d3: 0x8b, 0x2d4: 0x8c, 0x2d5: 0x8d, 0x2d6: 0x8e, 0x2d7: 0x8f, + 0x2d8: 0x89, 0x2d9: 0x8a, 0x2da: 0x8b, 0x2db: 0x8c, 0x2dc: 0x8d, 0x2dd: 0x8e, 0x2de: 0x90, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x91, 0x32d: 0x92, 0x32e: 0x93, + 0x331: 0x94, 0x332: 0x95, 0x333: 0x96, 0x334: 0x97, + 0x338: 0x98, 0x339: 0x99, 0x33a: 0x9a, 0x33b: 0x9b, 0x33e: 0x9c, 0x33f: 0x9d, + // Block 0xd, offset 0x340 + 0x347: 0x9e, + 0x34b: 0x9f, 0x34d: 0xa0, + 0x368: 0xa1, 0x36b: 0xa2, + 0x374: 0xa3, + 0x37a: 0xa4, 0x37b: 0xa5, 0x37d: 0xa6, 0x37e: 0xa7, + // Block 0xe, offset 0x380 + 0x381: 0xa8, 0x382: 0xa9, 0x384: 0xaa, 0x385: 0x84, 0x387: 0xab, + 0x388: 0xac, 0x38b: 0xad, 0x38c: 0xae, 0x38d: 0xaf, + 0x391: 0xb0, 0x392: 0xb1, 0x393: 0xb2, 0x396: 0xb3, 0x397: 0xb4, + 0x398: 0x75, 0x39a: 0xb5, 0x39c: 0xb6, + 0x3a0: 0xb7, 0x3a4: 0xb8, 0x3a5: 0xb9, 0x3a7: 0xba, + 0x3a8: 0xbb, 0x3a9: 0xbc, 0x3aa: 0xbd, + 0x3b0: 0x75, 0x3b5: 0xbe, 0x3b6: 0xbf, + 0x3bd: 0xc0, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xc1, 0x3ec: 0xc2, + 0x3ff: 0xc3, + // Block 0x10, offset 0x400 + 0x432: 0xc4, + // Block 0x11, offset 0x440 + 0x445: 0xc5, 0x446: 0xc6, 0x447: 0xc7, + 0x449: 0xc8, + // Block 0x12, offset 0x480 + 0x480: 0xc9, 0x482: 0xca, 0x484: 0xc2, + 0x48a: 0xcb, 0x48b: 0xcc, + 0x493: 0xcd, + 0x4a3: 0xce, 0x4a5: 0xcf, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xd0, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 163 entries, 326 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x6e, 0x76, 0x7d, 0x80, 0x88, 0x8c, 0x90, 0x92, 0x94, 0x9d, 0xa1, 0xa8, 0xad, 0xb0, 0xba, 0xbd, 0xc4, 0xcc, 0xcf, 0xd1, 0xd4, 0xd6, 0xdb, 0xec, 0xf8, 0xfa, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10f, 0x112, 0x114, 0x117, 0x11a, 0x11e, 0x124, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x14a, 0x158, 0x15b, 0x161, 0x167, 0x172, 0x176, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x186, 0x18a, 0x18c, 0x18e, 0x196, 0x19a, 0x19d, 0x19f, 0x1a1, 0x1a4, 0x1a7, 0x1a9, 0x1ab, 0x1ad, 0x1af, 0x1b5, 0x1b8, 0x1ba, 0x1c1, 0x1c7, 0x1cd, 0x1d5, 0x1db, 0x1e1, 0x1e7, 0x1eb, 0x1f9, 0x202, 0x205, 0x208, 0x20a, 0x20d, 0x20f, 0x213, 0x218, 0x21a, 0x21c, 0x221, 0x227, 0x229, 0x22b, 0x22d, 0x233, 0x236, 0x238, 0x23a, 0x23c, 0x242, 0x246, 0x24a, 0x252, 0x259, 0x25c, 0x25f, 0x261, 0x264, 0x26c, 0x270, 0x277, 0x27a, 0x280, 0x282, 0x285, 0x287, 0x28a, 0x28f, 0x291, 0x293, 0x295, 0x297, 0x299, 0x29c, 0x29e, 0x2a0, 0x2a2, 0x2a4, 0x2a6, 0x2a8, 0x2b5, 0x2bf, 0x2c1, 0x2c3, 0x2c9, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d5, 0x2d8} + +// nfcSparseValues: 730 entries, 2920 bytes +var nfcSparseValues = [730]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4981, lo: 0x8a, hi: 0x8a}, + {value: 0x499f, lo: 0x8b, hi: 0x8b}, + {value: 0x3808, lo: 0x8c, hi: 0x8c}, + {value: 0x3820, lo: 0x8d, hi: 0x8d}, + {value: 0x49b7, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x383e, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0x10, offset 0x6e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x11, offset 0x76 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x12, offset 0x7d + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x80 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x14, offset 0x88 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x8c + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x16, offset 0x90 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x17, offset 0x92 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x18, offset 0x94 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1a, offset 0xa1 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1b, offset 0xa8 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xad + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0xb0 + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1e, offset 0xba + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1f, offset 0xbd + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x20, offset 0xc4 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x21, offset 0xcc + {value: 0x0000, lo: 0x02}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xcf + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x23, offset 0xd1 + {value: 0x0000, lo: 0x02}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x24, offset 0xd4 + {value: 0x0000, lo: 0x01}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + // Block 0x25, offset 0xd6 + {value: 0x0000, lo: 0x04}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0xdb + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x27, offset 0xec + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x28, offset 0xf8 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x29, offset 0xfa + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x2a, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2b, offset 0x102 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x104 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x108 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x10a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x10c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x10f + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x114 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x117 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x11a + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x11e + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x124 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x12b + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x134 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x136 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x139 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x13b + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x146 + {value: 0x0004, lo: 0x03}, + {value: 0x052a, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3e, offset 0x14a + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x3f, offset 0x158 + {value: 0x43bc, lo: 0x02}, + {value: 0x023c, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x40, offset 0x15b + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x161 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x167 + {value: 0x62c7, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x172 + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x176 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x178 + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x46, offset 0x17a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x47, offset 0x17c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x48, offset 0x17e + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x49, offset 0x180 + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xaf}, + // Block 0x4a, offset 0x186 + {value: 0x0000, lo: 0x03}, + {value: 0x4be0, lo: 0xb3, hi: 0xb3}, + {value: 0x4be0, lo: 0xb5, hi: 0xb6}, + {value: 0x4be0, lo: 0xba, hi: 0xbf}, + // Block 0x4b, offset 0x18a + {value: 0x0000, lo: 0x01}, + {value: 0x4be0, lo: 0x8f, hi: 0xa3}, + // Block 0x4c, offset 0x18c + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4d, offset 0x18e + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4e, offset 0x196 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4f, offset 0x19a + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x50, offset 0x19d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x51, offset 0x19f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x52, offset 0x1a1 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x53, offset 0x1a4 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x54, offset 0x1a7 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x55, offset 0x1a9 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x56, offset 0x1ab + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x57, offset 0x1ad + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x58, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x59, offset 0x1b5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x5a, offset 0x1b8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x5b, offset 0x1ba + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5c, offset 0x1c1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5d, offset 0x1c7 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5e, offset 0x1cd + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5f, offset 0x1d5 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x60, offset 0x1db + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x61, offset 0x1e1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x62, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x63, offset 0x1eb + {value: 0x0006, lo: 0x0d}, + {value: 0x44d1, lo: 0x9d, hi: 0x9d}, + {value: 0x8116, lo: 0x9e, hi: 0x9e}, + {value: 0x4543, lo: 0x9f, hi: 0x9f}, + {value: 0x4531, lo: 0xaa, hi: 0xab}, + {value: 0x4635, lo: 0xac, hi: 0xac}, + {value: 0x463d, lo: 0xad, hi: 0xad}, + {value: 0x4489, lo: 0xae, hi: 0xb1}, + {value: 0x44a7, lo: 0xb2, hi: 0xb4}, + {value: 0x44bf, lo: 0xb5, hi: 0xb6}, + {value: 0x44cb, lo: 0xb8, hi: 0xb8}, + {value: 0x44d7, lo: 0xb9, hi: 0xbb}, + {value: 0x44ef, lo: 0xbc, hi: 0xbc}, + {value: 0x44f5, lo: 0xbe, hi: 0xbe}, + // Block 0x64, offset 0x1f9 + {value: 0x0006, lo: 0x08}, + {value: 0x44fb, lo: 0x80, hi: 0x81}, + {value: 0x4507, lo: 0x83, hi: 0x84}, + {value: 0x4519, lo: 0x86, hi: 0x89}, + {value: 0x453d, lo: 0x8a, hi: 0x8a}, + {value: 0x44b9, lo: 0x8b, hi: 0x8b}, + {value: 0x44a1, lo: 0x8c, hi: 0x8c}, + {value: 0x44e9, lo: 0x8d, hi: 0x8d}, + {value: 0x4513, lo: 0x8e, hi: 0x8e}, + // Block 0x65, offset 0x202 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x66, offset 0x205 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x67, offset 0x208 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x68, offset 0x20a + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x69, offset 0x20d + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x6a, offset 0x20f + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0xa0, hi: 0xa6}, + {value: 0x812e, lo: 0xa7, hi: 0xad}, + {value: 0x8133, lo: 0xae, hi: 0xaf}, + // Block 0x6b, offset 0x213 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6c, offset 0x218 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6d, offset 0x21a + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6e, offset 0x21c + {value: 0x0000, lo: 0x04}, + {value: 0x4be0, lo: 0x9e, hi: 0x9f}, + {value: 0x4be0, lo: 0xa3, hi: 0xa3}, + {value: 0x4be0, lo: 0xa5, hi: 0xa6}, + {value: 0x4be0, lo: 0xaa, hi: 0xaf}, + // Block 0x6f, offset 0x221 + {value: 0x0000, lo: 0x05}, + {value: 0x4be0, lo: 0x82, hi: 0x87}, + {value: 0x4be0, lo: 0x8a, hi: 0x8f}, + {value: 0x4be0, lo: 0x92, hi: 0x97}, + {value: 0x4be0, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x70, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x71, offset 0x229 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x72, offset 0x22b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x73, offset 0x22d + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x233 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x75, offset 0x236 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x76, offset 0x238 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x77, offset 0x23a + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x78, offset 0x23c + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x79, offset 0x242 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x7a, offset 0x246 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x7b, offset 0x24a + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x7c, offset 0x252 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x7d, offset 0x259 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7e, offset 0x25c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7f, offset 0x25f + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x80, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x81, offset 0x264 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x82, offset 0x26c + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x83, offset 0x270 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x84, offset 0x277 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x85, offset 0x27a + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x86, offset 0x280 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x87, offset 0x282 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x88, offset 0x285 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x89, offset 0x287 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x8a, offset 0x28a + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x8b, offset 0x28f + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x8c, offset 0x291 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8d, offset 0x293 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8e, offset 0x295 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8f, offset 0x297 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x90, offset 0x299 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x91, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x92, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x93, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x94, offset 0x2a2 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x95, offset 0x2a4 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x96, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x97, offset 0x2a8 + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x98, offset 0x2b5 + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x2bf + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x9a, offset 0x2c1 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x9b, offset 0x2c3 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0x80, hi: 0x86}, + {value: 0x8133, lo: 0x88, hi: 0x98}, + {value: 0x8133, lo: 0x9b, hi: 0xa1}, + {value: 0x8133, lo: 0xa3, hi: 0xa4}, + {value: 0x8133, lo: 0xa6, hi: 0xaa}, + // Block 0x9c, offset 0x2c9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0x9d, offset 0x2cb + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0x9e, offset 0x2cd + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0x9f, offset 0x2cf + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xa0, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xa1, offset 0x2d5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xa2, offset 0x2d8 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 19260 bytes (18.81 KiB). Checksum: 1a0bbc4c8c24da49. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 95: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 95 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 97 blocks, 6208 entries, 12416 bytes +// The third block is the zero block. +var nfkcValues = [6208]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x132: 0x1a8a, 0x133: 0x1b17, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, 0x13f: 0x1cdc, + // Block 0x5, offset 0x140 + 0x140: 0x1d64, 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, 0x149: 0x1d8c, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2f2f, 0x185: 0x2f35, + 0x186: 0x2f3b, 0x187: 0x1a9f, 0x188: 0x1aa2, 0x189: 0x1b38, 0x18a: 0x1ab7, 0x18b: 0x1aba, + 0x18c: 0x1b6e, 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b1: 0x1a6f, 0x1b2: 0x1a72, 0x1b3: 0x1aff, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x43e6, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x439b, 0x285: 0x45bc, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4981, 0x2cb: 0x499f, + 0x2cc: 0x3808, 0x2cd: 0x3820, 0x2ce: 0x49b7, 0x2d0: 0x0242, 0x2d1: 0x0254, + 0x2d2: 0x0230, 0x2d3: 0x444d, 0x2d4: 0x4453, 0x2d5: 0x027e, 0x2d6: 0x026c, + 0x2f0: 0x025a, 0x2f1: 0x026f, 0x2f2: 0x0272, 0x2f4: 0x020c, 0x2f5: 0x024b, + 0x2f9: 0x022a, + // Block 0xc, offset 0x300 + 0x300: 0x3862, 0x301: 0x386e, 0x303: 0x385c, + 0x306: 0xa000, 0x307: 0x384a, + 0x30c: 0x389e, 0x30d: 0x3886, 0x30e: 0x38b0, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3892, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x3916, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3874, 0x342: 0x38f8, + 0x350: 0x3850, 0x351: 0x38d4, + 0x352: 0x3856, 0x353: 0x38da, 0x356: 0x3868, 0x357: 0x38ec, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x396a, 0x35b: 0x3970, 0x35c: 0x387a, 0x35d: 0x38fe, + 0x35e: 0x3880, 0x35f: 0x3904, 0x362: 0x388c, 0x363: 0x3910, + 0x364: 0x3898, 0x365: 0x391c, 0x366: 0x38a4, 0x367: 0x3928, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3976, 0x36b: 0x397c, 0x36c: 0x38ce, 0x36d: 0x3952, 0x36e: 0x38aa, 0x36f: 0x392e, + 0x370: 0x38b6, 0x371: 0x393a, 0x372: 0x38bc, 0x373: 0x3940, 0x374: 0x38c2, 0x375: 0x3946, + 0x378: 0x38c8, 0x379: 0x394c, + // Block 0xe, offset 0x380 + 0x387: 0x1e91, + 0x391: 0x812e, + 0x392: 0x8133, 0x393: 0x8133, 0x394: 0x8133, 0x395: 0x8133, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x812f, 0x39b: 0x812e, 0x39c: 0x8133, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x8133, 0x3a0: 0x8133, 0x3a1: 0x8133, 0x3a2: 0x812e, 0x3a3: 0x812e, + 0x3a4: 0x812e, 0x3a5: 0x812e, 0x3a6: 0x812e, 0x3a7: 0x812e, 0x3a8: 0x8133, 0x3a9: 0x8133, + 0x3aa: 0x812e, 0x3ab: 0x8133, 0x3ac: 0x8133, 0x3ad: 0x812f, 0x3ae: 0x8132, 0x3af: 0x8133, + 0x3b0: 0x8106, 0x3b1: 0x8107, 0x3b2: 0x8108, 0x3b3: 0x8109, 0x3b4: 0x810a, 0x3b5: 0x810b, + 0x3b6: 0x810c, 0x3b7: 0x810d, 0x3b8: 0x810e, 0x3b9: 0x810f, 0x3ba: 0x810f, 0x3bb: 0x8110, + 0x3bc: 0x8111, 0x3bd: 0x8112, 0x3bf: 0x8113, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8117, + 0x3cc: 0x8118, 0x3cd: 0x8119, 0x3ce: 0x811a, 0x3cf: 0x811b, 0x3d0: 0x811c, 0x3d1: 0x811d, + 0x3d2: 0x811e, 0x3d3: 0x9933, 0x3d4: 0x9933, 0x3d5: 0x992e, 0x3d6: 0x812e, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x812e, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x812e, + 0x3f0: 0x811f, 0x3f5: 0x1eb4, + 0x3f6: 0x2143, 0x3f7: 0x217f, 0x3f8: 0x217a, + // Block 0x10, offset 0x400 + 0x40a: 0x8133, 0x40b: 0x8133, + 0x40c: 0x8133, 0x40d: 0x8133, 0x40e: 0x8133, 0x40f: 0x812e, 0x410: 0x812e, 0x411: 0x812e, + 0x412: 0x812e, 0x413: 0x812e, 0x414: 0x8133, 0x415: 0x8133, 0x416: 0x8133, 0x417: 0x8133, + 0x418: 0x8133, 0x419: 0x8133, 0x41a: 0x8133, 0x41b: 0x8133, 0x41c: 0x8133, 0x41d: 0x8133, + 0x41e: 0x8133, 0x41f: 0x8133, 0x420: 0x8133, 0x421: 0x8133, 0x423: 0x812e, + 0x424: 0x8133, 0x425: 0x8133, 0x426: 0x812e, 0x427: 0x8133, 0x428: 0x8133, 0x429: 0x812e, + 0x42a: 0x8133, 0x42b: 0x8133, 0x42c: 0x8133, 0x42d: 0x812e, 0x42e: 0x812e, 0x42f: 0x812e, + 0x430: 0x8117, 0x431: 0x8118, 0x432: 0x8119, 0x433: 0x8133, 0x434: 0x8133, 0x435: 0x8133, + 0x436: 0x812e, 0x437: 0x8133, 0x438: 0x8133, 0x439: 0x812e, 0x43a: 0x812e, 0x43b: 0x8133, + 0x43c: 0x8133, 0x43d: 0x8133, 0x43e: 0x8133, 0x43f: 0x8133, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2e5d, 0x447: 0xa000, 0x448: 0x2e65, 0x449: 0xa000, 0x44a: 0x2e6d, 0x44b: 0xa000, + 0x44c: 0x2e75, 0x44d: 0xa000, 0x44e: 0x2e7d, 0x451: 0xa000, + 0x452: 0x2e85, + 0x474: 0x8103, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2e8d, + 0x47c: 0xa000, 0x47d: 0x2e95, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x0104, 0x485: 0x0107, + 0x486: 0x0506, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x011f, 0x48b: 0x0122, + 0x48c: 0x0125, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e6, + 0x492: 0x009f, 0x493: 0x0110, 0x494: 0x050a, 0x495: 0x050e, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0516, 0x49a: 0x015b, 0x49b: 0x00ad, 0x49c: 0x051a, 0x49d: 0x0242, + 0x49e: 0x0245, 0x49f: 0x0248, 0x4a0: 0x027e, 0x4a1: 0x0281, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x0242, 0x4a7: 0x0245, 0x4a8: 0x026f, 0x4a9: 0x027e, + 0x4aa: 0x0281, + 0x4b8: 0x02b4, + // Block 0x13, offset 0x4c0 + 0x4db: 0x010a, 0x4dc: 0x0087, 0x4dd: 0x0113, + 0x4de: 0x00d7, 0x4df: 0x0125, 0x4e0: 0x008d, 0x4e1: 0x012b, 0x4e2: 0x0131, 0x4e3: 0x013d, + 0x4e4: 0x0146, 0x4e5: 0x0149, 0x4e6: 0x014c, 0x4e7: 0x051e, 0x4e8: 0x01c7, 0x4e9: 0x0155, + 0x4ea: 0x0522, 0x4eb: 0x01ca, 0x4ec: 0x0161, 0x4ed: 0x015e, 0x4ee: 0x0164, 0x4ef: 0x0167, + 0x4f0: 0x016a, 0x4f1: 0x016d, 0x4f2: 0x0176, 0x4f3: 0x018e, 0x4f4: 0x0191, 0x4f5: 0x00f2, + 0x4f6: 0x019a, 0x4f7: 0x019d, 0x4f8: 0x0512, 0x4f9: 0x01a0, 0x4fa: 0x01a3, 0x4fb: 0x00b5, + 0x4fc: 0x01af, 0x4fd: 0x01b2, 0x4fe: 0x01b5, 0x4ff: 0x0254, + // Block 0x14, offset 0x500 + 0x500: 0x8133, 0x501: 0x8133, 0x502: 0x812e, 0x503: 0x8133, 0x504: 0x8133, 0x505: 0x8133, + 0x506: 0x8133, 0x507: 0x8133, 0x508: 0x8133, 0x509: 0x8133, 0x50a: 0x812e, 0x50b: 0x8133, + 0x50c: 0x8133, 0x50d: 0x8136, 0x50e: 0x812b, 0x50f: 0x812e, 0x510: 0x812a, 0x511: 0x8133, + 0x512: 0x8133, 0x513: 0x8133, 0x514: 0x8133, 0x515: 0x8133, 0x516: 0x8133, 0x517: 0x8133, + 0x518: 0x8133, 0x519: 0x8133, 0x51a: 0x8133, 0x51b: 0x8133, 0x51c: 0x8133, 0x51d: 0x8133, + 0x51e: 0x8133, 0x51f: 0x8133, 0x520: 0x8133, 0x521: 0x8133, 0x522: 0x8133, 0x523: 0x8133, + 0x524: 0x8133, 0x525: 0x8133, 0x526: 0x8133, 0x527: 0x8133, 0x528: 0x8133, 0x529: 0x8133, + 0x52a: 0x8133, 0x52b: 0x8133, 0x52c: 0x8133, 0x52d: 0x8133, 0x52e: 0x8133, 0x52f: 0x8133, + 0x530: 0x8133, 0x531: 0x8133, 0x532: 0x8133, 0x533: 0x8133, 0x534: 0x8133, 0x535: 0x8133, + 0x536: 0x8134, 0x537: 0x8132, 0x538: 0x8132, 0x539: 0x812e, 0x53a: 0x812d, 0x53b: 0x8133, + 0x53c: 0x8135, 0x53d: 0x812e, 0x53e: 0x8133, 0x53f: 0x812e, + // Block 0x15, offset 0x540 + 0x540: 0x30d8, 0x541: 0x33e4, 0x542: 0x30e2, 0x543: 0x33ee, 0x544: 0x30e7, 0x545: 0x33f3, + 0x546: 0x30ec, 0x547: 0x33f8, 0x548: 0x3a0d, 0x549: 0x3b9c, 0x54a: 0x3105, 0x54b: 0x3411, + 0x54c: 0x310f, 0x54d: 0x341b, 0x54e: 0x311e, 0x54f: 0x342a, 0x550: 0x3114, 0x551: 0x3420, + 0x552: 0x3119, 0x553: 0x3425, 0x554: 0x3a30, 0x555: 0x3bbf, 0x556: 0x3a37, 0x557: 0x3bc6, + 0x558: 0x315a, 0x559: 0x3466, 0x55a: 0x315f, 0x55b: 0x346b, 0x55c: 0x3a45, 0x55d: 0x3bd4, + 0x55e: 0x3164, 0x55f: 0x3470, 0x560: 0x3173, 0x561: 0x347f, 0x562: 0x3191, 0x563: 0x349d, + 0x564: 0x31a0, 0x565: 0x34ac, 0x566: 0x3196, 0x567: 0x34a2, 0x568: 0x31a5, 0x569: 0x34b1, + 0x56a: 0x31aa, 0x56b: 0x34b6, 0x56c: 0x31f0, 0x56d: 0x34fc, 0x56e: 0x3a4c, 0x56f: 0x3bdb, + 0x570: 0x31fa, 0x571: 0x350b, 0x572: 0x3204, 0x573: 0x3515, 0x574: 0x320e, 0x575: 0x351f, + 0x576: 0x4805, 0x577: 0x4896, 0x578: 0x3a53, 0x579: 0x3be2, 0x57a: 0x3227, 0x57b: 0x3538, + 0x57c: 0x3222, 0x57d: 0x3533, 0x57e: 0x322c, 0x57f: 0x353d, + // Block 0x16, offset 0x580 + 0x580: 0x3231, 0x581: 0x3542, 0x582: 0x3236, 0x583: 0x3547, 0x584: 0x324a, 0x585: 0x355b, + 0x586: 0x3254, 0x587: 0x3565, 0x588: 0x3263, 0x589: 0x3574, 0x58a: 0x325e, 0x58b: 0x356f, + 0x58c: 0x3a76, 0x58d: 0x3c05, 0x58e: 0x3a84, 0x58f: 0x3c13, 0x590: 0x3a8b, 0x591: 0x3c1a, + 0x592: 0x3a92, 0x593: 0x3c21, 0x594: 0x3290, 0x595: 0x35a1, 0x596: 0x3295, 0x597: 0x35a6, + 0x598: 0x329f, 0x599: 0x35b0, 0x59a: 0x4832, 0x59b: 0x48c3, 0x59c: 0x3ad8, 0x59d: 0x3c67, + 0x59e: 0x32b8, 0x59f: 0x35c9, 0x5a0: 0x32c2, 0x5a1: 0x35d3, 0x5a2: 0x4841, 0x5a3: 0x48d2, + 0x5a4: 0x3adf, 0x5a5: 0x3c6e, 0x5a6: 0x3ae6, 0x5a7: 0x3c75, 0x5a8: 0x3aed, 0x5a9: 0x3c7c, + 0x5aa: 0x32d1, 0x5ab: 0x35e2, 0x5ac: 0x32db, 0x5ad: 0x35f1, 0x5ae: 0x32ef, 0x5af: 0x3605, + 0x5b0: 0x32ea, 0x5b1: 0x3600, 0x5b2: 0x332b, 0x5b3: 0x3641, 0x5b4: 0x333a, 0x5b5: 0x3650, + 0x5b6: 0x3335, 0x5b7: 0x364b, 0x5b8: 0x3af4, 0x5b9: 0x3c83, 0x5ba: 0x3afb, 0x5bb: 0x3c8a, + 0x5bc: 0x333f, 0x5bd: 0x3655, 0x5be: 0x3344, 0x5bf: 0x365a, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3349, 0x5c1: 0x365f, 0x5c2: 0x334e, 0x5c3: 0x3664, 0x5c4: 0x335d, 0x5c5: 0x3673, + 0x5c6: 0x3358, 0x5c7: 0x366e, 0x5c8: 0x3362, 0x5c9: 0x367d, 0x5ca: 0x3367, 0x5cb: 0x3682, + 0x5cc: 0x336c, 0x5cd: 0x3687, 0x5ce: 0x338a, 0x5cf: 0x36a5, 0x5d0: 0x33a3, 0x5d1: 0x36c3, + 0x5d2: 0x33b2, 0x5d3: 0x36d2, 0x5d4: 0x33b7, 0x5d5: 0x36d7, 0x5d6: 0x34bb, 0x5d7: 0x35e7, + 0x5d8: 0x3678, 0x5d9: 0x36b4, 0x5da: 0x1d10, 0x5db: 0x4418, + 0x5e0: 0x47e2, 0x5e1: 0x4873, 0x5e2: 0x30c4, 0x5e3: 0x33d0, + 0x5e4: 0x39b9, 0x5e5: 0x3b48, 0x5e6: 0x39b2, 0x5e7: 0x3b41, 0x5e8: 0x39c7, 0x5e9: 0x3b56, + 0x5ea: 0x39c0, 0x5eb: 0x3b4f, 0x5ec: 0x39ff, 0x5ed: 0x3b8e, 0x5ee: 0x39d5, 0x5ef: 0x3b64, + 0x5f0: 0x39ce, 0x5f1: 0x3b5d, 0x5f2: 0x39e3, 0x5f3: 0x3b72, 0x5f4: 0x39dc, 0x5f5: 0x3b6b, + 0x5f6: 0x3a06, 0x5f7: 0x3b95, 0x5f8: 0x47f6, 0x5f9: 0x4887, 0x5fa: 0x3141, 0x5fb: 0x344d, + 0x5fc: 0x312d, 0x5fd: 0x3439, 0x5fe: 0x3a1b, 0x5ff: 0x3baa, + // Block 0x18, offset 0x600 + 0x600: 0x3a14, 0x601: 0x3ba3, 0x602: 0x3a29, 0x603: 0x3bb8, 0x604: 0x3a22, 0x605: 0x3bb1, + 0x606: 0x3a3e, 0x607: 0x3bcd, 0x608: 0x31d2, 0x609: 0x34de, 0x60a: 0x31e6, 0x60b: 0x34f2, + 0x60c: 0x4828, 0x60d: 0x48b9, 0x60e: 0x3277, 0x60f: 0x3588, 0x610: 0x3a61, 0x611: 0x3bf0, + 0x612: 0x3a5a, 0x613: 0x3be9, 0x614: 0x3a6f, 0x615: 0x3bfe, 0x616: 0x3a68, 0x617: 0x3bf7, + 0x618: 0x3aca, 0x619: 0x3c59, 0x61a: 0x3aae, 0x61b: 0x3c3d, 0x61c: 0x3aa7, 0x61d: 0x3c36, + 0x61e: 0x3abc, 0x61f: 0x3c4b, 0x620: 0x3ab5, 0x621: 0x3c44, 0x622: 0x3ac3, 0x623: 0x3c52, + 0x624: 0x3326, 0x625: 0x363c, 0x626: 0x3308, 0x627: 0x361e, 0x628: 0x3b25, 0x629: 0x3cb4, + 0x62a: 0x3b1e, 0x62b: 0x3cad, 0x62c: 0x3b33, 0x62d: 0x3cc2, 0x62e: 0x3b2c, 0x62f: 0x3cbb, + 0x630: 0x3b3a, 0x631: 0x3cc9, 0x632: 0x3371, 0x633: 0x368c, 0x634: 0x3399, 0x635: 0x36b9, + 0x636: 0x3394, 0x637: 0x36af, 0x638: 0x3380, 0x639: 0x369b, + // Block 0x19, offset 0x640 + 0x640: 0x4945, 0x641: 0x494b, 0x642: 0x4a5f, 0x643: 0x4a77, 0x644: 0x4a67, 0x645: 0x4a7f, + 0x646: 0x4a6f, 0x647: 0x4a87, 0x648: 0x48eb, 0x649: 0x48f1, 0x64a: 0x49cf, 0x64b: 0x49e7, + 0x64c: 0x49d7, 0x64d: 0x49ef, 0x64e: 0x49df, 0x64f: 0x49f7, 0x650: 0x4957, 0x651: 0x495d, + 0x652: 0x3ef9, 0x653: 0x3f09, 0x654: 0x3f01, 0x655: 0x3f11, + 0x658: 0x48f7, 0x659: 0x48fd, 0x65a: 0x3e29, 0x65b: 0x3e39, 0x65c: 0x3e31, 0x65d: 0x3e41, + 0x660: 0x496f, 0x661: 0x4975, 0x662: 0x4a8f, 0x663: 0x4aa7, + 0x664: 0x4a97, 0x665: 0x4aaf, 0x666: 0x4a9f, 0x667: 0x4ab7, 0x668: 0x4903, 0x669: 0x4909, + 0x66a: 0x49ff, 0x66b: 0x4a17, 0x66c: 0x4a07, 0x66d: 0x4a1f, 0x66e: 0x4a0f, 0x66f: 0x4a27, + 0x670: 0x4987, 0x671: 0x498d, 0x672: 0x3f59, 0x673: 0x3f71, 0x674: 0x3f61, 0x675: 0x3f79, + 0x676: 0x3f69, 0x677: 0x3f81, 0x678: 0x490f, 0x679: 0x4915, 0x67a: 0x3e59, 0x67b: 0x3e71, + 0x67c: 0x3e61, 0x67d: 0x3e79, 0x67e: 0x3e69, 0x67f: 0x3e81, + // Block 0x1a, offset 0x680 + 0x680: 0x4993, 0x681: 0x4999, 0x682: 0x3f89, 0x683: 0x3f99, 0x684: 0x3f91, 0x685: 0x3fa1, + 0x688: 0x491b, 0x689: 0x4921, 0x68a: 0x3e89, 0x68b: 0x3e99, + 0x68c: 0x3e91, 0x68d: 0x3ea1, 0x690: 0x49a5, 0x691: 0x49ab, + 0x692: 0x3fc1, 0x693: 0x3fd9, 0x694: 0x3fc9, 0x695: 0x3fe1, 0x696: 0x3fd1, 0x697: 0x3fe9, + 0x699: 0x4927, 0x69b: 0x3ea9, 0x69d: 0x3eb1, + 0x69f: 0x3eb9, 0x6a0: 0x49bd, 0x6a1: 0x49c3, 0x6a2: 0x4abf, 0x6a3: 0x4ad7, + 0x6a4: 0x4ac7, 0x6a5: 0x4adf, 0x6a6: 0x4acf, 0x6a7: 0x4ae7, 0x6a8: 0x492d, 0x6a9: 0x4933, + 0x6aa: 0x4a2f, 0x6ab: 0x4a47, 0x6ac: 0x4a37, 0x6ad: 0x4a4f, 0x6ae: 0x4a3f, 0x6af: 0x4a57, + 0x6b0: 0x4939, 0x6b1: 0x445f, 0x6b2: 0x37d2, 0x6b3: 0x4465, 0x6b4: 0x4963, 0x6b5: 0x446b, + 0x6b6: 0x37e4, 0x6b7: 0x4471, 0x6b8: 0x3802, 0x6b9: 0x4477, 0x6ba: 0x381a, 0x6bb: 0x447d, + 0x6bc: 0x49b1, 0x6bd: 0x4483, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3ee1, 0x6c1: 0x3ee9, 0x6c2: 0x42c5, 0x6c3: 0x42e3, 0x6c4: 0x42cf, 0x6c5: 0x42ed, + 0x6c6: 0x42d9, 0x6c7: 0x42f7, 0x6c8: 0x3e19, 0x6c9: 0x3e21, 0x6ca: 0x4211, 0x6cb: 0x422f, + 0x6cc: 0x421b, 0x6cd: 0x4239, 0x6ce: 0x4225, 0x6cf: 0x4243, 0x6d0: 0x3f29, 0x6d1: 0x3f31, + 0x6d2: 0x4301, 0x6d3: 0x431f, 0x6d4: 0x430b, 0x6d5: 0x4329, 0x6d6: 0x4315, 0x6d7: 0x4333, + 0x6d8: 0x3e49, 0x6d9: 0x3e51, 0x6da: 0x424d, 0x6db: 0x426b, 0x6dc: 0x4257, 0x6dd: 0x4275, + 0x6de: 0x4261, 0x6df: 0x427f, 0x6e0: 0x4001, 0x6e1: 0x4009, 0x6e2: 0x433d, 0x6e3: 0x435b, + 0x6e4: 0x4347, 0x6e5: 0x4365, 0x6e6: 0x4351, 0x6e7: 0x436f, 0x6e8: 0x3ec1, 0x6e9: 0x3ec9, + 0x6ea: 0x4289, 0x6eb: 0x42a7, 0x6ec: 0x4293, 0x6ed: 0x42b1, 0x6ee: 0x429d, 0x6ef: 0x42bb, + 0x6f0: 0x37c6, 0x6f1: 0x37c0, 0x6f2: 0x3ed1, 0x6f3: 0x37cc, 0x6f4: 0x3ed9, + 0x6f6: 0x4951, 0x6f7: 0x3ef1, 0x6f8: 0x3736, 0x6f9: 0x3730, 0x6fa: 0x3724, 0x6fb: 0x442f, + 0x6fc: 0x373c, 0x6fd: 0x43c8, 0x6fe: 0x0257, 0x6ff: 0x43c8, + // Block 0x1c, offset 0x700 + 0x700: 0x43e1, 0x701: 0x45c3, 0x702: 0x3f19, 0x703: 0x37de, 0x704: 0x3f21, + 0x706: 0x497b, 0x707: 0x3f39, 0x708: 0x3742, 0x709: 0x4435, 0x70a: 0x374e, 0x70b: 0x443b, + 0x70c: 0x375a, 0x70d: 0x45ca, 0x70e: 0x45d1, 0x70f: 0x45d8, 0x710: 0x37f6, 0x711: 0x37f0, + 0x712: 0x3f41, 0x713: 0x4625, 0x716: 0x37fc, 0x717: 0x3f51, + 0x718: 0x3772, 0x719: 0x376c, 0x71a: 0x3760, 0x71b: 0x4441, 0x71d: 0x45df, + 0x71e: 0x45e6, 0x71f: 0x45ed, 0x720: 0x382c, 0x721: 0x3826, 0x722: 0x3fa9, 0x723: 0x462d, + 0x724: 0x380e, 0x725: 0x3814, 0x726: 0x3832, 0x727: 0x3fb9, 0x728: 0x37a2, 0x729: 0x379c, + 0x72a: 0x3790, 0x72b: 0x444d, 0x72c: 0x378a, 0x72d: 0x45b5, 0x72e: 0x45bc, 0x72f: 0x0081, + 0x732: 0x3ff1, 0x733: 0x3838, 0x734: 0x3ff9, + 0x736: 0x49c9, 0x737: 0x4011, 0x738: 0x377e, 0x739: 0x4447, 0x73a: 0x37ae, 0x73b: 0x4459, + 0x73c: 0x37ba, 0x73d: 0x439b, 0x73e: 0x43cd, + // Block 0x1d, offset 0x740 + 0x740: 0x1d08, 0x741: 0x1d0c, 0x742: 0x0047, 0x743: 0x1d84, 0x745: 0x1d18, + 0x746: 0x1d1c, 0x747: 0x00ef, 0x749: 0x1d88, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00e0, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1abd, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x1acf, 0x761: 0x1cf8, 0x762: 0x1ad8, + 0x764: 0x0075, 0x766: 0x023c, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x4413, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0308, + 0x776: 0x030b, 0x777: 0x030e, 0x778: 0x0311, 0x779: 0x0093, 0x77b: 0x1cc8, + 0x77c: 0x026c, 0x77d: 0x0245, 0x77e: 0x01fd, 0x77f: 0x0224, + // Block 0x1e, offset 0x780 + 0x780: 0x055a, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x235e, 0x791: 0x236a, + 0x792: 0x241e, 0x793: 0x2346, 0x794: 0x23ca, 0x795: 0x2352, 0x796: 0x23d0, 0x797: 0x23e8, + 0x798: 0x23f4, 0x799: 0x2358, 0x79a: 0x23fa, 0x79b: 0x2364, 0x79c: 0x23ee, 0x79d: 0x2400, + 0x79e: 0x2406, 0x79f: 0x1dec, 0x7a0: 0x0053, 0x7a1: 0x1a87, 0x7a2: 0x1cd4, 0x7a3: 0x1a90, + 0x7a4: 0x006d, 0x7a5: 0x1adb, 0x7a6: 0x1d00, 0x7a7: 0x1e78, 0x7a8: 0x1a93, 0x7a9: 0x0071, + 0x7aa: 0x1ae7, 0x7ab: 0x1d04, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x1b14, 0x7b2: 0x1d48, 0x7b3: 0x1b1d, 0x7b4: 0x00ad, 0x7b5: 0x1b92, + 0x7b6: 0x1d7c, 0x7b7: 0x1e8c, 0x7b8: 0x1b20, 0x7b9: 0x00b1, 0x7ba: 0x1b95, 0x7bb: 0x1d80, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3d47, 0x7c3: 0xa000, 0x7c4: 0x3d4e, 0x7c5: 0xa000, + 0x7c7: 0x3d55, 0x7c8: 0xa000, 0x7c9: 0x3d5c, + 0x7cd: 0xa000, + 0x7e0: 0x30a6, 0x7e1: 0xa000, 0x7e2: 0x3d6a, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3d63, 0x7ee: 0x30a1, 0x7ef: 0x30ab, + 0x7f0: 0x3d71, 0x7f1: 0x3d78, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3d7f, 0x7f5: 0x3d86, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3d8d, 0x7f9: 0x3d94, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3d9b, 0x801: 0x3da2, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3db7, 0x805: 0x3dbe, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3dc5, 0x809: 0x3dcc, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3de1, 0x82d: 0x3de8, 0x82e: 0x3def, 0x82f: 0x3df6, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x19af, + 0x86a: 0x19b2, 0x86b: 0x19b5, 0x86c: 0x19b8, 0x86d: 0x19bb, 0x86e: 0x19be, 0x86f: 0x19c1, + 0x870: 0x19c4, 0x871: 0x19c7, 0x872: 0x19ca, 0x873: 0x19d3, 0x874: 0x1b98, 0x875: 0x1b9c, + 0x876: 0x1ba0, 0x877: 0x1ba4, 0x878: 0x1ba8, 0x879: 0x1bac, 0x87a: 0x1bb0, 0x87b: 0x1bb4, + 0x87c: 0x1bb8, 0x87d: 0x1db0, 0x87e: 0x1db5, 0x87f: 0x1dba, + // Block 0x22, offset 0x880 + 0x880: 0x1dbf, 0x881: 0x1dc4, 0x882: 0x1dc9, 0x883: 0x1dce, 0x884: 0x1dd3, 0x885: 0x1dd8, + 0x886: 0x1ddd, 0x887: 0x1de2, 0x888: 0x19ac, 0x889: 0x19d0, 0x88a: 0x19f4, 0x88b: 0x1a18, + 0x88c: 0x1a3c, 0x88d: 0x1a45, 0x88e: 0x1a4b, 0x88f: 0x1a51, 0x890: 0x1a57, 0x891: 0x1c90, + 0x892: 0x1c94, 0x893: 0x1c98, 0x894: 0x1c9c, 0x895: 0x1ca0, 0x896: 0x1ca4, 0x897: 0x1ca8, + 0x898: 0x1cac, 0x899: 0x1cb0, 0x89a: 0x1cb4, 0x89b: 0x1cb8, 0x89c: 0x1c24, 0x89d: 0x1c28, + 0x89e: 0x1c2c, 0x89f: 0x1c30, 0x8a0: 0x1c34, 0x8a1: 0x1c38, 0x8a2: 0x1c3c, 0x8a3: 0x1c40, + 0x8a4: 0x1c44, 0x8a5: 0x1c48, 0x8a6: 0x1c4c, 0x8a7: 0x1c50, 0x8a8: 0x1c54, 0x8a9: 0x1c58, + 0x8aa: 0x1c5c, 0x8ab: 0x1c60, 0x8ac: 0x1c64, 0x8ad: 0x1c68, 0x8ae: 0x1c6c, 0x8af: 0x1c70, + 0x8b0: 0x1c74, 0x8b1: 0x1c78, 0x8b2: 0x1c7c, 0x8b3: 0x1c80, 0x8b4: 0x1c84, 0x8b5: 0x1c88, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x07ba, 0x8c1: 0x07de, 0x8c2: 0x07ea, 0x8c3: 0x07fa, 0x8c4: 0x0802, 0x8c5: 0x080e, + 0x8c6: 0x0816, 0x8c7: 0x081e, 0x8c8: 0x082a, 0x8c9: 0x087e, 0x8ca: 0x0896, 0x8cb: 0x08a6, + 0x8cc: 0x08b6, 0x8cd: 0x08c6, 0x8ce: 0x08d6, 0x8cf: 0x08f6, 0x8d0: 0x08fa, 0x8d1: 0x08fe, + 0x8d2: 0x0932, 0x8d3: 0x095a, 0x8d4: 0x096a, 0x8d5: 0x0972, 0x8d6: 0x0976, 0x8d7: 0x0982, + 0x8d8: 0x099e, 0x8d9: 0x09a2, 0x8da: 0x09ba, 0x8db: 0x09be, 0x8dc: 0x09c6, 0x8dd: 0x09d6, + 0x8de: 0x0a72, 0x8df: 0x0a86, 0x8e0: 0x0ac6, 0x8e1: 0x0ada, 0x8e2: 0x0ae2, 0x8e3: 0x0ae6, + 0x8e4: 0x0af6, 0x8e5: 0x0b12, 0x8e6: 0x0b3e, 0x8e7: 0x0b4a, 0x8e8: 0x0b6a, 0x8e9: 0x0b76, + 0x8ea: 0x0b7a, 0x8eb: 0x0b7e, 0x8ec: 0x0b96, 0x8ed: 0x0b9a, 0x8ee: 0x0bc6, 0x8ef: 0x0bd2, + 0x8f0: 0x0bda, 0x8f1: 0x0be2, 0x8f2: 0x0bf2, 0x8f3: 0x0bfa, 0x8f4: 0x0c02, 0x8f5: 0x0c2e, + 0x8f6: 0x0c32, 0x8f7: 0x0c3a, 0x8f8: 0x0c3e, 0x8f9: 0x0c46, 0x8fa: 0x0c4e, 0x8fb: 0x0c5e, + 0x8fc: 0x0c7a, 0x8fd: 0x0cf2, 0x8fe: 0x0d06, 0x8ff: 0x0d0a, + // Block 0x24, offset 0x900 + 0x900: 0x0d8a, 0x901: 0x0d8e, 0x902: 0x0da2, 0x903: 0x0da6, 0x904: 0x0dae, 0x905: 0x0db6, + 0x906: 0x0dbe, 0x907: 0x0dca, 0x908: 0x0df2, 0x909: 0x0e02, 0x90a: 0x0e16, 0x90b: 0x0e86, + 0x90c: 0x0e92, 0x90d: 0x0ea2, 0x90e: 0x0eae, 0x90f: 0x0eba, 0x910: 0x0ec2, 0x911: 0x0ec6, + 0x912: 0x0eca, 0x913: 0x0ece, 0x914: 0x0ed2, 0x915: 0x0f8a, 0x916: 0x0fd2, 0x917: 0x0fde, + 0x918: 0x0fe2, 0x919: 0x0fe6, 0x91a: 0x0fea, 0x91b: 0x0ff2, 0x91c: 0x0ff6, 0x91d: 0x100a, + 0x91e: 0x1026, 0x91f: 0x102e, 0x920: 0x106e, 0x921: 0x1072, 0x922: 0x107a, 0x923: 0x107e, + 0x924: 0x1086, 0x925: 0x108a, 0x926: 0x10ae, 0x927: 0x10b2, 0x928: 0x10ce, 0x929: 0x10d2, + 0x92a: 0x10d6, 0x92b: 0x10da, 0x92c: 0x10ee, 0x92d: 0x1112, 0x92e: 0x1116, 0x92f: 0x111a, + 0x930: 0x113e, 0x931: 0x117e, 0x932: 0x1182, 0x933: 0x11a2, 0x934: 0x11b2, 0x935: 0x11ba, + 0x936: 0x11da, 0x937: 0x11fe, 0x938: 0x1242, 0x939: 0x124a, 0x93a: 0x125e, 0x93b: 0x126a, + 0x93c: 0x1272, 0x93d: 0x127a, 0x93e: 0x127e, 0x93f: 0x1282, + // Block 0x25, offset 0x940 + 0x940: 0x129a, 0x941: 0x129e, 0x942: 0x12ba, 0x943: 0x12c2, 0x944: 0x12ca, 0x945: 0x12ce, + 0x946: 0x12da, 0x947: 0x12e2, 0x948: 0x12e6, 0x949: 0x12ea, 0x94a: 0x12f2, 0x94b: 0x12f6, + 0x94c: 0x1396, 0x94d: 0x13aa, 0x94e: 0x13de, 0x94f: 0x13e2, 0x950: 0x13ea, 0x951: 0x1416, + 0x952: 0x141e, 0x953: 0x1426, 0x954: 0x142e, 0x955: 0x146a, 0x956: 0x146e, 0x957: 0x1476, + 0x958: 0x147a, 0x959: 0x147e, 0x95a: 0x14aa, 0x95b: 0x14ae, 0x95c: 0x14b6, 0x95d: 0x14ca, + 0x95e: 0x14ce, 0x95f: 0x14ea, 0x960: 0x14f2, 0x961: 0x14f6, 0x962: 0x151a, 0x963: 0x153a, + 0x964: 0x154e, 0x965: 0x1552, 0x966: 0x155a, 0x967: 0x1586, 0x968: 0x158a, 0x969: 0x159a, + 0x96a: 0x15be, 0x96b: 0x15ca, 0x96c: 0x15da, 0x96d: 0x15f2, 0x96e: 0x15fa, 0x96f: 0x15fe, + 0x970: 0x1602, 0x971: 0x1606, 0x972: 0x1612, 0x973: 0x1616, 0x974: 0x161e, 0x975: 0x163a, + 0x976: 0x163e, 0x977: 0x1642, 0x978: 0x165a, 0x979: 0x165e, 0x97a: 0x1666, 0x97b: 0x167a, + 0x97c: 0x167e, 0x97d: 0x1682, 0x97e: 0x168a, 0x97f: 0x168e, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x4049, 0x98d: 0xa000, 0x98e: 0x4051, 0x98f: 0xa000, 0x990: 0x4059, 0x991: 0xa000, + 0x992: 0x4061, 0x993: 0xa000, 0x994: 0x4069, 0x995: 0xa000, 0x996: 0x4071, 0x997: 0xa000, + 0x998: 0x4079, 0x999: 0xa000, 0x99a: 0x4081, 0x99b: 0xa000, 0x99c: 0x4089, 0x99d: 0xa000, + 0x99e: 0x4091, 0x99f: 0xa000, 0x9a0: 0x4099, 0x9a1: 0xa000, 0x9a2: 0x40a1, + 0x9a4: 0xa000, 0x9a5: 0x40a9, 0x9a6: 0xa000, 0x9a7: 0x40b1, 0x9a8: 0xa000, 0x9a9: 0x40b9, + 0x9af: 0xa000, + 0x9b0: 0x40c1, 0x9b1: 0x40c9, 0x9b2: 0xa000, 0x9b3: 0x40d1, 0x9b4: 0x40d9, 0x9b5: 0xa000, + 0x9b6: 0x40e1, 0x9b7: 0x40e9, 0x9b8: 0xa000, 0x9b9: 0x40f1, 0x9ba: 0x40f9, 0x9bb: 0xa000, + 0x9bc: 0x4101, 0x9bd: 0x4109, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x4041, + 0x9d9: 0x9904, 0x9da: 0x9904, 0x9db: 0x441d, 0x9dc: 0x4423, 0x9dd: 0xa000, + 0x9de: 0x4111, 0x9df: 0x27e4, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x4121, 0x9ed: 0xa000, 0x9ee: 0x4129, 0x9ef: 0xa000, + 0x9f0: 0x4131, 0x9f1: 0xa000, 0x9f2: 0x4139, 0x9f3: 0xa000, 0x9f4: 0x4141, 0x9f5: 0xa000, + 0x9f6: 0x4149, 0x9f7: 0xa000, 0x9f8: 0x4151, 0x9f9: 0xa000, 0x9fa: 0x4159, 0x9fb: 0xa000, + 0x9fc: 0x4161, 0x9fd: 0xa000, 0x9fe: 0x4169, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4171, 0xa01: 0xa000, 0xa02: 0x4179, 0xa04: 0xa000, 0xa05: 0x4181, + 0xa06: 0xa000, 0xa07: 0x4189, 0xa08: 0xa000, 0xa09: 0x4191, + 0xa0f: 0xa000, 0xa10: 0x4199, 0xa11: 0x41a1, + 0xa12: 0xa000, 0xa13: 0x41a9, 0xa14: 0x41b1, 0xa15: 0xa000, 0xa16: 0x41b9, 0xa17: 0x41c1, + 0xa18: 0xa000, 0xa19: 0x41c9, 0xa1a: 0x41d1, 0xa1b: 0xa000, 0xa1c: 0x41d9, 0xa1d: 0x41e1, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x4119, + 0xa37: 0x41e9, 0xa38: 0x41f1, 0xa39: 0x41f9, 0xa3a: 0x4201, + 0xa3d: 0xa000, 0xa3e: 0x4209, 0xa3f: 0x27f9, + // Block 0x29, offset 0xa40 + 0xa40: 0x045a, 0xa41: 0x041e, 0xa42: 0x0422, 0xa43: 0x0426, 0xa44: 0x046e, 0xa45: 0x042a, + 0xa46: 0x042e, 0xa47: 0x0432, 0xa48: 0x0436, 0xa49: 0x043a, 0xa4a: 0x043e, 0xa4b: 0x0442, + 0xa4c: 0x0446, 0xa4d: 0x044a, 0xa4e: 0x044e, 0xa4f: 0x4afe, 0xa50: 0x4b04, 0xa51: 0x4b0a, + 0xa52: 0x4b10, 0xa53: 0x4b16, 0xa54: 0x4b1c, 0xa55: 0x4b22, 0xa56: 0x4b28, 0xa57: 0x4b2e, + 0xa58: 0x4b34, 0xa59: 0x4b3a, 0xa5a: 0x4b40, 0xa5b: 0x4b46, 0xa5c: 0x4b4c, 0xa5d: 0x4b52, + 0xa5e: 0x4b58, 0xa5f: 0x4b5e, 0xa60: 0x4b64, 0xa61: 0x4b6a, 0xa62: 0x4b70, 0xa63: 0x4b76, + 0xa64: 0x04b6, 0xa65: 0x0452, 0xa66: 0x0456, 0xa67: 0x04da, 0xa68: 0x04de, 0xa69: 0x04e2, + 0xa6a: 0x04e6, 0xa6b: 0x04ea, 0xa6c: 0x04ee, 0xa6d: 0x04f2, 0xa6e: 0x045e, 0xa6f: 0x04f6, + 0xa70: 0x04fa, 0xa71: 0x0462, 0xa72: 0x0466, 0xa73: 0x046a, 0xa74: 0x0472, 0xa75: 0x0476, + 0xa76: 0x047a, 0xa77: 0x047e, 0xa78: 0x0482, 0xa79: 0x0486, 0xa7a: 0x048a, 0xa7b: 0x048e, + 0xa7c: 0x0492, 0xa7d: 0x0496, 0xa7e: 0x049a, 0xa7f: 0x049e, + // Block 0x2a, offset 0xa80 + 0xa80: 0x04a2, 0xa81: 0x04a6, 0xa82: 0x04fe, 0xa83: 0x0502, 0xa84: 0x04aa, 0xa85: 0x04ae, + 0xa86: 0x04b2, 0xa87: 0x04ba, 0xa88: 0x04be, 0xa89: 0x04c2, 0xa8a: 0x04c6, 0xa8b: 0x04ca, + 0xa8c: 0x04ce, 0xa8d: 0x04d2, 0xa8e: 0x04d6, + 0xa92: 0x07ba, 0xa93: 0x0816, 0xa94: 0x07c6, 0xa95: 0x0a76, 0xa96: 0x07ca, 0xa97: 0x07e2, + 0xa98: 0x07ce, 0xa99: 0x108e, 0xa9a: 0x0802, 0xa9b: 0x07d6, 0xa9c: 0x07be, 0xa9d: 0x0afa, + 0xa9e: 0x0a8a, 0xa9f: 0x082a, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2184, 0xac1: 0x218a, 0xac2: 0x2190, 0xac3: 0x2196, 0xac4: 0x219c, 0xac5: 0x21a2, + 0xac6: 0x21a8, 0xac7: 0x21ae, 0xac8: 0x21b4, 0xac9: 0x21ba, 0xaca: 0x21c0, 0xacb: 0x21c6, + 0xacc: 0x21cc, 0xacd: 0x21d2, 0xace: 0x285d, 0xacf: 0x2866, 0xad0: 0x286f, 0xad1: 0x2878, + 0xad2: 0x2881, 0xad3: 0x288a, 0xad4: 0x2893, 0xad5: 0x289c, 0xad6: 0x28a5, 0xad7: 0x28b7, + 0xad8: 0x28c0, 0xad9: 0x28c9, 0xada: 0x28d2, 0xadb: 0x28db, 0xadc: 0x28ae, 0xadd: 0x2ce3, + 0xade: 0x2c24, 0xae0: 0x21d8, 0xae1: 0x21f0, 0xae2: 0x21e4, 0xae3: 0x2238, + 0xae4: 0x21f6, 0xae5: 0x2214, 0xae6: 0x21de, 0xae7: 0x220e, 0xae8: 0x21ea, 0xae9: 0x2220, + 0xaea: 0x2250, 0xaeb: 0x226e, 0xaec: 0x2268, 0xaed: 0x225c, 0xaee: 0x22aa, 0xaef: 0x223e, + 0xaf0: 0x224a, 0xaf1: 0x2262, 0xaf2: 0x2256, 0xaf3: 0x2280, 0xaf4: 0x222c, 0xaf5: 0x2274, + 0xaf6: 0x229e, 0xaf7: 0x2286, 0xaf8: 0x221a, 0xaf9: 0x21fc, 0xafa: 0x2232, 0xafb: 0x2244, + 0xafc: 0x227a, 0xafd: 0x2202, 0xafe: 0x22a4, 0xaff: 0x2226, + // Block 0x2c, offset 0xb00 + 0xb00: 0x228c, 0xb01: 0x2208, 0xb02: 0x2292, 0xb03: 0x2298, 0xb04: 0x0a2a, 0xb05: 0x0bfe, + 0xb06: 0x0da2, 0xb07: 0x11c2, + 0xb10: 0x1cf4, 0xb11: 0x19d6, + 0xb12: 0x19d9, 0xb13: 0x19dc, 0xb14: 0x19df, 0xb15: 0x19e2, 0xb16: 0x19e5, 0xb17: 0x19e8, + 0xb18: 0x19eb, 0xb19: 0x19ee, 0xb1a: 0x19f7, 0xb1b: 0x19fa, 0xb1c: 0x19fd, 0xb1d: 0x1a00, + 0xb1e: 0x1a03, 0xb1f: 0x1a06, 0xb20: 0x0406, 0xb21: 0x040e, 0xb22: 0x0412, 0xb23: 0x041a, + 0xb24: 0x041e, 0xb25: 0x0422, 0xb26: 0x042a, 0xb27: 0x0432, 0xb28: 0x0436, 0xb29: 0x043e, + 0xb2a: 0x0442, 0xb2b: 0x0446, 0xb2c: 0x044a, 0xb2d: 0x044e, 0xb2e: 0x2f59, 0xb2f: 0x2f61, + 0xb30: 0x2f69, 0xb31: 0x2f71, 0xb32: 0x2f79, 0xb33: 0x2f81, 0xb34: 0x2f89, 0xb35: 0x2f91, + 0xb36: 0x2fa1, 0xb37: 0x2fa9, 0xb38: 0x2fb1, 0xb39: 0x2fb9, 0xb3a: 0x2fc1, 0xb3b: 0x2fc9, + 0xb3c: 0x3014, 0xb3d: 0x2fdc, 0xb3e: 0x2f99, + // Block 0x2d, offset 0xb40 + 0xb40: 0x07ba, 0xb41: 0x0816, 0xb42: 0x07c6, 0xb43: 0x0a76, 0xb44: 0x081a, 0xb45: 0x08aa, + 0xb46: 0x07c2, 0xb47: 0x08a6, 0xb48: 0x0806, 0xb49: 0x0982, 0xb4a: 0x0e02, 0xb4b: 0x0f8a, + 0xb4c: 0x0ed2, 0xb4d: 0x0e16, 0xb4e: 0x155a, 0xb4f: 0x0a86, 0xb50: 0x0dca, 0xb51: 0x0e46, + 0xb52: 0x0e06, 0xb53: 0x1146, 0xb54: 0x09f6, 0xb55: 0x0ffe, 0xb56: 0x1482, 0xb57: 0x115a, + 0xb58: 0x093e, 0xb59: 0x118a, 0xb5a: 0x1096, 0xb5b: 0x0b12, 0xb5c: 0x150a, 0xb5d: 0x087a, + 0xb5e: 0x09a6, 0xb5f: 0x0ef2, 0xb60: 0x1622, 0xb61: 0x083e, 0xb62: 0x08ce, 0xb63: 0x0e96, + 0xb64: 0x07ca, 0xb65: 0x07e2, 0xb66: 0x07ce, 0xb67: 0x0bd6, 0xb68: 0x09ea, 0xb69: 0x097a, + 0xb6a: 0x0b52, 0xb6b: 0x0b46, 0xb6c: 0x10e6, 0xb6d: 0x083a, 0xb6e: 0x1496, 0xb6f: 0x0996, + 0xb70: 0x0aee, 0xb71: 0x1a09, 0xb72: 0x1a0c, 0xb73: 0x1a0f, 0xb74: 0x1a12, 0xb75: 0x1a1b, + 0xb76: 0x1a1e, 0xb77: 0x1a21, 0xb78: 0x1a24, 0xb79: 0x1a27, 0xb7a: 0x1a2a, 0xb7b: 0x1a2d, + 0xb7c: 0x1a30, 0xb7d: 0x1a33, 0xb7e: 0x1a36, 0xb7f: 0x1a3f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1df6, 0xb81: 0x1e05, 0xb82: 0x1e14, 0xb83: 0x1e23, 0xb84: 0x1e32, 0xb85: 0x1e41, + 0xb86: 0x1e50, 0xb87: 0x1e5f, 0xb88: 0x1e6e, 0xb89: 0x22bc, 0xb8a: 0x22ce, 0xb8b: 0x22e0, + 0xb8c: 0x1a81, 0xb8d: 0x1d34, 0xb8e: 0x1b02, 0xb8f: 0x1cd8, 0xb90: 0x05c6, 0xb91: 0x05ce, + 0xb92: 0x05d6, 0xb93: 0x05de, 0xb94: 0x05e6, 0xb95: 0x05ea, 0xb96: 0x05ee, 0xb97: 0x05f2, + 0xb98: 0x05f6, 0xb99: 0x05fa, 0xb9a: 0x05fe, 0xb9b: 0x0602, 0xb9c: 0x0606, 0xb9d: 0x060a, + 0xb9e: 0x060e, 0xb9f: 0x0612, 0xba0: 0x0616, 0xba1: 0x061e, 0xba2: 0x0622, 0xba3: 0x0626, + 0xba4: 0x062a, 0xba5: 0x062e, 0xba6: 0x0632, 0xba7: 0x0636, 0xba8: 0x063a, 0xba9: 0x063e, + 0xbaa: 0x0642, 0xbab: 0x0646, 0xbac: 0x064a, 0xbad: 0x064e, 0xbae: 0x0652, 0xbaf: 0x0656, + 0xbb0: 0x065a, 0xbb1: 0x065e, 0xbb2: 0x0662, 0xbb3: 0x066a, 0xbb4: 0x0672, 0xbb5: 0x067a, + 0xbb6: 0x067e, 0xbb7: 0x0682, 0xbb8: 0x0686, 0xbb9: 0x068a, 0xbba: 0x068e, 0xbbb: 0x0692, + 0xbbc: 0x0696, 0xbbd: 0x069a, 0xbbe: 0x069e, 0xbbf: 0x282a, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2c43, 0xbc1: 0x2adf, 0xbc2: 0x2c53, 0xbc3: 0x29b7, 0xbc4: 0x3025, 0xbc5: 0x29c1, + 0xbc6: 0x29cb, 0xbc7: 0x3069, 0xbc8: 0x2aec, 0xbc9: 0x29d5, 0xbca: 0x29df, 0xbcb: 0x29e9, + 0xbcc: 0x2b13, 0xbcd: 0x2b20, 0xbce: 0x2af9, 0xbcf: 0x2b06, 0xbd0: 0x2fea, 0xbd1: 0x2b2d, + 0xbd2: 0x2b3a, 0xbd3: 0x2cf5, 0xbd4: 0x27eb, 0xbd5: 0x2d08, 0xbd6: 0x2d1b, 0xbd7: 0x2c63, + 0xbd8: 0x2b47, 0xbd9: 0x2d2e, 0xbda: 0x2d41, 0xbdb: 0x2b54, 0xbdc: 0x29f3, 0xbdd: 0x29fd, + 0xbde: 0x2ff8, 0xbdf: 0x2b61, 0xbe0: 0x2c73, 0xbe1: 0x3036, 0xbe2: 0x2a07, 0xbe3: 0x2a11, + 0xbe4: 0x2b6e, 0xbe5: 0x2a1b, 0xbe6: 0x2a25, 0xbe7: 0x2800, 0xbe8: 0x2807, 0xbe9: 0x2a2f, + 0xbea: 0x2a39, 0xbeb: 0x2d54, 0xbec: 0x2b7b, 0xbed: 0x2c83, 0xbee: 0x2d67, 0xbef: 0x2b88, + 0xbf0: 0x2a4d, 0xbf1: 0x2a43, 0xbf2: 0x307d, 0xbf3: 0x2b95, 0xbf4: 0x2d7a, 0xbf5: 0x2a57, + 0xbf6: 0x2c93, 0xbf7: 0x2a61, 0xbf8: 0x2baf, 0xbf9: 0x2a6b, 0xbfa: 0x2bbc, 0xbfb: 0x3047, + 0xbfc: 0x2ba2, 0xbfd: 0x2ca3, 0xbfe: 0x2bc9, 0xbff: 0x280e, + // Block 0x30, offset 0xc00 + 0xc00: 0x3058, 0xc01: 0x2a75, 0xc02: 0x2a7f, 0xc03: 0x2bd6, 0xc04: 0x2a89, 0xc05: 0x2a93, + 0xc06: 0x2a9d, 0xc07: 0x2cb3, 0xc08: 0x2be3, 0xc09: 0x2815, 0xc0a: 0x2d8d, 0xc0b: 0x2fd1, + 0xc0c: 0x2cc3, 0xc0d: 0x2bf0, 0xc0e: 0x3006, 0xc0f: 0x2aa7, 0xc10: 0x2ab1, 0xc11: 0x2bfd, + 0xc12: 0x281c, 0xc13: 0x2c0a, 0xc14: 0x2cd3, 0xc15: 0x2823, 0xc16: 0x2da0, 0xc17: 0x2abb, + 0xc18: 0x1de7, 0xc19: 0x1dfb, 0xc1a: 0x1e0a, 0xc1b: 0x1e19, 0xc1c: 0x1e28, 0xc1d: 0x1e37, + 0xc1e: 0x1e46, 0xc1f: 0x1e55, 0xc20: 0x1e64, 0xc21: 0x1e73, 0xc22: 0x22c2, 0xc23: 0x22d4, + 0xc24: 0x22e6, 0xc25: 0x22f2, 0xc26: 0x22fe, 0xc27: 0x230a, 0xc28: 0x2316, 0xc29: 0x2322, + 0xc2a: 0x232e, 0xc2b: 0x233a, 0xc2c: 0x2376, 0xc2d: 0x2382, 0xc2e: 0x238e, 0xc2f: 0x239a, + 0xc30: 0x23a6, 0xc31: 0x1d44, 0xc32: 0x1af6, 0xc33: 0x1a63, 0xc34: 0x1d14, 0xc35: 0x1b77, + 0xc36: 0x1b86, 0xc37: 0x1afc, 0xc38: 0x1d2c, 0xc39: 0x1d30, 0xc3a: 0x1a8d, 0xc3b: 0x2838, + 0xc3c: 0x2846, 0xc3d: 0x2831, 0xc3e: 0x283f, 0xc3f: 0x2c17, + // Block 0x31, offset 0xc40 + 0xc40: 0x1b7a, 0xc41: 0x1b62, 0xc42: 0x1d90, 0xc43: 0x1b4a, 0xc44: 0x1b23, 0xc45: 0x1a96, + 0xc46: 0x1aa5, 0xc47: 0x1a75, 0xc48: 0x1d20, 0xc49: 0x1e82, 0xc4a: 0x1b7d, 0xc4b: 0x1b65, + 0xc4c: 0x1d94, 0xc4d: 0x1da0, 0xc4e: 0x1b56, 0xc4f: 0x1b2c, 0xc50: 0x1a84, 0xc51: 0x1d4c, + 0xc52: 0x1ce0, 0xc53: 0x1ccc, 0xc54: 0x1cfc, 0xc55: 0x1da4, 0xc56: 0x1b59, 0xc57: 0x1af9, + 0xc58: 0x1b2f, 0xc59: 0x1b0e, 0xc5a: 0x1b71, 0xc5b: 0x1da8, 0xc5c: 0x1b5c, 0xc5d: 0x1af0, + 0xc5e: 0x1b32, 0xc5f: 0x1d6c, 0xc60: 0x1d24, 0xc61: 0x1b44, 0xc62: 0x1d54, 0xc63: 0x1d70, + 0xc64: 0x1d28, 0xc65: 0x1b47, 0xc66: 0x1d58, 0xc67: 0x2418, 0xc68: 0x242c, 0xc69: 0x1ac6, + 0xc6a: 0x1d50, 0xc6b: 0x1ce4, 0xc6c: 0x1cd0, 0xc6d: 0x1d78, 0xc6e: 0x284d, 0xc6f: 0x28e4, + 0xc70: 0x1b89, 0xc71: 0x1b74, 0xc72: 0x1dac, 0xc73: 0x1b5f, 0xc74: 0x1b80, 0xc75: 0x1b68, + 0xc76: 0x1d98, 0xc77: 0x1b4d, 0xc78: 0x1b26, 0xc79: 0x1ab1, 0xc7a: 0x1b83, 0xc7b: 0x1b6b, + 0xc7c: 0x1d9c, 0xc7d: 0x1b50, 0xc7e: 0x1b29, 0xc7f: 0x1ab4, + // Block 0x32, offset 0xc80 + 0xc80: 0x1d5c, 0xc81: 0x1ce8, 0xc82: 0x1e7d, 0xc83: 0x1a66, 0xc84: 0x1aea, 0xc85: 0x1aed, + 0xc86: 0x2425, 0xc87: 0x1cc4, 0xc88: 0x1af3, 0xc89: 0x1a78, 0xc8a: 0x1b11, 0xc8b: 0x1a7b, + 0xc8c: 0x1b1a, 0xc8d: 0x1a99, 0xc8e: 0x1a9c, 0xc8f: 0x1b35, 0xc90: 0x1b3b, 0xc91: 0x1b3e, + 0xc92: 0x1d60, 0xc93: 0x1b41, 0xc94: 0x1b53, 0xc95: 0x1d68, 0xc96: 0x1d74, 0xc97: 0x1ac0, + 0xc98: 0x1e87, 0xc99: 0x1cec, 0xc9a: 0x1ac3, 0xc9b: 0x1b8c, 0xc9c: 0x1ad5, 0xc9d: 0x1ae4, + 0xc9e: 0x2412, 0xc9f: 0x240c, 0xca0: 0x1df1, 0xca1: 0x1e00, 0xca2: 0x1e0f, 0xca3: 0x1e1e, + 0xca4: 0x1e2d, 0xca5: 0x1e3c, 0xca6: 0x1e4b, 0xca7: 0x1e5a, 0xca8: 0x1e69, 0xca9: 0x22b6, + 0xcaa: 0x22c8, 0xcab: 0x22da, 0xcac: 0x22ec, 0xcad: 0x22f8, 0xcae: 0x2304, 0xcaf: 0x2310, + 0xcb0: 0x231c, 0xcb1: 0x2328, 0xcb2: 0x2334, 0xcb3: 0x2370, 0xcb4: 0x237c, 0xcb5: 0x2388, + 0xcb6: 0x2394, 0xcb7: 0x23a0, 0xcb8: 0x23ac, 0xcb9: 0x23b2, 0xcba: 0x23b8, 0xcbb: 0x23be, + 0xcbc: 0x23c4, 0xcbd: 0x23d6, 0xcbe: 0x23dc, 0xcbf: 0x1d40, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1472, 0xcc1: 0x0df6, 0xcc2: 0x14ce, 0xcc3: 0x149a, 0xcc4: 0x0f52, 0xcc5: 0x07e6, + 0xcc6: 0x09da, 0xcc7: 0x1726, 0xcc8: 0x1726, 0xcc9: 0x0b06, 0xcca: 0x155a, 0xccb: 0x0a3e, + 0xccc: 0x0b02, 0xccd: 0x0cea, 0xcce: 0x10ca, 0xccf: 0x125a, 0xcd0: 0x1392, 0xcd1: 0x13ce, + 0xcd2: 0x1402, 0xcd3: 0x1516, 0xcd4: 0x0e6e, 0xcd5: 0x0efa, 0xcd6: 0x0fa6, 0xcd7: 0x103e, + 0xcd8: 0x135a, 0xcd9: 0x1542, 0xcda: 0x166e, 0xcdb: 0x080a, 0xcdc: 0x09ae, 0xcdd: 0x0e82, + 0xcde: 0x0fca, 0xcdf: 0x138e, 0xce0: 0x16be, 0xce1: 0x0bae, 0xce2: 0x0f72, 0xce3: 0x137e, + 0xce4: 0x1412, 0xce5: 0x0d1e, 0xce6: 0x12b6, 0xce7: 0x13da, 0xce8: 0x0c1a, 0xce9: 0x0e0a, + 0xcea: 0x0f12, 0xceb: 0x1016, 0xcec: 0x1522, 0xced: 0x084a, 0xcee: 0x08e2, 0xcef: 0x094e, + 0xcf0: 0x0d86, 0xcf1: 0x0e7a, 0xcf2: 0x0fc6, 0xcf3: 0x10ea, 0xcf4: 0x1272, 0xcf5: 0x1386, + 0xcf6: 0x139e, 0xcf7: 0x14c2, 0xcf8: 0x15ea, 0xcf9: 0x169e, 0xcfa: 0x16ba, 0xcfb: 0x1126, + 0xcfc: 0x1166, 0xcfd: 0x121e, 0xcfe: 0x133e, 0xcff: 0x1576, + // Block 0x34, offset 0xd00 + 0xd00: 0x16c6, 0xd01: 0x1446, 0xd02: 0x0ac2, 0xd03: 0x0c36, 0xd04: 0x11d6, 0xd05: 0x1296, + 0xd06: 0x0ffa, 0xd07: 0x112e, 0xd08: 0x1492, 0xd09: 0x15e2, 0xd0a: 0x0abe, 0xd0b: 0x0b8a, + 0xd0c: 0x0e72, 0xd0d: 0x0f26, 0xd0e: 0x0f5a, 0xd0f: 0x120e, 0xd10: 0x1236, 0xd11: 0x15a2, + 0xd12: 0x094a, 0xd13: 0x12a2, 0xd14: 0x08ee, 0xd15: 0x08ea, 0xd16: 0x1192, 0xd17: 0x1222, + 0xd18: 0x1356, 0xd19: 0x15aa, 0xd1a: 0x1462, 0xd1b: 0x0d22, 0xd1c: 0x0e6e, 0xd1d: 0x1452, + 0xd1e: 0x07f2, 0xd1f: 0x0b5e, 0xd20: 0x0c8e, 0xd21: 0x102a, 0xd22: 0x10aa, 0xd23: 0x096e, + 0xd24: 0x1136, 0xd25: 0x085a, 0xd26: 0x0c72, 0xd27: 0x07d2, 0xd28: 0x0ee6, 0xd29: 0x0d9e, + 0xd2a: 0x120a, 0xd2b: 0x09c2, 0xd2c: 0x0aae, 0xd2d: 0x10f6, 0xd2e: 0x135e, 0xd2f: 0x1436, + 0xd30: 0x0eb2, 0xd31: 0x14f2, 0xd32: 0x0ede, 0xd33: 0x0d32, 0xd34: 0x1316, 0xd35: 0x0d52, + 0xd36: 0x10a6, 0xd37: 0x0826, 0xd38: 0x08a2, 0xd39: 0x08e6, 0xd3a: 0x0e4e, 0xd3b: 0x11f6, + 0xd3c: 0x12ee, 0xd3d: 0x1442, 0xd3e: 0x1556, 0xd3f: 0x0956, + // Block 0x35, offset 0xd40 + 0xd40: 0x0a0a, 0xd41: 0x0b12, 0xd42: 0x0c2a, 0xd43: 0x0dba, 0xd44: 0x0f76, 0xd45: 0x113a, + 0xd46: 0x1592, 0xd47: 0x1676, 0xd48: 0x16ca, 0xd49: 0x16e2, 0xd4a: 0x0932, 0xd4b: 0x0dee, + 0xd4c: 0x0e9e, 0xd4d: 0x14e6, 0xd4e: 0x0bf6, 0xd4f: 0x0cd2, 0xd50: 0x0cee, 0xd51: 0x0d7e, + 0xd52: 0x0f66, 0xd53: 0x0fb2, 0xd54: 0x1062, 0xd55: 0x1186, 0xd56: 0x122a, 0xd57: 0x128e, + 0xd58: 0x14d6, 0xd59: 0x1366, 0xd5a: 0x14fe, 0xd5b: 0x157a, 0xd5c: 0x090a, 0xd5d: 0x0936, + 0xd5e: 0x0a1e, 0xd5f: 0x0fa2, 0xd60: 0x13ee, 0xd61: 0x1436, 0xd62: 0x0c16, 0xd63: 0x0c86, + 0xd64: 0x0d4a, 0xd65: 0x0eaa, 0xd66: 0x11d2, 0xd67: 0x101e, 0xd68: 0x0836, 0xd69: 0x0a7a, + 0xd6a: 0x0b5e, 0xd6b: 0x0bc2, 0xd6c: 0x0c92, 0xd6d: 0x103a, 0xd6e: 0x1056, 0xd6f: 0x1266, + 0xd70: 0x1286, 0xd71: 0x155e, 0xd72: 0x15de, 0xd73: 0x15ee, 0xd74: 0x162a, 0xd75: 0x084e, + 0xd76: 0x117a, 0xd77: 0x154a, 0xd78: 0x15c6, 0xd79: 0x0caa, 0xd7a: 0x0812, 0xd7b: 0x0872, + 0xd7c: 0x0b62, 0xd7d: 0x0b82, 0xd7e: 0x0daa, 0xd7f: 0x0e6e, + // Block 0x36, offset 0xd80 + 0xd80: 0x0fbe, 0xd81: 0x10c6, 0xd82: 0x1372, 0xd83: 0x1512, 0xd84: 0x171e, 0xd85: 0x0dde, + 0xd86: 0x159e, 0xd87: 0x092e, 0xd88: 0x0e2a, 0xd89: 0x0e36, 0xd8a: 0x0f0a, 0xd8b: 0x0f42, + 0xd8c: 0x1046, 0xd8d: 0x10a2, 0xd8e: 0x1122, 0xd8f: 0x1206, 0xd90: 0x1636, 0xd91: 0x08aa, + 0xd92: 0x0cfe, 0xd93: 0x15ae, 0xd94: 0x0862, 0xd95: 0x0ba6, 0xd96: 0x0f2a, 0xd97: 0x14da, + 0xd98: 0x0c62, 0xd99: 0x0cb2, 0xd9a: 0x0e3e, 0xd9b: 0x102a, 0xd9c: 0x15b6, 0xd9d: 0x0912, + 0xd9e: 0x09fa, 0xd9f: 0x0b92, 0xda0: 0x0dce, 0xda1: 0x0e1a, 0xda2: 0x0e5a, 0xda3: 0x0eee, + 0xda4: 0x1042, 0xda5: 0x10b6, 0xda6: 0x1252, 0xda7: 0x13f2, 0xda8: 0x13fe, 0xda9: 0x1552, + 0xdaa: 0x15d2, 0xdab: 0x097e, 0xdac: 0x0f46, 0xdad: 0x09fe, 0xdae: 0x0fc2, 0xdaf: 0x1066, + 0xdb0: 0x1382, 0xdb1: 0x15ba, 0xdb2: 0x16a6, 0xdb3: 0x16ce, 0xdb4: 0x0e32, 0xdb5: 0x0f22, + 0xdb6: 0x12be, 0xdb7: 0x11b2, 0xdb8: 0x11be, 0xdb9: 0x11e2, 0xdba: 0x1012, 0xdbb: 0x0f9a, + 0xdbc: 0x145e, 0xdbd: 0x082e, 0xdbe: 0x1326, 0xdbf: 0x0916, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0906, 0xdc1: 0x0c06, 0xdc2: 0x0d26, 0xdc3: 0x11ee, 0xdc4: 0x0b4e, 0xdc5: 0x0efe, + 0xdc6: 0x0dea, 0xdc7: 0x14e2, 0xdc8: 0x13e2, 0xdc9: 0x15a6, 0xdca: 0x141e, 0xdcb: 0x0c22, + 0xdcc: 0x0882, 0xdcd: 0x0a56, 0xdd0: 0x0aaa, + 0xdd2: 0x0dda, 0xdd5: 0x08f2, 0xdd6: 0x101a, 0xdd7: 0x10de, + 0xdd8: 0x1142, 0xdd9: 0x115e, 0xdda: 0x1162, 0xddb: 0x1176, 0xddc: 0x15f6, 0xddd: 0x11e6, + 0xdde: 0x126a, 0xde0: 0x138a, 0xde2: 0x144e, + 0xde5: 0x1502, 0xde6: 0x152e, + 0xdea: 0x164a, 0xdeb: 0x164e, 0xdec: 0x1652, 0xded: 0x16b6, 0xdee: 0x1526, 0xdef: 0x15c2, + 0xdf0: 0x0852, 0xdf1: 0x0876, 0xdf2: 0x088a, 0xdf3: 0x0946, 0xdf4: 0x0952, 0xdf5: 0x0992, + 0xdf6: 0x0a46, 0xdf7: 0x0a62, 0xdf8: 0x0a6a, 0xdf9: 0x0aa6, 0xdfa: 0x0ab2, 0xdfb: 0x0b8e, + 0xdfc: 0x0b96, 0xdfd: 0x0c9e, 0xdfe: 0x0cc6, 0xdff: 0x0cce, + // Block 0x38, offset 0xe00 + 0xe00: 0x0ce6, 0xe01: 0x0d92, 0xe02: 0x0dc2, 0xe03: 0x0de2, 0xe04: 0x0e52, 0xe05: 0x0f16, + 0xe06: 0x0f32, 0xe07: 0x0f62, 0xe08: 0x0fb6, 0xe09: 0x0fd6, 0xe0a: 0x104a, 0xe0b: 0x112a, + 0xe0c: 0x1146, 0xe0d: 0x114e, 0xe0e: 0x114a, 0xe0f: 0x1152, 0xe10: 0x1156, 0xe11: 0x115a, + 0xe12: 0x116e, 0xe13: 0x1172, 0xe14: 0x1196, 0xe15: 0x11aa, 0xe16: 0x11c6, 0xe17: 0x122a, + 0xe18: 0x1232, 0xe19: 0x123a, 0xe1a: 0x124e, 0xe1b: 0x1276, 0xe1c: 0x12c6, 0xe1d: 0x12fa, + 0xe1e: 0x12fa, 0xe1f: 0x1362, 0xe20: 0x140a, 0xe21: 0x1422, 0xe22: 0x1456, 0xe23: 0x145a, + 0xe24: 0x149e, 0xe25: 0x14a2, 0xe26: 0x14fa, 0xe27: 0x1502, 0xe28: 0x15d6, 0xe29: 0x161a, + 0xe2a: 0x1632, 0xe2b: 0x0c96, 0xe2c: 0x184b, 0xe2d: 0x12de, + 0xe30: 0x07da, 0xe31: 0x08de, 0xe32: 0x089e, 0xe33: 0x0846, 0xe34: 0x0886, 0xe35: 0x08b2, + 0xe36: 0x0942, 0xe37: 0x095e, 0xe38: 0x0a46, 0xe39: 0x0a32, 0xe3a: 0x0a42, 0xe3b: 0x0a5e, + 0xe3c: 0x0aaa, 0xe3d: 0x0aba, 0xe3e: 0x0afe, 0xe3f: 0x0b0a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0b26, 0xe41: 0x0b36, 0xe42: 0x0c1e, 0xe43: 0x0c26, 0xe44: 0x0c56, 0xe45: 0x0c76, + 0xe46: 0x0ca6, 0xe47: 0x0cbe, 0xe48: 0x0cae, 0xe49: 0x0cce, 0xe4a: 0x0cc2, 0xe4b: 0x0ce6, + 0xe4c: 0x0d02, 0xe4d: 0x0d5a, 0xe4e: 0x0d66, 0xe4f: 0x0d6e, 0xe50: 0x0d96, 0xe51: 0x0dda, + 0xe52: 0x0e0a, 0xe53: 0x0e0e, 0xe54: 0x0e22, 0xe55: 0x0ea2, 0xe56: 0x0eb2, 0xe57: 0x0f0a, + 0xe58: 0x0f56, 0xe59: 0x0f4e, 0xe5a: 0x0f62, 0xe5b: 0x0f7e, 0xe5c: 0x0fb6, 0xe5d: 0x110e, + 0xe5e: 0x0fda, 0xe5f: 0x100e, 0xe60: 0x101a, 0xe61: 0x105a, 0xe62: 0x1076, 0xe63: 0x109a, + 0xe64: 0x10be, 0xe65: 0x10c2, 0xe66: 0x10de, 0xe67: 0x10e2, 0xe68: 0x10f2, 0xe69: 0x1106, + 0xe6a: 0x1102, 0xe6b: 0x1132, 0xe6c: 0x11ae, 0xe6d: 0x11c6, 0xe6e: 0x11de, 0xe6f: 0x1216, + 0xe70: 0x122a, 0xe71: 0x1246, 0xe72: 0x1276, 0xe73: 0x132a, 0xe74: 0x1352, 0xe75: 0x13c6, + 0xe76: 0x140e, 0xe77: 0x141a, 0xe78: 0x1422, 0xe79: 0x143a, 0xe7a: 0x144e, 0xe7b: 0x143e, + 0xe7c: 0x1456, 0xe7d: 0x1452, 0xe7e: 0x144a, 0xe7f: 0x145a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x1466, 0xe81: 0x14a2, 0xe82: 0x14de, 0xe83: 0x150e, 0xe84: 0x1546, 0xe85: 0x1566, + 0xe86: 0x15b2, 0xe87: 0x15d6, 0xe88: 0x15f6, 0xe89: 0x160a, 0xe8a: 0x161a, 0xe8b: 0x1626, + 0xe8c: 0x1632, 0xe8d: 0x1686, 0xe8e: 0x1726, 0xe8f: 0x17e2, 0xe90: 0x17dd, 0xe91: 0x180f, + 0xe92: 0x0702, 0xe93: 0x072a, 0xe94: 0x072e, 0xe95: 0x1891, 0xe96: 0x18be, 0xe97: 0x1936, + 0xe98: 0x1712, 0xe99: 0x1722, + // Block 0x3b, offset 0xec0 + 0xec0: 0x1b05, 0xec1: 0x1b08, 0xec2: 0x1b0b, 0xec3: 0x1d38, 0xec4: 0x1d3c, 0xec5: 0x1b8f, + 0xec6: 0x1b8f, + 0xed3: 0x1ea5, 0xed4: 0x1e96, 0xed5: 0x1e9b, 0xed6: 0x1eaa, 0xed7: 0x1ea0, + 0xedd: 0x44d1, + 0xede: 0x8116, 0xedf: 0x4543, 0xee0: 0x0320, 0xee1: 0x0308, 0xee2: 0x0311, 0xee3: 0x0314, + 0xee4: 0x0317, 0xee5: 0x031a, 0xee6: 0x031d, 0xee7: 0x0323, 0xee8: 0x0326, 0xee9: 0x0017, + 0xeea: 0x4531, 0xeeb: 0x4537, 0xeec: 0x4635, 0xeed: 0x463d, 0xeee: 0x4489, 0xeef: 0x448f, + 0xef0: 0x4495, 0xef1: 0x449b, 0xef2: 0x44a7, 0xef3: 0x44ad, 0xef4: 0x44b3, 0xef5: 0x44bf, + 0xef6: 0x44c5, 0xef8: 0x44cb, 0xef9: 0x44d7, 0xefa: 0x44dd, 0xefb: 0x44e3, + 0xefc: 0x44ef, 0xefe: 0x44f5, + // Block 0x3c, offset 0xf00 + 0xf00: 0x44fb, 0xf01: 0x4501, 0xf03: 0x4507, 0xf04: 0x450d, + 0xf06: 0x4519, 0xf07: 0x451f, 0xf08: 0x4525, 0xf09: 0x452b, 0xf0a: 0x453d, 0xf0b: 0x44b9, + 0xf0c: 0x44a1, 0xf0d: 0x44e9, 0xf0e: 0x4513, 0xf0f: 0x1eaf, 0xf10: 0x038c, 0xf11: 0x038c, + 0xf12: 0x0395, 0xf13: 0x0395, 0xf14: 0x0395, 0xf15: 0x0395, 0xf16: 0x0398, 0xf17: 0x0398, + 0xf18: 0x0398, 0xf19: 0x0398, 0xf1a: 0x039e, 0xf1b: 0x039e, 0xf1c: 0x039e, 0xf1d: 0x039e, + 0xf1e: 0x0392, 0xf1f: 0x0392, 0xf20: 0x0392, 0xf21: 0x0392, 0xf22: 0x039b, 0xf23: 0x039b, + 0xf24: 0x039b, 0xf25: 0x039b, 0xf26: 0x038f, 0xf27: 0x038f, 0xf28: 0x038f, 0xf29: 0x038f, + 0xf2a: 0x03c2, 0xf2b: 0x03c2, 0xf2c: 0x03c2, 0xf2d: 0x03c2, 0xf2e: 0x03c5, 0xf2f: 0x03c5, + 0xf30: 0x03c5, 0xf31: 0x03c5, 0xf32: 0x03a4, 0xf33: 0x03a4, 0xf34: 0x03a4, 0xf35: 0x03a4, + 0xf36: 0x03a1, 0xf37: 0x03a1, 0xf38: 0x03a1, 0xf39: 0x03a1, 0xf3a: 0x03a7, 0xf3b: 0x03a7, + 0xf3c: 0x03a7, 0xf3d: 0x03a7, 0xf3e: 0x03aa, 0xf3f: 0x03aa, + // Block 0x3d, offset 0xf40 + 0xf40: 0x03aa, 0xf41: 0x03aa, 0xf42: 0x03b3, 0xf43: 0x03b3, 0xf44: 0x03b0, 0xf45: 0x03b0, + 0xf46: 0x03b6, 0xf47: 0x03b6, 0xf48: 0x03ad, 0xf49: 0x03ad, 0xf4a: 0x03bc, 0xf4b: 0x03bc, + 0xf4c: 0x03b9, 0xf4d: 0x03b9, 0xf4e: 0x03c8, 0xf4f: 0x03c8, 0xf50: 0x03c8, 0xf51: 0x03c8, + 0xf52: 0x03ce, 0xf53: 0x03ce, 0xf54: 0x03ce, 0xf55: 0x03ce, 0xf56: 0x03d4, 0xf57: 0x03d4, + 0xf58: 0x03d4, 0xf59: 0x03d4, 0xf5a: 0x03d1, 0xf5b: 0x03d1, 0xf5c: 0x03d1, 0xf5d: 0x03d1, + 0xf5e: 0x03d7, 0xf5f: 0x03d7, 0xf60: 0x03da, 0xf61: 0x03da, 0xf62: 0x03da, 0xf63: 0x03da, + 0xf64: 0x45af, 0xf65: 0x45af, 0xf66: 0x03e0, 0xf67: 0x03e0, 0xf68: 0x03e0, 0xf69: 0x03e0, + 0xf6a: 0x03dd, 0xf6b: 0x03dd, 0xf6c: 0x03dd, 0xf6d: 0x03dd, 0xf6e: 0x03fb, 0xf6f: 0x03fb, + 0xf70: 0x45a9, 0xf71: 0x45a9, + // Block 0x3e, offset 0xf80 + 0xf93: 0x03cb, 0xf94: 0x03cb, 0xf95: 0x03cb, 0xf96: 0x03cb, 0xf97: 0x03e9, + 0xf98: 0x03e9, 0xf99: 0x03e6, 0xf9a: 0x03e6, 0xf9b: 0x03ec, 0xf9c: 0x03ec, 0xf9d: 0x217f, + 0xf9e: 0x03f2, 0xf9f: 0x03f2, 0xfa0: 0x03e3, 0xfa1: 0x03e3, 0xfa2: 0x03ef, 0xfa3: 0x03ef, + 0xfa4: 0x03f8, 0xfa5: 0x03f8, 0xfa6: 0x03f8, 0xfa7: 0x03f8, 0xfa8: 0x0380, 0xfa9: 0x0380, + 0xfaa: 0x26da, 0xfab: 0x26da, 0xfac: 0x274a, 0xfad: 0x274a, 0xfae: 0x2719, 0xfaf: 0x2719, + 0xfb0: 0x2735, 0xfb1: 0x2735, 0xfb2: 0x272e, 0xfb3: 0x272e, 0xfb4: 0x273c, 0xfb5: 0x273c, + 0xfb6: 0x2743, 0xfb7: 0x2743, 0xfb8: 0x2743, 0xfb9: 0x2720, 0xfba: 0x2720, 0xfbb: 0x2720, + 0xfbc: 0x03f5, 0xfbd: 0x03f5, 0xfbe: 0x03f5, 0xfbf: 0x03f5, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x26e1, 0xfc1: 0x26e8, 0xfc2: 0x2704, 0xfc3: 0x2720, 0xfc4: 0x2727, 0xfc5: 0x1eb9, + 0xfc6: 0x1ebe, 0xfc7: 0x1ec3, 0xfc8: 0x1ed2, 0xfc9: 0x1ee1, 0xfca: 0x1ee6, 0xfcb: 0x1eeb, + 0xfcc: 0x1ef0, 0xfcd: 0x1ef5, 0xfce: 0x1f04, 0xfcf: 0x1f13, 0xfd0: 0x1f18, 0xfd1: 0x1f1d, + 0xfd2: 0x1f2c, 0xfd3: 0x1f3b, 0xfd4: 0x1f40, 0xfd5: 0x1f45, 0xfd6: 0x1f4a, 0xfd7: 0x1f59, + 0xfd8: 0x1f5e, 0xfd9: 0x1f6d, 0xfda: 0x1f72, 0xfdb: 0x1f77, 0xfdc: 0x1f86, 0xfdd: 0x1f8b, + 0xfde: 0x1f90, 0xfdf: 0x1f9a, 0xfe0: 0x1fd6, 0xfe1: 0x1fe5, 0xfe2: 0x1ff4, 0xfe3: 0x1ff9, + 0xfe4: 0x1ffe, 0xfe5: 0x2008, 0xfe6: 0x2017, 0xfe7: 0x201c, 0xfe8: 0x202b, 0xfe9: 0x2030, + 0xfea: 0x2035, 0xfeb: 0x2044, 0xfec: 0x2049, 0xfed: 0x2058, 0xfee: 0x205d, 0xfef: 0x2062, + 0xff0: 0x2067, 0xff1: 0x206c, 0xff2: 0x2071, 0xff3: 0x2076, 0xff4: 0x207b, 0xff5: 0x2080, + 0xff6: 0x2085, 0xff7: 0x208a, 0xff8: 0x208f, 0xff9: 0x2094, 0xffa: 0x2099, 0xffb: 0x209e, + 0xffc: 0x20a3, 0xffd: 0x20a8, 0xffe: 0x20ad, 0xfff: 0x20b7, + // Block 0x40, offset 0x1000 + 0x1000: 0x20bc, 0x1001: 0x20c1, 0x1002: 0x20c6, 0x1003: 0x20d0, 0x1004: 0x20d5, 0x1005: 0x20df, + 0x1006: 0x20e4, 0x1007: 0x20e9, 0x1008: 0x20ee, 0x1009: 0x20f3, 0x100a: 0x20f8, 0x100b: 0x20fd, + 0x100c: 0x2102, 0x100d: 0x2107, 0x100e: 0x2116, 0x100f: 0x2125, 0x1010: 0x212a, 0x1011: 0x212f, + 0x1012: 0x2134, 0x1013: 0x2139, 0x1014: 0x213e, 0x1015: 0x2148, 0x1016: 0x214d, 0x1017: 0x2152, + 0x1018: 0x2161, 0x1019: 0x2170, 0x101a: 0x2175, 0x101b: 0x4561, 0x101c: 0x4567, 0x101d: 0x459d, + 0x101e: 0x45f4, 0x101f: 0x45fb, 0x1020: 0x4602, 0x1021: 0x4609, 0x1022: 0x4610, 0x1023: 0x4617, + 0x1024: 0x26f6, 0x1025: 0x26fd, 0x1026: 0x2704, 0x1027: 0x270b, 0x1028: 0x2720, 0x1029: 0x2727, + 0x102a: 0x1ec8, 0x102b: 0x1ecd, 0x102c: 0x1ed2, 0x102d: 0x1ed7, 0x102e: 0x1ee1, 0x102f: 0x1ee6, + 0x1030: 0x1efa, 0x1031: 0x1eff, 0x1032: 0x1f04, 0x1033: 0x1f09, 0x1034: 0x1f13, 0x1035: 0x1f18, + 0x1036: 0x1f22, 0x1037: 0x1f27, 0x1038: 0x1f2c, 0x1039: 0x1f31, 0x103a: 0x1f3b, 0x103b: 0x1f40, + 0x103c: 0x206c, 0x103d: 0x2071, 0x103e: 0x2080, 0x103f: 0x2085, + // Block 0x41, offset 0x1040 + 0x1040: 0x208a, 0x1041: 0x209e, 0x1042: 0x20a3, 0x1043: 0x20a8, 0x1044: 0x20ad, 0x1045: 0x20c6, + 0x1046: 0x20d0, 0x1047: 0x20d5, 0x1048: 0x20da, 0x1049: 0x20ee, 0x104a: 0x210c, 0x104b: 0x2111, + 0x104c: 0x2116, 0x104d: 0x211b, 0x104e: 0x2125, 0x104f: 0x212a, 0x1050: 0x459d, 0x1051: 0x2157, + 0x1052: 0x215c, 0x1053: 0x2161, 0x1054: 0x2166, 0x1055: 0x2170, 0x1056: 0x2175, 0x1057: 0x26e1, + 0x1058: 0x26e8, 0x1059: 0x26ef, 0x105a: 0x2704, 0x105b: 0x2712, 0x105c: 0x1eb9, 0x105d: 0x1ebe, + 0x105e: 0x1ec3, 0x105f: 0x1ed2, 0x1060: 0x1edc, 0x1061: 0x1eeb, 0x1062: 0x1ef0, 0x1063: 0x1ef5, + 0x1064: 0x1f04, 0x1065: 0x1f0e, 0x1066: 0x1f2c, 0x1067: 0x1f45, 0x1068: 0x1f4a, 0x1069: 0x1f59, + 0x106a: 0x1f5e, 0x106b: 0x1f6d, 0x106c: 0x1f77, 0x106d: 0x1f86, 0x106e: 0x1f8b, 0x106f: 0x1f90, + 0x1070: 0x1f9a, 0x1071: 0x1fd6, 0x1072: 0x1fdb, 0x1073: 0x1fe5, 0x1074: 0x1ff4, 0x1075: 0x1ff9, + 0x1076: 0x1ffe, 0x1077: 0x2008, 0x1078: 0x2017, 0x1079: 0x202b, 0x107a: 0x2030, 0x107b: 0x2035, + 0x107c: 0x2044, 0x107d: 0x2049, 0x107e: 0x2058, 0x107f: 0x205d, + // Block 0x42, offset 0x1080 + 0x1080: 0x2062, 0x1081: 0x2067, 0x1082: 0x2076, 0x1083: 0x207b, 0x1084: 0x208f, 0x1085: 0x2094, + 0x1086: 0x2099, 0x1087: 0x209e, 0x1088: 0x20a3, 0x1089: 0x20b7, 0x108a: 0x20bc, 0x108b: 0x20c1, + 0x108c: 0x20c6, 0x108d: 0x20cb, 0x108e: 0x20df, 0x108f: 0x20e4, 0x1090: 0x20e9, 0x1091: 0x20ee, + 0x1092: 0x20fd, 0x1093: 0x2102, 0x1094: 0x2107, 0x1095: 0x2116, 0x1096: 0x2120, 0x1097: 0x212f, + 0x1098: 0x2134, 0x1099: 0x4591, 0x109a: 0x2148, 0x109b: 0x214d, 0x109c: 0x2152, 0x109d: 0x2161, + 0x109e: 0x216b, 0x109f: 0x2704, 0x10a0: 0x2712, 0x10a1: 0x1ed2, 0x10a2: 0x1edc, 0x10a3: 0x1f04, + 0x10a4: 0x1f0e, 0x10a5: 0x1f2c, 0x10a6: 0x1f36, 0x10a7: 0x1f9a, 0x10a8: 0x1f9f, 0x10a9: 0x1fc2, + 0x10aa: 0x1fc7, 0x10ab: 0x209e, 0x10ac: 0x20a3, 0x10ad: 0x20c6, 0x10ae: 0x2116, 0x10af: 0x2120, + 0x10b0: 0x2161, 0x10b1: 0x216b, 0x10b2: 0x4645, 0x10b3: 0x464d, 0x10b4: 0x4655, 0x10b5: 0x2021, + 0x10b6: 0x2026, 0x10b7: 0x203a, 0x10b8: 0x203f, 0x10b9: 0x204e, 0x10ba: 0x2053, 0x10bb: 0x1fa4, + 0x10bc: 0x1fa9, 0x10bd: 0x1fcc, 0x10be: 0x1fd1, 0x10bf: 0x1f63, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1f68, 0x10c1: 0x1f4f, 0x10c2: 0x1f54, 0x10c3: 0x1f7c, 0x10c4: 0x1f81, 0x10c5: 0x1fea, + 0x10c6: 0x1fef, 0x10c7: 0x200d, 0x10c8: 0x2012, 0x10c9: 0x1fae, 0x10ca: 0x1fb3, 0x10cb: 0x1fb8, + 0x10cc: 0x1fc2, 0x10cd: 0x1fbd, 0x10ce: 0x1f95, 0x10cf: 0x1fe0, 0x10d0: 0x2003, 0x10d1: 0x2021, + 0x10d2: 0x2026, 0x10d3: 0x203a, 0x10d4: 0x203f, 0x10d5: 0x204e, 0x10d6: 0x2053, 0x10d7: 0x1fa4, + 0x10d8: 0x1fa9, 0x10d9: 0x1fcc, 0x10da: 0x1fd1, 0x10db: 0x1f63, 0x10dc: 0x1f68, 0x10dd: 0x1f4f, + 0x10de: 0x1f54, 0x10df: 0x1f7c, 0x10e0: 0x1f81, 0x10e1: 0x1fea, 0x10e2: 0x1fef, 0x10e3: 0x200d, + 0x10e4: 0x2012, 0x10e5: 0x1fae, 0x10e6: 0x1fb3, 0x10e7: 0x1fb8, 0x10e8: 0x1fc2, 0x10e9: 0x1fbd, + 0x10ea: 0x1f95, 0x10eb: 0x1fe0, 0x10ec: 0x2003, 0x10ed: 0x1fae, 0x10ee: 0x1fb3, 0x10ef: 0x1fb8, + 0x10f0: 0x1fc2, 0x10f1: 0x1f9f, 0x10f2: 0x1fc7, 0x10f3: 0x201c, 0x10f4: 0x1f86, 0x10f5: 0x1f8b, + 0x10f6: 0x1f90, 0x10f7: 0x1fae, 0x10f8: 0x1fb3, 0x10f9: 0x1fb8, 0x10fa: 0x201c, 0x10fb: 0x202b, + 0x10fc: 0x4549, 0x10fd: 0x4549, + // Block 0x44, offset 0x1100 + 0x1110: 0x2441, 0x1111: 0x2456, + 0x1112: 0x2456, 0x1113: 0x245d, 0x1114: 0x2464, 0x1115: 0x2479, 0x1116: 0x2480, 0x1117: 0x2487, + 0x1118: 0x24aa, 0x1119: 0x24aa, 0x111a: 0x24cd, 0x111b: 0x24c6, 0x111c: 0x24e2, 0x111d: 0x24d4, + 0x111e: 0x24db, 0x111f: 0x24fe, 0x1120: 0x24fe, 0x1121: 0x24f7, 0x1122: 0x2505, 0x1123: 0x2505, + 0x1124: 0x252f, 0x1125: 0x252f, 0x1126: 0x254b, 0x1127: 0x2513, 0x1128: 0x2513, 0x1129: 0x250c, + 0x112a: 0x2521, 0x112b: 0x2521, 0x112c: 0x2528, 0x112d: 0x2528, 0x112e: 0x2552, 0x112f: 0x2560, + 0x1130: 0x2560, 0x1131: 0x2567, 0x1132: 0x2567, 0x1133: 0x256e, 0x1134: 0x2575, 0x1135: 0x257c, + 0x1136: 0x2583, 0x1137: 0x2583, 0x1138: 0x258a, 0x1139: 0x2598, 0x113a: 0x25a6, 0x113b: 0x259f, + 0x113c: 0x25ad, 0x113d: 0x25ad, 0x113e: 0x25c2, 0x113f: 0x25c9, + // Block 0x45, offset 0x1140 + 0x1140: 0x25fa, 0x1141: 0x2608, 0x1142: 0x2601, 0x1143: 0x25e5, 0x1144: 0x25e5, 0x1145: 0x260f, + 0x1146: 0x260f, 0x1147: 0x2616, 0x1148: 0x2616, 0x1149: 0x2640, 0x114a: 0x2647, 0x114b: 0x264e, + 0x114c: 0x2624, 0x114d: 0x2632, 0x114e: 0x2655, 0x114f: 0x265c, + 0x1152: 0x262b, 0x1153: 0x26b0, 0x1154: 0x26b7, 0x1155: 0x268d, 0x1156: 0x2694, 0x1157: 0x2678, + 0x1158: 0x2678, 0x1159: 0x267f, 0x115a: 0x26a9, 0x115b: 0x26a2, 0x115c: 0x26cc, 0x115d: 0x26cc, + 0x115e: 0x243a, 0x115f: 0x244f, 0x1160: 0x2448, 0x1161: 0x2472, 0x1162: 0x246b, 0x1163: 0x2495, + 0x1164: 0x248e, 0x1165: 0x24b8, 0x1166: 0x249c, 0x1167: 0x24b1, 0x1168: 0x24e9, 0x1169: 0x2536, + 0x116a: 0x251a, 0x116b: 0x2559, 0x116c: 0x25f3, 0x116d: 0x261d, 0x116e: 0x26c5, 0x116f: 0x26be, + 0x1170: 0x26d3, 0x1171: 0x266a, 0x1172: 0x25d0, 0x1173: 0x269b, 0x1174: 0x25c2, 0x1175: 0x25fa, + 0x1176: 0x2591, 0x1177: 0x25de, 0x1178: 0x2671, 0x1179: 0x2663, 0x117a: 0x25ec, 0x117b: 0x25d7, + 0x117c: 0x25ec, 0x117d: 0x2671, 0x117e: 0x24a3, 0x117f: 0x24bf, + // Block 0x46, offset 0x1180 + 0x1180: 0x2639, 0x1181: 0x25b4, 0x1182: 0x2433, 0x1183: 0x25d7, 0x1184: 0x257c, 0x1185: 0x254b, + 0x1186: 0x24f0, 0x1187: 0x2686, + 0x11b0: 0x2544, 0x11b1: 0x25bb, 0x11b2: 0x28f6, 0x11b3: 0x28ed, 0x11b4: 0x2923, 0x11b5: 0x2911, + 0x11b6: 0x28ff, 0x11b7: 0x291a, 0x11b8: 0x292c, 0x11b9: 0x253d, 0x11ba: 0x2db3, 0x11bb: 0x2c33, + 0x11bc: 0x2908, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x057e, + 0x11d2: 0x0582, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x05ba, + 0x11d8: 0x05be, 0x11d9: 0x1c8c, + 0x11e0: 0x8133, 0x11e1: 0x8133, 0x11e2: 0x8133, 0x11e3: 0x8133, + 0x11e4: 0x8133, 0x11e5: 0x8133, 0x11e6: 0x8133, 0x11e7: 0x812e, 0x11e8: 0x812e, 0x11e9: 0x812e, + 0x11ea: 0x812e, 0x11eb: 0x812e, 0x11ec: 0x812e, 0x11ed: 0x812e, 0x11ee: 0x8133, 0x11ef: 0x8133, + 0x11f0: 0x19a0, 0x11f1: 0x053a, 0x11f2: 0x0536, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x05b2, 0x11fa: 0x05b6, 0x11fb: 0x05a6, + 0x11fc: 0x05aa, 0x11fd: 0x058e, 0x11fe: 0x0592, 0x11ff: 0x0586, + // Block 0x48, offset 0x1200 + 0x1200: 0x058a, 0x1201: 0x0596, 0x1202: 0x059a, 0x1203: 0x059e, 0x1204: 0x05a2, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x43aa, 0x120a: 0x43aa, 0x120b: 0x43aa, + 0x120c: 0x43aa, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x057e, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x053a, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x05b2, + 0x121e: 0x05b6, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x43eb, 0x1231: 0x456d, 0x1232: 0x43f0, 0x1234: 0x43f5, + 0x1236: 0x43fa, 0x1237: 0x4573, 0x1238: 0x43ff, 0x1239: 0x4579, 0x123a: 0x4404, 0x123b: 0x457f, + 0x123c: 0x4409, 0x123d: 0x4585, 0x123e: 0x440e, 0x123f: 0x458b, + // Block 0x49, offset 0x1240 + 0x1240: 0x0329, 0x1241: 0x454f, 0x1242: 0x454f, 0x1243: 0x4555, 0x1244: 0x4555, 0x1245: 0x4597, + 0x1246: 0x4597, 0x1247: 0x455b, 0x1248: 0x455b, 0x1249: 0x45a3, 0x124a: 0x45a3, 0x124b: 0x45a3, + 0x124c: 0x45a3, 0x124d: 0x032c, 0x124e: 0x032c, 0x124f: 0x032f, 0x1250: 0x032f, 0x1251: 0x032f, + 0x1252: 0x032f, 0x1253: 0x0332, 0x1254: 0x0332, 0x1255: 0x0335, 0x1256: 0x0335, 0x1257: 0x0335, + 0x1258: 0x0335, 0x1259: 0x0338, 0x125a: 0x0338, 0x125b: 0x0338, 0x125c: 0x0338, 0x125d: 0x033b, + 0x125e: 0x033b, 0x125f: 0x033b, 0x1260: 0x033b, 0x1261: 0x033e, 0x1262: 0x033e, 0x1263: 0x033e, + 0x1264: 0x033e, 0x1265: 0x0341, 0x1266: 0x0341, 0x1267: 0x0341, 0x1268: 0x0341, 0x1269: 0x0344, + 0x126a: 0x0344, 0x126b: 0x0347, 0x126c: 0x0347, 0x126d: 0x034a, 0x126e: 0x034a, 0x126f: 0x034d, + 0x1270: 0x034d, 0x1271: 0x0350, 0x1272: 0x0350, 0x1273: 0x0350, 0x1274: 0x0350, 0x1275: 0x0353, + 0x1276: 0x0353, 0x1277: 0x0353, 0x1278: 0x0353, 0x1279: 0x0356, 0x127a: 0x0356, 0x127b: 0x0356, + 0x127c: 0x0356, 0x127d: 0x0359, 0x127e: 0x0359, 0x127f: 0x0359, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0359, 0x1281: 0x035c, 0x1282: 0x035c, 0x1283: 0x035c, 0x1284: 0x035c, 0x1285: 0x035f, + 0x1286: 0x035f, 0x1287: 0x035f, 0x1288: 0x035f, 0x1289: 0x0362, 0x128a: 0x0362, 0x128b: 0x0362, + 0x128c: 0x0362, 0x128d: 0x0365, 0x128e: 0x0365, 0x128f: 0x0365, 0x1290: 0x0365, 0x1291: 0x0368, + 0x1292: 0x0368, 0x1293: 0x0368, 0x1294: 0x0368, 0x1295: 0x036b, 0x1296: 0x036b, 0x1297: 0x036b, + 0x1298: 0x036b, 0x1299: 0x036e, 0x129a: 0x036e, 0x129b: 0x036e, 0x129c: 0x036e, 0x129d: 0x0371, + 0x129e: 0x0371, 0x129f: 0x0371, 0x12a0: 0x0371, 0x12a1: 0x0374, 0x12a2: 0x0374, 0x12a3: 0x0374, + 0x12a4: 0x0374, 0x12a5: 0x0377, 0x12a6: 0x0377, 0x12a7: 0x0377, 0x12a8: 0x0377, 0x12a9: 0x037a, + 0x12aa: 0x037a, 0x12ab: 0x037a, 0x12ac: 0x037a, 0x12ad: 0x037d, 0x12ae: 0x037d, 0x12af: 0x0380, + 0x12b0: 0x0380, 0x12b1: 0x0383, 0x12b2: 0x0383, 0x12b3: 0x0383, 0x12b4: 0x0383, 0x12b5: 0x2f41, + 0x12b6: 0x2f41, 0x12b7: 0x2f49, 0x12b8: 0x2f49, 0x12b9: 0x2f51, 0x12ba: 0x2f51, 0x12bb: 0x20b2, + 0x12bc: 0x20b2, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x056e, 0x12e0: 0x0572, 0x12e1: 0x0582, 0x12e2: 0x0596, 0x12e3: 0x059a, + 0x12e4: 0x057e, 0x12e5: 0x06a6, 0x12e6: 0x069e, 0x12e7: 0x05c2, 0x12e8: 0x05ca, 0x12e9: 0x05d2, + 0x12ea: 0x05da, 0x12eb: 0x05e2, 0x12ec: 0x0666, 0x12ed: 0x066e, 0x12ee: 0x0676, 0x12ef: 0x061a, + 0x12f0: 0x06aa, 0x12f1: 0x05c6, 0x12f2: 0x05ce, 0x12f3: 0x05d6, 0x12f4: 0x05de, 0x12f5: 0x05e6, + 0x12f6: 0x05ea, 0x12f7: 0x05ee, 0x12f8: 0x05f2, 0x12f9: 0x05f6, 0x12fa: 0x05fa, 0x12fb: 0x05fe, + 0x12fc: 0x0602, 0x12fd: 0x0606, 0x12fe: 0x060a, 0x12ff: 0x060e, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0612, 0x1301: 0x0616, 0x1302: 0x061e, 0x1303: 0x0622, 0x1304: 0x0626, 0x1305: 0x062a, + 0x1306: 0x062e, 0x1307: 0x0632, 0x1308: 0x0636, 0x1309: 0x063a, 0x130a: 0x063e, 0x130b: 0x0642, + 0x130c: 0x0646, 0x130d: 0x064a, 0x130e: 0x064e, 0x130f: 0x0652, 0x1310: 0x0656, 0x1311: 0x065a, + 0x1312: 0x065e, 0x1313: 0x0662, 0x1314: 0x066a, 0x1315: 0x0672, 0x1316: 0x067a, 0x1317: 0x067e, + 0x1318: 0x0682, 0x1319: 0x0686, 0x131a: 0x068a, 0x131b: 0x068e, 0x131c: 0x0692, 0x131d: 0x06a2, + 0x131e: 0x4bb9, 0x131f: 0x4bbf, 0x1320: 0x04b6, 0x1321: 0x0406, 0x1322: 0x040a, 0x1323: 0x4b7c, + 0x1324: 0x040e, 0x1325: 0x4b82, 0x1326: 0x4b88, 0x1327: 0x0412, 0x1328: 0x0416, 0x1329: 0x041a, + 0x132a: 0x4b8e, 0x132b: 0x4b94, 0x132c: 0x4b9a, 0x132d: 0x4ba0, 0x132e: 0x4ba6, 0x132f: 0x4bac, + 0x1330: 0x045a, 0x1331: 0x041e, 0x1332: 0x0422, 0x1333: 0x0426, 0x1334: 0x046e, 0x1335: 0x042a, + 0x1336: 0x042e, 0x1337: 0x0432, 0x1338: 0x0436, 0x1339: 0x043a, 0x133a: 0x043e, 0x133b: 0x0442, + 0x133c: 0x0446, 0x133d: 0x044a, 0x133e: 0x044e, + // Block 0x4d, offset 0x1340 + 0x1342: 0x4afe, 0x1343: 0x4b04, 0x1344: 0x4b0a, 0x1345: 0x4b10, + 0x1346: 0x4b16, 0x1347: 0x4b1c, 0x134a: 0x4b22, 0x134b: 0x4b28, + 0x134c: 0x4b2e, 0x134d: 0x4b34, 0x134e: 0x4b3a, 0x134f: 0x4b40, + 0x1352: 0x4b46, 0x1353: 0x4b4c, 0x1354: 0x4b52, 0x1355: 0x4b58, 0x1356: 0x4b5e, 0x1357: 0x4b64, + 0x135a: 0x4b6a, 0x135b: 0x4b70, 0x135c: 0x4b76, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x43a5, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x053e, 0x1368: 0x0562, 0x1369: 0x0542, + 0x136a: 0x0546, 0x136b: 0x054a, 0x136c: 0x054e, 0x136d: 0x0566, 0x136e: 0x056a, + // Block 0x4e, offset 0x1380 + 0x1381: 0x01f1, 0x1382: 0x01f4, 0x1383: 0x00d4, 0x1384: 0x01be, 0x1385: 0x010d, + 0x1387: 0x01d3, 0x1388: 0x174e, 0x1389: 0x01d9, 0x138a: 0x01d6, 0x138b: 0x0116, + 0x138c: 0x0119, 0x138d: 0x0526, 0x138e: 0x011c, 0x138f: 0x0128, 0x1390: 0x01e5, 0x1391: 0x013a, + 0x1392: 0x0134, 0x1393: 0x012e, 0x1394: 0x01c1, 0x1395: 0x00e0, 0x1396: 0x01c4, 0x1397: 0x0143, + 0x1398: 0x0194, 0x1399: 0x01e8, 0x139a: 0x01eb, 0x139b: 0x0152, 0x139c: 0x1756, 0x139d: 0x1742, + 0x139e: 0x0158, 0x139f: 0x175b, 0x13a0: 0x01a9, 0x13a1: 0x1760, 0x13a2: 0x00da, 0x13a3: 0x0170, + 0x13a4: 0x0173, 0x13a5: 0x00a3, 0x13a6: 0x017c, 0x13a7: 0x1765, 0x13a8: 0x0182, 0x13a9: 0x0185, + 0x13aa: 0x0188, 0x13ab: 0x01e2, 0x13ac: 0x01dc, 0x13ad: 0x1752, 0x13ae: 0x01df, 0x13af: 0x0197, + 0x13b0: 0x0576, 0x13b2: 0x01ac, 0x13b3: 0x01cd, 0x13b4: 0x01d0, 0x13b5: 0x01bb, + 0x13b6: 0x00f5, 0x13b7: 0x00f8, 0x13b8: 0x00fb, 0x13b9: 0x176a, 0x13ba: 0x176f, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0063, 0x13c1: 0x0065, 0x13c2: 0x0067, 0x13c3: 0x0069, 0x13c4: 0x006b, 0x13c5: 0x006d, + 0x13c6: 0x006f, 0x13c7: 0x0071, 0x13c8: 0x0073, 0x13c9: 0x0075, 0x13ca: 0x0083, 0x13cb: 0x0085, + 0x13cc: 0x0087, 0x13cd: 0x0089, 0x13ce: 0x008b, 0x13cf: 0x008d, 0x13d0: 0x008f, 0x13d1: 0x0091, + 0x13d2: 0x0093, 0x13d3: 0x0095, 0x13d4: 0x0097, 0x13d5: 0x0099, 0x13d6: 0x009b, 0x13d7: 0x009d, + 0x13d8: 0x009f, 0x13d9: 0x00a1, 0x13da: 0x00a3, 0x13db: 0x00a5, 0x13dc: 0x00a7, 0x13dd: 0x00a9, + 0x13de: 0x00ab, 0x13df: 0x00ad, 0x13e0: 0x00af, 0x13e1: 0x00b1, 0x13e2: 0x00b3, 0x13e3: 0x00b5, + 0x13e4: 0x00e3, 0x13e5: 0x0101, 0x13e8: 0x01f7, 0x13e9: 0x01fa, + 0x13ea: 0x01fd, 0x13eb: 0x0200, 0x13ec: 0x0203, 0x13ed: 0x0206, 0x13ee: 0x0209, 0x13ef: 0x020c, + 0x13f0: 0x020f, 0x13f1: 0x0212, 0x13f2: 0x0215, 0x13f3: 0x0218, 0x13f4: 0x021b, 0x13f5: 0x021e, + 0x13f6: 0x0221, 0x13f7: 0x0224, 0x13f8: 0x0227, 0x13f9: 0x020c, 0x13fa: 0x022a, 0x13fb: 0x022d, + 0x13fc: 0x0230, 0x13fd: 0x0233, 0x13fe: 0x0236, 0x13ff: 0x0239, + // Block 0x50, offset 0x1400 + 0x1400: 0x0281, 0x1401: 0x0284, 0x1402: 0x0287, 0x1403: 0x0552, 0x1404: 0x024b, 0x1405: 0x0254, + 0x1406: 0x025a, 0x1407: 0x027e, 0x1408: 0x026f, 0x1409: 0x026c, 0x140a: 0x028a, 0x140b: 0x028d, + 0x140e: 0x0021, 0x140f: 0x0023, 0x1410: 0x0025, 0x1411: 0x0027, + 0x1412: 0x0029, 0x1413: 0x002b, 0x1414: 0x002d, 0x1415: 0x002f, 0x1416: 0x0031, 0x1417: 0x0033, + 0x1418: 0x0021, 0x1419: 0x0023, 0x141a: 0x0025, 0x141b: 0x0027, 0x141c: 0x0029, 0x141d: 0x002b, + 0x141e: 0x002d, 0x141f: 0x002f, 0x1420: 0x0031, 0x1421: 0x0033, 0x1422: 0x0021, 0x1423: 0x0023, + 0x1424: 0x0025, 0x1425: 0x0027, 0x1426: 0x0029, 0x1427: 0x002b, 0x1428: 0x002d, 0x1429: 0x002f, + 0x142a: 0x0031, 0x142b: 0x0033, 0x142c: 0x0021, 0x142d: 0x0023, 0x142e: 0x0025, 0x142f: 0x0027, + 0x1430: 0x0029, 0x1431: 0x002b, 0x1432: 0x002d, 0x1433: 0x002f, 0x1434: 0x0031, 0x1435: 0x0033, + 0x1436: 0x0021, 0x1437: 0x0023, 0x1438: 0x0025, 0x1439: 0x0027, 0x143a: 0x0029, 0x143b: 0x002b, + 0x143c: 0x002d, 0x143d: 0x002f, 0x143e: 0x0031, 0x143f: 0x0033, + // Block 0x51, offset 0x1440 + 0x1440: 0x8133, 0x1441: 0x8133, 0x1442: 0x8133, 0x1443: 0x8133, 0x1444: 0x8133, 0x1445: 0x8133, + 0x1446: 0x8133, 0x1448: 0x8133, 0x1449: 0x8133, 0x144a: 0x8133, 0x144b: 0x8133, + 0x144c: 0x8133, 0x144d: 0x8133, 0x144e: 0x8133, 0x144f: 0x8133, 0x1450: 0x8133, 0x1451: 0x8133, + 0x1452: 0x8133, 0x1453: 0x8133, 0x1454: 0x8133, 0x1455: 0x8133, 0x1456: 0x8133, 0x1457: 0x8133, + 0x1458: 0x8133, 0x145b: 0x8133, 0x145c: 0x8133, 0x145d: 0x8133, + 0x145e: 0x8133, 0x145f: 0x8133, 0x1460: 0x8133, 0x1461: 0x8133, 0x1463: 0x8133, + 0x1464: 0x8133, 0x1466: 0x8133, 0x1467: 0x8133, 0x1468: 0x8133, 0x1469: 0x8133, + 0x146a: 0x8133, + 0x1470: 0x0290, 0x1471: 0x0293, 0x1472: 0x0296, 0x1473: 0x0299, 0x1474: 0x029c, 0x1475: 0x029f, + 0x1476: 0x02a2, 0x1477: 0x02a5, 0x1478: 0x02a8, 0x1479: 0x02ab, 0x147a: 0x02ae, 0x147b: 0x02b1, + 0x147c: 0x02b7, 0x147d: 0x02ba, 0x147e: 0x02bd, 0x147f: 0x02c0, + // Block 0x52, offset 0x1480 + 0x1480: 0x02c3, 0x1481: 0x02c6, 0x1482: 0x02c9, 0x1483: 0x02cc, 0x1484: 0x02cf, 0x1485: 0x02d2, + 0x1486: 0x02d5, 0x1487: 0x02db, 0x1488: 0x02e1, 0x1489: 0x02e4, 0x148a: 0x1736, 0x148b: 0x0302, + 0x148c: 0x02ea, 0x148d: 0x02ed, 0x148e: 0x0305, 0x148f: 0x02f9, 0x1490: 0x02ff, 0x1491: 0x0290, + 0x1492: 0x0293, 0x1493: 0x0296, 0x1494: 0x0299, 0x1495: 0x029c, 0x1496: 0x029f, 0x1497: 0x02a2, + 0x1498: 0x02a5, 0x1499: 0x02a8, 0x149a: 0x02ab, 0x149b: 0x02ae, 0x149c: 0x02b7, 0x149d: 0x02ba, + 0x149e: 0x02c0, 0x149f: 0x02c6, 0x14a0: 0x02c9, 0x14a1: 0x02cc, 0x14a2: 0x02cf, 0x14a3: 0x02d2, + 0x14a4: 0x02d5, 0x14a5: 0x02d8, 0x14a6: 0x02db, 0x14a7: 0x02f3, 0x14a8: 0x02ea, 0x14a9: 0x02e7, + 0x14aa: 0x02f0, 0x14ab: 0x02f6, 0x14ac: 0x1732, 0x14ad: 0x02fc, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x032c, 0x14c1: 0x032f, 0x14c2: 0x033b, 0x14c3: 0x0344, 0x14c5: 0x037d, + 0x14c6: 0x034d, 0x14c7: 0x033e, 0x14c8: 0x035c, 0x14c9: 0x0383, 0x14ca: 0x036e, 0x14cb: 0x0371, + 0x14cc: 0x0374, 0x14cd: 0x0377, 0x14ce: 0x0350, 0x14cf: 0x0362, 0x14d0: 0x0368, 0x14d1: 0x0356, + 0x14d2: 0x036b, 0x14d3: 0x034a, 0x14d4: 0x0353, 0x14d5: 0x0335, 0x14d6: 0x0338, 0x14d7: 0x0341, + 0x14d8: 0x0347, 0x14d9: 0x0359, 0x14da: 0x035f, 0x14db: 0x0365, 0x14dc: 0x0386, 0x14dd: 0x03d7, + 0x14de: 0x03bf, 0x14df: 0x0389, 0x14e1: 0x032f, 0x14e2: 0x033b, + 0x14e4: 0x037a, 0x14e7: 0x033e, 0x14e9: 0x0383, + 0x14ea: 0x036e, 0x14eb: 0x0371, 0x14ec: 0x0374, 0x14ed: 0x0377, 0x14ee: 0x0350, 0x14ef: 0x0362, + 0x14f0: 0x0368, 0x14f1: 0x0356, 0x14f2: 0x036b, 0x14f4: 0x0353, 0x14f5: 0x0335, + 0x14f6: 0x0338, 0x14f7: 0x0341, 0x14f9: 0x0359, 0x14fb: 0x0365, + // Block 0x54, offset 0x1500 + 0x1502: 0x033b, + 0x1507: 0x033e, 0x1509: 0x0383, 0x150b: 0x0371, + 0x150d: 0x0377, 0x150e: 0x0350, 0x150f: 0x0362, 0x1511: 0x0356, + 0x1512: 0x036b, 0x1514: 0x0353, 0x1517: 0x0341, + 0x1519: 0x0359, 0x151b: 0x0365, 0x151d: 0x03d7, + 0x151f: 0x0389, 0x1521: 0x032f, 0x1522: 0x033b, + 0x1524: 0x037a, 0x1527: 0x033e, 0x1528: 0x035c, 0x1529: 0x0383, + 0x152a: 0x036e, 0x152c: 0x0374, 0x152d: 0x0377, 0x152e: 0x0350, 0x152f: 0x0362, + 0x1530: 0x0368, 0x1531: 0x0356, 0x1532: 0x036b, 0x1534: 0x0353, 0x1535: 0x0335, + 0x1536: 0x0338, 0x1537: 0x0341, 0x1539: 0x0359, 0x153a: 0x035f, 0x153b: 0x0365, + 0x153c: 0x0386, 0x153e: 0x03bf, + // Block 0x55, offset 0x1540 + 0x1540: 0x032c, 0x1541: 0x032f, 0x1542: 0x033b, 0x1543: 0x0344, 0x1544: 0x037a, 0x1545: 0x037d, + 0x1546: 0x034d, 0x1547: 0x033e, 0x1548: 0x035c, 0x1549: 0x0383, 0x154b: 0x0371, + 0x154c: 0x0374, 0x154d: 0x0377, 0x154e: 0x0350, 0x154f: 0x0362, 0x1550: 0x0368, 0x1551: 0x0356, + 0x1552: 0x036b, 0x1553: 0x034a, 0x1554: 0x0353, 0x1555: 0x0335, 0x1556: 0x0338, 0x1557: 0x0341, + 0x1558: 0x0347, 0x1559: 0x0359, 0x155a: 0x035f, 0x155b: 0x0365, + 0x1561: 0x032f, 0x1562: 0x033b, 0x1563: 0x0344, + 0x1565: 0x037d, 0x1566: 0x034d, 0x1567: 0x033e, 0x1568: 0x035c, 0x1569: 0x0383, + 0x156b: 0x0371, 0x156c: 0x0374, 0x156d: 0x0377, 0x156e: 0x0350, 0x156f: 0x0362, + 0x1570: 0x0368, 0x1571: 0x0356, 0x1572: 0x036b, 0x1573: 0x034a, 0x1574: 0x0353, 0x1575: 0x0335, + 0x1576: 0x0338, 0x1577: 0x0341, 0x1578: 0x0347, 0x1579: 0x0359, 0x157a: 0x035f, 0x157b: 0x0365, + // Block 0x56, offset 0x1580 + 0x1580: 0x19a6, 0x1581: 0x19a3, 0x1582: 0x19a9, 0x1583: 0x19cd, 0x1584: 0x19f1, 0x1585: 0x1a15, + 0x1586: 0x1a39, 0x1587: 0x1a42, 0x1588: 0x1a48, 0x1589: 0x1a4e, 0x158a: 0x1a54, + 0x1590: 0x1bbc, 0x1591: 0x1bc0, + 0x1592: 0x1bc4, 0x1593: 0x1bc8, 0x1594: 0x1bcc, 0x1595: 0x1bd0, 0x1596: 0x1bd4, 0x1597: 0x1bd8, + 0x1598: 0x1bdc, 0x1599: 0x1be0, 0x159a: 0x1be4, 0x159b: 0x1be8, 0x159c: 0x1bec, 0x159d: 0x1bf0, + 0x159e: 0x1bf4, 0x159f: 0x1bf8, 0x15a0: 0x1bfc, 0x15a1: 0x1c00, 0x15a2: 0x1c04, 0x15a3: 0x1c08, + 0x15a4: 0x1c0c, 0x15a5: 0x1c10, 0x15a6: 0x1c14, 0x15a7: 0x1c18, 0x15a8: 0x1c1c, 0x15a9: 0x1c20, + 0x15aa: 0x2855, 0x15ab: 0x0047, 0x15ac: 0x0065, 0x15ad: 0x1a69, 0x15ae: 0x1ae1, + 0x15b0: 0x0043, 0x15b1: 0x0045, 0x15b2: 0x0047, 0x15b3: 0x0049, 0x15b4: 0x004b, 0x15b5: 0x004d, + 0x15b6: 0x004f, 0x15b7: 0x0051, 0x15b8: 0x0053, 0x15b9: 0x0055, 0x15ba: 0x0057, 0x15bb: 0x0059, + 0x15bc: 0x005b, 0x15bd: 0x005d, 0x15be: 0x005f, 0x15bf: 0x0061, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x27dd, 0x15c1: 0x27f2, 0x15c2: 0x05fe, + 0x15d0: 0x0d0a, 0x15d1: 0x0b42, + 0x15d2: 0x09ce, 0x15d3: 0x4705, 0x15d4: 0x0816, 0x15d5: 0x0aea, 0x15d6: 0x142a, 0x15d7: 0x0afa, + 0x15d8: 0x0822, 0x15d9: 0x0dd2, 0x15da: 0x0faa, 0x15db: 0x0daa, 0x15dc: 0x0922, 0x15dd: 0x0c66, + 0x15de: 0x08ba, 0x15df: 0x0db2, 0x15e0: 0x090e, 0x15e1: 0x1212, 0x15e2: 0x107e, 0x15e3: 0x1486, + 0x15e4: 0x0ace, 0x15e5: 0x0a06, 0x15e6: 0x0f5e, 0x15e7: 0x0d16, 0x15e8: 0x0d42, 0x15e9: 0x07ba, + 0x15ea: 0x07c6, 0x15eb: 0x1506, 0x15ec: 0x0bd6, 0x15ed: 0x07e2, 0x15ee: 0x09ea, 0x15ef: 0x0d36, + 0x15f0: 0x14ae, 0x15f1: 0x0d0e, 0x15f2: 0x116a, 0x15f3: 0x11a6, 0x15f4: 0x09f2, 0x15f5: 0x0f3e, + 0x15f6: 0x0e06, 0x15f7: 0x0e02, 0x15f8: 0x1092, 0x15f9: 0x0926, 0x15fa: 0x0a52, 0x15fb: 0x153e, + // Block 0x58, offset 0x1600 + 0x1600: 0x07f6, 0x1601: 0x07ee, 0x1602: 0x07fe, 0x1603: 0x1774, 0x1604: 0x0842, 0x1605: 0x0852, + 0x1606: 0x0856, 0x1607: 0x085e, 0x1608: 0x0866, 0x1609: 0x086a, 0x160a: 0x0876, 0x160b: 0x086e, + 0x160c: 0x06ae, 0x160d: 0x1788, 0x160e: 0x088a, 0x160f: 0x088e, 0x1610: 0x0892, 0x1611: 0x08ae, + 0x1612: 0x1779, 0x1613: 0x06b2, 0x1614: 0x089a, 0x1615: 0x08ba, 0x1616: 0x1783, 0x1617: 0x08ca, + 0x1618: 0x08d2, 0x1619: 0x0832, 0x161a: 0x08da, 0x161b: 0x08de, 0x161c: 0x195e, 0x161d: 0x08fa, + 0x161e: 0x0902, 0x161f: 0x06ba, 0x1620: 0x091a, 0x1621: 0x091e, 0x1622: 0x0926, 0x1623: 0x092a, + 0x1624: 0x06be, 0x1625: 0x0942, 0x1626: 0x0946, 0x1627: 0x0952, 0x1628: 0x095e, 0x1629: 0x0962, + 0x162a: 0x0966, 0x162b: 0x096e, 0x162c: 0x098e, 0x162d: 0x0992, 0x162e: 0x099a, 0x162f: 0x09aa, + 0x1630: 0x09b2, 0x1631: 0x09b6, 0x1632: 0x09b6, 0x1633: 0x09b6, 0x1634: 0x1797, 0x1635: 0x0f8e, + 0x1636: 0x09ca, 0x1637: 0x09d2, 0x1638: 0x179c, 0x1639: 0x09de, 0x163a: 0x09e6, 0x163b: 0x09ee, + 0x163c: 0x0a16, 0x163d: 0x0a02, 0x163e: 0x0a0e, 0x163f: 0x0a12, + // Block 0x59, offset 0x1640 + 0x1640: 0x0a1a, 0x1641: 0x0a22, 0x1642: 0x0a26, 0x1643: 0x0a2e, 0x1644: 0x0a36, 0x1645: 0x0a3a, + 0x1646: 0x0a3a, 0x1647: 0x0a42, 0x1648: 0x0a4a, 0x1649: 0x0a4e, 0x164a: 0x0a5a, 0x164b: 0x0a7e, + 0x164c: 0x0a62, 0x164d: 0x0a82, 0x164e: 0x0a66, 0x164f: 0x0a6e, 0x1650: 0x0906, 0x1651: 0x0aca, + 0x1652: 0x0a92, 0x1653: 0x0a96, 0x1654: 0x0a9a, 0x1655: 0x0a8e, 0x1656: 0x0aa2, 0x1657: 0x0a9e, + 0x1658: 0x0ab6, 0x1659: 0x17a1, 0x165a: 0x0ad2, 0x165b: 0x0ad6, 0x165c: 0x0ade, 0x165d: 0x0aea, + 0x165e: 0x0af2, 0x165f: 0x0b0e, 0x1660: 0x17a6, 0x1661: 0x17ab, 0x1662: 0x0b1a, 0x1663: 0x0b1e, + 0x1664: 0x0b22, 0x1665: 0x0b16, 0x1666: 0x0b2a, 0x1667: 0x06c2, 0x1668: 0x06c6, 0x1669: 0x0b32, + 0x166a: 0x0b3a, 0x166b: 0x0b3a, 0x166c: 0x17b0, 0x166d: 0x0b56, 0x166e: 0x0b5a, 0x166f: 0x0b5e, + 0x1670: 0x0b66, 0x1671: 0x17b5, 0x1672: 0x0b6e, 0x1673: 0x0b72, 0x1674: 0x0c4a, 0x1675: 0x0b7a, + 0x1676: 0x06ca, 0x1677: 0x0b86, 0x1678: 0x0b96, 0x1679: 0x0ba2, 0x167a: 0x0b9e, 0x167b: 0x17bf, + 0x167c: 0x0baa, 0x167d: 0x17c4, 0x167e: 0x0bb6, 0x167f: 0x0bb2, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0bba, 0x1681: 0x0bca, 0x1682: 0x0bce, 0x1683: 0x06ce, 0x1684: 0x0bde, 0x1685: 0x0be6, + 0x1686: 0x0bea, 0x1687: 0x0bee, 0x1688: 0x06d2, 0x1689: 0x17c9, 0x168a: 0x06d6, 0x168b: 0x0c0a, + 0x168c: 0x0c0e, 0x168d: 0x0c12, 0x168e: 0x0c1a, 0x168f: 0x1990, 0x1690: 0x0c32, 0x1691: 0x17d3, + 0x1692: 0x17d3, 0x1693: 0x12d2, 0x1694: 0x0c42, 0x1695: 0x0c42, 0x1696: 0x06da, 0x1697: 0x17f6, + 0x1698: 0x18c8, 0x1699: 0x0c52, 0x169a: 0x0c5a, 0x169b: 0x06de, 0x169c: 0x0c6e, 0x169d: 0x0c7e, + 0x169e: 0x0c82, 0x169f: 0x0c8a, 0x16a0: 0x0c9a, 0x16a1: 0x06e6, 0x16a2: 0x06e2, 0x16a3: 0x0c9e, + 0x16a4: 0x17d8, 0x16a5: 0x0ca2, 0x16a6: 0x0cb6, 0x16a7: 0x0cba, 0x16a8: 0x0cbe, 0x16a9: 0x0cba, + 0x16aa: 0x0cca, 0x16ab: 0x0cce, 0x16ac: 0x0cde, 0x16ad: 0x0cd6, 0x16ae: 0x0cda, 0x16af: 0x0ce2, + 0x16b0: 0x0ce6, 0x16b1: 0x0cea, 0x16b2: 0x0cf6, 0x16b3: 0x0cfa, 0x16b4: 0x0d12, 0x16b5: 0x0d1a, + 0x16b6: 0x0d2a, 0x16b7: 0x0d3e, 0x16b8: 0x17e7, 0x16b9: 0x0d3a, 0x16ba: 0x0d2e, 0x16bb: 0x0d46, + 0x16bc: 0x0d4e, 0x16bd: 0x0d62, 0x16be: 0x17ec, 0x16bf: 0x0d6a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0d5e, 0x16c1: 0x0d56, 0x16c2: 0x06ea, 0x16c3: 0x0d72, 0x16c4: 0x0d7a, 0x16c5: 0x0d82, + 0x16c6: 0x0d76, 0x16c7: 0x06ee, 0x16c8: 0x0d92, 0x16c9: 0x0d9a, 0x16ca: 0x17f1, 0x16cb: 0x0dc6, + 0x16cc: 0x0dfa, 0x16cd: 0x0dd6, 0x16ce: 0x06fa, 0x16cf: 0x0de2, 0x16d0: 0x06f6, 0x16d1: 0x06f2, + 0x16d2: 0x08be, 0x16d3: 0x08c2, 0x16d4: 0x0dfe, 0x16d5: 0x0de6, 0x16d6: 0x12a6, 0x16d7: 0x075e, + 0x16d8: 0x0e0a, 0x16d9: 0x0e0e, 0x16da: 0x0e12, 0x16db: 0x0e26, 0x16dc: 0x0e1e, 0x16dd: 0x180a, + 0x16de: 0x06fe, 0x16df: 0x0e3a, 0x16e0: 0x0e2e, 0x16e1: 0x0e4a, 0x16e2: 0x0e52, 0x16e3: 0x1814, + 0x16e4: 0x0e56, 0x16e5: 0x0e42, 0x16e6: 0x0e5e, 0x16e7: 0x0702, 0x16e8: 0x0e62, 0x16e9: 0x0e66, + 0x16ea: 0x0e6a, 0x16eb: 0x0e76, 0x16ec: 0x1819, 0x16ed: 0x0e7e, 0x16ee: 0x0706, 0x16ef: 0x0e8a, + 0x16f0: 0x181e, 0x16f1: 0x0e8e, 0x16f2: 0x070a, 0x16f3: 0x0e9a, 0x16f4: 0x0ea6, 0x16f5: 0x0eb2, + 0x16f6: 0x0eb6, 0x16f7: 0x1823, 0x16f8: 0x17ba, 0x16f9: 0x1828, 0x16fa: 0x0ed6, 0x16fb: 0x182d, + 0x16fc: 0x0ee2, 0x16fd: 0x0eea, 0x16fe: 0x0eda, 0x16ff: 0x0ef6, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0f06, 0x1701: 0x0f16, 0x1702: 0x0f0a, 0x1703: 0x0f0e, 0x1704: 0x0f1a, 0x1705: 0x0f1e, + 0x1706: 0x1832, 0x1707: 0x0f02, 0x1708: 0x0f36, 0x1709: 0x0f3a, 0x170a: 0x070e, 0x170b: 0x0f4e, + 0x170c: 0x0f4a, 0x170d: 0x1837, 0x170e: 0x0f2e, 0x170f: 0x0f6a, 0x1710: 0x183c, 0x1711: 0x1841, + 0x1712: 0x0f6e, 0x1713: 0x0f82, 0x1714: 0x0f7e, 0x1715: 0x0f7a, 0x1716: 0x0712, 0x1717: 0x0f86, + 0x1718: 0x0f96, 0x1719: 0x0f92, 0x171a: 0x0f9e, 0x171b: 0x177e, 0x171c: 0x0fae, 0x171d: 0x1846, + 0x171e: 0x0fba, 0x171f: 0x1850, 0x1720: 0x0fce, 0x1721: 0x0fda, 0x1722: 0x0fee, 0x1723: 0x1855, + 0x1724: 0x1002, 0x1725: 0x1006, 0x1726: 0x185a, 0x1727: 0x185f, 0x1728: 0x1022, 0x1729: 0x1032, + 0x172a: 0x0716, 0x172b: 0x1036, 0x172c: 0x071a, 0x172d: 0x071a, 0x172e: 0x104e, 0x172f: 0x1052, + 0x1730: 0x105a, 0x1731: 0x105e, 0x1732: 0x106a, 0x1733: 0x071e, 0x1734: 0x1082, 0x1735: 0x1864, + 0x1736: 0x109e, 0x1737: 0x1869, 0x1738: 0x10aa, 0x1739: 0x17ce, 0x173a: 0x10ba, 0x173b: 0x186e, + 0x173c: 0x1873, 0x173d: 0x1878, 0x173e: 0x0722, 0x173f: 0x0726, + // Block 0x5d, offset 0x1740 + 0x1740: 0x10f2, 0x1741: 0x1882, 0x1742: 0x187d, 0x1743: 0x1887, 0x1744: 0x188c, 0x1745: 0x10fa, + 0x1746: 0x10fe, 0x1747: 0x10fe, 0x1748: 0x1106, 0x1749: 0x072e, 0x174a: 0x110a, 0x174b: 0x0732, + 0x174c: 0x0736, 0x174d: 0x1896, 0x174e: 0x111e, 0x174f: 0x1126, 0x1750: 0x1132, 0x1751: 0x073a, + 0x1752: 0x189b, 0x1753: 0x1156, 0x1754: 0x18a0, 0x1755: 0x18a5, 0x1756: 0x1176, 0x1757: 0x118e, + 0x1758: 0x073e, 0x1759: 0x1196, 0x175a: 0x119a, 0x175b: 0x119e, 0x175c: 0x18aa, 0x175d: 0x18af, + 0x175e: 0x18af, 0x175f: 0x11b6, 0x1760: 0x0742, 0x1761: 0x18b4, 0x1762: 0x11ca, 0x1763: 0x11ce, + 0x1764: 0x0746, 0x1765: 0x18b9, 0x1766: 0x11ea, 0x1767: 0x074a, 0x1768: 0x11fa, 0x1769: 0x11f2, + 0x176a: 0x1202, 0x176b: 0x18c3, 0x176c: 0x121a, 0x176d: 0x074e, 0x176e: 0x1226, 0x176f: 0x122e, + 0x1770: 0x123e, 0x1771: 0x0752, 0x1772: 0x18cd, 0x1773: 0x18d2, 0x1774: 0x0756, 0x1775: 0x18d7, + 0x1776: 0x1256, 0x1777: 0x18dc, 0x1778: 0x1262, 0x1779: 0x126e, 0x177a: 0x1276, 0x177b: 0x18e1, + 0x177c: 0x18e6, 0x177d: 0x128a, 0x177e: 0x18eb, 0x177f: 0x1292, + // Block 0x5e, offset 0x1780 + 0x1780: 0x17fb, 0x1781: 0x075a, 0x1782: 0x12aa, 0x1783: 0x12ae, 0x1784: 0x0762, 0x1785: 0x12b2, + 0x1786: 0x0b2e, 0x1787: 0x18f0, 0x1788: 0x18f5, 0x1789: 0x1800, 0x178a: 0x1805, 0x178b: 0x12d2, + 0x178c: 0x12d6, 0x178d: 0x14ee, 0x178e: 0x0766, 0x178f: 0x1302, 0x1790: 0x12fe, 0x1791: 0x1306, + 0x1792: 0x093a, 0x1793: 0x130a, 0x1794: 0x130e, 0x1795: 0x1312, 0x1796: 0x131a, 0x1797: 0x18fa, + 0x1798: 0x1316, 0x1799: 0x131e, 0x179a: 0x1332, 0x179b: 0x1336, 0x179c: 0x1322, 0x179d: 0x133a, + 0x179e: 0x134e, 0x179f: 0x1362, 0x17a0: 0x132e, 0x17a1: 0x1342, 0x17a2: 0x1346, 0x17a3: 0x134a, + 0x17a4: 0x18ff, 0x17a5: 0x1909, 0x17a6: 0x1904, 0x17a7: 0x076a, 0x17a8: 0x136a, 0x17a9: 0x136e, + 0x17aa: 0x1376, 0x17ab: 0x191d, 0x17ac: 0x137a, 0x17ad: 0x190e, 0x17ae: 0x076e, 0x17af: 0x0772, + 0x17b0: 0x1913, 0x17b1: 0x1918, 0x17b2: 0x0776, 0x17b3: 0x139a, 0x17b4: 0x139e, 0x17b5: 0x13a2, + 0x17b6: 0x13a6, 0x17b7: 0x13b2, 0x17b8: 0x13ae, 0x17b9: 0x13ba, 0x17ba: 0x13b6, 0x17bb: 0x13c6, + 0x17bc: 0x13be, 0x17bd: 0x13c2, 0x17be: 0x13ca, 0x17bf: 0x077a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x13d2, 0x17c1: 0x13d6, 0x17c2: 0x077e, 0x17c3: 0x13e6, 0x17c4: 0x13ea, 0x17c5: 0x1922, + 0x17c6: 0x13f6, 0x17c7: 0x13fa, 0x17c8: 0x0782, 0x17c9: 0x1406, 0x17ca: 0x06b6, 0x17cb: 0x1927, + 0x17cc: 0x192c, 0x17cd: 0x0786, 0x17ce: 0x078a, 0x17cf: 0x1432, 0x17d0: 0x144a, 0x17d1: 0x1466, + 0x17d2: 0x1476, 0x17d3: 0x1931, 0x17d4: 0x148a, 0x17d5: 0x148e, 0x17d6: 0x14a6, 0x17d7: 0x14b2, + 0x17d8: 0x193b, 0x17d9: 0x178d, 0x17da: 0x14be, 0x17db: 0x14ba, 0x17dc: 0x14c6, 0x17dd: 0x1792, + 0x17de: 0x14d2, 0x17df: 0x14de, 0x17e0: 0x1940, 0x17e1: 0x1945, 0x17e2: 0x151e, 0x17e3: 0x152a, + 0x17e4: 0x1532, 0x17e5: 0x194a, 0x17e6: 0x1536, 0x17e7: 0x1562, 0x17e8: 0x156e, 0x17e9: 0x1572, + 0x17ea: 0x156a, 0x17eb: 0x157e, 0x17ec: 0x1582, 0x17ed: 0x194f, 0x17ee: 0x158e, 0x17ef: 0x078e, + 0x17f0: 0x1596, 0x17f1: 0x1954, 0x17f2: 0x0792, 0x17f3: 0x15ce, 0x17f4: 0x0bbe, 0x17f5: 0x15e6, + 0x17f6: 0x1959, 0x17f7: 0x1963, 0x17f8: 0x0796, 0x17f9: 0x079a, 0x17fa: 0x160e, 0x17fb: 0x1968, + 0x17fc: 0x079e, 0x17fd: 0x196d, 0x17fe: 0x1626, 0x17ff: 0x1626, + // Block 0x60, offset 0x1800 + 0x1800: 0x162e, 0x1801: 0x1972, 0x1802: 0x1646, 0x1803: 0x07a2, 0x1804: 0x1656, 0x1805: 0x1662, + 0x1806: 0x166a, 0x1807: 0x1672, 0x1808: 0x07a6, 0x1809: 0x1977, 0x180a: 0x1686, 0x180b: 0x16a2, + 0x180c: 0x16ae, 0x180d: 0x07aa, 0x180e: 0x07ae, 0x180f: 0x16b2, 0x1810: 0x197c, 0x1811: 0x07b2, + 0x1812: 0x1981, 0x1813: 0x1986, 0x1814: 0x198b, 0x1815: 0x16d6, 0x1816: 0x07b6, 0x1817: 0x16ea, + 0x1818: 0x16f2, 0x1819: 0x16f6, 0x181a: 0x16fe, 0x181b: 0x1706, 0x181c: 0x170e, 0x181d: 0x1995, +} + +// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5f, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x60, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x61, 0xcb: 0x62, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x63, 0xd2: 0x64, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x65, + 0xd8: 0x66, 0xd9: 0x0d, 0xdb: 0x67, 0xdc: 0x68, 0xdd: 0x69, 0xdf: 0x6a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x6b, 0x121: 0x6c, 0x122: 0x6d, 0x123: 0x0e, 0x124: 0x6e, 0x125: 0x6f, 0x126: 0x70, 0x127: 0x71, + 0x128: 0x72, 0x129: 0x73, 0x12a: 0x74, 0x12b: 0x75, 0x12c: 0x70, 0x12d: 0x76, 0x12e: 0x77, 0x12f: 0x78, + 0x130: 0x74, 0x131: 0x79, 0x132: 0x7a, 0x133: 0x7b, 0x134: 0x7c, 0x135: 0x7d, 0x137: 0x7e, + 0x138: 0x7f, 0x139: 0x80, 0x13a: 0x81, 0x13b: 0x82, 0x13c: 0x83, 0x13d: 0x84, 0x13e: 0x85, 0x13f: 0x86, + // Block 0x5, offset 0x140 + 0x140: 0x87, 0x142: 0x88, 0x143: 0x89, 0x144: 0x8a, 0x145: 0x8b, 0x146: 0x8c, 0x147: 0x8d, + 0x14d: 0x8e, + 0x15c: 0x8f, 0x15f: 0x90, + 0x162: 0x91, 0x164: 0x92, + 0x168: 0x93, 0x169: 0x94, 0x16a: 0x95, 0x16b: 0x96, 0x16c: 0x0f, 0x16d: 0x97, 0x16e: 0x98, 0x16f: 0x99, + 0x170: 0x9a, 0x173: 0x9b, 0x174: 0x9c, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x9d, 0x181: 0x9e, 0x182: 0x9f, 0x183: 0xa0, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0xa1, 0x187: 0xa2, + 0x188: 0xa3, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0xa4, 0x18c: 0xa5, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa6, + 0x1a8: 0xa7, 0x1a9: 0xa8, 0x1ab: 0xa9, + 0x1b1: 0xaa, 0x1b3: 0xab, 0x1b5: 0xac, 0x1b7: 0xad, + 0x1ba: 0xae, 0x1bb: 0xaf, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xb0, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xb1, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xb2, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xb3, 0x21a: 0xb4, 0x21b: 0xb5, 0x21d: 0xb6, 0x21f: 0xb7, + 0x220: 0xb8, 0x223: 0xb9, 0x224: 0xba, 0x225: 0xbb, 0x226: 0xbc, 0x227: 0xbd, + 0x22a: 0xbe, 0x22b: 0xbf, 0x22d: 0xc0, 0x22f: 0xc1, + 0x230: 0xc2, 0x231: 0xc3, 0x232: 0xc4, 0x233: 0xc5, 0x234: 0xc6, 0x235: 0xc7, 0x236: 0xc8, 0x237: 0xc2, + 0x238: 0xc3, 0x239: 0xc4, 0x23a: 0xc5, 0x23b: 0xc6, 0x23c: 0xc7, 0x23d: 0xc8, 0x23e: 0xc2, 0x23f: 0xc3, + // Block 0x9, offset 0x240 + 0x240: 0xc4, 0x241: 0xc5, 0x242: 0xc6, 0x243: 0xc7, 0x244: 0xc8, 0x245: 0xc2, 0x246: 0xc3, 0x247: 0xc4, + 0x248: 0xc5, 0x249: 0xc6, 0x24a: 0xc7, 0x24b: 0xc8, 0x24c: 0xc2, 0x24d: 0xc3, 0x24e: 0xc4, 0x24f: 0xc5, + 0x250: 0xc6, 0x251: 0xc7, 0x252: 0xc8, 0x253: 0xc2, 0x254: 0xc3, 0x255: 0xc4, 0x256: 0xc5, 0x257: 0xc6, + 0x258: 0xc7, 0x259: 0xc8, 0x25a: 0xc2, 0x25b: 0xc3, 0x25c: 0xc4, 0x25d: 0xc5, 0x25e: 0xc6, 0x25f: 0xc7, + 0x260: 0xc8, 0x261: 0xc2, 0x262: 0xc3, 0x263: 0xc4, 0x264: 0xc5, 0x265: 0xc6, 0x266: 0xc7, 0x267: 0xc8, + 0x268: 0xc2, 0x269: 0xc3, 0x26a: 0xc4, 0x26b: 0xc5, 0x26c: 0xc6, 0x26d: 0xc7, 0x26e: 0xc8, 0x26f: 0xc2, + 0x270: 0xc3, 0x271: 0xc4, 0x272: 0xc5, 0x273: 0xc6, 0x274: 0xc7, 0x275: 0xc8, 0x276: 0xc2, 0x277: 0xc3, + 0x278: 0xc4, 0x279: 0xc5, 0x27a: 0xc6, 0x27b: 0xc7, 0x27c: 0xc8, 0x27d: 0xc2, 0x27e: 0xc3, 0x27f: 0xc4, + // Block 0xa, offset 0x280 + 0x280: 0xc5, 0x281: 0xc6, 0x282: 0xc7, 0x283: 0xc8, 0x284: 0xc2, 0x285: 0xc3, 0x286: 0xc4, 0x287: 0xc5, + 0x288: 0xc6, 0x289: 0xc7, 0x28a: 0xc8, 0x28b: 0xc2, 0x28c: 0xc3, 0x28d: 0xc4, 0x28e: 0xc5, 0x28f: 0xc6, + 0x290: 0xc7, 0x291: 0xc8, 0x292: 0xc2, 0x293: 0xc3, 0x294: 0xc4, 0x295: 0xc5, 0x296: 0xc6, 0x297: 0xc7, + 0x298: 0xc8, 0x299: 0xc2, 0x29a: 0xc3, 0x29b: 0xc4, 0x29c: 0xc5, 0x29d: 0xc6, 0x29e: 0xc7, 0x29f: 0xc8, + 0x2a0: 0xc2, 0x2a1: 0xc3, 0x2a2: 0xc4, 0x2a3: 0xc5, 0x2a4: 0xc6, 0x2a5: 0xc7, 0x2a6: 0xc8, 0x2a7: 0xc2, + 0x2a8: 0xc3, 0x2a9: 0xc4, 0x2aa: 0xc5, 0x2ab: 0xc6, 0x2ac: 0xc7, 0x2ad: 0xc8, 0x2ae: 0xc2, 0x2af: 0xc3, + 0x2b0: 0xc4, 0x2b1: 0xc5, 0x2b2: 0xc6, 0x2b3: 0xc7, 0x2b4: 0xc8, 0x2b5: 0xc2, 0x2b6: 0xc3, 0x2b7: 0xc4, + 0x2b8: 0xc5, 0x2b9: 0xc6, 0x2ba: 0xc7, 0x2bb: 0xc8, 0x2bc: 0xc2, 0x2bd: 0xc3, 0x2be: 0xc4, 0x2bf: 0xc5, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc6, 0x2c1: 0xc7, 0x2c2: 0xc8, 0x2c3: 0xc2, 0x2c4: 0xc3, 0x2c5: 0xc4, 0x2c6: 0xc5, 0x2c7: 0xc6, + 0x2c8: 0xc7, 0x2c9: 0xc8, 0x2ca: 0xc2, 0x2cb: 0xc3, 0x2cc: 0xc4, 0x2cd: 0xc5, 0x2ce: 0xc6, 0x2cf: 0xc7, + 0x2d0: 0xc8, 0x2d1: 0xc2, 0x2d2: 0xc3, 0x2d3: 0xc4, 0x2d4: 0xc5, 0x2d5: 0xc6, 0x2d6: 0xc7, 0x2d7: 0xc8, + 0x2d8: 0xc2, 0x2d9: 0xc3, 0x2da: 0xc4, 0x2db: 0xc5, 0x2dc: 0xc6, 0x2dd: 0xc7, 0x2de: 0xc9, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xca, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xcb, + 0x34b: 0xcc, 0x34d: 0xcd, + 0x35e: 0x4c, + 0x368: 0xce, 0x36b: 0xcf, + 0x374: 0xd0, + 0x37a: 0xd1, 0x37b: 0xd2, 0x37d: 0xd3, 0x37e: 0xd4, + // Block 0xe, offset 0x380 + 0x381: 0xd5, 0x382: 0xd6, 0x384: 0xd7, 0x385: 0xbc, 0x387: 0xd8, + 0x388: 0xd9, 0x38b: 0xda, 0x38c: 0xdb, 0x38d: 0xdc, + 0x391: 0xdd, 0x392: 0xde, 0x393: 0xdf, 0x396: 0xe0, 0x397: 0xe1, + 0x398: 0xe2, 0x39a: 0xe3, 0x39c: 0xe4, + 0x3a0: 0xe5, 0x3a4: 0xe6, 0x3a5: 0xe7, 0x3a7: 0xe8, + 0x3a8: 0xe9, 0x3a9: 0xea, 0x3aa: 0xeb, + 0x3b0: 0xe2, 0x3b5: 0xec, 0x3b6: 0xed, + 0x3bd: 0xee, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xef, 0x3ec: 0xf0, + 0x3ff: 0xf1, + // Block 0x10, offset 0x400 + 0x432: 0xf2, + // Block 0x11, offset 0x440 + 0x445: 0xf3, 0x446: 0xf4, 0x447: 0xf5, + 0x449: 0xf6, + 0x450: 0xf7, 0x451: 0xf8, 0x452: 0xf9, 0x453: 0xfa, 0x454: 0xfb, 0x455: 0xfc, 0x456: 0xfd, 0x457: 0xfe, + 0x458: 0xff, 0x459: 0x100, 0x45a: 0x4d, 0x45b: 0x101, 0x45c: 0x102, 0x45d: 0x103, 0x45e: 0x104, 0x45f: 0x4e, + // Block 0x12, offset 0x480 + 0x480: 0x4f, 0x481: 0x50, 0x482: 0x105, 0x484: 0xf0, + 0x48a: 0x106, 0x48b: 0x107, + 0x493: 0x108, + 0x4a3: 0x109, 0x4a5: 0x10a, + 0x4b8: 0x51, 0x4b9: 0x52, 0x4ba: 0x53, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x54, 0x4c5: 0x10b, 0x4c6: 0x10c, + 0x4c8: 0x55, 0x4c9: 0x10d, + 0x4ef: 0x10e, + // Block 0x14, offset 0x500 + 0x520: 0x56, 0x521: 0x57, 0x522: 0x58, 0x523: 0x59, 0x524: 0x5a, 0x525: 0x5b, 0x526: 0x5c, 0x527: 0x5d, + 0x528: 0x5e, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 176 entries, 352 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1c, 0x26, 0x36, 0x38, 0x3d, 0x48, 0x57, 0x64, 0x6c, 0x71, 0x76, 0x78, 0x7c, 0x84, 0x8b, 0x8e, 0x96, 0x9a, 0x9e, 0xa0, 0xa2, 0xab, 0xaf, 0xb6, 0xbb, 0xbe, 0xc8, 0xcb, 0xd2, 0xda, 0xde, 0xe0, 0xe4, 0xe8, 0xee, 0xff, 0x10b, 0x10d, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11d, 0x11f, 0x121, 0x124, 0x127, 0x129, 0x12c, 0x12f, 0x133, 0x139, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x174, 0x182, 0x192, 0x1a0, 0x1a7, 0x1ad, 0x1bc, 0x1c0, 0x1c2, 0x1c6, 0x1c8, 0x1cb, 0x1cd, 0x1d0, 0x1d2, 0x1d5, 0x1d7, 0x1d9, 0x1db, 0x1e7, 0x1f1, 0x1fb, 0x1fe, 0x202, 0x204, 0x206, 0x20b, 0x20e, 0x211, 0x213, 0x215, 0x217, 0x219, 0x21f, 0x222, 0x227, 0x229, 0x230, 0x236, 0x23c, 0x244, 0x24a, 0x250, 0x256, 0x25a, 0x25c, 0x25e, 0x260, 0x262, 0x268, 0x26b, 0x26d, 0x26f, 0x271, 0x277, 0x27b, 0x27f, 0x287, 0x28e, 0x291, 0x294, 0x296, 0x299, 0x2a1, 0x2a5, 0x2ac, 0x2af, 0x2b5, 0x2b7, 0x2b9, 0x2bc, 0x2be, 0x2c1, 0x2c6, 0x2c8, 0x2ca, 0x2cc, 0x2ce, 0x2d0, 0x2d3, 0x2d5, 0x2d7, 0x2d9, 0x2db, 0x2dd, 0x2df, 0x2ec, 0x2f6, 0x2f8, 0x2fa, 0x2fe, 0x303, 0x30f, 0x314, 0x31d, 0x323, 0x328, 0x32c, 0x331, 0x335, 0x345, 0x353, 0x361, 0x36f, 0x371, 0x373, 0x375, 0x379, 0x37b, 0x37e, 0x389, 0x38b, 0x395} + +// nfkcSparseValues: 919 entries, 3676 bytes +var nfkcSparseValues = [919]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x43b9, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x43a5, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x439b, lo: 0xb4, hi: 0xb4}, + {value: 0x0260, lo: 0xb5, hi: 0xb5}, + {value: 0x43d2, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x234c, lo: 0xbc, hi: 0xbc}, + {value: 0x2340, lo: 0xbd, hi: 0xbd}, + {value: 0x23e2, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0004, lo: 0x09}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0140, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0179, lo: 0xb4, hi: 0xb4}, + {value: 0x017f, lo: 0xb5, hi: 0xb5}, + {value: 0x018b, lo: 0xb6, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb8}, + // Block 0x3, offset 0x1c + {value: 0x000a, lo: 0x09}, + {value: 0x43af, lo: 0x98, hi: 0x98}, + {value: 0x43b4, lo: 0x99, hi: 0x9a}, + {value: 0x43d7, lo: 0x9b, hi: 0x9b}, + {value: 0x43a0, lo: 0x9c, hi: 0x9c}, + {value: 0x43c3, lo: 0x9d, hi: 0x9d}, + {value: 0x0137, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x01b8, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x26 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x36 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x38 + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3d + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x48 + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x57 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x64 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6c + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x71 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x76 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x78 + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0xf, offset 0x7c + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x84 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x8b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x8e + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x96 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x9a + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x9e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0xa0 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0xa2 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0xab + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0xaf + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xb6 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xbb + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xbe + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xcb + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xd2 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xda + {value: 0x0000, lo: 0x03}, + {value: 0x2751, lo: 0xb3, hi: 0xb3}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xde + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xe0 + {value: 0x0000, lo: 0x03}, + {value: 0x2766, lo: 0xb3, hi: 0xb3}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x23, offset 0xe4 + {value: 0x0000, lo: 0x03}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + {value: 0x2758, lo: 0x9c, hi: 0x9c}, + {value: 0x275f, lo: 0x9d, hi: 0x9d}, + // Block 0x24, offset 0xe8 + {value: 0x0000, lo: 0x05}, + {value: 0x03fe, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xee + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x4735, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x4740, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xff + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0x10b + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0x10d + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0x113 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0x115 + {value: 0x0000, lo: 0x01}, + {value: 0x0402, lo: 0xbc, hi: 0xbc}, + // Block 0x2b, offset 0x117 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x119 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x11b + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x11d + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x11f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x121 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x124 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x127 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x129 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x12c + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x12f + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x133 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x139 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x140 + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x149 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x14b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x14e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x150 + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x15b + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00ec, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00fe, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x166 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x0532, lo: 0x91, hi: 0x91}, + {value: 0x43dc, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x19a0, lo: 0xa5, hi: 0xa5}, + {value: 0x1c8c, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x27c1, lo: 0xb3, hi: 0xb3}, + {value: 0x2935, lo: 0xb4, hi: 0xb4}, + {value: 0x27c8, lo: 0xb6, hi: 0xb6}, + {value: 0x293f, lo: 0xb7, hi: 0xb7}, + {value: 0x199a, lo: 0xbc, hi: 0xbc}, + {value: 0x43aa, lo: 0xbe, hi: 0xbe}, + // Block 0x3f, offset 0x174 + {value: 0x0002, lo: 0x0d}, + {value: 0x1a60, lo: 0x87, hi: 0x87}, + {value: 0x1a5d, lo: 0x88, hi: 0x88}, + {value: 0x199d, lo: 0x89, hi: 0x89}, + {value: 0x2ac5, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x055e, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x40, offset 0x182 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x055e, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x011f, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1ac9, lo: 0xa8, hi: 0xa8}, + // Block 0x41, offset 0x192 + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x42, offset 0x1a0 + {value: 0x0007, lo: 0x06}, + {value: 0x22b0, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x43, offset 0x1a7 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x44, offset 0x1ad + {value: 0x017a, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0x27cf, lo: 0xac, hi: 0xad}, + {value: 0x27d6, lo: 0xaf, hi: 0xaf}, + {value: 0x2953, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x45, offset 0x1bc + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x46, offset 0x1c0 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x47, offset 0x1c2 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x48, offset 0x1c6 + {value: 0x0000, lo: 0x01}, + {value: 0x2ad2, lo: 0x8c, hi: 0x8c}, + // Block 0x49, offset 0x1c8 + {value: 0x0266, lo: 0x02}, + {value: 0x1cbc, lo: 0xb4, hi: 0xb4}, + {value: 0x1a5a, lo: 0xb5, hi: 0xb6}, + // Block 0x4a, offset 0x1cb + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x4b, offset 0x1cd + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4c, offset 0x1d0 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x4d, offset 0x1d2 + {value: 0x0000, lo: 0x02}, + {value: 0x057a, lo: 0xaf, hi: 0xaf}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x1d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x4f, offset 0x1d7 + {value: 0x0000, lo: 0x01}, + {value: 0x0ebe, lo: 0x9f, hi: 0x9f}, + // Block 0x50, offset 0x1d9 + {value: 0x0000, lo: 0x01}, + {value: 0x172a, lo: 0xb3, hi: 0xb3}, + // Block 0x51, offset 0x1db + {value: 0x0004, lo: 0x0b}, + {value: 0x1692, lo: 0x80, hi: 0x82}, + {value: 0x16aa, lo: 0x83, hi: 0x83}, + {value: 0x16c2, lo: 0x84, hi: 0x85}, + {value: 0x16d2, lo: 0x86, hi: 0x89}, + {value: 0x16e6, lo: 0x8a, hi: 0x8c}, + {value: 0x16fa, lo: 0x8d, hi: 0x8d}, + {value: 0x1702, lo: 0x8e, hi: 0x8e}, + {value: 0x170a, lo: 0x8f, hi: 0x90}, + {value: 0x1716, lo: 0x91, hi: 0x93}, + {value: 0x1726, lo: 0x94, hi: 0x94}, + {value: 0x172e, lo: 0x95, hi: 0x95}, + // Block 0x52, offset 0x1e7 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xae}, + {value: 0x8130, lo: 0xaf, hi: 0xaf}, + {value: 0x05ae, lo: 0xb6, hi: 0xb6}, + {value: 0x0982, lo: 0xb8, hi: 0xba}, + // Block 0x53, offset 0x1f1 + {value: 0x0006, lo: 0x09}, + {value: 0x0406, lo: 0xb1, hi: 0xb1}, + {value: 0x040a, lo: 0xb2, hi: 0xb2}, + {value: 0x4b7c, lo: 0xb3, hi: 0xb3}, + {value: 0x040e, lo: 0xb4, hi: 0xb4}, + {value: 0x4b82, lo: 0xb5, hi: 0xb6}, + {value: 0x0412, lo: 0xb7, hi: 0xb7}, + {value: 0x0416, lo: 0xb8, hi: 0xb8}, + {value: 0x041a, lo: 0xb9, hi: 0xb9}, + {value: 0x4b8e, lo: 0xba, hi: 0xbf}, + // Block 0x54, offset 0x1fb + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x55, offset 0x1fe + {value: 0x0000, lo: 0x03}, + {value: 0x02d8, lo: 0x9c, hi: 0x9c}, + {value: 0x02de, lo: 0x9d, hi: 0x9d}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x56, offset 0x202 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x57, offset 0x204 + {value: 0x0000, lo: 0x01}, + {value: 0x173e, lo: 0xb0, hi: 0xb0}, + // Block 0x58, offset 0x206 + {value: 0x0006, lo: 0x04}, + {value: 0x0047, lo: 0xb2, hi: 0xb3}, + {value: 0x0063, lo: 0xb4, hi: 0xb4}, + {value: 0x00dd, lo: 0xb8, hi: 0xb8}, + {value: 0x00e9, lo: 0xb9, hi: 0xb9}, + // Block 0x59, offset 0x20b + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x5a, offset 0x20e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x5b, offset 0x211 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x5c, offset 0x213 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x5d, offset 0x215 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x5e, offset 0x217 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x5f, offset 0x219 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x60, offset 0x21f + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x61, offset 0x222 + {value: 0x000c, lo: 0x04}, + {value: 0x173a, lo: 0x9c, hi: 0x9d}, + {value: 0x014f, lo: 0x9e, hi: 0x9e}, + {value: 0x174a, lo: 0x9f, hi: 0x9f}, + {value: 0x01a6, lo: 0xa9, hi: 0xa9}, + // Block 0x62, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x63, offset 0x229 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x64, offset 0x230 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x65, offset 0x236 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x66, offset 0x23c + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x67, offset 0x244 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x68, offset 0x24a + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x69, offset 0x250 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x6a, offset 0x256 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x6b, offset 0x25a + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6c, offset 0x25c + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x6d, offset 0x25e + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x6e, offset 0x260 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x6f, offset 0x262 + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x268 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x71, offset 0x26b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x72, offset 0x26d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x73, offset 0x26f + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x271 + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x277 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x76, offset 0x27b + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x77, offset 0x27f + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x78, offset 0x287 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x79, offset 0x28e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7a, offset 0x291 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7b, offset 0x294 + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x7c, offset 0x296 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7d, offset 0x299 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x7e, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x7f, offset 0x2a5 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x80, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x81, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x82, offset 0x2b5 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x83, offset 0x2b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x84, offset 0x2b9 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x85, offset 0x2bc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x86, offset 0x2be + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x87, offset 0x2c1 + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x88, offset 0x2c6 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x89, offset 0x2c8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8a, offset 0x2ca + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8b, offset 0x2cc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8c, offset 0x2ce + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x8d, offset 0x2d0 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x8e, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x8f, offset 0x2d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x90, offset 0x2d7 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x91, offset 0x2d9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x92, offset 0x2db + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x93, offset 0x2dd + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x94, offset 0x2df + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x95, offset 0x2ec + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x96, offset 0x2f6 + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x97, offset 0x2f8 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x98, offset 0x2fa + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x99, offset 0x2fe + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x303 + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x9b, offset 0x30f + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x9c, offset 0x314 + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x9d, offset 0x31d + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x9e, offset 0x323 + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x9f, offset 0x328 + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0xa0, offset 0x32c + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0xa1, offset 0x331 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0xa2, offset 0x335 + {value: 0x0003, lo: 0x0f}, + {value: 0x023c, lo: 0x80, hi: 0x80}, + {value: 0x0556, lo: 0x81, hi: 0x81}, + {value: 0x023f, lo: 0x82, hi: 0x9a}, + {value: 0x0552, lo: 0x9b, hi: 0x9b}, + {value: 0x024b, lo: 0x9c, hi: 0x9c}, + {value: 0x0254, lo: 0x9d, hi: 0x9d}, + {value: 0x025a, lo: 0x9e, hi: 0x9e}, + {value: 0x027e, lo: 0x9f, hi: 0x9f}, + {value: 0x026f, lo: 0xa0, hi: 0xa0}, + {value: 0x026c, lo: 0xa1, hi: 0xa1}, + {value: 0x01f7, lo: 0xa2, hi: 0xb2}, + {value: 0x020c, lo: 0xb3, hi: 0xb3}, + {value: 0x022a, lo: 0xb4, hi: 0xba}, + {value: 0x0556, lo: 0xbb, hi: 0xbb}, + {value: 0x023f, lo: 0xbc, hi: 0xbf}, + // Block 0xa3, offset 0x345 + {value: 0x0003, lo: 0x0d}, + {value: 0x024b, lo: 0x80, hi: 0x94}, + {value: 0x0552, lo: 0x95, hi: 0x95}, + {value: 0x024b, lo: 0x96, hi: 0x96}, + {value: 0x0254, lo: 0x97, hi: 0x97}, + {value: 0x025a, lo: 0x98, hi: 0x98}, + {value: 0x027e, lo: 0x99, hi: 0x99}, + {value: 0x026f, lo: 0x9a, hi: 0x9a}, + {value: 0x026c, lo: 0x9b, hi: 0x9b}, + {value: 0x01f7, lo: 0x9c, hi: 0xac}, + {value: 0x020c, lo: 0xad, hi: 0xad}, + {value: 0x022a, lo: 0xae, hi: 0xb4}, + {value: 0x0556, lo: 0xb5, hi: 0xb5}, + {value: 0x023f, lo: 0xb6, hi: 0xbf}, + // Block 0xa4, offset 0x353 + {value: 0x0003, lo: 0x0d}, + {value: 0x025d, lo: 0x80, hi: 0x8e}, + {value: 0x0552, lo: 0x8f, hi: 0x8f}, + {value: 0x024b, lo: 0x90, hi: 0x90}, + {value: 0x0254, lo: 0x91, hi: 0x91}, + {value: 0x025a, lo: 0x92, hi: 0x92}, + {value: 0x027e, lo: 0x93, hi: 0x93}, + {value: 0x026f, lo: 0x94, hi: 0x94}, + {value: 0x026c, lo: 0x95, hi: 0x95}, + {value: 0x01f7, lo: 0x96, hi: 0xa6}, + {value: 0x020c, lo: 0xa7, hi: 0xa7}, + {value: 0x022a, lo: 0xa8, hi: 0xae}, + {value: 0x0556, lo: 0xaf, hi: 0xaf}, + {value: 0x023f, lo: 0xb0, hi: 0xbf}, + // Block 0xa5, offset 0x361 + {value: 0x0003, lo: 0x0d}, + {value: 0x026f, lo: 0x80, hi: 0x88}, + {value: 0x0552, lo: 0x89, hi: 0x89}, + {value: 0x024b, lo: 0x8a, hi: 0x8a}, + {value: 0x0254, lo: 0x8b, hi: 0x8b}, + {value: 0x025a, lo: 0x8c, hi: 0x8c}, + {value: 0x027e, lo: 0x8d, hi: 0x8d}, + {value: 0x026f, lo: 0x8e, hi: 0x8e}, + {value: 0x026c, lo: 0x8f, hi: 0x8f}, + {value: 0x01f7, lo: 0x90, hi: 0xa0}, + {value: 0x020c, lo: 0xa1, hi: 0xa1}, + {value: 0x022a, lo: 0xa2, hi: 0xa8}, + {value: 0x0556, lo: 0xa9, hi: 0xa9}, + {value: 0x023f, lo: 0xaa, hi: 0xbf}, + // Block 0xa6, offset 0x36f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0xa7, offset 0x371 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0xa8, offset 0x373 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0xa9, offset 0x375 + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xaa, offset 0x379 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xab, offset 0x37b + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xac, offset 0x37e + {value: 0x0002, lo: 0x0a}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1a7e, lo: 0x8a, hi: 0x8a}, + {value: 0x1ab1, lo: 0x8b, hi: 0x8b}, + {value: 0x1acc, lo: 0x8c, hi: 0x8c}, + {value: 0x1ad2, lo: 0x8d, hi: 0x8d}, + {value: 0x1cf0, lo: 0x8e, hi: 0x8e}, + {value: 0x1ade, lo: 0x8f, hi: 0x8f}, + {value: 0x1aa8, lo: 0xaa, hi: 0xaa}, + {value: 0x1aab, lo: 0xab, hi: 0xab}, + {value: 0x1aae, lo: 0xac, hi: 0xac}, + // Block 0xad, offset 0x389 + {value: 0x0000, lo: 0x01}, + {value: 0x1a6c, lo: 0x90, hi: 0x90}, + // Block 0xae, offset 0x38b + {value: 0x0028, lo: 0x09}, + {value: 0x2999, lo: 0x80, hi: 0x80}, + {value: 0x295d, lo: 0x81, hi: 0x81}, + {value: 0x2967, lo: 0x82, hi: 0x82}, + {value: 0x297b, lo: 0x83, hi: 0x84}, + {value: 0x2985, lo: 0x85, hi: 0x86}, + {value: 0x2971, lo: 0x87, hi: 0x87}, + {value: 0x298f, lo: 0x88, hi: 0x88}, + {value: 0x0c6a, lo: 0x90, hi: 0x90}, + {value: 0x09e2, lo: 0x91, hi: 0x91}, + // Block 0xaf, offset 0x395 + {value: 0x0002, lo: 0x01}, + {value: 0x0021, lo: 0xb0, hi: 0xb9}, +} + +// recompMap: 7528 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\x7f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\x7f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "\x195\x190\x00\x01\x198" + // 0x19351930: 0x00011938 + "" + // Total size of tables: 56KB (57068 bytes) diff --git a/vendor/golang.org/x/text/unicode/norm/trie.go b/vendor/golang.org/x/text/unicode/norm/trie.go index 423386bf4..e4250ae22 100644 --- a/vendor/golang.org/x/text/unicode/norm/trie.go +++ b/vendor/golang.org/x/text/unicode/norm/trie.go @@ -29,7 +29,7 @@ var ( nfkcData = newNfkcTrie(0) ) -// lookupValue determines the type of block n and looks up the value for b. +// lookup determines the type of block n and looks up the value for b. // For n < t.cutoff, the block is a simple lookup table. Otherwise, the block // is a list of ranges with an accompanying value. Given a matching range r, // the value for b is by r.value + (b - r.lo) * stride. diff --git a/vendor/google.golang.org/protobuf/AUTHORS b/vendor/google.golang.org/protobuf/AUTHORS deleted file mode 100644 index 2b00ddba0..000000000 --- a/vendor/google.golang.org/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/google.golang.org/protobuf/CONTRIBUTORS b/vendor/google.golang.org/protobuf/CONTRIBUTORS deleted file mode 100644 index 1fbd3e976..000000000 --- a/vendor/google.golang.org/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index 179d6e8fc..4921b2d4a 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -17,7 +17,7 @@ import ( "google.golang.org/protobuf/internal/set" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -103,7 +103,7 @@ func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { } // unmarshalMessage unmarshals into the given protoreflect.Message. -func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { +func (d decoder) unmarshalMessage(m protoreflect.Message, checkDelims bool) error { messageDesc := m.Descriptor() if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { return errors.New("no support for proto1 MessageSets") @@ -150,24 +150,24 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { } // Resolve the field descriptor. - var name pref.Name - var fd pref.FieldDescriptor - var xt pref.ExtensionType + var name protoreflect.Name + var fd protoreflect.FieldDescriptor + var xt protoreflect.ExtensionType var xtErr error var isFieldNumberName bool switch tok.NameKind() { case text.IdentName: - name = pref.Name(tok.IdentName()) + name = protoreflect.Name(tok.IdentName()) fd = fieldDescs.ByTextName(string(name)) case text.TypeName: // Handle extensions only. This code path is not for Any. - xt, xtErr = d.opts.Resolver.FindExtensionByName(pref.FullName(tok.TypeName())) + xt, xtErr = d.opts.Resolver.FindExtensionByName(protoreflect.FullName(tok.TypeName())) case text.FieldNumber: isFieldNumberName = true - num := pref.FieldNumber(tok.FieldNumber()) + num := protoreflect.FieldNumber(tok.FieldNumber()) if !num.IsValid() { return d.newError(tok.Pos(), "invalid field number: %d", num) } @@ -215,7 +215,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { switch { case fd.IsList(): kind := fd.Kind() - if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { + if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -232,7 +232,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { default: kind := fd.Kind() - if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { + if kind != protoreflect.MessageKind && kind != protoreflect.GroupKind && !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -262,11 +262,11 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { // unmarshalSingular unmarshals a non-repeated field value specified by the // given FieldDescriptor. -func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error { - var val pref.Value +func (d decoder) unmarshalSingular(fd protoreflect.FieldDescriptor, m protoreflect.Message) error { + var val protoreflect.Value var err error switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: val = m.NewField(fd) err = d.unmarshalMessage(val.Message(), true) default: @@ -280,94 +280,94 @@ func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) erro // unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the // given FieldDescriptor. -func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { +func (d decoder) unmarshalScalar(fd protoreflect.FieldDescriptor) (protoreflect.Value, error) { tok, err := d.Read() if err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } if tok.Kind() != text.Scalar { - return pref.Value{}, d.unexpectedTokenError(tok) + return protoreflect.Value{}, d.unexpectedTokenError(tok) } kind := fd.Kind() switch kind { - case pref.BoolKind: + case protoreflect.BoolKind: if b, ok := tok.Bool(); ok { - return pref.ValueOfBool(b), nil + return protoreflect.ValueOfBool(b), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if n, ok := tok.Int32(); ok { - return pref.ValueOfInt32(n), nil + return protoreflect.ValueOfInt32(n), nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if n, ok := tok.Int64(); ok { - return pref.ValueOfInt64(n), nil + return protoreflect.ValueOfInt64(n), nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if n, ok := tok.Uint32(); ok { - return pref.ValueOfUint32(n), nil + return protoreflect.ValueOfUint32(n), nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if n, ok := tok.Uint64(); ok { - return pref.ValueOfUint64(n), nil + return protoreflect.ValueOfUint64(n), nil } - case pref.FloatKind: + case protoreflect.FloatKind: if n, ok := tok.Float32(); ok { - return pref.ValueOfFloat32(n), nil + return protoreflect.ValueOfFloat32(n), nil } - case pref.DoubleKind: + case protoreflect.DoubleKind: if n, ok := tok.Float64(); ok { - return pref.ValueOfFloat64(n), nil + return protoreflect.ValueOfFloat64(n), nil } - case pref.StringKind: + case protoreflect.StringKind: if s, ok := tok.String(); ok { if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { - return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") + return protoreflect.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") } - return pref.ValueOfString(s), nil + return protoreflect.ValueOfString(s), nil } - case pref.BytesKind: + case protoreflect.BytesKind: if b, ok := tok.String(); ok { - return pref.ValueOfBytes([]byte(b)), nil + return protoreflect.ValueOfBytes([]byte(b)), nil } - case pref.EnumKind: + case protoreflect.EnumKind: if lit, ok := tok.Enum(); ok { // Lookup EnumNumber based on name. - if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil { - return pref.ValueOfEnum(enumVal.Number()), nil + if enumVal := fd.Enum().Values().ByName(protoreflect.Name(lit)); enumVal != nil { + return protoreflect.ValueOfEnum(enumVal.Number()), nil } } if num, ok := tok.Int32(); ok { - return pref.ValueOfEnum(pref.EnumNumber(num)), nil + return protoreflect.ValueOfEnum(protoreflect.EnumNumber(num)), nil } default: panic(fmt.Sprintf("invalid scalar kind %v", kind)) } - return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) + return protoreflect.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) } // unmarshalList unmarshals into given protoreflect.List. A list value can // either be in [] syntax or simply just a single scalar/message value. -func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { +func (d decoder) unmarshalList(fd protoreflect.FieldDescriptor, list protoreflect.List) error { tok, err := d.Peek() if err != nil { return err } switch fd.Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: switch tok.Kind() { case text.ListOpen: d.Read() @@ -441,22 +441,22 @@ func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { // unmarshalMap unmarshals into given protoreflect.Map. A map value is a // textproto message containing {key: , value: }. -func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { +func (d decoder) unmarshalMap(fd protoreflect.FieldDescriptor, mmap protoreflect.Map) error { // Determine ahead whether map entry is a scalar type or a message type in // order to call the appropriate unmarshalMapValue func inside // unmarshalMapEntry. - var unmarshalMapValue func() (pref.Value, error) + var unmarshalMapValue func() (protoreflect.Value, error) switch fd.MapValue().Kind() { - case pref.MessageKind, pref.GroupKind: - unmarshalMapValue = func() (pref.Value, error) { + case protoreflect.MessageKind, protoreflect.GroupKind: + unmarshalMapValue = func() (protoreflect.Value, error) { pval := mmap.NewValue() if err := d.unmarshalMessage(pval.Message(), true); err != nil { - return pref.Value{}, err + return protoreflect.Value{}, err } return pval, nil } default: - unmarshalMapValue = func() (pref.Value, error) { + unmarshalMapValue = func() (protoreflect.Value, error) { return d.unmarshalScalar(fd.MapValue()) } } @@ -494,9 +494,9 @@ func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { // unmarshalMap unmarshals into given protoreflect.Map. A map value is a // textproto message containing {key: , value: }. -func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error { - var key pref.MapKey - var pval pref.Value +func (d decoder) unmarshalMapEntry(fd protoreflect.FieldDescriptor, mmap protoreflect.Map, unmarshalMapValue func() (protoreflect.Value, error)) error { + var key protoreflect.MapKey + var pval protoreflect.Value Loop: for { // Read field name. @@ -520,7 +520,7 @@ Loop: return d.unexpectedTokenError(tok) } - switch name := pref.Name(tok.IdentName()); name { + switch name := protoreflect.Name(tok.IdentName()); name { case genid.MapEntry_Key_field_name: if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") @@ -535,7 +535,7 @@ Loop: key = val.MapKey() case genid.MapEntry_Value_field_name: - if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) { + if kind := fd.MapValue().Kind(); (kind != protoreflect.MessageKind) && (kind != protoreflect.GroupKind) { if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } @@ -561,7 +561,7 @@ Loop: } if !pval.IsValid() { switch fd.MapValue().Kind() { - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: // If value field is not set for message/group types, construct an // empty one as default. pval = mmap.NewValue() @@ -575,7 +575,7 @@ Loop: // unmarshalAny unmarshals an Any textproto. It can either be in expanded form // or non-expanded form. -func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error { +func (d decoder) unmarshalAny(m protoreflect.Message, checkDelims bool) error { var typeURL string var bValue []byte var seenTypeUrl bool @@ -619,7 +619,7 @@ Loop: return d.syntaxError(tok.Pos(), "missing field separator :") } - switch name := pref.Name(tok.IdentName()); name { + switch name := protoreflect.Name(tok.IdentName()); name { case genid.Any_TypeUrl_field_name: if seenTypeUrl { return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname) @@ -686,10 +686,10 @@ Loop: fds := m.Descriptor().Fields() if len(typeURL) > 0 { - m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL)) + m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), protoreflect.ValueOfString(typeURL)) } if len(bValue) > 0 { - m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue)) + m.Set(fds.ByNumber(genid.Any_Value_field_number), protoreflect.ValueOfBytes(bValue)) } return nil } diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index 8d5304dc5..722a7b41d 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -20,7 +20,6 @@ import ( "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -102,13 +101,19 @@ func (o MarshalOptions) Format(m proto.Message) string { // MarshalOptions object. Do not depend on the output being stable. It may // change over time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { - return o.marshal(m) + return o.marshal(nil, m) +} + +// MarshalAppend appends the textproto format encoding of m to b, +// returning the result. +func (o MarshalOptions) MarshalAppend(b []byte, m proto.Message) ([]byte, error) { + return o.marshal(b, m) } // marshal is a centralized function that all marshal operations go through. // For profiling purposes, avoid changing the name of this function or // introducing other code paths for marshal that do not go through this. -func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { +func (o MarshalOptions) marshal(b []byte, m proto.Message) ([]byte, error) { var delims = [2]byte{'{', '}'} if o.Multiline && o.Indent == "" { @@ -118,7 +123,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { o.Resolver = protoregistry.GlobalTypes } - internalEnc, err := text.NewEncoder(o.Indent, delims, o.EmitASCII) + internalEnc, err := text.NewEncoder(b, o.Indent, delims, o.EmitASCII) if err != nil { return nil, err } @@ -126,7 +131,7 @@ func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { // Treat nil message interface as an empty message, // in which case there is nothing to output. if m == nil { - return []byte{}, nil + return b, nil } enc := encoder{internalEnc, o} @@ -150,7 +155,7 @@ type encoder struct { } // marshalMessage marshals the given protoreflect.Message. -func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { +func (e encoder) marshalMessage(m protoreflect.Message, inclDelims bool) error { messageDesc := m.Descriptor() if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { return errors.New("no support for proto1 MessageSets") @@ -190,7 +195,7 @@ func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { } // marshalField marshals the given field with protoreflect.Value. -func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalField(name string, val protoreflect.Value, fd protoreflect.FieldDescriptor) error { switch { case fd.IsList(): return e.marshalList(name, val.List(), fd) @@ -204,40 +209,40 @@ func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescript // marshalSingular marshals the given non-repeated field value. This includes // all scalar types, enums, messages, and groups. -func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { +func (e encoder) marshalSingular(val protoreflect.Value, fd protoreflect.FieldDescriptor) error { kind := fd.Kind() switch kind { - case pref.BoolKind: + case protoreflect.BoolKind: e.WriteBool(val.Bool()) - case pref.StringKind: + case protoreflect.StringKind: s := val.String() if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { return errors.InvalidUTF8(string(fd.FullName())) } e.WriteString(s) - case pref.Int32Kind, pref.Int64Kind, - pref.Sint32Kind, pref.Sint64Kind, - pref.Sfixed32Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Int64Kind, + protoreflect.Sint32Kind, protoreflect.Sint64Kind, + protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: e.WriteInt(val.Int()) - case pref.Uint32Kind, pref.Uint64Kind, - pref.Fixed32Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Uint64Kind, + protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: e.WriteUint(val.Uint()) - case pref.FloatKind: + case protoreflect.FloatKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 32) - case pref.DoubleKind: + case protoreflect.DoubleKind: // Encoder.WriteFloat handles the special numbers NaN and infinites. e.WriteFloat(val.Float(), 64) - case pref.BytesKind: + case protoreflect.BytesKind: e.WriteString(string(val.Bytes())) - case pref.EnumKind: + case protoreflect.EnumKind: num := val.Enum() if desc := fd.Enum().Values().ByNumber(num); desc != nil { e.WriteLiteral(string(desc.Name())) @@ -246,7 +251,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error e.WriteInt(int64(num)) } - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: return e.marshalMessage(val.Message(), true) default: @@ -256,7 +261,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error } // marshalList marshals the given protoreflect.List as multiple name-value fields. -func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescriptor) error { +func (e encoder) marshalList(name string, list protoreflect.List, fd protoreflect.FieldDescriptor) error { size := list.Len() for i := 0; i < size; i++ { e.WriteName(name) @@ -268,9 +273,9 @@ func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescripto } // marshalMap marshals the given protoreflect.Map as multiple name-value fields. -func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor) error { +func (e encoder) marshalMap(name string, mmap protoreflect.Map, fd protoreflect.FieldDescriptor) error { var err error - order.RangeEntries(mmap, order.GenericKeyOrder, func(key pref.MapKey, val pref.Value) bool { + order.RangeEntries(mmap, order.GenericKeyOrder, func(key protoreflect.MapKey, val protoreflect.Value) bool { e.WriteName(name) e.StartMessage() defer e.EndMessage() @@ -334,7 +339,7 @@ func (e encoder) marshalUnknown(b []byte) { // marshalAny marshals the given google.protobuf.Any message in expanded form. // It returns true if it was able to marshal, else false. -func (e encoder) marshalAny(any pref.Message) bool { +func (e encoder) marshalAny(any protoreflect.Message) bool { // Construct the embedded message. fds := any.Descriptor().Fields() fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) diff --git a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go index 9c61112f5..f4b4686cf 100644 --- a/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +++ b/vendor/google.golang.org/protobuf/encoding/protowire/wire.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package protowire parses and formats the raw wire encoding. -// See https://developers.google.com/protocol-buffers/docs/encoding. +// See https://protobuf.dev/programming-guides/encoding. // // For marshaling and unmarshaling entire protobuf messages, // use the "google.golang.org/protobuf/proto" package instead. @@ -29,12 +29,8 @@ const ( ) // IsValid reports whether the field number is semantically valid. -// -// Note that while numbers within the reserved range are semantically invalid, -// they are syntactically valid in the wire format. -// Implementations may treat records with reserved field numbers as unknown. func (n Number) IsValid() bool { - return MinValidNumber <= n && n < FirstReservedNumber || LastReservedNumber < n && n <= MaxValidNumber + return MinValidNumber <= n && n <= MaxValidNumber } // Type represents the wire type. @@ -516,6 +512,7 @@ func EncodeTag(num Number, typ Type) uint64 { } // DecodeZigZag decodes a zig-zag-encoded uint64 as an int64. +// // Input: {…, 5, 3, 1, 0, 2, 4, 6, …} // Output: {…, -3, -2, -1, 0, +1, +2, +3, …} func DecodeZigZag(x uint64) int64 { @@ -523,6 +520,7 @@ func DecodeZigZag(x uint64) int64 { } // EncodeZigZag encodes an int64 as a zig-zag-encoded uint64. +// // Input: {…, -3, -2, -1, 0, +1, +2, +3, …} // Output: {…, 5, 3, 1, 0, 2, 4, 6, …} func EncodeZigZag(x int64) uint64 { @@ -530,6 +528,7 @@ func EncodeZigZag(x int64) uint64 { } // DecodeBool decodes a uint64 as a bool. +// // Input: { 0, 1, 2, …} // Output: {false, true, true, …} func DecodeBool(x uint64) bool { @@ -537,6 +536,7 @@ func DecodeBool(x uint64) bool { } // EncodeBool encodes a bool as a uint64. +// // Input: {false, true} // Output: { 0, 1} func EncodeBool(x bool) uint64 { diff --git a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go index 360c63329..db5248e1b 100644 --- a/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +++ b/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go @@ -14,7 +14,7 @@ import ( "google.golang.org/protobuf/internal/detrand" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type list interface { @@ -30,17 +30,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { if isRoot { var name string switch vs.(type) { - case pref.Names: + case protoreflect.Names: name = "Names" - case pref.FieldNumbers: + case protoreflect.FieldNumbers: name = "FieldNumbers" - case pref.FieldRanges: + case protoreflect.FieldRanges: name = "FieldRanges" - case pref.EnumRanges: + case protoreflect.EnumRanges: name = "EnumRanges" - case pref.FileImports: + case protoreflect.FileImports: name = "FileImports" - case pref.Descriptor: + case protoreflect.Descriptor: name = reflect.ValueOf(vs).MethodByName("Get").Type().Out(0).Name() + "s" default: name = reflect.ValueOf(vs).Elem().Type().Name() @@ -50,17 +50,17 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { var ss []string switch vs := vs.(type) { - case pref.Names: + case protoreflect.Names: for i := 0; i < vs.Len(); i++ { ss = append(ss, fmt.Sprint(vs.Get(i))) } return start + joinStrings(ss, false) + end - case pref.FieldNumbers: + case protoreflect.FieldNumbers: for i := 0; i < vs.Len(); i++ { ss = append(ss, fmt.Sprint(vs.Get(i))) } return start + joinStrings(ss, false) + end - case pref.FieldRanges: + case protoreflect.FieldRanges: for i := 0; i < vs.Len(); i++ { r := vs.Get(i) if r[0]+1 == r[1] { @@ -70,7 +70,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } } return start + joinStrings(ss, false) + end - case pref.EnumRanges: + case protoreflect.EnumRanges: for i := 0; i < vs.Len(); i++ { r := vs.Get(i) if r[0] == r[1] { @@ -80,7 +80,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } } return start + joinStrings(ss, false) + end - case pref.FileImports: + case protoreflect.FileImports: for i := 0; i < vs.Len(); i++ { var rs records rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") @@ -88,11 +88,11 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { } return start + joinStrings(ss, allowMulti) + end default: - _, isEnumValue := vs.(pref.EnumValueDescriptors) + _, isEnumValue := vs.(protoreflect.EnumValueDescriptors) for i := 0; i < vs.Len(); i++ { m := reflect.ValueOf(vs).MethodByName("Get") v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() - ss = append(ss, formatDescOpt(v.(pref.Descriptor), false, allowMulti && !isEnumValue)) + ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue)) } return start + joinStrings(ss, allowMulti && isEnumValue) + end } @@ -106,20 +106,20 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string { // // Using a list allows us to print the accessors in a sensible order. var descriptorAccessors = map[reflect.Type][]string{ - reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, - reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, - reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, - reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt - reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, - reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"}, - reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem(): {"Methods"}, - reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, + reflect.TypeOf((*protoreflect.FileDescriptor)(nil)).Elem(): {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, + reflect.TypeOf((*protoreflect.MessageDescriptor)(nil)).Elem(): {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, + reflect.TypeOf((*protoreflect.FieldDescriptor)(nil)).Elem(): {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, + reflect.TypeOf((*protoreflect.OneofDescriptor)(nil)).Elem(): {"Fields"}, // not directly used; must keep in sync with formatDescOpt + reflect.TypeOf((*protoreflect.EnumDescriptor)(nil)).Elem(): {"Values", "ReservedNames", "ReservedRanges"}, + reflect.TypeOf((*protoreflect.EnumValueDescriptor)(nil)).Elem(): {"Number"}, + reflect.TypeOf((*protoreflect.ServiceDescriptor)(nil)).Elem(): {"Methods"}, + reflect.TypeOf((*protoreflect.MethodDescriptor)(nil)).Elem(): {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, } -func FormatDesc(s fmt.State, r rune, t pref.Descriptor) { +func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) { io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) } -func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { +func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool) string { rv := reflect.ValueOf(t) rt := rv.MethodByName("ProtoType").Type().In(0) @@ -128,7 +128,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { start = rt.Name() + "{" } - _, isFile := t.(pref.FileDescriptor) + _, isFile := t.(protoreflect.FileDescriptor) rs := records{allowMulti: allowMulti} if t.IsPlaceholder() { if isFile { @@ -146,7 +146,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { rs.Append(rv, "Name") } switch t := t.(type) { - case pref.FieldDescriptor: + case protoreflect.FieldDescriptor: for _, s := range descriptorAccessors[rt] { switch s { case "MapKey": @@ -156,9 +156,9 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { case "MapValue": if v := t.MapValue(); v != nil { switch v.Kind() { - case pref.EnumKind: + case protoreflect.EnumKind: rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) default: rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) @@ -180,7 +180,7 @@ func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { rs.Append(rv, s) } } - case pref.OneofDescriptor: + case protoreflect.OneofDescriptor: var ss []string fs := t.Fields() for i := 0; i < fs.Len(); i++ { @@ -216,7 +216,7 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { if !rv.IsValid() { panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) } - if _, ok := rv.Interface().(pref.Value); ok { + if _, ok := rv.Interface().(protoreflect.Value); ok { rv = rv.MethodByName("Interface").Call(nil)[0] if !rv.IsNil() { rv = rv.Elem() @@ -250,9 +250,9 @@ func (rs *records) Append(v reflect.Value, accessors ...string) { switch v := v.(type) { case list: s = formatListOpt(v, false, rs.allowMulti) - case pref.FieldDescriptor, pref.OneofDescriptor, pref.EnumValueDescriptor, pref.MethodDescriptor: - s = string(v.(pref.Descriptor).Name()) - case pref.Descriptor: + case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor: + s = string(v.(protoreflect.Descriptor).Name()) + case protoreflect.Descriptor: s = string(v.FullName()) case string: s = strconv.Quote(v) diff --git a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go index fdd9b13f2..328dc733b 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go @@ -15,8 +15,8 @@ import ( "strconv" ptext "google.golang.org/protobuf/internal/encoding/text" - errors "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/reflect/protoreflect" ) // Format is the serialization format used to represent the default value. @@ -35,56 +35,56 @@ const ( // Unmarshal deserializes the default string s according to the given kind k. // When k is an enum, a list of enum value descriptors must be provided. -func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) (pref.Value, pref.EnumValueDescriptor, error) { +func Unmarshal(s string, k protoreflect.Kind, evs protoreflect.EnumValueDescriptors, f Format) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) { switch k { - case pref.BoolKind: + case protoreflect.BoolKind: if f == GoTag { switch s { case "1": - return pref.ValueOfBool(true), nil, nil + return protoreflect.ValueOfBool(true), nil, nil case "0": - return pref.ValueOfBool(false), nil, nil + return protoreflect.ValueOfBool(false), nil, nil } } else { switch s { case "true": - return pref.ValueOfBool(true), nil, nil + return protoreflect.ValueOfBool(true), nil, nil case "false": - return pref.ValueOfBool(false), nil, nil + return protoreflect.ValueOfBool(false), nil, nil } } - case pref.EnumKind: + case protoreflect.EnumKind: if f == GoTag { // Go tags use the numeric form of the enum value. if n, err := strconv.ParseInt(s, 10, 32); err == nil { - if ev := evs.ByNumber(pref.EnumNumber(n)); ev != nil { - return pref.ValueOfEnum(ev.Number()), ev, nil + if ev := evs.ByNumber(protoreflect.EnumNumber(n)); ev != nil { + return protoreflect.ValueOfEnum(ev.Number()), ev, nil } } } else { // Descriptor default_value use the enum identifier. - ev := evs.ByName(pref.Name(s)) + ev := evs.ByName(protoreflect.Name(s)) if ev != nil { - return pref.ValueOfEnum(ev.Number()), ev, nil + return protoreflect.ValueOfEnum(ev.Number()), ev, nil } } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if v, err := strconv.ParseInt(s, 10, 32); err == nil { - return pref.ValueOfInt32(int32(v)), nil, nil + return protoreflect.ValueOfInt32(int32(v)), nil, nil } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if v, err := strconv.ParseInt(s, 10, 64); err == nil { - return pref.ValueOfInt64(int64(v)), nil, nil + return protoreflect.ValueOfInt64(int64(v)), nil, nil } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if v, err := strconv.ParseUint(s, 10, 32); err == nil { - return pref.ValueOfUint32(uint32(v)), nil, nil + return protoreflect.ValueOfUint32(uint32(v)), nil, nil } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if v, err := strconv.ParseUint(s, 10, 64); err == nil { - return pref.ValueOfUint64(uint64(v)), nil, nil + return protoreflect.ValueOfUint64(uint64(v)), nil, nil } - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: var v float64 var err error switch s { @@ -98,29 +98,29 @@ func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) ( v, err = strconv.ParseFloat(s, 64) } if err == nil { - if k == pref.FloatKind { - return pref.ValueOfFloat32(float32(v)), nil, nil + if k == protoreflect.FloatKind { + return protoreflect.ValueOfFloat32(float32(v)), nil, nil } else { - return pref.ValueOfFloat64(float64(v)), nil, nil + return protoreflect.ValueOfFloat64(float64(v)), nil, nil } } - case pref.StringKind: + case protoreflect.StringKind: // String values are already unescaped and can be used as is. - return pref.ValueOfString(s), nil, nil - case pref.BytesKind: + return protoreflect.ValueOfString(s), nil, nil + case protoreflect.BytesKind: if b, ok := unmarshalBytes(s); ok { - return pref.ValueOfBytes(b), nil, nil + return protoreflect.ValueOfBytes(b), nil, nil } } - return pref.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) + return protoreflect.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) } // Marshal serializes v as the default string according to the given kind k. // When specifying the Descriptor format for an enum kind, the associated // enum value descriptor must be provided. -func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) (string, error) { +func Marshal(v protoreflect.Value, ev protoreflect.EnumValueDescriptor, k protoreflect.Kind, f Format) (string, error) { switch k { - case pref.BoolKind: + case protoreflect.BoolKind: if f == GoTag { if v.Bool() { return "1", nil @@ -134,17 +134,17 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( return "false", nil } } - case pref.EnumKind: + case protoreflect.EnumKind: if f == GoTag { return strconv.FormatInt(int64(v.Enum()), 10), nil } else { return string(ev.Name()), nil } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: return strconv.FormatInt(v.Int(), 10), nil - case pref.Uint32Kind, pref.Fixed32Kind, pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind: return strconv.FormatUint(v.Uint(), 10), nil - case pref.FloatKind, pref.DoubleKind: + case protoreflect.FloatKind, protoreflect.DoubleKind: f := v.Float() switch { case math.IsInf(f, -1): @@ -154,16 +154,16 @@ func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) ( case math.IsNaN(f): return "nan", nil default: - if k == pref.FloatKind { + if k == protoreflect.FloatKind { return strconv.FormatFloat(f, 'g', -1, 32), nil } else { return strconv.FormatFloat(f, 'g', -1, 64), nil } } - case pref.StringKind: + case protoreflect.StringKind: // String values are serialized as is without any escaping. return v.String(), nil - case pref.BytesKind: + case protoreflect.BytesKind: if s, ok := marshalBytes(v.Bytes()); ok { return s, nil } diff --git a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go index c1866f3c1..a6693f0a2 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // The MessageSet wire format is equivalent to a message defined as follows, @@ -33,6 +33,7 @@ const ( // ExtensionName is the field name for extensions of MessageSet. // // A valid MessageSet extension must be of the form: +// // message MyMessage { // extend proto2.bridge.MessageSet { // optional MyMessage message_set_extension = 1234; @@ -42,13 +43,13 @@ const ( const ExtensionName = "message_set_extension" // IsMessageSet returns whether the message uses the MessageSet wire format. -func IsMessageSet(md pref.MessageDescriptor) bool { +func IsMessageSet(md protoreflect.MessageDescriptor) bool { xmd, ok := md.(interface{ IsMessageSet() bool }) return ok && xmd.IsMessageSet() } // IsMessageSetExtension reports this field properly extends a MessageSet. -func IsMessageSetExtension(fd pref.FieldDescriptor) bool { +func IsMessageSetExtension(fd protoreflect.FieldDescriptor) bool { switch { case fd.Name() != ExtensionName: return false diff --git a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go index 38f1931c6..373d20837 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go @@ -11,10 +11,10 @@ import ( "strconv" "strings" - defval "google.golang.org/protobuf/internal/encoding/defval" - fdesc "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/internal/encoding/defval" + "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) var byteType = reflect.TypeOf(byte(0)) @@ -29,9 +29,9 @@ var byteType = reflect.TypeOf(byte(0)) // This does not populate the Enum or Message (except for weak message). // // This function is a best effort attempt; parsing errors are ignored. -func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor { - f := new(fdesc.Field) - f.L0.ParentFile = fdesc.SurrogateProto2 +func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor { + f := new(filedesc.Field) + f.L0.ParentFile = filedesc.SurrogateProto2 for len(tag) > 0 { i := strings.IndexByte(tag, ',') if i < 0 { @@ -39,68 +39,68 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p } switch s := tag[:i]; { case strings.HasPrefix(s, "name="): - f.L0.FullName = pref.FullName(s[len("name="):]) + f.L0.FullName = protoreflect.FullName(s[len("name="):]) case strings.Trim(s, "0123456789") == "": n, _ := strconv.ParseUint(s, 10, 32) - f.L1.Number = pref.FieldNumber(n) + f.L1.Number = protoreflect.FieldNumber(n) case s == "opt": - f.L1.Cardinality = pref.Optional + f.L1.Cardinality = protoreflect.Optional case s == "req": - f.L1.Cardinality = pref.Required + f.L1.Cardinality = protoreflect.Required case s == "rep": - f.L1.Cardinality = pref.Repeated + f.L1.Cardinality = protoreflect.Repeated case s == "varint": switch goType.Kind() { case reflect.Bool: - f.L1.Kind = pref.BoolKind + f.L1.Kind = protoreflect.BoolKind case reflect.Int32: - f.L1.Kind = pref.Int32Kind + f.L1.Kind = protoreflect.Int32Kind case reflect.Int64: - f.L1.Kind = pref.Int64Kind + f.L1.Kind = protoreflect.Int64Kind case reflect.Uint32: - f.L1.Kind = pref.Uint32Kind + f.L1.Kind = protoreflect.Uint32Kind case reflect.Uint64: - f.L1.Kind = pref.Uint64Kind + f.L1.Kind = protoreflect.Uint64Kind } case s == "zigzag32": if goType.Kind() == reflect.Int32 { - f.L1.Kind = pref.Sint32Kind + f.L1.Kind = protoreflect.Sint32Kind } case s == "zigzag64": if goType.Kind() == reflect.Int64 { - f.L1.Kind = pref.Sint64Kind + f.L1.Kind = protoreflect.Sint64Kind } case s == "fixed32": switch goType.Kind() { case reflect.Int32: - f.L1.Kind = pref.Sfixed32Kind + f.L1.Kind = protoreflect.Sfixed32Kind case reflect.Uint32: - f.L1.Kind = pref.Fixed32Kind + f.L1.Kind = protoreflect.Fixed32Kind case reflect.Float32: - f.L1.Kind = pref.FloatKind + f.L1.Kind = protoreflect.FloatKind } case s == "fixed64": switch goType.Kind() { case reflect.Int64: - f.L1.Kind = pref.Sfixed64Kind + f.L1.Kind = protoreflect.Sfixed64Kind case reflect.Uint64: - f.L1.Kind = pref.Fixed64Kind + f.L1.Kind = protoreflect.Fixed64Kind case reflect.Float64: - f.L1.Kind = pref.DoubleKind + f.L1.Kind = protoreflect.DoubleKind } case s == "bytes": switch { case goType.Kind() == reflect.String: - f.L1.Kind = pref.StringKind + f.L1.Kind = protoreflect.StringKind case goType.Kind() == reflect.Slice && goType.Elem() == byteType: - f.L1.Kind = pref.BytesKind + f.L1.Kind = protoreflect.BytesKind default: - f.L1.Kind = pref.MessageKind + f.L1.Kind = protoreflect.MessageKind } case s == "group": - f.L1.Kind = pref.GroupKind + f.L1.Kind = protoreflect.GroupKind case strings.HasPrefix(s, "enum="): - f.L1.Kind = pref.EnumKind + f.L1.Kind = protoreflect.EnumKind case strings.HasPrefix(s, "json="): jsonName := s[len("json="):] if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) { @@ -111,23 +111,23 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p f.L1.IsPacked = true case strings.HasPrefix(s, "weak="): f.L1.IsWeak = true - f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):])) + f.L1.Message = filedesc.PlaceholderMessage(protoreflect.FullName(s[len("weak="):])) case strings.HasPrefix(s, "def="): // The default tag is special in that everything afterwards is the // default regardless of the presence of commas. s, i = tag[len("def="):], len(tag) v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag) - f.L1.Default = fdesc.DefaultValue(v, ev) + f.L1.Default = filedesc.DefaultValue(v, ev) case s == "proto3": - f.L0.ParentFile = fdesc.SurrogateProto3 + f.L0.ParentFile = filedesc.SurrogateProto3 } tag = strings.TrimPrefix(tag[i:], ",") } // The generator uses the group message name instead of the field name. // We obtain the real field name by lowercasing the group name. - if f.L1.Kind == pref.GroupKind { - f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName))) + if f.L1.Kind == protoreflect.GroupKind { + f.L0.FullName = protoreflect.FullName(strings.ToLower(string(f.L0.FullName))) } return f } @@ -140,38 +140,38 @@ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) p // Depending on the context on how Marshal is called, there are different ways // through which that information is determined. As such it is the caller's // responsibility to provide a function to obtain that information. -func Marshal(fd pref.FieldDescriptor, enumName string) string { +func Marshal(fd protoreflect.FieldDescriptor, enumName string) string { var tag []string switch fd.Kind() { - case pref.BoolKind, pref.EnumKind, pref.Int32Kind, pref.Uint32Kind, pref.Int64Kind, pref.Uint64Kind: + case protoreflect.BoolKind, protoreflect.EnumKind, protoreflect.Int32Kind, protoreflect.Uint32Kind, protoreflect.Int64Kind, protoreflect.Uint64Kind: tag = append(tag, "varint") - case pref.Sint32Kind: + case protoreflect.Sint32Kind: tag = append(tag, "zigzag32") - case pref.Sint64Kind: + case protoreflect.Sint64Kind: tag = append(tag, "zigzag64") - case pref.Sfixed32Kind, pref.Fixed32Kind, pref.FloatKind: + case protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind, protoreflect.FloatKind: tag = append(tag, "fixed32") - case pref.Sfixed64Kind, pref.Fixed64Kind, pref.DoubleKind: + case protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind, protoreflect.DoubleKind: tag = append(tag, "fixed64") - case pref.StringKind, pref.BytesKind, pref.MessageKind: + case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind: tag = append(tag, "bytes") - case pref.GroupKind: + case protoreflect.GroupKind: tag = append(tag, "group") } tag = append(tag, strconv.Itoa(int(fd.Number()))) switch fd.Cardinality() { - case pref.Optional: + case protoreflect.Optional: tag = append(tag, "opt") - case pref.Required: + case protoreflect.Required: tag = append(tag, "req") - case pref.Repeated: + case protoreflect.Repeated: tag = append(tag, "rep") } if fd.IsPacked() { tag = append(tag, "packed") } name := string(fd.Name()) - if fd.Kind() == pref.GroupKind { + if fd.Kind() == protoreflect.GroupKind { // The name of the FieldDescriptor for a group field is // lowercased. To find the original capitalization, we // look in the field's MessageType. @@ -189,10 +189,10 @@ func Marshal(fd pref.FieldDescriptor, enumName string) string { // The previous implementation does not tag extension fields as proto3, // even when the field is defined in a proto3 file. Match that behavior // for consistency. - if fd.Syntax() == pref.Proto3 && !fd.IsExtension() { + if fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension() { tag = append(tag, "proto3") } - if fd.Kind() == pref.EnumKind && enumName != "" { + if fd.Kind() == protoreflect.EnumKind && enumName != "" { tag = append(tag, "enum="+enumName) } if fd.ContainingOneof() != nil { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go index 37803773f..87853e786 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go @@ -8,7 +8,6 @@ import ( "bytes" "fmt" "io" - "regexp" "strconv" "unicode/utf8" @@ -413,15 +412,16 @@ func (d *Decoder) parseFieldName() (tok Token, err error) { // Field number. Identify if input is a valid number that is not negative // and is decimal integer within 32-bit range. if num := parseNumber(d.in); num.size > 0 { + str := num.string(d.in) if !num.neg && num.kind == numDec { - if _, err := strconv.ParseInt(string(d.in[:num.size]), 10, 32); err == nil { + if _, err := strconv.ParseInt(str, 10, 32); err == nil { return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil } } - return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size]) + return Token{}, d.newSyntaxError("invalid field number: %s", str) } - return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(d.in)) + return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in)) } // parseTypeName parses Any type URL or extension field name. The name is @@ -571,7 +571,7 @@ func (d *Decoder) parseScalar() (Token, error) { return tok, nil } - return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in)) + return Token{}, d.newSyntaxError("invalid scalar value: %s", errId(d.in)) } // parseLiteralValue parses a literal value. A literal value is used for @@ -653,8 +653,29 @@ func consume(b []byte, n int) []byte { return b } -// Any sequence that looks like a non-delimiter (for error reporting). -var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`) +// errId extracts a byte sequence that looks like an invalid ID +// (for the purposes of error reporting). +func errId(seq []byte) []byte { + const maxLen = 32 + for i := 0; i < len(seq); { + if i > maxLen { + return append(seq[:i:i], "…"...) + } + r, size := utf8.DecodeRune(seq[i:]) + if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) { + if i == 0 { + // Either the first byte is invalid UTF-8 or a + // delimiter, or the first rune is non-ASCII. + // Return it as-is. + i = size + } + return seq[:i:i] + } + i += size + } + // No delimiter found. + return seq +} // isDelim returns true if given byte is a delimiter character. func isDelim(c byte) bool { diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go index f2d90b789..45c81f029 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go @@ -15,17 +15,12 @@ func (d *Decoder) parseNumberValue() (Token, bool) { if num.neg { numAttrs |= isNegative } - strSize := num.size - last := num.size - 1 - if num.kind == numFloat && (d.in[last] == 'f' || d.in[last] == 'F') { - strSize = last - } tok := Token{ kind: Scalar, attrs: numberValue, pos: len(d.orig) - len(d.in), raw: d.in[:num.size], - str: string(d.in[:strSize]), + str: num.string(d.in), numAttrs: numAttrs, } d.consume(num.size) @@ -46,12 +41,35 @@ type number struct { kind uint8 neg bool size int + // if neg, this is the length of whitespace and comments between + // the minus sign and the rest fo the number literal + sep int +} + +func (num number) string(data []byte) string { + strSize := num.size + last := num.size - 1 + if num.kind == numFloat && (data[last] == 'f' || data[last] == 'F') { + strSize = last + } + if num.neg && num.sep > 0 { + // strip whitespace/comments between negative sign and the rest + strLen := strSize - num.sep + str := make([]byte, strLen) + str[0] = data[0] + copy(str[1:], data[num.sep+1:strSize]) + return string(str) + } + return string(data[:strSize]) + } // parseNumber constructs a number object from given input. It allows for the // following patterns: -// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) -// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) +// +// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) +// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) +// // It also returns the number of parsed bytes for the given number, 0 if it is // not a number. func parseNumber(input []byte) number { @@ -65,19 +83,22 @@ func parseNumber(input []byte) number { } // Optional - + var sep int if s[0] == '-' { neg = true s = s[1:] size++ + // Consume any whitespace or comments between the + // negative sign and the rest of the number + lenBefore := len(s) + s = consume(s, 0) + sep = lenBefore - len(s) + size += sep if len(s) == 0 { return number{} } } - // C++ allows for whitespace and comments in between the negative sign and - // the rest of the number. This logic currently does not but is consistent - // with v1. - switch { case s[0] == '0': if len(s) > 1 { @@ -114,7 +135,7 @@ func parseNumber(input []byte) number { if len(s) > 0 && !isDelim(s[0]) { return number{} } - return number{kind: kind, neg: neg, size: size} + return number{kind: kind, neg: neg, size: size, sep: sep} } } s = s[1:] @@ -186,5 +207,5 @@ func parseNumber(input []byte) number { return number{} } - return number{kind: kind, neg: neg, size: size} + return number{kind: kind, neg: neg, size: size, sep: sep} } diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go index 0ce8d6fb8..7ae6c2a3c 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go @@ -24,6 +24,6 @@ // the Go implementation should as well. // // The text format is almost a superset of JSON except: -// * message keys are not quoted strings, but identifiers -// * the top-level value must be a message without the delimiters +// - message keys are not quoted strings, but identifiers +// - the top-level value must be a message without the delimiters package text diff --git a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go index da289ccce..cf7aed77b 100644 --- a/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +++ b/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go @@ -53,8 +53,10 @@ type encoderState struct { // If outputASCII is true, strings will be serialized in such a way that // multi-byte UTF-8 sequences are escaped. This property ensures that the // overall output is ASCII (as opposed to UTF-8). -func NewEncoder(indent string, delims [2]byte, outputASCII bool) (*Encoder, error) { - e := &Encoder{} +func NewEncoder(buf []byte, indent string, delims [2]byte, outputASCII bool) (*Encoder, error) { + e := &Encoder{ + encoderState: encoderState{out: buf}, + } if len(indent) > 0 { if strings.Trim(indent, " \t") != "" { return nil, errors.New("indent may only be composed of space and tab characters") @@ -195,13 +197,13 @@ func appendFloat(out []byte, n float64, bitSize int) []byte { // WriteInt writes out the given signed integer value. func (e *Encoder) WriteInt(n int64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatInt(n, 10)...) + e.out = strconv.AppendInt(e.out, n, 10) } // WriteUint writes out the given unsigned integer value. func (e *Encoder) WriteUint(n uint64) { e.prepareNext(scalar) - e.out = append(e.out, strconv.FormatUint(n, 10)...) + e.out = strconv.AppendUint(e.out, n, 10) } // WriteLiteral writes out the given string as a literal value without quotes. diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/build.go b/vendor/google.golang.org/protobuf/internal/filedesc/build.go index b293b6947..7cac1c190 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/build.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/build.go @@ -12,8 +12,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" ) // Builder construct a protoreflect.FileDescriptor from the raw descriptor. @@ -38,7 +37,7 @@ type Builder struct { // TypeResolver resolves extension field types for descriptor options. // If nil, it uses protoregistry.GlobalTypes. TypeResolver interface { - preg.ExtensionTypeResolver + protoregistry.ExtensionTypeResolver } // FileRegistry is use to lookup file, enum, and message dependencies. @@ -46,8 +45,8 @@ type Builder struct { // If nil, it uses protoregistry.GlobalFiles. FileRegistry interface { FindFileByPath(string) (protoreflect.FileDescriptor, error) - FindDescriptorByName(pref.FullName) (pref.Descriptor, error) - RegisterFile(pref.FileDescriptor) error + FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) + RegisterFile(protoreflect.FileDescriptor) error } } @@ -55,8 +54,8 @@ type Builder struct { // If so, it permits looking up an enum or message dependency based on the // sub-list and element index into filetype.Builder.DependencyIndexes. type resolverByIndex interface { - FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor - FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor + FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor + FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor } // Indexes of each sub-list in filetype.Builder.DependencyIndexes. @@ -70,7 +69,7 @@ const ( // Out is the output of the Builder. type Out struct { - File pref.FileDescriptor + File protoreflect.FileDescriptor // Enums is all enum descriptors in "flattened ordering". Enums []Enum @@ -97,10 +96,10 @@ func (db Builder) Build() (out Out) { // Initialize resolvers and registries if unpopulated. if db.TypeResolver == nil { - db.TypeResolver = preg.GlobalTypes + db.TypeResolver = protoregistry.GlobalTypes } if db.FileRegistry == nil { - db.FileRegistry = preg.GlobalFiles + db.FileRegistry = protoregistry.GlobalFiles } fd := newRawFile(db) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 98ab142ae..7c3689bae 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -17,7 +17,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -43,9 +43,9 @@ type ( L2 *FileL2 } FileL1 struct { - Syntax pref.Syntax + Syntax protoreflect.Syntax Path string - Package pref.FullName + Package protoreflect.FullName Enums Enums Messages Messages @@ -53,36 +53,36 @@ type ( Services Services } FileL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Imports FileImports Locations SourceLocations } ) -func (fd *File) ParentFile() pref.FileDescriptor { return fd } -func (fd *File) Parent() pref.Descriptor { return nil } -func (fd *File) Index() int { return 0 } -func (fd *File) Syntax() pref.Syntax { return fd.L1.Syntax } -func (fd *File) Name() pref.Name { return fd.L1.Package.Name() } -func (fd *File) FullName() pref.FullName { return fd.L1.Package } -func (fd *File) IsPlaceholder() bool { return false } -func (fd *File) Options() pref.ProtoMessage { +func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd } +func (fd *File) Parent() protoreflect.Descriptor { return nil } +func (fd *File) Index() int { return 0 } +func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax } +func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() } +func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package } +func (fd *File) IsPlaceholder() bool { return false } +func (fd *File) Options() protoreflect.ProtoMessage { if f := fd.lazyInit().Options; f != nil { return f() } return descopts.File } -func (fd *File) Path() string { return fd.L1.Path } -func (fd *File) Package() pref.FullName { return fd.L1.Package } -func (fd *File) Imports() pref.FileImports { return &fd.lazyInit().Imports } -func (fd *File) Enums() pref.EnumDescriptors { return &fd.L1.Enums } -func (fd *File) Messages() pref.MessageDescriptors { return &fd.L1.Messages } -func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions } -func (fd *File) Services() pref.ServiceDescriptors { return &fd.L1.Services } -func (fd *File) SourceLocations() pref.SourceLocations { return &fd.lazyInit().Locations } -func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -func (fd *File) ProtoType(pref.FileDescriptor) {} -func (fd *File) ProtoInternal(pragma.DoNotImplement) {} +func (fd *File) Path() string { return fd.L1.Path } +func (fd *File) Package() protoreflect.FullName { return fd.L1.Package } +func (fd *File) Imports() protoreflect.FileImports { return &fd.lazyInit().Imports } +func (fd *File) Enums() protoreflect.EnumDescriptors { return &fd.L1.Enums } +func (fd *File) Messages() protoreflect.MessageDescriptors { return &fd.L1.Messages } +func (fd *File) Extensions() protoreflect.ExtensionDescriptors { return &fd.L1.Extensions } +func (fd *File) Services() protoreflect.ServiceDescriptors { return &fd.L1.Services } +func (fd *File) SourceLocations() protoreflect.SourceLocations { return &fd.lazyInit().Locations } +func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } +func (fd *File) ProtoType(protoreflect.FileDescriptor) {} +func (fd *File) ProtoInternal(pragma.DoNotImplement) {} func (fd *File) lazyInit() *FileL2 { if atomic.LoadUint32(&fd.once) == 0 { @@ -119,7 +119,7 @@ type ( eagerValues bool // controls whether EnumL2.Values is already populated } EnumL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Values EnumValues ReservedNames Names ReservedRanges EnumRanges @@ -130,41 +130,41 @@ type ( L1 EnumValueL1 } EnumValueL1 struct { - Options func() pref.ProtoMessage - Number pref.EnumNumber + Options func() protoreflect.ProtoMessage + Number protoreflect.EnumNumber } ) -func (ed *Enum) Options() pref.ProtoMessage { +func (ed *Enum) Options() protoreflect.ProtoMessage { if f := ed.lazyInit().Options; f != nil { return f() } return descopts.Enum } -func (ed *Enum) Values() pref.EnumValueDescriptors { +func (ed *Enum) Values() protoreflect.EnumValueDescriptors { if ed.L1.eagerValues { return &ed.L2.Values } return &ed.lazyInit().Values } -func (ed *Enum) ReservedNames() pref.Names { return &ed.lazyInit().ReservedNames } -func (ed *Enum) ReservedRanges() pref.EnumRanges { return &ed.lazyInit().ReservedRanges } -func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -func (ed *Enum) ProtoType(pref.EnumDescriptor) {} +func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit().ReservedNames } +func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges } +func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } +func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {} func (ed *Enum) lazyInit() *EnumL2 { ed.L0.ParentFile.lazyInit() // implicitly initializes L2 return ed.L2 } -func (ed *EnumValue) Options() pref.ProtoMessage { +func (ed *EnumValue) Options() protoreflect.ProtoMessage { if f := ed.L1.Options; f != nil { return f() } return descopts.EnumValue } -func (ed *EnumValue) Number() pref.EnumNumber { return ed.L1.Number } -func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } -func (ed *EnumValue) ProtoType(pref.EnumValueDescriptor) {} +func (ed *EnumValue) Number() protoreflect.EnumNumber { return ed.L1.Number } +func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) } +func (ed *EnumValue) ProtoType(protoreflect.EnumValueDescriptor) {} type ( Message struct { @@ -180,14 +180,14 @@ type ( IsMessageSet bool // promoted from google.protobuf.MessageOptions } MessageL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Fields Fields Oneofs Oneofs ReservedNames Names ReservedRanges FieldRanges RequiredNumbers FieldNumbers // must be consistent with Fields.Cardinality ExtensionRanges FieldRanges - ExtensionRangeOptions []func() pref.ProtoMessage // must be same length as ExtensionRanges + ExtensionRangeOptions []func() protoreflect.ProtoMessage // must be same length as ExtensionRanges } Field struct { @@ -195,10 +195,10 @@ type ( L1 FieldL1 } FieldL1 struct { - Options func() pref.ProtoMessage - Number pref.FieldNumber - Cardinality pref.Cardinality // must be consistent with Message.RequiredNumbers - Kind pref.Kind + Options func() protoreflect.ProtoMessage + Number protoreflect.FieldNumber + Cardinality protoreflect.Cardinality // must be consistent with Message.RequiredNumbers + Kind protoreflect.Kind StringName stringName IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto IsWeak bool // promoted from google.protobuf.FieldOptions @@ -207,9 +207,9 @@ type ( HasEnforceUTF8 bool // promoted from google.protobuf.FieldOptions EnforceUTF8 bool // promoted from google.protobuf.FieldOptions Default defaultValue - ContainingOneof pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields - Enum pref.EnumDescriptor - Message pref.MessageDescriptor + ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields + Enum protoreflect.EnumDescriptor + Message protoreflect.MessageDescriptor } Oneof struct { @@ -217,35 +217,35 @@ type ( L1 OneofL1 } OneofL1 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Fields OneofFields // must be consistent with Message.Fields.ContainingOneof } ) -func (md *Message) Options() pref.ProtoMessage { +func (md *Message) Options() protoreflect.ProtoMessage { if f := md.lazyInit().Options; f != nil { return f() } return descopts.Message } -func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } -func (md *Message) Fields() pref.FieldDescriptors { return &md.lazyInit().Fields } -func (md *Message) Oneofs() pref.OneofDescriptors { return &md.lazyInit().Oneofs } -func (md *Message) ReservedNames() pref.Names { return &md.lazyInit().ReservedNames } -func (md *Message) ReservedRanges() pref.FieldRanges { return &md.lazyInit().ReservedRanges } -func (md *Message) RequiredNumbers() pref.FieldNumbers { return &md.lazyInit().RequiredNumbers } -func (md *Message) ExtensionRanges() pref.FieldRanges { return &md.lazyInit().ExtensionRanges } -func (md *Message) ExtensionRangeOptions(i int) pref.ProtoMessage { +func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry } +func (md *Message) Fields() protoreflect.FieldDescriptors { return &md.lazyInit().Fields } +func (md *Message) Oneofs() protoreflect.OneofDescriptors { return &md.lazyInit().Oneofs } +func (md *Message) ReservedNames() protoreflect.Names { return &md.lazyInit().ReservedNames } +func (md *Message) ReservedRanges() protoreflect.FieldRanges { return &md.lazyInit().ReservedRanges } +func (md *Message) RequiredNumbers() protoreflect.FieldNumbers { return &md.lazyInit().RequiredNumbers } +func (md *Message) ExtensionRanges() protoreflect.FieldRanges { return &md.lazyInit().ExtensionRanges } +func (md *Message) ExtensionRangeOptions(i int) protoreflect.ProtoMessage { if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil { return f() } return descopts.ExtensionRange } -func (md *Message) Enums() pref.EnumDescriptors { return &md.L1.Enums } -func (md *Message) Messages() pref.MessageDescriptors { return &md.L1.Messages } -func (md *Message) Extensions() pref.ExtensionDescriptors { return &md.L1.Extensions } -func (md *Message) ProtoType(pref.MessageDescriptor) {} -func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } +func (md *Message) Enums() protoreflect.EnumDescriptors { return &md.L1.Enums } +func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L1.Messages } +func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions } +func (md *Message) ProtoType(protoreflect.MessageDescriptor) {} +func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } func (md *Message) lazyInit() *MessageL2 { md.L0.ParentFile.lazyInit() // implicitly initializes L2 return md.L2 @@ -260,28 +260,28 @@ func (md *Message) IsMessageSet() bool { return md.L1.IsMessageSet } -func (fd *Field) Options() pref.ProtoMessage { +func (fd *Field) Options() protoreflect.ProtoMessage { if f := fd.L1.Options; f != nil { return f() } return descopts.Field } -func (fd *Field) Number() pref.FieldNumber { return fd.L1.Number } -func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality } -func (fd *Field) Kind() pref.Kind { return fd.L1.Kind } -func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } -func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } -func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } +func (fd *Field) Number() protoreflect.FieldNumber { return fd.L1.Number } +func (fd *Field) Cardinality() protoreflect.Cardinality { return fd.L1.Cardinality } +func (fd *Field) Kind() protoreflect.Kind { return fd.L1.Kind } +func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON } +func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) } +func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) } func (fd *Field) HasPresence() bool { - return fd.L1.Cardinality != pref.Repeated && (fd.L0.ParentFile.L1.Syntax == pref.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) + return fd.L1.Cardinality != protoreflect.Repeated && (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) } func (fd *Field) HasOptionalKeyword() bool { - return (fd.L0.ParentFile.L1.Syntax == pref.Proto2 && fd.L1.Cardinality == pref.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional + return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional } func (fd *Field) IsPacked() bool { - if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated { + if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Repeated { switch fd.L1.Kind { - case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind: + case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind: default: return true } @@ -290,40 +290,40 @@ func (fd *Field) IsPacked() bool { } func (fd *Field) IsExtension() bool { return false } func (fd *Field) IsWeak() bool { return fd.L1.IsWeak } -func (fd *Field) IsList() bool { return fd.Cardinality() == pref.Repeated && !fd.IsMap() } +func (fd *Field) IsList() bool { return fd.Cardinality() == protoreflect.Repeated && !fd.IsMap() } func (fd *Field) IsMap() bool { return fd.Message() != nil && fd.Message().IsMapEntry() } -func (fd *Field) MapKey() pref.FieldDescriptor { +func (fd *Field) MapKey() protoreflect.FieldDescriptor { if !fd.IsMap() { return nil } return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) } -func (fd *Field) MapValue() pref.FieldDescriptor { +func (fd *Field) MapValue() protoreflect.FieldDescriptor { if !fd.IsMap() { return nil } return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) } -func (fd *Field) HasDefault() bool { return fd.L1.Default.has } -func (fd *Field) Default() pref.Value { return fd.L1.Default.get(fd) } -func (fd *Field) DefaultEnumValue() pref.EnumValueDescriptor { return fd.L1.Default.enum } -func (fd *Field) ContainingOneof() pref.OneofDescriptor { return fd.L1.ContainingOneof } -func (fd *Field) ContainingMessage() pref.MessageDescriptor { - return fd.L0.Parent.(pref.MessageDescriptor) +func (fd *Field) HasDefault() bool { return fd.L1.Default.has } +func (fd *Field) Default() protoreflect.Value { return fd.L1.Default.get(fd) } +func (fd *Field) DefaultEnumValue() protoreflect.EnumValueDescriptor { return fd.L1.Default.enum } +func (fd *Field) ContainingOneof() protoreflect.OneofDescriptor { return fd.L1.ContainingOneof } +func (fd *Field) ContainingMessage() protoreflect.MessageDescriptor { + return fd.L0.Parent.(protoreflect.MessageDescriptor) } -func (fd *Field) Enum() pref.EnumDescriptor { +func (fd *Field) Enum() protoreflect.EnumDescriptor { return fd.L1.Enum } -func (fd *Field) Message() pref.MessageDescriptor { +func (fd *Field) Message() protoreflect.MessageDescriptor { if fd.L1.IsWeak { if d, _ := protoregistry.GlobalFiles.FindDescriptorByName(fd.L1.Message.FullName()); d != nil { - return d.(pref.MessageDescriptor) + return d.(protoreflect.MessageDescriptor) } } return fd.L1.Message } -func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } -func (fd *Field) ProtoType(pref.FieldDescriptor) {} +func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) } +func (fd *Field) ProtoType(protoreflect.FieldDescriptor) {} // EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8 // validation for the string field. This exists for Google-internal use only @@ -336,21 +336,21 @@ func (fd *Field) EnforceUTF8() bool { if fd.L1.HasEnforceUTF8 { return fd.L1.EnforceUTF8 } - return fd.L0.ParentFile.L1.Syntax == pref.Proto3 + return fd.L0.ParentFile.L1.Syntax == protoreflect.Proto3 } func (od *Oneof) IsSynthetic() bool { - return od.L0.ParentFile.L1.Syntax == pref.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() + return od.L0.ParentFile.L1.Syntax == protoreflect.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() } -func (od *Oneof) Options() pref.ProtoMessage { +func (od *Oneof) Options() protoreflect.ProtoMessage { if f := od.L1.Options; f != nil { return f() } return descopts.Oneof } -func (od *Oneof) Fields() pref.FieldDescriptors { return &od.L1.Fields } -func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } -func (od *Oneof) ProtoType(pref.OneofDescriptor) {} +func (od *Oneof) Fields() protoreflect.FieldDescriptors { return &od.L1.Fields } +func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) } +func (od *Oneof) ProtoType(protoreflect.OneofDescriptor) {} type ( Extension struct { @@ -359,55 +359,57 @@ type ( L2 *ExtensionL2 // protected by fileDesc.once } ExtensionL1 struct { - Number pref.FieldNumber - Extendee pref.MessageDescriptor - Cardinality pref.Cardinality - Kind pref.Kind + Number protoreflect.FieldNumber + Extendee protoreflect.MessageDescriptor + Cardinality protoreflect.Cardinality + Kind protoreflect.Kind } ExtensionL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage StringName stringName IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto IsPacked bool // promoted from google.protobuf.FieldOptions Default defaultValue - Enum pref.EnumDescriptor - Message pref.MessageDescriptor + Enum protoreflect.EnumDescriptor + Message protoreflect.MessageDescriptor } ) -func (xd *Extension) Options() pref.ProtoMessage { +func (xd *Extension) Options() protoreflect.ProtoMessage { if f := xd.lazyInit().Options; f != nil { return f() } return descopts.Field } -func (xd *Extension) Number() pref.FieldNumber { return xd.L1.Number } -func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality } -func (xd *Extension) Kind() pref.Kind { return xd.L1.Kind } -func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } -func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } -func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } -func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != pref.Repeated } +func (xd *Extension) Number() protoreflect.FieldNumber { return xd.L1.Number } +func (xd *Extension) Cardinality() protoreflect.Cardinality { return xd.L1.Cardinality } +func (xd *Extension) Kind() protoreflect.Kind { return xd.L1.Kind } +func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON } +func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) } +func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) } +func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != protoreflect.Repeated } func (xd *Extension) HasOptionalKeyword() bool { - return (xd.L0.ParentFile.L1.Syntax == pref.Proto2 && xd.L1.Cardinality == pref.Optional) || xd.lazyInit().IsProto3Optional -} -func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } -func (xd *Extension) IsExtension() bool { return true } -func (xd *Extension) IsWeak() bool { return false } -func (xd *Extension) IsList() bool { return xd.Cardinality() == pref.Repeated } -func (xd *Extension) IsMap() bool { return false } -func (xd *Extension) MapKey() pref.FieldDescriptor { return nil } -func (xd *Extension) MapValue() pref.FieldDescriptor { return nil } -func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } -func (xd *Extension) Default() pref.Value { return xd.lazyInit().Default.get(xd) } -func (xd *Extension) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().Default.enum } -func (xd *Extension) ContainingOneof() pref.OneofDescriptor { return nil } -func (xd *Extension) ContainingMessage() pref.MessageDescriptor { return xd.L1.Extendee } -func (xd *Extension) Enum() pref.EnumDescriptor { return xd.lazyInit().Enum } -func (xd *Extension) Message() pref.MessageDescriptor { return xd.lazyInit().Message } -func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } -func (xd *Extension) ProtoType(pref.FieldDescriptor) {} -func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} + return (xd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && xd.L1.Cardinality == protoreflect.Optional) || xd.lazyInit().IsProto3Optional +} +func (xd *Extension) IsPacked() bool { return xd.lazyInit().IsPacked } +func (xd *Extension) IsExtension() bool { return true } +func (xd *Extension) IsWeak() bool { return false } +func (xd *Extension) IsList() bool { return xd.Cardinality() == protoreflect.Repeated } +func (xd *Extension) IsMap() bool { return false } +func (xd *Extension) MapKey() protoreflect.FieldDescriptor { return nil } +func (xd *Extension) MapValue() protoreflect.FieldDescriptor { return nil } +func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has } +func (xd *Extension) Default() protoreflect.Value { return xd.lazyInit().Default.get(xd) } +func (xd *Extension) DefaultEnumValue() protoreflect.EnumValueDescriptor { + return xd.lazyInit().Default.enum +} +func (xd *Extension) ContainingOneof() protoreflect.OneofDescriptor { return nil } +func (xd *Extension) ContainingMessage() protoreflect.MessageDescriptor { return xd.L1.Extendee } +func (xd *Extension) Enum() protoreflect.EnumDescriptor { return xd.lazyInit().Enum } +func (xd *Extension) Message() protoreflect.MessageDescriptor { return xd.lazyInit().Message } +func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) } +func (xd *Extension) ProtoType(protoreflect.FieldDescriptor) {} +func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {} func (xd *Extension) lazyInit() *ExtensionL2 { xd.L0.ParentFile.lazyInit() // implicitly initializes L2 return xd.L2 @@ -421,7 +423,7 @@ type ( } ServiceL1 struct{} ServiceL2 struct { - Options func() pref.ProtoMessage + Options func() protoreflect.ProtoMessage Methods Methods } @@ -430,48 +432,48 @@ type ( L1 MethodL1 } MethodL1 struct { - Options func() pref.ProtoMessage - Input pref.MessageDescriptor - Output pref.MessageDescriptor + Options func() protoreflect.ProtoMessage + Input protoreflect.MessageDescriptor + Output protoreflect.MessageDescriptor IsStreamingClient bool IsStreamingServer bool } ) -func (sd *Service) Options() pref.ProtoMessage { +func (sd *Service) Options() protoreflect.ProtoMessage { if f := sd.lazyInit().Options; f != nil { return f() } return descopts.Service } -func (sd *Service) Methods() pref.MethodDescriptors { return &sd.lazyInit().Methods } -func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } -func (sd *Service) ProtoType(pref.ServiceDescriptor) {} -func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} +func (sd *Service) Methods() protoreflect.MethodDescriptors { return &sd.lazyInit().Methods } +func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) } +func (sd *Service) ProtoType(protoreflect.ServiceDescriptor) {} +func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} func (sd *Service) lazyInit() *ServiceL2 { sd.L0.ParentFile.lazyInit() // implicitly initializes L2 return sd.L2 } -func (md *Method) Options() pref.ProtoMessage { +func (md *Method) Options() protoreflect.ProtoMessage { if f := md.L1.Options; f != nil { return f() } return descopts.Method } -func (md *Method) Input() pref.MessageDescriptor { return md.L1.Input } -func (md *Method) Output() pref.MessageDescriptor { return md.L1.Output } -func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } -func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } -func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } -func (md *Method) ProtoType(pref.MethodDescriptor) {} -func (md *Method) ProtoInternal(pragma.DoNotImplement) {} +func (md *Method) Input() protoreflect.MessageDescriptor { return md.L1.Input } +func (md *Method) Output() protoreflect.MessageDescriptor { return md.L1.Output } +func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient } +func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer } +func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) } +func (md *Method) ProtoType(protoreflect.MethodDescriptor) {} +func (md *Method) ProtoInternal(pragma.DoNotImplement) {} // Surrogate files are can be used to create standalone descriptors // where the syntax is only information derived from the parent file. var ( - SurrogateProto2 = &File{L1: FileL1{Syntax: pref.Proto2}, L2: &FileL2{}} - SurrogateProto3 = &File{L1: FileL1{Syntax: pref.Proto3}, L2: &FileL2{}} + SurrogateProto2 = &File{L1: FileL1{Syntax: protoreflect.Proto2}, L2: &FileL2{}} + SurrogateProto3 = &File{L1: FileL1{Syntax: protoreflect.Proto3}, L2: &FileL2{}} ) type ( @@ -479,24 +481,24 @@ type ( L0 BaseL0 } BaseL0 struct { - FullName pref.FullName // must be populated - ParentFile *File // must be populated - Parent pref.Descriptor + FullName protoreflect.FullName // must be populated + ParentFile *File // must be populated + Parent protoreflect.Descriptor Index int } ) -func (d *Base) Name() pref.Name { return d.L0.FullName.Name() } -func (d *Base) FullName() pref.FullName { return d.L0.FullName } -func (d *Base) ParentFile() pref.FileDescriptor { +func (d *Base) Name() protoreflect.Name { return d.L0.FullName.Name() } +func (d *Base) FullName() protoreflect.FullName { return d.L0.FullName } +func (d *Base) ParentFile() protoreflect.FileDescriptor { if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 { return nil // surrogate files are not real parents } return d.L0.ParentFile } -func (d *Base) Parent() pref.Descriptor { return d.L0.Parent } +func (d *Base) Parent() protoreflect.Descriptor { return d.L0.Parent } func (d *Base) Index() int { return d.L0.Index } -func (d *Base) Syntax() pref.Syntax { return d.L0.ParentFile.Syntax() } +func (d *Base) Syntax() protoreflect.Syntax { return d.L0.ParentFile.Syntax() } func (d *Base) IsPlaceholder() bool { return false } func (d *Base) ProtoInternal(pragma.DoNotImplement) {} @@ -513,7 +515,7 @@ func (s *stringName) InitJSON(name string) { s.nameJSON = name } -func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { +func (s *stringName) lazyInit(fd protoreflect.FieldDescriptor) *stringName { s.once.Do(func() { if fd.IsExtension() { // For extensions, JSON and text are formatted the same way. @@ -533,7 +535,7 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { // Format the text name. s.nameText = string(fd.Name()) - if fd.Kind() == pref.GroupKind { + if fd.Kind() == protoreflect.GroupKind { s.nameText = string(fd.Message().Name()) } } @@ -541,10 +543,10 @@ func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { return s } -func (s *stringName) getJSON(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } -func (s *stringName) getText(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameText } +func (s *stringName) getJSON(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } +func (s *stringName) getText(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameText } -func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { +func DefaultValue(v protoreflect.Value, ev protoreflect.EnumValueDescriptor) defaultValue { dv := defaultValue{has: v.IsValid(), val: v, enum: ev} if b, ok := v.Interface().([]byte); ok { // Store a copy of the default bytes, so that we can detect @@ -554,9 +556,9 @@ func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { return dv } -func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) defaultValue { - var evs pref.EnumValueDescriptors - if k == pref.EnumKind { +func unmarshalDefault(b []byte, k protoreflect.Kind, pf *File, ed protoreflect.EnumDescriptor) defaultValue { + var evs protoreflect.EnumValueDescriptors + if k == protoreflect.EnumKind { // If the enum is declared within the same file, be careful not to // blindly call the Values method, lest we bind ourselves in a deadlock. if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf { @@ -567,9 +569,9 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d // If we are unable to resolve the enum dependency, use a placeholder // enum value since we will not be able to parse the default value. - if ed.IsPlaceholder() && pref.Name(b).IsValid() { - v := pref.ValueOfEnum(0) - ev := PlaceholderEnumValue(ed.FullName().Parent().Append(pref.Name(b))) + if ed.IsPlaceholder() && protoreflect.Name(b).IsValid() { + v := protoreflect.ValueOfEnum(0) + ev := PlaceholderEnumValue(ed.FullName().Parent().Append(protoreflect.Name(b))) return DefaultValue(v, ev) } } @@ -583,41 +585,41 @@ func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) d type defaultValue struct { has bool - val pref.Value - enum pref.EnumValueDescriptor + val protoreflect.Value + enum protoreflect.EnumValueDescriptor bytes []byte } -func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value { +func (dv *defaultValue) get(fd protoreflect.FieldDescriptor) protoreflect.Value { // Return the zero value as the default if unpopulated. if !dv.has { - if fd.Cardinality() == pref.Repeated { - return pref.Value{} + if fd.Cardinality() == protoreflect.Repeated { + return protoreflect.Value{} } switch fd.Kind() { - case pref.BoolKind: - return pref.ValueOfBool(false) - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: - return pref.ValueOfInt32(0) - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: - return pref.ValueOfInt64(0) - case pref.Uint32Kind, pref.Fixed32Kind: - return pref.ValueOfUint32(0) - case pref.Uint64Kind, pref.Fixed64Kind: - return pref.ValueOfUint64(0) - case pref.FloatKind: - return pref.ValueOfFloat32(0) - case pref.DoubleKind: - return pref.ValueOfFloat64(0) - case pref.StringKind: - return pref.ValueOfString("") - case pref.BytesKind: - return pref.ValueOfBytes(nil) - case pref.EnumKind: + case protoreflect.BoolKind: + return protoreflect.ValueOfBool(false) + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: + return protoreflect.ValueOfInt32(0) + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: + return protoreflect.ValueOfInt64(0) + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: + return protoreflect.ValueOfUint32(0) + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: + return protoreflect.ValueOfUint64(0) + case protoreflect.FloatKind: + return protoreflect.ValueOfFloat32(0) + case protoreflect.DoubleKind: + return protoreflect.ValueOfFloat64(0) + case protoreflect.StringKind: + return protoreflect.ValueOfString("") + case protoreflect.BytesKind: + return protoreflect.ValueOfBytes(nil) + case protoreflect.EnumKind: if evs := fd.Enum().Values(); evs.Len() > 0 { - return pref.ValueOfEnum(evs.Get(0).Number()) + return protoreflect.ValueOfEnum(evs.Get(0).Number()) } - return pref.ValueOfEnum(0) + return protoreflect.ValueOfEnum(0) } } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go index 66e1fee52..4a1584c9d 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // fileRaw is a data struct used when initializing a file descriptor from @@ -95,7 +95,7 @@ func (fd *File) unmarshalSeed(b []byte) { sb := getBuilder() defer putBuilder(sb) - var prevField pref.FieldNumber + var prevField protoreflect.FieldNumber var numEnums, numMessages, numExtensions, numServices int var posEnums, posMessages, posExtensions, posServices int b0 := b @@ -110,16 +110,16 @@ func (fd *File) unmarshalSeed(b []byte) { case genid.FileDescriptorProto_Syntax_field_number: switch string(v) { case "proto2": - fd.L1.Syntax = pref.Proto2 + fd.L1.Syntax = protoreflect.Proto2 case "proto3": - fd.L1.Syntax = pref.Proto3 + fd.L1.Syntax = protoreflect.Proto3 default: panic("invalid syntax") } case genid.FileDescriptorProto_Name_field_number: fd.L1.Path = sb.MakeString(v) case genid.FileDescriptorProto_Package_field_number: - fd.L1.Package = pref.FullName(sb.MakeString(v)) + fd.L1.Package = protoreflect.FullName(sb.MakeString(v)) case genid.FileDescriptorProto_EnumType_field_number: if prevField != genid.FileDescriptorProto_EnumType_field_number { if numEnums > 0 { @@ -163,7 +163,7 @@ func (fd *File) unmarshalSeed(b []byte) { // If syntax is missing, it is assumed to be proto2. if fd.L1.Syntax == 0 { - fd.L1.Syntax = pref.Proto2 + fd.L1.Syntax = protoreflect.Proto2 } // Must allocate all declarations before parsing each descriptor type @@ -219,7 +219,7 @@ func (fd *File) unmarshalSeed(b []byte) { } } -func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { ed.L0.ParentFile = pf ed.L0.Parent = pd ed.L0.Index = i @@ -271,12 +271,12 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc } } -func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { md.L0.ParentFile = pf md.L0.Parent = pd md.L0.Index = i - var prevField pref.FieldNumber + var prevField protoreflect.FieldNumber var numEnums, numMessages, numExtensions int var posEnums, posMessages, posExtensions int b0 := b @@ -387,7 +387,7 @@ func (md *Message) unmarshalSeedOptions(b []byte) { } } -func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { xd.L0.ParentFile = pf xd.L0.Parent = pd xd.L0.Index = i @@ -401,11 +401,11 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref b = b[m:] switch num { case genid.FieldDescriptorProto_Number_field_number: - xd.L1.Number = pref.FieldNumber(v) + xd.L1.Number = protoreflect.FieldNumber(v) case genid.FieldDescriptorProto_Label_field_number: - xd.L1.Cardinality = pref.Cardinality(v) + xd.L1.Cardinality = protoreflect.Cardinality(v) case genid.FieldDescriptorProto_Type_field_number: - xd.L1.Kind = pref.Kind(v) + xd.L1.Kind = protoreflect.Kind(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -423,7 +423,7 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref } } -func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { sd.L0.ParentFile = pf sd.L0.Parent = pd sd.L0.Index = i @@ -459,13 +459,13 @@ func putBuilder(b *strs.Builder) { // makeFullName converts b to a protoreflect.FullName, // where b must start with a leading dot. -func makeFullName(sb *strs.Builder, b []byte) pref.FullName { +func makeFullName(sb *strs.Builder, b []byte) protoreflect.FullName { if len(b) == 0 || b[0] != '.' { panic("name reference must be fully qualified") } - return pref.FullName(sb.MakeString(b[1:])) + return protoreflect.FullName(sb.MakeString(b[1:])) } -func appendFullName(sb *strs.Builder, prefix pref.FullName, suffix []byte) pref.FullName { - return sb.AppendFullName(prefix, pref.Name(strs.UnsafeString(suffix))) +func appendFullName(sb *strs.Builder, prefix protoreflect.FullName, suffix []byte) protoreflect.FullName { + return sb.AppendFullName(prefix, protoreflect.Name(strs.UnsafeString(suffix))) } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index 198451e3e..736a19a75 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -13,7 +13,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) func (fd *File) lazyRawInit() { @@ -39,10 +39,10 @@ func (file *File) resolveMessages() { // Resolve message field dependency. switch fd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx) depIdx++ } @@ -62,10 +62,10 @@ func (file *File) resolveExtensions() { // Resolve extension field dependency. switch xd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx) depIdx++ } @@ -92,7 +92,7 @@ func (file *File) resolveServices() { } } -func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref.EnumDescriptor { +func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor { r := file.builder.FileRegistry if r, ok := r.(resolverByIndex); ok { if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil { @@ -105,12 +105,12 @@ func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref } } if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil { - return d.(pref.EnumDescriptor) + return d.(protoreflect.EnumDescriptor) } return ed } -func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32) pref.MessageDescriptor { +func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor { r := file.builder.FileRegistry if r, ok := r.(resolverByIndex); ok { if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil { @@ -123,7 +123,7 @@ func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32 } } if d, _ := r.FindDescriptorByName(md.FullName()); d != nil { - return d.(pref.MessageDescriptor) + return d.(protoreflect.MessageDescriptor) } return md } @@ -158,7 +158,7 @@ func (fd *File) unmarshalFull(b []byte) { if imp == nil { imp = PlaceholderFile(path) } - fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp}) + fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp}) case genid.FileDescriptorProto_EnumType_field_number: fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ @@ -199,7 +199,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { case genid.EnumDescriptorProto_Value_field_number: rawValues = append(rawValues, v) case genid.EnumDescriptorProto_ReservedName_field_number: - ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) + ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) case genid.EnumDescriptorProto_ReservedRange_field_number: ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) case genid.EnumDescriptorProto_Options_field_number: @@ -219,7 +219,7 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions) } -func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { +func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -229,9 +229,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { b = b[m:] switch num { case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: - r[0] = pref.EnumNumber(v) + r[0] = protoreflect.EnumNumber(v) case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: - r[1] = pref.EnumNumber(v) + r[1] = protoreflect.EnumNumber(v) } default: m := protowire.ConsumeFieldValue(num, typ, b) @@ -241,7 +241,7 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { return r } -func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { vd.L0.ParentFile = pf vd.L0.Parent = pd vd.L0.Index = i @@ -256,7 +256,7 @@ func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref b = b[m:] switch num { case genid.EnumValueDescriptorProto_Number_field_number: - vd.L1.Number = pref.EnumNumber(v) + vd.L1.Number = protoreflect.EnumNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -294,7 +294,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { case genid.DescriptorProto_OneofDecl_field_number: rawOneofs = append(rawOneofs, v) case genid.DescriptorProto_ReservedName_field_number: - md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) + md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v))) case genid.DescriptorProto_ReservedRange_field_number: md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) case genid.DescriptorProto_ExtensionRange_field_number: @@ -326,7 +326,7 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { for i, b := range rawFields { fd := &md.L2.Fields.List[i] fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i) - if fd.L1.Cardinality == pref.Required { + if fd.L1.Cardinality == protoreflect.Required { md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number) } } @@ -359,7 +359,7 @@ func (md *Message) unmarshalOptions(b []byte) { } } -func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { +func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -369,9 +369,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { b = b[m:] switch num { case genid.DescriptorProto_ReservedRange_Start_field_number: - r[0] = pref.FieldNumber(v) + r[0] = protoreflect.FieldNumber(v) case genid.DescriptorProto_ReservedRange_End_field_number: - r[1] = pref.FieldNumber(v) + r[1] = protoreflect.FieldNumber(v) } default: m := protowire.ConsumeFieldValue(num, typ, b) @@ -381,7 +381,7 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { return r } -func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) { +func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) { for len(b) > 0 { num, typ, n := protowire.ConsumeTag(b) b = b[n:] @@ -391,9 +391,9 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions b = b[m:] switch num { case genid.DescriptorProto_ExtensionRange_Start_field_number: - r[0] = pref.FieldNumber(v) + r[0] = protoreflect.FieldNumber(v) case genid.DescriptorProto_ExtensionRange_End_field_number: - r[1] = pref.FieldNumber(v) + r[1] = protoreflect.FieldNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) @@ -410,7 +410,7 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions return r, rawOptions } -func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { fd.L0.ParentFile = pf fd.L0.Parent = pd fd.L0.Index = i @@ -426,11 +426,11 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des b = b[m:] switch num { case genid.FieldDescriptorProto_Number_field_number: - fd.L1.Number = pref.FieldNumber(v) + fd.L1.Number = protoreflect.FieldNumber(v) case genid.FieldDescriptorProto_Label_field_number: - fd.L1.Cardinality = pref.Cardinality(v) + fd.L1.Cardinality = protoreflect.Cardinality(v) case genid.FieldDescriptorProto_Type_field_number: - fd.L1.Kind = pref.Kind(v) + fd.L1.Kind = protoreflect.Kind(v) case genid.FieldDescriptorProto_OneofIndex_field_number: // In Message.unmarshalFull, we allocate slices for both // the field and oneof descriptors before unmarshaling either @@ -453,7 +453,7 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des case genid.FieldDescriptorProto_JsonName_field_number: fd.L1.StringName.InitJSON(sb.MakeString(v)) case genid.FieldDescriptorProto_DefaultValue_field_number: - fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages + fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v case genid.FieldDescriptorProto_Options_field_number: @@ -468,9 +468,9 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des if rawTypeName != nil { name := makeFullName(sb, rawTypeName) switch fd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: fd.L1.Enum = PlaceholderEnum(name) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: fd.L1.Message = PlaceholderMessage(name) } } @@ -504,7 +504,7 @@ func (fd *Field) unmarshalOptions(b []byte) { } } -func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { od.L0.ParentFile = pf od.L0.Parent = pd od.L0.Index = i @@ -553,7 +553,7 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { case genid.FieldDescriptorProto_JsonName_field_number: xd.L2.StringName.InitJSON(sb.MakeString(v)) case genid.FieldDescriptorProto_DefaultValue_field_number: - xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions + xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v case genid.FieldDescriptorProto_Options_field_number: @@ -568,9 +568,9 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { if rawTypeName != nil { name := makeFullName(sb, rawTypeName) switch xd.L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: xd.L2.Enum = PlaceholderEnum(name) - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: xd.L2.Message = PlaceholderMessage(name) } } @@ -627,7 +627,7 @@ func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions) } -func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { +func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) { md.L0.ParentFile = pf md.L0.Parent = pd md.L0.Index = i @@ -680,18 +680,18 @@ func appendOptions(dst, src []byte) []byte { // // The type of message to unmarshal to is passed as a pointer since the // vars in descopts may not yet be populated at the time this function is called. -func (db *Builder) optionsUnmarshaler(p *pref.ProtoMessage, b []byte) func() pref.ProtoMessage { +func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage { if b == nil { return nil } - var opts pref.ProtoMessage + var opts protoreflect.ProtoMessage var once sync.Once - return func() pref.ProtoMessage { + return func() protoreflect.ProtoMessage { once.Do(func() { if *p == nil { panic("Descriptor.Options called without importing the descriptor package") } - opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(pref.ProtoMessage) + opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage) if err := (proto.UnmarshalOptions{ AllowPartial: true, Resolver: db.TypeResolver, diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go index aa294fff9..e3b6587da 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go @@ -17,31 +17,30 @@ import ( "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" ) -type FileImports []pref.FileImport +type FileImports []protoreflect.FileImport func (p *FileImports) Len() int { return len(*p) } -func (p *FileImports) Get(i int) pref.FileImport { return (*p)[i] } +func (p *FileImports) Get(i int) protoreflect.FileImport { return (*p)[i] } func (p *FileImports) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {} type Names struct { - List []pref.Name + List []protoreflect.Name once sync.Once - has map[pref.Name]int // protected by once + has map[protoreflect.Name]int // protected by once } func (p *Names) Len() int { return len(p.List) } -func (p *Names) Get(i int) pref.Name { return p.List[i] } -func (p *Names) Has(s pref.Name) bool { return p.lazyInit().has[s] > 0 } +func (p *Names) Get(i int) protoreflect.Name { return p.List[i] } +func (p *Names) Has(s protoreflect.Name) bool { return p.lazyInit().has[s] > 0 } func (p *Names) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } func (p *Names) ProtoInternal(pragma.DoNotImplement) {} func (p *Names) lazyInit() *Names { p.once.Do(func() { if len(p.List) > 0 { - p.has = make(map[pref.Name]int, len(p.List)) + p.has = make(map[protoreflect.Name]int, len(p.List)) for _, s := range p.List { p.has[s] = p.has[s] + 1 } @@ -67,14 +66,14 @@ func (p *Names) CheckValid() error { } type EnumRanges struct { - List [][2]pref.EnumNumber // start inclusive; end inclusive + List [][2]protoreflect.EnumNumber // start inclusive; end inclusive once sync.Once - sorted [][2]pref.EnumNumber // protected by once + sorted [][2]protoreflect.EnumNumber // protected by once } -func (p *EnumRanges) Len() int { return len(p.List) } -func (p *EnumRanges) Get(i int) [2]pref.EnumNumber { return p.List[i] } -func (p *EnumRanges) Has(n pref.EnumNumber) bool { +func (p *EnumRanges) Len() int { return len(p.List) } +func (p *EnumRanges) Get(i int) [2]protoreflect.EnumNumber { return p.List[i] } +func (p *EnumRanges) Has(n protoreflect.EnumNumber) bool { for ls := p.lazyInit().sorted; len(ls) > 0; { i := len(ls) / 2 switch r := enumRange(ls[i]); { @@ -129,14 +128,14 @@ func (r enumRange) String() string { } type FieldRanges struct { - List [][2]pref.FieldNumber // start inclusive; end exclusive + List [][2]protoreflect.FieldNumber // start inclusive; end exclusive once sync.Once - sorted [][2]pref.FieldNumber // protected by once + sorted [][2]protoreflect.FieldNumber // protected by once } -func (p *FieldRanges) Len() int { return len(p.List) } -func (p *FieldRanges) Get(i int) [2]pref.FieldNumber { return p.List[i] } -func (p *FieldRanges) Has(n pref.FieldNumber) bool { +func (p *FieldRanges) Len() int { return len(p.List) } +func (p *FieldRanges) Get(i int) [2]protoreflect.FieldNumber { return p.List[i] } +func (p *FieldRanges) Has(n protoreflect.FieldNumber) bool { for ls := p.lazyInit().sorted; len(ls) > 0; { i := len(ls) / 2 switch r := fieldRange(ls[i]); { @@ -221,17 +220,17 @@ func (r fieldRange) String() string { } type FieldNumbers struct { - List []pref.FieldNumber + List []protoreflect.FieldNumber once sync.Once - has map[pref.FieldNumber]struct{} // protected by once + has map[protoreflect.FieldNumber]struct{} // protected by once } -func (p *FieldNumbers) Len() int { return len(p.List) } -func (p *FieldNumbers) Get(i int) pref.FieldNumber { return p.List[i] } -func (p *FieldNumbers) Has(n pref.FieldNumber) bool { +func (p *FieldNumbers) Len() int { return len(p.List) } +func (p *FieldNumbers) Get(i int) protoreflect.FieldNumber { return p.List[i] } +func (p *FieldNumbers) Has(n protoreflect.FieldNumber) bool { p.once.Do(func() { if len(p.List) > 0 { - p.has = make(map[pref.FieldNumber]struct{}, len(p.List)) + p.has = make(map[protoreflect.FieldNumber]struct{}, len(p.List)) for _, n := range p.List { p.has[n] = struct{}{} } @@ -244,30 +243,38 @@ func (p *FieldNumbers) Format(s fmt.State, r rune) { descfmt.FormatList func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {} type OneofFields struct { - List []pref.FieldDescriptor + List []protoreflect.FieldDescriptor once sync.Once - byName map[pref.Name]pref.FieldDescriptor // protected by once - byJSON map[string]pref.FieldDescriptor // protected by once - byText map[string]pref.FieldDescriptor // protected by once - byNum map[pref.FieldNumber]pref.FieldDescriptor // protected by once + byName map[protoreflect.Name]protoreflect.FieldDescriptor // protected by once + byJSON map[string]protoreflect.FieldDescriptor // protected by once + byText map[string]protoreflect.FieldDescriptor // protected by once + byNum map[protoreflect.FieldNumber]protoreflect.FieldDescriptor // protected by once } -func (p *OneofFields) Len() int { return len(p.List) } -func (p *OneofFields) Get(i int) pref.FieldDescriptor { return p.List[i] } -func (p *OneofFields) ByName(s pref.Name) pref.FieldDescriptor { return p.lazyInit().byName[s] } -func (p *OneofFields) ByJSONName(s string) pref.FieldDescriptor { return p.lazyInit().byJSON[s] } -func (p *OneofFields) ByTextName(s string) pref.FieldDescriptor { return p.lazyInit().byText[s] } -func (p *OneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.lazyInit().byNum[n] } -func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } -func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} +func (p *OneofFields) Len() int { return len(p.List) } +func (p *OneofFields) Get(i int) protoreflect.FieldDescriptor { return p.List[i] } +func (p *OneofFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { + return p.lazyInit().byName[s] +} +func (p *OneofFields) ByJSONName(s string) protoreflect.FieldDescriptor { + return p.lazyInit().byJSON[s] +} +func (p *OneofFields) ByTextName(s string) protoreflect.FieldDescriptor { + return p.lazyInit().byText[s] +} +func (p *OneofFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { + return p.lazyInit().byNum[n] +} +func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) } +func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {} func (p *OneofFields) lazyInit() *OneofFields { p.once.Do(func() { if len(p.List) > 0 { - p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.List)) - p.byJSON = make(map[string]pref.FieldDescriptor, len(p.List)) - p.byText = make(map[string]pref.FieldDescriptor, len(p.List)) - p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.List)) + p.byName = make(map[protoreflect.Name]protoreflect.FieldDescriptor, len(p.List)) + p.byJSON = make(map[string]protoreflect.FieldDescriptor, len(p.List)) + p.byText = make(map[string]protoreflect.FieldDescriptor, len(p.List)) + p.byNum = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor, len(p.List)) for _, f := range p.List { // Field names and numbers are guaranteed to be unique. p.byName[f.Name()] = f @@ -284,123 +291,123 @@ type SourceLocations struct { // List is a list of SourceLocations. // The SourceLocation.Next field does not need to be populated // as it will be lazily populated upon first need. - List []pref.SourceLocation + List []protoreflect.SourceLocation // File is the parent file descriptor that these locations are relative to. // If non-nil, ByDescriptor verifies that the provided descriptor // is a child of this file descriptor. - File pref.FileDescriptor + File protoreflect.FileDescriptor once sync.Once byPath map[pathKey]int } -func (p *SourceLocations) Len() int { return len(p.List) } -func (p *SourceLocations) Get(i int) pref.SourceLocation { return p.lazyInit().List[i] } -func (p *SourceLocations) byKey(k pathKey) pref.SourceLocation { +func (p *SourceLocations) Len() int { return len(p.List) } +func (p *SourceLocations) Get(i int) protoreflect.SourceLocation { return p.lazyInit().List[i] } +func (p *SourceLocations) byKey(k pathKey) protoreflect.SourceLocation { if i, ok := p.lazyInit().byPath[k]; ok { return p.List[i] } - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } -func (p *SourceLocations) ByPath(path pref.SourcePath) pref.SourceLocation { +func (p *SourceLocations) ByPath(path protoreflect.SourcePath) protoreflect.SourceLocation { return p.byKey(newPathKey(path)) } -func (p *SourceLocations) ByDescriptor(desc pref.Descriptor) pref.SourceLocation { +func (p *SourceLocations) ByDescriptor(desc protoreflect.Descriptor) protoreflect.SourceLocation { if p.File != nil && desc != nil && p.File != desc.ParentFile() { - return pref.SourceLocation{} // mismatching parent files + return protoreflect.SourceLocation{} // mismatching parent files } var pathArr [16]int32 path := pathArr[:0] for { switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: // Reverse the path since it was constructed in reverse. for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 { path[i], path[j] = path[j], path[i] } return p.byKey(newPathKey(path)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_NestedType_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.FieldDescriptor: - isExtension := desc.(pref.FieldDescriptor).IsExtension() + case protoreflect.FieldDescriptor: + isExtension := desc.(protoreflect.FieldDescriptor).IsExtension() path = append(path, int32(desc.Index())) desc = desc.Parent() if isExtension { switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_Extension_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_Extension_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } else { switch desc.(type) { - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_Field_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } - case pref.OneofDescriptor: + case protoreflect.OneofDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.EnumDescriptor: + case protoreflect.EnumDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number)) - case pref.MessageDescriptor: + case protoreflect.MessageDescriptor: path = append(path, int32(genid.DescriptorProto_EnumType_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.EnumValueDescriptor: + case protoreflect.EnumValueDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.EnumDescriptor: + case protoreflect.EnumDescriptor: path = append(path, int32(genid.EnumDescriptorProto_Value_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.ServiceDescriptor: + case protoreflect.ServiceDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.FileDescriptor: + case protoreflect.FileDescriptor: path = append(path, int32(genid.FileDescriptorProto_Service_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } - case pref.MethodDescriptor: + case protoreflect.MethodDescriptor: path = append(path, int32(desc.Index())) desc = desc.Parent() switch desc.(type) { - case pref.ServiceDescriptor: + case protoreflect.ServiceDescriptor: path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number)) default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } default: - return pref.SourceLocation{} + return protoreflect.SourceLocation{} } } } @@ -435,7 +442,7 @@ type pathKey struct { str string // used if the path does not fit in arr } -func newPathKey(p pref.SourcePath) (k pathKey) { +func newPathKey(p protoreflect.SourcePath) (k pathKey) { if len(p) < len(k.arr) { for i, ps := range p { if ps < 0 || math.MaxUint8 <= ps { diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go index dbf2c605b..28240ebc5 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go @@ -7,7 +7,7 @@ package filedesc import ( "google.golang.org/protobuf/internal/descopts" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) var ( @@ -30,78 +30,80 @@ var ( // PlaceholderFile is a placeholder, representing only the file path. type PlaceholderFile string -func (f PlaceholderFile) ParentFile() pref.FileDescriptor { return f } -func (f PlaceholderFile) Parent() pref.Descriptor { return nil } -func (f PlaceholderFile) Index() int { return 0 } -func (f PlaceholderFile) Syntax() pref.Syntax { return 0 } -func (f PlaceholderFile) Name() pref.Name { return "" } -func (f PlaceholderFile) FullName() pref.FullName { return "" } -func (f PlaceholderFile) IsPlaceholder() bool { return true } -func (f PlaceholderFile) Options() pref.ProtoMessage { return descopts.File } -func (f PlaceholderFile) Path() string { return string(f) } -func (f PlaceholderFile) Package() pref.FullName { return "" } -func (f PlaceholderFile) Imports() pref.FileImports { return emptyFiles } -func (f PlaceholderFile) Messages() pref.MessageDescriptors { return emptyMessages } -func (f PlaceholderFile) Enums() pref.EnumDescriptors { return emptyEnums } -func (f PlaceholderFile) Extensions() pref.ExtensionDescriptors { return emptyExtensions } -func (f PlaceholderFile) Services() pref.ServiceDescriptors { return emptyServices } -func (f PlaceholderFile) SourceLocations() pref.SourceLocations { return emptySourceLocations } -func (f PlaceholderFile) ProtoType(pref.FileDescriptor) { return } -func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } +func (f PlaceholderFile) ParentFile() protoreflect.FileDescriptor { return f } +func (f PlaceholderFile) Parent() protoreflect.Descriptor { return nil } +func (f PlaceholderFile) Index() int { return 0 } +func (f PlaceholderFile) Syntax() protoreflect.Syntax { return 0 } +func (f PlaceholderFile) Name() protoreflect.Name { return "" } +func (f PlaceholderFile) FullName() protoreflect.FullName { return "" } +func (f PlaceholderFile) IsPlaceholder() bool { return true } +func (f PlaceholderFile) Options() protoreflect.ProtoMessage { return descopts.File } +func (f PlaceholderFile) Path() string { return string(f) } +func (f PlaceholderFile) Package() protoreflect.FullName { return "" } +func (f PlaceholderFile) Imports() protoreflect.FileImports { return emptyFiles } +func (f PlaceholderFile) Messages() protoreflect.MessageDescriptors { return emptyMessages } +func (f PlaceholderFile) Enums() protoreflect.EnumDescriptors { return emptyEnums } +func (f PlaceholderFile) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } +func (f PlaceholderFile) Services() protoreflect.ServiceDescriptors { return emptyServices } +func (f PlaceholderFile) SourceLocations() protoreflect.SourceLocations { return emptySourceLocations } +func (f PlaceholderFile) ProtoType(protoreflect.FileDescriptor) { return } +func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderEnum is a placeholder, representing only the full name. -type PlaceholderEnum pref.FullName +type PlaceholderEnum protoreflect.FullName -func (e PlaceholderEnum) ParentFile() pref.FileDescriptor { return nil } -func (e PlaceholderEnum) Parent() pref.Descriptor { return nil } -func (e PlaceholderEnum) Index() int { return 0 } -func (e PlaceholderEnum) Syntax() pref.Syntax { return 0 } -func (e PlaceholderEnum) Name() pref.Name { return pref.FullName(e).Name() } -func (e PlaceholderEnum) FullName() pref.FullName { return pref.FullName(e) } -func (e PlaceholderEnum) IsPlaceholder() bool { return true } -func (e PlaceholderEnum) Options() pref.ProtoMessage { return descopts.Enum } -func (e PlaceholderEnum) Values() pref.EnumValueDescriptors { return emptyEnumValues } -func (e PlaceholderEnum) ReservedNames() pref.Names { return emptyNames } -func (e PlaceholderEnum) ReservedRanges() pref.EnumRanges { return emptyEnumRanges } -func (e PlaceholderEnum) ProtoType(pref.EnumDescriptor) { return } -func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } +func (e PlaceholderEnum) ParentFile() protoreflect.FileDescriptor { return nil } +func (e PlaceholderEnum) Parent() protoreflect.Descriptor { return nil } +func (e PlaceholderEnum) Index() int { return 0 } +func (e PlaceholderEnum) Syntax() protoreflect.Syntax { return 0 } +func (e PlaceholderEnum) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } +func (e PlaceholderEnum) FullName() protoreflect.FullName { return protoreflect.FullName(e) } +func (e PlaceholderEnum) IsPlaceholder() bool { return true } +func (e PlaceholderEnum) Options() protoreflect.ProtoMessage { return descopts.Enum } +func (e PlaceholderEnum) Values() protoreflect.EnumValueDescriptors { return emptyEnumValues } +func (e PlaceholderEnum) ReservedNames() protoreflect.Names { return emptyNames } +func (e PlaceholderEnum) ReservedRanges() protoreflect.EnumRanges { return emptyEnumRanges } +func (e PlaceholderEnum) ProtoType(protoreflect.EnumDescriptor) { return } +func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderEnumValue is a placeholder, representing only the full name. -type PlaceholderEnumValue pref.FullName +type PlaceholderEnumValue protoreflect.FullName -func (e PlaceholderEnumValue) ParentFile() pref.FileDescriptor { return nil } -func (e PlaceholderEnumValue) Parent() pref.Descriptor { return nil } -func (e PlaceholderEnumValue) Index() int { return 0 } -func (e PlaceholderEnumValue) Syntax() pref.Syntax { return 0 } -func (e PlaceholderEnumValue) Name() pref.Name { return pref.FullName(e).Name() } -func (e PlaceholderEnumValue) FullName() pref.FullName { return pref.FullName(e) } -func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } -func (e PlaceholderEnumValue) Options() pref.ProtoMessage { return descopts.EnumValue } -func (e PlaceholderEnumValue) Number() pref.EnumNumber { return 0 } -func (e PlaceholderEnumValue) ProtoType(pref.EnumValueDescriptor) { return } -func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } +func (e PlaceholderEnumValue) ParentFile() protoreflect.FileDescriptor { return nil } +func (e PlaceholderEnumValue) Parent() protoreflect.Descriptor { return nil } +func (e PlaceholderEnumValue) Index() int { return 0 } +func (e PlaceholderEnumValue) Syntax() protoreflect.Syntax { return 0 } +func (e PlaceholderEnumValue) Name() protoreflect.Name { return protoreflect.FullName(e).Name() } +func (e PlaceholderEnumValue) FullName() protoreflect.FullName { return protoreflect.FullName(e) } +func (e PlaceholderEnumValue) IsPlaceholder() bool { return true } +func (e PlaceholderEnumValue) Options() protoreflect.ProtoMessage { return descopts.EnumValue } +func (e PlaceholderEnumValue) Number() protoreflect.EnumNumber { return 0 } +func (e PlaceholderEnumValue) ProtoType(protoreflect.EnumValueDescriptor) { return } +func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } // PlaceholderMessage is a placeholder, representing only the full name. -type PlaceholderMessage pref.FullName +type PlaceholderMessage protoreflect.FullName -func (m PlaceholderMessage) ParentFile() pref.FileDescriptor { return nil } -func (m PlaceholderMessage) Parent() pref.Descriptor { return nil } -func (m PlaceholderMessage) Index() int { return 0 } -func (m PlaceholderMessage) Syntax() pref.Syntax { return 0 } -func (m PlaceholderMessage) Name() pref.Name { return pref.FullName(m).Name() } -func (m PlaceholderMessage) FullName() pref.FullName { return pref.FullName(m) } -func (m PlaceholderMessage) IsPlaceholder() bool { return true } -func (m PlaceholderMessage) Options() pref.ProtoMessage { return descopts.Message } -func (m PlaceholderMessage) IsMapEntry() bool { return false } -func (m PlaceholderMessage) Fields() pref.FieldDescriptors { return emptyFields } -func (m PlaceholderMessage) Oneofs() pref.OneofDescriptors { return emptyOneofs } -func (m PlaceholderMessage) ReservedNames() pref.Names { return emptyNames } -func (m PlaceholderMessage) ReservedRanges() pref.FieldRanges { return emptyFieldRanges } -func (m PlaceholderMessage) RequiredNumbers() pref.FieldNumbers { return emptyFieldNumbers } -func (m PlaceholderMessage) ExtensionRanges() pref.FieldRanges { return emptyFieldRanges } -func (m PlaceholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("index out of range") } -func (m PlaceholderMessage) Messages() pref.MessageDescriptors { return emptyMessages } -func (m PlaceholderMessage) Enums() pref.EnumDescriptors { return emptyEnums } -func (m PlaceholderMessage) Extensions() pref.ExtensionDescriptors { return emptyExtensions } -func (m PlaceholderMessage) ProtoType(pref.MessageDescriptor) { return } -func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } +func (m PlaceholderMessage) ParentFile() protoreflect.FileDescriptor { return nil } +func (m PlaceholderMessage) Parent() protoreflect.Descriptor { return nil } +func (m PlaceholderMessage) Index() int { return 0 } +func (m PlaceholderMessage) Syntax() protoreflect.Syntax { return 0 } +func (m PlaceholderMessage) Name() protoreflect.Name { return protoreflect.FullName(m).Name() } +func (m PlaceholderMessage) FullName() protoreflect.FullName { return protoreflect.FullName(m) } +func (m PlaceholderMessage) IsPlaceholder() bool { return true } +func (m PlaceholderMessage) Options() protoreflect.ProtoMessage { return descopts.Message } +func (m PlaceholderMessage) IsMapEntry() bool { return false } +func (m PlaceholderMessage) Fields() protoreflect.FieldDescriptors { return emptyFields } +func (m PlaceholderMessage) Oneofs() protoreflect.OneofDescriptors { return emptyOneofs } +func (m PlaceholderMessage) ReservedNames() protoreflect.Names { return emptyNames } +func (m PlaceholderMessage) ReservedRanges() protoreflect.FieldRanges { return emptyFieldRanges } +func (m PlaceholderMessage) RequiredNumbers() protoreflect.FieldNumbers { return emptyFieldNumbers } +func (m PlaceholderMessage) ExtensionRanges() protoreflect.FieldRanges { return emptyFieldRanges } +func (m PlaceholderMessage) ExtensionRangeOptions(int) protoreflect.ProtoMessage { + panic("index out of range") +} +func (m PlaceholderMessage) Messages() protoreflect.MessageDescriptors { return emptyMessages } +func (m PlaceholderMessage) Enums() protoreflect.EnumDescriptors { return emptyEnums } +func (m PlaceholderMessage) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions } +func (m PlaceholderMessage) ProtoType(protoreflect.MessageDescriptor) { return } +func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return } diff --git a/vendor/google.golang.org/protobuf/internal/filetype/build.go b/vendor/google.golang.org/protobuf/internal/filetype/build.go index 0a0dd35de..f0e38c4ef 100644 --- a/vendor/google.golang.org/protobuf/internal/filetype/build.go +++ b/vendor/google.golang.org/protobuf/internal/filetype/build.go @@ -10,17 +10,16 @@ import ( "reflect" "google.golang.org/protobuf/internal/descopts" - fdesc "google.golang.org/protobuf/internal/filedesc" + "google.golang.org/protobuf/internal/filedesc" pimpl "google.golang.org/protobuf/internal/impl" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" ) // Builder constructs type descriptors from a raw file descriptor // and associated Go types for each enum and message declaration. // -// -// Flattened Ordering +// # Flattened Ordering // // The protobuf type system represents declarations as a tree. Certain nodes in // the tree require us to either associate it with a concrete Go type or to @@ -52,7 +51,7 @@ import ( // that children themselves may have. type Builder struct { // File is the underlying file descriptor builder. - File fdesc.Builder + File filedesc.Builder // GoTypes is a unique set of the Go types for all declarations and // dependencies. Each type is represented as a zero value of the Go type. @@ -108,22 +107,22 @@ type Builder struct { // TypeRegistry is the registry to register each type descriptor. // If nil, it uses protoregistry.GlobalTypes. TypeRegistry interface { - RegisterMessage(pref.MessageType) error - RegisterEnum(pref.EnumType) error - RegisterExtension(pref.ExtensionType) error + RegisterMessage(protoreflect.MessageType) error + RegisterEnum(protoreflect.EnumType) error + RegisterExtension(protoreflect.ExtensionType) error } } // Out is the output of the builder. type Out struct { - File pref.FileDescriptor + File protoreflect.FileDescriptor } func (tb Builder) Build() (out Out) { // Replace the resolver with one that resolves dependencies by index, // which is faster and more reliable than relying on the global registry. if tb.File.FileRegistry == nil { - tb.File.FileRegistry = preg.GlobalFiles + tb.File.FileRegistry = protoregistry.GlobalFiles } tb.File.FileRegistry = &resolverByIndex{ goTypes: tb.GoTypes, @@ -133,7 +132,7 @@ func (tb Builder) Build() (out Out) { // Initialize registry if unpopulated. if tb.TypeRegistry == nil { - tb.TypeRegistry = preg.GlobalTypes + tb.TypeRegistry = protoregistry.GlobalTypes } fbOut := tb.File.Build() @@ -183,23 +182,23 @@ func (tb Builder) Build() (out Out) { for i := range fbOut.Messages { switch fbOut.Messages[i].Name() { case "FileOptions": - descopts.File = messageGoTypes[i].(pref.ProtoMessage) + descopts.File = messageGoTypes[i].(protoreflect.ProtoMessage) case "EnumOptions": - descopts.Enum = messageGoTypes[i].(pref.ProtoMessage) + descopts.Enum = messageGoTypes[i].(protoreflect.ProtoMessage) case "EnumValueOptions": - descopts.EnumValue = messageGoTypes[i].(pref.ProtoMessage) + descopts.EnumValue = messageGoTypes[i].(protoreflect.ProtoMessage) case "MessageOptions": - descopts.Message = messageGoTypes[i].(pref.ProtoMessage) + descopts.Message = messageGoTypes[i].(protoreflect.ProtoMessage) case "FieldOptions": - descopts.Field = messageGoTypes[i].(pref.ProtoMessage) + descopts.Field = messageGoTypes[i].(protoreflect.ProtoMessage) case "OneofOptions": - descopts.Oneof = messageGoTypes[i].(pref.ProtoMessage) + descopts.Oneof = messageGoTypes[i].(protoreflect.ProtoMessage) case "ExtensionRangeOptions": - descopts.ExtensionRange = messageGoTypes[i].(pref.ProtoMessage) + descopts.ExtensionRange = messageGoTypes[i].(protoreflect.ProtoMessage) case "ServiceOptions": - descopts.Service = messageGoTypes[i].(pref.ProtoMessage) + descopts.Service = messageGoTypes[i].(protoreflect.ProtoMessage) case "MethodOptions": - descopts.Method = messageGoTypes[i].(pref.ProtoMessage) + descopts.Method = messageGoTypes[i].(protoreflect.ProtoMessage) } } } @@ -216,11 +215,11 @@ func (tb Builder) Build() (out Out) { const listExtDeps = 2 var goType reflect.Type switch fbOut.Extensions[i].L1.Kind { - case pref.EnumKind: + case protoreflect.EnumKind: j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) goType = reflect.TypeOf(tb.GoTypes[j]) depIdx++ - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) goType = reflect.TypeOf(tb.GoTypes[j]) depIdx++ @@ -242,22 +241,22 @@ func (tb Builder) Build() (out Out) { return out } -var goTypeForPBKind = map[pref.Kind]reflect.Type{ - pref.BoolKind: reflect.TypeOf(bool(false)), - pref.Int32Kind: reflect.TypeOf(int32(0)), - pref.Sint32Kind: reflect.TypeOf(int32(0)), - pref.Sfixed32Kind: reflect.TypeOf(int32(0)), - pref.Int64Kind: reflect.TypeOf(int64(0)), - pref.Sint64Kind: reflect.TypeOf(int64(0)), - pref.Sfixed64Kind: reflect.TypeOf(int64(0)), - pref.Uint32Kind: reflect.TypeOf(uint32(0)), - pref.Fixed32Kind: reflect.TypeOf(uint32(0)), - pref.Uint64Kind: reflect.TypeOf(uint64(0)), - pref.Fixed64Kind: reflect.TypeOf(uint64(0)), - pref.FloatKind: reflect.TypeOf(float32(0)), - pref.DoubleKind: reflect.TypeOf(float64(0)), - pref.StringKind: reflect.TypeOf(string("")), - pref.BytesKind: reflect.TypeOf([]byte(nil)), +var goTypeForPBKind = map[protoreflect.Kind]reflect.Type{ + protoreflect.BoolKind: reflect.TypeOf(bool(false)), + protoreflect.Int32Kind: reflect.TypeOf(int32(0)), + protoreflect.Sint32Kind: reflect.TypeOf(int32(0)), + protoreflect.Sfixed32Kind: reflect.TypeOf(int32(0)), + protoreflect.Int64Kind: reflect.TypeOf(int64(0)), + protoreflect.Sint64Kind: reflect.TypeOf(int64(0)), + protoreflect.Sfixed64Kind: reflect.TypeOf(int64(0)), + protoreflect.Uint32Kind: reflect.TypeOf(uint32(0)), + protoreflect.Fixed32Kind: reflect.TypeOf(uint32(0)), + protoreflect.Uint64Kind: reflect.TypeOf(uint64(0)), + protoreflect.Fixed64Kind: reflect.TypeOf(uint64(0)), + protoreflect.FloatKind: reflect.TypeOf(float32(0)), + protoreflect.DoubleKind: reflect.TypeOf(float64(0)), + protoreflect.StringKind: reflect.TypeOf(string("")), + protoreflect.BytesKind: reflect.TypeOf([]byte(nil)), } type depIdxs []int32 @@ -274,13 +273,13 @@ type ( fileRegistry } fileRegistry interface { - FindFileByPath(string) (pref.FileDescriptor, error) - FindDescriptorByName(pref.FullName) (pref.Descriptor, error) - RegisterFile(pref.FileDescriptor) error + FindFileByPath(string) (protoreflect.FileDescriptor, error) + FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error) + RegisterFile(protoreflect.FileDescriptor) error } ) -func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.EnumDescriptor { +func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.EnumDescriptor { if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) { return &es[depIdx] } else { @@ -288,7 +287,7 @@ func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdes } } -func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.MessageDescriptor { +func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.MessageDescriptor { if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) { return &ms[depIdx-len(es)] } else { diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go index e3cdf1c20..136f1b215 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -50,6 +50,7 @@ const ( FileDescriptorProto_Options_field_name protoreflect.Name = "options" FileDescriptorProto_SourceCodeInfo_field_name protoreflect.Name = "source_code_info" FileDescriptorProto_Syntax_field_name protoreflect.Name = "syntax" + FileDescriptorProto_Edition_field_name protoreflect.Name = "edition" FileDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.name" FileDescriptorProto_Package_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.package" @@ -63,6 +64,7 @@ const ( FileDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.options" FileDescriptorProto_SourceCodeInfo_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info" FileDescriptorProto_Syntax_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax" + FileDescriptorProto_Edition_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.edition" ) // Field numbers for google.protobuf.FileDescriptorProto. @@ -79,6 +81,7 @@ const ( FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 + FileDescriptorProto_Edition_field_number protoreflect.FieldNumber = 13 ) // Names for google.protobuf.DescriptorProto. @@ -180,13 +183,58 @@ const ( // Field names for google.protobuf.ExtensionRangeOptions. const ( ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + ExtensionRangeOptions_Declaration_field_name protoreflect.Name = "declaration" + ExtensionRangeOptions_Verification_field_name protoreflect.Name = "verification" ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" + ExtensionRangeOptions_Declaration_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.declaration" + ExtensionRangeOptions_Verification_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.verification" ) // Field numbers for google.protobuf.ExtensionRangeOptions. const ( ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + ExtensionRangeOptions_Declaration_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Verification_field_number protoreflect.FieldNumber = 3 +) + +// Full and short names for google.protobuf.ExtensionRangeOptions.VerificationState. +const ( + ExtensionRangeOptions_VerificationState_enum_fullname = "google.protobuf.ExtensionRangeOptions.VerificationState" + ExtensionRangeOptions_VerificationState_enum_name = "VerificationState" +) + +// Names for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_message_name protoreflect.Name = "Declaration" + ExtensionRangeOptions_Declaration_message_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration" +) + +// Field names for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_Number_field_name protoreflect.Name = "number" + ExtensionRangeOptions_Declaration_FullName_field_name protoreflect.Name = "full_name" + ExtensionRangeOptions_Declaration_Type_field_name protoreflect.Name = "type" + ExtensionRangeOptions_Declaration_IsRepeated_field_name protoreflect.Name = "is_repeated" + ExtensionRangeOptions_Declaration_Reserved_field_name protoreflect.Name = "reserved" + ExtensionRangeOptions_Declaration_Repeated_field_name protoreflect.Name = "repeated" + + ExtensionRangeOptions_Declaration_Number_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.number" + ExtensionRangeOptions_Declaration_FullName_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.full_name" + ExtensionRangeOptions_Declaration_Type_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.type" + ExtensionRangeOptions_Declaration_IsRepeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.is_repeated" + ExtensionRangeOptions_Declaration_Reserved_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.reserved" + ExtensionRangeOptions_Declaration_Repeated_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.Declaration.repeated" +) + +// Field numbers for google.protobuf.ExtensionRangeOptions.Declaration. +const ( + ExtensionRangeOptions_Declaration_Number_field_number protoreflect.FieldNumber = 1 + ExtensionRangeOptions_Declaration_FullName_field_number protoreflect.FieldNumber = 2 + ExtensionRangeOptions_Declaration_Type_field_number protoreflect.FieldNumber = 3 + ExtensionRangeOptions_Declaration_IsRepeated_field_number protoreflect.FieldNumber = 4 + ExtensionRangeOptions_Declaration_Reserved_field_number protoreflect.FieldNumber = 5 + ExtensionRangeOptions_Declaration_Repeated_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.FieldDescriptorProto. @@ -494,26 +542,29 @@ const ( // Field names for google.protobuf.MessageOptions. const ( - MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" - MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" - MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" - MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" - MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" + MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" - MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" - MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" - MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" - MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" + MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" + MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts" + MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" ) // Field numbers for google.protobuf.MessageOptions. const ( - MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 - MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 - MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 - MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 - MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 + MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 + MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 + MessageOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 11 + MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) // Names for google.protobuf.FieldOptions. @@ -528,16 +579,26 @@ const ( FieldOptions_Packed_field_name protoreflect.Name = "packed" FieldOptions_Jstype_field_name protoreflect.Name = "jstype" FieldOptions_Lazy_field_name protoreflect.Name = "lazy" + FieldOptions_UnverifiedLazy_field_name protoreflect.Name = "unverified_lazy" FieldOptions_Deprecated_field_name protoreflect.Name = "deprecated" FieldOptions_Weak_field_name protoreflect.Name = "weak" + FieldOptions_DebugRedact_field_name protoreflect.Name = "debug_redact" + FieldOptions_Retention_field_name protoreflect.Name = "retention" + FieldOptions_Target_field_name protoreflect.Name = "target" + FieldOptions_Targets_field_name protoreflect.Name = "targets" FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" FieldOptions_Packed_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.packed" FieldOptions_Jstype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.jstype" FieldOptions_Lazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.lazy" + FieldOptions_UnverifiedLazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.unverified_lazy" FieldOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.deprecated" FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" + FieldOptions_DebugRedact_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.debug_redact" + FieldOptions_Retention_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.retention" + FieldOptions_Target_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.target" + FieldOptions_Targets_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.targets" FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" ) @@ -547,8 +608,13 @@ const ( FieldOptions_Packed_field_number protoreflect.FieldNumber = 2 FieldOptions_Jstype_field_number protoreflect.FieldNumber = 6 FieldOptions_Lazy_field_number protoreflect.FieldNumber = 5 + FieldOptions_UnverifiedLazy_field_number protoreflect.FieldNumber = 15 FieldOptions_Deprecated_field_number protoreflect.FieldNumber = 3 FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 + FieldOptions_DebugRedact_field_number protoreflect.FieldNumber = 16 + FieldOptions_Retention_field_number protoreflect.FieldNumber = 17 + FieldOptions_Target_field_number protoreflect.FieldNumber = 18 + FieldOptions_Targets_field_number protoreflect.FieldNumber = 19 FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) @@ -564,6 +630,18 @@ const ( FieldOptions_JSType_enum_name = "JSType" ) +// Full and short names for google.protobuf.FieldOptions.OptionRetention. +const ( + FieldOptions_OptionRetention_enum_fullname = "google.protobuf.FieldOptions.OptionRetention" + FieldOptions_OptionRetention_enum_name = "OptionRetention" +) + +// Full and short names for google.protobuf.FieldOptions.OptionTargetType. +const ( + FieldOptions_OptionTargetType_enum_fullname = "google.protobuf.FieldOptions.OptionTargetType" + FieldOptions_OptionTargetType_enum_name = "OptionTargetType" +) + // Names for google.protobuf.OneofOptions. const ( OneofOptions_message_name protoreflect.Name = "OneofOptions" @@ -590,20 +668,23 @@ const ( // Field names for google.protobuf.EnumOptions. const ( - EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" - EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" - EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" + EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_name protoreflect.Name = "deprecated_legacy_json_field_conflicts" + EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" - EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" - EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" - EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" + EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" + EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts" + EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" ) // Field numbers for google.protobuf.EnumOptions. const ( - EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 - EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 - EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 + EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 + EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + EnumOptions_DeprecatedLegacyJsonFieldConflicts_field_number protoreflect.FieldNumber = 6 + EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 ) // Names for google.protobuf.EnumValueOptions. @@ -813,11 +894,13 @@ const ( GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file" GeneratedCodeInfo_Annotation_Begin_field_name protoreflect.Name = "begin" GeneratedCodeInfo_Annotation_End_field_name protoreflect.Name = "end" + GeneratedCodeInfo_Annotation_Semantic_field_name protoreflect.Name = "semantic" GeneratedCodeInfo_Annotation_Path_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path" GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file" GeneratedCodeInfo_Annotation_Begin_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin" GeneratedCodeInfo_Annotation_End_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end" + GeneratedCodeInfo_Annotation_Semantic_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.semantic" ) // Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. @@ -826,4 +909,11 @@ const ( GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2 GeneratedCodeInfo_Annotation_Begin_field_number protoreflect.FieldNumber = 3 GeneratedCodeInfo_Annotation_End_field_number protoreflect.FieldNumber = 4 + GeneratedCodeInfo_Annotation_Semantic_field_number protoreflect.FieldNumber = 5 +) + +// Full and short names for google.protobuf.GeneratedCodeInfo.Annotation.Semantic. +const ( + GeneratedCodeInfo_Annotation_Semantic_enum_fullname = "google.protobuf.GeneratedCodeInfo.Annotation.Semantic" + GeneratedCodeInfo_Annotation_Semantic_enum_name = "Semantic" ) diff --git a/vendor/google.golang.org/protobuf/internal/genid/type_gen.go b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go index 3bc710138..e0f75fea0 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go @@ -32,6 +32,7 @@ const ( Type_Options_field_name protoreflect.Name = "options" Type_SourceContext_field_name protoreflect.Name = "source_context" Type_Syntax_field_name protoreflect.Name = "syntax" + Type_Edition_field_name protoreflect.Name = "edition" Type_Name_field_fullname protoreflect.FullName = "google.protobuf.Type.name" Type_Fields_field_fullname protoreflect.FullName = "google.protobuf.Type.fields" @@ -39,6 +40,7 @@ const ( Type_Options_field_fullname protoreflect.FullName = "google.protobuf.Type.options" Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context" Type_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Type.syntax" + Type_Edition_field_fullname protoreflect.FullName = "google.protobuf.Type.edition" ) // Field numbers for google.protobuf.Type. @@ -49,6 +51,7 @@ const ( Type_Options_field_number protoreflect.FieldNumber = 4 Type_SourceContext_field_number protoreflect.FieldNumber = 5 Type_Syntax_field_number protoreflect.FieldNumber = 6 + Type_Edition_field_number protoreflect.FieldNumber = 7 ) // Names for google.protobuf.Field. @@ -121,12 +124,14 @@ const ( Enum_Options_field_name protoreflect.Name = "options" Enum_SourceContext_field_name protoreflect.Name = "source_context" Enum_Syntax_field_name protoreflect.Name = "syntax" + Enum_Edition_field_name protoreflect.Name = "edition" Enum_Name_field_fullname protoreflect.FullName = "google.protobuf.Enum.name" Enum_Enumvalue_field_fullname protoreflect.FullName = "google.protobuf.Enum.enumvalue" Enum_Options_field_fullname protoreflect.FullName = "google.protobuf.Enum.options" Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context" Enum_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Enum.syntax" + Enum_Edition_field_fullname protoreflect.FullName = "google.protobuf.Enum.edition" ) // Field numbers for google.protobuf.Enum. @@ -136,6 +141,7 @@ const ( Enum_Options_field_number protoreflect.FieldNumber = 3 Enum_SourceContext_field_number protoreflect.FieldNumber = 4 Enum_Syntax_field_number protoreflect.FieldNumber = 5 + Enum_Edition_field_number protoreflect.FieldNumber = 6 ) // Names for google.protobuf.EnumValue. diff --git a/vendor/google.golang.org/protobuf/internal/impl/api_export.go b/vendor/google.golang.org/protobuf/internal/impl/api_export.go index abee5f30e..a371f98de 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/api_export.go +++ b/vendor/google.golang.org/protobuf/internal/impl/api_export.go @@ -12,8 +12,8 @@ import ( "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // Export is a zero-length named type that exists only to export a set of @@ -32,11 +32,11 @@ type enum = interface{} // EnumOf returns the protoreflect.Enum interface over e. // It returns nil if e is nil. -func (Export) EnumOf(e enum) pref.Enum { +func (Export) EnumOf(e enum) protoreflect.Enum { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e default: return legacyWrapEnum(reflect.ValueOf(e)) @@ -45,11 +45,11 @@ func (Export) EnumOf(e enum) pref.Enum { // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. // It returns nil if e is nil. -func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { +func (Export) EnumDescriptorOf(e enum) protoreflect.EnumDescriptor { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e.Descriptor() default: return LegacyLoadEnumDesc(reflect.TypeOf(e)) @@ -58,11 +58,11 @@ func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { // EnumTypeOf returns the protoreflect.EnumType for e. // It returns nil if e is nil. -func (Export) EnumTypeOf(e enum) pref.EnumType { +func (Export) EnumTypeOf(e enum) protoreflect.EnumType { switch e := e.(type) { case nil: return nil - case pref.Enum: + case protoreflect.Enum: return e.Type() default: return legacyLoadEnumType(reflect.TypeOf(e)) @@ -71,7 +71,7 @@ func (Export) EnumTypeOf(e enum) pref.EnumType { // EnumStringOf returns the enum value as a string, either as the name if // the number is resolvable, or the number formatted as a string. -func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { +func (Export) EnumStringOf(ed protoreflect.EnumDescriptor, n protoreflect.EnumNumber) string { ev := ed.Values().ByNumber(n) if ev != nil { return string(ev.Name()) @@ -84,7 +84,7 @@ func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { type message = interface{} // legacyMessageWrapper wraps a v2 message as a v1 message. -type legacyMessageWrapper struct{ m pref.ProtoMessage } +type legacyMessageWrapper struct{ m protoreflect.ProtoMessage } func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) } func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } @@ -92,30 +92,30 @@ func (m legacyMessageWrapper) ProtoMessage() {} // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. // It returns nil if m is nil. -func (Export) ProtoMessageV1Of(m message) piface.MessageV1 { +func (Export) ProtoMessageV1Of(m message) protoiface.MessageV1 { switch mv := m.(type) { case nil: return nil - case piface.MessageV1: + case protoiface.MessageV1: return mv case unwrapper: return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) - case pref.ProtoMessage: + case protoreflect.ProtoMessage: return legacyMessageWrapper{mv} default: panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) } } -func (Export) protoMessageV2Of(m message) pref.ProtoMessage { +func (Export) protoMessageV2Of(m message) protoreflect.ProtoMessage { switch mv := m.(type) { case nil: return nil - case pref.ProtoMessage: + case protoreflect.ProtoMessage: return mv case legacyMessageWrapper: return mv.m - case piface.MessageV1: + case protoiface.MessageV1: return nil default: panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) @@ -124,7 +124,7 @@ func (Export) protoMessageV2Of(m message) pref.ProtoMessage { // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. // It returns nil if m is nil. -func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { +func (Export) ProtoMessageV2Of(m message) protoreflect.ProtoMessage { if m == nil { return nil } @@ -136,7 +136,7 @@ func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { // MessageOf returns the protoreflect.Message interface over m. // It returns nil if m is nil. -func (Export) MessageOf(m message) pref.Message { +func (Export) MessageOf(m message) protoreflect.Message { if m == nil { return nil } @@ -148,7 +148,7 @@ func (Export) MessageOf(m message) pref.Message { // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. // It returns nil if m is nil. -func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { +func (Export) MessageDescriptorOf(m message) protoreflect.MessageDescriptor { if m == nil { return nil } @@ -160,7 +160,7 @@ func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { // MessageTypeOf returns the protoreflect.MessageType for m. // It returns nil if m is nil. -func (Export) MessageTypeOf(m message) pref.MessageType { +func (Export) MessageTypeOf(m message) protoreflect.MessageType { if m == nil { return nil } @@ -172,6 +172,6 @@ func (Export) MessageTypeOf(m message) pref.MessageType { // MessageStringOf returns the message value as a string, // which is the message serialized in the protobuf text format. -func (Export) MessageStringOf(m pref.ProtoMessage) string { +func (Export) MessageStringOf(m protoreflect.ProtoMessage) string { return prototext.MarshalOptions{Multiline: false}.Format(m) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go index b82341e57..bff041edc 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +++ b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go @@ -8,18 +8,18 @@ import ( "sync" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) -func (mi *MessageInfo) checkInitialized(in piface.CheckInitializedInput) (piface.CheckInitializedOutput, error) { +func (mi *MessageInfo) checkInitialized(in protoiface.CheckInitializedInput) (protoiface.CheckInitializedOutput, error) { var p pointer if ms, ok := in.Message.(*messageState); ok { p = ms.pointer() } else { p = in.Message.(*messageReflectWrapper).pointer() } - return piface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) + return protoiface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) } func (mi *MessageInfo) checkInitializedPointer(p pointer) error { @@ -90,7 +90,7 @@ var ( // needsInitCheck reports whether a message needs to be checked for partial initialization. // // It returns true if the message transitively includes any required or extension fields. -func needsInitCheck(md pref.MessageDescriptor) bool { +func needsInitCheck(md protoreflect.MessageDescriptor) bool { if v, ok := needsInitCheckMap.Load(md); ok { if has, ok := v.(bool); ok { return has @@ -101,7 +101,7 @@ func needsInitCheck(md pref.MessageDescriptor) bool { return needsInitCheckLocked(md) } -func needsInitCheckLocked(md pref.MessageDescriptor) (has bool) { +func needsInitCheckLocked(md protoreflect.MessageDescriptor) (has bool) { if v, ok := needsInitCheckMap.Load(md); ok { // If has is true, we've previously determined that this message // needs init checks. diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go index 08d35170b..e74cefdc5 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type extensionFieldInfo struct { @@ -23,7 +23,7 @@ type extensionFieldInfo struct { var legacyExtensionFieldInfoCache sync.Map // map[protoreflect.ExtensionType]*extensionFieldInfo -func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { +func getExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { if xi, ok := xt.(*ExtensionInfo); ok { xi.lazyInit() return xi.info @@ -32,7 +32,7 @@ func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { } // legacyLoadExtensionFieldInfo dynamically loads a *ExtensionInfo for xt. -func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { +func legacyLoadExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo { if xi, ok := legacyExtensionFieldInfoCache.Load(xt); ok { return xi.(*extensionFieldInfo) } @@ -43,7 +43,7 @@ func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { return e } -func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { +func makeExtensionFieldInfo(xd protoreflect.ExtensionDescriptor) *extensionFieldInfo { var wiretag uint64 if !xd.IsPacked() { wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()]) @@ -59,10 +59,10 @@ func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { // This is true for composite types, where we pass in a message, list, or map to fill in, // and for enums, where we pass in a prototype value to specify the concrete enum type. switch xd.Kind() { - case pref.MessageKind, pref.GroupKind, pref.EnumKind: + case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.EnumKind: e.unmarshalNeedsValue = true default: - if xd.Cardinality() == pref.Repeated { + if xd.Cardinality() == protoreflect.Repeated { e.unmarshalNeedsValue = true } } @@ -73,21 +73,21 @@ type lazyExtensionValue struct { atomicOnce uint32 // atomically set if value is valid mu sync.Mutex xi *extensionFieldInfo - value pref.Value + value protoreflect.Value b []byte - fn func() pref.Value + fn func() protoreflect.Value } type ExtensionField struct { - typ pref.ExtensionType + typ protoreflect.ExtensionType // value is either the value of GetValue, // or a *lazyExtensionValue that then returns the value of GetValue. - value pref.Value + value protoreflect.Value lazy *lazyExtensionValue } -func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { +func (f *ExtensionField) appendLazyBytes(xt protoreflect.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { if f.lazy == nil { f.lazy = &lazyExtensionValue{xi: xi} } @@ -97,7 +97,7 @@ func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFie f.lazy.b = append(f.lazy.b, b...) } -func (f *ExtensionField) canLazy(xt pref.ExtensionType) bool { +func (f *ExtensionField) canLazy(xt protoreflect.ExtensionType) bool { if f.typ == nil { return true } @@ -154,7 +154,7 @@ func (f *ExtensionField) lazyInit() { // Set sets the type and value of the extension field. // This must not be called concurrently. -func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { +func (f *ExtensionField) Set(t protoreflect.ExtensionType, v protoreflect.Value) { f.typ = t f.value = v f.lazy = nil @@ -162,14 +162,14 @@ func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { // SetLazy sets the type and a value that is to be lazily evaluated upon first use. // This must not be called concurrently. -func (f *ExtensionField) SetLazy(t pref.ExtensionType, fn func() pref.Value) { +func (f *ExtensionField) SetLazy(t protoreflect.ExtensionType, fn func() protoreflect.Value) { f.typ = t f.lazy = &lazyExtensionValue{fn: fn} } // Value returns the value of the extension field. // This may be called concurrently. -func (f *ExtensionField) Value() pref.Value { +func (f *ExtensionField) Value() protoreflect.Value { if f.lazy != nil { if atomic.LoadUint32(&f.lazy.atomicOnce) == 0 { f.lazyInit() @@ -181,7 +181,7 @@ func (f *ExtensionField) Value() pref.Value { // Type returns the type of the extension field. // This may be called concurrently. -func (f ExtensionField) Type() pref.ExtensionType { +func (f ExtensionField) Type() protoreflect.ExtensionType { return f.typ } @@ -193,7 +193,7 @@ func (f ExtensionField) IsSet() bool { // IsLazy reports whether a field is lazily encoded. // It is exported for testing. -func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { +func IsLazy(m protoreflect.Message, fd protoreflect.FieldDescriptor) bool { var mi *MessageInfo var p pointer switch m := m.(type) { @@ -206,7 +206,7 @@ func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { default: return false } - xd, ok := fd.(pref.ExtensionTypeDescriptor) + xd, ok := fd.(protoreflect.ExtensionTypeDescriptor) if !ok { return false } diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go index cb4b482d1..3fadd241e 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_field.go @@ -12,9 +12,9 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) type errInvalidUTF8 struct{} @@ -30,7 +30,7 @@ func (errInvalidUTF8) Unwrap() error { return errors.Error } // to the appropriate field-specific function as necessary. // // The unmarshal function is set on each field individually as usual. -func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structInfo) { +func (mi *MessageInfo) initOneofFieldCoders(od protoreflect.OneofDescriptor, si structInfo) { fs := si.oneofsByName[od.Name()] ft := fs.Type oneofFields := make(map[reflect.Type]*coderFieldInfo) @@ -118,13 +118,13 @@ func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structIn } } -func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { +func makeWeakMessageFieldCoder(fd protoreflect.FieldDescriptor) pointerCoderFuncs { var once sync.Once - var messageType pref.MessageType + var messageType protoreflect.MessageType lazyInit := func() { once.Do(func() { messageName := fd.Message().FullName() - messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) + messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) }) } @@ -190,7 +190,7 @@ func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { } } -func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ size: sizeMessageInfo, @@ -280,7 +280,7 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh if n < 0 { return out, errDecode } - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: m.ProtoReflect(), }) @@ -288,27 +288,27 @@ func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarsh return out, err } out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } -func sizeMessageValue(v pref.Value, tagsize int, opts marshalOptions) int { +func sizeMessageValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { m := v.Message().Interface() return sizeMessage(m, tagsize, opts) } -func appendMessageValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendMessageValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { m := v.Message().Interface() return appendMessage(b, m, wiretag, opts) } -func consumeMessageValue(b []byte, v pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { +func consumeMessageValue(b []byte, v protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { m := v.Message().Interface() out, err := consumeMessage(b, m, wtyp, opts) return v, out, err } -func isInitMessageValue(v pref.Value) error { +func isInitMessageValue(v protoreflect.Value) error { m := v.Message().Interface() return proto.CheckInitialized(m) } @@ -321,17 +321,17 @@ var coderMessageValue = valueCoderFuncs{ merge: mergeMessageValue, } -func sizeGroupValue(v pref.Value, tagsize int, opts marshalOptions) int { +func sizeGroupValue(v protoreflect.Value, tagsize int, opts marshalOptions) int { m := v.Message().Interface() return sizeGroup(m, tagsize, opts) } -func appendGroupValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendGroupValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { m := v.Message().Interface() return appendGroup(b, m, wiretag, opts) } -func consumeGroupValue(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { +func consumeGroupValue(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) { m := v.Message().Interface() out, err := consumeGroup(b, m, num, wtyp, opts) return v, out, err @@ -345,7 +345,7 @@ var coderGroupValue = valueCoderFuncs{ merge: mergeMessageValue, } -func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeGroupFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { num := fd.Number() if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ @@ -424,7 +424,7 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir if n < 0 { return out, errDecode } - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: m.ProtoReflect(), }) @@ -432,11 +432,11 @@ func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowir return out, err } out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } -func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeMessageSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ size: sizeMessageSliceInfo, @@ -555,7 +555,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir return out, errDecode } mp := reflect.New(goType.Elem()) - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: asMessage(mp).ProtoReflect(), }) @@ -564,7 +564,7 @@ func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowir } p.AppendPointerSlice(pointerOfValue(mp)) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } @@ -581,7 +581,7 @@ func isInitMessageSlice(p pointer, goType reflect.Type) error { // Slices of messages -func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { +func sizeMessageSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { list := listv.List() n := 0 for i, llen := 0, list.Len(); i < llen; i++ { @@ -591,7 +591,7 @@ func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) i return n } -func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendMessageSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { list := listv.List() mopts := opts.Options() for i, llen := 0, list.Len(); i < llen; i++ { @@ -608,30 +608,30 @@ func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts ma return b, nil } -func consumeMessageSliceValue(b []byte, listv pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { +func consumeMessageSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { list := listv.List() if wtyp != protowire.BytesType { - return pref.Value{}, out, errUnknown + return protoreflect.Value{}, out, errUnknown } v, n := protowire.ConsumeBytes(b) if n < 0 { - return pref.Value{}, out, errDecode + return protoreflect.Value{}, out, errDecode } m := list.NewElement() - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: v, Message: m.Message(), }) if err != nil { - return pref.Value{}, out, err + return protoreflect.Value{}, out, err } list.Append(m) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return listv, out, nil } -func isInitMessageSliceValue(listv pref.Value) error { +func isInitMessageSliceValue(listv protoreflect.Value) error { list := listv.List() for i, llen := 0, list.Len(); i < llen; i++ { m := list.Get(i).Message().Interface() @@ -650,7 +650,7 @@ var coderMessageSliceValue = valueCoderFuncs{ merge: mergeMessageListValue, } -func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { +func sizeGroupSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int { list := listv.List() n := 0 for i, llen := 0, list.Len(); i < llen; i++ { @@ -660,7 +660,7 @@ func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int return n } -func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { +func appendGroupSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { list := listv.List() mopts := opts.Options() for i, llen := 0, list.Len(); i < llen; i++ { @@ -676,26 +676,26 @@ func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts mars return b, nil } -func consumeGroupSliceValue(b []byte, listv pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { +func consumeGroupSliceValue(b []byte, listv protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) { list := listv.List() if wtyp != protowire.StartGroupType { - return pref.Value{}, out, errUnknown + return protoreflect.Value{}, out, errUnknown } b, n := protowire.ConsumeGroup(num, b) if n < 0 { - return pref.Value{}, out, errDecode + return protoreflect.Value{}, out, errDecode } m := list.NewElement() - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: m.Message(), }) if err != nil { - return pref.Value{}, out, err + return protoreflect.Value{}, out, err } list.Append(m) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return listv, out, nil } @@ -707,7 +707,7 @@ var coderGroupSliceValue = valueCoderFuncs{ merge: mergeMessageListValue, } -func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { +func makeGroupSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { num := fd.Number() if mi := getMessageInfo(ft); mi != nil { funcs := pointerCoderFuncs{ @@ -772,7 +772,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire return out, errDecode } mp := reflect.New(goType.Elem()) - o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ + o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{ Buf: b, Message: asMessage(mp).ProtoReflect(), }) @@ -781,7 +781,7 @@ func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire } p.AppendPointerSlice(pointerOfValue(mp)) out.n = n - out.initialized = o.Flags&piface.UnmarshalInitialized != 0 + out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0 return out, nil } @@ -822,8 +822,8 @@ func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFie return out, nil } -func asMessage(v reflect.Value) pref.ProtoMessage { - if m, ok := v.Interface().(pref.ProtoMessage); ok { +func asMessage(v reflect.Value) protoreflect.ProtoMessage { + if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { return m } return legacyWrapMessage(v).Interface() diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go index c1245fef4..111b9d16f 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/genid" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type mapInfo struct { @@ -19,12 +19,12 @@ type mapInfo struct { valWiretag uint64 keyFuncs valueCoderFuncs valFuncs valueCoderFuncs - keyZero pref.Value - keyKind pref.Kind + keyZero protoreflect.Value + keyKind protoreflect.Kind conv *mapConverter } -func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { +func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { // TODO: Consider generating specialized map coders. keyField := fd.MapKey() valField := fd.MapValue() @@ -44,7 +44,7 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage keyKind: keyField.Kind(), conv: conv, } - if valField.Kind() == pref.MessageKind { + if valField.Kind() == protoreflect.MessageKind { valueMessage = getMessageInfo(ft.Elem()) } @@ -68,9 +68,9 @@ func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage }, } switch valField.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: funcs.merge = mergeMapOfMessage - case pref.BytesKind: + case protoreflect.BytesKind: funcs.merge = mergeMapOfBytes default: funcs.merge = mergeMap @@ -135,7 +135,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo err := errUnknown switch num { case genid.MapEntry_Key_field_number: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) if err != nil { @@ -144,7 +144,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo key = v n = o.n case genid.MapEntry_Value_field_number: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) if err != nil { @@ -192,7 +192,7 @@ func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi err := errUnknown switch num { case 1: - var v pref.Value + var v protoreflect.Value var o unmarshalOutput v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) if err != nil { diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go index cd40527ff..6b2fdbb73 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go @@ -12,15 +12,15 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/order" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // coderMessageInfo contains per-message information used by the fast-path functions. // This is a different type from MessageInfo to keep MessageInfo as general-purpose as // possible. type coderMessageInfo struct { - methods piface.Methods + methods protoiface.Methods orderedCoderFields []*coderFieldInfo denseCoderFields []*coderFieldInfo @@ -38,13 +38,13 @@ type coderFieldInfo struct { funcs pointerCoderFuncs // fast-path per-field functions mi *MessageInfo // field's message ft reflect.Type - validation validationInfo // information used by message validation - num pref.FieldNumber // field number - offset offset // struct field offset - wiretag uint64 // field tag (number + wire type) - tagsize int // size of the varint-encoded tag - isPointer bool // true if IsNil may be called on the struct field - isRequired bool // true if field is required + validation validationInfo // information used by message validation + num protoreflect.FieldNumber // field number + offset offset // struct field offset + wiretag uint64 // field tag (number + wire type) + tagsize int // size of the varint-encoded tag + isPointer bool // true if IsNil may be called on the struct field + isRequired bool // true if field is required } func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { @@ -125,8 +125,8 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { funcs: funcs, mi: childMessage, validation: newFieldValidationInfo(mi, si, fd, ft), - isPointer: fd.Cardinality() == pref.Repeated || fd.HasPresence(), - isRequired: fd.Cardinality() == pref.Required, + isPointer: fd.Cardinality() == protoreflect.Repeated || fd.HasPresence(), + isRequired: fd.Cardinality() == protoreflect.Required, } mi.orderedCoderFields = append(mi.orderedCoderFields, cf) mi.coderFields[cf.num] = cf @@ -149,7 +149,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num }) - var maxDense pref.FieldNumber + var maxDense protoreflect.FieldNumber for _, cf := range mi.orderedCoderFields { if cf.num >= 16 && cf.num >= 2*maxDense { break @@ -175,12 +175,12 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { mi.needsInitCheck = needsInitCheck(mi.Desc) if mi.methods.Marshal == nil && mi.methods.Size == nil { - mi.methods.Flags |= piface.SupportMarshalDeterministic + mi.methods.Flags |= protoiface.SupportMarshalDeterministic mi.methods.Marshal = mi.marshal mi.methods.Size = mi.size } if mi.methods.Unmarshal == nil { - mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown + mi.methods.Flags |= protoiface.SupportUnmarshalDiscardUnknown mi.methods.Unmarshal = mi.unmarshal } if mi.methods.CheckInitialized == nil { diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go index e89971238..576dcf3aa 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // pointerCoderFuncs is a set of pointer encoding functions. @@ -25,83 +25,83 @@ type pointerCoderFuncs struct { // valueCoderFuncs is a set of protoreflect.Value encoding functions. type valueCoderFuncs struct { - size func(v pref.Value, tagsize int, opts marshalOptions) int - marshal func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) - unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) - isInit func(v pref.Value) error - merge func(dst, src pref.Value, opts mergeOptions) pref.Value + size func(v protoreflect.Value, tagsize int, opts marshalOptions) int + marshal func(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) + unmarshal func(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) + isInit func(v protoreflect.Value) error + merge func(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value } // fieldCoder returns pointer functions for a field, used for operating on // struct fields. -func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { +func fieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { switch { case fd.IsMap(): return encoderFuncsForMap(fd, ft) - case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): // Repeated fields (not packed). if ft.Kind() != reflect.Slice { break } ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolSlice } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumSlice } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32Slice } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32Slice } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32Slice } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64Slice } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64Slice } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64Slice } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32Slice } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32Slice } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatSlice } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64Slice } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64Slice } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoubleSlice } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringSliceValidateUTF8 } @@ -114,19 +114,19 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesSlice } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringSlice } if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesSlice } - case pref.MessageKind: + case protoreflect.MessageKind: return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft) - case pref.GroupKind: + case protoreflect.GroupKind: return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft) } - case fd.Cardinality() == pref.Repeated && fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): // Packed repeated fields. // // Only repeated fields of primitive numeric types @@ -136,128 +136,128 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer } ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolPackedSlice } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumPackedSlice } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32PackedSlice } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32PackedSlice } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32PackedSlice } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64PackedSlice } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64PackedSlice } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64PackedSlice } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32PackedSlice } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32PackedSlice } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatPackedSlice } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64PackedSlice } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64PackedSlice } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoublePackedSlice } } - case fd.Kind() == pref.MessageKind: + case fd.Kind() == protoreflect.MessageKind: return getMessageInfo(ft), makeMessageFieldCoder(fd, ft) - case fd.Kind() == pref.GroupKind: + case fd.Kind() == protoreflect.GroupKind: return getMessageInfo(ft), makeGroupFieldCoder(fd, ft) - case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil: + case fd.Syntax() == protoreflect.Proto3 && fd.ContainingOneof() == nil: // Populated oneof fields always encode even if set to the zero value, // which normally are not encoded in proto3. switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolNoZero } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumNoZero } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32NoZero } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32NoZero } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32NoZero } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64NoZero } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64NoZero } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64NoZero } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32NoZero } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32NoZero } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatNoZero } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64NoZero } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64NoZero } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoubleNoZero } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringNoZeroValidateUTF8 } @@ -270,7 +270,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytesNoZero } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringNoZero } @@ -281,133 +281,133 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer case ft.Kind() == reflect.Ptr: ft := ft.Elem() switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBoolPtr } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnumPtr } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32Ptr } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32Ptr } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32Ptr } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64Ptr } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64Ptr } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64Ptr } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32Ptr } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32Ptr } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloatPtr } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64Ptr } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64Ptr } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDoublePtr } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringPtrValidateUTF8 } if ft.Kind() == reflect.String { return nil, coderStringPtr } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderStringPtr } } default: switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if ft.Kind() == reflect.Bool { return nil, coderBool } - case pref.EnumKind: + case protoreflect.EnumKind: if ft.Kind() == reflect.Int32 { return nil, coderEnum } - case pref.Int32Kind: + case protoreflect.Int32Kind: if ft.Kind() == reflect.Int32 { return nil, coderInt32 } - case pref.Sint32Kind: + case protoreflect.Sint32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSint32 } - case pref.Uint32Kind: + case protoreflect.Uint32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderUint32 } - case pref.Int64Kind: + case protoreflect.Int64Kind: if ft.Kind() == reflect.Int64 { return nil, coderInt64 } - case pref.Sint64Kind: + case protoreflect.Sint64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSint64 } - case pref.Uint64Kind: + case protoreflect.Uint64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderUint64 } - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: if ft.Kind() == reflect.Int32 { return nil, coderSfixed32 } - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: if ft.Kind() == reflect.Uint32 { return nil, coderFixed32 } - case pref.FloatKind: + case protoreflect.FloatKind: if ft.Kind() == reflect.Float32 { return nil, coderFloat } - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: if ft.Kind() == reflect.Int64 { return nil, coderSfixed64 } - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: if ft.Kind() == reflect.Uint64 { return nil, coderFixed64 } - case pref.DoubleKind: + case protoreflect.DoubleKind: if ft.Kind() == reflect.Float64 { return nil, coderDouble } - case pref.StringKind: + case protoreflect.StringKind: if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { return nil, coderStringValidateUTF8 } @@ -420,7 +420,7 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { return nil, coderBytes } - case pref.BytesKind: + case protoreflect.BytesKind: if ft.Kind() == reflect.String { return nil, coderString } @@ -434,122 +434,122 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer // encoderFuncsForValue returns value functions for a field, used for // extension values and map encoding. -func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs { +func encoderFuncsForValue(fd protoreflect.FieldDescriptor) valueCoderFuncs { switch { - case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked(): switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolSliceValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumSliceValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32SliceValue - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32SliceValue - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32SliceValue - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64SliceValue - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64SliceValue - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64SliceValue - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32SliceValue - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32SliceValue - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatSliceValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64SliceValue - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64SliceValue - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoubleSliceValue - case pref.StringKind: + case protoreflect.StringKind: // We don't have a UTF-8 validating coder for repeated string fields. // Value coders are used for extensions and maps. // Extensions are never proto3, and maps never contain lists. return coderStringSliceValue - case pref.BytesKind: + case protoreflect.BytesKind: return coderBytesSliceValue - case pref.MessageKind: + case protoreflect.MessageKind: return coderMessageSliceValue - case pref.GroupKind: + case protoreflect.GroupKind: return coderGroupSliceValue } - case fd.Cardinality() == pref.Repeated && fd.IsPacked(): + case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked(): switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolPackedSliceValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumPackedSliceValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32PackedSliceValue - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32PackedSliceValue - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32PackedSliceValue - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64PackedSliceValue - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64PackedSliceValue - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64PackedSliceValue - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32PackedSliceValue - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32PackedSliceValue - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatPackedSliceValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64PackedSliceValue - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64PackedSliceValue - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoublePackedSliceValue } default: switch fd.Kind() { default: - case pref.BoolKind: + case protoreflect.BoolKind: return coderBoolValue - case pref.EnumKind: + case protoreflect.EnumKind: return coderEnumValue - case pref.Int32Kind: + case protoreflect.Int32Kind: return coderInt32Value - case pref.Sint32Kind: + case protoreflect.Sint32Kind: return coderSint32Value - case pref.Uint32Kind: + case protoreflect.Uint32Kind: return coderUint32Value - case pref.Int64Kind: + case protoreflect.Int64Kind: return coderInt64Value - case pref.Sint64Kind: + case protoreflect.Sint64Kind: return coderSint64Value - case pref.Uint64Kind: + case protoreflect.Uint64Kind: return coderUint64Value - case pref.Sfixed32Kind: + case protoreflect.Sfixed32Kind: return coderSfixed32Value - case pref.Fixed32Kind: + case protoreflect.Fixed32Kind: return coderFixed32Value - case pref.FloatKind: + case protoreflect.FloatKind: return coderFloatValue - case pref.Sfixed64Kind: + case protoreflect.Sfixed64Kind: return coderSfixed64Value - case pref.Fixed64Kind: + case protoreflect.Fixed64Kind: return coderFixed64Value - case pref.DoubleKind: + case protoreflect.DoubleKind: return coderDoubleValue - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { return coderStringValueValidateUTF8 } return coderStringValue - case pref.BytesKind: + case protoreflect.BytesKind: return coderBytesValue - case pref.MessageKind: + case protoreflect.MessageKind: return coderMessageValue - case pref.GroupKind: + case protoreflect.GroupKind: return coderGroupValue } } diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert.go b/vendor/google.golang.org/protobuf/internal/impl/convert.go index acd61bb50..185ef2efa 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert.go @@ -8,7 +8,7 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // unwrapper unwraps the value to the underlying value. @@ -20,13 +20,13 @@ type unwrapper interface { // A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types. type Converter interface { // PBValueOf converts a reflect.Value to a protoreflect.Value. - PBValueOf(reflect.Value) pref.Value + PBValueOf(reflect.Value) protoreflect.Value // GoValueOf converts a protoreflect.Value to a reflect.Value. - GoValueOf(pref.Value) reflect.Value + GoValueOf(protoreflect.Value) reflect.Value // IsValidPB returns whether a protoreflect.Value is compatible with this type. - IsValidPB(pref.Value) bool + IsValidPB(protoreflect.Value) bool // IsValidGo returns whether a reflect.Value is compatible with this type. IsValidGo(reflect.Value) bool @@ -34,12 +34,12 @@ type Converter interface { // New returns a new field value. // For scalars, it returns the default value of the field. // For composite types, it returns a new mutable value. - New() pref.Value + New() protoreflect.Value // Zero returns a new field value. // For scalars, it returns the default value of the field. // For composite types, it returns an immutable, empty value. - Zero() pref.Value + Zero() protoreflect.Value } // NewConverter matches a Go type with a protobuf field and returns a Converter @@ -50,7 +50,7 @@ type Converter interface { // This matcher deliberately supports a wider range of Go types than what // protoc-gen-go historically generated to be able to automatically wrap some // v1 messages generated by other forks of protoc-gen-go. -func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { +func NewConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { switch { case fd.IsList(): return newListConverter(t, fd) @@ -59,7 +59,6 @@ func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { default: return newSingularConverter(t, fd) } - panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) } var ( @@ -76,68 +75,68 @@ var ( ) var ( - boolZero = pref.ValueOfBool(false) - int32Zero = pref.ValueOfInt32(0) - int64Zero = pref.ValueOfInt64(0) - uint32Zero = pref.ValueOfUint32(0) - uint64Zero = pref.ValueOfUint64(0) - float32Zero = pref.ValueOfFloat32(0) - float64Zero = pref.ValueOfFloat64(0) - stringZero = pref.ValueOfString("") - bytesZero = pref.ValueOfBytes(nil) + boolZero = protoreflect.ValueOfBool(false) + int32Zero = protoreflect.ValueOfInt32(0) + int64Zero = protoreflect.ValueOfInt64(0) + uint32Zero = protoreflect.ValueOfUint32(0) + uint64Zero = protoreflect.ValueOfUint64(0) + float32Zero = protoreflect.ValueOfFloat32(0) + float64Zero = protoreflect.ValueOfFloat64(0) + stringZero = protoreflect.ValueOfString("") + bytesZero = protoreflect.ValueOfBytes(nil) ) -func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { - defVal := func(fd pref.FieldDescriptor, zero pref.Value) pref.Value { - if fd.Cardinality() == pref.Repeated { +func newSingularConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { + defVal := func(fd protoreflect.FieldDescriptor, zero protoreflect.Value) protoreflect.Value { + if fd.Cardinality() == protoreflect.Repeated { // Default isn't defined for repeated fields. return zero } return fd.Default() } switch fd.Kind() { - case pref.BoolKind: + case protoreflect.BoolKind: if t.Kind() == reflect.Bool { return &boolConverter{t, defVal(fd, boolZero)} } - case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: + case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: if t.Kind() == reflect.Int32 { return &int32Converter{t, defVal(fd, int32Zero)} } - case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: + case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: if t.Kind() == reflect.Int64 { return &int64Converter{t, defVal(fd, int64Zero)} } - case pref.Uint32Kind, pref.Fixed32Kind: + case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: if t.Kind() == reflect.Uint32 { return &uint32Converter{t, defVal(fd, uint32Zero)} } - case pref.Uint64Kind, pref.Fixed64Kind: + case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: if t.Kind() == reflect.Uint64 { return &uint64Converter{t, defVal(fd, uint64Zero)} } - case pref.FloatKind: + case protoreflect.FloatKind: if t.Kind() == reflect.Float32 { return &float32Converter{t, defVal(fd, float32Zero)} } - case pref.DoubleKind: + case protoreflect.DoubleKind: if t.Kind() == reflect.Float64 { return &float64Converter{t, defVal(fd, float64Zero)} } - case pref.StringKind: + case protoreflect.StringKind: if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { return &stringConverter{t, defVal(fd, stringZero)} } - case pref.BytesKind: + case protoreflect.BytesKind: if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { return &bytesConverter{t, defVal(fd, bytesZero)} } - case pref.EnumKind: + case protoreflect.EnumKind: // Handle enums, which must be a named int32 type. if t.Kind() == reflect.Int32 { return newEnumConverter(t, fd) } - case pref.MessageKind, pref.GroupKind: + case protoreflect.MessageKind, protoreflect.GroupKind: return newMessageConverter(t) } panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) @@ -145,184 +144,184 @@ func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { type boolConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *boolConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *boolConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfBool(v.Bool()) + return protoreflect.ValueOfBool(v.Bool()) } -func (c *boolConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *boolConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Bool()).Convert(c.goType) } -func (c *boolConverter) IsValidPB(v pref.Value) bool { +func (c *boolConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(bool) return ok } func (c *boolConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *boolConverter) New() pref.Value { return c.def } -func (c *boolConverter) Zero() pref.Value { return c.def } +func (c *boolConverter) New() protoreflect.Value { return c.def } +func (c *boolConverter) Zero() protoreflect.Value { return c.def } type int32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *int32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *int32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfInt32(int32(v.Int())) + return protoreflect.ValueOfInt32(int32(v.Int())) } -func (c *int32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *int32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(int32(v.Int())).Convert(c.goType) } -func (c *int32Converter) IsValidPB(v pref.Value) bool { +func (c *int32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(int32) return ok } func (c *int32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *int32Converter) New() pref.Value { return c.def } -func (c *int32Converter) Zero() pref.Value { return c.def } +func (c *int32Converter) New() protoreflect.Value { return c.def } +func (c *int32Converter) Zero() protoreflect.Value { return c.def } type int64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *int64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *int64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfInt64(int64(v.Int())) + return protoreflect.ValueOfInt64(int64(v.Int())) } -func (c *int64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *int64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(int64(v.Int())).Convert(c.goType) } -func (c *int64Converter) IsValidPB(v pref.Value) bool { +func (c *int64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(int64) return ok } func (c *int64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *int64Converter) New() pref.Value { return c.def } -func (c *int64Converter) Zero() pref.Value { return c.def } +func (c *int64Converter) New() protoreflect.Value { return c.def } +func (c *int64Converter) Zero() protoreflect.Value { return c.def } type uint32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *uint32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *uint32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfUint32(uint32(v.Uint())) + return protoreflect.ValueOfUint32(uint32(v.Uint())) } -func (c *uint32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *uint32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(uint32(v.Uint())).Convert(c.goType) } -func (c *uint32Converter) IsValidPB(v pref.Value) bool { +func (c *uint32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(uint32) return ok } func (c *uint32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *uint32Converter) New() pref.Value { return c.def } -func (c *uint32Converter) Zero() pref.Value { return c.def } +func (c *uint32Converter) New() protoreflect.Value { return c.def } +func (c *uint32Converter) Zero() protoreflect.Value { return c.def } type uint64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *uint64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *uint64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfUint64(uint64(v.Uint())) + return protoreflect.ValueOfUint64(uint64(v.Uint())) } -func (c *uint64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *uint64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(uint64(v.Uint())).Convert(c.goType) } -func (c *uint64Converter) IsValidPB(v pref.Value) bool { +func (c *uint64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(uint64) return ok } func (c *uint64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *uint64Converter) New() pref.Value { return c.def } -func (c *uint64Converter) Zero() pref.Value { return c.def } +func (c *uint64Converter) New() protoreflect.Value { return c.def } +func (c *uint64Converter) Zero() protoreflect.Value { return c.def } type float32Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *float32Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *float32Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfFloat32(float32(v.Float())) + return protoreflect.ValueOfFloat32(float32(v.Float())) } -func (c *float32Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *float32Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(float32(v.Float())).Convert(c.goType) } -func (c *float32Converter) IsValidPB(v pref.Value) bool { +func (c *float32Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(float32) return ok } func (c *float32Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *float32Converter) New() pref.Value { return c.def } -func (c *float32Converter) Zero() pref.Value { return c.def } +func (c *float32Converter) New() protoreflect.Value { return c.def } +func (c *float32Converter) Zero() protoreflect.Value { return c.def } type float64Converter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *float64Converter) PBValueOf(v reflect.Value) pref.Value { +func (c *float64Converter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfFloat64(float64(v.Float())) + return protoreflect.ValueOfFloat64(float64(v.Float())) } -func (c *float64Converter) GoValueOf(v pref.Value) reflect.Value { +func (c *float64Converter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(float64(v.Float())).Convert(c.goType) } -func (c *float64Converter) IsValidPB(v pref.Value) bool { +func (c *float64Converter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(float64) return ok } func (c *float64Converter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *float64Converter) New() pref.Value { return c.def } -func (c *float64Converter) Zero() pref.Value { return c.def } +func (c *float64Converter) New() protoreflect.Value { return c.def } +func (c *float64Converter) Zero() protoreflect.Value { return c.def } type stringConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *stringConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *stringConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfString(v.Convert(stringType).String()) + return protoreflect.ValueOfString(v.Convert(stringType).String()) } -func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *stringConverter) GoValueOf(v protoreflect.Value) reflect.Value { // pref.Value.String never panics, so we go through an interface // conversion here to check the type. s := v.Interface().(string) @@ -331,71 +330,71 @@ func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { } return reflect.ValueOf(s).Convert(c.goType) } -func (c *stringConverter) IsValidPB(v pref.Value) bool { +func (c *stringConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().(string) return ok } func (c *stringConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *stringConverter) New() pref.Value { return c.def } -func (c *stringConverter) Zero() pref.Value { return c.def } +func (c *stringConverter) New() protoreflect.Value { return c.def } +func (c *stringConverter) Zero() protoreflect.Value { return c.def } type bytesConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func (c *bytesConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *bytesConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } if c.goType.Kind() == reflect.String && v.Len() == 0 { - return pref.ValueOfBytes(nil) // ensure empty string is []byte(nil) + return protoreflect.ValueOfBytes(nil) // ensure empty string is []byte(nil) } - return pref.ValueOfBytes(v.Convert(bytesType).Bytes()) + return protoreflect.ValueOfBytes(v.Convert(bytesType).Bytes()) } -func (c *bytesConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *bytesConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Bytes()).Convert(c.goType) } -func (c *bytesConverter) IsValidPB(v pref.Value) bool { +func (c *bytesConverter) IsValidPB(v protoreflect.Value) bool { _, ok := v.Interface().([]byte) return ok } func (c *bytesConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *bytesConverter) New() pref.Value { return c.def } -func (c *bytesConverter) Zero() pref.Value { return c.def } +func (c *bytesConverter) New() protoreflect.Value { return c.def } +func (c *bytesConverter) Zero() protoreflect.Value { return c.def } type enumConverter struct { goType reflect.Type - def pref.Value + def protoreflect.Value } -func newEnumConverter(goType reflect.Type, fd pref.FieldDescriptor) Converter { - var def pref.Value - if fd.Cardinality() == pref.Repeated { - def = pref.ValueOfEnum(fd.Enum().Values().Get(0).Number()) +func newEnumConverter(goType reflect.Type, fd protoreflect.FieldDescriptor) Converter { + var def protoreflect.Value + if fd.Cardinality() == protoreflect.Repeated { + def = protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number()) } else { def = fd.Default() } return &enumConverter{goType, def} } -func (c *enumConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *enumConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfEnum(pref.EnumNumber(v.Int())) + return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v.Int())) } -func (c *enumConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *enumConverter) GoValueOf(v protoreflect.Value) reflect.Value { return reflect.ValueOf(v.Enum()).Convert(c.goType) } -func (c *enumConverter) IsValidPB(v pref.Value) bool { - _, ok := v.Interface().(pref.EnumNumber) +func (c *enumConverter) IsValidPB(v protoreflect.Value) bool { + _, ok := v.Interface().(protoreflect.EnumNumber) return ok } @@ -403,11 +402,11 @@ func (c *enumConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *enumConverter) New() pref.Value { +func (c *enumConverter) New() protoreflect.Value { return c.def } -func (c *enumConverter) Zero() pref.Value { +func (c *enumConverter) Zero() protoreflect.Value { return c.def } @@ -419,7 +418,7 @@ func newMessageConverter(goType reflect.Type) Converter { return &messageConverter{goType} } -func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *messageConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } @@ -430,13 +429,13 @@ func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { v = reflect.Zero(reflect.PtrTo(v.Type())) } } - if m, ok := v.Interface().(pref.ProtoMessage); ok { - return pref.ValueOfMessage(m.ProtoReflect()) + if m, ok := v.Interface().(protoreflect.ProtoMessage); ok { + return protoreflect.ValueOfMessage(m.ProtoReflect()) } - return pref.ValueOfMessage(legacyWrapMessage(v)) + return protoreflect.ValueOfMessage(legacyWrapMessage(v)) } -func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *messageConverter) GoValueOf(v protoreflect.Value) reflect.Value { m := v.Message() var rv reflect.Value if u, ok := m.(unwrapper); ok { @@ -460,7 +459,7 @@ func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { return rv } -func (c *messageConverter) IsValidPB(v pref.Value) bool { +func (c *messageConverter) IsValidPB(v protoreflect.Value) bool { m := v.Message() var rv reflect.Value if u, ok := m.(unwrapper); ok { @@ -478,14 +477,14 @@ func (c *messageConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *messageConverter) New() pref.Value { +func (c *messageConverter) New() protoreflect.Value { if c.isNonPointer() { return c.PBValueOf(reflect.New(c.goType).Elem()) } return c.PBValueOf(reflect.New(c.goType.Elem())) } -func (c *messageConverter) Zero() pref.Value { +func (c *messageConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go index 6fccab520..f89136516 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert_list.go @@ -8,10 +8,10 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) -func newListConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { +func newListConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter { switch { case t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Slice: return &listPtrConverter{t, newSingularConverter(t.Elem().Elem(), fd)} @@ -26,16 +26,16 @@ type listConverter struct { c Converter } -func (c *listConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *listConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } pv := reflect.New(c.goType) pv.Elem().Set(v) - return pref.ValueOfList(&listReflect{pv, c.c}) + return protoreflect.ValueOfList(&listReflect{pv, c.c}) } -func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *listConverter) GoValueOf(v protoreflect.Value) reflect.Value { rv := v.List().(*listReflect).v if rv.IsNil() { return reflect.Zero(c.goType) @@ -43,7 +43,7 @@ func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { return rv.Elem() } -func (c *listConverter) IsValidPB(v pref.Value) bool { +func (c *listConverter) IsValidPB(v protoreflect.Value) bool { list, ok := v.Interface().(*listReflect) if !ok { return false @@ -55,12 +55,12 @@ func (c *listConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *listConverter) New() pref.Value { - return pref.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) +func (c *listConverter) New() protoreflect.Value { + return protoreflect.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) } -func (c *listConverter) Zero() pref.Value { - return pref.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) +func (c *listConverter) Zero() protoreflect.Value { + return protoreflect.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) } type listPtrConverter struct { @@ -68,18 +68,18 @@ type listPtrConverter struct { c Converter } -func (c *listPtrConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *listPtrConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfList(&listReflect{v, c.c}) + return protoreflect.ValueOfList(&listReflect{v, c.c}) } -func (c *listPtrConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *listPtrConverter) GoValueOf(v protoreflect.Value) reflect.Value { return v.List().(*listReflect).v } -func (c *listPtrConverter) IsValidPB(v pref.Value) bool { +func (c *listPtrConverter) IsValidPB(v protoreflect.Value) bool { list, ok := v.Interface().(*listReflect) if !ok { return false @@ -91,11 +91,11 @@ func (c *listPtrConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *listPtrConverter) New() pref.Value { +func (c *listPtrConverter) New() protoreflect.Value { return c.PBValueOf(reflect.New(c.goType.Elem())) } -func (c *listPtrConverter) Zero() pref.Value { +func (c *listPtrConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } @@ -110,16 +110,16 @@ func (ls *listReflect) Len() int { } return ls.v.Elem().Len() } -func (ls *listReflect) Get(i int) pref.Value { +func (ls *listReflect) Get(i int) protoreflect.Value { return ls.conv.PBValueOf(ls.v.Elem().Index(i)) } -func (ls *listReflect) Set(i int, v pref.Value) { +func (ls *listReflect) Set(i int, v protoreflect.Value) { ls.v.Elem().Index(i).Set(ls.conv.GoValueOf(v)) } -func (ls *listReflect) Append(v pref.Value) { +func (ls *listReflect) Append(v protoreflect.Value) { ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v))) } -func (ls *listReflect) AppendMutable() pref.Value { +func (ls *listReflect) AppendMutable() protoreflect.Value { if _, ok := ls.conv.(*messageConverter); !ok { panic("invalid AppendMutable on list with non-message type") } @@ -130,7 +130,7 @@ func (ls *listReflect) AppendMutable() pref.Value { func (ls *listReflect) Truncate(i int) { ls.v.Elem().Set(ls.v.Elem().Slice(0, i)) } -func (ls *listReflect) NewElement() pref.Value { +func (ls *listReflect) NewElement() protoreflect.Value { return ls.conv.New() } func (ls *listReflect) IsValid() bool { diff --git a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go index de06b2593..f30b0a057 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/convert_map.go @@ -8,7 +8,7 @@ import ( "fmt" "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type mapConverter struct { @@ -16,7 +16,7 @@ type mapConverter struct { keyConv, valConv Converter } -func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { +func newMapConverter(t reflect.Type, fd protoreflect.FieldDescriptor) *mapConverter { if t.Kind() != reflect.Map { panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) } @@ -27,18 +27,18 @@ func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { } } -func (c *mapConverter) PBValueOf(v reflect.Value) pref.Value { +func (c *mapConverter) PBValueOf(v reflect.Value) protoreflect.Value { if v.Type() != c.goType { panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) } - return pref.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) + return protoreflect.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) } -func (c *mapConverter) GoValueOf(v pref.Value) reflect.Value { +func (c *mapConverter) GoValueOf(v protoreflect.Value) reflect.Value { return v.Map().(*mapReflect).v } -func (c *mapConverter) IsValidPB(v pref.Value) bool { +func (c *mapConverter) IsValidPB(v protoreflect.Value) bool { mapv, ok := v.Interface().(*mapReflect) if !ok { return false @@ -50,11 +50,11 @@ func (c *mapConverter) IsValidGo(v reflect.Value) bool { return v.IsValid() && v.Type() == c.goType } -func (c *mapConverter) New() pref.Value { +func (c *mapConverter) New() protoreflect.Value { return c.PBValueOf(reflect.MakeMap(c.goType)) } -func (c *mapConverter) Zero() pref.Value { +func (c *mapConverter) Zero() protoreflect.Value { return c.PBValueOf(reflect.Zero(c.goType)) } @@ -67,29 +67,29 @@ type mapReflect struct { func (ms *mapReflect) Len() int { return ms.v.Len() } -func (ms *mapReflect) Has(k pref.MapKey) bool { +func (ms *mapReflect) Has(k protoreflect.MapKey) bool { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.v.MapIndex(rk) return rv.IsValid() } -func (ms *mapReflect) Get(k pref.MapKey) pref.Value { +func (ms *mapReflect) Get(k protoreflect.MapKey) protoreflect.Value { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.v.MapIndex(rk) if !rv.IsValid() { - return pref.Value{} + return protoreflect.Value{} } return ms.valConv.PBValueOf(rv) } -func (ms *mapReflect) Set(k pref.MapKey, v pref.Value) { +func (ms *mapReflect) Set(k protoreflect.MapKey, v protoreflect.Value) { rk := ms.keyConv.GoValueOf(k.Value()) rv := ms.valConv.GoValueOf(v) ms.v.SetMapIndex(rk, rv) } -func (ms *mapReflect) Clear(k pref.MapKey) { +func (ms *mapReflect) Clear(k protoreflect.MapKey) { rk := ms.keyConv.GoValueOf(k.Value()) ms.v.SetMapIndex(rk, reflect.Value{}) } -func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { +func (ms *mapReflect) Mutable(k protoreflect.MapKey) protoreflect.Value { if _, ok := ms.valConv.(*messageConverter); !ok { panic("invalid Mutable on map with non-message value type") } @@ -100,7 +100,7 @@ func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { } return v } -func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { +func (ms *mapReflect) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { iter := mapRange(ms.v) for iter.Next() { k := ms.keyConv.PBValueOf(iter.Key()).MapKey() @@ -110,7 +110,7 @@ func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { } } } -func (ms *mapReflect) NewValue() pref.Value { +func (ms *mapReflect) NewValue() protoreflect.Value { return ms.valConv.New() } func (ms *mapReflect) IsValid() bool { diff --git a/vendor/google.golang.org/protobuf/internal/impl/decode.go b/vendor/google.golang.org/protobuf/internal/impl/decode.go index c65b0325c..cda0520c2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/decode.go +++ b/vendor/google.golang.org/protobuf/internal/impl/decode.go @@ -12,9 +12,8 @@ import ( "google.golang.org/protobuf/internal/flags" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/runtime/protoiface" - piface "google.golang.org/protobuf/runtime/protoiface" ) var errDecode = errors.New("cannot parse invalid wire-format data") @@ -38,14 +37,16 @@ func (o unmarshalOptions) Options() proto.UnmarshalOptions { } } -func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&piface.UnmarshalDiscardUnknown != 0 } +func (o unmarshalOptions) DiscardUnknown() bool { + return o.flags&protoiface.UnmarshalDiscardUnknown != 0 +} func (o unmarshalOptions) IsDefault() bool { - return o.flags == 0 && o.resolver == preg.GlobalTypes + return o.flags == 0 && o.resolver == protoregistry.GlobalTypes } var lazyUnmarshalOptions = unmarshalOptions{ - resolver: preg.GlobalTypes, + resolver: protoregistry.GlobalTypes, depth: protowire.DefaultRecursionLimit, } @@ -55,7 +56,7 @@ type unmarshalOutput struct { } // unmarshal is protoreflect.Methods.Unmarshal. -func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { +func (mi *MessageInfo) unmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { var p pointer if ms, ok := in.Message.(*messageState); ok { p = ms.pointer() @@ -67,11 +68,11 @@ func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutp resolver: in.Resolver, depth: in.Depth, }) - var flags piface.UnmarshalOutputFlags + var flags protoiface.UnmarshalOutputFlags if out.initialized { - flags |= piface.UnmarshalInitialized + flags |= protoiface.UnmarshalInitialized } - return piface.UnmarshalOutput{ + return protoiface.UnmarshalOutput{ Flags: flags, }, err } @@ -210,7 +211,7 @@ func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp p var err error xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) if err != nil { - if err == preg.NotFound { + if err == protoregistry.NotFound { return out, errUnknown } return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) diff --git a/vendor/google.golang.org/protobuf/internal/impl/enum.go b/vendor/google.golang.org/protobuf/internal/impl/enum.go index 8c1eab4bf..5f3ef5ad7 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/enum.go +++ b/vendor/google.golang.org/protobuf/internal/impl/enum.go @@ -7,15 +7,15 @@ package impl import ( "reflect" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type EnumInfo struct { GoReflectType reflect.Type // int32 kind - Desc pref.EnumDescriptor + Desc protoreflect.EnumDescriptor } -func (t *EnumInfo) New(n pref.EnumNumber) pref.Enum { - return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(pref.Enum) +func (t *EnumInfo) New(n protoreflect.EnumNumber) protoreflect.Enum { + return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(protoreflect.Enum) } -func (t *EnumInfo) Descriptor() pref.EnumDescriptor { return t.Desc } +func (t *EnumInfo) Descriptor() protoreflect.EnumDescriptor { return t.Desc } diff --git a/vendor/google.golang.org/protobuf/internal/impl/extension.go b/vendor/google.golang.org/protobuf/internal/impl/extension.go index e904fd993..cb25b0bae 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/extension.go @@ -9,8 +9,8 @@ import ( "sync" "sync/atomic" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // ExtensionInfo implements ExtensionType. @@ -45,7 +45,7 @@ type ExtensionInfo struct { // since the message may no longer implement the MessageV1 interface. // // Deprecated: Use the ExtendedType method instead. - ExtendedType piface.MessageV1 + ExtendedType protoiface.MessageV1 // ExtensionType is the zero value of the extension type. // @@ -83,31 +83,31 @@ const ( extensionInfoFullInit = 2 ) -func InitExtensionInfo(xi *ExtensionInfo, xd pref.ExtensionDescriptor, goType reflect.Type) { +func InitExtensionInfo(xi *ExtensionInfo, xd protoreflect.ExtensionDescriptor, goType reflect.Type) { xi.goType = goType xi.desc = extensionTypeDescriptor{xd, xi} xi.init = extensionInfoDescInit } -func (xi *ExtensionInfo) New() pref.Value { +func (xi *ExtensionInfo) New() protoreflect.Value { return xi.lazyInit().New() } -func (xi *ExtensionInfo) Zero() pref.Value { +func (xi *ExtensionInfo) Zero() protoreflect.Value { return xi.lazyInit().Zero() } -func (xi *ExtensionInfo) ValueOf(v interface{}) pref.Value { +func (xi *ExtensionInfo) ValueOf(v interface{}) protoreflect.Value { return xi.lazyInit().PBValueOf(reflect.ValueOf(v)) } -func (xi *ExtensionInfo) InterfaceOf(v pref.Value) interface{} { +func (xi *ExtensionInfo) InterfaceOf(v protoreflect.Value) interface{} { return xi.lazyInit().GoValueOf(v).Interface() } -func (xi *ExtensionInfo) IsValidValue(v pref.Value) bool { +func (xi *ExtensionInfo) IsValidValue(v protoreflect.Value) bool { return xi.lazyInit().IsValidPB(v) } func (xi *ExtensionInfo) IsValidInterface(v interface{}) bool { return xi.lazyInit().IsValidGo(reflect.ValueOf(v)) } -func (xi *ExtensionInfo) TypeDescriptor() pref.ExtensionTypeDescriptor { +func (xi *ExtensionInfo) TypeDescriptor() protoreflect.ExtensionTypeDescriptor { if atomic.LoadUint32(&xi.init) < extensionInfoDescInit { xi.lazyInitSlow() } @@ -144,13 +144,13 @@ func (xi *ExtensionInfo) lazyInitSlow() { } type extensionTypeDescriptor struct { - pref.ExtensionDescriptor + protoreflect.ExtensionDescriptor xi *ExtensionInfo } -func (xtd *extensionTypeDescriptor) Type() pref.ExtensionType { +func (xtd *extensionTypeDescriptor) Type() protoreflect.ExtensionType { return xtd.xi } -func (xtd *extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor { +func (xtd *extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor { return xtd.ExtensionDescriptor } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go index f7d7ffb51..c2a803bb2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go @@ -13,13 +13,12 @@ import ( "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" ) // legacyEnumName returns the name of enums used in legacy code. // It is neither the protobuf full name nor the qualified Go name, // but rather an odd hybrid of both. -func legacyEnumName(ed pref.EnumDescriptor) string { +func legacyEnumName(ed protoreflect.EnumDescriptor) string { var protoPkg string enumName := string(ed.FullName()) if fd := ed.ParentFile(); fd != nil { @@ -34,68 +33,68 @@ func legacyEnumName(ed pref.EnumDescriptor) string { // legacyWrapEnum wraps v as a protoreflect.Enum, // where v must be a int32 kind and not implement the v2 API already. -func legacyWrapEnum(v reflect.Value) pref.Enum { +func legacyWrapEnum(v reflect.Value) protoreflect.Enum { et := legacyLoadEnumType(v.Type()) - return et.New(pref.EnumNumber(v.Int())) + return et.New(protoreflect.EnumNumber(v.Int())) } var legacyEnumTypeCache sync.Map // map[reflect.Type]protoreflect.EnumType // legacyLoadEnumType dynamically loads a protoreflect.EnumType for t, // where t must be an int32 kind and not implement the v2 API already. -func legacyLoadEnumType(t reflect.Type) pref.EnumType { +func legacyLoadEnumType(t reflect.Type) protoreflect.EnumType { // Fast-path: check if a EnumType is cached for this concrete type. if et, ok := legacyEnumTypeCache.Load(t); ok { - return et.(pref.EnumType) + return et.(protoreflect.EnumType) } // Slow-path: derive enum descriptor and initialize EnumType. - var et pref.EnumType + var et protoreflect.EnumType ed := LegacyLoadEnumDesc(t) et = &legacyEnumType{ desc: ed, goType: t, } if et, ok := legacyEnumTypeCache.LoadOrStore(t, et); ok { - return et.(pref.EnumType) + return et.(protoreflect.EnumType) } return et } type legacyEnumType struct { - desc pref.EnumDescriptor + desc protoreflect.EnumDescriptor goType reflect.Type m sync.Map // map[protoreflect.EnumNumber]proto.Enum } -func (t *legacyEnumType) New(n pref.EnumNumber) pref.Enum { +func (t *legacyEnumType) New(n protoreflect.EnumNumber) protoreflect.Enum { if e, ok := t.m.Load(n); ok { - return e.(pref.Enum) + return e.(protoreflect.Enum) } e := &legacyEnumWrapper{num: n, pbTyp: t, goTyp: t.goType} t.m.Store(n, e) return e } -func (t *legacyEnumType) Descriptor() pref.EnumDescriptor { +func (t *legacyEnumType) Descriptor() protoreflect.EnumDescriptor { return t.desc } type legacyEnumWrapper struct { - num pref.EnumNumber - pbTyp pref.EnumType + num protoreflect.EnumNumber + pbTyp protoreflect.EnumType goTyp reflect.Type } -func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor { +func (e *legacyEnumWrapper) Descriptor() protoreflect.EnumDescriptor { return e.pbTyp.Descriptor() } -func (e *legacyEnumWrapper) Type() pref.EnumType { +func (e *legacyEnumWrapper) Type() protoreflect.EnumType { return e.pbTyp } -func (e *legacyEnumWrapper) Number() pref.EnumNumber { +func (e *legacyEnumWrapper) Number() protoreflect.EnumNumber { return e.num } -func (e *legacyEnumWrapper) ProtoReflect() pref.Enum { +func (e *legacyEnumWrapper) ProtoReflect() protoreflect.Enum { return e } func (e *legacyEnumWrapper) protoUnwrap() interface{} { @@ -105,8 +104,8 @@ func (e *legacyEnumWrapper) protoUnwrap() interface{} { } var ( - _ pref.Enum = (*legacyEnumWrapper)(nil) - _ unwrapper = (*legacyEnumWrapper)(nil) + _ protoreflect.Enum = (*legacyEnumWrapper)(nil) + _ unwrapper = (*legacyEnumWrapper)(nil) ) var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor @@ -115,15 +114,15 @@ var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor // which must be an int32 kind and not implement the v2 API already. // // This is exported for testing purposes. -func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { +func LegacyLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { // Fast-path: check if an EnumDescriptor is cached for this concrete type. if ed, ok := legacyEnumDescCache.Load(t); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } // Slow-path: initialize EnumDescriptor from the raw descriptor. ev := reflect.Zero(t).Interface() - if _, ok := ev.(pref.Enum); ok { + if _, ok := ev.(protoreflect.Enum); ok { panic(fmt.Sprintf("%v already implements proto.Enum", t)) } edV1, ok := ev.(enumV1) @@ -132,7 +131,7 @@ func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { } b, idxs := edV1.EnumDescriptor() - var ed pref.EnumDescriptor + var ed protoreflect.EnumDescriptor if len(idxs) == 1 { ed = legacyLoadFileDesc(b).Enums().Get(idxs[0]) } else { @@ -158,10 +157,10 @@ var aberrantEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescript // We are unable to use the global enum registry since it is // unfortunately keyed by the protobuf full name, which we also do not know. // Thus, this produces some bogus enum descriptor based on the Go type name. -func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { +func aberrantLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor { // Fast-path: check if an EnumDescriptor is cached for this concrete type. if ed, ok := aberrantEnumDescCache.Load(t); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } // Slow-path: construct a bogus, but unique EnumDescriptor. @@ -182,7 +181,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { // An exhaustive query is clearly impractical, but can be best-effort. if ed, ok := aberrantEnumDescCache.LoadOrStore(t, ed); ok { - return ed.(pref.EnumDescriptor) + return ed.(protoreflect.EnumDescriptor) } return ed } @@ -192,7 +191,7 @@ func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { // It should be sufficiently unique within a program. // // This is exported for testing purposes. -func AberrantDeriveFullName(t reflect.Type) pref.FullName { +func AberrantDeriveFullName(t reflect.Type) protoreflect.FullName { sanitize := func(r rune) rune { switch { case r == '/': @@ -215,5 +214,5 @@ func AberrantDeriveFullName(t reflect.Type) pref.FullName { ss[i] = "x" + s } } - return pref.FullName(strings.Join(ss, ".")) + return protoreflect.FullName(strings.Join(ss, ".")) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go index e3fb0b578..9b64ad5bb 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go @@ -12,21 +12,21 @@ import ( "reflect" "google.golang.org/protobuf/internal/errors" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) // These functions exist to support exported APIs in generated protobufs. // While these are deprecated, they cannot be removed for compatibility reasons. // LegacyEnumName returns the name of enums used in legacy code. -func (Export) LegacyEnumName(ed pref.EnumDescriptor) string { +func (Export) LegacyEnumName(ed protoreflect.EnumDescriptor) string { return legacyEnumName(ed) } // LegacyMessageTypeOf returns the protoreflect.MessageType for m, // with name used as the message name if necessary. -func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.MessageType { +func (Export) LegacyMessageTypeOf(m protoiface.MessageV1, name protoreflect.FullName) protoreflect.MessageType { if mv := (Export{}).protoMessageV2Of(m); mv != nil { return mv.ProtoReflect().Type() } @@ -36,9 +36,9 @@ func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.M // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. // The input can either be a string representing the enum value by name, // or a number representing the enum number itself. -func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumber, error) { +func (Export) UnmarshalJSONEnum(ed protoreflect.EnumDescriptor, b []byte) (protoreflect.EnumNumber, error) { if b[0] == '"' { - var name pref.Name + var name protoreflect.Name if err := json.Unmarshal(b, &name); err != nil { return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) } @@ -48,7 +48,7 @@ func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumb } return ev.Number(), nil } else { - var num pref.EnumNumber + var num protoreflect.EnumNumber if err := json.Unmarshal(b, &num); err != nil { return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) } @@ -81,8 +81,8 @@ func (Export) CompressGZIP(in []byte) (out []byte) { blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. blockSize = len(in) } - binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)^0x0000) - binary.LittleEndian.PutUint16(blockHeader[3:5], uint16(blockSize)^0xffff) + binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)) + binary.LittleEndian.PutUint16(blockHeader[3:5], ^uint16(blockSize)) out = append(out, blockHeader[:]...) out = append(out, in[:blockSize]...) in = in[blockSize:] diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go index 49e723161..87b30d050 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go @@ -12,16 +12,16 @@ import ( ptag "google.golang.org/protobuf/internal/encoding/tag" "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) func (xi *ExtensionInfo) initToLegacy() { xd := xi.desc - var parent piface.MessageV1 + var parent protoiface.MessageV1 messageName := xd.ContainingMessage().FullName() - if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil { + if mt, _ := protoregistry.GlobalTypes.FindMessageByName(messageName); mt != nil { // Create a new parent message and unwrap it if possible. mv := mt.New().Interface() t := reflect.TypeOf(mv) @@ -31,7 +31,7 @@ func (xi *ExtensionInfo) initToLegacy() { // Check whether the message implements the legacy v1 Message interface. mz := reflect.Zero(t).Interface() - if mz, ok := mz.(piface.MessageV1); ok { + if mz, ok := mz.(protoiface.MessageV1); ok { parent = mz } } @@ -46,7 +46,7 @@ func (xi *ExtensionInfo) initToLegacy() { // Reconstruct the legacy enum full name. var enumName string - if xd.Kind() == pref.EnumKind { + if xd.Kind() == protoreflect.EnumKind { enumName = legacyEnumName(xd.Enum()) } @@ -77,16 +77,16 @@ func (xi *ExtensionInfo) initFromLegacy() { // field number is specified. In such a case, use a placeholder. if xi.ExtendedType == nil || xi.ExtensionType == nil { xd := placeholderExtension{ - name: pref.FullName(xi.Name), - number: pref.FieldNumber(xi.Field), + name: protoreflect.FullName(xi.Name), + number: protoreflect.FieldNumber(xi.Field), } xi.desc = extensionTypeDescriptor{xd, xi} return } // Resolve enum or message dependencies. - var ed pref.EnumDescriptor - var md pref.MessageDescriptor + var ed protoreflect.EnumDescriptor + var md protoreflect.MessageDescriptor t := reflect.TypeOf(xi.ExtensionType) isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 @@ -94,18 +94,18 @@ func (xi *ExtensionInfo) initFromLegacy() { t = t.Elem() } switch v := reflect.Zero(t).Interface().(type) { - case pref.Enum: + case protoreflect.Enum: ed = v.Descriptor() case enumV1: ed = LegacyLoadEnumDesc(t) - case pref.ProtoMessage: + case protoreflect.ProtoMessage: md = v.ProtoReflect().Descriptor() case messageV1: md = LegacyLoadMessageDesc(t) } // Derive basic field information from the struct tag. - var evs pref.EnumValueDescriptors + var evs protoreflect.EnumValueDescriptors if ed != nil { evs = ed.Values() } @@ -114,8 +114,8 @@ func (xi *ExtensionInfo) initFromLegacy() { // Construct a v2 ExtensionType. xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)} xd.L0.ParentFile = filedesc.SurrogateProto2 - xd.L0.FullName = pref.FullName(xi.Name) - xd.L1.Number = pref.FieldNumber(xi.Field) + xd.L0.FullName = protoreflect.FullName(xi.Name) + xd.L1.Number = protoreflect.FieldNumber(xi.Field) xd.L1.Cardinality = fd.L1.Cardinality xd.L1.Kind = fd.L1.Kind xd.L2.IsPacked = fd.L1.IsPacked @@ -138,39 +138,39 @@ func (xi *ExtensionInfo) initFromLegacy() { } type placeholderExtension struct { - name pref.FullName - number pref.FieldNumber + name protoreflect.FullName + number protoreflect.FieldNumber } -func (x placeholderExtension) ParentFile() pref.FileDescriptor { return nil } -func (x placeholderExtension) Parent() pref.Descriptor { return nil } -func (x placeholderExtension) Index() int { return 0 } -func (x placeholderExtension) Syntax() pref.Syntax { return 0 } -func (x placeholderExtension) Name() pref.Name { return x.name.Name() } -func (x placeholderExtension) FullName() pref.FullName { return x.name } -func (x placeholderExtension) IsPlaceholder() bool { return true } -func (x placeholderExtension) Options() pref.ProtoMessage { return descopts.Field } -func (x placeholderExtension) Number() pref.FieldNumber { return x.number } -func (x placeholderExtension) Cardinality() pref.Cardinality { return 0 } -func (x placeholderExtension) Kind() pref.Kind { return 0 } -func (x placeholderExtension) HasJSONName() bool { return false } -func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } -func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } -func (x placeholderExtension) HasPresence() bool { return false } -func (x placeholderExtension) HasOptionalKeyword() bool { return false } -func (x placeholderExtension) IsExtension() bool { return true } -func (x placeholderExtension) IsWeak() bool { return false } -func (x placeholderExtension) IsPacked() bool { return false } -func (x placeholderExtension) IsList() bool { return false } -func (x placeholderExtension) IsMap() bool { return false } -func (x placeholderExtension) MapKey() pref.FieldDescriptor { return nil } -func (x placeholderExtension) MapValue() pref.FieldDescriptor { return nil } -func (x placeholderExtension) HasDefault() bool { return false } -func (x placeholderExtension) Default() pref.Value { return pref.Value{} } -func (x placeholderExtension) DefaultEnumValue() pref.EnumValueDescriptor { return nil } -func (x placeholderExtension) ContainingOneof() pref.OneofDescriptor { return nil } -func (x placeholderExtension) ContainingMessage() pref.MessageDescriptor { return nil } -func (x placeholderExtension) Enum() pref.EnumDescriptor { return nil } -func (x placeholderExtension) Message() pref.MessageDescriptor { return nil } -func (x placeholderExtension) ProtoType(pref.FieldDescriptor) { return } -func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } +func (x placeholderExtension) ParentFile() protoreflect.FileDescriptor { return nil } +func (x placeholderExtension) Parent() protoreflect.Descriptor { return nil } +func (x placeholderExtension) Index() int { return 0 } +func (x placeholderExtension) Syntax() protoreflect.Syntax { return 0 } +func (x placeholderExtension) Name() protoreflect.Name { return x.name.Name() } +func (x placeholderExtension) FullName() protoreflect.FullName { return x.name } +func (x placeholderExtension) IsPlaceholder() bool { return true } +func (x placeholderExtension) Options() protoreflect.ProtoMessage { return descopts.Field } +func (x placeholderExtension) Number() protoreflect.FieldNumber { return x.number } +func (x placeholderExtension) Cardinality() protoreflect.Cardinality { return 0 } +func (x placeholderExtension) Kind() protoreflect.Kind { return 0 } +func (x placeholderExtension) HasJSONName() bool { return false } +func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" } +func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" } +func (x placeholderExtension) HasPresence() bool { return false } +func (x placeholderExtension) HasOptionalKeyword() bool { return false } +func (x placeholderExtension) IsExtension() bool { return true } +func (x placeholderExtension) IsWeak() bool { return false } +func (x placeholderExtension) IsPacked() bool { return false } +func (x placeholderExtension) IsList() bool { return false } +func (x placeholderExtension) IsMap() bool { return false } +func (x placeholderExtension) MapKey() protoreflect.FieldDescriptor { return nil } +func (x placeholderExtension) MapValue() protoreflect.FieldDescriptor { return nil } +func (x placeholderExtension) HasDefault() bool { return false } +func (x placeholderExtension) Default() protoreflect.Value { return protoreflect.Value{} } +func (x placeholderExtension) DefaultEnumValue() protoreflect.EnumValueDescriptor { return nil } +func (x placeholderExtension) ContainingOneof() protoreflect.OneofDescriptor { return nil } +func (x placeholderExtension) ContainingMessage() protoreflect.MessageDescriptor { return nil } +func (x placeholderExtension) Enum() protoreflect.EnumDescriptor { return nil } +func (x placeholderExtension) Message() protoreflect.MessageDescriptor { return nil } +func (x placeholderExtension) ProtoType(protoreflect.FieldDescriptor) { return } +func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return } diff --git a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go index 029feeefd..61c483fac 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go @@ -16,14 +16,12 @@ import ( "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/runtime/protoiface" - piface "google.golang.org/protobuf/runtime/protoiface" ) // legacyWrapMessage wraps v as a protoreflect.Message, // where v must be a *struct kind and not implement the v2 API already. -func legacyWrapMessage(v reflect.Value) pref.Message { +func legacyWrapMessage(v reflect.Value) protoreflect.Message { t := v.Type() if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { return aberrantMessage{v: v} @@ -35,7 +33,7 @@ func legacyWrapMessage(v reflect.Value) pref.Message { // legacyLoadMessageType dynamically loads a protoreflect.Type for t, // where t must be not implement the v2 API already. // The provided name is used if it cannot be determined from the message. -func legacyLoadMessageType(t reflect.Type, name pref.FullName) protoreflect.MessageType { +func legacyLoadMessageType(t reflect.Type, name protoreflect.FullName) protoreflect.MessageType { if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { return aberrantMessageType{t} } @@ -47,7 +45,7 @@ var legacyMessageTypeCache sync.Map // map[reflect.Type]*MessageInfo // legacyLoadMessageInfo dynamically loads a *MessageInfo for t, // where t must be a *struct kind and not implement the v2 API already. // The provided name is used if it cannot be determined from the message. -func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { +func legacyLoadMessageInfo(t reflect.Type, name protoreflect.FullName) *MessageInfo { // Fast-path: check if a MessageInfo is cached for this concrete type. if mt, ok := legacyMessageTypeCache.Load(t); ok { return mt.(*MessageInfo) @@ -68,7 +66,7 @@ func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { // supports deterministic serialization or not, but this // preserves the v1 implementation's behavior of always // calling Marshal methods when present. - mi.methods.Flags |= piface.SupportMarshalDeterministic + mi.methods.Flags |= protoiface.SupportMarshalDeterministic } if _, hasUnmarshal = v.(legacyUnmarshaler); hasUnmarshal { mi.methods.Unmarshal = legacyUnmarshal @@ -89,18 +87,18 @@ var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDesc // which should be a *struct kind and must not implement the v2 API already. // // This is exported for testing purposes. -func LegacyLoadMessageDesc(t reflect.Type) pref.MessageDescriptor { +func LegacyLoadMessageDesc(t reflect.Type) protoreflect.MessageDescriptor { return legacyLoadMessageDesc(t, "") } -func legacyLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func legacyLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { // Fast-path: check if a MessageDescriptor is cached for this concrete type. if mi, ok := legacyMessageDescCache.Load(t); ok { - return mi.(pref.MessageDescriptor) + return mi.(protoreflect.MessageDescriptor) } // Slow-path: initialize MessageDescriptor from the raw descriptor. mv := reflect.Zero(t).Interface() - if _, ok := mv.(pref.ProtoMessage); ok { + if _, ok := mv.(protoreflect.ProtoMessage); ok { panic(fmt.Sprintf("%v already implements proto.Message", t)) } mdV1, ok := mv.(messageV1) @@ -164,7 +162,7 @@ var ( // // This is a best-effort derivation of the message descriptor using the protobuf // tags on the struct fields. -func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func aberrantLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { aberrantMessageDescLock.Lock() defer aberrantMessageDescLock.Unlock() if aberrantMessageDescCache == nil { @@ -172,7 +170,7 @@ func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDes } return aberrantLoadMessageDescReentrant(t, name) } -func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.MessageDescriptor { +func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor { // Fast-path: check if an MessageDescriptor is cached for this concrete type. if md, ok := aberrantMessageDescCache[t]; ok { return md @@ -225,9 +223,9 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0] for i := 0; i < vs.Len(); i++ { v := vs.Index(i) - md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]pref.FieldNumber{ - pref.FieldNumber(v.FieldByName("Start").Int()), - pref.FieldNumber(v.FieldByName("End").Int() + 1), + md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{ + protoreflect.FieldNumber(v.FieldByName("Start").Int()), + protoreflect.FieldNumber(v.FieldByName("End").Int() + 1), }) md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, nil) } @@ -245,7 +243,7 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M n := len(md.L2.Oneofs.List) md.L2.Oneofs.List = append(md.L2.Oneofs.List, filedesc.Oneof{}) od := &md.L2.Oneofs.List[n] - od.L0.FullName = md.FullName().Append(pref.Name(tag)) + od.L0.FullName = md.FullName().Append(protoreflect.Name(tag)) od.L0.ParentFile = md.L0.ParentFile od.L0.Parent = md od.L0.Index = n @@ -267,14 +265,14 @@ func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.M return md } -func aberrantDeriveMessageName(t reflect.Type, name pref.FullName) pref.FullName { +func aberrantDeriveMessageName(t reflect.Type, name protoreflect.FullName) protoreflect.FullName { if name.IsValid() { return name } func() { defer func() { recover() }() // swallow possible nil panics if m, ok := reflect.Zero(t).Interface().(interface{ XXX_MessageName() string }); ok { - name = pref.FullName(m.XXX_MessageName()) + name = protoreflect.FullName(m.XXX_MessageName()) } }() if name.IsValid() { @@ -305,7 +303,7 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, fd.L0.Index = n if fd.L1.IsWeak || fd.L1.HasPacked { - fd.L1.Options = func() pref.ProtoMessage { + fd.L1.Options = func() protoreflect.ProtoMessage { opts := descopts.Field.ProtoReflect().New() if fd.L1.IsWeak { opts.Set(opts.Descriptor().Fields().ByName("weak"), protoreflect.ValueOfBool(true)) @@ -318,17 +316,17 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, } // Populate Enum and Message. - if fd.Enum() == nil && fd.Kind() == pref.EnumKind { + if fd.Enum() == nil && fd.Kind() == protoreflect.EnumKind { switch v := reflect.Zero(t).Interface().(type) { - case pref.Enum: + case protoreflect.Enum: fd.L1.Enum = v.Descriptor() default: fd.L1.Enum = LegacyLoadEnumDesc(t) } } - if fd.Message() == nil && (fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind) { + if fd.Message() == nil && (fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind) { switch v := reflect.Zero(t).Interface().(type) { - case pref.ProtoMessage: + case protoreflect.ProtoMessage: fd.L1.Message = v.ProtoReflect().Descriptor() case messageV1: fd.L1.Message = LegacyLoadMessageDesc(t) @@ -337,13 +335,13 @@ func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, n := len(md.L1.Messages.List) md.L1.Messages.List = append(md.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)}) md2 := &md.L1.Messages.List[n] - md2.L0.FullName = md.FullName().Append(pref.Name(strs.MapEntryName(string(fd.Name())))) + md2.L0.FullName = md.FullName().Append(protoreflect.Name(strs.MapEntryName(string(fd.Name())))) md2.L0.ParentFile = md.L0.ParentFile md2.L0.Parent = md md2.L0.Index = n md2.L1.IsMapEntry = true - md2.L2.Options = func() pref.ProtoMessage { + md2.L2.Options = func() protoreflect.ProtoMessage { opts := descopts.Message.ProtoReflect().New() opts.Set(opts.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true)) return opts.Interface() @@ -364,8 +362,8 @@ type placeholderEnumValues struct { protoreflect.EnumValueDescriptors } -func (placeholderEnumValues) ByNumber(n pref.EnumNumber) pref.EnumValueDescriptor { - return filedesc.PlaceholderEnumValue(pref.FullName(fmt.Sprintf("UNKNOWN_%d", n))) +func (placeholderEnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor { + return filedesc.PlaceholderEnumValue(protoreflect.FullName(fmt.Sprintf("UNKNOWN_%d", n))) } // legacyMarshaler is the proto.Marshaler interface superseded by protoiface.Methoder. @@ -383,7 +381,7 @@ type legacyMerger interface { Merge(protoiface.MessageV1) } -var aberrantProtoMethods = &piface.Methods{ +var aberrantProtoMethods = &protoiface.Methods{ Marshal: legacyMarshal, Unmarshal: legacyUnmarshal, Merge: legacyMerge, @@ -392,40 +390,40 @@ var aberrantProtoMethods = &piface.Methods{ // supports deterministic serialization or not, but this // preserves the v1 implementation's behavior of always // calling Marshal methods when present. - Flags: piface.SupportMarshalDeterministic, + Flags: protoiface.SupportMarshalDeterministic, } -func legacyMarshal(in piface.MarshalInput) (piface.MarshalOutput, error) { +func legacyMarshal(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) { v := in.Message.(unwrapper).protoUnwrap() marshaler, ok := v.(legacyMarshaler) if !ok { - return piface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) + return protoiface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) } out, err := marshaler.Marshal() if in.Buf != nil { out = append(in.Buf, out...) } - return piface.MarshalOutput{ + return protoiface.MarshalOutput{ Buf: out, }, err } -func legacyUnmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { +func legacyUnmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { v := in.Message.(unwrapper).protoUnwrap() unmarshaler, ok := v.(legacyUnmarshaler) if !ok { - return piface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) + return protoiface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) } - return piface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) + return protoiface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) } -func legacyMerge(in piface.MergeInput) piface.MergeOutput { +func legacyMerge(in protoiface.MergeInput) protoiface.MergeOutput { // Check whether this supports the legacy merger. dstv := in.Destination.(unwrapper).protoUnwrap() merger, ok := dstv.(legacyMerger) if ok { merger.Merge(Export{}.ProtoMessageV1Of(in.Source)) - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } // If legacy merger is unavailable, implement merge in terms of @@ -433,29 +431,29 @@ func legacyMerge(in piface.MergeInput) piface.MergeOutput { srcv := in.Source.(unwrapper).protoUnwrap() marshaler, ok := srcv.(legacyMarshaler) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } dstv = in.Destination.(unwrapper).protoUnwrap() unmarshaler, ok := dstv.(legacyUnmarshaler) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } if !in.Source.IsValid() { // Legacy Marshal methods may not function on nil messages. // Check for a typed nil source only after we confirm that // legacy Marshal/Unmarshal methods are present, for // consistency. - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } b, err := marshaler.Marshal() if err != nil { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } err = unmarshaler.Unmarshal(b) if err != nil { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } // aberrantMessageType implements MessageType for all types other than pointer-to-struct. @@ -463,19 +461,19 @@ type aberrantMessageType struct { t reflect.Type } -func (mt aberrantMessageType) New() pref.Message { +func (mt aberrantMessageType) New() protoreflect.Message { if mt.t.Kind() == reflect.Ptr { return aberrantMessage{reflect.New(mt.t.Elem())} } return aberrantMessage{reflect.Zero(mt.t)} } -func (mt aberrantMessageType) Zero() pref.Message { +func (mt aberrantMessageType) Zero() protoreflect.Message { return aberrantMessage{reflect.Zero(mt.t)} } func (mt aberrantMessageType) GoType() reflect.Type { return mt.t } -func (mt aberrantMessageType) Descriptor() pref.MessageDescriptor { +func (mt aberrantMessageType) Descriptor() protoreflect.MessageDescriptor { return LegacyLoadMessageDesc(mt.t) } @@ -499,56 +497,56 @@ func (m aberrantMessage) Reset() { } } -func (m aberrantMessage) ProtoReflect() pref.Message { +func (m aberrantMessage) ProtoReflect() protoreflect.Message { return m } -func (m aberrantMessage) Descriptor() pref.MessageDescriptor { +func (m aberrantMessage) Descriptor() protoreflect.MessageDescriptor { return LegacyLoadMessageDesc(m.v.Type()) } -func (m aberrantMessage) Type() pref.MessageType { +func (m aberrantMessage) Type() protoreflect.MessageType { return aberrantMessageType{m.v.Type()} } -func (m aberrantMessage) New() pref.Message { +func (m aberrantMessage) New() protoreflect.Message { if m.v.Type().Kind() == reflect.Ptr { return aberrantMessage{reflect.New(m.v.Type().Elem())} } return aberrantMessage{reflect.Zero(m.v.Type())} } -func (m aberrantMessage) Interface() pref.ProtoMessage { +func (m aberrantMessage) Interface() protoreflect.ProtoMessage { return m } -func (m aberrantMessage) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m aberrantMessage) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { return } -func (m aberrantMessage) Has(pref.FieldDescriptor) bool { +func (m aberrantMessage) Has(protoreflect.FieldDescriptor) bool { return false } -func (m aberrantMessage) Clear(pref.FieldDescriptor) { +func (m aberrantMessage) Clear(protoreflect.FieldDescriptor) { panic("invalid Message.Clear on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Get(fd pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { if fd.Default().IsValid() { return fd.Default() } panic("invalid Message.Get on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Set(pref.FieldDescriptor, pref.Value) { +func (m aberrantMessage) Set(protoreflect.FieldDescriptor, protoreflect.Value) { panic("invalid Message.Set on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) Mutable(pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) Mutable(protoreflect.FieldDescriptor) protoreflect.Value { panic("invalid Message.Mutable on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) NewField(pref.FieldDescriptor) pref.Value { +func (m aberrantMessage) NewField(protoreflect.FieldDescriptor) protoreflect.Value { panic("invalid Message.NewField on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor { +func (m aberrantMessage) WhichOneof(protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { panic("invalid Message.WhichOneof descriptor on " + string(m.Descriptor().FullName())) } -func (m aberrantMessage) GetUnknown() pref.RawFields { +func (m aberrantMessage) GetUnknown() protoreflect.RawFields { return nil } -func (m aberrantMessage) SetUnknown(pref.RawFields) { +func (m aberrantMessage) SetUnknown(protoreflect.RawFields) { // SetUnknown discards its input on messages which don't support unknown field storage. } func (m aberrantMessage) IsValid() bool { @@ -557,7 +555,7 @@ func (m aberrantMessage) IsValid() bool { } return false } -func (m aberrantMessage) ProtoMethods() *piface.Methods { +func (m aberrantMessage) ProtoMethods() *protoiface.Methods { return aberrantProtoMethods } func (m aberrantMessage) protoUnwrap() interface{} { diff --git a/vendor/google.golang.org/protobuf/internal/impl/merge.go b/vendor/google.golang.org/protobuf/internal/impl/merge.go index c65bbc044..7e65f64f2 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/merge.go +++ b/vendor/google.golang.org/protobuf/internal/impl/merge.go @@ -9,8 +9,8 @@ import ( "reflect" "google.golang.org/protobuf/proto" - pref "google.golang.org/protobuf/reflect/protoreflect" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoiface" ) type mergeOptions struct{} @@ -20,17 +20,17 @@ func (o mergeOptions) Merge(dst, src proto.Message) { } // merge is protoreflect.Methods.Merge. -func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput { +func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput { dp, ok := mi.getPointer(in.Destination) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } sp, ok := mi.getPointer(in.Source) if !ok { - return piface.MergeOutput{} + return protoiface.MergeOutput{} } mi.mergePointer(dp, sp, mergeOptions{}) - return piface.MergeOutput{Flags: piface.MergeComplete} + return protoiface.MergeOutput{Flags: protoiface.MergeComplete} } func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { @@ -64,7 +64,7 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { continue } dx := (*dext)[num] - var dv pref.Value + var dv protoreflect.Value if dx.Type() == sx.Type() { dv = dx.Value() } @@ -85,15 +85,15 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { } } -func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { return src } -func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value { - return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) +func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { + return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) } -func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { @@ -102,29 +102,29 @@ func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { return dst } -func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { sb := srcl.Get(i).Bytes() db := append(emptyBuf[:], sb...) - dstl.Append(pref.ValueOfBytes(db)) + dstl.Append(protoreflect.ValueOfBytes(db)) } return dst } -func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { dstl := dst.List() srcl := src.List() for i, llen := 0, srcl.Len(); i < llen; i++ { sm := srcl.Get(i).Message() dm := proto.Clone(sm.Interface()).ProtoReflect() - dstl.Append(pref.ValueOfMessage(dm)) + dstl.Append(protoreflect.ValueOfMessage(dm)) } return dst } -func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value { +func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { opts.Merge(dst.Message().Interface(), src.Message().Interface()) return dst } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index a104e28e8..4f5fb67a0 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -14,8 +14,7 @@ import ( "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoregistry" ) // MessageInfo provides protobuf related functionality for a given Go type @@ -29,7 +28,7 @@ type MessageInfo struct { GoReflectType reflect.Type // pointer to struct // Desc is the underlying message descriptor type and must be populated. - Desc pref.MessageDescriptor + Desc protoreflect.MessageDescriptor // Exporter must be provided in a purego environment in order to provide // access to unexported fields. @@ -54,7 +53,7 @@ type exporter func(v interface{}, i int) interface{} // is generated by our implementation of protoc-gen-go (for v2 and on). // If it is unable to obtain a MessageInfo, it returns nil. func getMessageInfo(mt reflect.Type) *MessageInfo { - m, ok := reflect.Zero(mt).Interface().(pref.ProtoMessage) + m, ok := reflect.Zero(mt).Interface().(protoreflect.ProtoMessage) if !ok { return nil } @@ -97,7 +96,7 @@ func (mi *MessageInfo) initOnce() { // getPointer returns the pointer for a message, which should be of // the type of the MessageInfo. If the message is of a different type, // it returns ok==false. -func (mi *MessageInfo) getPointer(m pref.Message) (p pointer, ok bool) { +func (mi *MessageInfo) getPointer(m protoreflect.Message) (p pointer, ok bool) { switch m := m.(type) { case *messageState: return m.pointer(), m.messageInfo() == mi @@ -134,10 +133,10 @@ type structInfo struct { extensionOffset offset extensionType reflect.Type - fieldsByNumber map[pref.FieldNumber]reflect.StructField - oneofsByName map[pref.Name]reflect.StructField - oneofWrappersByType map[reflect.Type]pref.FieldNumber - oneofWrappersByNumber map[pref.FieldNumber]reflect.Type + fieldsByNumber map[protoreflect.FieldNumber]reflect.StructField + oneofsByName map[protoreflect.Name]reflect.StructField + oneofWrappersByType map[reflect.Type]protoreflect.FieldNumber + oneofWrappersByNumber map[protoreflect.FieldNumber]reflect.Type } func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { @@ -147,10 +146,10 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { unknownOffset: invalidOffset, extensionOffset: invalidOffset, - fieldsByNumber: map[pref.FieldNumber]reflect.StructField{}, - oneofsByName: map[pref.Name]reflect.StructField{}, - oneofWrappersByType: map[reflect.Type]pref.FieldNumber{}, - oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{}, + fieldsByNumber: map[protoreflect.FieldNumber]reflect.StructField{}, + oneofsByName: map[protoreflect.Name]reflect.StructField{}, + oneofWrappersByType: map[reflect.Type]protoreflect.FieldNumber{}, + oneofWrappersByNumber: map[protoreflect.FieldNumber]reflect.Type{}, } fieldLoop: @@ -180,12 +179,12 @@ fieldLoop: for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { if len(s) > 0 && strings.Trim(s, "0123456789") == "" { n, _ := strconv.ParseUint(s, 10, 64) - si.fieldsByNumber[pref.FieldNumber(n)] = f + si.fieldsByNumber[protoreflect.FieldNumber(n)] = f continue fieldLoop } } if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 { - si.oneofsByName[pref.Name(s)] = f + si.oneofsByName[protoreflect.Name(s)] = f continue fieldLoop } } @@ -208,8 +207,8 @@ fieldLoop: for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { if len(s) > 0 && strings.Trim(s, "0123456789") == "" { n, _ := strconv.ParseUint(s, 10, 64) - si.oneofWrappersByType[tf] = pref.FieldNumber(n) - si.oneofWrappersByNumber[pref.FieldNumber(n)] = tf + si.oneofWrappersByType[tf] = protoreflect.FieldNumber(n) + si.oneofWrappersByNumber[protoreflect.FieldNumber(n)] = tf break } } @@ -219,7 +218,11 @@ fieldLoop: } func (mi *MessageInfo) New() protoreflect.Message { - return mi.MessageOf(reflect.New(mi.GoReflectType.Elem()).Interface()) + m := reflect.New(mi.GoReflectType.Elem()).Interface() + if r, ok := m.(protoreflect.ProtoMessage); ok { + return r.ProtoReflect() + } + return mi.MessageOf(m) } func (mi *MessageInfo) Zero() protoreflect.Message { return mi.MessageOf(reflect.Zero(mi.GoReflectType).Interface()) @@ -237,7 +240,7 @@ func (mi *MessageInfo) Message(i int) protoreflect.MessageType { fd := mi.Desc.Fields().Get(i) switch { case fd.IsWeak(): - mt, _ := preg.GlobalTypes.FindMessageByName(fd.Message().FullName()) + mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()) return mt case fd.IsMap(): return mapEntryType{fd.Message(), mi.fieldTypes[fd.Number()]} diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go index 9488b7261..d9ea010be 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go @@ -10,17 +10,17 @@ import ( "google.golang.org/protobuf/internal/detrand" "google.golang.org/protobuf/internal/pragma" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type reflectMessageInfo struct { - fields map[pref.FieldNumber]*fieldInfo - oneofs map[pref.Name]*oneofInfo + fields map[protoreflect.FieldNumber]*fieldInfo + oneofs map[protoreflect.Name]*oneofInfo // fieldTypes contains the zero value of an enum or message field. // For lists, it contains the element type. // For maps, it contains the entry value type. - fieldTypes map[pref.FieldNumber]interface{} + fieldTypes map[protoreflect.FieldNumber]interface{} // denseFields is a subset of fields where: // 0 < fieldDesc.Number() < len(denseFields) @@ -30,8 +30,8 @@ type reflectMessageInfo struct { // rangeInfos is a list of all fields (not belonging to a oneof) and oneofs. rangeInfos []interface{} // either *fieldInfo or *oneofInfo - getUnknown func(pointer) pref.RawFields - setUnknown func(pointer, pref.RawFields) + getUnknown func(pointer) protoreflect.RawFields + setUnknown func(pointer, protoreflect.RawFields) extensionMap func(pointer) *extensionMap nilMessage atomicNilMessage @@ -52,7 +52,7 @@ func (mi *MessageInfo) makeReflectFuncs(t reflect.Type, si structInfo) { // This code assumes that the struct is well-formed and panics if there are // any discrepancies. func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { - mi.fields = map[pref.FieldNumber]*fieldInfo{} + mi.fields = map[protoreflect.FieldNumber]*fieldInfo{} md := mi.Desc fds := md.Fields() for i := 0; i < fds.Len(); i++ { @@ -82,7 +82,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { mi.fields[fd.Number()] = &fi } - mi.oneofs = map[pref.Name]*oneofInfo{} + mi.oneofs = map[protoreflect.Name]*oneofInfo{} for i := 0; i < md.Oneofs().Len(); i++ { od := md.Oneofs().Get(i) mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter) @@ -117,13 +117,13 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { switch { case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsAType: // Handle as []byte. - mi.getUnknown = func(p pointer) pref.RawFields { + mi.getUnknown = func(p pointer) protoreflect.RawFields { if p.IsNil() { return nil } return *p.Apply(mi.unknownOffset).Bytes() } - mi.setUnknown = func(p pointer, b pref.RawFields) { + mi.setUnknown = func(p pointer, b protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -131,7 +131,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { } case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsBType: // Handle as *[]byte. - mi.getUnknown = func(p pointer) pref.RawFields { + mi.getUnknown = func(p pointer) protoreflect.RawFields { if p.IsNil() { return nil } @@ -141,7 +141,7 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { } return **bp } - mi.setUnknown = func(p pointer, b pref.RawFields) { + mi.setUnknown = func(p pointer, b protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -152,10 +152,10 @@ func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { **bp = b } default: - mi.getUnknown = func(pointer) pref.RawFields { + mi.getUnknown = func(pointer) protoreflect.RawFields { return nil } - mi.setUnknown = func(p pointer, _ pref.RawFields) { + mi.setUnknown = func(p pointer, _ protoreflect.RawFields) { if p.IsNil() { panic("invalid SetUnknown on nil Message") } @@ -224,7 +224,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { } if ft != nil { if mi.fieldTypes == nil { - mi.fieldTypes = make(map[pref.FieldNumber]interface{}) + mi.fieldTypes = make(map[protoreflect.FieldNumber]interface{}) } mi.fieldTypes[fd.Number()] = reflect.Zero(ft).Interface() } @@ -233,7 +233,7 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { type extensionMap map[int32]ExtensionField -func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { +func (m *extensionMap) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { if m != nil { for _, x := range *m { xd := x.Type().TypeDescriptor() @@ -247,7 +247,7 @@ func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { } } } -func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { +func (m *extensionMap) Has(xt protoreflect.ExtensionType) (ok bool) { if m == nil { return false } @@ -266,10 +266,10 @@ func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { } return true } -func (m *extensionMap) Clear(xt pref.ExtensionType) { +func (m *extensionMap) Clear(xt protoreflect.ExtensionType) { delete(*m, int32(xt.TypeDescriptor().Number())) } -func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { +func (m *extensionMap) Get(xt protoreflect.ExtensionType) protoreflect.Value { xd := xt.TypeDescriptor() if m != nil { if x, ok := (*m)[int32(xd.Number())]; ok { @@ -278,7 +278,7 @@ func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { } return xt.Zero() } -func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { +func (m *extensionMap) Set(xt protoreflect.ExtensionType, v protoreflect.Value) { xd := xt.TypeDescriptor() isValid := true switch { @@ -302,9 +302,9 @@ func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { x.Set(xt, v) (*m)[int32(xd.Number())] = x } -func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { +func (m *extensionMap) Mutable(xt protoreflect.ExtensionType) protoreflect.Value { xd := xt.TypeDescriptor() - if xd.Kind() != pref.MessageKind && xd.Kind() != pref.GroupKind && !xd.IsList() && !xd.IsMap() { + if xd.Kind() != protoreflect.MessageKind && xd.Kind() != protoreflect.GroupKind && !xd.IsList() && !xd.IsMap() { panic("invalid Mutable on field with non-composite type") } if x, ok := (*m)[int32(xd.Number())]; ok { @@ -320,7 +320,6 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { // in an allocation-free way without needing to have a shadow Go type generated // for every message type. This technique only works using unsafe. // -// // Example generated code: // // type M struct { @@ -351,12 +350,11 @@ func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { // It has access to the message info as its first field, and a pointer to the // MessageState is identical to a pointer to the concrete message value. // -// // Requirements: -// • The type M must implement protoreflect.ProtoMessage. -// • The address of m must not be nil. -// • The address of m and the address of m.state must be equal, -// even though they are different Go types. +// - The type M must implement protoreflect.ProtoMessage. +// - The address of m must not be nil. +// - The address of m and the address of m.state must be equal, +// even though they are different Go types. type MessageState struct { pragma.NoUnkeyedLiterals pragma.DoNotCompare @@ -368,8 +366,8 @@ type MessageState struct { type messageState MessageState var ( - _ pref.Message = (*messageState)(nil) - _ unwrapper = (*messageState)(nil) + _ protoreflect.Message = (*messageState)(nil) + _ unwrapper = (*messageState)(nil) ) // messageDataType is a tuple of a pointer to the message data and @@ -387,16 +385,16 @@ type ( ) var ( - _ pref.Message = (*messageReflectWrapper)(nil) - _ unwrapper = (*messageReflectWrapper)(nil) - _ pref.ProtoMessage = (*messageIfaceWrapper)(nil) - _ unwrapper = (*messageIfaceWrapper)(nil) + _ protoreflect.Message = (*messageReflectWrapper)(nil) + _ unwrapper = (*messageReflectWrapper)(nil) + _ protoreflect.ProtoMessage = (*messageIfaceWrapper)(nil) + _ unwrapper = (*messageIfaceWrapper)(nil) ) // MessageOf returns a reflective view over a message. The input must be a // pointer to a named Go struct. If the provided type has a ProtoReflect method, // it must be implemented by calling this method. -func (mi *MessageInfo) MessageOf(m interface{}) pref.Message { +func (mi *MessageInfo) MessageOf(m interface{}) protoreflect.Message { if reflect.TypeOf(m) != mi.GoReflectType { panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoReflectType)) } @@ -421,7 +419,7 @@ func (m *messageIfaceWrapper) Reset() { rv.Elem().Set(reflect.Zero(rv.Type().Elem())) } } -func (m *messageIfaceWrapper) ProtoReflect() pref.Message { +func (m *messageIfaceWrapper) ProtoReflect() protoreflect.Message { return (*messageReflectWrapper)(m) } func (m *messageIfaceWrapper) protoUnwrap() interface{} { @@ -430,7 +428,7 @@ func (m *messageIfaceWrapper) protoUnwrap() interface{} { // checkField verifies that the provided field descriptor is valid. // Exactly one of the returned values is populated. -func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) { +func (mi *MessageInfo) checkField(fd protoreflect.FieldDescriptor) (*fieldInfo, protoreflect.ExtensionType) { var fi *fieldInfo if n := fd.Number(); 0 < n && int(n) < len(mi.denseFields) { fi = mi.denseFields[n] @@ -455,7 +453,7 @@ func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.Ext if !mi.Desc.ExtensionRanges().Has(fd.Number()) { panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName())) } - xtd, ok := fd.(pref.ExtensionTypeDescriptor) + xtd, ok := fd.(protoreflect.ExtensionTypeDescriptor) if !ok { panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName())) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go index 343cf8721..5e736c60e 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go @@ -11,24 +11,24 @@ import ( "sync" "google.golang.org/protobuf/internal/flags" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" ) type fieldInfo struct { - fieldDesc pref.FieldDescriptor + fieldDesc protoreflect.FieldDescriptor // These fields are used for protobuf reflection support. has func(pointer) bool clear func(pointer) - get func(pointer) pref.Value - set func(pointer, pref.Value) - mutable func(pointer) pref.Value - newMessage func() pref.Message - newField func() pref.Value + get func(pointer) protoreflect.Value + set func(pointer, protoreflect.Value) + mutable func(pointer) protoreflect.Value + newMessage func() protoreflect.Message + newField func() protoreflect.Value } -func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { +func fieldInfoForMissing(fd protoreflect.FieldDescriptor) fieldInfo { // This never occurs for generated message types. // It implies that a hand-crafted type has missing Go fields // for specific protobuf message fields. @@ -40,19 +40,19 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { clear: func(p pointer) { panic("missing Go struct field for " + string(fd.FullName())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { return fd.Default() }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { panic("missing Go struct field for " + string(fd.FullName())) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { panic("missing Go struct field for " + string(fd.FullName())) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { panic("missing Go struct field for " + string(fd.FullName())) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { if v := fd.Default(); v.IsValid() { return v } @@ -61,7 +61,7 @@ func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { } } -func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { +func fieldInfoForOneof(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Interface { panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft)) @@ -102,7 +102,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export } rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -113,7 +113,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export rv = rv.Elem().Elem().Field(0) return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { rv.Set(reflect.New(ot)) @@ -121,7 +121,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export rv = rv.Elem().Elem().Field(0) rv.Set(conv.GoValueOf(v)) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { if !isMessage { panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName())) } @@ -131,20 +131,20 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export } rv = rv.Elem().Elem().Field(0) if rv.Kind() == reflect.Ptr && rv.IsNil() { - rv.Set(conv.GoValueOf(pref.ValueOfMessage(conv.New().Message()))) + rv.Set(conv.GoValueOf(protoreflect.ValueOfMessage(conv.New().Message()))) } return conv.PBValueOf(rv) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { return conv.New().Message() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForMap(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Map { panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft)) @@ -166,7 +166,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -176,7 +176,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { @@ -184,20 +184,20 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter } rv.Set(pv) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if v.IsNil() { v.Set(reflect.MakeMap(fs.Type)) } return conv.PBValueOf(v) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForList(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Slice { panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft)) @@ -219,7 +219,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -229,7 +229,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { @@ -237,11 +237,11 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte } rv.Set(pv.Elem()) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { v := p.Apply(fieldOffset).AsValueOf(fs.Type) return conv.PBValueOf(v) }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } @@ -252,7 +252,7 @@ var ( emptyBytes = reflect.ValueOf([]byte{}) ) -func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type nullable := fd.HasPresence() isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 @@ -300,7 +300,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } @@ -315,7 +315,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor } return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if nullable && rv.Kind() == reflect.Ptr { if rv.IsNil() { @@ -332,23 +332,23 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor } } }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } -func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldInfo { +func fieldInfoForWeakMessage(fd protoreflect.FieldDescriptor, weakOffset offset) fieldInfo { if !flags.ProtoLegacy { panic("no support for proto1 weak fields") } var once sync.Once - var messageType pref.MessageType + var messageType protoreflect.MessageType lazyInit := func() { once.Do(func() { messageName := fd.Message().FullName() - messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) + messageType, _ = protoregistry.GlobalTypes.FindMessageByName(messageName) if messageType == nil { panic(fmt.Sprintf("weak message %v for field %v is not linked in", messageName, fd.FullName())) } @@ -368,18 +368,18 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn clear: func(p pointer) { p.Apply(weakOffset).WeakFields().clear(num) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { lazyInit() if p.IsNil() { - return pref.ValueOfMessage(messageType.Zero()) + return protoreflect.ValueOfMessage(messageType.Zero()) } m, ok := p.Apply(weakOffset).WeakFields().get(num) if !ok { - return pref.ValueOfMessage(messageType.Zero()) + return protoreflect.ValueOfMessage(messageType.Zero()) } - return pref.ValueOfMessage(m.ProtoReflect()) + return protoreflect.ValueOfMessage(m.ProtoReflect()) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { lazyInit() m := v.Message() if m.Descriptor() != messageType.Descriptor() { @@ -390,7 +390,7 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn } p.Apply(weakOffset).WeakFields().set(num, m.Interface()) }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { lazyInit() fs := p.Apply(weakOffset).WeakFields() m, ok := fs.get(num) @@ -398,20 +398,20 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn m = messageType.New().Interface() fs.set(num, m) } - return pref.ValueOfMessage(m.ProtoReflect()) + return protoreflect.ValueOfMessage(m.ProtoReflect()) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { lazyInit() return messageType.New() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { lazyInit() - return pref.ValueOfMessage(messageType.New()) + return protoreflect.ValueOfMessage(messageType.New()) }, } } -func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { +func fieldInfoForMessage(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type conv := NewConverter(ft, fd) @@ -433,47 +433,47 @@ func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x expo rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) pref.Value { + get: func(p pointer) protoreflect.Value { if p.IsNil() { return conv.Zero() } rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() return conv.PBValueOf(rv) }, - set: func(p pointer, v pref.Value) { + set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(conv.GoValueOf(v)) if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName())) } }, - mutable: func(p pointer) pref.Value { + mutable: func(p pointer) protoreflect.Value { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { rv.Set(conv.GoValueOf(conv.New())) } return conv.PBValueOf(rv) }, - newMessage: func() pref.Message { + newMessage: func() protoreflect.Message { return conv.New().Message() }, - newField: func() pref.Value { + newField: func() protoreflect.Value { return conv.New() }, } } type oneofInfo struct { - oneofDesc pref.OneofDescriptor - which func(pointer) pref.FieldNumber + oneofDesc protoreflect.OneofDescriptor + which func(pointer) protoreflect.FieldNumber } -func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInfo { +func makeOneofInfo(od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo { oi := &oneofInfo{oneofDesc: od} if od.IsSynthetic() { fs := si.fieldsByNumber[od.Fields().Get(0).Number()] fieldOffset := offsetOf(fs, x) - oi.which = func(p pointer) pref.FieldNumber { + oi.which = func(p pointer) protoreflect.FieldNumber { if p.IsNil() { return 0 } @@ -486,7 +486,7 @@ func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInf } else { fs := si.oneofsByName[od.Name()] fieldOffset := offsetOf(fs, x) - oi.which = func(p pointer) pref.FieldNumber { + oi.which = func(p pointer) protoreflect.FieldNumber { if p.IsNil() { return 0 } diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go index 08cfb6054..a24e6bbd7 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/validate.go +++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go @@ -16,9 +16,9 @@ import ( "google.golang.org/protobuf/internal/flags" "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" - pref "google.golang.org/protobuf/reflect/protoreflect" - preg "google.golang.org/protobuf/reflect/protoregistry" - piface "google.golang.org/protobuf/runtime/protoiface" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/runtime/protoiface" ) // ValidationStatus is the result of validating the wire-format encoding of a message. @@ -56,20 +56,20 @@ func (v ValidationStatus) String() string { // of the message type. // // This function is exposed for testing. -func Validate(mt pref.MessageType, in piface.UnmarshalInput) (out piface.UnmarshalOutput, _ ValidationStatus) { +func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out protoiface.UnmarshalOutput, _ ValidationStatus) { mi, ok := mt.(*MessageInfo) if !ok { return out, ValidationUnknown } if in.Resolver == nil { - in.Resolver = preg.GlobalTypes + in.Resolver = protoregistry.GlobalTypes } o, st := mi.validate(in.Buf, 0, unmarshalOptions{ flags: in.Flags, resolver: in.Resolver, }) if o.initialized { - out.Flags |= piface.UnmarshalInitialized + out.Flags |= protoiface.UnmarshalInitialized } return out, st } @@ -106,22 +106,22 @@ const ( validationTypeMessageSetItem ) -func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescriptor, ft reflect.Type) validationInfo { +func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { var vi validationInfo switch { case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { vi.mi = getMessageInfo(ot.Field(0).Type) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { vi.mi = getMessageInfo(ot.Field(0).Type) } - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String } @@ -129,7 +129,7 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip default: vi = newValidationInfo(fd, ft) } - if fd.Cardinality() == pref.Required { + if fd.Cardinality() == protoreflect.Required { // Avoid overflow. The required field check is done with a 64-bit mask, with // any message containing more than 64 required fields always reported as // potentially uninitialized, so it is not important to get a precise count @@ -142,22 +142,22 @@ func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescrip return vi } -func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo { +func newValidationInfo(fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo { var vi validationInfo switch { case fd.IsList(): switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } - case pref.StringKind: + case protoreflect.StringKind: vi.typ = validationTypeBytes if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String @@ -175,33 +175,33 @@ func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo case fd.IsMap(): vi.typ = validationTypeMap switch fd.MapKey().Kind() { - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.keyType = validationTypeUTF8String } } switch fd.MapValue().Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.valType = validationTypeMessage if ft.Kind() == reflect.Map { vi.mi = getMessageInfo(ft.Elem()) } - case pref.StringKind: + case protoreflect.StringKind: if strs.EnforceUTF8(fd) { vi.valType = validationTypeUTF8String } } default: switch fd.Kind() { - case pref.MessageKind: + case protoreflect.MessageKind: vi.typ = validationTypeMessage if !fd.IsWeak() { vi.mi = getMessageInfo(ft) } - case pref.GroupKind: + case protoreflect.GroupKind: vi.typ = validationTypeGroup vi.mi = getMessageInfo(ft) - case pref.StringKind: + case protoreflect.StringKind: vi.typ = validationTypeBytes if strs.EnforceUTF8(fd) { vi.typ = validationTypeUTF8String @@ -314,11 +314,11 @@ State: break } messageName := fd.Message().FullName() - messageType, err := preg.GlobalTypes.FindMessageByName(messageName) + messageType, err := protoregistry.GlobalTypes.FindMessageByName(messageName) switch err { case nil: vi.mi, _ = messageType.(*MessageInfo) - case preg.NotFound: + case protoregistry.NotFound: vi.typ = validationTypeBytes default: return out, ValidationUnknown @@ -335,7 +335,7 @@ State: // unmarshaling to begin failing. Supporting this requires some way to // determine if the resolver is frozen. xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), num) - if err != nil && err != preg.NotFound { + if err != nil && err != protoregistry.NotFound { return out, ValidationUnknown } if err == nil { @@ -513,7 +513,7 @@ State: } xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), typeid) switch { - case err == preg.NotFound: + case err == protoregistry.NotFound: b = b[n:] case err != nil: return out, ValidationUnknown diff --git a/vendor/google.golang.org/protobuf/internal/impl/weak.go b/vendor/google.golang.org/protobuf/internal/impl/weak.go index 009cbefd1..eb79a7ba9 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/weak.go +++ b/vendor/google.golang.org/protobuf/internal/impl/weak.go @@ -7,7 +7,7 @@ package impl import ( "fmt" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" ) @@ -17,32 +17,32 @@ import ( // defined directly on it. type weakFields WeakFields -func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) { +func (w weakFields) get(num protoreflect.FieldNumber) (protoreflect.ProtoMessage, bool) { m, ok := w[int32(num)] return m, ok } -func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) { +func (w *weakFields) set(num protoreflect.FieldNumber, m protoreflect.ProtoMessage) { if *w == nil { *w = make(weakFields) } (*w)[int32(num)] = m } -func (w *weakFields) clear(num pref.FieldNumber) { +func (w *weakFields) clear(num protoreflect.FieldNumber) { delete(*w, int32(num)) } -func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool { +func (Export) HasWeak(w WeakFields, num protoreflect.FieldNumber) bool { _, ok := w[int32(num)] return ok } -func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) { +func (Export) ClearWeak(w *WeakFields, num protoreflect.FieldNumber) { delete(*w, int32(num)) } -func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage { +func (Export) GetWeak(w WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName) protoreflect.ProtoMessage { if m, ok := w[int32(num)]; ok { return m } @@ -53,7 +53,7 @@ func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pr return mt.Zero().Interface() } -func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) { +func (Export) SetWeak(w *WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName, m protoreflect.ProtoMessage) { if m != nil { mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) if mt == nil { diff --git a/vendor/google.golang.org/protobuf/internal/order/order.go b/vendor/google.golang.org/protobuf/internal/order/order.go index 2a24953f6..dea522e12 100644 --- a/vendor/google.golang.org/protobuf/internal/order/order.go +++ b/vendor/google.golang.org/protobuf/internal/order/order.go @@ -5,12 +5,12 @@ package order import ( - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) // FieldOrder specifies the ordering to visit message fields. // It is a function that reports whether x is ordered before y. -type FieldOrder func(x, y pref.FieldDescriptor) bool +type FieldOrder func(x, y protoreflect.FieldDescriptor) bool var ( // AnyFieldOrder specifies no specific field ordering. @@ -18,9 +18,9 @@ var ( // LegacyFieldOrder sorts fields in the same ordering as emitted by // wire serialization in the github.com/golang/protobuf implementation. - LegacyFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + LegacyFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { ox, oy := x.ContainingOneof(), y.ContainingOneof() - inOneof := func(od pref.OneofDescriptor) bool { + inOneof := func(od protoreflect.OneofDescriptor) bool { return od != nil && !od.IsSynthetic() } @@ -33,7 +33,7 @@ var ( return !inOneof(ox) && inOneof(oy) } // Fields in disjoint oneof sets are sorted by declaration index. - if ox != nil && oy != nil && ox != oy { + if inOneof(ox) && inOneof(oy) && ox != oy { return ox.Index() < oy.Index() } // Fields sorted by field number. @@ -41,14 +41,14 @@ var ( } // NumberFieldOrder sorts fields by their field number. - NumberFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + NumberFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { return x.Number() < y.Number() } // IndexNameFieldOrder sorts non-extension fields before extension fields. // Non-extensions are sorted according to their declaration index. // Extensions are sorted according to their full name. - IndexNameFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { + IndexNameFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool { // Non-extension fields sort before extension fields. if x.IsExtension() != y.IsExtension() { return !x.IsExtension() && y.IsExtension() @@ -64,7 +64,7 @@ var ( // KeyOrder specifies the ordering to visit map entries. // It is a function that reports whether x is ordered before y. -type KeyOrder func(x, y pref.MapKey) bool +type KeyOrder func(x, y protoreflect.MapKey) bool var ( // AnyKeyOrder specifies no specific key ordering. @@ -72,7 +72,7 @@ var ( // GenericKeyOrder sorts false before true, numeric keys in ascending order, // and strings in lexicographical ordering according to UTF-8 codepoints. - GenericKeyOrder KeyOrder = func(x, y pref.MapKey) bool { + GenericKeyOrder KeyOrder = func(x, y protoreflect.MapKey) bool { switch x.Interface().(type) { case bool: return !x.Bool() && y.Bool() diff --git a/vendor/google.golang.org/protobuf/internal/order/range.go b/vendor/google.golang.org/protobuf/internal/order/range.go index c8090e0c5..1665a68e5 100644 --- a/vendor/google.golang.org/protobuf/internal/order/range.go +++ b/vendor/google.golang.org/protobuf/internal/order/range.go @@ -9,12 +9,12 @@ import ( "sort" "sync" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type messageField struct { - fd pref.FieldDescriptor - v pref.Value + fd protoreflect.FieldDescriptor + v protoreflect.Value } var messageFieldPool = sync.Pool{ @@ -25,8 +25,8 @@ type ( // FieldRnger is an interface for visiting all fields in a message. // The protoreflect.Message type implements this interface. FieldRanger interface{ Range(VisitField) } - // VisitField is called everytime a message field is visited. - VisitField = func(pref.FieldDescriptor, pref.Value) bool + // VisitField is called every time a message field is visited. + VisitField = func(protoreflect.FieldDescriptor, protoreflect.Value) bool ) // RangeFields iterates over the fields of fs according to the specified order. @@ -47,7 +47,7 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { }() // Collect all fields in the message and sort them. - fs.Range(func(fd pref.FieldDescriptor, v pref.Value) bool { + fs.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { fields = append(fields, messageField{fd, v}) return true }) @@ -64,8 +64,8 @@ func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { } type mapEntry struct { - k pref.MapKey - v pref.Value + k protoreflect.MapKey + v protoreflect.Value } var mapEntryPool = sync.Pool{ @@ -76,8 +76,8 @@ type ( // EntryRanger is an interface for visiting all fields in a message. // The protoreflect.Map type implements this interface. EntryRanger interface{ Range(VisitEntry) } - // VisitEntry is called everytime a map entry is visited. - VisitEntry = func(pref.MapKey, pref.Value) bool + // VisitEntry is called every time a map entry is visited. + VisitEntry = func(protoreflect.MapKey, protoreflect.Value) bool ) // RangeEntries iterates over the entries of es according to the specified order. @@ -98,7 +98,7 @@ func RangeEntries(es EntryRanger, less KeyOrder, fn VisitEntry) { }() // Collect all entries in the map and sort them. - es.Range(func(k pref.MapKey, v pref.Value) bool { + es.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool { entries = append(entries, mapEntry{k, v}) return true }) diff --git a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go index 56a8a4ed3..61a84d341 100644 --- a/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go @@ -10,7 +10,7 @@ package strs import ( "unsafe" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) type ( @@ -59,7 +59,7 @@ type Builder struct { // AppendFullName is equivalent to protoreflect.FullName.Append, // but optimized for large batches where each name has a shared lifetime. -func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { +func (sb *Builder) AppendFullName(prefix protoreflect.FullName, name protoreflect.Name) protoreflect.FullName { n := len(prefix) + len(".") + len(name) if len(prefix) == 0 { n -= len(".") @@ -68,7 +68,7 @@ func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.Ful sb.buf = append(sb.buf, prefix...) sb.buf = append(sb.buf, '.') sb.buf = append(sb.buf, name...) - return pref.FullName(sb.last(n)) + return protoreflect.FullName(sb.last(n)) } // MakeString is equivalent to string(b), but optimized for large batches @@ -87,7 +87,7 @@ func (sb *Builder) grow(n int) { // Unlike strings.Builder, we do not need to copy over the contents // of the old buffer since our builder provides no API for // retrieving previously created strings. - sb.buf = make([]byte, 2*(cap(sb.buf)+n)) + sb.buf = make([]byte, 0, 2*(cap(sb.buf)+n)) } func (sb *Builder) last(n int) string { diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 3d40d5249..0999f29d5 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -12,47 +12,46 @@ import ( // These constants determine the current version of this module. // -// // For our release process, we enforce the following rules: -// * Tagged releases use a tag that is identical to String. -// * Tagged releases never reference a commit where the String -// contains "devel". -// * The set of all commits in this repository where String -// does not contain "devel" must have a unique String. -// +// - Tagged releases use a tag that is identical to String. +// - Tagged releases never reference a commit where the String +// contains "devel". +// - The set of all commits in this repository where String +// does not contain "devel" must have a unique String. // // Steps for tagging a new release: -// 1. Create a new CL. // -// 2. Update Minor, Patch, and/or PreRelease as necessary. -// PreRelease must not contain the string "devel". +// 1. Create a new CL. // -// 3. Since the last released minor version, have there been any changes to -// generator that relies on new functionality in the runtime? -// If yes, then increment RequiredGenerated. +// 2. Update Minor, Patch, and/or PreRelease as necessary. +// PreRelease must not contain the string "devel". // -// 4. Since the last released minor version, have there been any changes to -// the runtime that removes support for old .pb.go source code? -// If yes, then increment SupportMinimum. +// 3. Since the last released minor version, have there been any changes to +// generator that relies on new functionality in the runtime? +// If yes, then increment RequiredGenerated. // -// 5. Send out the CL for review and submit it. -// Note that the next CL in step 8 must be submitted after this CL -// without any other CLs in-between. +// 4. Since the last released minor version, have there been any changes to +// the runtime that removes support for old .pb.go source code? +// If yes, then increment SupportMinimum. // -// 6. Tag a new version, where the tag is is the current String. +// 5. Send out the CL for review and submit it. +// Note that the next CL in step 8 must be submitted after this CL +// without any other CLs in-between. // -// 7. Write release notes for all notable changes -// between this release and the last release. +// 6. Tag a new version, where the tag is is the current String. // -// 8. Create a new CL. +// 7. Write release notes for all notable changes +// between this release and the last release. // -// 9. Update PreRelease to include the string "devel". -// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" +// 8. Create a new CL. // -// 10. Send out the CL for review and submit it. +// 9. Update PreRelease to include the string "devel". +// For example: "" -> "devel" or "rc.1" -> "rc.1.devel" +// +// 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 28 + Minor = 31 Patch = 0 PreRelease = "" ) @@ -60,6 +59,7 @@ const ( // String formats the version string for this module in semver format. // // Examples: +// // v1.20.1 // v1.21.0-rc.1 func String() string { diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 11bf7173b..48d47946b 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -19,7 +19,8 @@ import ( // UnmarshalOptions configures the unmarshaler. // // Example usage: -// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) +// +// err := UnmarshalOptions{DiscardUnknown: true}.Unmarshal(b, m) type UnmarshalOptions struct { pragma.NoUnkeyedLiterals diff --git a/vendor/google.golang.org/protobuf/proto/doc.go b/vendor/google.golang.org/protobuf/proto/doc.go index c52d8c4ab..ec71e717f 100644 --- a/vendor/google.golang.org/protobuf/proto/doc.go +++ b/vendor/google.golang.org/protobuf/proto/doc.go @@ -5,19 +5,15 @@ // Package proto provides functions operating on protocol buffer messages. // // For documentation on protocol buffers in general, see: -// -// https://developers.google.com/protocol-buffers +// https://protobuf.dev. // // For a tutorial on using protocol buffers with Go, see: -// -// https://developers.google.com/protocol-buffers/docs/gotutorial +// https://protobuf.dev/getting-started/gotutorial. // // For a guide to generated Go protocol buffer code, see: +// https://protobuf.dev/reference/go/go-generated. // -// https://developers.google.com/protocol-buffers/docs/reference/go-generated -// -// -// Binary serialization +// # Binary serialization // // This package contains functions to convert to and from the wire format, // an efficient binary serialization of protocol buffers. @@ -30,8 +26,7 @@ // • Unmarshal converts a message from the wire format. // The UnmarshalOptions type provides more control over wire unmarshaling. // -// -// Basic message operations +// # Basic message operations // // • Clone makes a deep copy of a message. // @@ -45,8 +40,7 @@ // // • CheckInitialized reports whether all required fields in a message are set. // -// -// Optional scalar constructors +// # Optional scalar constructors // // The API for some generated messages represents optional scalar fields // as pointers to a value. For example, an optional string field has the @@ -61,16 +55,14 @@ // // Optional scalar fields are only supported in proto2. // -// -// Extension accessors +// # Extension accessors // // • HasExtension, GetExtension, SetExtension, and ClearExtension // access extension field values in a protocol buffer message. // // Extension fields are only supported in proto2. // -// -// Related packages +// # Related packages // // • Package "google.golang.org/protobuf/encoding/protojson" converts messages to // and from JSON. diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index d18239c23..bf7f816d0 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -16,7 +16,8 @@ import ( // MarshalOptions configures the marshaler. // // Example usage: -// b, err := MarshalOptions{Deterministic: true}.Marshal(m) +// +// b, err := MarshalOptions{Deterministic: true}.Marshal(m) type MarshalOptions struct { pragma.NoUnkeyedLiterals @@ -101,7 +102,9 @@ func (o MarshalOptions) Marshal(m Message) ([]byte, error) { // otherwise it returns a non-nil empty buffer. // // This is to assist the edge-case where user-code does the following: +// // m1.OptionalBytes, _ = proto.Marshal(m2) +// // where they expect the proto2 "optional_bytes" field to be populated // if any only if m2 is a valid message. func emptyBytesForMessage(m Message) []byte { diff --git a/vendor/google.golang.org/protobuf/proto/equal.go b/vendor/google.golang.org/protobuf/proto/equal.go index 4dba2b969..1a0be1b03 100644 --- a/vendor/google.golang.org/protobuf/proto/equal.go +++ b/vendor/google.golang.org/protobuf/proto/equal.go @@ -5,163 +5,53 @@ package proto import ( - "bytes" - "math" "reflect" - "google.golang.org/protobuf/encoding/protowire" - pref "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoreflect" ) -// Equal reports whether two messages are equal. -// If two messages marshal to the same bytes under deterministic serialization, -// then Equal is guaranteed to report true. +// Equal reports whether two messages are equal, +// by recursively comparing the fields of the message. // -// Two messages are equal if they belong to the same message descriptor, -// have the same set of populated known and extension field values, -// and the same set of unknown fields values. If either of the top-level -// messages are invalid, then Equal reports true only if both are invalid. +// - Bytes fields are equal if they contain identical bytes. +// Empty bytes (regardless of nil-ness) are considered equal. // -// Scalar values are compared with the equivalent of the == operator in Go, -// except bytes values which are compared using bytes.Equal and -// floating point values which specially treat NaNs as equal. -// Message values are compared by recursively calling Equal. -// Lists are equal if each element value is also equal. -// Maps are equal if they have the same set of keys, where the pair of values -// for each key is also equal. +// - Floating-point fields are equal if they contain the same value. +// Unlike the == operator, a NaN is equal to another NaN. +// +// - Other scalar fields are equal if they contain the same value. +// +// - Message fields are equal if they have +// the same set of populated known and extension field values, and +// the same set of unknown fields values. +// +// - Lists are equal if they are the same length and +// each corresponding element is equal. +// +// - Maps are equal if they have the same set of keys and +// the corresponding value for each key is equal. +// +// An invalid message is not equal to a valid message. +// An invalid message is only equal to another invalid message of the +// same type. An invalid message often corresponds to a nil pointer +// of the concrete message type. For example, (*pb.M)(nil) is not equal +// to &pb.M{}. +// If two valid messages marshal to the same bytes under deterministic +// serialization, then Equal is guaranteed to report true. func Equal(x, y Message) bool { if x == nil || y == nil { return x == nil && y == nil } + if reflect.TypeOf(x).Kind() == reflect.Ptr && x == y { + // Avoid an expensive comparison if both inputs are identical pointers. + return true + } mx := x.ProtoReflect() my := y.ProtoReflect() if mx.IsValid() != my.IsValid() { return false } - return equalMessage(mx, my) -} - -// equalMessage compares two messages. -func equalMessage(mx, my pref.Message) bool { - if mx.Descriptor() != my.Descriptor() { - return false - } - - nx := 0 - equal := true - mx.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { - nx++ - vy := my.Get(fd) - equal = my.Has(fd) && equalField(fd, vx, vy) - return equal - }) - if !equal { - return false - } - ny := 0 - my.Range(func(fd pref.FieldDescriptor, vx pref.Value) bool { - ny++ - return true - }) - if nx != ny { - return false - } - - return equalUnknown(mx.GetUnknown(), my.GetUnknown()) -} - -// equalField compares two fields. -func equalField(fd pref.FieldDescriptor, x, y pref.Value) bool { - switch { - case fd.IsList(): - return equalList(fd, x.List(), y.List()) - case fd.IsMap(): - return equalMap(fd, x.Map(), y.Map()) - default: - return equalValue(fd, x, y) - } -} - -// equalMap compares two maps. -func equalMap(fd pref.FieldDescriptor, x, y pref.Map) bool { - if x.Len() != y.Len() { - return false - } - equal := true - x.Range(func(k pref.MapKey, vx pref.Value) bool { - vy := y.Get(k) - equal = y.Has(k) && equalValue(fd.MapValue(), vx, vy) - return equal - }) - return equal -} - -// equalList compares two lists. -func equalList(fd pref.FieldDescriptor, x, y pref.List) bool { - if x.Len() != y.Len() { - return false - } - for i := x.Len() - 1; i >= 0; i-- { - if !equalValue(fd, x.Get(i), y.Get(i)) { - return false - } - } - return true -} - -// equalValue compares two singular values. -func equalValue(fd pref.FieldDescriptor, x, y pref.Value) bool { - switch fd.Kind() { - case pref.BoolKind: - return x.Bool() == y.Bool() - case pref.EnumKind: - return x.Enum() == y.Enum() - case pref.Int32Kind, pref.Sint32Kind, - pref.Int64Kind, pref.Sint64Kind, - pref.Sfixed32Kind, pref.Sfixed64Kind: - return x.Int() == y.Int() - case pref.Uint32Kind, pref.Uint64Kind, - pref.Fixed32Kind, pref.Fixed64Kind: - return x.Uint() == y.Uint() - case pref.FloatKind, pref.DoubleKind: - fx := x.Float() - fy := y.Float() - if math.IsNaN(fx) || math.IsNaN(fy) { - return math.IsNaN(fx) && math.IsNaN(fy) - } - return fx == fy - case pref.StringKind: - return x.String() == y.String() - case pref.BytesKind: - return bytes.Equal(x.Bytes(), y.Bytes()) - case pref.MessageKind, pref.GroupKind: - return equalMessage(x.Message(), y.Message()) - default: - return x.Interface() == y.Interface() - } -} - -// equalUnknown compares unknown fields by direct comparison on the raw bytes -// of each individual field number. -func equalUnknown(x, y pref.RawFields) bool { - if len(x) != len(y) { - return false - } - if bytes.Equal([]byte(x), []byte(y)) { - return true - } - - mx := make(map[pref.FieldNumber]pref.RawFields) - my := make(map[pref.FieldNumber]pref.RawFields) - for len(x) > 0 { - fnum, _, n := protowire.ConsumeField(x) - mx[fnum] = append(mx[fnum], x[:n]...) - x = x[n:] - } - for len(y) > 0 { - fnum, _, n := protowire.ConsumeField(y) - my[fnum] = append(my[fnum], y[:n]...) - y = y[n:] - } - return reflect.DeepEqual(mx, my) + vx := protoreflect.ValueOfMessage(mx) + vy := protoreflect.ValueOfMessage(my) + return vx.Equal(vy) } diff --git a/vendor/google.golang.org/protobuf/proto/size.go b/vendor/google.golang.org/protobuf/proto/size.go index 554b9c6c0..f1692b49b 100644 --- a/vendor/google.golang.org/protobuf/proto/size.go +++ b/vendor/google.golang.org/protobuf/proto/size.go @@ -73,23 +73,27 @@ func (o MarshalOptions) sizeField(fd protoreflect.FieldDescriptor, value protore } func (o MarshalOptions) sizeList(num protowire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) { + sizeTag := protowire.SizeTag(num) + if fd.IsPacked() && list.Len() > 0 { content := 0 for i, llen := 0, list.Len(); i < llen; i++ { content += o.sizeSingular(num, fd.Kind(), list.Get(i)) } - return protowire.SizeTag(num) + protowire.SizeBytes(content) + return sizeTag + protowire.SizeBytes(content) } for i, llen := 0, list.Len(); i < llen; i++ { - size += protowire.SizeTag(num) + o.sizeSingular(num, fd.Kind(), list.Get(i)) + size += sizeTag + o.sizeSingular(num, fd.Kind(), list.Get(i)) } return size } func (o MarshalOptions) sizeMap(num protowire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) { + sizeTag := protowire.SizeTag(num) + mapv.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool { - size += protowire.SizeTag(num) + size += sizeTag size += protowire.SizeBytes(o.sizeField(fd.MapKey(), key.Value()) + o.sizeField(fd.MapValue(), value)) return true }) diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go index cebb36cda..27d7e3501 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go @@ -155,9 +155,9 @@ func (r *resolver) findTarget(k protoreflect.Kind, scope protoreflect.FullName, // // Suppose the scope was "fizz.buzz" and the reference was "Foo.Bar", // then the following full names are searched: -// * fizz.buzz.Foo.Bar -// * fizz.Foo.Bar -// * Foo.Bar +// - fizz.buzz.Foo.Bar +// - fizz.Foo.Bar +// - Foo.Bar func (r *resolver) findDescriptor(scope protoreflect.FullName, ref partialName) (protoreflect.Descriptor, error) { if !ref.IsValid() { return nil, errors.New("invalid name reference: %q", ref) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go index dd85915bd..55aa14922 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go @@ -8,8 +8,7 @@ // defined in proto source files and value interfaces which provide the // ability to examine and manipulate the contents of messages. // -// -// Protocol Buffer Descriptors +// # Protocol Buffer Descriptors // // Protobuf descriptors (e.g., EnumDescriptor or MessageDescriptor) // are immutable objects that represent protobuf type information. @@ -26,8 +25,7 @@ // The "google.golang.org/protobuf/reflect/protodesc" package converts between // google.protobuf.DescriptorProto messages and protobuf descriptors. // -// -// Go Type Descriptors +// # Go Type Descriptors // // A type descriptor (e.g., EnumType or MessageType) is a constructor for // a concrete Go type that represents the associated protobuf descriptor. @@ -41,8 +39,7 @@ // The "google.golang.org/protobuf/types/dynamicpb" package can be used to // create Go type descriptors from protobuf descriptors. // -// -// Value Interfaces +// # Value Interfaces // // The Enum and Message interfaces provide a reflective view over an // enum or message instance. For enums, it provides the ability to retrieve @@ -55,13 +52,11 @@ // The "github.com/golang/protobuf/proto".MessageReflect function can be used // to obtain a reflective view on older messages. // -// -// Relationships +// # Relationships // // The following diagrams demonstrate the relationships between // various types declared in this package. // -// // ┌───────────────────────────────────┐ // V │ // ┌────────────── New(n) ─────────────┐ │ @@ -83,7 +78,6 @@ // // • An Enum is a concrete enum instance. Generated enums implement Enum. // -// // ┌──────────────── New() ─────────────────┐ // │ │ // │ ┌─── Descriptor() ─────┐ │ ┌── Interface() ───┐ @@ -98,12 +92,22 @@ // // • A MessageType describes a concrete Go message type. // It has a MessageDescriptor and can construct a Message instance. +// Just as how Go's reflect.Type is a reflective description of a Go type, +// a MessageType is a reflective description of a Go type for a protobuf message. // // • A MessageDescriptor describes an abstract protobuf message type. -// -// • A Message is a concrete message instance. Generated messages implement -// ProtoMessage, which can convert to/from a Message. -// +// It has no understanding of Go types. In order to construct a MessageType +// from just a MessageDescriptor, you can consider looking up the message type +// in the global registry using protoregistry.GlobalTypes.FindMessageByName +// or constructing a dynamic MessageType using dynamicpb.NewMessageType. +// +// • A Message is a reflective view over a concrete message instance. +// Generated messages implement ProtoMessage, which can convert to a Message. +// Just as how Go's reflect.Value is a reflective view over a Go value, +// a Message is a reflective view over a concrete protobuf message instance. +// Using Go reflection as an analogy, the ProtoReflect method is similar to +// calling reflect.ValueOf, and the Message.Interface method is similar to +// calling reflect.Value.Interface. // // ┌── TypeDescriptor() ──┐ ┌───── Descriptor() ─────┐ // │ V │ V diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go index 121ba3a07..0b9942885 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go @@ -87,6 +87,7 @@ func (p1 SourcePath) Equal(p2 SourcePath) bool { // in a future version of this module. // // Example output: +// // .message_type[6].nested_type[15].field[3] func (p SourcePath) String() string { b := p.appendFileDescriptorProto(nil) diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go index b03c1223c..717b106f3 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go @@ -35,6 +35,8 @@ func (p *SourcePath) appendFileDescriptorProto(b []byte) []byte { b = p.appendSingularField(b, "source_code_info", (*SourcePath).appendSourceCodeInfo) case 12: b = p.appendSingularField(b, "syntax", nil) + case 13: + b = p.appendSingularField(b, "edition", nil) } return b } @@ -236,6 +238,8 @@ func (p *SourcePath) appendMessageOptions(b []byte) []byte { b = p.appendSingularField(b, "deprecated", nil) case 7: b = p.appendSingularField(b, "map_entry", nil) + case 11: + b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -279,6 +283,8 @@ func (p *SourcePath) appendEnumOptions(b []byte) []byte { b = p.appendSingularField(b, "allow_alias", nil) case 3: b = p.appendSingularField(b, "deprecated", nil) + case 6: + b = p.appendSingularField(b, "deprecated_legacy_json_field_conflicts", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -345,10 +351,20 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { b = p.appendSingularField(b, "jstype", nil) case 5: b = p.appendSingularField(b, "lazy", nil) + case 15: + b = p.appendSingularField(b, "unverified_lazy", nil) case 3: b = p.appendSingularField(b, "deprecated", nil) case 10: b = p.appendSingularField(b, "weak", nil) + case 16: + b = p.appendSingularField(b, "debug_redact", nil) + case 17: + b = p.appendSingularField(b, "retention", nil) + case 18: + b = p.appendSingularField(b, "target", nil) + case 19: + b = p.appendRepeatedField(b, "targets", nil) case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) } @@ -404,6 +420,10 @@ func (p *SourcePath) appendExtensionRangeOptions(b []byte) []byte { switch (*p)[0] { case 999: b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) + case 2: + b = p.appendRepeatedField(b, "declaration", (*SourcePath).appendExtensionRangeOptions_Declaration) + case 3: + b = p.appendSingularField(b, "verification", nil) } return b } @@ -459,3 +479,24 @@ func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { } return b } + +func (p *SourcePath) appendExtensionRangeOptions_Declaration(b []byte) []byte { + if len(*p) == 0 { + return b + } + switch (*p)[0] { + case 1: + b = p.appendSingularField(b, "number", nil) + case 2: + b = p.appendSingularField(b, "full_name", nil) + case 3: + b = p.appendSingularField(b, "type", nil) + case 4: + b = p.appendSingularField(b, "is_repeated", nil) + case 5: + b = p.appendSingularField(b, "reserved", nil) + case 6: + b = p.appendSingularField(b, "repeated", nil) + } + return b +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go index 8e53c44a9..3867470d3 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go @@ -480,6 +480,7 @@ type ExtensionDescriptors interface { // relative to the parent that it is declared within. // // For example: +// // syntax = "proto2"; // package example; // message FooMessage { diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go index f31981077..37601b781 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go @@ -148,7 +148,7 @@ type Message interface { // be preserved in marshaling or other operations. IsValid() bool - // ProtoMethods returns optional fast-path implementions of various operations. + // ProtoMethods returns optional fast-path implementations of various operations. // This method may return nil. // // The returned methods type is identical to diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go new file mode 100644 index 000000000..591652541 --- /dev/null +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_equal.go @@ -0,0 +1,168 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package protoreflect + +import ( + "bytes" + "fmt" + "math" + "reflect" + + "google.golang.org/protobuf/encoding/protowire" +) + +// Equal reports whether v1 and v2 are recursively equal. +// +// - Values of different types are always unequal. +// +// - Bytes values are equal if they contain identical bytes. +// Empty bytes (regardless of nil-ness) are considered equal. +// +// - Floating point values are equal if they contain the same value. +// Unlike the == operator, a NaN is equal to another NaN. +// +// - Enums are equal if they contain the same number. +// Since Value does not contain an enum descriptor, +// enum values do not consider the type of the enum. +// +// - Other scalar values are equal if they contain the same value. +// +// - Message values are equal if they belong to the same message descriptor, +// have the same set of populated known and extension field values, +// and the same set of unknown fields values. +// +// - Lists are equal if they are the same length and +// each corresponding element is equal. +// +// - Maps are equal if they have the same set of keys and +// the corresponding value for each key is equal. +func (v1 Value) Equal(v2 Value) bool { + return equalValue(v1, v2) +} + +func equalValue(x, y Value) bool { + eqType := x.typ == y.typ + switch x.typ { + case nilType: + return eqType + case boolType: + return eqType && x.Bool() == y.Bool() + case int32Type, int64Type: + return eqType && x.Int() == y.Int() + case uint32Type, uint64Type: + return eqType && x.Uint() == y.Uint() + case float32Type, float64Type: + return eqType && equalFloat(x.Float(), y.Float()) + case stringType: + return eqType && x.String() == y.String() + case bytesType: + return eqType && bytes.Equal(x.Bytes(), y.Bytes()) + case enumType: + return eqType && x.Enum() == y.Enum() + default: + switch x := x.Interface().(type) { + case Message: + y, ok := y.Interface().(Message) + return ok && equalMessage(x, y) + case List: + y, ok := y.Interface().(List) + return ok && equalList(x, y) + case Map: + y, ok := y.Interface().(Map) + return ok && equalMap(x, y) + default: + panic(fmt.Sprintf("unknown type: %T", x)) + } + } +} + +// equalFloat compares two floats, where NaNs are treated as equal. +func equalFloat(x, y float64) bool { + if math.IsNaN(x) || math.IsNaN(y) { + return math.IsNaN(x) && math.IsNaN(y) + } + return x == y +} + +// equalMessage compares two messages. +func equalMessage(mx, my Message) bool { + if mx.Descriptor() != my.Descriptor() { + return false + } + + nx := 0 + equal := true + mx.Range(func(fd FieldDescriptor, vx Value) bool { + nx++ + vy := my.Get(fd) + equal = my.Has(fd) && equalValue(vx, vy) + return equal + }) + if !equal { + return false + } + ny := 0 + my.Range(func(fd FieldDescriptor, vx Value) bool { + ny++ + return true + }) + if nx != ny { + return false + } + + return equalUnknown(mx.GetUnknown(), my.GetUnknown()) +} + +// equalList compares two lists. +func equalList(x, y List) bool { + if x.Len() != y.Len() { + return false + } + for i := x.Len() - 1; i >= 0; i-- { + if !equalValue(x.Get(i), y.Get(i)) { + return false + } + } + return true +} + +// equalMap compares two maps. +func equalMap(x, y Map) bool { + if x.Len() != y.Len() { + return false + } + equal := true + x.Range(func(k MapKey, vx Value) bool { + vy := y.Get(k) + equal = y.Has(k) && equalValue(vx, vy) + return equal + }) + return equal +} + +// equalUnknown compares unknown fields by direct comparison on the raw bytes +// of each individual field number. +func equalUnknown(x, y RawFields) bool { + if len(x) != len(y) { + return false + } + if bytes.Equal([]byte(x), []byte(y)) { + return true + } + + mx := make(map[FieldNumber]RawFields) + my := make(map[FieldNumber]RawFields) + for len(x) > 0 { + fnum, _, n := protowire.ConsumeField(x) + mx[fnum] = append(mx[fnum], x[:n]...) + x = x[n:] + } + for len(y) > 0 { + fnum, _, n := protowire.ConsumeField(y) + my[fnum] = append(my[fnum], y[:n]...) + y = y[n:] + } + return reflect.DeepEqual(mx, my) +} diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index eb7764c30..08e5ef73f 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -50,14 +50,15 @@ import ( // always references the source object. // // For example: +// // // Append a 0 to a "repeated int32" field. // // Since the Value returned by Mutable is guaranteed to alias // // the source message, modifying the Value modifies the message. -// message.Mutable(fieldDesc).(List).Append(protoreflect.ValueOfInt32(0)) +// message.Mutable(fieldDesc).List().Append(protoreflect.ValueOfInt32(0)) // // // Assign [0] to a "repeated int32" field by creating a new Value, // // modifying it, and assigning it. -// list := message.NewField(fieldDesc).(List) +// list := message.NewField(fieldDesc).List() // list.Append(protoreflect.ValueOfInt32(0)) // message.Set(fieldDesc, list) // // ERROR: Since it is not defined whether Set aliases the source, @@ -392,6 +393,7 @@ func (v Value) MapKey() MapKey { // ╚═════════╧═════════════════════════════════════╝ // // A MapKey is constructed and accessed through a Value: +// // k := ValueOf("hash").MapKey() // convert string to MapKey // s := k.String() // convert MapKey to string // diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index 59f024c44..aeb559774 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -30,9 +30,11 @@ import ( // conflictPolicy configures the policy for handling registration conflicts. // // It can be over-written at compile time with a linker-initialized variable: +// // go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" // // It can be over-written at program execution with an environment variable: +// // GOLANG_PROTOBUF_REGISTRATION_CONFLICT=warn ./main // // Neither of the above are covered by the compatibility promise and @@ -44,7 +46,7 @@ var conflictPolicy = "panic" // "panic" | "warn" | "ignore" // It is a variable so that the behavior is easily overridden in another file. var ignoreConflict = func(d protoreflect.Descriptor, err error) bool { const env = "GOLANG_PROTOBUF_REGISTRATION_CONFLICT" - const faq = "https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict" + const faq = "https://protobuf.dev/reference/go/faq#namespace-conflict" policy := conflictPolicy if v := os.Getenv(env); v != "" { policy = v diff --git a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go index ff094e1ba..a105cb23e 100644 --- a/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +++ b/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go @@ -26,16 +26,19 @@ const ( // EnforceVersion is used by code generated by protoc-gen-go // to statically enforce minimum and maximum versions of this package. // A compilation failure implies either that: -// * the runtime package is too old and needs to be updated OR -// * the generated code is too old and needs to be regenerated. +// - the runtime package is too old and needs to be updated OR +// - the generated code is too old and needs to be regenerated. // // The runtime package can be upgraded by running: +// // go get google.golang.org/protobuf // // The generated code can be regenerated by running: +// // protoc --go_out=${PROTOC_GEN_GO_ARGS} ${PROTO_FILES} // // Example usage by generated code: +// // const ( // // Verify that this generated code is sufficiently up-to-date. // _ = protoimpl.EnforceVersion(genVersion - protoimpl.MinVersion) @@ -49,6 +52,7 @@ const ( type EnforceVersion uint // This enforces the following invariant: +// // MinVersion ≤ GenVersion ≤ MaxVersion const ( _ = EnforceVersion(GenVersion - MinVersion) diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index abe4ab511..04c00f737 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -48,6 +48,64 @@ import ( sync "sync" ) +// The verification state of the extension range. +type ExtensionRangeOptions_VerificationState int32 + +const ( + // All the extensions of the range must be declared. + ExtensionRangeOptions_DECLARATION ExtensionRangeOptions_VerificationState = 0 + ExtensionRangeOptions_UNVERIFIED ExtensionRangeOptions_VerificationState = 1 +) + +// Enum value maps for ExtensionRangeOptions_VerificationState. +var ( + ExtensionRangeOptions_VerificationState_name = map[int32]string{ + 0: "DECLARATION", + 1: "UNVERIFIED", + } + ExtensionRangeOptions_VerificationState_value = map[string]int32{ + "DECLARATION": 0, + "UNVERIFIED": 1, + } +) + +func (x ExtensionRangeOptions_VerificationState) Enum() *ExtensionRangeOptions_VerificationState { + p := new(ExtensionRangeOptions_VerificationState) + *p = x + return p +} + +func (x ExtensionRangeOptions_VerificationState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExtensionRangeOptions_VerificationState) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() +} + +func (ExtensionRangeOptions_VerificationState) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[0] +} + +func (x ExtensionRangeOptions_VerificationState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ExtensionRangeOptions_VerificationState) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ExtensionRangeOptions_VerificationState(num) + return nil +} + +// Deprecated: Use ExtensionRangeOptions_VerificationState.Descriptor instead. +func (ExtensionRangeOptions_VerificationState) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} +} + type FieldDescriptorProto_Type int32 const ( @@ -137,11 +195,11 @@ func (x FieldDescriptorProto_Type) String() string { } func (FieldDescriptorProto_Type) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[0].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() } func (FieldDescriptorProto_Type) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[0] + return &file_google_protobuf_descriptor_proto_enumTypes[1] } func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber { @@ -197,11 +255,11 @@ func (x FieldDescriptorProto_Label) String() string { } func (FieldDescriptorProto_Label) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[1].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() } func (FieldDescriptorProto_Label) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[1] + return &file_google_protobuf_descriptor_proto_enumTypes[2] } func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber { @@ -258,11 +316,11 @@ func (x FileOptions_OptimizeMode) String() string { } func (FileOptions_OptimizeMode) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[2].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() } func (FileOptions_OptimizeMode) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[2] + return &file_google_protobuf_descriptor_proto_enumTypes[3] } func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber { @@ -288,7 +346,13 @@ type FieldOptions_CType int32 const ( // Default mode. - FieldOptions_STRING FieldOptions_CType = 0 + FieldOptions_STRING FieldOptions_CType = 0 + // The option [ctype=CORD] may be applied to a non-repeated field of type + // "bytes". It indicates that in C++, the data should be stored in a Cord + // instead of a string. For very large strings, this may reduce memory + // fragmentation. It may also allow better performance when parsing from a + // Cord, or when parsing with aliasing enabled, as the parsed Cord may then + // alias the original buffer. FieldOptions_CORD FieldOptions_CType = 1 FieldOptions_STRING_PIECE FieldOptions_CType = 2 ) @@ -318,11 +382,11 @@ func (x FieldOptions_CType) String() string { } func (FieldOptions_CType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[3].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() } func (FieldOptions_CType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[3] + return &file_google_protobuf_descriptor_proto_enumTypes[4] } func (x FieldOptions_CType) Number() protoreflect.EnumNumber { @@ -380,11 +444,11 @@ func (x FieldOptions_JSType) String() string { } func (FieldOptions_JSType) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[4].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() } func (FieldOptions_JSType) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[4] + return &file_google_protobuf_descriptor_proto_enumTypes[5] } func (x FieldOptions_JSType) Number() protoreflect.EnumNumber { @@ -406,6 +470,152 @@ func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 1} } +// If set to RETENTION_SOURCE, the option will be omitted from the binary. +// Note: as of January 2023, support for this is in progress and does not yet +// have an effect (b/264593489). +type FieldOptions_OptionRetention int32 + +const ( + FieldOptions_RETENTION_UNKNOWN FieldOptions_OptionRetention = 0 + FieldOptions_RETENTION_RUNTIME FieldOptions_OptionRetention = 1 + FieldOptions_RETENTION_SOURCE FieldOptions_OptionRetention = 2 +) + +// Enum value maps for FieldOptions_OptionRetention. +var ( + FieldOptions_OptionRetention_name = map[int32]string{ + 0: "RETENTION_UNKNOWN", + 1: "RETENTION_RUNTIME", + 2: "RETENTION_SOURCE", + } + FieldOptions_OptionRetention_value = map[string]int32{ + "RETENTION_UNKNOWN": 0, + "RETENTION_RUNTIME": 1, + "RETENTION_SOURCE": 2, + } +) + +func (x FieldOptions_OptionRetention) Enum() *FieldOptions_OptionRetention { + p := new(FieldOptions_OptionRetention) + *p = x + return p +} + +func (x FieldOptions_OptionRetention) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FieldOptions_OptionRetention) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[6].Descriptor() +} + +func (FieldOptions_OptionRetention) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[6] +} + +func (x FieldOptions_OptionRetention) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FieldOptions_OptionRetention) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FieldOptions_OptionRetention(num) + return nil +} + +// Deprecated: Use FieldOptions_OptionRetention.Descriptor instead. +func (FieldOptions_OptionRetention) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 2} +} + +// This indicates the types of entities that the field may apply to when used +// as an option. If it is unset, then the field may be freely used as an +// option on any kind of entity. Note: as of January 2023, support for this is +// in progress and does not yet have an effect (b/264593489). +type FieldOptions_OptionTargetType int32 + +const ( + FieldOptions_TARGET_TYPE_UNKNOWN FieldOptions_OptionTargetType = 0 + FieldOptions_TARGET_TYPE_FILE FieldOptions_OptionTargetType = 1 + FieldOptions_TARGET_TYPE_EXTENSION_RANGE FieldOptions_OptionTargetType = 2 + FieldOptions_TARGET_TYPE_MESSAGE FieldOptions_OptionTargetType = 3 + FieldOptions_TARGET_TYPE_FIELD FieldOptions_OptionTargetType = 4 + FieldOptions_TARGET_TYPE_ONEOF FieldOptions_OptionTargetType = 5 + FieldOptions_TARGET_TYPE_ENUM FieldOptions_OptionTargetType = 6 + FieldOptions_TARGET_TYPE_ENUM_ENTRY FieldOptions_OptionTargetType = 7 + FieldOptions_TARGET_TYPE_SERVICE FieldOptions_OptionTargetType = 8 + FieldOptions_TARGET_TYPE_METHOD FieldOptions_OptionTargetType = 9 +) + +// Enum value maps for FieldOptions_OptionTargetType. +var ( + FieldOptions_OptionTargetType_name = map[int32]string{ + 0: "TARGET_TYPE_UNKNOWN", + 1: "TARGET_TYPE_FILE", + 2: "TARGET_TYPE_EXTENSION_RANGE", + 3: "TARGET_TYPE_MESSAGE", + 4: "TARGET_TYPE_FIELD", + 5: "TARGET_TYPE_ONEOF", + 6: "TARGET_TYPE_ENUM", + 7: "TARGET_TYPE_ENUM_ENTRY", + 8: "TARGET_TYPE_SERVICE", + 9: "TARGET_TYPE_METHOD", + } + FieldOptions_OptionTargetType_value = map[string]int32{ + "TARGET_TYPE_UNKNOWN": 0, + "TARGET_TYPE_FILE": 1, + "TARGET_TYPE_EXTENSION_RANGE": 2, + "TARGET_TYPE_MESSAGE": 3, + "TARGET_TYPE_FIELD": 4, + "TARGET_TYPE_ONEOF": 5, + "TARGET_TYPE_ENUM": 6, + "TARGET_TYPE_ENUM_ENTRY": 7, + "TARGET_TYPE_SERVICE": 8, + "TARGET_TYPE_METHOD": 9, + } +) + +func (x FieldOptions_OptionTargetType) Enum() *FieldOptions_OptionTargetType { + p := new(FieldOptions_OptionTargetType) + *p = x + return p +} + +func (x FieldOptions_OptionTargetType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (FieldOptions_OptionTargetType) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[7].Descriptor() +} + +func (FieldOptions_OptionTargetType) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[7] +} + +func (x FieldOptions_OptionTargetType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *FieldOptions_OptionTargetType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = FieldOptions_OptionTargetType(num) + return nil +} + +// Deprecated: Use FieldOptions_OptionTargetType.Descriptor instead. +func (FieldOptions_OptionTargetType) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{12, 3} +} + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, // or neither? HTTP based RPC implementation may choose GET verb for safe // methods, and PUT verb for idempotent methods instead of the default POST. @@ -442,11 +652,11 @@ func (x MethodOptions_IdempotencyLevel) String() string { } func (MethodOptions_IdempotencyLevel) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_descriptor_proto_enumTypes[5].Descriptor() + return file_google_protobuf_descriptor_proto_enumTypes[8].Descriptor() } func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType { - return &file_google_protobuf_descriptor_proto_enumTypes[5] + return &file_google_protobuf_descriptor_proto_enumTypes[8] } func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber { @@ -468,6 +678,70 @@ func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) { return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{17, 0} } +// Represents the identified object's effect on the element in the original +// .proto file. +type GeneratedCodeInfo_Annotation_Semantic int32 + +const ( + // There is no effect or the effect is indescribable. + GeneratedCodeInfo_Annotation_NONE GeneratedCodeInfo_Annotation_Semantic = 0 + // The element is set or otherwise mutated. + GeneratedCodeInfo_Annotation_SET GeneratedCodeInfo_Annotation_Semantic = 1 + // An alias to the element is returned. + GeneratedCodeInfo_Annotation_ALIAS GeneratedCodeInfo_Annotation_Semantic = 2 +) + +// Enum value maps for GeneratedCodeInfo_Annotation_Semantic. +var ( + GeneratedCodeInfo_Annotation_Semantic_name = map[int32]string{ + 0: "NONE", + 1: "SET", + 2: "ALIAS", + } + GeneratedCodeInfo_Annotation_Semantic_value = map[string]int32{ + "NONE": 0, + "SET": 1, + "ALIAS": 2, + } +) + +func (x GeneratedCodeInfo_Annotation_Semantic) Enum() *GeneratedCodeInfo_Annotation_Semantic { + p := new(GeneratedCodeInfo_Annotation_Semantic) + *p = x + return p +} + +func (x GeneratedCodeInfo_Annotation_Semantic) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GeneratedCodeInfo_Annotation_Semantic) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_descriptor_proto_enumTypes[9].Descriptor() +} + +func (GeneratedCodeInfo_Annotation_Semantic) Type() protoreflect.EnumType { + return &file_google_protobuf_descriptor_proto_enumTypes[9] +} + +func (x GeneratedCodeInfo_Annotation_Semantic) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GeneratedCodeInfo_Annotation_Semantic) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GeneratedCodeInfo_Annotation_Semantic(num) + return nil +} + +// Deprecated: Use GeneratedCodeInfo_Annotation_Semantic.Descriptor instead. +func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{20, 0, 0} +} + // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. type FileDescriptorSet struct { @@ -544,8 +818,12 @@ type FileDescriptorProto struct { // development tools. SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"` // The syntax of the proto file. - // The supported values are "proto2" and "proto3". + // The supported values are "proto2", "proto3", and "editions". + // + // If `edition` is present, this value must be "editions". Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` + // The edition of the proto file, which is an opaque string. + Edition *string `protobuf:"bytes,13,opt,name=edition" json:"edition,omitempty"` } func (x *FileDescriptorProto) Reset() { @@ -664,6 +942,13 @@ func (x *FileDescriptorProto) GetSyntax() string { return "" } +func (x *FileDescriptorProto) GetEdition() string { + if x != nil && x.Edition != nil { + return *x.Edition + } + return "" +} + // Describes a message type. type DescriptorProto struct { state protoimpl.MessageState @@ -794,7 +1079,21 @@ type ExtensionRangeOptions struct { // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` -} + // go/protobuf-stripping-extension-declarations + // Like Metadata, but we use a repeated field to hold all extension + // declarations. This should avoid the size increases of transforming a large + // extension range into small ranges in generated binaries. + Declaration []*ExtensionRangeOptions_Declaration `protobuf:"bytes,2,rep,name=declaration" json:"declaration,omitempty"` + // The verification state of the range. + // TODO(b/278783756): flip the default to DECLARATION once all empty ranges + // are marked as UNVERIFIED. + Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` +} + +// Default values for ExtensionRangeOptions fields. +const ( + Default_ExtensionRangeOptions_Verification = ExtensionRangeOptions_UNVERIFIED +) func (x *ExtensionRangeOptions) Reset() { *x = ExtensionRangeOptions{} @@ -835,6 +1134,20 @@ func (x *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption return nil } +func (x *ExtensionRangeOptions) GetDeclaration() []*ExtensionRangeOptions_Declaration { + if x != nil { + return x.Declaration + } + return nil +} + +func (x *ExtensionRangeOptions) GetVerification() ExtensionRangeOptions_VerificationState { + if x != nil && x.Verification != nil { + return *x.Verification + } + return Default_ExtensionRangeOptions_Verification +} + // Describes a field within a message. type FieldDescriptorProto struct { state protoimpl.MessageState @@ -860,7 +1173,6 @@ type FieldDescriptorProto struct { // For booleans, "true" or "false". // For strings, contains the default text contents (not escaped in any way). // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - // TODO(kenton): Base-64 encode? DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"` // If set, gives the index of a oneof in the containing type's oneof_decl // list. This field is a member of that oneof. @@ -1382,22 +1694,22 @@ type FileOptions struct { // inappropriate because proto packages do not normally start with backwards // domain names. JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"` - // If set, all the classes from the .proto file are wrapped in a single - // outer class with the given name. This applies to both Proto1 - // (equivalent to the old "--one_java_file" option) and Proto2 (where - // a .proto always translates to a single class, but you may want to - // explicitly choose the class name). + // Controls the name of the wrapper Java class generated for the .proto file. + // That class will always contain the .proto file's getDescriptor() method as + // well as any top-level extensions defined in the .proto file. + // If java_multiple_files is disabled, then all the other classes from the + // .proto file will be nested inside the single wrapper outer class. JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"` - // If set true, then the Java code generator will generate a separate .java + // If enabled, then the Java code generator will generate a separate .java // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the outer class - // named by java_outer_classname. However, the outer class will still be + // file. Thus, these types will *not* be nested inside the wrapper class + // named by java_outer_classname. However, the wrapper class will still be // generated to contain the file's getDescriptor() method as well as any // top-level extensions defined in the file. JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"` // This option does nothing. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // If set true, then the Java2 code generator will generate code that // throws an exception whenever an attempt is made to assign a non-UTF-8 @@ -1531,7 +1843,7 @@ func (x *FileOptions) GetJavaMultipleFiles() bool { return Default_FileOptions_JavaMultipleFiles } -// Deprecated: Do not use. +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. func (x *FileOptions) GetJavaGenerateEqualsAndHash() bool { if x != nil && x.JavaGenerateEqualsAndHash != nil { return *x.JavaGenerateEqualsAndHash @@ -1670,10 +1982,12 @@ type MessageOptions struct { // efficient, has fewer features, and is more complicated. // // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } + // + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // // Note that the message cannot have any defined fields; MessageSets only // have extensions. // @@ -1692,28 +2006,44 @@ type MessageOptions struct { // for the message, or it will be completely ignored; in the very least, // this is a formalization for deprecating messages. Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + // // Whether the message is an automatically generated map entry type for the // maps field. // // For maps fields: - // map map_field = 1; + // + // map map_field = 1; + // // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; + // + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; // // Implementations may choose not to generate the map_entry=true message, but // use a native map in the target language to hold the keys and values. // The reflection APIs in such implementations still need to work as // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"` + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // + // This should only be used as a temporary measure against broken builds due + // to the change in behavior for JSON field name conflicts. + // + // TODO(b/261750190) This is legacy behavior we plan to remove once downstream + // teams have had time to migrate. + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,11,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -1785,6 +2115,14 @@ func (x *MessageOptions) GetMapEntry() bool { return false } +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *MessageOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { + if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { + return *x.DeprecatedLegacyJsonFieldConflicts + } + return false +} + func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -1800,8 +2138,10 @@ type FieldOptions struct { // The ctype option instructs the C++ code generator to use a different // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! + // options below. This option is only implemented to support use of + // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of + // type "bytes" in the open source release -- sorry, we'll try to include + // other types in a future version! Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` // The packed option can be enabled for repeated primitive fields to enable // a more efficient representation on the wire. Rather than repeatedly @@ -1838,7 +2178,6 @@ type FieldOptions struct { // call from multiple threads concurrently, while non-const methods continue // to require exclusive access. // - // // Note that implementations may choose not to check required fields within // a lazy sub-message. That is, calling IsInitialized() on the outer message // may return true even if the inner message has missing required fields. @@ -1849,7 +2188,14 @@ type FieldOptions struct { // implementation must either *always* check its required fields, or *never* // check its required fields, regardless of whether or not the message has // been parsed. + // + // As of May 2022, lazy verifies the contents of the byte stream during + // parsing. An invalid byte stream will cause the overall parsing to fail. Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"` + // unverified_lazy does no correctness checks on the byte stream. This should + // only be used where lazy with verification is prohibitive for performance + // reasons. + UnverifiedLazy *bool `protobuf:"varint,15,opt,name=unverified_lazy,json=unverifiedLazy,def=0" json:"unverified_lazy,omitempty"` // Is this field deprecated? // Depending on the target platform, this can emit Deprecated annotations // for accessors, or it will be completely ignored; in the very least, this @@ -1857,17 +2203,26 @@ type FieldOptions struct { Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // For Google-internal migration only. Do not use. Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"` + // Indicate that the field value should not be printed out when using debug + // formats, e.g. when the field contains sensitive credentials. + DebugRedact *bool `protobuf:"varint,16,opt,name=debug_redact,json=debugRedact,def=0" json:"debug_redact,omitempty"` + Retention *FieldOptions_OptionRetention `protobuf:"varint,17,opt,name=retention,enum=google.protobuf.FieldOptions_OptionRetention" json:"retention,omitempty"` + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + Target *FieldOptions_OptionTargetType `protobuf:"varint,18,opt,name=target,enum=google.protobuf.FieldOptions_OptionTargetType" json:"target,omitempty"` + Targets []FieldOptions_OptionTargetType `protobuf:"varint,19,rep,name=targets,enum=google.protobuf.FieldOptions_OptionTargetType" json:"targets,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } // Default values for FieldOptions fields. const ( - Default_FieldOptions_Ctype = FieldOptions_STRING - Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL - Default_FieldOptions_Lazy = bool(false) - Default_FieldOptions_Deprecated = bool(false) - Default_FieldOptions_Weak = bool(false) + Default_FieldOptions_Ctype = FieldOptions_STRING + Default_FieldOptions_Jstype = FieldOptions_JS_NORMAL + Default_FieldOptions_Lazy = bool(false) + Default_FieldOptions_UnverifiedLazy = bool(false) + Default_FieldOptions_Deprecated = bool(false) + Default_FieldOptions_Weak = bool(false) + Default_FieldOptions_DebugRedact = bool(false) ) func (x *FieldOptions) Reset() { @@ -1930,6 +2285,13 @@ func (x *FieldOptions) GetLazy() bool { return Default_FieldOptions_Lazy } +func (x *FieldOptions) GetUnverifiedLazy() bool { + if x != nil && x.UnverifiedLazy != nil { + return *x.UnverifiedLazy + } + return Default_FieldOptions_UnverifiedLazy +} + func (x *FieldOptions) GetDeprecated() bool { if x != nil && x.Deprecated != nil { return *x.Deprecated @@ -1944,6 +2306,35 @@ func (x *FieldOptions) GetWeak() bool { return Default_FieldOptions_Weak } +func (x *FieldOptions) GetDebugRedact() bool { + if x != nil && x.DebugRedact != nil { + return *x.DebugRedact + } + return Default_FieldOptions_DebugRedact +} + +func (x *FieldOptions) GetRetention() FieldOptions_OptionRetention { + if x != nil && x.Retention != nil { + return *x.Retention + } + return FieldOptions_RETENTION_UNKNOWN +} + +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *FieldOptions) GetTarget() FieldOptions_OptionTargetType { + if x != nil && x.Target != nil { + return *x.Target + } + return FieldOptions_TARGET_TYPE_UNKNOWN +} + +func (x *FieldOptions) GetTargets() []FieldOptions_OptionTargetType { + if x != nil { + return x.Targets + } + return nil +} + func (x *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2014,6 +2405,15 @@ type EnumOptions struct { // for the enum, or it will be completely ignored; in the very least, this // is a formalization for deprecating enums. Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"` + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // TODO(b/261750190) Remove this legacy behavior once downstream teams have + // had time to migrate. + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + DeprecatedLegacyJsonFieldConflicts *bool `protobuf:"varint,6,opt,name=deprecated_legacy_json_field_conflicts,json=deprecatedLegacyJsonFieldConflicts" json:"deprecated_legacy_json_field_conflicts,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` } @@ -2069,6 +2469,14 @@ func (x *EnumOptions) GetDeprecated() bool { return Default_EnumOptions_Deprecated } +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *EnumOptions) GetDeprecatedLegacyJsonFieldConflicts() bool { + if x != nil && x.DeprecatedLegacyJsonFieldConflicts != nil { + return *x.DeprecatedLegacyJsonFieldConflicts + } + return false +} + func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { if x != nil { return x.UninterpretedOption @@ -2399,43 +2807,48 @@ type SourceCodeInfo struct { // tools. // // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } + // + // message Foo { + // optional string foo = 1; + // } + // // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi + // + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). // // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendant. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendant. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` } @@ -2651,6 +3064,108 @@ func (x *DescriptorProto_ReservedRange) GetEnd() int32 { return 0 } +type ExtensionRangeOptions_Declaration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The extension number declared within the extension range. + Number *int32 `protobuf:"varint,1,opt,name=number" json:"number,omitempty"` + // The fully-qualified name of the extension field. There must be a leading + // dot in front of the full name. + FullName *string `protobuf:"bytes,2,opt,name=full_name,json=fullName" json:"full_name,omitempty"` + // The fully-qualified type name of the extension field. Unlike + // Metadata.type, Declaration.type must have a leading dot for messages + // and enums. + Type *string `protobuf:"bytes,3,opt,name=type" json:"type,omitempty"` + // Deprecated. Please use "repeated". + // + // Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. + IsRepeated *bool `protobuf:"varint,4,opt,name=is_repeated,json=isRepeated" json:"is_repeated,omitempty"` + // If true, indicates that the number is reserved in the extension range, + // and any extension field with the number will fail to compile. Set this + // when a declared extension field is deleted. + Reserved *bool `protobuf:"varint,5,opt,name=reserved" json:"reserved,omitempty"` + // If true, indicates that the extension must be defined as repeated. + // Otherwise the extension must be defined as optional. + Repeated *bool `protobuf:"varint,6,opt,name=repeated" json:"repeated,omitempty"` +} + +func (x *ExtensionRangeOptions_Declaration) Reset() { + *x = ExtensionRangeOptions_Declaration{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtensionRangeOptions_Declaration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtensionRangeOptions_Declaration) ProtoMessage() {} + +func (x *ExtensionRangeOptions_Declaration) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtensionRangeOptions_Declaration.ProtoReflect.Descriptor instead. +func (*ExtensionRangeOptions_Declaration) Descriptor() ([]byte, []int) { + return file_google_protobuf_descriptor_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *ExtensionRangeOptions_Declaration) GetNumber() int32 { + if x != nil && x.Number != nil { + return *x.Number + } + return 0 +} + +func (x *ExtensionRangeOptions_Declaration) GetFullName() string { + if x != nil && x.FullName != nil { + return *x.FullName + } + return "" +} + +func (x *ExtensionRangeOptions_Declaration) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" +} + +// Deprecated: Marked as deprecated in google/protobuf/descriptor.proto. +func (x *ExtensionRangeOptions_Declaration) GetIsRepeated() bool { + if x != nil && x.IsRepeated != nil { + return *x.IsRepeated + } + return false +} + +func (x *ExtensionRangeOptions_Declaration) GetReserved() bool { + if x != nil && x.Reserved != nil { + return *x.Reserved + } + return false +} + +func (x *ExtensionRangeOptions_Declaration) GetRepeated() bool { + if x != nil && x.Repeated != nil { + return *x.Repeated + } + return false +} + // Range of reserved numeric values. Reserved values may not be used by // entries in the same enum. Reserved ranges may not overlap. // @@ -2669,7 +3184,7 @@ type EnumDescriptorProto_EnumReservedRange struct { func (x *EnumDescriptorProto_EnumReservedRange) Reset() { *x = EnumDescriptorProto_EnumReservedRange{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2682,7 +3197,7 @@ func (x *EnumDescriptorProto_EnumReservedRange) String() string { func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {} func (x *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[23] + mi := &file_google_protobuf_descriptor_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2715,8 +3230,8 @@ func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { // The name of the uninterpreted option. Each string represents a segment in // a dot-separated name. is_extension is true iff a segment represents an // extension (denoted with parentheses in options specs in .proto files). -// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents -// "foo.(bar.baz).qux". +// E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents +// "foo.(bar.baz).moo". type UninterpretedOption_NamePart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2729,7 +3244,7 @@ type UninterpretedOption_NamePart struct { func (x *UninterpretedOption_NamePart) Reset() { *x = UninterpretedOption_NamePart{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2742,7 +3257,7 @@ func (x *UninterpretedOption_NamePart) String() string { func (*UninterpretedOption_NamePart) ProtoMessage() {} func (x *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[24] + mi := &file_google_protobuf_descriptor_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,23 +3296,34 @@ type SourceCodeInfo_Location struct { // location. // // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition. For - // example, this path: - // [ 4, 3, 2, 7, 1 ] + // the root FileDescriptorProto to the place where the definition occurs. + // For example, this path: + // + // [ 4, 3, 2, 7, 1 ] + // // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 + // + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; + // + // repeated DescriptorProto message_type = 4; + // // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; + // + // repeated FieldDescriptorProto field = 2; + // // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; + // + // optional string name = 1; // // Thus, the above path gives the location of a field name. If we removed // the last element: - // [ 4, 3, 2, 7 ] + // + // [ 4, 3, 2, 7 ] + // // this path refers to the whole field declaration (from the beginning // of the label to the terminating semicolon). Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` @@ -2826,34 +3352,34 @@ type SourceCodeInfo_Location struct { // // Examples: // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. // - // // Comment attached to qux. - // // - // // Another line attached to qux. - // optional double qux = 4; + // // Comment attached to moo. + // // + // // Another line attached to moo. + // optional double moo = 4; // - // // Detached comment for corge. This is not leading or trailing comments - // // to qux or corge because there are blank lines separating it from - // // both. + // // Detached comment for corge. This is not leading or trailing comments + // // to moo or corge because there are blank lines separating it from + // // both. // - // // Detached comment for corge paragraph 2. + // // Detached comment for corge paragraph 2. // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; // - // // ignored detached comments. + // // ignored detached comments. LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` @@ -2862,7 +3388,7 @@ type SourceCodeInfo_Location struct { func (x *SourceCodeInfo_Location) Reset() { *x = SourceCodeInfo_Location{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2875,7 +3401,7 @@ func (x *SourceCodeInfo_Location) String() string { func (*SourceCodeInfo_Location) ProtoMessage() {} func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[25] + mi := &file_google_protobuf_descriptor_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2940,15 +3466,16 @@ type GeneratedCodeInfo_Annotation struct { // that relates to the identified object. Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"` // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past + // relates to the identified object. The end offset should be one past // the last relevant byte (so the length of the text = end - begin). - End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` } func (x *GeneratedCodeInfo_Annotation) Reset() { *x = GeneratedCodeInfo_Annotation{} if protoimpl.UnsafeEnabled { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2961,7 +3488,7 @@ func (x *GeneratedCodeInfo_Annotation) String() string { func (*GeneratedCodeInfo_Annotation) ProtoMessage() {} func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message { - mi := &file_google_protobuf_descriptor_proto_msgTypes[26] + mi := &file_google_protobuf_descriptor_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3005,6 +3532,13 @@ func (x *GeneratedCodeInfo_Annotation) GetEnd() int32 { return 0 } +func (x *GeneratedCodeInfo_Annotation) GetSemantic() GeneratedCodeInfo_Annotation_Semantic { + if x != nil && x.Semantic != nil { + return *x.Semantic + } + return GeneratedCodeInfo_Annotation_NONE +} + var File_google_protobuf_descriptor_proto protoreflect.FileDescriptor var file_google_protobuf_descriptor_proto_rawDesc = []byte{ @@ -3016,7 +3550,7 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0xe4, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x6c, 0x65, 0x22, 0xfe, 0x04, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, @@ -3054,330 +3588,423 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, - 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, - 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, + 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, - 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, - 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, + 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x7c, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, - 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, - 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, - 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, - 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, - 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, - 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, - 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, - 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, - 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, - 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, - 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, - 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, - 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, - 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, - 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, - 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, + 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, + 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, + 0xad, 0x04, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, + 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, + 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x0a, + 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb3, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, + 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x69, 0x73, 0x52, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x34, + 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, + 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, + 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, - 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, - 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, + 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, + 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, + 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, + 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, + 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, + 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, + 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, + 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, + 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, + 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, + 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, + 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, + 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, + 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, + 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x03, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, + 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, + 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, + 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, - 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, - 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, - 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, - 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, - 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, - 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, - 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, - 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, - 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, - 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, - 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, - 0x70, 0x68, 0x70, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, - 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, - 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, - 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, - 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, - 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, - 0x10, 0x27, 0x22, 0xd1, 0x02, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, - 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, - 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, - 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, - 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0xe2, 0x03, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, - 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, - 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, + 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x09, 0x0a, 0x0b, 0x46, + 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, + 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, + 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, + 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, + 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, + 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, + 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, + 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x2a, 0x20, + 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x12, 0x70, 0x68, 0x70, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, + 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, + 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, + 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, + 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, + 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x22, 0xbb, + 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, + 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, + 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x85, 0x09, 0x0a, + 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, + 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, + 0x65, 0x3a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, + 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, + 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, + 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, + 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, - 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x04, 0x6c, - 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, - 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, - 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, 0x10, - 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, 0x43, - 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, - 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a, - 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, - 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, - 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, + 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, - 0x22, 0xc0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, - 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, - 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, + 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, + 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, + 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, + 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, + 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, + 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, + 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x22, 0x73, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, + 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, + 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x45, 0x6e, + 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, + 0x08, 0x05, 0x10, 0x06, 0x22, 0x9e, 0x01, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, + 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, @@ -3385,97 +4012,95 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, - 0x80, 0x80, 0x80, 0x02, 0x22, 0x9c, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, - 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x80, 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, + 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, + 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, + 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, + 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, + 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, + 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, + 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, - 0x80, 0x80, 0x02, 0x22, 0xe0, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, - 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, - 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, - 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, - 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, - 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, - 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x64, 0x65, - 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, - 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, 0x5f, 0x53, 0x49, 0x44, - 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, - 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, - 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x50, - 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, 0x0a, - 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, - 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, - 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd1, 0x01, - 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x6d, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, - 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, - 0x64, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6e, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, + 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, + 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd0, + 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, + 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, + 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, + 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, + 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, + 0x02, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, @@ -3498,92 +4123,103 @@ func file_google_protobuf_descriptor_proto_rawDescGZIP() []byte { return file_google_protobuf_descriptor_proto_rawDescData } -var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_google_protobuf_descriptor_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_google_protobuf_descriptor_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_google_protobuf_descriptor_proto_goTypes = []interface{}{ - (FieldDescriptorProto_Type)(0), // 0: google.protobuf.FieldDescriptorProto.Type - (FieldDescriptorProto_Label)(0), // 1: google.protobuf.FieldDescriptorProto.Label - (FileOptions_OptimizeMode)(0), // 2: google.protobuf.FileOptions.OptimizeMode - (FieldOptions_CType)(0), // 3: google.protobuf.FieldOptions.CType - (FieldOptions_JSType)(0), // 4: google.protobuf.FieldOptions.JSType - (MethodOptions_IdempotencyLevel)(0), // 5: google.protobuf.MethodOptions.IdempotencyLevel - (*FileDescriptorSet)(nil), // 6: google.protobuf.FileDescriptorSet - (*FileDescriptorProto)(nil), // 7: google.protobuf.FileDescriptorProto - (*DescriptorProto)(nil), // 8: google.protobuf.DescriptorProto - (*ExtensionRangeOptions)(nil), // 9: google.protobuf.ExtensionRangeOptions - (*FieldDescriptorProto)(nil), // 10: google.protobuf.FieldDescriptorProto - (*OneofDescriptorProto)(nil), // 11: google.protobuf.OneofDescriptorProto - (*EnumDescriptorProto)(nil), // 12: google.protobuf.EnumDescriptorProto - (*EnumValueDescriptorProto)(nil), // 13: google.protobuf.EnumValueDescriptorProto - (*ServiceDescriptorProto)(nil), // 14: google.protobuf.ServiceDescriptorProto - (*MethodDescriptorProto)(nil), // 15: google.protobuf.MethodDescriptorProto - (*FileOptions)(nil), // 16: google.protobuf.FileOptions - (*MessageOptions)(nil), // 17: google.protobuf.MessageOptions - (*FieldOptions)(nil), // 18: google.protobuf.FieldOptions - (*OneofOptions)(nil), // 19: google.protobuf.OneofOptions - (*EnumOptions)(nil), // 20: google.protobuf.EnumOptions - (*EnumValueOptions)(nil), // 21: google.protobuf.EnumValueOptions - (*ServiceOptions)(nil), // 22: google.protobuf.ServiceOptions - (*MethodOptions)(nil), // 23: google.protobuf.MethodOptions - (*UninterpretedOption)(nil), // 24: google.protobuf.UninterpretedOption - (*SourceCodeInfo)(nil), // 25: google.protobuf.SourceCodeInfo - (*GeneratedCodeInfo)(nil), // 26: google.protobuf.GeneratedCodeInfo - (*DescriptorProto_ExtensionRange)(nil), // 27: google.protobuf.DescriptorProto.ExtensionRange - (*DescriptorProto_ReservedRange)(nil), // 28: google.protobuf.DescriptorProto.ReservedRange - (*EnumDescriptorProto_EnumReservedRange)(nil), // 29: google.protobuf.EnumDescriptorProto.EnumReservedRange - (*UninterpretedOption_NamePart)(nil), // 30: google.protobuf.UninterpretedOption.NamePart - (*SourceCodeInfo_Location)(nil), // 31: google.protobuf.SourceCodeInfo.Location - (*GeneratedCodeInfo_Annotation)(nil), // 32: google.protobuf.GeneratedCodeInfo.Annotation + (ExtensionRangeOptions_VerificationState)(0), // 0: google.protobuf.ExtensionRangeOptions.VerificationState + (FieldDescriptorProto_Type)(0), // 1: google.protobuf.FieldDescriptorProto.Type + (FieldDescriptorProto_Label)(0), // 2: google.protobuf.FieldDescriptorProto.Label + (FileOptions_OptimizeMode)(0), // 3: google.protobuf.FileOptions.OptimizeMode + (FieldOptions_CType)(0), // 4: google.protobuf.FieldOptions.CType + (FieldOptions_JSType)(0), // 5: google.protobuf.FieldOptions.JSType + (FieldOptions_OptionRetention)(0), // 6: google.protobuf.FieldOptions.OptionRetention + (FieldOptions_OptionTargetType)(0), // 7: google.protobuf.FieldOptions.OptionTargetType + (MethodOptions_IdempotencyLevel)(0), // 8: google.protobuf.MethodOptions.IdempotencyLevel + (GeneratedCodeInfo_Annotation_Semantic)(0), // 9: google.protobuf.GeneratedCodeInfo.Annotation.Semantic + (*FileDescriptorSet)(nil), // 10: google.protobuf.FileDescriptorSet + (*FileDescriptorProto)(nil), // 11: google.protobuf.FileDescriptorProto + (*DescriptorProto)(nil), // 12: google.protobuf.DescriptorProto + (*ExtensionRangeOptions)(nil), // 13: google.protobuf.ExtensionRangeOptions + (*FieldDescriptorProto)(nil), // 14: google.protobuf.FieldDescriptorProto + (*OneofDescriptorProto)(nil), // 15: google.protobuf.OneofDescriptorProto + (*EnumDescriptorProto)(nil), // 16: google.protobuf.EnumDescriptorProto + (*EnumValueDescriptorProto)(nil), // 17: google.protobuf.EnumValueDescriptorProto + (*ServiceDescriptorProto)(nil), // 18: google.protobuf.ServiceDescriptorProto + (*MethodDescriptorProto)(nil), // 19: google.protobuf.MethodDescriptorProto + (*FileOptions)(nil), // 20: google.protobuf.FileOptions + (*MessageOptions)(nil), // 21: google.protobuf.MessageOptions + (*FieldOptions)(nil), // 22: google.protobuf.FieldOptions + (*OneofOptions)(nil), // 23: google.protobuf.OneofOptions + (*EnumOptions)(nil), // 24: google.protobuf.EnumOptions + (*EnumValueOptions)(nil), // 25: google.protobuf.EnumValueOptions + (*ServiceOptions)(nil), // 26: google.protobuf.ServiceOptions + (*MethodOptions)(nil), // 27: google.protobuf.MethodOptions + (*UninterpretedOption)(nil), // 28: google.protobuf.UninterpretedOption + (*SourceCodeInfo)(nil), // 29: google.protobuf.SourceCodeInfo + (*GeneratedCodeInfo)(nil), // 30: google.protobuf.GeneratedCodeInfo + (*DescriptorProto_ExtensionRange)(nil), // 31: google.protobuf.DescriptorProto.ExtensionRange + (*DescriptorProto_ReservedRange)(nil), // 32: google.protobuf.DescriptorProto.ReservedRange + (*ExtensionRangeOptions_Declaration)(nil), // 33: google.protobuf.ExtensionRangeOptions.Declaration + (*EnumDescriptorProto_EnumReservedRange)(nil), // 34: google.protobuf.EnumDescriptorProto.EnumReservedRange + (*UninterpretedOption_NamePart)(nil), // 35: google.protobuf.UninterpretedOption.NamePart + (*SourceCodeInfo_Location)(nil), // 36: google.protobuf.SourceCodeInfo.Location + (*GeneratedCodeInfo_Annotation)(nil), // 37: google.protobuf.GeneratedCodeInfo.Annotation } var file_google_protobuf_descriptor_proto_depIdxs = []int32{ - 7, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto - 8, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto - 12, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 14, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto - 10, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 16, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions - 25, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo - 10, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto - 10, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto - 8, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto - 12, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto - 27, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange - 11, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto - 17, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions - 28, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange - 24, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 1, // 16: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label - 0, // 17: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type - 18, // 18: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions - 19, // 19: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions - 13, // 20: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto - 20, // 21: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions - 29, // 22: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange - 21, // 23: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions - 15, // 24: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto - 22, // 25: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions - 23, // 26: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions - 2, // 27: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode - 24, // 28: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 29: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 3, // 30: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType - 4, // 31: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType - 24, // 32: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 33: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 34: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 35: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 24, // 36: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 5, // 37: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel - 24, // 38: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption - 30, // 39: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart - 31, // 40: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location - 32, // 41: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation - 9, // 42: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions - 43, // [43:43] is the sub-list for method output_type - 43, // [43:43] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 11, // 0: google.protobuf.FileDescriptorSet.file:type_name -> google.protobuf.FileDescriptorProto + 12, // 1: google.protobuf.FileDescriptorProto.message_type:type_name -> google.protobuf.DescriptorProto + 16, // 2: google.protobuf.FileDescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 18, // 3: google.protobuf.FileDescriptorProto.service:type_name -> google.protobuf.ServiceDescriptorProto + 14, // 4: google.protobuf.FileDescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 20, // 5: google.protobuf.FileDescriptorProto.options:type_name -> google.protobuf.FileOptions + 29, // 6: google.protobuf.FileDescriptorProto.source_code_info:type_name -> google.protobuf.SourceCodeInfo + 14, // 7: google.protobuf.DescriptorProto.field:type_name -> google.protobuf.FieldDescriptorProto + 14, // 8: google.protobuf.DescriptorProto.extension:type_name -> google.protobuf.FieldDescriptorProto + 12, // 9: google.protobuf.DescriptorProto.nested_type:type_name -> google.protobuf.DescriptorProto + 16, // 10: google.protobuf.DescriptorProto.enum_type:type_name -> google.protobuf.EnumDescriptorProto + 31, // 11: google.protobuf.DescriptorProto.extension_range:type_name -> google.protobuf.DescriptorProto.ExtensionRange + 15, // 12: google.protobuf.DescriptorProto.oneof_decl:type_name -> google.protobuf.OneofDescriptorProto + 21, // 13: google.protobuf.DescriptorProto.options:type_name -> google.protobuf.MessageOptions + 32, // 14: google.protobuf.DescriptorProto.reserved_range:type_name -> google.protobuf.DescriptorProto.ReservedRange + 28, // 15: google.protobuf.ExtensionRangeOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 33, // 16: google.protobuf.ExtensionRangeOptions.declaration:type_name -> google.protobuf.ExtensionRangeOptions.Declaration + 0, // 17: google.protobuf.ExtensionRangeOptions.verification:type_name -> google.protobuf.ExtensionRangeOptions.VerificationState + 2, // 18: google.protobuf.FieldDescriptorProto.label:type_name -> google.protobuf.FieldDescriptorProto.Label + 1, // 19: google.protobuf.FieldDescriptorProto.type:type_name -> google.protobuf.FieldDescriptorProto.Type + 22, // 20: google.protobuf.FieldDescriptorProto.options:type_name -> google.protobuf.FieldOptions + 23, // 21: google.protobuf.OneofDescriptorProto.options:type_name -> google.protobuf.OneofOptions + 17, // 22: google.protobuf.EnumDescriptorProto.value:type_name -> google.protobuf.EnumValueDescriptorProto + 24, // 23: google.protobuf.EnumDescriptorProto.options:type_name -> google.protobuf.EnumOptions + 34, // 24: google.protobuf.EnumDescriptorProto.reserved_range:type_name -> google.protobuf.EnumDescriptorProto.EnumReservedRange + 25, // 25: google.protobuf.EnumValueDescriptorProto.options:type_name -> google.protobuf.EnumValueOptions + 19, // 26: google.protobuf.ServiceDescriptorProto.method:type_name -> google.protobuf.MethodDescriptorProto + 26, // 27: google.protobuf.ServiceDescriptorProto.options:type_name -> google.protobuf.ServiceOptions + 27, // 28: google.protobuf.MethodDescriptorProto.options:type_name -> google.protobuf.MethodOptions + 3, // 29: google.protobuf.FileOptions.optimize_for:type_name -> google.protobuf.FileOptions.OptimizeMode + 28, // 30: google.protobuf.FileOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 31: google.protobuf.MessageOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 4, // 32: google.protobuf.FieldOptions.ctype:type_name -> google.protobuf.FieldOptions.CType + 5, // 33: google.protobuf.FieldOptions.jstype:type_name -> google.protobuf.FieldOptions.JSType + 6, // 34: google.protobuf.FieldOptions.retention:type_name -> google.protobuf.FieldOptions.OptionRetention + 7, // 35: google.protobuf.FieldOptions.target:type_name -> google.protobuf.FieldOptions.OptionTargetType + 7, // 36: google.protobuf.FieldOptions.targets:type_name -> google.protobuf.FieldOptions.OptionTargetType + 28, // 37: google.protobuf.FieldOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 38: google.protobuf.OneofOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 39: google.protobuf.EnumOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 40: google.protobuf.EnumValueOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 28, // 41: google.protobuf.ServiceOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 8, // 42: google.protobuf.MethodOptions.idempotency_level:type_name -> google.protobuf.MethodOptions.IdempotencyLevel + 28, // 43: google.protobuf.MethodOptions.uninterpreted_option:type_name -> google.protobuf.UninterpretedOption + 35, // 44: google.protobuf.UninterpretedOption.name:type_name -> google.protobuf.UninterpretedOption.NamePart + 36, // 45: google.protobuf.SourceCodeInfo.location:type_name -> google.protobuf.SourceCodeInfo.Location + 37, // 46: google.protobuf.GeneratedCodeInfo.annotation:type_name -> google.protobuf.GeneratedCodeInfo.Annotation + 13, // 47: google.protobuf.DescriptorProto.ExtensionRange.options:type_name -> google.protobuf.ExtensionRangeOptions + 9, // 48: google.protobuf.GeneratedCodeInfo.Annotation.semantic:type_name -> google.protobuf.GeneratedCodeInfo.Annotation.Semantic + 49, // [49:49] is the sub-list for method output_type + 49, // [49:49] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_google_protobuf_descriptor_proto_init() } @@ -3887,7 +4523,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { + switch v := v.(*ExtensionRangeOptions_Declaration); i { case 0: return &v.state case 1: @@ -3899,7 +4535,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninterpretedOption_NamePart); i { + switch v := v.(*EnumDescriptorProto_EnumReservedRange); i { case 0: return &v.state case 1: @@ -3911,7 +4547,7 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceCodeInfo_Location); i { + switch v := v.(*UninterpretedOption_NamePart); i { case 0: return &v.state case 1: @@ -3923,6 +4559,18 @@ func file_google_protobuf_descriptor_proto_init() { } } file_google_protobuf_descriptor_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SourceCodeInfo_Location); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_protobuf_descriptor_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeneratedCodeInfo_Annotation); i { case 0: return &v.state @@ -3940,8 +4588,8 @@ func file_google_protobuf_descriptor_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_protobuf_descriptor_proto_rawDesc, - NumEnums: 6, - NumMessages: 27, + NumEnums: 10, + NumMessages: 28, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go new file mode 100644 index 000000000..580b232f4 --- /dev/null +++ b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go @@ -0,0 +1,495 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: google/protobuf/any.proto + +// Package anypb contains generated types for google/protobuf/any.proto. +// +// The Any message is a dynamic representation of any other message value. +// It is functionally a tuple of the full name of the remote message type and +// the serialized bytes of the remote message value. +// +// # Constructing an Any +// +// An Any message containing another message value is constructed using New: +// +// any, err := anypb.New(m) +// if err != nil { +// ... // handle error +// } +// ... // make use of any +// +// # Unmarshaling an Any +// +// With a populated Any message, the underlying message can be serialized into +// a remote concrete message value in a few ways. +// +// If the exact concrete type is known, then a new (or pre-existing) instance +// of that message can be passed to the UnmarshalTo method: +// +// m := new(foopb.MyMessage) +// if err := any.UnmarshalTo(m); err != nil { +// ... // handle error +// } +// ... // make use of m +// +// If the exact concrete type is not known, then the UnmarshalNew method can be +// used to unmarshal the contents into a new instance of the remote message type: +// +// m, err := any.UnmarshalNew() +// if err != nil { +// ... // handle error +// } +// ... // make use of m +// +// UnmarshalNew uses the global type registry to resolve the message type and +// construct a new instance of that message to unmarshal into. In order for a +// message type to appear in the global registry, the Go type representing that +// protobuf message type must be linked into the Go binary. For messages +// generated by protoc-gen-go, this is achieved through an import of the +// generated Go package representing a .proto file. +// +// A common pattern with UnmarshalNew is to use a type switch with the resulting +// proto.Message value: +// +// switch m := m.(type) { +// case *foopb.MyMessage: +// ... // make use of m as a *foopb.MyMessage +// case *barpb.OtherMessage: +// ... // make use of m as a *barpb.OtherMessage +// case *bazpb.SomeMessage: +// ... // make use of m as a *bazpb.SomeMessage +// } +// +// This pattern ensures that the generated packages containing the message types +// listed in the case clauses are linked into the Go binary and therefore also +// registered in the global registry. +// +// # Type checking an Any +// +// In order to type check whether an Any message represents some other message, +// then use the MessageIs method: +// +// if any.MessageIs((*foopb.MyMessage)(nil)) { +// ... // make use of any, knowing that it contains a foopb.MyMessage +// } +// +// The MessageIs method can also be used with an allocated instance of the target +// message type if the intention is to unmarshal into it if the type matches: +// +// m := new(foopb.MyMessage) +// if any.MessageIs(m) { +// if err := any.UnmarshalTo(m); err != nil { +// ... // handle error +// } +// ... // make use of m +// } +package anypb + +import ( + proto "google.golang.org/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoregistry "google.golang.org/protobuf/reflect/protoregistry" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + strings "strings" + sync "sync" +) + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// // or ... +// if (any.isSameTypeAs(Foo.getDefaultInstance())) { +// foo = any.unpack(Foo.getDefaultInstance()); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +type Any struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // - If no scheme is provided, `https` is assumed. + // - An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // - Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` + // Must be a valid serialized protocol buffer of the above specified type. + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +// New marshals src into a new Any instance. +func New(src proto.Message) (*Any, error) { + dst := new(Any) + if err := dst.MarshalFrom(src); err != nil { + return nil, err + } + return dst, nil +} + +// MarshalFrom marshals src into dst as the underlying message +// using the provided marshal options. +// +// If no options are specified, call dst.MarshalFrom instead. +func MarshalFrom(dst *Any, src proto.Message, opts proto.MarshalOptions) error { + const urlPrefix = "type.googleapis.com/" + if src == nil { + return protoimpl.X.NewError("invalid nil source message") + } + b, err := opts.Marshal(src) + if err != nil { + return err + } + dst.TypeUrl = urlPrefix + string(src.ProtoReflect().Descriptor().FullName()) + dst.Value = b + return nil +} + +// UnmarshalTo unmarshals the underlying message from src into dst +// using the provided unmarshal options. +// It reports an error if dst is not of the right message type. +// +// If no options are specified, call src.UnmarshalTo instead. +func UnmarshalTo(src *Any, dst proto.Message, opts proto.UnmarshalOptions) error { + if src == nil { + return protoimpl.X.NewError("invalid nil source message") + } + if !src.MessageIs(dst) { + got := dst.ProtoReflect().Descriptor().FullName() + want := src.MessageName() + return protoimpl.X.NewError("mismatched message type: got %q, want %q", got, want) + } + return opts.Unmarshal(src.GetValue(), dst) +} + +// UnmarshalNew unmarshals the underlying message from src into dst, +// which is newly created message using a type resolved from the type URL. +// The message type is resolved according to opt.Resolver, +// which should implement protoregistry.MessageTypeResolver. +// It reports an error if the underlying message type could not be resolved. +// +// If no options are specified, call src.UnmarshalNew instead. +func UnmarshalNew(src *Any, opts proto.UnmarshalOptions) (dst proto.Message, err error) { + if src.GetTypeUrl() == "" { + return nil, protoimpl.X.NewError("invalid empty type URL") + } + if opts.Resolver == nil { + opts.Resolver = protoregistry.GlobalTypes + } + r, ok := opts.Resolver.(protoregistry.MessageTypeResolver) + if !ok { + return nil, protoregistry.NotFound + } + mt, err := r.FindMessageByURL(src.GetTypeUrl()) + if err != nil { + if err == protoregistry.NotFound { + return nil, err + } + return nil, protoimpl.X.NewError("could not resolve %q: %v", src.GetTypeUrl(), err) + } + dst = mt.New().Interface() + return dst, opts.Unmarshal(src.GetValue(), dst) +} + +// MessageIs reports whether the underlying message is of the same type as m. +func (x *Any) MessageIs(m proto.Message) bool { + if m == nil { + return false + } + url := x.GetTypeUrl() + name := string(m.ProtoReflect().Descriptor().FullName()) + if !strings.HasSuffix(url, name) { + return false + } + return len(url) == len(name) || url[len(url)-len(name)-1] == '/' +} + +// MessageName reports the full name of the underlying message, +// returning an empty string if invalid. +func (x *Any) MessageName() protoreflect.FullName { + url := x.GetTypeUrl() + name := protoreflect.FullName(url) + if i := strings.LastIndexByte(url, '/'); i >= 0 { + name = name[i+len("/"):] + } + if !name.IsValid() { + return "" + } + return name +} + +// MarshalFrom marshals m into x as the underlying message. +func (x *Any) MarshalFrom(m proto.Message) error { + return MarshalFrom(x, m, proto.MarshalOptions{}) +} + +// UnmarshalTo unmarshals the contents of the underlying message of x into m. +// It resets m before performing the unmarshal operation. +// It reports an error if m is not of the right message type. +func (x *Any) UnmarshalTo(m proto.Message) error { + return UnmarshalTo(x, m, proto.UnmarshalOptions{}) +} + +// UnmarshalNew unmarshals the contents of the underlying message of x into +// a newly allocated message of the specified type. +// It reports an error if the underlying message type could not be resolved. +func (x *Any) UnmarshalNew() (proto.Message, error) { + return UnmarshalNew(x, proto.UnmarshalOptions{}) +} + +func (x *Any) Reset() { + *x = Any{} + if protoimpl.UnsafeEnabled { + mi := &file_google_protobuf_any_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Any) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Any) ProtoMessage() {} + +func (x *Any) ProtoReflect() protoreflect.Message { + mi := &file_google_protobuf_any_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Any.ProtoReflect.Descriptor instead. +func (*Any) Descriptor() ([]byte, []int) { + return file_google_protobuf_any_proto_rawDescGZIP(), []int{0} +} + +func (x *Any) GetTypeUrl() string { + if x != nil { + return x.TypeUrl + } + return "" +} + +func (x *Any) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +var File_google_protobuf_any_proto protoreflect.FileDescriptor + +var file_google_protobuf_any_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x22, 0x36, 0x0a, 0x03, + 0x41, 0x6e, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x76, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, 0x08, 0x41, 0x6e, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x2f, + 0x61, 0x6e, 0x79, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1e, 0x47, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x57, 0x65, + 0x6c, 0x6c, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_google_protobuf_any_proto_rawDescOnce sync.Once + file_google_protobuf_any_proto_rawDescData = file_google_protobuf_any_proto_rawDesc +) + +func file_google_protobuf_any_proto_rawDescGZIP() []byte { + file_google_protobuf_any_proto_rawDescOnce.Do(func() { + file_google_protobuf_any_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_protobuf_any_proto_rawDescData) + }) + return file_google_protobuf_any_proto_rawDescData +} + +var file_google_protobuf_any_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_google_protobuf_any_proto_goTypes = []interface{}{ + (*Any)(nil), // 0: google.protobuf.Any +} +var file_google_protobuf_any_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_google_protobuf_any_proto_init() } +func file_google_protobuf_any_proto_init() { + if File_google_protobuf_any_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_google_protobuf_any_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Any); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_google_protobuf_any_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_google_protobuf_any_proto_goTypes, + DependencyIndexes: file_google_protobuf_any_proto_depIdxs, + MessageInfos: file_google_protobuf_any_proto_msgTypes, + }.Build() + File_google_protobuf_any_proto = out.File + file_google_protobuf_any_proto_rawDesc = nil + file_google_protobuf_any_proto_goTypes = nil + file_google_protobuf_any_proto_depIdxs = nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index b673f1bad..0caeabcd8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,12 +1,10 @@ -# git.torproject.org/pluggable-transports/goptlib.git v1.2.0 -## explicit; go 1.11 -git.torproject.org/pluggable-transports/goptlib.git # github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 ## explicit github.com/AndreasBriese/bbloom -# github.com/BurntSushi/toml v0.3.1 -## explicit +# github.com/BurntSushi/toml v1.3.2 +## explicit; go 1.16 github.com/BurntSushi/toml +github.com/BurntSushi/toml/internal # github.com/Psiphon-Inc/rotate-safe-writer v0.0.0-20210303140923-464a7a37606e ## explicit github.com/Psiphon-Inc/rotate-safe-writer @@ -43,10 +41,6 @@ github.com/Psiphon-Labs/quic-go/quicvarint ## explicit github.com/Psiphon-Labs/tls-tris github.com/Psiphon-Labs/tls-tris/cipherhw -# github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 -## explicit -github.com/agl/ed25519/edwards25519 -github.com/agl/ed25519/extra25519 # github.com/andybalholm/brotli v1.0.5 ## explicit; go 1.12 github.com/andybalholm/brotli @@ -66,8 +60,8 @@ github.com/cognusion/go-cache-lru # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/dchest/siphash v1.2.3-0.20201109081723-a21c2e7914a8 -## explicit +# github.com/dchest/siphash v1.2.3 +## explicit; go 1.16 github.com/dchest/siphash # github.com/deckarep/golang-set v0.0.0-20171013212420-1d4478f51bed ## explicit @@ -93,7 +87,10 @@ github.com/elazarl/goproxy/ext/auth ## explicit; go 1.13 github.com/florianl/go-nfqueue github.com/florianl/go-nfqueue/internal/unix -# github.com/gaukas/godicttls v0.0.3 +# github.com/flynn/noise v1.0.0 +## explicit; go 1.16 +github.com/flynn/noise +# github.com/gaukas/godicttls v0.0.4 ## explicit; go 1.19 github.com/gaukas/godicttls # github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 @@ -114,28 +111,28 @@ github.com/gobwas/glob/util/strings github.com/golang/groupcache/lru # github.com/golang/mock v1.6.0 ## explicit; go 1.11 -# github.com/golang/protobuf v1.5.3-0.20210916003710-5d5e8c018a13 +# github.com/golang/protobuf v1.5.3 ## explicit; go 1.9 github.com/golang/protobuf/proto -# github.com/google/go-cmp v0.5.8 +# github.com/google/go-cmp v0.5.9 ## explicit; go 1.13 github.com/google/go-cmp/cmp github.com/google/go-cmp/cmp/internal/diff github.com/google/go-cmp/cmp/internal/flags github.com/google/go-cmp/cmp/internal/function github.com/google/go-cmp/cmp/internal/value -# github.com/google/gopacket v1.1.19-0.20200831200443-df1bbd09a561 +# github.com/google/gopacket v1.1.19 ## explicit; go 1.12 github.com/google/gopacket github.com/google/gopacket/layers -# github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 +# github.com/google/pprof v0.0.0-20211214055906-6f57359322fd ## explicit; go 1.14 github.com/google/pprof/profile # github.com/grafov/m3u8 v0.0.0-20171211212457-6ab8f28ed427 ## explicit github.com/grafov/m3u8 -# github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 -## explicit +# github.com/hashicorp/golang-lru v1.0.2 +## explicit; go 1.12 github.com/hashicorp/golang-lru github.com/hashicorp/golang-lru/simplelru # github.com/josharian/native v1.0.0 @@ -147,7 +144,7 @@ github.com/juju/ratelimit # github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1 ## explicit github.com/kardianos/osext -# github.com/klauspost/compress v1.16.6 +# github.com/klauspost/compress v1.16.7 ## explicit; go 1.18 github.com/klauspost/compress github.com/klauspost/compress/fse @@ -156,6 +153,9 @@ github.com/klauspost/compress/internal/cpuinfo github.com/klauspost/compress/internal/snapref github.com/klauspost/compress/zstd github.com/klauspost/compress/zstd/internal/xxhash +# github.com/libp2p/go-reuseport v0.4.0 +## explicit; go 1.20 +github.com/libp2p/go-reuseport # github.com/marusama/semaphore v0.0.0-20171214154724-565ffd8e868a ## explicit github.com/marusama/semaphore @@ -172,7 +172,7 @@ github.com/miekg/dns # github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 ## explicit github.com/mitchellh/panicwrap -# github.com/mroth/weightedrand v0.4.1 +# github.com/mroth/weightedrand v1.0.0 ## explicit; go 1.10 github.com/mroth/weightedrand # github.com/onsi/ginkgo/v2 v2.2.0 @@ -193,12 +193,58 @@ github.com/onsi/ginkgo/v2/internal/interrupt_handler github.com/onsi/ginkgo/v2/internal/parallel_support github.com/onsi/ginkgo/v2/reporters github.com/onsi/ginkgo/v2/types -# github.com/oschwald/maxminddb-golang v1.2.1-0.20170901134056-26fe5ace1c70 -## explicit +# github.com/oschwald/maxminddb-golang v1.12.0 +## explicit; go 1.19 github.com/oschwald/maxminddb-golang # github.com/patrickmn/go-cache v2.1.0+incompatible ## explicit github.com/patrickmn/go-cache +# github.com/pelletier/go-toml v1.9.5 +## explicit; go 1.12 +github.com/pelletier/go-toml +# github.com/pion/dtls/v2 v2.2.7 => github.com/mingyech/dtls/v2 v2.0.0 +## explicit; go 1.13 +github.com/pion/dtls/v2 +github.com/pion/dtls/v2/internal/ciphersuite +github.com/pion/dtls/v2/internal/ciphersuite/types +github.com/pion/dtls/v2/internal/closer +github.com/pion/dtls/v2/internal/util +github.com/pion/dtls/v2/pkg/crypto/ccm +github.com/pion/dtls/v2/pkg/crypto/ciphersuite +github.com/pion/dtls/v2/pkg/crypto/clientcertificate +github.com/pion/dtls/v2/pkg/crypto/elliptic +github.com/pion/dtls/v2/pkg/crypto/hash +github.com/pion/dtls/v2/pkg/crypto/prf +github.com/pion/dtls/v2/pkg/crypto/signature +github.com/pion/dtls/v2/pkg/crypto/signaturehash +github.com/pion/dtls/v2/pkg/protocol +github.com/pion/dtls/v2/pkg/protocol/alert +github.com/pion/dtls/v2/pkg/protocol/extension +github.com/pion/dtls/v2/pkg/protocol/handshake +github.com/pion/dtls/v2/pkg/protocol/recordlayer +# github.com/pion/logging v0.2.2 +## explicit; go 1.12 +github.com/pion/logging +# github.com/pion/randutil v0.1.0 +## explicit; go 1.14 +github.com/pion/randutil +# github.com/pion/sctp v1.8.8 +## explicit; go 1.13 +github.com/pion/sctp +# github.com/pion/stun v0.6.1 +## explicit; go 1.12 +github.com/pion/stun +github.com/pion/stun/internal/hmac +# github.com/pion/transport/v2 v2.2.3 +## explicit; go 1.12 +github.com/pion/transport/v2 +github.com/pion/transport/v2/connctx +github.com/pion/transport/v2/deadline +github.com/pion/transport/v2/packetio +github.com/pion/transport/v2/replaydetector +github.com/pion/transport/v2/stdnet +github.com/pion/transport/v2/udp +github.com/pion/transport/v2/utils/xor # github.com/pkg/errors v0.9.1 ## explicit github.com/pkg/errors @@ -208,13 +254,47 @@ github.com/pmezard/go-difflib/difflib # github.com/quic-go/qpack v0.4.0 ## explicit; go 1.18 github.com/quic-go/qpack -# github.com/refraction-networking/gotapdance v1.2.0 => ./replace/gotapdance -## explicit; go 1.16 -github.com/refraction-networking/gotapdance/ed25519/edwards25519 -github.com/refraction-networking/gotapdance/ed25519/extra25519 -github.com/refraction-networking/gotapdance/protobuf +# github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 +## explicit; go 1.18 +github.com/refraction-networking/conjure/pkg/client/assets +github.com/refraction-networking/conjure/pkg/core +github.com/refraction-networking/conjure/pkg/core/interfaces +github.com/refraction-networking/conjure/pkg/dtls +github.com/refraction-networking/conjure/pkg/phantoms +github.com/refraction-networking/conjure/pkg/registrars/decoy-registrar +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/dns +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/encryption +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/msgformat +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/queuepacketconn +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/remotemap +github.com/refraction-networking/conjure/pkg/registrars/dns-registrar/requester +github.com/refraction-networking/conjure/pkg/registrars/lib +github.com/refraction-networking/conjure/pkg/registrars/registration +github.com/refraction-networking/conjure/pkg/station/log +github.com/refraction-networking/conjure/pkg/transports +github.com/refraction-networking/conjure/pkg/transports/client +github.com/refraction-networking/conjure/pkg/transports/connecting/dtls +github.com/refraction-networking/conjure/pkg/transports/wrapping/min +github.com/refraction-networking/conjure/pkg/transports/wrapping/obfs4 +github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix +github.com/refraction-networking/conjure/proto +# github.com/refraction-networking/ed25519 v0.1.2 +## explicit; go 1.20 +github.com/refraction-networking/ed25519/edwards25519 +github.com/refraction-networking/ed25519/extra25519 +# github.com/refraction-networking/gotapdance v1.7.7 +## explicit; go 1.18 github.com/refraction-networking/gotapdance/tapdance -github.com/refraction-networking/gotapdance/tapdance/phantoms +# github.com/refraction-networking/obfs4 v0.1.2 +## explicit; go 1.20 +github.com/refraction-networking/obfs4/common/csrand +github.com/refraction-networking/obfs4/common/drbg +github.com/refraction-networking/obfs4/common/ntor +github.com/refraction-networking/obfs4/common/probdist +github.com/refraction-networking/obfs4/common/replayfilter +github.com/refraction-networking/obfs4/transports/base +github.com/refraction-networking/obfs4/transports/obfs4 +github.com/refraction-networking/obfs4/transports/obfs4/framing # github.com/refraction-networking/utls v1.3.3 ## explicit; go 1.19 github.com/refraction-networking/utls @@ -225,11 +305,11 @@ github.com/ryanuber/go-glob # github.com/sergeyfrolov/bsbuffer v0.0.0-20180903213811-94e85abb8507 ## explicit github.com/sergeyfrolov/bsbuffer -# github.com/sirupsen/logrus v1.8.1 +# github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus -# github.com/stretchr/testify v1.7.1 -## explicit; go 1.13 +# github.com/stretchr/testify v1.8.4 +## explicit; go 1.20 github.com/stretchr/testify/assert github.com/stretchr/testify/require github.com/stretchr/testify/suite @@ -239,19 +319,13 @@ github.com/syndtr/gocapability/capability # github.com/wader/filtertransport v0.0.0-20200316221534-bdd9e61eee78 ## explicit; go 1.12 github.com/wader/filtertransport -# gitlab.com/yawning/obfs4.git v0.0.0-20190120164510-816cff15f425 => ./replace/obfs4.git -## explicit; go 1.19 -gitlab.com/yawning/obfs4.git/common/csrand -gitlab.com/yawning/obfs4.git/common/drbg -gitlab.com/yawning/obfs4.git/common/ntor -gitlab.com/yawning/obfs4.git/common/probdist -gitlab.com/yawning/obfs4.git/common/replayfilter -gitlab.com/yawning/obfs4.git/transports/base -gitlab.com/yawning/obfs4.git/transports/obfs4 -gitlab.com/yawning/obfs4.git/transports/obfs4/framing -# golang.org/x/crypto v0.10.0 +# gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib v1.5.0 +## explicit; go 1.11 +gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/goptlib +# golang.org/x/crypto v0.14.0 ## explicit; go 1.17 golang.org/x/crypto/blake2b +golang.org/x/crypto/blake2s golang.org/x/crypto/blowfish golang.org/x/crypto/chacha20 golang.org/x/crypto/chacha20poly1305 @@ -273,7 +347,7 @@ golang.org/x/exp/constraints # golang.org/x/mod v0.8.0 ## explicit; go 1.17 golang.org/x/mod/semver -# golang.org/x/net v0.11.0 +# golang.org/x/net v0.17.0 ## explicit; go 1.17 golang.org/x/net/bpf golang.org/x/net/http/httpguts @@ -291,18 +365,17 @@ golang.org/x/net/trace # golang.org/x/sync v0.1.0 ## explicit golang.org/x/sync/errgroup -# golang.org/x/sys v0.9.0 +# golang.org/x/sys v0.13.0 ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/execabs -golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.9.0 +# golang.org/x/term v0.13.0 ## explicit; go 1.17 golang.org/x/term -# golang.org/x/text v0.10.0 +# golang.org/x/text v0.13.0 ## explicit; go 1.17 golang.org/x/text/secure/bidirule golang.org/x/text/transform @@ -333,7 +406,7 @@ golang.org/x/tools/internal/pkgbits golang.org/x/tools/internal/tokeninternal golang.org/x/tools/internal/typeparams golang.org/x/tools/internal/typesinternal -# google.golang.org/protobuf v1.28.0 +# google.golang.org/protobuf v1.31.0 ## explicit; go 1.11 google.golang.org/protobuf/encoding/prototext google.golang.org/protobuf/encoding/protowire @@ -362,6 +435,7 @@ google.golang.org/protobuf/reflect/protoregistry google.golang.org/protobuf/runtime/protoiface google.golang.org/protobuf/runtime/protoimpl google.golang.org/protobuf/types/descriptorpb +google.golang.org/protobuf/types/known/anypb # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 @@ -401,5 +475,5 @@ honnef.co/go/tools/staticcheck honnef.co/go/tools/stylecheck honnef.co/go/tools/unused honnef.co/go/tools/unused/typemap -# github.com/refraction-networking/gotapdance => ./replace/gotapdance -# gitlab.com/yawning/obfs4.git => ./replace/obfs4.git +# gitlab.com/yawning/obfs4.git => github.com/jmwample/obfs4 v0.0.0-20230725223418-2d2e5b4a16ba +# github.com/pion/dtls/v2 => github.com/mingyech/dtls/v2 v2.0.0 From 8ed8a52f5f1ebea757429447b2bfa6495a170c67 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Fri, 27 Oct 2023 14:51:57 -0400 Subject: [PATCH 04/29] Remove limitation: EnableRegistrationOverrides is no longer ignored --- go.mod | 2 +- go.sum | 2 + psiphon/common/refraction/refraction.go | 5 -- .../conjure/pkg/dtls/heartbeat.go | 78 +++++++++++-------- .../conjure/pkg/dtls/sctpconn.go | 27 ++++--- .../conjure/pkg/transports/transports.go | 3 + .../pkg/transports/wrapping/prefix/client.go | 8 ++ vendor/modules.txt | 2 +- 8 files changed, 78 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index 93e9f62e1..568c92a24 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 github.com/oschwald/maxminddb-golang v1.12.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 + github.com/refraction-networking/conjure v0.7.8 github.com/refraction-networking/gotapdance v1.7.7 github.com/refraction-networking/utls v1.3.3 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 diff --git a/go.sum b/go.sum index 13539e81d..dfbc5d742 100644 --- a/go.sum +++ b/go.sum @@ -176,6 +176,8 @@ github.com/refraction-networking/conjure v0.7.7 h1:8vWFmSzmkNSrVr1TI4BRbgCD1tc3F github.com/refraction-networking/conjure v0.7.7/go.mod h1:/UxAcot49ii6ejyvBrSo3g10yyUEavaGJT1Iy47oAfU= github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 h1:IP2pvATIC1QBj2/+biLxTJa23PxRIiDwrPvvE4Sh6cw= github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312/go.mod h1:iOb7GmuSvk/LZsd40L+D/cKmVGIjpFWQkbtOPggJrcA= +github.com/refraction-networking/conjure v0.7.8 h1:gPjb0iFyrxkcxc7eOKMjIgh/M4fPaP+plYw9PITWXYs= +github.com/refraction-networking/conjure v0.7.8/go.mod h1:iOb7GmuSvk/LZsd40L+D/cKmVGIjpFWQkbtOPggJrcA= github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= github.com/refraction-networking/gotapdance v1.7.7 h1:RSdDCA0v4n/iIxCnxLF6uCoJdlo000R+IKGvELfpc/A= diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 714ea72d1..7d18a7107 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -390,11 +390,6 @@ func dial( randomizeDstPort := conjureConfig.EnablePortRandomization disableOverrides := !conjureConfig.EnableRegistrationOverrides - // TODO: EnableRegistrationOverrides is ignored and overrides are - // disabled. At this time, overrides appear to undo the - // FlushAfterPrefix policy we require for writeMergeConn. - disableOverrides = true - conjureMetricTransport = conjureConfig.Transport switch conjureConfig.Transport { diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go index 23bc9a1eb..2f8e7c86d 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/heartbeat.go @@ -2,19 +2,23 @@ package dtls import ( "bytes" - "net" + "errors" "sync/atomic" "time" ) -var maxMessageSize = 65535 +var ErrInsufficientBuffer = errors.New("buffer too small to hold the received data") + +const recvChBufSize = 64 type hbConn struct { - conn net.Conn - recvCh chan errBytes - waiting uint32 - hb []byte - timeout time.Duration + stream msgStream + + recvCh chan errBytes + waiting uint32 + hb []byte + timeout time.Duration + maxMessageSize int } type errBytes struct { @@ -23,13 +27,14 @@ type errBytes struct { } // heartbeatServer listens for heartbeat over conn with config -func heartbeatServer(conn net.Conn, config *heartbeatConfig) (net.Conn, error) { +func heartbeatServer(stream msgStream, config *heartbeatConfig, maxMessageSize int) (*hbConn, error) { conf := validate(config) - c := &hbConn{conn: conn, - recvCh: make(chan errBytes), - timeout: conf.Interval, - hb: conf.Heartbeat, + c := &hbConn{stream: stream, + recvCh: make(chan errBytes, recvChBufSize), + timeout: conf.Interval, + hb: conf.Heartbeat, + maxMessageSize: maxMessageSize, } atomic.StoreUint32(&c.waiting, 2) @@ -43,7 +48,7 @@ func heartbeatServer(conn net.Conn, config *heartbeatConfig) (net.Conn, error) { func (c *hbConn) hbLoop() { for { if atomic.LoadUint32(&c.waiting) == 0 { - c.conn.Close() + c.stream.Close() return } @@ -55,58 +60,65 @@ func (c *hbConn) hbLoop() { func (c *hbConn) recvLoop() { for { - // create a buffer to hold your data - buffer := make([]byte, maxMessageSize) + buffer := make([]byte, c.maxMessageSize) - n, err := c.conn.Read(buffer) + n, err := c.stream.Read(buffer) if bytes.Equal(c.hb, buffer[:n]) { atomic.AddUint32(&c.waiting, 1) continue } + if err != nil { + c.recvCh <- errBytes{nil, err} + } + c.recvCh <- errBytes{buffer[:n], err} } } func (c *hbConn) Close() error { - return c.conn.Close() + return c.stream.Close() } func (c *hbConn) Write(b []byte) (n int, err error) { - return c.conn.Write(b) + return c.stream.Write(b) } -func (c *hbConn) Read(b []byte) (n int, err error) { +func (c *hbConn) Read(b []byte) (int, error) { readBytes := <-c.recvCh - copy(b, readBytes.b) + if readBytes.err != nil { + return 0, readBytes.err + } - return len(readBytes.b), readBytes.err -} + if len(b) < len(readBytes.b) { + return 0, ErrInsufficientBuffer + } + + n := copy(b, readBytes.b) -func (c *hbConn) LocalAddr() net.Addr { - return c.conn.LocalAddr() + return n, nil } -func (c *hbConn) RemoteAddr() net.Addr { - return c.conn.RemoteAddr() +func (c *hbConn) BufferedAmount() uint64 { + return c.stream.BufferedAmount() } -func (c *hbConn) SetDeadline(t time.Time) error { - return c.conn.SetDeadline(t) +func (c *hbConn) SetReadDeadline(deadline time.Time) error { + return c.stream.SetReadDeadline(deadline) } -func (c *hbConn) SetReadDeadline(t time.Time) error { - return c.conn.SetReadDeadline(t) +func (c *hbConn) SetBufferedAmountLowThreshold(th uint64) { + c.stream.SetBufferedAmountLowThreshold(th) } -func (c *hbConn) SetWriteDeadline(t time.Time) error { - return c.conn.SetWriteDeadline(t) +func (c *hbConn) OnBufferedAmountLow(f func()) { + c.stream.OnBufferedAmountLow(f) } // heartbeatClient sends heartbeats over conn with config -func heartbeatClient(conn net.Conn, config *heartbeatConfig) error { +func heartbeatClient(conn msgStream, config *heartbeatConfig) error { conf := validate(config) go func() { for { diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go index b0f01fe2d..b28607746 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/sctpconn.go @@ -2,6 +2,7 @@ package dtls import ( "fmt" + "io" "net" "sync" "time" @@ -10,13 +11,21 @@ import ( "github.com/pion/sctp" ) +type msgStream interface { + io.ReadWriteCloser + BufferedAmount() uint64 + SetReadDeadline(deadline time.Time) error + SetBufferedAmountLowThreshold(th uint64) + OnBufferedAmountLow(f func()) +} + // SCTPConn implements the net.Conn interface using sctp stream and DTLS conn // // SCTPConn buffers incoming SCTP messages, allowing the caller to use // SCTPConn as a TCP-like bytes stream net.Conn, with reads smaller than // individual message sizes. type SCTPConn struct { - stream *sctp.Stream + stream msgStream conn net.Conn maxMessageSize uint64 @@ -41,7 +50,7 @@ const ( writeMaxBufferedAmount uint64 = 256 * 1024 ) -func newSCTPConn(stream *sctp.Stream, conn net.Conn, maxMessageSize uint64) *SCTPConn { +func newSCTPConn(stream msgStream, conn net.Conn, maxMessageSize uint64) *SCTPConn { s := &SCTPConn{ stream: stream, @@ -209,13 +218,13 @@ func openSCTP(conn net.Conn, unordered bool) (net.Conn, error) { sctpStream.SetReliabilityParams(unordered, sctp.ReliabilityTypeReliable, 0) - sctpConn := newSCTPConn(sctpStream, conn, uint64(sctpClient.MaxMessageSize())) - - err = heartbeatClient(sctpConn, &heartbeatConfig{Interval: 10 * time.Second}) + err = heartbeatClient(sctpStream, &heartbeatConfig{Interval: 10 * time.Second}) if err != nil { return nil, fmt.Errorf("error opening heartbeat client: %v", err) } + sctpConn := newSCTPConn(sctpStream, conn, uint64(sctpClient.MaxMessageSize())) + return sctpConn, nil } @@ -239,14 +248,14 @@ func acceptSCTP(conn net.Conn, unordered bool) (net.Conn, error) { sctpStream.SetReliabilityParams(unordered, sctp.ReliabilityTypeReliable, 0) - sctpConn := newSCTPConn(sctpStream, conn, uint64(sctpServer.MaxMessageSize())) - - heartbeatConn, err := heartbeatServer(sctpConn, nil) + heartbeatConn, err := heartbeatServer(sctpStream, nil, int(sctpServer.MaxMessageSize())) if err != nil { return nil, fmt.Errorf("error starting heartbeat server: %v", err) } - return heartbeatConn, nil + sctpConn := newSCTPConn(heartbeatConn, conn, uint64(sctpServer.MaxMessageSize())) + + return sctpConn, nil } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go index 0f2acc823..e451f6f09 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/transports.go @@ -12,6 +12,9 @@ import ( ) var ( + // ErrUnknownTransport provided id or name does npt match any enabled transport. + ErrUnknownTransport = errors.New("unknown transport") + // ErrTryAgain is returned by transports when it is inconclusive with the current amount of data // whether the transport exists in the connection. ErrTryAgain = errors.New("not enough information to determine transport") diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go index 79f039372..acd2da872 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/wrapping/prefix/client.go @@ -213,6 +213,14 @@ func (t *ClientTransport) SetSessionParams(incoming *anypb.Any, unchecked ...boo return fmt.Errorf("%w, nil params", ErrBadParams) } + // If the client set a custom flush policy, use it over whatever the bidirectional registrar + // is trying to set. + if t.parameters.CustomFlushPolicy != nil { + if t.parameters.GetCustomFlushPolicy() != DefaultFlush { + prefixParams.CustomFlushPolicy = t.parameters.CustomFlushPolicy + } + } + if len(unchecked) != 0 && unchecked[0] { // Overwrite the prefix bytes and type without checking the default set. This is used for // RegResponse where the registrar may override the chosen prefix with a prefix outside of diff --git a/vendor/modules.txt b/vendor/modules.txt index 0caeabcd8..6ad36bb48 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -254,7 +254,7 @@ github.com/pmezard/go-difflib/difflib # github.com/quic-go/qpack v0.4.0 ## explicit; go 1.18 github.com/quic-go/qpack -# github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 +# github.com/refraction-networking/conjure v0.7.8 ## explicit; go 1.18 github.com/refraction-networking/conjure/pkg/client/assets github.com/refraction-networking/conjure/pkg/core From 4437220911b6686f469720df8dbfe7e96c06e3ab Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 31 Oct 2023 09:23:54 -0400 Subject: [PATCH 05/29] Fix delayed reestablishment after "stream closed" write error --- psiphon/common/refraction/refraction.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 7d18a7107..4f1b731dd 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -28,6 +28,7 @@ package refraction import ( "context" + std_errors "errors" "fmt" "io/ioutil" "net" @@ -42,6 +43,7 @@ import ( "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/protocol" "github.com/armon/go-proxyproto" lrucache "github.com/cognusion/go-cache-lru" + "github.com/pion/sctp" refraction_networking_assets "github.com/refraction-networking/conjure/pkg/client/assets" refraction_networking_registration "github.com/refraction-networking/conjure/pkg/registrars/registration" refraction_networking_transports "github.com/refraction-networking/conjure/pkg/transports/client" @@ -981,6 +983,29 @@ type refractionConn struct { conjureMetricSTUNServerAddress string } +func (conn *refractionConn) Write(p []byte) (int, error) { + n, err := conn.Conn.Write(p) + + // For the DTLS transport, underlying SCTP conn writes may fail + // with "stream closed" -- which indicates a permanent failure of the + // transport -- without closing the conn. Explicitly close the conn on + // this error, which will trigger Psiphon to reconnect faster via + // IsClosed checks on port forward failures. + // + // The close is invoked asynchronously to avoid possible deadlocks due to + // a hypothetical panic in the Close call: for a port forward, the unwind + // will invoke a deferred ssh.channel.Close which reenters Write; + // meanwhile, the underlying ssh.channel.writePacket acquires a + // ssh.channel.writeMu lock but does not defer the unlock. + + if std_errors.Is(err, sctp.ErrStreamClosed) { + go func() { + _ = conn.Close() + }() + } + return n, err +} + func (conn *refractionConn) Close() error { conn.manager.close() err := conn.Conn.Close() From 90bba2efedf5e5617b1116a963a79b50da7b2407 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 31 Oct 2023 13:03:16 -0400 Subject: [PATCH 06/29] Fix incorrect type conversions in Config.setDialParametersHash --- psiphon/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/psiphon/config.go b/psiphon/config.go index 8f8af9ee4..f06e70cdb 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -2198,7 +2198,7 @@ func (config *Config) setDialParametersHash() { if config.MeekTrafficShapingProbability != nil { hash.Write([]byte("MeekTrafficShapingProbability")) - binary.Write(hash, binary.LittleEndian, int64(*config.MeekTrafficShapingProbability)) + binary.Write(hash, binary.LittleEndian, *config.MeekTrafficShapingProbability) } if len(config.MeekTrafficShapingLimitProtocols) > 0 { @@ -2608,7 +2608,7 @@ func (config *Config) setDialParametersHash() { if config.TLSTunnelTrafficShapingProbability != nil { hash.Write([]byte("TLSTunnelTrafficShapingProbability")) - binary.Write(hash, binary.LittleEndian, int64(*config.TLSTunnelTrafficShapingProbability)) + binary.Write(hash, binary.LittleEndian, *config.TLSTunnelTrafficShapingProbability) } if config.TLSTunnelMinTLSPadding != nil { From ac4161f9c8d6d9163dd5a90dfc09b232b4c2c718 Mon Sep 17 00:00:00 2001 From: Amir Khan Date: Tue, 24 Oct 2023 12:34:20 -0400 Subject: [PATCH 07/29] Added TLS ClientHello fragmentation --- psiphon/common/parameters/parameters.go | 5 + psiphon/config.go | 12 ++ psiphon/dialParameters.go | 26 +++ psiphon/meekConn.go | 4 + psiphon/meekConn_test.go | 45 +++-- psiphon/notice.go | 4 + psiphon/server/api.go | 1 + psiphon/serverApi.go | 4 + psiphon/tlsDialer.go | 233 ++++++++++++++++++++++++ psiphon/tlsDialer_test.go | 89 +++++++-- psiphon/tlsTunnelConn.go | 1 + 11 files changed, 393 insertions(+), 31 deletions(-) diff --git a/psiphon/common/parameters/parameters.go b/psiphon/common/parameters/parameters.go index cfd22afc7..aca4887b3 100755 --- a/psiphon/common/parameters/parameters.go +++ b/psiphon/common/parameters/parameters.go @@ -243,6 +243,7 @@ const ( ReplayHTTPTransformerParameters = "ReplayHTTPTransformerParameters" ReplayOSSHSeedTransformerParameters = "ReplayOSSHSeedTransformerParameters" ReplayOSSHPrefix = "ReplayOSSHPrefix" + ReplayTLSFragmentClientHello = "ReplayTLSFragmentClientHello" APIRequestUpstreamPaddingMinBytes = "APIRequestUpstreamPaddingMinBytes" APIRequestUpstreamPaddingMaxBytes = "APIRequestUpstreamPaddingMaxBytes" APIRequestDownstreamPaddingMinBytes = "APIRequestDownstreamPaddingMinBytes" @@ -347,6 +348,7 @@ const ( TLSTunnelTrafficShapingProbability = "TLSTunnelTrafficShapingProbability" TLSTunnelMinTLSPadding = "TLSTunnelMinTLSPadding" TLSTunnelMaxTLSPadding = "TLSTunnelMaxTLSPadding" + TLSFragmentClientHelloProbability = "TLSFragmentClientHelloProbability" // Retired parameters @@ -609,6 +611,7 @@ var defaultParameters = map[string]struct { ReplayHTTPTransformerParameters: {value: true}, ReplayOSSHSeedTransformerParameters: {value: true}, ReplayOSSHPrefix: {value: true}, + ReplayTLSFragmentClientHello: {value: true}, APIRequestUpstreamPaddingMinBytes: {value: 0, minimum: 0}, APIRequestUpstreamPaddingMaxBytes: {value: 1024, minimum: 0}, @@ -741,6 +744,8 @@ var defaultParameters = map[string]struct { TLSTunnelTrafficShapingProbability: {value: 1.0, minimum: 0.0}, TLSTunnelMinTLSPadding: {value: 0, minimum: 0}, TLSTunnelMaxTLSPadding: {value: 0, minimum: 0}, + + TLSFragmentClientHelloProbability: {value: 0.0, minimum: 0.0}, } // IsServerSideOnly indicates if the parameter specified by name is used diff --git a/psiphon/config.go b/psiphon/config.go index 25d2242db..32c64518f 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -872,6 +872,9 @@ type Config struct { TLSTunnelMinTLSPadding *int TLSTunnelMaxTLSPadding *int + // TLSFragmentClientHelloProbability is for testing purposes only. + TLSFragmentClientHelloProbability *float64 + // AdditionalParameters is used for testing. AdditionalParameters string @@ -2057,6 +2060,10 @@ func (config *Config) makeConfigParameters() map[string]interface{} { applyParameters[parameters.TLSTunnelMaxTLSPadding] = *config.TLSTunnelMaxTLSPadding } + if config.TLSFragmentClientHelloProbability != nil { + applyParameters[parameters.TLSFragmentClientHelloProbability] = *config.TLSFragmentClientHelloProbability + } + // When adding new config dial parameters that may override tactics, also // update setDialParametersHash. @@ -2588,6 +2595,11 @@ func (config *Config) setDialParametersHash() { binary.Write(hash, binary.LittleEndian, int64(*config.TLSTunnelMaxTLSPadding)) } + if config.TLSFragmentClientHelloProbability != nil { + hash.Write([]byte("TLSFragmentClientHelloProbability")) + binary.Write(hash, binary.LittleEndian, *config.TLSFragmentClientHelloProbability) + } + config.dialParametersHash = hash.Sum(nil) } diff --git a/psiphon/dialParameters.go b/psiphon/dialParameters.go index 85011a35a..ada1b968d 100644 --- a/psiphon/dialParameters.go +++ b/psiphon/dialParameters.go @@ -122,6 +122,7 @@ type DialParameters struct { NoDefaultTLSSessionID bool TLSVersion string RandomizedTLSProfileSeed *prng.Seed + TLSFragmentClientHello bool QUICVersion string QUICDialSNIAddress string @@ -198,6 +199,7 @@ func MakeDialParameters( replayObfuscatorPadding := p.Bool(parameters.ReplayObfuscatorPadding) replayFragmentor := p.Bool(parameters.ReplayFragmentor) replayTLSProfile := p.Bool(parameters.ReplayTLSProfile) + replayTLSFragmentClientHello := p.Bool(parameters.ReplayTLSFragmentClientHello) replayFronting := p.Bool(parameters.ReplayFronting) replayHostname := p.Bool(parameters.ReplayHostname) replayQUICVersion := p.Bool(parameters.ReplayQUICVersion) @@ -1015,6 +1017,28 @@ func MakeDialParameters( } } + // TLS ClientHello fragmentation is applied only after the state + // of SNI is determined above. + if (!isReplay || !replayTLSFragmentClientHello) && usingTLS { + + // Note: The TLS stack automatically drops the SNI extension when + // the host is an IP address. + + usingSNI := false + if dialParams.TLSOSSHSNIServerName != "" { + usingSNI = net.ParseIP(dialParams.TLSOSSHSNIServerName) == nil + + } else if dialParams.MeekSNIServerName != "" { + usingSNI = net.ParseIP(dialParams.MeekSNIServerName) == nil + } + + // TLS ClientHello fragmentor expects SNI to be present. + if usingSNI { + dialParams.TLSFragmentClientHello = p.WeightedCoinFlip( + parameters.TLSFragmentClientHelloProbability) + } + } + // Initialize/replay User-Agent header for HTTP upstream proxy and meek protocols. if config.UseUpstreamProxy() { @@ -1145,6 +1169,7 @@ func MakeDialParameters( MeekObfuscatorPaddingSeed: dialParams.MeekObfuscatorPaddingSeed, NetworkLatencyMultiplier: dialParams.NetworkLatencyMultiplier, HTTPTransformerParameters: dialParams.HTTPTransformerParameters, + TLSFragmentClientHello: dialParams.TLSFragmentClientHello, } // Use an asynchronous callback to record the resolved IP address when @@ -1185,6 +1210,7 @@ func (dialParams *DialParameters) GetTLSOSSHConfig(config *Config) *TLSTunnelCon TLSProfile: dialParams.TLSProfile, NoDefaultTLSSessionID: &dialParams.NoDefaultTLSSessionID, RandomizedTLSProfileSeed: dialParams.RandomizedTLSProfileSeed, + FragmentClientHello: dialParams.TLSFragmentClientHello, }, // Obfuscated session tickets are not used because TLS-OSSH uses TLS 1.3. UseObfuscatedSessionTickets: false, diff --git a/psiphon/meekConn.go b/psiphon/meekConn.go index 7de1a3499..8498ef09d 100644 --- a/psiphon/meekConn.go +++ b/psiphon/meekConn.go @@ -207,6 +207,9 @@ type MeekConfig struct { // HTTPTransformerParameters specifies an HTTP transformer to apply to the // meek connection if it uses HTTP. HTTPTransformerParameters *transforms.HTTPTransformerParameters + + // TLSFragmentClientHello specifies whether to fragment the TLS Client Hello. + TLSFragmentClientHello bool } // MeekConn is a network connection that tunnels net.Conn flows over HTTP and supports @@ -458,6 +461,7 @@ func DialMeek( RandomizedTLSProfileSeed: meekConfig.RandomizedTLSProfileSeed, TLSPadding: meek.tlsPadding, TrustedCACertificatesFilename: dialConfig.TrustedCACertificatesFilename, + FragmentClientHello: meekConfig.TLSFragmentClientHello, } tlsConfig.EnableClientSessionCache() diff --git a/psiphon/meekConn_test.go b/psiphon/meekConn_test.go index 20c460385..cebbc86cd 100644 --- a/psiphon/meekConn_test.go +++ b/psiphon/meekConn_test.go @@ -72,30 +72,35 @@ func TestMeekModePlaintextRoundTrip(t *testing.T) { CustomDialer: dialer, } - ctx, cancelFunc := context.WithTimeout(context.Background(), 1*time.Second) - defer cancelFunc() + for _, tlsFragmentClientHello := range []bool{false, true} { - meekConn, err := DialMeek(ctx, meekConfig, dialConfig) - if err != nil { - t.Fatalf("DialMeek failed: %v", err) - } + ctx, cancelFunc := context.WithTimeout(context.Background(), 1*time.Second) + defer cancelFunc() - client := &http.Client{ - Transport: meekConn, - } + meekConfig.TLSFragmentClientHello = tlsFragmentClientHello - response, err := client.Get("https://" + serverAddr + "/") - if err != nil { - t.Fatalf("http.Client.Get failed: %v", err) - } - response.Body.Close() + meekConn, err := DialMeek(ctx, meekConfig, dialConfig) + if err != nil { + t.Fatalf("DialMeek failed: %v", err) + } - if response.StatusCode != http.StatusOK { - t.Fatalf("unexpected response code: %v", response.StatusCode) - } + client := &http.Client{ + Transport: meekConn, + } - err = meekConn.Close() - if err != nil { - t.Fatalf("MeekConn.Close failed: %v", err) + response, err := client.Get("https://" + serverAddr + "/") + if err != nil { + t.Fatalf("http.Client.Get failed: %v", err) + } + response.Body.Close() + + if response.StatusCode != http.StatusOK { + t.Fatalf("unexpected response code: %v", response.StatusCode) + } + + err = meekConn.Close() + if err != nil { + t.Fatalf("MeekConn.Close failed: %v", err) + } } } diff --git a/psiphon/notice.go b/psiphon/notice.go index b7c6cfdef..dbd25a6f5 100644 --- a/psiphon/notice.go +++ b/psiphon/notice.go @@ -513,6 +513,10 @@ func noticeWithDialParameters(noticeType string, dialParams *DialParameters, pos args = append(args, "tlsOSSHTransformedSNIServerName", dialParams.TLSOSSHTransformedSNIServerName) } + if dialParams.TLSFragmentClientHello { + args = append(args, "tlsFragmentClientHello", dialParams.TLSFragmentClientHello) + } + if dialParams.SelectedUserAgent { args = append(args, "userAgent", dialParams.UserAgent) } diff --git a/psiphon/server/api.go b/psiphon/server/api.go index ac0544265..9d4704d40 100644 --- a/psiphon/server/api.go +++ b/psiphon/server/api.go @@ -950,6 +950,7 @@ var baseDialParams = []requestParamSpec{ {"http_transform", isAnyString, requestParamOptional}, {"seed_transform", isAnyString, requestParamOptional}, {"ossh_prefix", isAnyString, requestParamOptional}, + {"tls_fragmented", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, } // baseSessionAndDialParams adds baseDialParams to baseSessionParams. diff --git a/psiphon/serverApi.go b/psiphon/serverApi.go index aa4283749..53a948a9e 100644 --- a/psiphon/serverApi.go +++ b/psiphon/serverApi.go @@ -1007,6 +1007,10 @@ func getBaseAPIParameters( params["tls_ossh_transformed_host_name"] = "1" } + if dialParams.TLSFragmentClientHello { + params["tls_fragmented"] = "1" + } + if dialParams.SelectedUserAgent { params["user_agent"] = dialParams.UserAgent } diff --git a/psiphon/tlsDialer.go b/psiphon/tlsDialer.go index 007a04e85..aed2cd77f 100644 --- a/psiphon/tlsDialer.go +++ b/psiphon/tlsDialer.go @@ -57,11 +57,14 @@ import ( "crypto/sha256" "crypto/x509" "encoding/base64" + "encoding/binary" "encoding/hex" std_errors "errors" + "io" "io/ioutil" "math" "net" + "sync/atomic" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors" @@ -178,6 +181,9 @@ type CustomTLSConfig struct { // obfuscator.MakeTLSPassthroughMessage. PassthroughMessage []byte + // FragmentClientHello specifies whether to fragment the ClientHello. + FragmentClientHello bool + clientSessionCache utls.ClientSessionCache } @@ -236,6 +242,10 @@ func CustomTLSDial( return nil, errors.Trace(err) } + if config.FragmentClientHello { + rawConn = NewTLSFragmentorConn(rawConn) + } + hostname, _, err := net.SplitHostPort(dialAddr) if err != nil { rawConn.Close() @@ -1010,3 +1020,226 @@ func init() { // downloads, don't depend on this TLS for its security properties. utls.EnableWeakCiphers() } + +type TLSFragmentorConn struct { + net.Conn + clientHelloSent int32 +} + +func NewTLSFragmentorConn( + conn net.Conn, +) net.Conn { + return &TLSFragmentorConn{ + Conn: conn, + } +} + +func (c *TLSFragmentorConn) Close() error { + return c.Conn.Close() +} + +func (c *TLSFragmentorConn) Read(b []byte) (n int, err error) { + return c.Conn.Read(b) +} + +// Write transparently splits the first TLS record containing ClientHello into +// two fragments and writes them separately to the underlying conn. +// The second fragment contains the data portion of the SNI extension (i.e. the server name). +// Write assumes a non-fragmented and complete ClientHello on the first call. +func (c *TLSFragmentorConn) Write(b []byte) (n int, err error) { + + if atomic.LoadInt32(&c.clientHelloSent) == 0 { + + buf := bytes.NewReader(b) + + var contentType uint8 + err := binary.Read(buf, binary.BigEndian, &contentType) + if err != nil { + return 0, errors.Trace(err) + } + if contentType != 0x16 { + return 0, errors.TraceNew("expected Handshake content type") + } + + var version uint16 + err = binary.Read(buf, binary.BigEndian, &version) + if err != nil { + return 0, errors.Trace(err) + } + if version != 0x0303 && version != 0x0302 && version != 0x0301 { + return 0, errors.TraceNew("expected TLS version 0x0303 or 0x0302 or 0x0301") + } + + var msgLen uint16 + err = binary.Read(buf, binary.BigEndian, &msgLen) + if err != nil { + return 0, errors.Trace(err) + } + if len(b) != int(msgLen)+5 { + return 0, errors.TraceNew("unexpected TLS message length") + } + + var handshakeType uint8 + err = binary.Read(buf, binary.BigEndian, &handshakeType) + if err != nil { + return 0, errors.Trace(err) + } + if handshakeType != 0x01 { + return 0, errors.TraceNew("expected ClientHello(1) handshake type") + } + + var handshakeLen uint32 + err = binary.Read(buf, binary.BigEndian, &handshakeLen) + if err != nil { + return 0, errors.Trace(err) + } + handshakeLen >>= 8 // 24-bit value + buf.UnreadByte() // Unread the last byte + + var legacyVersion uint16 + err = binary.Read(buf, binary.BigEndian, &legacyVersion) + if err != nil { + return 0, errors.Trace(err) + } + if legacyVersion != 0x0303 { + return 0, errors.TraceNew("expected TLS version 0x0303") + } + + // Skip random + _, err = buf.Seek(32, io.SeekCurrent) + if err != nil { + return 0, errors.Trace(err) + } + + var sessionIdLen uint8 + err = binary.Read(buf, binary.BigEndian, &sessionIdLen) + if err != nil { + return 0, errors.Trace(err) + } + if sessionIdLen > 32 { + return 0, errors.TraceNew("unexpected session ID length") + } + + // Skip session ID + _, err = buf.Seek(int64(sessionIdLen), io.SeekCurrent) + if err != nil { + return 0, errors.Trace(err) + } + + var cipherSuitesLen uint16 + err = binary.Read(buf, binary.BigEndian, &cipherSuitesLen) + if err != nil { + return 0, errors.Trace(err) + } + if cipherSuitesLen < 2 || cipherSuitesLen > 65535 { + return 0, errors.TraceNew("unexpected cipher suites length") + } + + // Skip cipher suites + _, err = buf.Seek(int64(cipherSuitesLen), io.SeekCurrent) + if err != nil { + return 0, errors.Trace(err) + } + + var compressionMethodsLen int8 + err = binary.Read(buf, binary.BigEndian, &compressionMethodsLen) + if err != nil { + return 0, errors.Trace(err) + } + if compressionMethodsLen < 1 || compressionMethodsLen > 32 { + return 0, errors.TraceNew("unexpected compression methods length") + } + + // Skip compression methods + _, err = buf.Seek(int64(compressionMethodsLen), io.SeekCurrent) + if err != nil { + return 0, errors.Trace(err) + } + + var extensionsLen uint16 + err = binary.Read(buf, binary.BigEndian, &extensionsLen) + if err != nil { + return 0, errors.Trace(err) + } + if extensionsLen < 2 || extensionsLen > 65535 { + return 0, errors.TraceNew("unexpected extensions length") + } + + // Finds SNI extension. + for { + if buf.Len() == 0 { + return 0, errors.TraceNew("missing SNI extension") + } + + var extensionType uint16 + err = binary.Read(buf, binary.BigEndian, &extensionType) + if err != nil { + return 0, errors.Trace(err) + } + + var extensionLen uint16 + err = binary.Read(buf, binary.BigEndian, &extensionLen) + if err != nil { + return 0, errors.Trace(err) + } + + // server_name(0) extension type + if extensionType == 0x0000 { + break + } + + // Skip extension data + _, err = buf.Seek(int64(extensionLen), io.SeekCurrent) + if err != nil { + return 0, errors.Trace(err) + } + } + + sniStartIndex := len(b) - buf.Len() + + // Splits the ClientHello message into two fragments at sniStartIndex, + // and writes them separately to the underlying conn. + tlsMessage := b[5:] + frag1, frag2, err := splitTLSMessage(contentType, version, tlsMessage, sniStartIndex) + if err != nil { + return 0, errors.Trace(err) + } + n, err = c.Conn.Write(frag1) + if err != nil { + return n, errors.Trace(err) + } + n2, err := c.Conn.Write(frag2) + if err != nil { + return n + n2, errors.Trace(err) + } + + atomic.CompareAndSwapInt32(&c.clientHelloSent, 0, 1) + + return len(b), nil + } + + return c.Conn.Write(b) +} + +// splitTLSMessage splits a TLS message into two fragments. +// The two fragments are wrapped in TLS records. +func splitTLSMessage(contentType uint8, version uint16, msg []byte, splitIndex int) ([]byte, []byte, error) { + if splitIndex > len(msg)-1 { + return nil, nil, errors.TraceNew("split index out of range") + } + + frag1 := make([]byte, splitIndex+5) + frag2 := make([]byte, len(msg)-splitIndex+5) + + frag1[0] = byte(contentType) + binary.BigEndian.PutUint16(frag1[1:3], version) + binary.BigEndian.PutUint16(frag1[3:5], uint16(splitIndex)) + copy(frag1[5:], msg[:splitIndex]) + + frag2[0] = byte(contentType) + binary.BigEndian.PutUint16(frag2[1:3], version) + binary.BigEndian.PutUint16(frag2[3:5], uint16(len(msg)-splitIndex)) + copy(frag2[5:], msg[splitIndex:]) + + return frag1, frag2, nil +} diff --git a/psiphon/tlsDialer_test.go b/psiphon/tlsDialer_test.go index 0320e07d0..0fb772594 100644 --- a/psiphon/tlsDialer_test.go +++ b/psiphon/tlsDialer_test.go @@ -418,7 +418,8 @@ func initTestCertificatesAndWebServer( func TestTLSDialerCompatibility(t *testing.T) { - // This test checks that each TLS profile can successfully complete a TLS + // This test checks that each TLS profile in combination with TLS ClientHello + // fragmentation can successfully complete a TLS // handshake with various servers. By default, only the "psiphon" case is // run, which runs the same TLS listener used by a Psiphon server. // @@ -432,22 +433,25 @@ func TestTLSDialerCompatibility(t *testing.T) { configAddresses = strings.Split(string(config), "\n") } - runner := func(address string) func(t *testing.T) { + runner := func(address string, fragmentClientHello bool) func(t *testing.T) { return func(t *testing.T) { - testTLSDialerCompatibility(t, address) + testTLSDialerCompatibility(t, address, fragmentClientHello) } } for _, address := range configAddresses { - if len(address) > 0 { - t.Run(address, runner(address)) + for _, fragmentClientHello := range []bool{false, true} { + if len(address) > 0 { + t.Run(fmt.Sprintf("%s (fragmentClientHello: %v)", address, fragmentClientHello), + runner(address, fragmentClientHello)) + } } } - t.Run("psiphon", runner("")) + t.Run("psiphon", runner("", false)) } -func testTLSDialerCompatibility(t *testing.T, address string) { +func testTLSDialerCompatibility(t *testing.T, address string, fragmentClientHello bool) { if address == "" { @@ -519,10 +523,11 @@ func testTLSDialerCompatibility(t *testing.T, address string) { transformHostname := i%2 == 0 tlsConfig := &CustomTLSConfig{ - Parameters: params, - Dial: dialer, - SkipVerify: true, - TLSProfile: tlsProfile, + Parameters: params, + Dial: dialer, + SkipVerify: true, + TLSProfile: tlsProfile, + FragmentClientHello: fragmentClientHello, } if transformHostname { @@ -760,6 +765,68 @@ func TestSelectTLSProfile(t *testing.T) { } } +func TestTLSFragmentorWithoutSNI(t *testing.T) { + testDataDirName, err := ioutil.TempDir("", "psiphon-tls-certificate-verification-test") + if err != nil { + t.Fatalf("TempDir failed: %v", err) + } + defer os.RemoveAll(testDataDirName) + + serverName := "example.org" + + rootCAsFileName, + _, + serverCertificatePin, + shutdown, + serverAddr, + dialer := initTestCertificatesAndWebServer( + t, testDataDirName, serverName) + defer shutdown() + + params, err := parameters.NewParameters(nil) + if err != nil { + t.Fatalf("parameters.NewParameters failed: %v", err) + } + + // Test: missing SNI, the TLS dial fails + + conn, err := CustomTLSDial( + context.Background(), "tcp", serverAddr, + &CustomTLSConfig{ + Parameters: params, + Dial: dialer, + SNIServerName: "", + VerifyServerName: serverName, + VerifyPins: []string{serverCertificatePin}, + TrustedCACertificatesFilename: rootCAsFileName, + }) + + if err == nil { + t.Errorf("unexpected success without SNI") + conn.Close() + } + + // Test: with SNI, the TLS dial succeeds + + conn, err = CustomTLSDial( + context.Background(), "tcp", serverAddr, + &CustomTLSConfig{ + Parameters: params, + Dial: dialer, + SNIServerName: serverName, + VerifyServerName: serverName, + VerifyPins: []string{serverCertificatePin}, + TrustedCACertificatesFilename: rootCAsFileName, + }) + + if err != nil { + t.Errorf("CustomTLSDial failed: %v", err) + } else { + conn.Close() + } + +} + func BenchmarkRandomizedGetClientHelloVersion(b *testing.B) { for n := 0; n < b.N; n++ { utlsClientHelloID := utls.HelloRandomized diff --git a/psiphon/tlsTunnelConn.go b/psiphon/tlsTunnelConn.go index 272b367c1..de4939dd8 100644 --- a/psiphon/tlsTunnelConn.go +++ b/psiphon/tlsTunnelConn.go @@ -86,6 +86,7 @@ func DialTLSTunnel( RandomizedTLSProfileSeed: tlsTunnelConfig.CustomTLSConfig.RandomizedTLSProfileSeed, TLSPadding: tlsPadding, TrustedCACertificatesFilename: dialConfig.TrustedCACertificatesFilename, + FragmentClientHello: tlsTunnelConfig.CustomTLSConfig.FragmentClientHello, } tlsConfig.EnableClientSessionCache() From 5d4609595176ba4c4389e721b8196c23c6a8a332 Mon Sep 17 00:00:00 2001 From: Amir Khan Date: Wed, 1 Nov 2023 15:02:48 -0400 Subject: [PATCH 08/29] Added protocol limit to TLSFragmentClientHelllo --- psiphon/common/parameters/parameters.go | 4 +++- psiphon/config.go | 16 +++++++++++-- psiphon/dialParameters.go | 30 ++++++++++++++----------- psiphon/meekConn.go | 6 ++--- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/psiphon/common/parameters/parameters.go b/psiphon/common/parameters/parameters.go index aca4887b3..877226914 100755 --- a/psiphon/common/parameters/parameters.go +++ b/psiphon/common/parameters/parameters.go @@ -349,6 +349,7 @@ const ( TLSTunnelMinTLSPadding = "TLSTunnelMinTLSPadding" TLSTunnelMaxTLSPadding = "TLSTunnelMaxTLSPadding" TLSFragmentClientHelloProbability = "TLSFragmentClientHelloProbability" + TLSFragmentClientHelloLimitProtocols = "TLSFragmentClientHelloLimitProtocols" // Retired parameters @@ -745,7 +746,8 @@ var defaultParameters = map[string]struct { TLSTunnelMinTLSPadding: {value: 0, minimum: 0}, TLSTunnelMaxTLSPadding: {value: 0, minimum: 0}, - TLSFragmentClientHelloProbability: {value: 0.0, minimum: 0.0}, + TLSFragmentClientHelloProbability: {value: 0.0, minimum: 0.0}, + TLSFragmentClientHelloLimitProtocols: {value: protocol.TunnelProtocols{}}, } // IsServerSideOnly indicates if the parameter specified by name is used diff --git a/psiphon/config.go b/psiphon/config.go index 32c64518f..60f84b499 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -872,8 +872,9 @@ type Config struct { TLSTunnelMinTLSPadding *int TLSTunnelMaxTLSPadding *int - // TLSFragmentClientHelloProbability is for testing purposes only. - TLSFragmentClientHelloProbability *float64 + // TLSFragmentClientHello fields are for testing purposes only. + TLSFragmentClientHelloProbability *float64 + TLSFragmentClientHelloLimitProtocols []string // AdditionalParameters is used for testing. AdditionalParameters string @@ -2064,6 +2065,10 @@ func (config *Config) makeConfigParameters() map[string]interface{} { applyParameters[parameters.TLSFragmentClientHelloProbability] = *config.TLSFragmentClientHelloProbability } + if len(config.TLSFragmentClientHelloLimitProtocols) > 0 { + applyParameters[parameters.TLSFragmentClientHelloLimitProtocols] = protocol.TunnelProtocols(config.TLSFragmentClientHelloLimitProtocols) + } + // When adding new config dial parameters that may override tactics, also // update setDialParametersHash. @@ -2600,6 +2605,13 @@ func (config *Config) setDialParametersHash() { binary.Write(hash, binary.LittleEndian, *config.TLSFragmentClientHelloProbability) } + if len(config.TLSFragmentClientHelloLimitProtocols) > 0 { + hash.Write([]byte("TLSFragmentClientHelloLimitProtocols")) + for _, protocol := range config.TLSFragmentClientHelloLimitProtocols { + hash.Write([]byte(protocol)) + } + } + config.dialParametersHash = hash.Sum(nil) } diff --git a/psiphon/dialParameters.go b/psiphon/dialParameters.go index ada1b968d..3e63e96bc 100644 --- a/psiphon/dialParameters.go +++ b/psiphon/dialParameters.go @@ -1021,21 +1021,25 @@ func MakeDialParameters( // of SNI is determined above. if (!isReplay || !replayTLSFragmentClientHello) && usingTLS { - // Note: The TLS stack automatically drops the SNI extension when - // the host is an IP address. + limitProtocols := p.TunnelProtocols(parameters.TLSFragmentClientHelloLimitProtocols) + if len(limitProtocols) == 0 || common.Contains(limitProtocols, dialParams.TunnelProtocol) { - usingSNI := false - if dialParams.TLSOSSHSNIServerName != "" { - usingSNI = net.ParseIP(dialParams.TLSOSSHSNIServerName) == nil + // Note: The TLS stack automatically drops the SNI extension when + // the host is an IP address. - } else if dialParams.MeekSNIServerName != "" { - usingSNI = net.ParseIP(dialParams.MeekSNIServerName) == nil - } + usingSNI := false + if dialParams.TLSOSSHSNIServerName != "" { + usingSNI = net.ParseIP(dialParams.TLSOSSHSNIServerName) == nil + + } else if dialParams.MeekSNIServerName != "" { + usingSNI = net.ParseIP(dialParams.MeekSNIServerName) == nil + } - // TLS ClientHello fragmentor expects SNI to be present. - if usingSNI { - dialParams.TLSFragmentClientHello = p.WeightedCoinFlip( - parameters.TLSFragmentClientHelloProbability) + // TLS ClientHello fragmentor expects SNI to be present. + if usingSNI { + dialParams.TLSFragmentClientHello = p.WeightedCoinFlip( + parameters.TLSFragmentClientHelloProbability) + } } } @@ -1152,6 +1156,7 @@ func MakeDialParameters( QUICDisablePathMTUDiscovery: dialParams.QUICDisablePathMTUDiscovery, UseHTTPS: usingTLS, TLSProfile: dialParams.TLSProfile, + TLSFragmentClientHello: dialParams.TLSFragmentClientHello, LegacyPassthrough: serverEntry.ProtocolUsesLegacyPassthrough(dialParams.TunnelProtocol), NoDefaultTLSSessionID: dialParams.NoDefaultTLSSessionID, RandomizedTLSProfileSeed: dialParams.RandomizedTLSProfileSeed, @@ -1169,7 +1174,6 @@ func MakeDialParameters( MeekObfuscatorPaddingSeed: dialParams.MeekObfuscatorPaddingSeed, NetworkLatencyMultiplier: dialParams.NetworkLatencyMultiplier, HTTPTransformerParameters: dialParams.HTTPTransformerParameters, - TLSFragmentClientHello: dialParams.TLSFragmentClientHello, } // Use an asynchronous callback to record the resolved IP address when diff --git a/psiphon/meekConn.go b/psiphon/meekConn.go index 8498ef09d..eb1f0b36e 100644 --- a/psiphon/meekConn.go +++ b/psiphon/meekConn.go @@ -131,6 +131,9 @@ type MeekConfig struct { // underlying TLS connections created by this meek connection. TLSProfile string + // TLSFragmentClientHello specifies whether to fragment the TLS Client Hello. + TLSFragmentClientHello bool + // LegacyPassthrough indicates that the server expects a legacy passthrough // message. LegacyPassthrough bool @@ -207,9 +210,6 @@ type MeekConfig struct { // HTTPTransformerParameters specifies an HTTP transformer to apply to the // meek connection if it uses HTTP. HTTPTransformerParameters *transforms.HTTPTransformerParameters - - // TLSFragmentClientHello specifies whether to fragment the TLS Client Hello. - TLSFragmentClientHello bool } // MeekConn is a network connection that tunnels net.Conn flows over HTTP and supports From 0dc2082e665e0ae7a13c4a7d5a2f8c2f7b80ea0f Mon Sep 17 00:00:00 2001 From: Amir Khan Date: Wed, 1 Nov 2023 17:23:30 -0400 Subject: [PATCH 09/29] Added TLS fragmentation to fronted HTTP client --- psiphon/net.go | 13 +++++++++++++ psiphon/server/api.go | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/psiphon/net.go b/psiphon/net.go index 80ddef7cf..ecf676eb1 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -474,6 +474,14 @@ func makeFrontedHTTPClient( networkLatencyMultiplierMax, p.Float(parameters.NetworkLatencyMultiplierLambda)) + tlsFragmentClientHello := false + tlsFragmentorLimitProtocols := p.TunnelProtocols(parameters.TLSFragmentClientHelloLimitProtocols) + if len(tlsFragmentorLimitProtocols) == 0 || common.Contains(tlsFragmentorLimitProtocols, effectiveTunnelProtocol) { + if net.ParseIP(meekSNIServerName) == nil { + tlsFragmentClientHello = p.WeightedCoinFlip(parameters.TLSFragmentClientHelloProbability) + } + } + meekConfig := &MeekConfig{ DiagnosticID: frontingProviderID, Parameters: config.GetParameters(), @@ -481,6 +489,7 @@ func makeFrontedHTTPClient( DialAddress: meekDialAddress, UseHTTPS: true, TLSProfile: tlsProfile, + TLSFragmentClientHello: tlsFragmentClientHello, NoDefaultTLSSessionID: noDefaultTLSSessionID, RandomizedTLSProfileSeed: randomizedTLSProfileSeed, SNIServerName: meekSNIServerName, @@ -603,6 +612,10 @@ func makeFrontedHTTPClient( params["tls_version"] = getTLSVersionForMetrics(tlsVersion, meekConfig.NoDefaultTLSSessionID) } + if meekConfig.TLSFragmentClientHello { + params["tls_fragmented"] = "1" + } + return params } diff --git a/psiphon/server/api.go b/psiphon/server/api.go index 9d4704d40..a2411ba4c 100644 --- a/psiphon/server/api.go +++ b/psiphon/server/api.go @@ -541,7 +541,9 @@ var remoteServerListStatParams = append( {"meek_transformed_host_name", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, {"user_agent", isAnyString, requestParamOptional}, {"tls_profile", isAnyString, requestParamOptional}, - {"tls_version", isAnyString, requestParamOptional}}, + {"tls_version", isAnyString, requestParamOptional}, + {"tls_fragmented", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, + }, baseSessionParams...) From 58ce5152a3835b432e6b532383e014614097fa04 Mon Sep 17 00:00:00 2001 From: Amir Khan Date: Thu, 2 Nov 2023 10:59:57 -0400 Subject: [PATCH 10/29] Fix: check if SNI is omitted --- psiphon/net.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/psiphon/net.go b/psiphon/net.go index ecf676eb1..4793e111c 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -475,10 +475,12 @@ func makeFrontedHTTPClient( p.Float(parameters.NetworkLatencyMultiplierLambda)) tlsFragmentClientHello := false - tlsFragmentorLimitProtocols := p.TunnelProtocols(parameters.TLSFragmentClientHelloLimitProtocols) - if len(tlsFragmentorLimitProtocols) == 0 || common.Contains(tlsFragmentorLimitProtocols, effectiveTunnelProtocol) { - if net.ParseIP(meekSNIServerName) == nil { - tlsFragmentClientHello = p.WeightedCoinFlip(parameters.TLSFragmentClientHelloProbability) + if meekSNIServerName != "" { + tlsFragmentorLimitProtocols := p.TunnelProtocols(parameters.TLSFragmentClientHelloLimitProtocols) + if len(tlsFragmentorLimitProtocols) == 0 || common.Contains(tlsFragmentorLimitProtocols, effectiveTunnelProtocol) { + if net.ParseIP(meekSNIServerName) == nil { + tlsFragmentClientHello = p.WeightedCoinFlip(parameters.TLSFragmentClientHelloProbability) + } } } From efcd0900410feb48ad3e65cd1cd88477dadc5ede Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Mon, 6 Nov 2023 11:45:23 -0500 Subject: [PATCH 11/29] Fix PSIPHON_DISABLE_QUIC build --- .github/workflows/tests.yml | 10 +++++++++- psiphon/common/quic/quic_disabled.go | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 007645173..0025f06bc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,7 +16,7 @@ jobs: matrix: os: [ "ubuntu" ] go: [ "1.19.8" ] - test-type: [ "detector", "coverage", "memory" ] + test-type: [ "detector", "coverage", "memory", "custom-build-tags" ] runs-on: ${{ matrix.os }}-latest @@ -140,3 +140,11 @@ jobs: cd ${{ github.workspace }}/go/src/github.com/Psiphon-Labs/psiphon-tunnel-core go test -v ./psiphon/memory_test -run TestReconnectTunnel go test -v ./psiphon/memory_test -run TestRestartController + + - name: Compile with custom build tags + if: ${{ matrix.test-type == 'custom-build-tags' }} + run: | + cd ${{ github.workspace }}/go/src/github.com/Psiphon-Labs/psiphon-tunnel-core/ConsoleClient + go build -a -v -tags "PSIPHON_DISABLE_QUIC" + go build -a -v -tags "PSIPHON_DISABLE_GQUIC" + go build -a -v -tags "PSIPHON_ENABLE_REFRACTION_NETWORKING" diff --git a/psiphon/common/quic/quic_disabled.go b/psiphon/common/quic/quic_disabled.go index df8f00953..7f679b597 100644 --- a/psiphon/common/quic/quic_disabled.go +++ b/psiphon/common/quic/quic_disabled.go @@ -30,6 +30,7 @@ import ( "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/errors" "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/prng" + "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/transforms" ) // Enabled indicates if QUIC functionality is enabled. @@ -60,6 +61,7 @@ func Dial( _ *prng.Seed, _ string, _ *prng.Seed, + _ *transforms.ObfuscatorSeedTransformerParameters, _ bool) (net.Conn, error) { return nil, errors.TraceNew("operation is not enabled") From 2f813af389f4d2c0caa4ffc0e5e4c1c588b81412 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 09:03:12 -0500 Subject: [PATCH 12/29] Fix: don't log negative network_bytes values - Omit negative values that may arise due to /proc/net/dev counter wrap around or reset; continue to log values on subsequent iterations - For readability, skip delta logic after getNetworkBytesTransferred failure - Rename files to conform with naming conventions --- ...ndwidth_linux.go => networkBytes_linux.go} | 0 ...ndwidth_other.go => networkBytes_other.go} | 0 psiphon/server/services.go | 31 +++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) rename psiphon/server/{network_bandwidth_linux.go => networkBytes_linux.go} (100%) rename psiphon/server/{network_bandwidth_other.go => networkBytes_other.go} (100%) diff --git a/psiphon/server/network_bandwidth_linux.go b/psiphon/server/networkBytes_linux.go similarity index 100% rename from psiphon/server/network_bandwidth_linux.go rename to psiphon/server/networkBytes_linux.go diff --git a/psiphon/server/network_bandwidth_other.go b/psiphon/server/networkBytes_other.go similarity index 100% rename from psiphon/server/network_bandwidth_other.go rename to psiphon/server/networkBytes_other.go diff --git a/psiphon/server/services.go b/psiphon/server/services.go index a54cf8341..b2ec9bd7c 100644 --- a/psiphon/server/services.go +++ b/psiphon/server/services.go @@ -169,6 +169,11 @@ func RunServices(configJSON []byte) (retErr error) { previousNetworkBytesReceived, previousNetworkBytesSent, err := getNetworkBytesTransferred() if err != nil { log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get initial network bytes transferred") + + // If getNetworkBytesTransferred fails, stop logging network + // bytes for the lifetime of this process, in case there's a + // persistent issue with /proc/net/dev data. + logNetworkBytes = false } @@ -184,14 +189,20 @@ func RunServices(configJSON []byte) (retErr error) { if err != nil { log.WithTraceFields(LogFields{"error": errors.Trace(err)}).Error("failed to get current network bytes transferred") logNetworkBytes = false - } - networkBytesReceived = currentNetworkBytesReceived - previousNetworkBytesReceived - networkBytesSent = currentNetworkBytesSent - previousNetworkBytesSent + } else { + networkBytesReceived = currentNetworkBytesReceived - previousNetworkBytesReceived + networkBytesSent = currentNetworkBytesSent - previousNetworkBytesSent - previousNetworkBytesReceived, previousNetworkBytesSent = currentNetworkBytesReceived, currentNetworkBytesSent + previousNetworkBytesReceived, previousNetworkBytesSent = currentNetworkBytesReceived, currentNetworkBytesSent + } } + // In the rare case that /proc/net/dev rx or tx counters + // wrap around or are reset, networkBytesReceived or + // networkBytesSent may be < 0. logServerLoad will not + // log these negative values. + logServerLoad(support, logNetworkBytes, networkBytesReceived, networkBytesSent) } } @@ -393,8 +404,16 @@ func logServerLoad(support *SupportServices, logNetworkBytes bool, networkBytesR serverLoad["event_name"] = "server_load" if logNetworkBytes { - serverLoad["network_bytes_received"] = networkBytesReceived - serverLoad["network_bytes_sent"] = networkBytesSent + + // Negative values, which may occur due to counter wrap arounds, are + // omitted. + + if networkBytesReceived >= 0 { + serverLoad["network_bytes_received"] = networkBytesReceived + } + if networkBytesSent >= 0 { + serverLoad["network_bytes_sent"] = networkBytesSent + } } establishTunnels, establishLimitedCount := From c5fdc73ff32c99c710888b5044f09e4947e5b129 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 09:17:18 -0500 Subject: [PATCH 13/29] Use Go 1.20.10 --- .github/workflows/tests.yml | 2 +- ClientLibrary/Dockerfile | 2 +- ClientLibrary/build-darwin.sh | 4 ++-- ConsoleClient/Dockerfile | 2 +- MobileLibrary/Android/Dockerfile | 2 +- MobileLibrary/iOS/build-psiphon-framework.sh | 2 +- Server/Dockerfile-binary-builder | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0025f06bc..a2f306f27 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: [ "ubuntu" ] - go: [ "1.19.8" ] + go: [ "1.20.10" ] test-type: [ "detector", "coverage", "memory", "custom-build-tags" ] runs-on: ${{ matrix.os }}-latest diff --git a/ClientLibrary/Dockerfile b/ClientLibrary/Dockerfile index 5857825b7..1b817b17c 100644 --- a/ClientLibrary/Dockerfile +++ b/ClientLibrary/Dockerfile @@ -21,7 +21,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ # Install Go. # NOTE: Go 1.10+ is required to build c-shared for windows (https://github.com/golang/go/commit/bb0bfd002ada7e3eb9198d4287b32c2fed6e8da6) -ENV GOVERSION=go1.19.8 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/ClientLibrary/build-darwin.sh b/ClientLibrary/build-darwin.sh index afce8725c..52bdafc7b 100755 --- a/ClientLibrary/build-darwin.sh +++ b/ClientLibrary/build-darwin.sh @@ -9,8 +9,8 @@ if [ -z ${2+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$2"; fi # Note: # clangwrap.sh needs to be updated when the Go version changes. # The last version was: -# https://github.com/golang/go/blob/go1.19.8/misc/ios/clangwrap.sh -GO_VERSION_REQUIRED="1.19.8" +# https://github.com/golang/go/blob/go1.20.10/misc/ios/clangwrap.sh +GO_VERSION_REQUIRED="1.20.10" BASE_DIR=$(cd "$(dirname "$0")" ; pwd -P) cd ${BASE_DIR} diff --git a/ConsoleClient/Dockerfile b/ConsoleClient/Dockerfile index b969c57e4..afcc633a3 100644 --- a/ConsoleClient/Dockerfile +++ b/ConsoleClient/Dockerfile @@ -22,7 +22,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install Go. -ENV GOVERSION=go1.19.8 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/MobileLibrary/Android/Dockerfile b/MobileLibrary/Android/Dockerfile index 6f0595fa3..f3b5f3258 100644 --- a/MobileLibrary/Android/Dockerfile +++ b/MobileLibrary/Android/Dockerfile @@ -22,7 +22,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install Go. -ENV GOVERSION=go1.19.8 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/MobileLibrary/iOS/build-psiphon-framework.sh b/MobileLibrary/iOS/build-psiphon-framework.sh index 660be2387..e3dff9e75 100755 --- a/MobileLibrary/iOS/build-psiphon-framework.sh +++ b/MobileLibrary/iOS/build-psiphon-framework.sh @@ -17,7 +17,7 @@ set -e -u -x if [ -z ${1+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$1"; fi # Modify this value as we use newer Go versions. -GO_VERSION_REQUIRED="1.19.8" +GO_VERSION_REQUIRED="1.20.10" # At this time, psiphon-tunnel-core doesn't support modules export GO111MODULE=off diff --git a/Server/Dockerfile-binary-builder b/Server/Dockerfile-binary-builder index 27ee6a70f..71c1e9a89 100644 --- a/Server/Dockerfile-binary-builder +++ b/Server/Dockerfile-binary-builder @@ -1,6 +1,6 @@ FROM alpine:3.10.2 -ENV GOLANG_VERSION 1.19.8 +ENV GOLANG_VERSION 1.20.10 ENV GOLANG_SRC_URL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz RUN set -ex \ From 554148b4de73cd3f825432aa522dfbd1106efc6c Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 11:16:01 -0500 Subject: [PATCH 14/29] Fix: use newer Alpine Linux Docker base image - Docker build failed as Go version included with Alpine 3.10.2 is too old to build Go 1.20. --- Server/Dockerfile-binary-builder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Dockerfile-binary-builder b/Server/Dockerfile-binary-builder index 71c1e9a89..b5c242736 100644 --- a/Server/Dockerfile-binary-builder +++ b/Server/Dockerfile-binary-builder @@ -1,4 +1,4 @@ -FROM alpine:3.10.2 +FROM alpine:3.18.4 ENV GOLANG_VERSION 1.20.10 ENV GOLANG_SRC_URL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz From a8ee65260468e96a6d776c1549fd84f2705802c8 Mon Sep 17 00:00:00 2001 From: mirokuratczyk Date: Mon, 6 Nov 2023 12:53:34 -0500 Subject: [PATCH 15/29] Fix: log new TLS-OSSH fields --- psiphon/server/api.go | 3 +++ psiphon/server/server_test.go | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/psiphon/server/api.go b/psiphon/server/api.go index f7b889f9d..e85a5492c 100644 --- a/psiphon/server/api.go +++ b/psiphon/server/api.go @@ -953,6 +953,9 @@ var baseDialParams = []requestParamSpec{ {"seed_transform", isAnyString, requestParamOptional}, {"ossh_prefix", isAnyString, requestParamOptional}, {"tls_fragmented", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, + {"tls_padding", isIntString, requestParamOptional | requestParamLogStringAsInt}, + {"tls_ossh_sni_server_name", isDomain, requestParamOptional}, + {"tls_ossh_transformed_host_name", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, } // baseSessionAndDialParams adds baseDialParams to baseSessionParams. diff --git a/psiphon/server/server_test.go b/psiphon/server/server_test.go index c78cbbeb6..e18e87986 100644 --- a/psiphon/server/server_test.go +++ b/psiphon/server/server_test.go @@ -309,7 +309,7 @@ func TestUnfrontedMeekSessionTicketTLS13(t *testing.T) { }) } -func TestTLSOverUnfrontedMeekHTTPSDemux(t *testing.T) { +func TestTLSOSSHOverUnfrontedMeekHTTPSDemux(t *testing.T) { runServer(t, &runServerConfig{ tunnelProtocol: "UNFRONTED-MEEK-HTTPS-OSSH", @@ -324,7 +324,7 @@ func TestTLSOverUnfrontedMeekHTTPSDemux(t *testing.T) { }) } -func TestTLSOverUnfrontedMeekSessionTicketDemux(t *testing.T) { +func TestTLSOSSHOverUnfrontedMeekSessionTicketDemux(t *testing.T) { runServer(t, &runServerConfig{ tunnelProtocol: "UNFRONTED-MEEK-SESSION-TICKET-OSSH", @@ -1053,6 +1053,18 @@ func runServer(t *testing.T, runConfig *runServerConfig) { clientConfig.Authorizations = []string{clientAuthorization} } + // When using TLS-OSSH the test expects the server to log the fields + // tls_ossh_sni_server_name and tls_ossh_transformed_host_name, which are + // only shipped by the client when the host name is transformed. + if protocol.TunnelProtocolUsesTLSOSSH(clientTunnelProtocol) { + transformHostNameProbability := 1.0 + clientConfig.TransformHostNameProbability = &transformHostNameProbability + clientConfig.CustomHostNameRegexes = []string{testCustomHostNameRegex} + customHostNameProbability := 1.0 + clientConfig.CustomHostNameProbability = &customHostNameProbability + clientConfig.CustomHostNameLimitProtocols = []string{clientTunnelProtocol} + } + err = clientConfig.Commit(false) if err != nil { t.Fatalf("error committing configuration file: %s", err) @@ -1904,6 +1916,23 @@ func checkExpectedServerTunnelLogFields( } } + if protocol.TunnelProtocolUsesTLSOSSH(expectedRelayProtocol) { + for _, name := range []string{ + "tls_padding", + "tls_ossh_sni_server_name", + "tls_ossh_transformed_host_name", + } { + if fields[name] == nil || fmt.Sprintf("%s", fields[name]) == "" { + return fmt.Errorf("missing expected field '%s'", name) + } + } + + hostName := fields["tls_ossh_sni_server_name"].(string) + if regexp.MustCompile(testCustomHostNameRegex).FindString(hostName) != hostName { + return fmt.Errorf("unexpected tls_ossh_sni_server_name '%s'", fields["tls_ossh_sni_server_name"]) + } + } + if runConfig.applyPrefix { if fields["ossh_prefix"] == nil || fmt.Sprintf("%s", fields["ossh_prefix"]) == "" { From 327ce43010c1ecef0fafd70f507271fc984d4958 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 12:33:51 -0500 Subject: [PATCH 16/29] Upgrade to refraction-networking/conjure v0.7.9 --- go.mod | 6 +- go.sum | 20 +- vendor/filippo.io/bigmod/LICENSE | 27 + vendor/filippo.io/bigmod/nat.go | 714 ++++++++++++++++++ vendor/filippo.io/bigmod/nat_amd64.go | 8 + vendor/filippo.io/bigmod/nat_amd64.s | 68 ++ vendor/filippo.io/bigmod/nat_noasm.go | 11 + vendor/filippo.io/keygen/LICENSE | 15 + vendor/filippo.io/keygen/ecdsa.go | 99 +++ .../conjure/pkg/dtls/listener.go | 7 +- .../conjure/pkg/dtls/seedtocert.go | 38 +- vendor/modules.txt | 8 +- 12 files changed, 979 insertions(+), 42 deletions(-) create mode 100644 vendor/filippo.io/bigmod/LICENSE create mode 100644 vendor/filippo.io/bigmod/nat.go create mode 100644 vendor/filippo.io/bigmod/nat_amd64.go create mode 100644 vendor/filippo.io/bigmod/nat_amd64.s create mode 100644 vendor/filippo.io/bigmod/nat_noasm.go create mode 100644 vendor/filippo.io/keygen/LICENSE create mode 100644 vendor/filippo.io/keygen/ecdsa.go diff --git a/go.mod b/go.mod index 568c92a24..c19860f23 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,8 @@ require ( github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 github.com/oschwald/maxminddb-golang v1.12.0 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/refraction-networking/conjure v0.7.8 + github.com/pion/sctp v1.8.8 + github.com/refraction-networking/conjure v0.7.9 github.com/refraction-networking/gotapdance v1.7.7 github.com/refraction-networking/utls v1.3.3 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 @@ -48,6 +49,8 @@ require ( ) require ( + filippo.io/bigmod v0.0.1 // indirect + filippo.io/keygen v0.0.0-20230306160926-5201437acf8e // indirect github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/Psiphon-Labs/qtls-go1-19 v0.0.0-20230608213623-d58aa73e519a // indirect @@ -75,7 +78,6 @@ require ( github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/sctp v1.8.8 // indirect github.com/pion/stun v0.6.1 // indirect github.com/pion/transport/v2 v2.2.3 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index dfbc5d742..3d3be8956 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +filippo.io/bigmod v0.0.1 h1:OaEqDr3gEbofpnHbGqZweSL/bLMhy1pb54puiCDeuOA= +filippo.io/bigmod v0.0.1/go.mod h1:KyzqAbH7bRH6MOuOF1TPfUjvLoi0mRF2bIyD2ouRNQI= +filippo.io/keygen v0.0.0-20230306160926-5201437acf8e h1:+xwUCyMiCWKWsI0RowhzB4sngpUdMHgU6lLuWJCX5Dg= +filippo.io/keygen v0.0.0-20230306160926-5201437acf8e/go.mod h1:ZGSiF/b2hd6MRghF/cid0vXw8pXykRTmIu+JSPw/NCQ= github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 h1:CVuXDbdzPW0XCNYTldy5dQues57geAs+vfwz3FTTpy8= github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -172,12 +176,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/refraction-networking/conjure v0.7.7 h1:8vWFmSzmkNSrVr1TI4BRbgCD1tc3FTIm40PzjI2olRQ= -github.com/refraction-networking/conjure v0.7.7/go.mod h1:/UxAcot49ii6ejyvBrSo3g10yyUEavaGJT1Iy47oAfU= -github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312 h1:IP2pvATIC1QBj2/+biLxTJa23PxRIiDwrPvvE4Sh6cw= -github.com/refraction-networking/conjure v0.7.8-0.20231019174926-d2f991831312/go.mod h1:iOb7GmuSvk/LZsd40L+D/cKmVGIjpFWQkbtOPggJrcA= -github.com/refraction-networking/conjure v0.7.8 h1:gPjb0iFyrxkcxc7eOKMjIgh/M4fPaP+plYw9PITWXYs= -github.com/refraction-networking/conjure v0.7.8/go.mod h1:iOb7GmuSvk/LZsd40L+D/cKmVGIjpFWQkbtOPggJrcA= +github.com/refraction-networking/conjure v0.7.9 h1:ABEtW1treui43vP0LlCslfw274bIyFaoxDB59BzUrl4= +github.com/refraction-networking/conjure v0.7.9/go.mod h1:O5u/Mpg5b3whLF8L701pTMQW23SviS+rDKdWbY/BM0Q= github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= github.com/refraction-networking/gotapdance v1.7.7 h1:RSdDCA0v4n/iIxCnxLF6uCoJdlo000R+IKGvELfpc/A= @@ -219,8 +219,6 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= -golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20221012211006-4de253d81b95 h1:sBdrWpxhGDdTAYNqbgBLAR+ULAPPhfgncLr1X0lyWtg= @@ -254,8 +252,6 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= -golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -299,8 +295,6 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -310,8 +304,6 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= -golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/filippo.io/bigmod/LICENSE b/vendor/filippo.io/bigmod/LICENSE new file mode 100644 index 000000000..6a66aea5e --- /dev/null +++ b/vendor/filippo.io/bigmod/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/filippo.io/bigmod/nat.go b/vendor/filippo.io/bigmod/nat.go new file mode 100644 index 000000000..8d50f139a --- /dev/null +++ b/vendor/filippo.io/bigmod/nat.go @@ -0,0 +1,714 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bigmod implements constant-time big integer arithmetic modulo large +// odd moduli. Unlike math/big, this package is suitable for implementing +// security-sensitive cryptographic operations. It is a re-exported version the +// standard library package crypto/internal/bigmod used to implement crypto/rsa +// amongst others. +// +// The API is NOT stable. In particular, its safety is suboptimal, as the caller +// is responsible for ensuring that Nats are reduced modulo the Modulus they are +// used with. +package bigmod + +import ( + "errors" + "math/big" + "math/bits" +) + +const ( + // _W is the number of bits we use for our limbs. + _W = bits.UintSize - 1 + // _MASK selects _W bits from a full machine word. + _MASK = (1 << _W) - 1 +) + +// choice represents a constant-time boolean. The value of choice is always +// either 1 or 0. We use an int instead of bool in order to make decisions in +// constant time by turning it into a mask. +type choice uint + +func not(c choice) choice { return 1 ^ c } + +const yes = choice(1) +const no = choice(0) + +// ctSelect returns x if on == 1, and y if on == 0. The execution time of this +// function does not depend on its inputs. If on is any value besides 1 or 0, +// the result is undefined. +func ctSelect(on choice, x, y uint) uint { + // When on == 1, mask is 0b111..., otherwise mask is 0b000... + mask := -uint(on) + // When mask is all zeros, we just have y, otherwise, y cancels with itself. + return y ^ (mask & (y ^ x)) +} + +// ctEq returns 1 if x == y, and 0 otherwise. The execution time of this +// function does not depend on its inputs. +func ctEq(x, y uint) choice { + // If x != y, then either x - y or y - x will generate a carry. + _, c1 := bits.Sub(x, y, 0) + _, c2 := bits.Sub(y, x, 0) + return not(choice(c1 | c2)) +} + +// ctGeq returns 1 if x >= y, and 0 otherwise. The execution time of this +// function does not depend on its inputs. +func ctGeq(x, y uint) choice { + // If x < y, then x - y generates a carry. + _, carry := bits.Sub(x, y, 0) + return not(choice(carry)) +} + +// Nat represents an arbitrary natural number +// +// Each Nat has an announced length, which is the number of limbs it has stored. +// Operations on this number are allowed to leak this length, but will not leak +// any information about the values contained in those limbs. +type Nat struct { + // limbs is a little-endian representation in base 2^W with + // W = bits.UintSize - 1. The top bit is always unset between operations. + // + // The top bit is left unset to optimize Montgomery multiplication, in the + // inner loop of exponentiation. Using fully saturated limbs would leave us + // working with 129-bit numbers on 64-bit platforms, wasting a lot of space, + // and thus time. + limbs []uint +} + +// preallocTarget is the size in bits of the numbers used to implement the most +// common and most performant RSA key size. It's also enough to cover some of +// the operations of key sizes up to 4096. +const preallocTarget = 2048 +const preallocLimbs = (preallocTarget + _W - 1) / _W + +// NewNat returns a new nat with a size of zero, just like new(Nat), but with +// the preallocated capacity to hold a number of up to 2048 bits. +// NewNat inlines, so the allocation can live on the stack. +func NewNat() *Nat { + limbs := make([]uint, 0, preallocLimbs) + return &Nat{limbs} +} + +// expand expands x to n limbs, leaving its value unchanged. +func (x *Nat) expand(n int) *Nat { + if len(x.limbs) > n { + panic("bigmod: internal error: shrinking nat") + } + if cap(x.limbs) < n { + newLimbs := make([]uint, n) + copy(newLimbs, x.limbs) + x.limbs = newLimbs + return x + } + extraLimbs := x.limbs[len(x.limbs):n] + for i := range extraLimbs { + extraLimbs[i] = 0 + } + x.limbs = x.limbs[:n] + return x +} + +// reset returns a zero nat of n limbs, reusing x's storage if n <= cap(x.limbs). +func (x *Nat) reset(n int) *Nat { + if cap(x.limbs) < n { + x.limbs = make([]uint, n) + return x + } + for i := range x.limbs { + x.limbs[i] = 0 + } + x.limbs = x.limbs[:n] + return x +} + +// set assigns x = y, optionally resizing x to the appropriate size. +func (x *Nat) set(y *Nat) *Nat { + x.reset(len(y.limbs)) + copy(x.limbs, y.limbs) + return x +} + +// setBig assigns x = n, optionally resizing n to the appropriate size. +// +// The announced length of x is set based on the actual bit size of the input, +// ignoring leading zeroes. +func (x *Nat) setBig(n *big.Int) *Nat { + requiredLimbs := (n.BitLen() + _W - 1) / _W + x.reset(requiredLimbs) + + outI := 0 + shift := 0 + limbs := n.Bits() + for i := range limbs { + xi := uint(limbs[i]) + x.limbs[outI] |= (xi << shift) & _MASK + outI++ + if outI == requiredLimbs { + return x + } + x.limbs[outI] = xi >> (_W - shift) + shift++ // this assumes bits.UintSize - _W = 1 + if shift == _W { + shift = 0 + outI++ + } + } + return x +} + +// Bytes returns x as a zero-extended big-endian byte slice. The size of the +// slice will match the size of m. +// +// x must have the same size as m and it must be reduced modulo m. +func (x *Nat) Bytes(m *Modulus) []byte { + bytes := make([]byte, m.Size()) + shift := 0 + outI := len(bytes) - 1 + for _, limb := range x.limbs { + remainingBits := _W + for remainingBits >= 8 { + bytes[outI] |= byte(limb) << shift + consumed := 8 - shift + limb >>= consumed + remainingBits -= consumed + shift = 0 + outI-- + if outI < 0 { + return bytes + } + } + bytes[outI] = byte(limb) + shift = remainingBits + } + return bytes +} + +// SetBytes assigns x = b, where b is a slice of big-endian bytes. +// SetBytes returns an error if b >= m. +// +// The output will be resized to the size of m and overwritten. +func (x *Nat) SetBytes(b []byte, m *Modulus) (*Nat, error) { + if err := x.setBytes(b, m); err != nil { + return nil, err + } + if x.cmpGeq(m.nat) == yes { + return nil, errors.New("input overflows the modulus") + } + return x, nil +} + +// SetOverflowingBytes assigns x = b, where b is a slice of big-endian bytes. SetOverflowingBytes +// returns an error if b has a longer bit length than m, but reduces overflowing +// values up to 2^⌈log2(m)⌉ - 1. +// +// The output will be resized to the size of m and overwritten. +func (x *Nat) SetOverflowingBytes(b []byte, m *Modulus) (*Nat, error) { + if err := x.setBytes(b, m); err != nil { + return nil, err + } + leading := _W - bitLen(x.limbs[len(x.limbs)-1]) + if leading < m.leading { + return nil, errors.New("input overflows the modulus") + } + x.sub(x.cmpGeq(m.nat), m.nat) + return x, nil +} + +func (x *Nat) setBytes(b []byte, m *Modulus) error { + outI := 0 + shift := 0 + x.resetFor(m) + for i := len(b) - 1; i >= 0; i-- { + bi := b[i] + x.limbs[outI] |= uint(bi) << shift + shift += 8 + if shift >= _W { + shift -= _W + x.limbs[outI] &= _MASK + overflow := bi >> (8 - shift) + outI++ + if outI >= len(x.limbs) { + if overflow > 0 || i > 0 { + return errors.New("input overflows the modulus") + } + break + } + x.limbs[outI] = uint(overflow) + } + } + return nil +} + +// Equal returns 1 if x == y, and 0 otherwise. +// +// Both operands must have the same announced length. +func (x *Nat) Equal(y *Nat) uint { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + yLimbs := y.limbs[:size] + + equal := yes + for i := 0; i < size; i++ { + equal &= ctEq(xLimbs[i], yLimbs[i]) + } + return uint(equal) +} + +// IsZero returns 1 if x == 0, and 0 otherwise. +func (x *Nat) IsZero() uint { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + + zero := yes + for i := 0; i < size; i++ { + zero &= ctEq(xLimbs[i], 0) + } + return uint(zero) +} + +// cmpGeq returns 1 if x >= y, and 0 otherwise. +// +// Both operands must have the same announced length. +func (x *Nat) cmpGeq(y *Nat) choice { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + yLimbs := y.limbs[:size] + + var c uint + for i := 0; i < size; i++ { + c = (xLimbs[i] - yLimbs[i] - c) >> _W + } + // If there was a carry, then subtracting y underflowed, so + // x is not greater than or equal to y. + return not(choice(c)) +} + +// assign sets x <- y if on == 1, and does nothing otherwise. +// +// Both operands must have the same announced length. +func (x *Nat) assign(on choice, y *Nat) *Nat { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + yLimbs := y.limbs[:size] + + for i := 0; i < size; i++ { + xLimbs[i] = ctSelect(on, yLimbs[i], xLimbs[i]) + } + return x +} + +// add computes x += y if on == 1, and does nothing otherwise. It returns the +// carry of the addition regardless of on. +// +// Both operands must have the same announced length. +func (x *Nat) add(on choice, y *Nat) (c uint) { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + yLimbs := y.limbs[:size] + + for i := 0; i < size; i++ { + res := xLimbs[i] + yLimbs[i] + c + xLimbs[i] = ctSelect(on, res&_MASK, xLimbs[i]) + c = res >> _W + } + return +} + +// sub computes x -= y if on == 1, and does nothing otherwise. It returns the +// borrow of the subtraction regardless of on. +// +// Both operands must have the same announced length. +func (x *Nat) sub(on choice, y *Nat) (c uint) { + // Eliminate bounds checks in the loop. + size := len(x.limbs) + xLimbs := x.limbs[:size] + yLimbs := y.limbs[:size] + + for i := 0; i < size; i++ { + res := xLimbs[i] - yLimbs[i] - c + xLimbs[i] = ctSelect(on, res&_MASK, xLimbs[i]) + c = res >> _W + } + return +} + +// Modulus is used for modular arithmetic, precomputing relevant constants. +// +// Moduli are assumed to be odd numbers. Moduli can also leak the exact +// number of bits needed to store their value, and are stored without padding. +// +// Their actual value is still kept secret. +type Modulus struct { + // The underlying natural number for this modulus. + // + // This will be stored without any padding, and shouldn't alias with any + // other natural number being used. + nat *Nat + leading int // number of leading zeros in the modulus + m0inv uint // -nat.limbs[0]⁻¹ mod _W + rr *Nat // R*R for montgomeryRepresentation +} + +// rr returns R*R with R = 2^(_W * n) and n = len(m.nat.limbs). +func rr(m *Modulus) *Nat { + rr := NewNat().ExpandFor(m) + // R*R is 2^(2 * _W * n). We can safely get 2^(_W * (n - 1)) by setting the + // most significant limb to 1. We then get to R*R by shifting left by _W + // n + 1 times. + n := len(rr.limbs) + rr.limbs[n-1] = 1 + for i := n - 1; i < 2*n; i++ { + rr.shiftIn(0, m) // x = x * 2^_W mod m + } + return rr +} + +// minusInverseModW computes -x⁻¹ mod _W with x odd. +// +// This operation is used to precompute a constant involved in Montgomery +// multiplication. +func minusInverseModW(x uint) uint { + // Every iteration of this loop doubles the least-significant bits of + // correct inverse in y. The first three bits are already correct (1⁻¹ = 1, + // 3⁻¹ = 3, 5⁻¹ = 5, and 7⁻¹ = 7 mod 8), so doubling five times is enough + // for 61 bits (and wastes only one iteration for 31 bits). + // + // See https://crypto.stackexchange.com/a/47496. + y := x + for i := 0; i < 5; i++ { + y = y * (2 - x*y) + } + return (1 << _W) - (y & _MASK) +} + +// NewModulusFromBig creates a new Modulus from a [big.Int]. +// +// The Int must be odd. The number of significant bits must be leakable. +func NewModulusFromBig(n *big.Int) *Modulus { + m := &Modulus{} + m.nat = NewNat().setBig(n) + m.leading = _W - bitLen(m.nat.limbs[len(m.nat.limbs)-1]) + m.m0inv = minusInverseModW(m.nat.limbs[0]) + m.rr = rr(m) + return m +} + +// bitLen is a version of bits.Len that only leaks the bit length of n, but not +// its value. bits.Len and bits.LeadingZeros use a lookup table for the +// low-order bits on some architectures. +func bitLen(n uint) int { + var len int + // We assume, here and elsewhere, that comparison to zero is constant time + // with respect to different non-zero values. + for n != 0 { + len++ + n >>= 1 + } + return len +} + +// Size returns the size of m in bytes. +func (m *Modulus) Size() int { + return (m.BitLen() + 7) / 8 +} + +// BitLen returns the size of m in bits. +func (m *Modulus) BitLen() int { + return len(m.nat.limbs)*_W - int(m.leading) +} + +// Nat returns m as a Nat. The return value must not be written to. +func (m *Modulus) Nat() *Nat { + return m.nat +} + +// shiftIn calculates x = x << _W + y mod m. +// +// This assumes that x is already reduced mod m, and that y < 2^_W. +func (x *Nat) shiftIn(y uint, m *Modulus) *Nat { + d := NewNat().resetFor(m) + + // Eliminate bounds checks in the loop. + size := len(m.nat.limbs) + xLimbs := x.limbs[:size] + dLimbs := d.limbs[:size] + mLimbs := m.nat.limbs[:size] + + // Each iteration of this loop computes x = 2x + b mod m, where b is a bit + // from y. Effectively, it left-shifts x and adds y one bit at a time, + // reducing it every time. + // + // To do the reduction, each iteration computes both 2x + b and 2x + b - m. + // The next iteration (and finally the return line) will use either result + // based on whether the subtraction underflowed. + needSubtraction := no + for i := _W - 1; i >= 0; i-- { + carry := (y >> i) & 1 + var borrow uint + for i := 0; i < size; i++ { + l := ctSelect(needSubtraction, dLimbs[i], xLimbs[i]) + + res := l<<1 + carry + xLimbs[i] = res & _MASK + carry = res >> _W + + res = xLimbs[i] - mLimbs[i] - borrow + dLimbs[i] = res & _MASK + borrow = res >> _W + } + // See Add for how carry (aka overflow), borrow (aka underflow), and + // needSubtraction relate. + needSubtraction = ctEq(carry, borrow) + } + return x.assign(needSubtraction, d) +} + +// Mod calculates out = y mod m. +// +// This works regardless how large the value of y is. +// +// The output will be resized to the size of m and overwritten. +func (x *Nat) Mod(y *Nat, m *Modulus) *Nat { + out, x := x, y + out.resetFor(m) + // Working our way from the most significant to the least significant limb, + // we can insert each limb at the least significant position, shifting all + // previous limbs left by _W. This way each limb will get shifted by the + // correct number of bits. We can insert at least N - 1 limbs without + // overflowing m. After that, we need to reduce every time we shift. + i := len(x.limbs) - 1 + // For the first N - 1 limbs we can skip the actual shifting and position + // them at the shifted position, which starts at min(N - 2, i). + start := len(m.nat.limbs) - 2 + if i < start { + start = i + } + for j := start; j >= 0; j-- { + out.limbs[j] = x.limbs[i] + i-- + } + // We shift in the remaining limbs, reducing modulo m each time. + for i >= 0 { + out.shiftIn(x.limbs[i], m) + i-- + } + return out +} + +// ExpandFor ensures x has the right size to work with operations modulo m. +// +// The announced size of x must be smaller than or equal to that of m. +func (x *Nat) ExpandFor(m *Modulus) *Nat { + return x.expand(len(m.nat.limbs)) +} + +// resetFor ensures x has the right size to work with operations modulo m. +// +// x is zeroed and may start at any size. +func (x *Nat) resetFor(m *Modulus) *Nat { + return x.reset(len(m.nat.limbs)) +} + +// Sub computes x = x - y mod m. +// +// The length of both operands must be the same as the modulus. Both operands +// must already be reduced modulo m. +func (x *Nat) Sub(y *Nat, m *Modulus) *Nat { + underflow := x.sub(yes, y) + // If the subtraction underflowed, add m. + x.add(choice(underflow), m.nat) + return x +} + +// Add computes x = x + y mod m. +// +// The length of both operands must be the same as the modulus. Both operands +// must already be reduced modulo m. +func (x *Nat) Add(y *Nat, m *Modulus) *Nat { + overflow := x.add(yes, y) + underflow := not(x.cmpGeq(m.nat)) // x < m + + // Three cases are possible: + // + // - overflow = 0, underflow = 0 + // + // In this case, addition fits in our limbs, but we can still subtract away + // m without an underflow, so we need to perform the subtraction to reduce + // our result. + // + // - overflow = 0, underflow = 1 + // + // The addition fits in our limbs, but we can't subtract m without + // underflowing. The result is already reduced. + // + // - overflow = 1, underflow = 1 + // + // The addition does not fit in our limbs, and the subtraction's borrow + // would cancel out with the addition's carry. We need to subtract m to + // reduce our result. + // + // The overflow = 1, underflow = 0 case is not possible, because y is at + // most m - 1, and if adding m - 1 overflows, then subtracting m must + // necessarily underflow. + needSubtraction := ctEq(overflow, uint(underflow)) + + x.sub(needSubtraction, m.nat) + return x +} + +// montgomeryRepresentation calculates x = x * R mod m, with R = 2^(_W * n) and +// n = len(m.nat.limbs). +// +// Faster Montgomery multiplication replaces standard modular multiplication for +// numbers in this representation. +// +// This assumes that x is already reduced mod m. +func (x *Nat) montgomeryRepresentation(m *Modulus) *Nat { + // A Montgomery multiplication (which computes a * b / R) by R * R works out + // to a multiplication by R, which takes the value out of the Montgomery domain. + return x.montgomeryMul(NewNat().set(x), m.rr, m) +} + +// montgomeryReduction calculates x = x / R mod m, with R = 2^(_W * n) and +// n = len(m.nat.limbs). +// +// This assumes that x is already reduced mod m. +func (x *Nat) montgomeryReduction(m *Modulus) *Nat { + // By Montgomery multiplying with 1 not in Montgomery representation, we + // convert out back from Montgomery representation, because it works out to + // dividing by R. + t0 := NewNat().set(x) + t1 := NewNat().ExpandFor(m) + t1.limbs[0] = 1 + return x.montgomeryMul(t0, t1, m) +} + +// montgomeryMul calculates d = a * b / R mod m, with R = 2^(_W * n) and +// n = len(m.nat.limbs), using the Montgomery Multiplication technique. +// +// All inputs should be the same length, not aliasing d, and already +// reduced modulo m. d will be resized to the size of m and overwritten. +func (d *Nat) montgomeryMul(a *Nat, b *Nat, m *Modulus) *Nat { + d.resetFor(m) + if len(a.limbs) != len(m.nat.limbs) || len(b.limbs) != len(m.nat.limbs) { + panic("bigmod: invalid montgomeryMul input") + } + + // See https://bearssl.org/bigint.html#montgomery-reduction-and-multiplication + // for a description of the algorithm implemented mostly in montgomeryLoop. + // See Add for how overflow, underflow, and needSubtraction relate. + overflow := montgomeryLoop(d.limbs, a.limbs, b.limbs, m.nat.limbs, m.m0inv) + underflow := not(d.cmpGeq(m.nat)) // d < m + needSubtraction := ctEq(overflow, uint(underflow)) + d.sub(needSubtraction, m.nat) + + return d +} + +func montgomeryLoopGeneric(d, a, b, m []uint, m0inv uint) (overflow uint) { + // Eliminate bounds checks in the loop. + size := len(d) + a = a[:size] + b = b[:size] + m = m[:size] + + for _, ai := range a { + // This is an unrolled iteration of the loop below with j = 0. + hi, lo := bits.Mul(ai, b[0]) + z_lo, c := bits.Add(d[0], lo, 0) + f := (z_lo * m0inv) & _MASK // (d[0] + a[i] * b[0]) * m0inv + z_hi, _ := bits.Add(0, hi, c) + hi, lo = bits.Mul(f, m[0]) + z_lo, c = bits.Add(z_lo, lo, 0) + z_hi, _ = bits.Add(z_hi, hi, c) + carry := z_hi<<1 | z_lo>>_W + + for j := 1; j < size; j++ { + // z = d[j] + a[i] * b[j] + f * m[j] + carry <= 2^(2W+1) - 2^(W+1) + 2^W + hi, lo := bits.Mul(ai, b[j]) + z_lo, c := bits.Add(d[j], lo, 0) + z_hi, _ := bits.Add(0, hi, c) + hi, lo = bits.Mul(f, m[j]) + z_lo, c = bits.Add(z_lo, lo, 0) + z_hi, _ = bits.Add(z_hi, hi, c) + z_lo, c = bits.Add(z_lo, carry, 0) + z_hi, _ = bits.Add(z_hi, 0, c) + d[j-1] = z_lo & _MASK + carry = z_hi<<1 | z_lo>>_W // carry <= 2^(W+1) - 2 + } + + z := overflow + carry // z <= 2^(W+1) - 1 + d[size-1] = z & _MASK + overflow = z >> _W // overflow <= 1 + } + return +} + +// Mul calculates x *= y mod m. +// +// x and y must already be reduced modulo m, they must share its announced +// length, and they may not alias. +func (x *Nat) Mul(y *Nat, m *Modulus) *Nat { + // A Montgomery multiplication by a value out of the Montgomery domain + // takes the result out of Montgomery representation. + xR := NewNat().set(x).montgomeryRepresentation(m) // xR = x * R mod m + return x.montgomeryMul(xR, y, m) // x = xR * y / R mod m +} + +// Exp calculates x = y^e mod m. +// +// The exponent e is represented in big-endian order. The output will be resized +// to the size of m and overwritten. y must already be reduced modulo m. +func (x *Nat) Exp(y *Nat, e []byte, m *Modulus) *Nat { + out, x := x, y + // We use a 4 bit window. For our RSA workload, 4 bit windows are faster + // than 2 bit windows, but use an extra 12 nats worth of scratch space. + // Using bit sizes that don't divide 8 are more complex to implement. + + table := [(1 << 4) - 1]*Nat{ // table[i] = x ^ (i+1) + // newNat calls are unrolled so they are allocated on the stack. + NewNat(), NewNat(), NewNat(), NewNat(), NewNat(), + NewNat(), NewNat(), NewNat(), NewNat(), NewNat(), + NewNat(), NewNat(), NewNat(), NewNat(), NewNat(), + } + table[0].set(x).montgomeryRepresentation(m) + for i := 1; i < len(table); i++ { + table[i].montgomeryMul(table[i-1], table[0], m) + } + + out.resetFor(m) + out.limbs[0] = 1 + out.montgomeryRepresentation(m) + t0 := NewNat().ExpandFor(m) + t1 := NewNat().ExpandFor(m) + for _, b := range e { + for _, j := range []int{4, 0} { + // Square four times. + t1.montgomeryMul(out, out, m) + out.montgomeryMul(t1, t1, m) + t1.montgomeryMul(out, out, m) + out.montgomeryMul(t1, t1, m) + + // Select x^k in constant time from the table. + k := uint((b >> j) & 0b1111) + for i := range table { + t0.assign(ctEq(k, uint(i+1)), table[i]) + } + + // Multiply by x^k, discarding the result if k = 0. + t1.montgomeryMul(out, t0, m) + out.assign(not(ctEq(k, 0)), t1) + } + } + + return out.montgomeryReduction(m) +} diff --git a/vendor/filippo.io/bigmod/nat_amd64.go b/vendor/filippo.io/bigmod/nat_amd64.go new file mode 100644 index 000000000..e94778245 --- /dev/null +++ b/vendor/filippo.io/bigmod/nat_amd64.go @@ -0,0 +1,8 @@ +// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -stubs ../nat_amd64.go -pkg bigmod. DO NOT EDIT. + +//go:build amd64 && gc && !purego + +package bigmod + +//go:noescape +func montgomeryLoop(d []uint, a []uint, b []uint, m []uint, m0inv uint) uint diff --git a/vendor/filippo.io/bigmod/nat_amd64.s b/vendor/filippo.io/bigmod/nat_amd64.s new file mode 100644 index 000000000..12b762998 --- /dev/null +++ b/vendor/filippo.io/bigmod/nat_amd64.s @@ -0,0 +1,68 @@ +// Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -stubs ../nat_amd64.go -pkg bigmod. DO NOT EDIT. + +//go:build amd64 && gc && !purego + +// func montgomeryLoop(d []uint, a []uint, b []uint, m []uint, m0inv uint) uint +TEXT ·montgomeryLoop(SB), $8-112 + MOVQ d_len+8(FP), CX + MOVQ d_base+0(FP), BX + MOVQ b_base+48(FP), SI + MOVQ m_base+72(FP), DI + MOVQ m0inv+96(FP), R8 + XORQ R9, R9 + XORQ R10, R10 + +outerLoop: + MOVQ a_base+24(FP), R11 + MOVQ (R11)(R10*8), R11 + MOVQ (SI), AX + MULQ R11 + MOVQ AX, R13 + MOVQ DX, R12 + ADDQ (BX), R13 + ADCQ $0x00, R12 + MOVQ R8, R14 + IMULQ R13, R14 + BTRQ $0x3f, R14 + MOVQ (DI), AX + MULQ R14 + ADDQ AX, R13 + ADCQ DX, R12 + SHRQ $0x3f, R12, R13 + XORQ R12, R12 + INCQ R12 + JMP innerLoopCondition + +innerLoop: + MOVQ (SI)(R12*8), AX + MULQ R11 + MOVQ AX, BP + MOVQ DX, R15 + MOVQ (DI)(R12*8), AX + MULQ R14 + ADDQ AX, BP + ADCQ DX, R15 + ADDQ (BX)(R12*8), BP + ADCQ $0x00, R15 + ADDQ R13, BP + ADCQ $0x00, R15 + MOVQ BP, AX + BTRQ $0x3f, AX + MOVQ AX, -8(BX)(R12*8) + SHRQ $0x3f, R15, BP + MOVQ BP, R13 + INCQ R12 + +innerLoopCondition: + CMPQ CX, R12 + JGT innerLoop + ADDQ R13, R9 + MOVQ R9, AX + BTRQ $0x3f, AX + MOVQ AX, -8(BX)(CX*8) + SHRQ $0x3f, R9 + INCQ R10 + CMPQ CX, R10 + JGT outerLoop + MOVQ R9, ret+104(FP) + RET diff --git a/vendor/filippo.io/bigmod/nat_noasm.go b/vendor/filippo.io/bigmod/nat_noasm.go new file mode 100644 index 000000000..870b44519 --- /dev/null +++ b/vendor/filippo.io/bigmod/nat_noasm.go @@ -0,0 +1,11 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !amd64 || !gc || purego + +package bigmod + +func montgomeryLoop(d, a, b, m []uint, m0inv uint) uint { + return montgomeryLoopGeneric(d, a, b, m, m0inv) +} diff --git a/vendor/filippo.io/keygen/LICENSE b/vendor/filippo.io/keygen/LICENSE new file mode 100644 index 000000000..1fbb2dfe3 --- /dev/null +++ b/vendor/filippo.io/keygen/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright 2023 Filippo Valsorda + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/filippo.io/keygen/ecdsa.go b/vendor/filippo.io/keygen/ecdsa.go new file mode 100644 index 000000000..92294fb10 --- /dev/null +++ b/vendor/filippo.io/keygen/ecdsa.go @@ -0,0 +1,99 @@ +package keygen + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/sha512" + "fmt" + "io" + "math/big" + + "filippo.io/bigmod" + "golang.org/x/crypto/hkdf" +) + +// ECDSA generates an ECDSA key deterministically from a random secret using a +// procedure equivalent to that in FIPS 186-5, Appendix A.2.2. +// +// The secret should be uniform, must be at least 128 bits long (ideally, 256 +// bits long), and should not be reused for other purposes. +// +// The output MAY CHANGE until this package reaches v1.0.0. +func ECDSA(c elliptic.Curve, secret []byte) (*ecdsa.PrivateKey, error) { + if len(secret) < 16 { + return nil, fmt.Errorf("input secret must be at least 128 bits") + } + + var salt string + switch c { + case elliptic.P256(): + salt = "ECDSA key generation: NIST P-256" + case elliptic.P384(): + salt = "ECDSA key generation: NIST P-384" + case elliptic.P521(): + salt = "ECDSA key generation: NIST P-521" + default: + return nil, fmt.Errorf("unsupported curve %s", c.Params().Name) + } + + prk := hkdf.Extract(sha512.New, secret, []byte(salt)) + r := hkdf.Expand(sha512.New, prk, nil) + + N := bigmod.NewModulusFromBig(c.Params().N) + + b := make([]byte, N.Size()) + if _, err := io.ReadFull(r, b); err != nil { + return nil, fmt.Errorf("HKDF error %v", err) + } + + // Since P-521's order bitsize is not a multiple of 8, mask off the excess + // bits to increase the chance of hitting a value in (0, N). + if c == elliptic.P521() { + b[0] &= 0b0000_0001 + } + + // FIPS 186-4 checks k <= N - 2 and then adds one. Checking 0 < k <= N - 1 + // is strictly equivalent but is more API-friendly, since SetBytes already + // checks for overflows and doesn't require an addition. + // (None of this matters anyway because the chance of selecting zero is + // cryptographically negligible.) + k := bigmod.NewNat() + if _, err := k.SetBytes(b, N); err != nil || k.IsZero() == 1 { + return ECDSA(c, prk) + } + + priv := new(ecdsa.PrivateKey) + priv.PublicKey.Curve = c + priv.D = new(big.Int).SetBytes(k.Bytes(N)) + priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes(N)) + return priv, nil +} + +// ECDSALegacy generates an ECDSA key deterministically from a random stream +// using the procedure given in FIPS 186-5, Appendix A.2.1, in a way compatible +// with Go 1.19. +// +// Note that ECDSALegacy may leak bits of the key through timing side-channels. +func ECDSALegacy(c elliptic.Curve, rand io.Reader) (*ecdsa.PrivateKey, error) { + params := c.Params() + // Note that for P-521 this will actually be 63 bits more than the order, as + // division rounds down, but the extra bit is inconsequential and we want to + // retain compatibility with Go 1.19 as was implemented. + b := make([]byte, params.N.BitLen()/8+8) + _, err := io.ReadFull(rand, b) + if err != nil { + return nil, err + } + + one := big.NewInt(1) + k := new(big.Int).SetBytes(b) + n := new(big.Int).Sub(params.N, one) + k.Mod(k, n) + k.Add(k, one) + + priv := new(ecdsa.PrivateKey) + priv.PublicKey.Curve = c + priv.D = k + priv.PublicKey.X, priv.PublicKey.Y = c.ScalarBaseMult(k.Bytes()) + return priv, nil +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go index 31753f4c4..8112205b0 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/listener.go @@ -256,10 +256,5 @@ func (l *Listener) getCertificateFromClientHello(clientHello *dtls.ClientHelloIn } func randomCertificate() (*tls.Certificate, error) { - seedBytes := []byte{} - _, err := rand.Read(seedBytes) - if err != nil { - return nil, err - } - return newCertificate(seedBytes) + return newCertificate(rand.Reader) } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go b/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go index 4caee99e8..0b995c75e 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/dtls/seedtocert.go @@ -16,12 +16,13 @@ import ( "math/big" "time" + "filippo.io/keygen" "github.com/pion/dtls/v2/pkg/protocol/handshake" "golang.org/x/crypto/hkdf" ) func clientHelloRandomFromSeed(seed []byte) ([handshake.RandomBytesLength]byte, error) { - randSource := hkdf.New(sha256.New, seed, nil, nil) + randSource := hkdf.New(sha256.New, seed, []byte("clientHelloRandomFromSeed"), nil) randomBytes := [handshake.RandomBytesLength]byte{} _, err := io.ReadFull(randSource, randomBytes[:]) @@ -33,19 +34,17 @@ func clientHelloRandomFromSeed(seed []byte) ([handshake.RandomBytesLength]byte, } // getPrivkey creates ECDSA private key used in DTLS Certificates -func getPrivkey(seed []byte) (*ecdsa.PrivateKey, error) { - randSource := hkdf.New(sha256.New, seed, nil, nil) - - privkey, err := ecdsa.GenerateKey(elliptic.P256(), &Not1Reader{r: randSource}) +func getPrivkey(randSource io.Reader) (*ecdsa.PrivateKey, error) { + privkey, err := keygen.ECDSALegacy(elliptic.P256(), randSource) if err != nil { return &ecdsa.PrivateKey{}, err } + return privkey, nil } // getX509Tpl creates x509 template for x509 Certificates generation used in DTLS Certificates. -func getX509Tpl(seed []byte) (*x509.Certificate, error) { - randSource := hkdf.New(sha256.New, seed, nil, nil) +func getX509Tpl(randSource io.Reader) (*x509.Certificate, error) { maxBigInt := new(big.Int) maxBigInt.Exp(big.NewInt(2), big.NewInt(130), nil).Sub(maxBigInt, big.NewInt(1)) @@ -85,20 +84,19 @@ func getX509Tpl(seed []byte) (*x509.Certificate, error) { }, nil } -func newCertificate(seed []byte) (*tls.Certificate, error) { - privkey, err := getPrivkey(seed) +func newCertificate(randSource io.Reader) (*tls.Certificate, error) { + + privkey, err := getPrivkey(randSource) if err != nil { return &tls.Certificate{}, err } - tpl, err := getX509Tpl(seed) + tpl, err := getX509Tpl(randSource) if err != nil { return &tls.Certificate{}, err } - randSource := hkdf.New(sha256.New, seed, nil, nil) - - certDER, err := x509.CreateCertificate(randSource, tpl, tpl, privkey.Public(), privkey) + certDER, err := x509.CreateCertificate(rand.Reader, tpl, tpl, privkey.Public(), privkey) if err != nil { return &tls.Certificate{}, err } @@ -110,15 +108,17 @@ func newCertificate(seed []byte) (*tls.Certificate, error) { } func certsFromSeed(seed []byte) (*tls.Certificate, *tls.Certificate, error) { - clientCert, err := newCertificate(seed) + randSource := hkdf.New(sha256.New, seed, []byte("certsFromSeed"), nil) + + clientCert, err := newCertificate(randSource) if err != nil { return &tls.Certificate{}, &tls.Certificate{}, fmt.Errorf("error generate cert: %v", err) } - // serverCert, err := newCertificate(seed) - // if err != nil { - // return &tls.Certificate{}, &tls.Certificate{}, fmt.Errorf("error generate cert: %v", err) - // } + serverCert, err := newCertificate(randSource) + if err != nil { + return &tls.Certificate{}, &tls.Certificate{}, fmt.Errorf("error generate cert: %v", err) + } - return clientCert, clientCert, nil + return clientCert, serverCert, nil } diff --git a/vendor/modules.txt b/vendor/modules.txt index 6ad36bb48..d488a0562 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,3 +1,9 @@ +# filippo.io/bigmod v0.0.1 +## explicit; go 1.20 +filippo.io/bigmod +# filippo.io/keygen v0.0.0-20230306160926-5201437acf8e +## explicit; go 1.20 +filippo.io/keygen # github.com/AndreasBriese/bbloom v0.0.0-20170702084017-28f7e881ca57 ## explicit github.com/AndreasBriese/bbloom @@ -254,7 +260,7 @@ github.com/pmezard/go-difflib/difflib # github.com/quic-go/qpack v0.4.0 ## explicit; go 1.18 github.com/quic-go/qpack -# github.com/refraction-networking/conjure v0.7.8 +# github.com/refraction-networking/conjure v0.7.9 ## explicit; go 1.18 github.com/refraction-networking/conjure/pkg/client/assets github.com/refraction-networking/conjure/pkg/core From 49bc95e976f9c06c1bc02d0170fab6db922640d4 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 14:18:42 -0500 Subject: [PATCH 17/29] Vendor patch: workaround Windows build issue in refraction-networking/conjure --- .../conjure/pkg/transports/connecting/dtls/nat.go | 5 ++--- .../transports/connecting/dtls/setsockopt_other.go | 12 ++++++++++++ .../transports/connecting/dtls/setsockopt_windows.go | 12 ++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_other.go create mode 100644 vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_windows.go diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go index 8860316b2..ab3716b9e 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/nat.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "os" - "syscall" "time" "github.com/pion/stun" @@ -58,7 +57,7 @@ func openUDPLimitTTL(ctx context.Context, laddr, addr string, dialer dialFunc) e defer fd.Close() // Set the TTL - err = syscall.SetsockoptInt(int(fd.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, ttl) + err = setSocketTTL(fd, ttl) if err != nil { return err } @@ -70,7 +69,7 @@ func openUDPLimitTTL(ctx context.Context, laddr, addr string, dialer dialFunc) e } // reset TTL - err = syscall.SetsockoptInt(int(fd.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, defaultTTL) + err = setSocketTTL(fd, defaultTTL) if err != nil { return err } diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_other.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_other.go new file mode 100644 index 000000000..eeba1ed63 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_other.go @@ -0,0 +1,12 @@ +//go:build !windows + +package dtls + +import ( + "os" + "syscall" +) + +func setSocketTTL(f *os.File, ttl int) error { + return syscall.SetsockoptInt(int(f.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, ttl) +} diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_windows.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_windows.go new file mode 100644 index 000000000..6ab835ea5 --- /dev/null +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/setsockopt_windows.go @@ -0,0 +1,12 @@ +//go:build windows + +package dtls + +import ( + "os" + "syscall" +) + +func setSocketTTL(f *os.File, ttl int) error { + return syscall.SetsockoptInt(syscall.Handle(f.Fd()), syscall.IPPROTO_IP, syscall.IP_TTL, ttl) +} From 161080bb7a2a2b9b5a86dc7669f1b1ddb54c7372 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 14:22:50 -0500 Subject: [PATCH 18/29] Fix: add missing TestGetDefaultParameters case --- psiphon/common/parameters/parameters_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/psiphon/common/parameters/parameters_test.go b/psiphon/common/parameters/parameters_test.go index 707db094a..0bbaae5e8 100755 --- a/psiphon/common/parameters/parameters_test.go +++ b/psiphon/common/parameters/parameters_test.go @@ -184,6 +184,11 @@ func TestGetDefaultParameters(t *testing.T) { t.Fatalf("LabeledTunnelProtocols returned %+v expected %+v", g, protocols) } } + case protocol.ConjureTransports: + g := p.Get().ConjureTransports(name) + if !reflect.DeepEqual(v, g) { + t.Fatalf("ConjureTransports returned %+v expected %+v", g, v) + } default: t.Fatalf("Unhandled default type: %s (%T)", name, defaults.value) } From f5a9f5c3a2e5f022f699f64617efdac130c761e0 Mon Sep 17 00:00:00 2001 From: Amir Khan Date: Tue, 7 Nov 2023 14:26:27 -0500 Subject: [PATCH 19/29] Fix TLS fragmentor test --- psiphon/tlsDialer_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/psiphon/tlsDialer_test.go b/psiphon/tlsDialer_test.go index 0fb772594..8d98accc3 100644 --- a/psiphon/tlsDialer_test.go +++ b/psiphon/tlsDialer_test.go @@ -799,6 +799,7 @@ func TestTLSFragmentorWithoutSNI(t *testing.T) { VerifyServerName: serverName, VerifyPins: []string{serverCertificatePin}, TrustedCACertificatesFilename: rootCAsFileName, + FragmentClientHello: true, }) if err == nil { @@ -817,6 +818,7 @@ func TestTLSFragmentorWithoutSNI(t *testing.T) { VerifyServerName: serverName, VerifyPins: []string{serverCertificatePin}, TrustedCACertificatesFilename: rootCAsFileName, + FragmentClientHello: true, }) if err != nil { From af57a6bafc761f015f08fecbdeb27f7439852f24 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 7 Nov 2023 14:40:15 -0500 Subject: [PATCH 20/29] Fix: reference DisabledTunnelProtocols in TestTunnelProtocolValidation --- psiphon/common/protocol/protocol_test.go | 38 ++++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/psiphon/common/protocol/protocol_test.go b/psiphon/common/protocol/protocol_test.go index f1d29b911..8b1ca4230 100644 --- a/psiphon/common/protocol/protocol_test.go +++ b/psiphon/common/protocol/protocol_test.go @@ -23,17 +23,43 @@ import ( "fmt" "reflect" "testing" + + "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common" ) func TestTunnelProtocolValidation(t *testing.T) { - err := SupportedTunnelProtocols.Validate() - if err != nil { - t.Errorf("unexpected Validate error: %s", err) + validSupportedProtocols := make(TunnelProtocols, 0) + for _, p := range SupportedTunnelProtocols { + if common.Contains(DisabledTunnelProtocols, p) { + continue + } + validSupportedProtocols = append(validSupportedProtocols, p) + } + + if len(validSupportedProtocols) == len(SupportedTunnelProtocols) { + + err := SupportedTunnelProtocols.Validate() + if err != nil { + t.Errorf("unexpected Validate error: %s", err) + } + + } else { + + err := SupportedTunnelProtocols.Validate() + if err == nil { + t.Errorf("unexpected Validate success") + } + + err = validSupportedProtocols.Validate() + if err != nil { + t.Errorf("unexpected Validate error: %s", err) + } + } invalidProtocols := TunnelProtocols{"OSSH", "INVALID-PROTOCOL"} - err = invalidProtocols.Validate() + err := invalidProtocols.Validate() if err == nil { t.Errorf("unexpected Validate success") } @@ -47,8 +73,8 @@ func TestTunnelProtocolValidation(t *testing.T) { prunedProtocols := pruneProtocols.PruneInvalid() - if !reflect.DeepEqual(prunedProtocols, SupportedTunnelProtocols) { - t.Errorf("unexpected %+v != %+v", prunedProtocols, SupportedTunnelProtocols) + if !reflect.DeepEqual(prunedProtocols, validSupportedProtocols) { + t.Errorf("unexpected %+v != %+v", prunedProtocols, validSupportedProtocols) } } From ff56c84ed481b4fc90dae82d5cb2c0f349058b3c Mon Sep 17 00:00:00 2001 From: mirokuratczyk Date: Tue, 7 Nov 2023 11:23:40 -0500 Subject: [PATCH 21/29] Do not verify chain when DisableSystemRootCAs set --- psiphon/dialParameters.go | 3 +- psiphon/meekConn.go | 20 ++++++------ psiphon/net.go | 6 ++-- psiphon/tlsDialer.go | 66 +++++++++++++++++++-------------------- psiphon/tlsDialer_test.go | 45 +++++++++++++++++++++++--- 5 files changed, 88 insertions(+), 52 deletions(-) diff --git a/psiphon/dialParameters.go b/psiphon/dialParameters.go index 82c961d79..63af15200 100644 --- a/psiphon/dialParameters.go +++ b/psiphon/dialParameters.go @@ -583,8 +583,7 @@ func MakeDialParameters( return nil, errors.Trace(err) } - if config.DisableSystemRootCAs && - (len(dialParams.MeekVerifyPins) == 0 || dialParams.MeekVerifyServerName == "") { + if config.DisableSystemRootCAs { return nil, errors.TraceNew("TLS certificates must be verified in Conjure API registration") } diff --git a/psiphon/meekConn.go b/psiphon/meekConn.go index b8cc81732..dfd869dd4 100644 --- a/psiphon/meekConn.go +++ b/psiphon/meekConn.go @@ -181,12 +181,12 @@ type MeekConfig struct { // DisableSystemRootCAs, when true, disables loading system root CAs when // verifying the server certificate chain. Set DisableSystemRootCAs only in - // cases where system root CAs cannot be loaded; for example, if - // unsupported (iOS < 12) or insufficient memory (VPN extension on iOS < - // 15). + // cases where system root CAs cannot be loaded and there is additional + // security at the payload level; for example, if unsupported (iOS < 12) or + // insufficient memory (VPN extension on iOS < 15). // - // When DisableSystemRootCAs and VerifyServerName are set, VerifyPins must - // be set. + // When DisableSystemRootCAs is set, both VerifyServerName and VerifyPins + // must not be set. DisableSystemRootCAs bool // ClientTunnelProtocol is the protocol the client is using. It's included in @@ -305,16 +305,16 @@ func DialMeek( "invalid config: VerifyServerName must be set when VerifyPins is set") } - if meekConfig.DisableSystemRootCAs && !skipVerify && - (len(meekConfig.VerifyServerName) == 0 || len(meekConfig.VerifyPins) == 0) { + if meekConfig.DisableSystemRootCAs && + (len(meekConfig.VerifyServerName) > 0 || len(meekConfig.VerifyPins) > 0) { return nil, errors.TraceNew( - "invalid config: VerifyServerName and VerifyPins must be set when DisableSystemRootCAs is set") + "invalid config: VerifyServerName and VerifyPins must not be set when DisableSystemRootCAs is set") } if meekConfig.Mode == MeekModePlaintextRoundTrip && - (!meekConfig.UseHTTPS || skipVerify) { + (!meekConfig.UseHTTPS || (skipVerify && !meekConfig.DisableSystemRootCAs)) { return nil, errors.TraceNew( - "invalid config: MeekModePlaintextRoundTrip requires UseHTTPS and VerifyServerName") + "invalid config: MeekModePlaintextRoundTrip requires UseHTTPS and VerifyServerName when system root CAs can be loaded") } runCtx, stopRunning := context.WithCancel(context.Background()) diff --git a/psiphon/net.go b/psiphon/net.go index 10e75bd60..504a1de19 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -517,9 +517,11 @@ func makeFrontedHTTPClient( } if !skipVerify { - meekConfig.VerifyServerName = meekVerifyServerName - meekConfig.VerifyPins = meekVerifyPins meekConfig.DisableSystemRootCAs = disableSystemRootCAs + if !meekConfig.DisableSystemRootCAs { + meekConfig.VerifyServerName = meekVerifyServerName + meekConfig.VerifyPins = meekVerifyPins + } } var resolvedIPAddress atomic.Value diff --git a/psiphon/tlsDialer.go b/psiphon/tlsDialer.go index aed2cd77f..b8c1e2a7f 100644 --- a/psiphon/tlsDialer.go +++ b/psiphon/tlsDialer.go @@ -104,12 +104,12 @@ type CustomTLSConfig struct { // DisableSystemRootCAs, when true, disables loading system root CAs when // verifying the server certificate chain. Set DisableSystemRootCAs only in - // cases where system root CAs cannot be loaded; for example, if - // unsupported (iOS < 12) or insufficient memory (VPN extension on iOS < - // 15). + // cases where system root CAs cannot be loaded and there is additional + // security at the payload level; for example, if unsupported (iOS < 12) or + // insufficient memory (VPN extension on iOS < 15). // - // When DisableSystemRootCAs is set, both VerifyServerName and VerifyPins - // must be set. + // When DisableSystemRootCAs is set, VerifyServerName, VerifyPins, and + // VerifyLegacyCertificate must not be set. DisableSystemRootCAs bool // VerifyServerName specifies a domain name that must appear in the server @@ -212,20 +212,33 @@ func CustomTLSDial( network, addr string, config *CustomTLSConfig) (net.Conn, error) { - if (config.SkipVerify && + // Note that servers may return a chain which excludes the root CA + // cert https://datatracker.ietf.org/doc/html/rfc8446#section-4.4.2. + // It will not be possible to verify the certificate chain when + // system root CAs cannot be loaded and the server omits the root CA + // certificate from the chain. + // + // TODO: attempt to do some amount of certificate verification when + // config.DisableSystemRootCAs is set. It would be possible to + // verify the certificate chain, server name, and pins, when + // config.TrustedCACertificatesFilename is set and contains the root + // CA certificate of the certificate chain returned by the server. Also, + // verifying legacy certificates does not require system root CAs, but + // there is no code path which uses config.DisableSystemRootCAs in + // conjuction with config.VerifyLegacyCertificate. As it stands + // config.DisableSystemRootCAs is only used on iOS < 15 and + // config.VerifyLegacyCertificate is only used for Windows VPN mode. + skipVerify := config.SkipVerify || config.DisableSystemRootCAs + + if (skipVerify && (config.VerifyLegacyCertificate != nil || len(config.VerifyServerName) > 0 || len(config.VerifyPins) > 0)) || (config.VerifyLegacyCertificate != nil && - (config.SkipVerify || + (skipVerify || len(config.VerifyServerName) > 0 || - len(config.VerifyPins) > 0)) || - - (config.DisableSystemRootCAs && - (!config.SkipVerify && - (len(config.VerifyServerName) == 0 || - len(config.VerifyPins) == 0))) { + len(config.VerifyPins) > 0)) { return nil, errors.TraceNew("incompatible certification verification parameters") } @@ -253,7 +266,7 @@ func CustomTLSDial( } var tlsConfigRootCAs *x509.CertPool - if !config.SkipVerify && + if !skipVerify && config.VerifyLegacyCertificate == nil && config.TrustedCACertificatesFilename != "" { @@ -265,7 +278,7 @@ func CustomTLSDial( tlsConfigRootCAs.AppendCertsFromPEM(certData) } - // In some cases, config.SkipVerify is false, but + // In some cases, skipVerify is false, but // utls.Config.InsecureSkipVerify will be set to true to disable verification // in utls that will otherwise fail: when SNI is omitted, and when // VerifyServerName differs from SNI. In these cases, the certificate chain @@ -275,7 +288,7 @@ func CustomTLSDial( tlsConfigServerName := "" verifyServerName := hostname - if config.SkipVerify { + if skipVerify { tlsConfigInsecureSkipVerify = true } @@ -313,7 +326,7 @@ func CustomTLSDial( // verification; and abort the handshake at the same point, if custom // verification fails. var tlsConfigVerifyPeerCertificate func([][]byte, [][]*x509.Certificate) error - if !config.SkipVerify { + if !skipVerify { tlsConfigVerifyPeerCertificate = func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { if config.VerifyLegacyCertificate != nil { @@ -331,7 +344,7 @@ func CustomTLSDial( } var err error verifiedChains, err = verifyServerCertificate( - tlsConfigRootCAs, rawCerts, verifyServerName, config.DisableSystemRootCAs) + tlsConfigRootCAs, rawCerts, verifyServerName) if err != nil { return errors.Trace(err) } @@ -640,11 +653,8 @@ func verifyLegacyCertificate(rawCerts [][]byte, expectedCertificate *x509.Certif // verifyServerCertificate parses and verifies the provided chain. If // successful, it returns the verified chains that were built. -// -// WARNING: disableSystemRootCAs must only be set when the certificate -// chain has been, or will be, verified with verifyCertificatePins. func verifyServerCertificate( - rootCAs *x509.CertPool, rawCerts [][]byte, verifyServerName string, disableSystemRootCAs bool) ([][]*x509.Certificate, error) { + rootCAs *x509.CertPool, rawCerts [][]byte, verifyServerName string) ([][]*x509.Certificate, error) { // This duplicates the verification logic in utls (and standard crypto/tls). @@ -657,18 +667,6 @@ func verifyServerCertificate( certs[i] = cert } - // Ensure system root CAs are not loaded, which will cause verification to - // fail. Instead use the root certificate of the chain received from the - // server as a trusted root certificate, which allows the chain and server - // name to be verified while ignoring whether the root certificate is - // trusted by the system. - if rootCAs == nil && disableSystemRootCAs { - rootCAs = x509.NewCertPool() - if len(certs) > 0 { - rootCAs.AddCert(certs[len(certs)-1]) - } - } - opts := x509.VerifyOptions{ Roots: rootCAs, DNSName: verifyServerName, diff --git a/psiphon/tlsDialer_test.go b/psiphon/tlsDialer_test.go index 8d98accc3..2efd08363 100644 --- a/psiphon/tlsDialer_test.go +++ b/psiphon/tlsDialer_test.go @@ -210,9 +210,8 @@ func TestTLSCertificateVerification(t *testing.T) { conn.Close() } - // Test: with SNI changed, DisableSystemRootCAs set along with - // VerifyServerName and VerifyPins, and pinning the TLS dial - // succeeds. + // Test: with DisableSystemRootCAs set and without VerifyServerName or + // VerifyPins set, the TLS dial succeeds. conn, err = CustomTLSDial( context.Background(), "tcp", serverAddr, @@ -221,10 +220,45 @@ func TestTLSCertificateVerification(t *testing.T) { Dial: dialer, SNIServerName: "not-" + serverName, DisableSystemRootCAs: true, + }) + + if err != nil { + t.Errorf("CustomTLSDial failed: %v", err) + } else { + conn.Close() + } + + // Test: with DisableSystemRootCAs set along with VerifyServerName and + // VerifyPins, the TLS dial fails. + + conn, err = CustomTLSDial( + context.Background(), "tcp", serverAddr, + &CustomTLSConfig{ + Parameters: params, + Dial: dialer, + SNIServerName: serverName, + DisableSystemRootCAs: true, VerifyServerName: serverName, VerifyPins: []string{rootCACertificatePin}, }) + if err == nil { + conn.Close() + t.Errorf("unexpected success with DisableSystemRootCAs set along with VerifyServerName and VerifyPins") + } + + // Test: with DisableSystemRootCAs set, SNI changed, and without + // VerifyServerName or VerifyPins set, the TLS dial succeeds. + + conn, err = CustomTLSDial( + context.Background(), "tcp", serverAddr, + &CustomTLSConfig{ + Parameters: params, + Dial: dialer, + SNIServerName: "not-" + serverName, + DisableSystemRootCAs: true, + }) + if err != nil { t.Errorf("CustomTLSDial failed: %v", err) } else { @@ -357,8 +391,11 @@ func initTestCertificatesAndWebServer( // Run an HTTPS server with the server certificate. + // Do not include the Root CA certificate in the certificate chain returned + // by the server to the client in the TLS handshake by excluding it from + // the key pair, which matches the behavior observed in the wild. serverKeyPair, err := tls.X509KeyPair( - append(pemServerCertificate, pemRootCACertificate...), pemServerPrivateKey) + pemServerCertificate, pemServerPrivateKey) if err != nil { t.Fatalf("tls.X509KeyPair failed: %v", err) } From c0f2e6cf4a842c2d1b2d9b8adaa32c29d394622c Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Fri, 10 Nov 2023 15:06:26 -0500 Subject: [PATCH 22/29] Direct refraction-networking logs to stdout - On Android, ensures refraction-networking logs will emit to logcat and not be consumed by the Psiphon Android stderr capture. --- psiphon/common/refraction/refraction.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 4f1b731dd..450b36d1b 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -1065,6 +1065,8 @@ func initRefractionNetworking(emitLogs bool, dataDirectory string) error { if !emitLogs { refraction_networking_client.Logger().Out = ioutil.Discard + } else { + refraction_networking_client.Logger().Out = os.Stdout } assetsDir := filepath.Join(dataDirectory, "refraction-networking") From 28909de443e1d0840f0730bb74c0dc4230c1b7ad Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Fri, 10 Nov 2023 15:11:00 -0500 Subject: [PATCH 23/29] Use refraction-networking/conjure v0.7.10-0.20231110193225-e4749a9dedc9 - Concurrent DTLS client->server and server->client dial attempts --- go.mod | 2 +- go.sum | 4 ++ .../pkg/transports/connecting/dtls/client.go | 50 ++++++++++++------- vendor/modules.txt | 2 +- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index c19860f23..8f47ee501 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/oschwald/maxminddb-golang v1.12.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pion/sctp v1.8.8 - github.com/refraction-networking/conjure v0.7.9 + github.com/refraction-networking/conjure v0.7.10-0.20231110193225-e4749a9dedc9 github.com/refraction-networking/gotapdance v1.7.7 github.com/refraction-networking/utls v1.3.3 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 diff --git a/go.sum b/go.sum index 3d3be8956..0eb7f56e2 100644 --- a/go.sum +++ b/go.sum @@ -178,6 +178,10 @@ github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/refraction-networking/conjure v0.7.9 h1:ABEtW1treui43vP0LlCslfw274bIyFaoxDB59BzUrl4= github.com/refraction-networking/conjure v0.7.9/go.mod h1:O5u/Mpg5b3whLF8L701pTMQW23SviS+rDKdWbY/BM0Q= +github.com/refraction-networking/conjure v0.7.10-0.20231110185258-440efbc194c2 h1:XAEn6rgTrzZrHYSWWvWVNzFyGADLv0n1SR2c2POZ2go= +github.com/refraction-networking/conjure v0.7.10-0.20231110185258-440efbc194c2/go.mod h1:O5u/Mpg5b3whLF8L701pTMQW23SviS+rDKdWbY/BM0Q= +github.com/refraction-networking/conjure v0.7.10-0.20231110193225-e4749a9dedc9 h1:46+z0lVJL5ynP09dtThex4GiowaANoBk7DsNF0+a+7Q= +github.com/refraction-networking/conjure v0.7.10-0.20231110193225-e4749a9dedc9/go.mod h1:O5u/Mpg5b3whLF8L701pTMQW23SviS+rDKdWbY/BM0Q= github.com/refraction-networking/ed25519 v0.1.2 h1:08kJZUkAlY7a7cZGosl1teGytV+QEoNxPO7NnRvAB+g= github.com/refraction-networking/ed25519 v0.1.2/go.mod h1:nxYLUAYt/hmNpAh64PNSQ/tQ9gTIB89wCaGKJlRtZ9I= github.com/refraction-networking/gotapdance v1.7.7 h1:RSdDCA0v4n/iIxCnxLF6uCoJdlo000R+IKGvELfpc/A= diff --git a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go index 5264d94f0..72f08c86b 100644 --- a/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go +++ b/vendor/github.com/refraction-networking/conjure/pkg/transports/connecting/dtls/client.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net" + "strings" "sync" "time" @@ -44,7 +45,6 @@ type ClientTransport struct { psk []byte stunServer string disableIRWorkaround bool - listenTimeout *time.Duration } type ClientConfig struct { @@ -132,7 +132,6 @@ func (t *ClientTransport) SetParams(p any) error { case *ClientConfig: t.stunServer = params.STUNServer t.disableIRWorkaround = params.DisableIRWorkaround - t.listenTimeout = params.ListenTimeout } return nil @@ -205,27 +204,44 @@ func (t *ClientTransport) GetDstPort(seed []byte) (uint16, error) { func (t *ClientTransport) WrapDial(dialer dialFunc) (dialFunc, error) { dtlsDialer := func(ctx context.Context, network, localAddr, address string) (net.Conn, error) { - // Create a context that will automatically cancel after 5 seconds or when the existing context is cancelled, whichever comes first. - timeout := t.listenTimeout - if timeout == nil { - time := defaultListenTime - timeout = &time - } - ctxtimeout, cancel := context.WithTimeout(ctx, *timeout) + + dialCtx, cancel := context.WithCancel(ctx) defer cancel() - conn, errListen := t.listen(ctxtimeout, dialer, address) - if errListen != nil { - // fallback to dial - conn, errDial := t.dial(ctx, dialer, address) - if errDial != nil { - return nil, fmt.Errorf("error listening: %v, error dialing: %v", errListen, errDial) + type result struct { + conn net.Conn + err error + } + + results := make(chan result, 2) + + go func() { + conn, err := t.listen(dialCtx, dialer, address) + results <- result{conn, err} + }() + + go func() { + conn, err := t.dial(dialCtx, dialer, address) + results <- result{conn, err} + }() + + first := <-results + if first.err == nil { + // Interrupt the other dial + cancel() + second := <-results + if second.conn != nil { + _ = second.conn.Close() } + return first.conn, nil + } - return conn, nil + second := <-results + if second.err == nil { + return second.conn, nil } - return conn, nil + return nil, fmt.Errorf(strings.Join([]string{first.err.Error(), second.err.Error()}, "; ")) } return dtlsDialer, nil diff --git a/vendor/modules.txt b/vendor/modules.txt index d488a0562..1294bb2fd 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -260,7 +260,7 @@ github.com/pmezard/go-difflib/difflib # github.com/quic-go/qpack v0.4.0 ## explicit; go 1.18 github.com/quic-go/qpack -# github.com/refraction-networking/conjure v0.7.9 +# github.com/refraction-networking/conjure v0.7.10-0.20231110193225-e4749a9dedc9 ## explicit; go 1.18 github.com/refraction-networking/conjure/pkg/client/assets github.com/refraction-networking/conjure/pkg/core From 847bfeae11287f1416e3b661b41aaeb5fe8d1097 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Mon, 13 Nov 2023 10:00:10 -0500 Subject: [PATCH 24/29] Fix Docker build error - ""head: cannot open '/etc/ssl/certs/java/cacerts' for reading" --- MobileLibrary/Android/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/MobileLibrary/Android/Dockerfile b/MobileLibrary/Android/Dockerfile index f3b5f3258..a6d3c4052 100644 --- a/MobileLibrary/Android/Dockerfile +++ b/MobileLibrary/Android/Dockerfile @@ -14,6 +14,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ git \ + ca-certificates-java \ openjdk-8-jdk \ pkg-config \ zip \ From a9d0f0a5116b1bbaf77219edca03b043b7703a1e Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Mon, 13 Nov 2023 10:01:35 -0500 Subject: [PATCH 25/29] Expose net.UDPConn.File functionality for the Conjure DTLS transport --- psiphon/common/refraction/refraction.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 450b36d1b..01bf53c66 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -954,6 +954,19 @@ type managedConn struct { manager *dialManager } +type fileConn interface { + File() (*os.File, error) +} + +// File exposes the net.UDPConn.File() functionality required by the Conjure +// DTLS transport. +func (conn *managedConn) File() (*os.File, error) { + if f, ok := conn.Conn.(fileConn); ok { + return f.File() + } + return nil, errors.TraceNew("underlying conn is not a fileConn") +} + // CloseWrite exposes the net.TCPConn.CloseWrite() functionality // required by TapDance. func (conn *managedConn) CloseWrite() error { From bb32a27c4519139042728b1abbadc7f5a48fd61a Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Mon, 13 Nov 2023 16:11:40 -0500 Subject: [PATCH 26/29] Add ConjureDTLSEmptyInitialPacketProbability --- psiphon/common/parameters/parameters.go | 32 +++++++++++++------------ psiphon/common/refraction/config.go | 7 +++++- psiphon/common/refraction/refraction.go | 27 +++++++++++++++------ psiphon/config.go | 5 ++++ psiphon/dialParameters.go | 3 +++ psiphon/server/api.go | 1 + psiphon/tunnel.go | 1 + 7 files changed, 53 insertions(+), 23 deletions(-) diff --git a/psiphon/common/parameters/parameters.go b/psiphon/common/parameters/parameters.go index af5d0b4d9..3fd0a60a5 100755 --- a/psiphon/common/parameters/parameters.go +++ b/psiphon/common/parameters/parameters.go @@ -302,6 +302,7 @@ const ( ConjureLimitTransportsProbability = "ConjureLimitTransportsProbability" ConjureLimitTransports = "ConjureLimitTransports" ConjureSTUNServerAddresses = "ConjureSTUNServerAddresses" + ConjureDTLSEmptyInitialPacketProbability = "ConjureDTLSEmptyInitialPacketProbability" CustomHostNameRegexes = "CustomHostNameRegexes" CustomHostNameProbability = "CustomHostNameProbability" CustomHostNameLimitProtocols = "CustomHostNameLimitProtocols" @@ -674,21 +675,22 @@ var defaultParameters = map[string]struct { ConjureCachedRegistrationTTL: {value: time.Duration(0), minimum: time.Duration(0)}, // ConjureAPIRegistrarURL parameter is obsoleted by ConjureAPIRegistrarBidirectionalURL. // TODO: remove once no longer required for older clients. - ConjureAPIRegistrarURL: {value: ""}, - ConjureAPIRegistrarBidirectionalURL: {value: ""}, - ConjureAPIRegistrarFrontingSpecs: {value: FrontingSpecs{}}, - ConjureAPIRegistrarMinDelay: {value: time.Duration(0), minimum: time.Duration(0)}, - ConjureAPIRegistrarMaxDelay: {value: time.Duration(0), minimum: time.Duration(0)}, - ConjureDecoyRegistrarProbability: {value: 0.0, minimum: 0.0}, - ConjureDecoyRegistrarWidth: {value: 5, minimum: 0}, - ConjureDecoyRegistrarMinDelay: {value: time.Duration(0), minimum: time.Duration(0)}, - ConjureDecoyRegistrarMaxDelay: {value: time.Duration(0), minimum: time.Duration(0)}, - ConjureEnableIPv6Dials: {value: true}, - ConjureEnablePortRandomization: {value: true}, - ConjureEnableRegistrationOverrides: {value: false}, - ConjureLimitTransportsProbability: {value: 1.0, minimum: 0.0}, - ConjureLimitTransports: {value: protocol.ConjureTransports{}}, - ConjureSTUNServerAddresses: {value: []string{}}, + ConjureAPIRegistrarURL: {value: ""}, + ConjureAPIRegistrarBidirectionalURL: {value: ""}, + ConjureAPIRegistrarFrontingSpecs: {value: FrontingSpecs{}}, + ConjureAPIRegistrarMinDelay: {value: time.Duration(0), minimum: time.Duration(0)}, + ConjureAPIRegistrarMaxDelay: {value: time.Duration(0), minimum: time.Duration(0)}, + ConjureDecoyRegistrarProbability: {value: 0.0, minimum: 0.0}, + ConjureDecoyRegistrarWidth: {value: 5, minimum: 0}, + ConjureDecoyRegistrarMinDelay: {value: time.Duration(0), minimum: time.Duration(0)}, + ConjureDecoyRegistrarMaxDelay: {value: time.Duration(0), minimum: time.Duration(0)}, + ConjureEnableIPv6Dials: {value: true}, + ConjureEnablePortRandomization: {value: true}, + ConjureEnableRegistrationOverrides: {value: false}, + ConjureLimitTransportsProbability: {value: 1.0, minimum: 0.0}, + ConjureLimitTransports: {value: protocol.ConjureTransports{}}, + ConjureSTUNServerAddresses: {value: []string{}}, + ConjureDTLSEmptyInitialPacketProbability: {value: 0.0, minimum: 0.0}, CustomHostNameRegexes: {value: RegexStrings{}}, CustomHostNameProbability: {value: 0.0, minimum: 0.0}, diff --git a/psiphon/common/refraction/config.go b/psiphon/common/refraction/config.go index b5f63e8be..8054f75c0 100644 --- a/psiphon/common/refraction/config.go +++ b/psiphon/common/refraction/config.go @@ -100,13 +100,18 @@ type ConjureConfig struct { // Transport may be protocol.CONJURE_TRANSPORT_MIN_OSSH, // protocol.CONJURE_TRANSPORT_PREFIX_OSSH, or - // protcol.CONJURE_TRANSPORT_DTLS_OSSH. + // protocol.CONJURE_TRANSPORT_DTLS_OSSH. Transport string // STUNServerAddress specifies the STUN server to use with // protcol.CONJURE_TRANSPORT_DTLS_OSSH. STUNServerAddress string + // DTLSEmptyInitialPacket specifies whether to prefix the DTLS flow with + // an initial empty packet. Used only for + // protocol.CONJURE_TRANSPORT_DTLS_OSSH. + DTLSEmptyInitialPacket bool + // DiagnosticID identifies this dial in diagnostics. DiagnosticID string diff --git a/psiphon/common/refraction/refraction.go b/psiphon/common/refraction/refraction.go index 01bf53c66..e77392f78 100644 --- a/psiphon/common/refraction/refraction.go +++ b/psiphon/common/refraction/refraction.go @@ -275,6 +275,7 @@ func dial( conjureMetricTransport := "" conjureMetricPrefix := "" conjureMetricSTUNServerAddress := "" + conjureMetricDTLSEmptyInitialPacket := false var conjureCachedRegistration *refraction_networking_client.ConjureReg var conjureRecordRegistrar *recordRegistrar @@ -465,10 +466,12 @@ func dial( } config.SetParams( &refraction_networking_dtls.ClientConfig{ - STUNServer: conjureConfig.STUNServerAddress, + STUNServer: conjureConfig.STUNServerAddress, + DisableIRWorkaround: !conjureConfig.DTLSEmptyInitialPacket, }) conjureMetricSTUNServerAddress = conjureConfig.STUNServerAddress + conjureMetricDTLSEmptyInitialPacket = conjureConfig.DTLSEmptyInitialPacket refractionDialer.Transport = transport.ID() refractionDialer.TransportConfig = config @@ -571,6 +574,7 @@ func dial( refractionConn.conjureMetricTransport = conjureMetricTransport refractionConn.conjureMetricPrefix = conjureMetricPrefix refractionConn.conjureMetricSTUNServerAddress = conjureMetricSTUNServerAddress + refractionConn.conjureMetricDTLSEmptyInitialPacket = conjureMetricDTLSEmptyInitialPacket } return refractionConn, nil @@ -988,12 +992,13 @@ type refractionConn struct { manager *dialManager isClosed int32 - isConjure bool - conjureMetricCached bool - conjureMetricDelay time.Duration - conjureMetricTransport string - conjureMetricPrefix string - conjureMetricSTUNServerAddress string + isConjure bool + conjureMetricCached bool + conjureMetricDelay time.Duration + conjureMetricTransport string + conjureMetricPrefix string + conjureMetricSTUNServerAddress string + conjureMetricDTLSEmptyInitialPacket bool } func (conn *refractionConn) Write(p []byte) (int, error) { @@ -1055,6 +1060,14 @@ func (conn *refractionConn) GetMetrics() common.LogFields { logFields["conjure_stun"] = conn.conjureMetricSTUNServerAddress } + if conn.conjureMetricTransport == protocol.CONJURE_TRANSPORT_DTLS_OSSH { + emptyPacket := "0" + if conn.conjureMetricDTLSEmptyInitialPacket { + emptyPacket = "1" + } + logFields["conjure_empty_packet"] = emptyPacket + } + host, port, err := net.SplitHostPort(conn.RemoteAddr().String()) if err == nil { network := "IPv4" diff --git a/psiphon/config.go b/psiphon/config.go index 2af69ab2f..52d334b16 100755 --- a/psiphon/config.go +++ b/psiphon/config.go @@ -808,6 +808,7 @@ type Config struct { ConjureEnableRegistrationOverrides *bool ConjureLimitTransports protocol.ConjureTransports ConjureSTUNServerAddresses []string + ConjureDTLSEmptyInitialPacketProbability *float64 // HoldOffTunnelMinDurationMilliseconds and other HoldOffTunnel fields are // for testing purposes. @@ -1902,6 +1903,10 @@ func (config *Config) makeConfigParameters() map[string]interface{} { applyParameters[parameters.ConjureSTUNServerAddresses] = config.ConjureSTUNServerAddresses } + if config.ConjureDTLSEmptyInitialPacketProbability != nil { + applyParameters[parameters.ConjureDTLSEmptyInitialPacketProbability] = *config.ConjureDTLSEmptyInitialPacketProbability + } + if config.HoldOffTunnelMinDurationMilliseconds != nil { applyParameters[parameters.HoldOffTunnelMinDuration] = fmt.Sprintf("%dms", *config.HoldOffTunnelMinDurationMilliseconds) } diff --git a/psiphon/dialParameters.go b/psiphon/dialParameters.go index 63af15200..83fc4ec70 100644 --- a/psiphon/dialParameters.go +++ b/psiphon/dialParameters.go @@ -140,6 +140,7 @@ type DialParameters struct { ConjureDecoyRegistrarWidth int ConjureTransport string ConjureSTUNServerAddress string + ConjureDTLSEmptyInitialPacket bool LivenessTestSeed *prng.Seed @@ -637,6 +638,8 @@ func MakeDialParameters( "no Conjure STUN servers addresses configured for transport %s", dialParams.ConjureTransport) } dialParams.ConjureSTUNServerAddress = stunServerAddresses[prng.Intn(len(stunServerAddresses))] + dialParams.ConjureDTLSEmptyInitialPacket = p.WeightedCoinFlip( + parameters.ConjureDTLSEmptyInitialPacketProbability) } } diff --git a/psiphon/server/api.go b/psiphon/server/api.go index 35701f51b..0847c0424 100644 --- a/psiphon/server/api.go +++ b/psiphon/server/api.go @@ -945,6 +945,7 @@ var baseDialParams = []requestParamSpec{ {"conjure_transport", isAnyString, requestParamOptional}, {"conjure_prefix", isAnyString, requestParamOptional}, {"conjure_stun", isAnyString, requestParamOptional}, + {"conjure_empty_packet", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, {"conjure_network", isAnyString, requestParamOptional}, {"conjure_port_number", isAnyString, requestParamOptional}, {"split_tunnel", isBooleanFlag, requestParamOptional | requestParamLogFlagAsBool}, diff --git a/psiphon/tunnel.go b/psiphon/tunnel.go index fc3d45f3e..b78d1d60c 100644 --- a/psiphon/tunnel.go +++ b/psiphon/tunnel.go @@ -842,6 +842,7 @@ func dialTunnel( EnableRegistrationOverrides: conjureEnableRegistrationOverrides, Transport: dialParams.ConjureTransport, STUNServerAddress: dialParams.ConjureSTUNServerAddress, + DTLSEmptyInitialPacket: dialParams.ConjureDTLSEmptyInitialPacket, DiagnosticID: diagnosticID, Logger: NoticeCommonLogger(), } From ca24a733ddc7356d8e1765e47298e2e65219f49f Mon Sep 17 00:00:00 2001 From: mirokuratczyk Date: Mon, 27 Nov 2023 11:43:32 -0500 Subject: [PATCH 27/29] Fix: concurrent map read and map write Copy custom headers to prevent concurrent map access which results in a crash. --- psiphon/net.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/psiphon/net.go b/psiphon/net.go index 504a1de19..4e21b9da8 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -537,7 +537,7 @@ func makeFrontedHTTPClient( // UntunneledResolveIP. meekDialConfig = &DialConfig{ UpstreamProxyURL: dialConfig.UpstreamProxyURL, - CustomHeaders: dialConfig.CustomHeaders, + CustomHeaders: makeDialCustomHeaders(config, p), DeviceBinder: dialConfig.DeviceBinder, IPv6Synthesizer: dialConfig.IPv6Synthesizer, ResolveIP: func(ctx context.Context, hostname string) ([]net.IP, error) { From 624393675e6693d188a0c24671d2850a6ed34387 Mon Sep 17 00:00:00 2001 From: mirokuratczyk Date: Mon, 27 Nov 2023 12:30:23 -0500 Subject: [PATCH 28/29] Add warning --- psiphon/net.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/psiphon/net.go b/psiphon/net.go index 4e21b9da8..c65f01166 100644 --- a/psiphon/net.go +++ b/psiphon/net.go @@ -414,6 +414,11 @@ func UntunneledResolveIP( // // The context is applied to underlying TCP dials. The caller is responsible // for applying the context to requests made with the returned http.Client. +// +// Warning: it is not safe to call makeFrontedHTTPClient concurrently with the +// same dialConfig when tunneled is true because dialConfig will be used +// directly, instead of copied, which can lead to a crash when fields not safe +// for concurrent use are present. func makeFrontedHTTPClient( ctx context.Context, config *Config, From a13da4c7c44134ed596792c52cbbb7c57651a2b0 Mon Sep 17 00:00:00 2001 From: Rod Hynes Date: Tue, 5 Dec 2023 16:42:34 -0500 Subject: [PATCH 29/29] Use Go 1.20.12 --- .github/workflows/tests.yml | 2 +- ClientLibrary/Dockerfile | 2 +- ClientLibrary/build-darwin.sh | 4 ++-- ConsoleClient/Dockerfile | 2 +- MobileLibrary/Android/Dockerfile | 2 +- MobileLibrary/iOS/build-psiphon-framework.sh | 2 +- Server/Dockerfile-binary-builder | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a2f306f27..00906f065 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: [ "ubuntu" ] - go: [ "1.20.10" ] + go: [ "1.20.12" ] test-type: [ "detector", "coverage", "memory", "custom-build-tags" ] runs-on: ${{ matrix.os }}-latest diff --git a/ClientLibrary/Dockerfile b/ClientLibrary/Dockerfile index 1b817b17c..d9796e3cd 100644 --- a/ClientLibrary/Dockerfile +++ b/ClientLibrary/Dockerfile @@ -21,7 +21,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ # Install Go. # NOTE: Go 1.10+ is required to build c-shared for windows (https://github.com/golang/go/commit/bb0bfd002ada7e3eb9198d4287b32c2fed6e8da6) -ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.12 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/ClientLibrary/build-darwin.sh b/ClientLibrary/build-darwin.sh index 52bdafc7b..74200478f 100755 --- a/ClientLibrary/build-darwin.sh +++ b/ClientLibrary/build-darwin.sh @@ -9,8 +9,8 @@ if [ -z ${2+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$2"; fi # Note: # clangwrap.sh needs to be updated when the Go version changes. # The last version was: -# https://github.com/golang/go/blob/go1.20.10/misc/ios/clangwrap.sh -GO_VERSION_REQUIRED="1.20.10" +# https://github.com/golang/go/blob/go1.20.12/misc/ios/clangwrap.sh +GO_VERSION_REQUIRED="1.20.12" BASE_DIR=$(cd "$(dirname "$0")" ; pwd -P) cd ${BASE_DIR} diff --git a/ConsoleClient/Dockerfile b/ConsoleClient/Dockerfile index afcc633a3..c6f659ede 100644 --- a/ConsoleClient/Dockerfile +++ b/ConsoleClient/Dockerfile @@ -22,7 +22,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install Go. -ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.12 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/MobileLibrary/Android/Dockerfile b/MobileLibrary/Android/Dockerfile index a6d3c4052..679fbaf0a 100644 --- a/MobileLibrary/Android/Dockerfile +++ b/MobileLibrary/Android/Dockerfile @@ -23,7 +23,7 @@ RUN apt-get update -y && apt-get install -y --no-install-recommends \ && rm -rf /var/lib/apt/lists/* # Install Go. -ENV GOVERSION=go1.20.10 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 +ENV GOVERSION=go1.20.12 GOROOT=/usr/local/go GOPATH=/go PATH=$PATH:/usr/local/go/bin:/go/bin CGO_ENABLED=1 RUN curl -L https://storage.googleapis.com/golang/$GOVERSION.linux-amd64.tar.gz -o /tmp/go.tar.gz \ && tar -C /usr/local -xzf /tmp/go.tar.gz \ diff --git a/MobileLibrary/iOS/build-psiphon-framework.sh b/MobileLibrary/iOS/build-psiphon-framework.sh index e3dff9e75..b0301b695 100755 --- a/MobileLibrary/iOS/build-psiphon-framework.sh +++ b/MobileLibrary/iOS/build-psiphon-framework.sh @@ -17,7 +17,7 @@ set -e -u -x if [ -z ${1+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$1"; fi # Modify this value as we use newer Go versions. -GO_VERSION_REQUIRED="1.20.10" +GO_VERSION_REQUIRED="1.20.12" # At this time, psiphon-tunnel-core doesn't support modules export GO111MODULE=off diff --git a/Server/Dockerfile-binary-builder b/Server/Dockerfile-binary-builder index b5c242736..85f35275f 100644 --- a/Server/Dockerfile-binary-builder +++ b/Server/Dockerfile-binary-builder @@ -1,6 +1,6 @@ FROM alpine:3.18.4 -ENV GOLANG_VERSION 1.20.10 +ENV GOLANG_VERSION 1.20.12 ENV GOLANG_SRC_URL https://golang.org/dl/go$GOLANG_VERSION.src.tar.gz RUN set -ex \