summaryrefslogtreecommitdiffstats
path: root/vendor/golang.org/x
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x')
-rw-r--r--vendor/golang.org/x/crypto/acme/types.go52
-rw-r--r--vendor/golang.org/x/crypto/argon2/argon2.go285
-rw-r--r--vendor/golang.org/x/crypto/argon2/blake2b.go53
-rw-r--r--vendor/golang.org/x/crypto/argon2/blamka_amd64.go61
-rw-r--r--vendor/golang.org/x/crypto/argon2/blamka_amd64.s244
-rw-r--r--vendor/golang.org/x/crypto/argon2/blamka_generic.go163
-rw-r--r--vendor/golang.org/x/crypto/argon2/blamka_ref.go16
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2b.go291
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go38
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s745
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go25
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s279
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2b_generic.go182
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2b_ref.go12
-rw-r--r--vendor/golang.org/x/crypto/blake2b/blake2x.go177
-rw-r--r--vendor/golang.org/x/crypto/blake2b/register.go33
-rw-r--r--vendor/golang.org/x/crypto/chacha20/chacha_arm64.s1
-rw-r--r--vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s1
-rw-r--r--vendor/golang.org/x/crypto/chacha20/chacha_s390x.s1
-rw-r--r--vendor/golang.org/x/crypto/curve25519/curve25519.go52
-rw-r--r--vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go241
-rw-r--r--vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s1793
-rw-r--r--vendor/golang.org/x/crypto/curve25519/curve25519_generic.go828
-rw-r--r--vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go12
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/README7
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe.go416
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go13
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s379
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go12
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go16
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s43
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go12
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go264
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint1
-rw-r--r--vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh19
-rw-r--r--vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go77
-rw-r--r--vendor/golang.org/x/crypto/poly1305/sum_amd64.s1
-rw-r--r--vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s19
-rw-r--r--vendor/golang.org/x/crypto/poly1305/sum_s390x.s1
-rw-r--r--vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s1
-rw-r--r--vendor/golang.org/x/crypto/scrypt/scrypt.go212
-rw-r--r--vendor/golang.org/x/crypto/ssh/client.go2
-rw-r--r--vendor/golang.org/x/net/html/parse.go24
-rw-r--r--vendor/golang.org/x/net/http/httpguts/httplex.go10
-rw-r--r--vendor/golang.org/x/net/http2/Dockerfile2
-rw-r--r--vendor/golang.org/x/net/http2/ascii.go53
-rw-r--r--vendor/golang.org/x/net/http2/client_conn_pool.go79
-rw-r--r--vendor/golang.org/x/net/http2/go115.go27
-rw-r--r--vendor/golang.org/x/net/http2/headermap.go7
-rw-r--r--vendor/golang.org/x/net/http2/not_go115.go31
-rw-r--r--vendor/golang.org/x/net/http2/server.go38
-rw-r--r--vendor/golang.org/x/net/http2/transport.go165
-rw-r--r--vendor/golang.org/x/net/http2/write.go7
-rw-r--r--vendor/golang.org/x/net/idna/idna10.0.0.go113
-rw-r--r--vendor/golang.org/x/net/idna/idna9.0.0.go93
-rw-r--r--vendor/golang.org/x/net/publicsuffix/list.go181
-rw-r--r--vendor/golang.org/x/net/publicsuffix/table.go10520
57 files changed, 15332 insertions, 3098 deletions
diff --git a/vendor/golang.org/x/crypto/acme/types.go b/vendor/golang.org/x/crypto/acme/types.go
index e751bf52..eaae4529 100644
--- a/vendor/golang.org/x/crypto/acme/types.go
+++ b/vendor/golang.org/x/crypto/acme/types.go
@@ -57,6 +57,32 @@ var (
ErrNoAccount = errors.New("acme: account does not exist")
)
+// A Subproblem describes an ACME subproblem as reported in an Error.
+type Subproblem struct {
+ // Type is a URI reference that identifies the problem type,
+ // typically in a "urn:acme:error:xxx" form.
+ Type string
+ // Detail is a human-readable explanation specific to this occurrence of the problem.
+ Detail string
+ // Instance indicates a URL that the client should direct a human user to visit
+ // in order for instructions on how to agree to the updated Terms of Service.
+ // In such an event CA sets StatusCode to 403, Type to
+ // "urn:ietf:params:acme:error:userActionRequired", and adds a Link header with relation
+ // "terms-of-service" containing the latest TOS URL.
+ Instance string
+ // Identifier may contain the ACME identifier that the error is for.
+ Identifier *AuthzID
+}
+
+func (sp Subproblem) String() string {
+ str := fmt.Sprintf("%s: ", sp.Type)
+ if sp.Identifier != nil {
+ str += fmt.Sprintf("[%s: %s] ", sp.Identifier.Type, sp.Identifier.Value)
+ }
+ str += sp.Detail
+ return str
+}
+
// Error is an ACME error, defined in Problem Details for HTTP APIs doc
// http://tools.ietf.org/html/draft-ietf-appsawg-http-problem.
type Error struct {
@@ -76,10 +102,21 @@ type Error struct {
// Header is the original server error response headers.
// It may be nil.
Header http.Header
+ // Subproblems may contain more detailed information about the individual problems
+ // that caused the error. This field is only sent by RFC 8555 compatible ACME
+ // servers. Defined in RFC 8555 Section 6.7.1.
+ Subproblems []Subproblem
}
func (e *Error) Error() string {
- return fmt.Sprintf("%d %s: %s", e.StatusCode, e.ProblemType, e.Detail)
+ str := fmt.Sprintf("%d %s: %s", e.StatusCode, e.ProblemType, e.Detail)
+ if len(e.Subproblems) > 0 {
+ str += fmt.Sprintf("; subproblems:")
+ for _, sp := range e.Subproblems {
+ str += fmt.Sprintf("\n\t%s", sp)
+ }
+ }
+ return str
}
// AuthorizationError indicates that an authorization for an identifier
@@ -533,20 +570,23 @@ func (c *wireChallenge) challenge() *Challenge {
// wireError is a subset of fields of the Problem Details object
// as described in https://tools.ietf.org/html/rfc7807#section-3.1.
type wireError struct {
- Status int
- Type string
- Detail string
- Instance string
+ Status int
+ Type string
+ Detail string
+ Instance string
+ Subproblems []Subproblem
}
func (e *wireError) error(h http.Header) *Error {
- return &Error{
+ err := &Error{
StatusCode: e.Status,
ProblemType: e.Type,
Detail: e.Detail,
Instance: e.Instance,
Header: h,
+ Subproblems: e.Subproblems,
}
+ return err
}
// CertOption is an optional argument type for the TLS ChallengeCert methods for
diff --git a/vendor/golang.org/x/crypto/argon2/argon2.go b/vendor/golang.org/x/crypto/argon2/argon2.go
new file mode 100644
index 00000000..b423feae
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/argon2.go
@@ -0,0 +1,285 @@
+// 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 argon2 implements the key derivation function Argon2.
+// Argon2 was selected as the winner of the Password Hashing Competition and can
+// be used to derive cryptographic keys from passwords.
+//
+// For a detailed specification of Argon2 see [1].
+//
+// If you aren't sure which function you need, use Argon2id (IDKey) and
+// the parameter recommendations for your scenario.
+//
+//
+// Argon2i
+//
+// Argon2i (implemented by Key) is the side-channel resistant version of Argon2.
+// It uses data-independent memory access, which is preferred for password
+// hashing and password-based key derivation. Argon2i requires more passes over
+// memory than Argon2id to protect from trade-off attacks. The recommended
+// parameters (taken from [2]) for non-interactive operations are time=3 and to
+// use the maximum available memory.
+//
+//
+// Argon2id
+//
+// Argon2id (implemented by IDKey) is a hybrid version of Argon2 combining
+// Argon2i and Argon2d. It uses data-independent memory access for the first
+// half of the first iteration over the memory and data-dependent memory access
+// for the rest. Argon2id is side-channel resistant and provides better brute-
+// force cost savings due to time-memory tradeoffs than Argon2i. The recommended
+// parameters for non-interactive operations (taken from [2]) are time=1 and to
+// use the maximum available memory.
+//
+// [1] https://github.com/P-H-C/phc-winner-argon2/blob/master/argon2-specs.pdf
+// [2] https://tools.ietf.org/html/draft-irtf-cfrg-argon2-03#section-9.3
+package argon2
+
+import (
+ "encoding/binary"
+ "sync"
+
+ "golang.org/x/crypto/blake2b"
+)
+
+// The Argon2 version implemented by this package.
+const Version = 0x13
+
+const (
+ argon2d = iota
+ argon2i
+ argon2id
+)
+
+// Key derives a key from the password, salt, and cost parameters using Argon2i
+// returning a byte slice of length keyLen that can be used as cryptographic
+// key. The CPU cost and parallelism degree must be greater than zero.
+//
+// For example, you can get a derived key for e.g. AES-256 (which needs a
+// 32-byte key) by doing:
+//
+// key := argon2.Key([]byte("some password"), salt, 3, 32*1024, 4, 32)
+//
+// The draft RFC recommends[2] time=3, and memory=32*1024 is a sensible number.
+// If using that amount of memory (32 MB) is not possible in some contexts then
+// the time parameter can be increased to compensate.
+//
+// The time parameter specifies the number of passes over the memory and the
+// memory parameter specifies the size of the memory in KiB. For example
+// memory=32*1024 sets the memory cost to ~32 MB. The number of threads can be
+// adjusted to the number of available CPUs. The cost parameters should be
+// increased as memory latency and CPU parallelism increases. Remember to get a
+// good random salt.
+func Key(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
+ return deriveKey(argon2i, password, salt, nil, nil, time, memory, threads, keyLen)
+}
+
+// IDKey derives a key from the password, salt, and cost parameters using
+// Argon2id returning a byte slice of length keyLen that can be used as
+// cryptographic key. The CPU cost and parallelism degree must be greater than
+// zero.
+//
+// For example, you can get a derived key for e.g. AES-256 (which needs a
+// 32-byte key) by doing:
+//
+// key := argon2.IDKey([]byte("some password"), salt, 1, 64*1024, 4, 32)
+//
+// The draft RFC recommends[2] time=1, and memory=64*1024 is a sensible number.
+// If using that amount of memory (64 MB) is not possible in some contexts then
+// the time parameter can be increased to compensate.
+//
+// The time parameter specifies the number of passes over the memory and the
+// memory parameter specifies the size of the memory in KiB. For example
+// memory=64*1024 sets the memory cost to ~64 MB. The number of threads can be
+// adjusted to the numbers of available CPUs. The cost parameters should be
+// increased as memory latency and CPU parallelism increases. Remember to get a
+// good random salt.
+func IDKey(password, salt []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
+ return deriveKey(argon2id, password, salt, nil, nil, time, memory, threads, keyLen)
+}
+
+func deriveKey(mode int, password, salt, secret, data []byte, time, memory uint32, threads uint8, keyLen uint32) []byte {
+ if time < 1 {
+ panic("argon2: number of rounds too small")
+ }
+ if threads < 1 {
+ panic("argon2: parallelism degree too low")
+ }
+ h0 := initHash(password, salt, secret, data, time, memory, uint32(threads), keyLen, mode)
+
+ memory = memory / (syncPoints * uint32(threads)) * (syncPoints * uint32(threads))
+ if memory < 2*syncPoints*uint32(threads) {
+ memory = 2 * syncPoints * uint32(threads)
+ }
+ B := initBlocks(&h0, memory, uint32(threads))
+ processBlocks(B, time, memory, uint32(threads), mode)
+ return extractKey(B, memory, uint32(threads), keyLen)
+}
+
+const (
+ blockLength = 128
+ syncPoints = 4
+)
+
+type block [blockLength]uint64
+
+func initHash(password, salt, key, data []byte, time, memory, threads, keyLen uint32, mode int) [blake2b.Size + 8]byte {
+ var (
+ h0 [blake2b.Size + 8]byte
+ params [24]byte
+ tmp [4]byte
+ )
+
+ b2, _ := blake2b.New512(nil)
+ binary.LittleEndian.PutUint32(params[0:4], threads)
+ binary.LittleEndian.PutUint32(params[4:8], keyLen)
+ binary.LittleEndian.PutUint32(params[8:12], memory)
+ binary.LittleEndian.PutUint32(params[12:16], time)
+ binary.LittleEndian.PutUint32(params[16:20], uint32(Version))
+ binary.LittleEndian.PutUint32(params[20:24], uint32(mode))
+ b2.Write(params[:])
+ binary.LittleEndian.PutUint32(tmp[:], uint32(len(password)))
+ b2.Write(tmp[:])
+ b2.Write(password)
+ binary.LittleEndian.PutUint32(tmp[:], uint32(len(salt)))
+ b2.Write(tmp[:])
+ b2.Write(salt)
+ binary.LittleEndian.PutUint32(tmp[:], uint32(len(key)))
+ b2.Write(tmp[:])
+ b2.Write(key)
+ binary.LittleEndian.PutUint32(tmp[:], uint32(len(data)))
+ b2.Write(tmp[:])
+ b2.Write(data)
+ b2.Sum(h0[:0])
+ return h0
+}
+
+func initBlocks(h0 *[blake2b.Size + 8]byte, memory, threads uint32) []block {
+ var block0 [1024]byte
+ B := make([]block, memory)
+ for lane := uint32(0); lane < threads; lane++ {
+ j := lane * (memory / threads)
+ binary.LittleEndian.PutUint32(h0[blake2b.Size+4:], lane)
+
+ binary.LittleEndian.PutUint32(h0[blake2b.Size:], 0)
+ blake2bHash(block0[:], h0[:])
+ for i := range B[j+0] {
+ B[j+0][i] = binary.LittleEndian.Uint64(block0[i*8:])
+ }
+
+ binary.LittleEndian.PutUint32(h0[blake2b.Size:], 1)
+ blake2bHash(block0[:], h0[:])
+ for i := range B[j+1] {
+ B[j+1][i] = binary.LittleEndian.Uint64(block0[i*8:])
+ }
+ }
+ return B
+}
+
+func processBlocks(B []block, time, memory, threads uint32, mode int) {
+ lanes := memory / threads
+ segments := lanes / syncPoints
+
+ processSegment := func(n, slice, lane uint32, wg *sync.WaitGroup) {
+ var addresses, in, zero block
+ if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) {
+ in[0] = uint64(n)
+ in[1] = uint64(lane)
+ in[2] = uint64(slice)
+ in[3] = uint64(memory)
+ in[4] = uint64(time)
+ in[5] = uint64(mode)
+ }
+
+ index := uint32(0)
+ if n == 0 && slice == 0 {
+ index = 2 // we have already generated the first two blocks
+ if mode == argon2i || mode == argon2id {
+ in[6]++
+ processBlock(&addresses, &in, &zero)
+ processBlock(&addresses, &addresses, &zero)
+ }
+ }
+
+ offset := lane*lanes + slice*segments + index
+ var random uint64
+ for index < segments {
+ prev := offset - 1
+ if index == 0 && slice == 0 {
+ prev += lanes // last block in lane
+ }
+ if mode == argon2i || (mode == argon2id && n == 0 && slice < syncPoints/2) {
+ if index%blockLength == 0 {
+ in[6]++
+ processBlock(&addresses, &in, &zero)
+ processBlock(&addresses, &addresses, &zero)
+ }
+ random = addresses[index%blockLength]
+ } else {
+ random = B[prev][0]
+ }
+ newOffset := indexAlpha(random, lanes, segments, threads, n, slice, lane, index)
+ processBlockXOR(&B[offset], &B[prev], &B[newOffset])
+ index, offset = index+1, offset+1
+ }
+ wg.Done()
+ }
+
+ for n := uint32(0); n < time; n++ {
+ for slice := uint32(0); slice < syncPoints; slice++ {
+ var wg sync.WaitGroup
+ for lane := uint32(0); lane < threads; lane++ {
+ wg.Add(1)
+ go processSegment(n, slice, lane, &wg)
+ }
+ wg.Wait()
+ }
+ }
+
+}
+
+func extractKey(B []block, memory, threads, keyLen uint32) []byte {
+ lanes := memory / threads
+ for lane := uint32(0); lane < threads-1; lane++ {
+ for i, v := range B[(lane*lanes)+lanes-1] {
+ B[memory-1][i] ^= v
+ }
+ }
+
+ var block [1024]byte
+ for i, v := range B[memory-1] {
+ binary.LittleEndian.PutUint64(block[i*8:], v)
+ }
+ key := make([]byte, keyLen)
+ blake2bHash(key, block[:])
+ return key
+}
+
+func indexAlpha(rand uint64, lanes, segments, threads, n, slice, lane, index uint32) uint32 {
+ refLane := uint32(rand>>32) % threads
+ if n == 0 && slice == 0 {
+ refLane = lane
+ }
+ m, s := 3*segments, ((slice+1)%syncPoints)*segments
+ if lane == refLane {
+ m += index
+ }
+ if n == 0 {
+ m, s = slice*segments, 0
+ if slice == 0 || lane == refLane {
+ m += index
+ }
+ }
+ if index == 0 || lane == refLane {
+ m--
+ }
+ return phi(rand, uint64(m), uint64(s), refLane, lanes)
+}
+
+func phi(rand, m, s uint64, lane, lanes uint32) uint32 {
+ p := rand & 0xFFFFFFFF
+ p = (p * p) >> 32
+ p = (p * m) >> 32
+ return lane*lanes + uint32((s+m-(p+1))%uint64(lanes))
+}
diff --git a/vendor/golang.org/x/crypto/argon2/blake2b.go b/vendor/golang.org/x/crypto/argon2/blake2b.go
new file mode 100644
index 00000000..10f46948
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/blake2b.go
@@ -0,0 +1,53 @@
+// 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 argon2
+
+import (
+ "encoding/binary"
+ "hash"
+
+ "golang.org/x/crypto/blake2b"
+)
+
+// blake2bHash computes an arbitrary long hash value of in
+// and writes the hash to out.
+func blake2bHash(out []byte, in []byte) {
+ var b2 hash.Hash
+ if n := len(out); n < blake2b.Size {
+ b2, _ = blake2b.New(n, nil)
+ } else {
+ b2, _ = blake2b.New512(nil)
+ }
+
+ var buffer [blake2b.Size]byte
+ binary.LittleEndian.PutUint32(buffer[:4], uint32(len(out)))
+ b2.Write(buffer[:4])
+ b2.Write(in)
+
+ if len(out) <= blake2b.Size {
+ b2.Sum(out[:0])
+ return
+ }
+
+ outLen := len(out)
+ b2.Sum(buffer[:0])
+ b2.Reset()
+ copy(out, buffer[:32])
+ out = out[32:]
+ for len(out) > blake2b.Size {
+ b2.Write(buffer[:])
+ b2.Sum(buffer[:0])
+ copy(out, buffer[:32])
+ out = out[32:]
+ b2.Reset()
+ }
+
+ if outLen%blake2b.Size > 0 { // outLen > 64
+ r := ((outLen + 31) / 32) - 2 // ⌈τ /32⌉-2
+ b2, _ = blake2b.New(outLen-32*r, nil)
+ }
+ b2.Write(buffer[:])
+ b2.Sum(out[:0])
+}
diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.go b/vendor/golang.org/x/crypto/argon2/blamka_amd64.go
new file mode 100644
index 00000000..a014ac92
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.go
@@ -0,0 +1,61 @@
+// 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 amd64 && gc && !purego
+// +build amd64,gc,!purego
+
+package argon2
+
+import "golang.org/x/sys/cpu"
+
+func init() {
+ useSSE4 = cpu.X86.HasSSE41
+}
+
+//go:noescape
+func mixBlocksSSE2(out, a, b, c *block)
+
+//go:noescape
+func xorBlocksSSE2(out, a, b, c *block)
+
+//go:noescape
+func blamkaSSE4(b *block)
+
+func processBlockSSE(out, in1, in2 *block, xor bool) {
+ var t block
+ mixBlocksSSE2(&t, in1, in2, &t)
+ if useSSE4 {
+ blamkaSSE4(&t)
+ } else {
+ for i := 0; i < blockLength; i += 16 {
+ blamkaGeneric(
+ &t[i+0], &t[i+1], &t[i+2], &t[i+3],
+ &t[i+4], &t[i+5], &t[i+6], &t[i+7],
+ &t[i+8], &t[i+9], &t[i+10], &t[i+11],
+ &t[i+12], &t[i+13], &t[i+14], &t[i+15],
+ )
+ }
+ for i := 0; i < blockLength/8; i += 2 {
+ blamkaGeneric(
+ &t[i], &t[i+1], &t[16+i], &t[16+i+1],
+ &t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
+ &t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
+ &t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
+ )
+ }
+ }
+ if xor {
+ xorBlocksSSE2(out, in1, in2, &t)
+ } else {
+ mixBlocksSSE2(out, in1, in2, &t)
+ }
+}
+
+func processBlock(out, in1, in2 *block) {
+ processBlockSSE(out, in1, in2, false)
+}
+
+func processBlockXOR(out, in1, in2 *block) {
+ processBlockSSE(out, in1, in2, true)
+}
diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s
new file mode 100644
index 00000000..b2cc0515
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s
@@ -0,0 +1,244 @@
+// 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 amd64 && gc && !purego
+// +build amd64,gc,!purego
+
+#include "textflag.h"
+
+DATA ·c40<>+0x00(SB)/8, $0x0201000706050403
+DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
+GLOBL ·c40<>(SB), (NOPTR+RODATA), $16
+
+DATA ·c48<>+0x00(SB)/8, $0x0100070605040302
+DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
+GLOBL ·c48<>(SB), (NOPTR+RODATA), $16
+
+#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \
+ MOVO v4, t1; \
+ MOVO v5, v4; \
+ MOVO t1, v5; \
+ MOVO v6, t1; \
+ PUNPCKLQDQ v6, t2; \
+ PUNPCKHQDQ v7, v6; \
+ PUNPCKHQDQ t2, v6; \
+ PUNPCKLQDQ v7, t2; \
+ MOVO t1, v7; \
+ MOVO v2, t1; \
+ PUNPCKHQDQ t2, v7; \
+ PUNPCKLQDQ v3, t2; \
+ PUNPCKHQDQ t2, v2; \
+ PUNPCKLQDQ t1, t2; \
+ PUNPCKHQDQ t2, v3
+
+#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \
+ MOVO v4, t1; \
+ MOVO v5, v4; \
+ MOVO t1, v5; \
+ MOVO v2, t1; \
+ PUNPCKLQDQ v2, t2; \
+ PUNPCKHQDQ v3, v2; \
+ PUNPCKHQDQ t2, v2; \
+ PUNPCKLQDQ v3, t2; \
+ MOVO t1, v3; \
+ MOVO v6, t1; \
+ PUNPCKHQDQ t2, v3; \
+ PUNPCKLQDQ v7, t2; \
+ PUNPCKHQDQ t2, v6; \
+ PUNPCKLQDQ t1, t2; \
+ PUNPCKHQDQ t2, v7
+
+#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, t0, c40, c48) \
+ MOVO v0, t0; \
+ PMULULQ v2, t0; \
+ PADDQ v2, v0; \
+ PADDQ t0, v0; \
+ PADDQ t0, v0; \
+ PXOR v0, v6; \
+ PSHUFD $0xB1, v6, v6; \
+ MOVO v4, t0; \
+ PMULULQ v6, t0; \
+ PADDQ v6, v4; \
+ PADDQ t0, v4; \
+ PADDQ t0, v4; \
+ PXOR v4, v2; \
+ PSHUFB c40, v2; \
+ MOVO v0, t0; \
+ PMULULQ v2, t0; \
+ PADDQ v2, v0; \
+ PADDQ t0, v0; \
+ PADDQ t0, v0; \
+ PXOR v0, v6; \
+ PSHUFB c48, v6; \
+ MOVO v4, t0; \
+ PMULULQ v6, t0; \
+ PADDQ v6, v4; \
+ PADDQ t0, v4; \
+ PADDQ t0, v4; \
+ PXOR v4, v2; \
+ MOVO v2, t0; \
+ PADDQ v2, t0; \
+ PSRLQ $63, v2; \
+ PXOR t0, v2; \
+ MOVO v1, t0; \
+ PMULULQ v3, t0; \
+ PADDQ v3, v1; \
+ PADDQ t0, v1; \
+ PADDQ t0, v1; \
+ PXOR v1, v7; \
+ PSHUFD $0xB1, v7, v7; \
+ MOVO v5, t0; \
+ PMULULQ v7, t0; \
+ PADDQ v7, v5; \
+ PADDQ t0, v5; \
+ PADDQ t0, v5; \
+ PXOR v5, v3; \
+ PSHUFB c40, v3; \
+ MOVO v1, t0; \
+ PMULULQ v3, t0; \
+ PADDQ v3, v1; \
+ PADDQ t0, v1; \
+ PADDQ t0, v1; \
+ PXOR v1, v7; \
+ PSHUFB c48, v7; \
+ MOVO v5, t0; \
+ PMULULQ v7, t0; \
+ PADDQ v7, v5; \
+ PADDQ t0, v5; \
+ PADDQ t0, v5; \
+ PXOR v5, v3; \
+ MOVO v3, t0; \
+ PADDQ v3, t0; \
+ PSRLQ $63, v3; \
+ PXOR t0, v3
+
+#define LOAD_MSG_0(block, off) \
+ MOVOU 8*(off+0)(block), X0; \
+ MOVOU 8*(off+2)(block), X1; \
+ MOVOU 8*(off+4)(block), X2; \
+ MOVOU 8*(off+6)(block), X3; \
+ MOVOU 8*(off+8)(block), X4; \
+ MOVOU 8*(off+10)(block), X5; \
+ MOVOU 8*(off+12)(block), X6; \
+ MOVOU 8*(off+14)(block), X7
+
+#define STORE_MSG_0(block, off) \
+ MOVOU X0, 8*(off+0)(block); \
+ MOVOU X1, 8*(off+2)(block); \
+ MOVOU X2, 8*(off+4)(block); \
+ MOVOU X3, 8*(off+6)(block); \
+ MOVOU X4, 8*(off+8)(block); \
+ MOVOU X5, 8*(off+10)(block); \
+ MOVOU X6, 8*(off+12)(block); \
+ MOVOU X7, 8*(off+14)(block)
+
+#define LOAD_MSG_1(block, off) \
+ MOVOU 8*off+0*8(block), X0; \
+ MOVOU 8*off+16*8(block), X1; \
+ MOVOU 8*off+32*8(block), X2; \
+ MOVOU 8*off+48*8(block), X3; \
+ MOVOU 8*off+64*8(block), X4; \
+ MOVOU 8*off+80*8(block), X5; \
+ MOVOU 8*off+96*8(block), X6; \
+ MOVOU 8*off+112*8(block), X7
+
+#define STORE_MSG_1(block, off) \
+ MOVOU X0, 8*off+0*8(block); \
+ MOVOU X1, 8*off+16*8(block); \
+ MOVOU X2, 8*off+32*8(block); \
+ MOVOU X3, 8*off+48*8(block); \
+ MOVOU X4, 8*off+64*8(block); \
+ MOVOU X5, 8*off+80*8(block); \
+ MOVOU X6, 8*off+96*8(block); \
+ MOVOU X7, 8*off+112*8(block)
+
+#define BLAMKA_ROUND_0(block, off, t0, t1, c40, c48) \
+ LOAD_MSG_0(block, off); \
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
+ SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \
+ STORE_MSG_0(block, off)
+
+#define BLAMKA_ROUND_1(block, off, t0, t1, c40, c48) \
+ LOAD_MSG_1(block, off); \
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
+ SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \
+ STORE_MSG_1(block, off)
+
+// func blamkaSSE4(b *block)
+TEXT ·blamkaSSE4(SB), 4, $0-8
+ MOVQ b+0(FP), AX
+
+ MOVOU ·c40<>(SB), X10
+ MOVOU ·c48<>(SB), X11
+
+ BLAMKA_ROUND_0(AX, 0, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 16, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 32, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 48, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 64, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 80, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 96, X8, X9, X10, X11)
+ BLAMKA_ROUND_0(AX, 112, X8, X9, X10, X11)
+
+ BLAMKA_ROUND_1(AX, 0, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 2, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 4, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 6, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 8, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 10, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 12, X8, X9, X10, X11)
+ BLAMKA_ROUND_1(AX, 14, X8, X9, X10, X11)
+ RET
+
+// func mixBlocksSSE2(out, a, b, c *block)
+TEXT ·mixBlocksSSE2(SB), 4, $0-32
+ MOVQ out+0(FP), DX
+ MOVQ a+8(FP), AX
+ MOVQ b+16(FP), BX
+ MOVQ a+24(FP), CX
+ MOVQ $128, BP
+
+loop:
+ MOVOU 0(AX), X0
+ MOVOU 0(BX), X1
+ MOVOU 0(CX), X2
+ PXOR X1, X0
+ PXOR X2, X0
+ MOVOU X0, 0(DX)
+ ADDQ $16, AX
+ ADDQ $16, BX
+ ADDQ $16, CX
+ ADDQ $16, DX
+ SUBQ $2, BP
+ JA loop
+ RET
+
+// func xorBlocksSSE2(out, a, b, c *block)
+TEXT ·xorBlocksSSE2(SB), 4, $0-32
+ MOVQ out+0(FP), DX
+ MOVQ a+8(FP), AX
+ MOVQ b+16(FP), BX
+ MOVQ a+24(FP), CX
+ MOVQ $128, BP
+
+loop:
+ MOVOU 0(AX), X0
+ MOVOU 0(BX), X1
+ MOVOU 0(CX), X2
+ MOVOU 0(DX), X3
+ PXOR X1, X0
+ PXOR X2, X0
+ PXOR X3, X0
+ MOVOU X0, 0(DX)
+ ADDQ $16, AX
+ ADDQ $16, BX
+ ADDQ $16, CX
+ ADDQ $16, DX
+ SUBQ $2, BP
+ JA loop
+ RET
diff --git a/vendor/golang.org/x/crypto/argon2/blamka_generic.go b/vendor/golang.org/x/crypto/argon2/blamka_generic.go
new file mode 100644
index 00000000..a481b224
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/blamka_generic.go
@@ -0,0 +1,163 @@
+// 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 argon2
+
+var useSSE4 bool
+
+func processBlockGeneric(out, in1, in2 *block, xor bool) {
+ var t block
+ for i := range t {
+ t[i] = in1[i] ^ in2[i]
+ }
+ for i := 0; i < blockLength; i += 16 {
+ blamkaGeneric(
+ &t[i+0], &t[i+1], &t[i+2], &t[i+3],
+ &t[i+4], &t[i+5], &t[i+6], &t[i+7],
+ &t[i+8], &t[i+9], &t[i+10], &t[i+11],
+ &t[i+12], &t[i+13], &t[i+14], &t[i+15],
+ )
+ }
+ for i := 0; i < blockLength/8; i += 2 {
+ blamkaGeneric(
+ &t[i], &t[i+1], &t[16+i], &t[16+i+1],
+ &t[32+i], &t[32+i+1], &t[48+i], &t[48+i+1],
+ &t[64+i], &t[64+i+1], &t[80+i], &t[80+i+1],
+ &t[96+i], &t[96+i+1], &t[112+i], &t[112+i+1],
+ )
+ }
+ if xor {
+ for i := range t {
+ out[i] ^= in1[i] ^ in2[i] ^ t[i]
+ }
+ } else {
+ for i := range t {
+ out[i] = in1[i] ^ in2[i] ^ t[i]
+ }
+ }
+}
+
+func blamkaGeneric(t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15 *uint64) {
+ v00, v01, v02, v03 := *t00, *t01, *t02, *t03
+ v04, v05, v06, v07 := *t04, *t05, *t06, *t07
+ v08, v09, v10, v11 := *t08, *t09, *t10, *t11
+ v12, v13, v14, v15 := *t12, *t13, *t14, *t15
+
+ v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
+ v12 ^= v00
+ v12 = v12>>32 | v12<<32
+ v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
+ v04 ^= v08
+ v04 = v04>>24 | v04<<40
+
+ v00 += v04 + 2*uint64(uint32(v00))*uint64(uint32(v04))
+ v12 ^= v00
+ v12 = v12>>16 | v12<<48
+ v08 += v12 + 2*uint64(uint32(v08))*uint64(uint32(v12))
+ v04 ^= v08
+ v04 = v04>>63 | v04<<1
+
+ v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
+ v13 ^= v01
+ v13 = v13>>32 | v13<<32
+ v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
+ v05 ^= v09
+ v05 = v05>>24 | v05<<40
+
+ v01 += v05 + 2*uint64(uint32(v01))*uint64(uint32(v05))
+ v13 ^= v01
+ v13 = v13>>16 | v13<<48
+ v09 += v13 + 2*uint64(uint32(v09))*uint64(uint32(v13))
+ v05 ^= v09
+ v05 = v05>>63 | v05<<1
+
+ v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
+ v14 ^= v02
+ v14 = v14>>32 | v14<<32
+ v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
+ v06 ^= v10
+ v06 = v06>>24 | v06<<40
+
+ v02 += v06 + 2*uint64(uint32(v02))*uint64(uint32(v06))
+ v14 ^= v02
+ v14 = v14>>16 | v14<<48
+ v10 += v14 + 2*uint64(uint32(v10))*uint64(uint32(v14))
+ v06 ^= v10
+ v06 = v06>>63 | v06<<1
+
+ v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
+ v15 ^= v03
+ v15 = v15>>32 | v15<<32
+ v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
+ v07 ^= v11
+ v07 = v07>>24 | v07<<40
+
+ v03 += v07 + 2*uint64(uint32(v03))*uint64(uint32(v07))
+ v15 ^= v03
+ v15 = v15>>16 | v15<<48
+ v11 += v15 + 2*uint64(uint32(v11))*uint64(uint32(v15))
+ v07 ^= v11
+ v07 = v07>>63 | v07<<1
+
+ v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
+ v15 ^= v00
+ v15 = v15>>32 | v15<<32
+ v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
+ v05 ^= v10
+ v05 = v05>>24 | v05<<40
+
+ v00 += v05 + 2*uint64(uint32(v00))*uint64(uint32(v05))
+ v15 ^= v00
+ v15 = v15>>16 | v15<<48
+ v10 += v15 + 2*uint64(uint32(v10))*uint64(uint32(v15))
+ v05 ^= v10
+ v05 = v05>>63 | v05<<1
+
+ v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
+ v12 ^= v01
+ v12 = v12>>32 | v12<<32
+ v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
+ v06 ^= v11
+ v06 = v06>>24 | v06<<40
+
+ v01 += v06 + 2*uint64(uint32(v01))*uint64(uint32(v06))
+ v12 ^= v01
+ v12 = v12>>16 | v12<<48
+ v11 += v12 + 2*uint64(uint32(v11))*uint64(uint32(v12))
+ v06 ^= v11
+ v06 = v06>>63 | v06<<1
+
+ v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
+ v13 ^= v02
+ v13 = v13>>32 | v13<<32
+ v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
+ v07 ^= v08
+ v07 = v07>>24 | v07<<40
+
+ v02 += v07 + 2*uint64(uint32(v02))*uint64(uint32(v07))
+ v13 ^= v02
+ v13 = v13>>16 | v13<<48
+ v08 += v13 + 2*uint64(uint32(v08))*uint64(uint32(v13))
+ v07 ^= v08
+ v07 = v07>>63 | v07<<1
+
+ v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
+ v14 ^= v03
+ v14 = v14>>32 | v14<<32
+ v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
+ v04 ^= v09
+ v04 = v04>>24 | v04<<40
+
+ v03 += v04 + 2*uint64(uint32(v03))*uint64(uint32(v04))
+ v14 ^= v03
+ v14 = v14>>16 | v14<<48
+ v09 += v14 + 2*uint64(uint32(v09))*uint64(uint32(v14))
+ v04 ^= v09
+ v04 = v04>>63 | v04<<1
+
+ *t00, *t01, *t02, *t03 = v00, v01, v02, v03
+ *t04, *t05, *t06, *t07 = v04, v05, v06, v07
+ *t08, *t09, *t10, *t11 = v08, v09, v10, v11
+ *t12, *t13, *t14, *t15 = v12, v13, v14, v15
+}
diff --git a/vendor/golang.org/x/crypto/argon2/blamka_ref.go b/vendor/golang.org/x/crypto/argon2/blamka_ref.go
new file mode 100644
index 00000000..167c59d2
--- /dev/null
+++ b/vendor/golang.org/x/crypto/argon2/blamka_ref.go
@@ -0,0 +1,16 @@
+// 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 !amd64 || purego || !gc
+// +build !amd64 purego !gc
+
+package argon2
+
+func processBlock(out, in1, in2 *block) {
+ processBlockGeneric(out, in1, in2, false)
+}
+
+func processBlockXOR(out, in1, in2 *block) {
+ processBlockGeneric(out, in1, in2, true)
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b.go b/vendor/golang.org/x/crypto/blake2b/blake2b.go
new file mode 100644
index 00000000..d2e98d42
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2b.go
@@ -0,0 +1,291 @@
+// 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 blake2b implements the BLAKE2b hash algorithm defined by RFC 7693
+// and the extendable output function (XOF) BLAKE2Xb.
+//
+// BLAKE2b is optimized for 64-bit platforms—including NEON-enabled ARMs—and
+// produces digests of any size between 1 and 64 bytes.
+// For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf
+// and for BLAKE2Xb see https://blake2.net/blake2x.pdf
+//
+// If you aren't sure which function you need, use BLAKE2b (Sum512 or New512).
+// If you need a secret-key MAC (message authentication code), use the New512
+// function with a non-nil key.
+//
+// BLAKE2X is a construction to compute hash values larger than 64 bytes. It
+// can produce hash values between 0 and 4 GiB.
+package blake2b
+
+import (
+ "encoding/binary"
+ "errors"
+ "hash"
+)
+
+const (
+ // The blocksize of BLAKE2b in bytes.
+ BlockSize = 128
+ // The hash size of BLAKE2b-512 in bytes.
+ Size = 64
+ // The hash size of BLAKE2b-384 in bytes.
+ Size384 = 48
+ // The hash size of BLAKE2b-256 in bytes.
+ Size256 = 32
+)
+
+var (
+ useAVX2 bool
+ useAVX bool
+ useSSE4 bool
+)
+
+var (
+ errKeySize = errors.New("blake2b: invalid key size")
+ errHashSize = errors.New("blake2b: invalid hash size")
+)
+
+var iv = [8]uint64{
+ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
+ 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179,
+}
+
+// Sum512 returns the BLAKE2b-512 checksum of the data.
+func Sum512(data []byte) [Size]byte {
+ var sum [Size]byte
+ checkSum(&sum, Size, data)
+ return sum
+}
+
+// Sum384 returns the BLAKE2b-384 checksum of the data.
+func Sum384(data []byte) [Size384]byte {
+ var sum [Size]byte
+ var sum384 [Size384]byte
+ checkSum(&sum, Size384, data)
+ copy(sum384[:], sum[:Size384])
+ return sum384
+}
+
+// Sum256 returns the BLAKE2b-256 checksum of the data.
+func Sum256(data []byte) [Size256]byte {
+ var sum [Size]byte
+ var sum256 [Size256]byte
+ checkSum(&sum, Size256, data)
+ copy(sum256[:], sum[:Size256])
+ return sum256
+}
+
+// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil
+// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
+func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) }
+
+// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil
+// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
+func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) }
+
+// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil
+// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
+func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) }
+
+// New returns a new hash.Hash computing the BLAKE2b checksum with a custom length.
+// A non-nil key turns the hash into a MAC. The key must be between zero and 64 bytes long.
+// The hash size can be a value between 1 and 64 but it is highly recommended to use
+// values equal or greater than:
+// - 32 if BLAKE2b is used as a hash function (The key is zero bytes long).
+// - 16 if BLAKE2b is used as a MAC function (The key is at least 16 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 New(size int, key []byte) (hash.Hash, error) { return newDigest(size, key) }
+
+func newDigest(hashSize int, key []byte) (*digest, error) {
+ if hashSize < 1 || hashSize > Size {
+ return nil, errHashSize
+ }
+ 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) {
+ h := iv
+ h[0] ^= uint64(hashSize) | (1 << 16) | (1 << 24)
+ var c [2]uint64
+
+ 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 := uint64(BlockSize - offset)
+ if c[0] < remaining {
+ c[1]--
+ }
+ c[0] -= remaining
+
+ hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
+
+ for i, v := range h[:(hashSize+7)/8] {
+ binary.LittleEndian.PutUint64(sum[8*i:], v)
+ }
+}
+
+type digest struct {
+ h [8]uint64
+ c [2]uint64
+ size int
+ block [BlockSize]byte
+ offset int
+
+ key [BlockSize]byte
+ keyLen int
+}
+
+const (
+ magic = "b2b"
+ marshaledSize = len(magic) + 8*8 + 2*8 + 1 + BlockSize + 1
+)
+
+func (d *digest) MarshalBinary() ([]byte, error) {
+ if d.keyLen != 0 {
+ return nil, errors.New("crypto/blake2b: cannot marshal MACs")
+ }
+ b := make([]byte, 0, marshaledSize)
+ b = append(b, magic...)
+ for i := 0; i < 8; i++ {
+ b = appendUint64(b, d.h[i])
+ }
+ b = appendUint64(b, d.c[0])
+ b = appendUint64(b, d.c[1])
+ // Maximum value for size is 64
+ 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/blake2b: invalid hash state identifier")
+ }
+ if len(b) != marshaledSize {
+ return errors.New("crypto/blake2b: invalid hash state size")
+ }
+ b = b[len(magic):]
+ for i := 0; i < 8; i++ {
+ b, d.h[i] = consumeUint64(b)
+ }
+ b, d.c[0] = consumeUint64(b)
+ b, d.c[1] = consumeUint64(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] ^= uint64(d.size) | (uint64(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:]
+ }
+
+ if len(p) > 0 {
+ 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
+ copy(block[:], d.block[:d.offset])
+ remaining := uint64(BlockSize - d.offset)
+
+ c := d.c
+ if c[0] < remaining {
+ c[1]--
+ }
+ c[0] -= remaining
+
+ h := d.h
+ hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:])
+
+ for i, v := range h {
+ binary.LittleEndian.PutUint64(hash[8*i:], v)
+ }
+}
+
+func appendUint64(b []byte, x uint64) []byte {
+ var a [8]byte
+ binary.BigEndian.PutUint64(a[:], x)
+ return append(b, a[:]...)
+}
+
+func appendUint32(b []byte, x uint32) []byte {
+ var a [4]byte
+ binary.BigEndian.PutUint32(a[:], x)
+ return append(b, a[:]...)
+}
+
+func consumeUint64(b []byte) ([]byte, uint64) {
+ x := binary.BigEndian.Uint64(b)
+ return b[8:], x
+}
+
+func consumeUint32(b []byte) ([]byte, uint32) {
+ x := binary.BigEndian.Uint32(b)
+ return b[4:], x
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go
new file mode 100644
index 00000000..56bfaaa1
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_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 go1.7 && amd64 && gc && !purego
+// +build go1.7,amd64,gc,!purego
+
+package blake2b
+
+import "golang.org/x/sys/cpu"
+
+func init() {
+ useAVX2 = cpu.X86.HasAVX2
+ useAVX = cpu.X86.HasAVX
+ useSSE4 = cpu.X86.HasSSE41
+}
+
+//go:noescape
+func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+
+//go:noescape
+func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+
+//go:noescape
+func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+
+func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
+ switch {
+ case useAVX2:
+ hashBlocksAVX2(h, c, flag, blocks)
+ case useAVX:
+ hashBlocksAVX(h, c, flag, blocks)
+ case useSSE4:
+ hashBlocksSSE4(h, c, flag, blocks)
+ default:
+ hashBlocksGeneric(h, c, flag, blocks)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s
new file mode 100644
index 00000000..4b9daa18
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s
@@ -0,0 +1,745 @@
+// 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.7 && amd64 && gc && !purego
+// +build go1.7,amd64,gc,!purego
+
+#include "textflag.h"
+
+DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908
+DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
+DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b
+DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1
+GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32
+
+DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1
+DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
+DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b
+DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179
+GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32
+
+DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403
+DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
+DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403
+DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b
+GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32
+
+DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302
+DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
+DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302
+DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a
+GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32
+
+DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908
+DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
+GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16
+
+DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b
+DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1
+GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16
+
+DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1
+DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
+GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16
+
+DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b
+DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179
+GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16
+
+DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403
+DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
+GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16
+
+DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302
+DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
+GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16
+
+#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39
+#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93
+#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e
+#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93
+#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39
+
+#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \
+ VPADDQ m0, Y0, Y0; \
+ VPADDQ Y1, Y0, Y0; \
+ VPXOR Y0, Y3, Y3; \
+ VPSHUFD $-79, Y3, Y3; \
+ VPADDQ Y3, Y2, Y2; \
+ VPXOR Y2, Y1, Y1; \
+ VPSHUFB c40, Y1, Y1; \
+ VPADDQ m1, Y0, Y0; \
+ VPADDQ Y1, Y0, Y0; \
+ VPXOR Y0, Y3, Y3; \
+ VPSHUFB c48, Y3, Y3; \
+ VPADDQ Y3, Y2, Y2; \
+ VPXOR Y2, Y1, Y1; \
+ VPADDQ Y1, Y1, t; \
+ VPSRLQ $63, Y1, Y1; \
+ VPXOR t, Y1, Y1; \
+ VPERMQ_0x39_Y1_Y1; \
+ VPERMQ_0x4E_Y2_Y2; \
+ VPERMQ_0x93_Y3_Y3; \
+ VPADDQ m2, Y0, Y0; \
+ VPADDQ Y1, Y0, Y0; \
+ VPXOR Y0, Y3, Y3; \
+ VPSHUFD $-79, Y3, Y3; \
+ VPADDQ Y3, Y2, Y2; \
+ VPXOR Y2, Y1, Y1; \
+ VPSHUFB c40, Y1, Y1; \
+ VPADDQ m3, Y0, Y0; \
+ VPADDQ Y1, Y0, Y0; \
+ VPXOR Y0, Y3, Y3; \
+ VPSHUFB c48, Y3, Y3; \
+ VPADDQ Y3, Y2, Y2; \
+ VPXOR Y2, Y1, Y1; \
+ VPADDQ Y1, Y1, t; \
+ VPSRLQ $63, Y1, Y1; \
+ VPXOR t, Y1, Y1; \
+ VPERMQ_0x39_Y3_Y3; \
+ VPERMQ_0x4E_Y2_Y2; \
+ VPERMQ_0x93_Y1_Y1
+
+#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E
+#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26
+#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E
+#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36
+#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E
+
+#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n
+#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n
+#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n
+#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n
+#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n
+
+#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01
+#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01
+#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01
+#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01
+#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01
+
+#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01
+#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01
+#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01
+#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01
+#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01
+
+#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8
+#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01
+
+// load msg: Y12 = (i0, i1, i2, i3)
+// i0, i1, i2, i3 must not be 0
+#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \
+ VMOVQ_SI_X12(i0*8); \
+ VMOVQ_SI_X11(i2*8); \
+ VPINSRQ_1_SI_X12(i1*8); \
+ VPINSRQ_1_SI_X11(i3*8); \
+ VINSERTI128 $1, X11, Y12, Y12
+
+// load msg: Y13 = (i0, i1, i2, i3)
+// i0, i1, i2, i3 must not be 0
+#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \
+ VMOVQ_SI_X13(i0*8); \
+ VMOVQ_SI_X11(i2*8); \
+ VPINSRQ_1_SI_X13(i1*8); \
+ VPINSRQ_1_SI_X11(i3*8); \
+ VINSERTI128 $1, X11, Y13, Y13
+
+// load msg: Y14 = (i0, i1, i2, i3)
+// i0, i1, i2, i3 must not be 0
+#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \
+ VMOVQ_SI_X14(i0*8); \
+ VMOVQ_SI_X11(i2*8); \
+ VPINSRQ_1_SI_X14(i1*8); \
+ VPINSRQ_1_SI_X11(i3*8); \
+ VINSERTI128 $1, X11, Y14, Y14
+
+// load msg: Y15 = (i0, i1, i2, i3)
+// i0, i1, i2, i3 must not be 0
+#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \
+ VMOVQ_SI_X15(i0*8); \
+ VMOVQ_SI_X11(i2*8); \
+ VPINSRQ_1_SI_X15(i1*8); \
+ VPINSRQ_1_SI_X11(i3*8); \
+ VINSERTI128 $1, X11, Y15, Y15
+
+#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \
+ VMOVQ_SI_X12_0; \
+ VMOVQ_SI_X11(4*8); \
+ VPINSRQ_1_SI_X12(2*8); \
+ VPINSRQ_1_SI_X11(6*8); \
+ VINSERTI128 $1, X11, Y12, Y12; \
+ LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \
+ LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \
+ LOAD_MSG_AVX2_Y15(9, 11, 13, 15)
+
+#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \
+ LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \
+ LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \
+ VMOVQ_SI_X11(11*8); \
+ VPSHUFD $0x4E, 0*8(SI), X14; \
+ VPINSRQ_1_SI_X11(5*8); \
+ VINSERTI128 $1, X11, Y14, Y14; \
+ LOAD_MSG_AVX2_Y15(12, 2, 7, 3)
+
+#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \
+ VMOVQ_SI_X11(5*8); \
+ VMOVDQU 11*8(SI), X12; \
+ VPINSRQ_1_SI_X11(15*8); \
+ VINSERTI128 $1, X11, Y12, Y12; \
+ VMOVQ_SI_X13(8*8); \
+ VMOVQ_SI_X11(2*8); \
+ VPINSRQ_1_SI_X13_0; \
+ VPINSRQ_1_SI_X11(13*8); \
+ VINSERTI128 $1, X11, Y13, Y13; \
+ LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \
+ LOAD_MSG_AVX2_Y15(14, 6, 1, 4)
+
+#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \
+ LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \
+ LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \
+ LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \
+ VMOVQ_SI_X15(6*8); \
+ VMOVQ_SI_X11_0; \
+ VPINSRQ_1_SI_X15(10*8); \
+ VPINSRQ_1_SI_X11(8*8); \
+ VINSERTI128 $1, X11, Y15, Y15
+
+#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \
+ LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \
+ VMOVQ_SI_X13_0; \
+ VMOVQ_SI_X11(4*8); \
+ VPINSRQ_1_SI_X13(7*8); \
+ VPINSRQ_1_SI_X11(15*8); \
+ VINSERTI128 $1, X11, Y13, Y13; \
+ LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \
+ LOAD_MSG_AVX2_Y15(1, 12, 8, 13)
+
+#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \
+ VMOVQ_SI_X12(2*8); \
+ VMOVQ_SI_X11_0; \
+ VPINSRQ_1_SI_X12(6*8); \
+ VPINSRQ_1_SI_X11(8*8); \
+ VINSERTI128 $1, X11, Y12, Y12; \
+ LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \
+ LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \
+ LOAD_MSG_AVX2_Y15(13, 5, 14, 9)
+
+#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \
+ LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \
+ LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \
+ VMOVQ_SI_X14_0; \
+ VPSHUFD $0x4E, 8*8(SI), X11; \
+ VPINSRQ_1_SI_X14(6*8); \
+ VINSERTI128 $1, X11, Y14, Y14; \
+ LOAD_MSG_AVX2_Y15(7, 3, 2, 11)
+
+#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \
+ LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \
+ LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \
+ LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \
+ VMOVQ_SI_X15_0; \
+ VMOVQ_SI_X11(6*8); \
+ VPINSRQ_1_SI_X15(4*8); \
+ VPINSRQ_1_SI_X11(10*8); \
+ VINSERTI128 $1, X11, Y15, Y15
+
+#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \
+ VMOVQ_SI_X12(6*8); \
+ VMOVQ_SI_X11(11*8); \
+ VPINSRQ_1_SI_X12(14*8); \
+ VPINSRQ_1_SI_X11_0; \
+ VINSERTI128 $1, X11, Y12, Y12; \
+ LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \
+ VMOVQ_SI_X11(1*8); \
+ VMOVDQU 12*8(SI), X14; \
+ VPINSRQ_1_SI_X11(10*8); \
+ VINSERTI128 $1, X11, Y14, Y14; \
+ VMOVQ_SI_X15(2*8); \
+ VMOVDQU 4*8(SI), X11; \
+ VPINSRQ_1_SI_X15(7*8); \
+ VINSERTI128 $1, X11, Y15, Y15
+
+#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \
+ LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \
+ VMOVQ_SI_X13(2*8); \
+ VPSHUFD $0x4E, 5*8(SI), X11; \
+ VPINSRQ_1_SI_X13(4*8); \
+ VINSERTI128 $1, X11, Y13, Y13; \
+ LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \
+ VMOVQ_SI_X15(11*8); \
+ VMOVQ_SI_X11(12*8); \
+ VPINSRQ_1_SI_X15(14*8); \
+ VPINSRQ_1_SI_X11_0; \
+ VINSERTI128 $1, X11, Y15, Y15
+
+// func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment
+ MOVQ h+0(FP), AX
+ MOVQ c+8(FP), BX
+ MOVQ flag+16(FP), CX
+ MOVQ blocks_base+24(FP), SI
+ MOVQ blocks_len+32(FP), DI
+
+ MOVQ SP, DX
+ ADDQ $31, DX
+ ANDQ $~31, DX
+
+ MOVQ CX, 16(DX)
+ XORQ CX, CX
+ MOVQ CX, 24(DX)
+
+ VMOVDQU ·AVX2_c40<>(SB), Y4
+ VMOVDQU ·AVX2_c48<>(SB), Y5
+
+ VMOVDQU 0(AX), Y8
+ VMOVDQU 32(AX), Y9
+ VMOVDQU ·AVX2_iv0<>(SB), Y6
+ VMOVDQU ·AVX2_iv1<>(SB), Y7
+
+ MOVQ 0(BX), R8
+ MOVQ 8(BX), R9
+ MOVQ R9, 8(DX)
+
+loop:
+ ADDQ $128, R8
+ MOVQ R8, 0(DX)
+ CMPQ R8, $128
+ JGE noinc
+ INCQ R9
+ MOVQ R9, 8(DX)
+
+noinc:
+ VMOVDQA Y8, Y0
+ VMOVDQA Y9, Y1
+ VMOVDQA Y6, Y2
+ VPXOR 0(DX), Y7, Y3
+
+ LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15()
+ VMOVDQA Y12, 32(DX)
+ VMOVDQA Y13, 64(DX)
+ VMOVDQA Y14, 96(DX)
+ VMOVDQA Y15, 128(DX)
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3()
+ VMOVDQA Y12, 160(DX)
+ VMOVDQA Y13, 192(DX)
+ VMOVDQA Y14, 224(DX)
+ VMOVDQA Y15, 256(DX)
+
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+ LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0()
+ ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5)
+
+ ROUND_AVX2(32(DX), 64(DX), 96(DX), 128(DX), Y10, Y4, Y5)
+ ROUND_AVX2(160(DX), 192(DX), 224(DX), 256(DX), Y10, Y4, Y5)
+
+ VPXOR Y0, Y8, Y8
+ VPXOR Y1, Y9, Y9
+ VPXOR Y2, Y8, Y8
+ VPXOR Y3, Y9, Y9
+
+ LEAQ 128(SI), SI
+ SUBQ $128, DI
+ JNE loop
+
+ MOVQ R8, 0(BX)
+ MOVQ R9, 8(BX)
+
+ VMOVDQU Y8, 0(AX)
+ VMOVDQU Y9, 32(AX)
+ VZEROUPPER
+
+ RET
+
+#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA
+#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB
+#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF
+#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD
+#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE
+
+#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7
+#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF
+#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7
+#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF
+#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7
+#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7
+#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF
+#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF
+
+#define SHUFFLE_AVX() \
+ VMOVDQA X6, X13; \
+ VMOVDQA X2, X14; \
+ VMOVDQA X4, X6; \
+ VPUNPCKLQDQ_X13_X13_X15; \
+ VMOVDQA X5, X4; \
+ VMOVDQA X6, X5; \
+ VPUNPCKHQDQ_X15_X7_X6; \
+ VPUNPCKLQDQ_X7_X7_X15; \
+ VPUNPCKHQDQ_X15_X13_X7; \
+ VPUNPCKLQDQ_X3_X3_X15; \
+ VPUNPCKHQDQ_X15_X2_X2; \
+ VPUNPCKLQDQ_X14_X14_X15; \
+ VPUNPCKHQDQ_X15_X3_X3; \
+
+#define SHUFFLE_AVX_INV() \
+ VMOVDQA X2, X13; \
+ VMOVDQA X4, X14; \
+ VPUNPCKLQDQ_X2_X2_X15; \
+ VMOVDQA X5, X4; \
+ VPUNPCKHQDQ_X15_X3_X2; \
+ VMOVDQA X14, X5; \
+ VPUNPCKLQDQ_X3_X3_X15; \
+ VMOVDQA X6, X14; \
+ VPUNPCKHQDQ_X15_X13_X3; \
+ VPUNPCKLQDQ_X7_X7_X15; \
+ VPUNPCKHQDQ_X15_X6_X6; \
+ VPUNPCKLQDQ_X14_X14_X15; \
+ VPUNPCKHQDQ_X15_X7_X7; \
+
+#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \
+ VPADDQ m0, v0, v0; \
+ VPADDQ v2, v0, v0; \
+ VPADDQ m1, v1, v1; \
+ VPADDQ v3, v1, v1; \
+ VPXOR v0, v6, v6; \
+ VPXOR v1, v7, v7; \
+ VPSHUFD $-79, v6, v6; \
+ VPSHUFD $-79, v7, v7; \
+ VPADDQ v6, v4, v4; \
+ VPADDQ v7, v5, v5; \
+ VPXOR v4, v2, v2; \
+ VPXOR v5, v3, v3; \
+ VPSHUFB c40, v2, v2; \
+ VPSHUFB c40, v3, v3; \
+ VPADDQ m2, v0, v0; \
+ VPADDQ v2, v0, v0; \
+ VPADDQ m3, v1, v1; \
+ VPADDQ v3, v1, v1; \
+ VPXOR v0, v6, v6; \
+ VPXOR v1, v7, v7; \
+ VPSHUFB c48, v6, v6; \
+ VPSHUFB c48, v7, v7; \
+ VPADDQ v6, v4, v4; \
+ VPADDQ v7, v5, v5; \
+ VPXOR v4, v2, v2; \
+ VPXOR v5, v3, v3; \
+ VPADDQ v2, v2, t0; \
+ VPSRLQ $63, v2, v2; \
+ VPXOR t0, v2, v2; \
+ VPADDQ v3, v3, t0; \
+ VPSRLQ $63, v3, v3; \
+ VPXOR t0, v3, v3
+
+// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7)
+// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0
+#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \
+ VMOVQ_SI_X12(i0*8); \
+ VMOVQ_SI_X13(i2*8); \
+ VMOVQ_SI_X14(i4*8); \
+ VMOVQ_SI_X15(i6*8); \
+ VPINSRQ_1_SI_X12(i1*8); \
+ VPINSRQ_1_SI_X13(i3*8); \
+ VPINSRQ_1_SI_X14(i5*8); \
+ VPINSRQ_1_SI_X15(i7*8)
+
+// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7)
+#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \
+ VMOVQ_SI_X12_0; \
+ VMOVQ_SI_X13(4*8); \
+ VMOVQ_SI_X14(1*8); \
+ VMOVQ_SI_X15(5*8); \
+ VPINSRQ_1_SI_X12(2*8); \
+ VPINSRQ_1_SI_X13(6*8); \
+ VPINSRQ_1_SI_X14(3*8); \
+ VPINSRQ_1_SI_X15(7*8)
+
+// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3)
+#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \
+ VPSHUFD $0x4E, 0*8(SI), X12; \
+ VMOVQ_SI_X13(11*8); \
+ VMOVQ_SI_X14(12*8); \
+ VMOVQ_SI_X15(7*8); \
+ VPINSRQ_1_SI_X13(5*8); \
+ VPINSRQ_1_SI_X14(2*8); \
+ VPINSRQ_1_SI_X15(3*8)
+
+// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13)
+#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \
+ VMOVDQU 11*8(SI), X12; \
+ VMOVQ_SI_X13(5*8); \
+ VMOVQ_SI_X14(8*8); \
+ VMOVQ_SI_X15(2*8); \
+ VPINSRQ_1_SI_X13(15*8); \
+ VPINSRQ_1_SI_X14_0; \
+ VPINSRQ_1_SI_X15(13*8)
+
+// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8)
+#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \
+ VMOVQ_SI_X12(2*8); \
+ VMOVQ_SI_X13(4*8); \
+ VMOVQ_SI_X14(6*8); \
+ VMOVQ_SI_X15_0; \
+ VPINSRQ_1_SI_X12(5*8); \
+ VPINSRQ_1_SI_X13(15*8); \
+ VPINSRQ_1_SI_X14(10*8); \
+ VPINSRQ_1_SI_X15(8*8)
+
+// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15)
+#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \
+ VMOVQ_SI_X12(9*8); \
+ VMOVQ_SI_X13(2*8); \
+ VMOVQ_SI_X14_0; \
+ VMOVQ_SI_X15(4*8); \
+ VPINSRQ_1_SI_X12(5*8); \
+ VPINSRQ_1_SI_X13(10*8); \
+ VPINSRQ_1_SI_X14(7*8); \
+ VPINSRQ_1_SI_X15(15*8)
+
+// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3)
+#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \
+ VMOVQ_SI_X12(2*8); \
+ VMOVQ_SI_X13_0; \
+ VMOVQ_SI_X14(12*8); \
+ VMOVQ_SI_X15(11*8); \
+ VPINSRQ_1_SI_X12(6*8); \
+ VPINSRQ_1_SI_X13(8*8); \
+ VPINSRQ_1_SI_X14(10*8); \
+ VPINSRQ_1_SI_X15(3*8)
+
+// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11)
+#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \
+ MOVQ 0*8(SI), X12; \
+ VPSHUFD $0x4E, 8*8(SI), X13; \
+ MOVQ 7*8(SI), X14; \
+ MOVQ 2*8(SI), X15; \
+ VPINSRQ_1_SI_X12(6*8); \
+ VPINSRQ_1_SI_X14(3*8); \
+ VPINSRQ_1_SI_X15(11*8)
+
+// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8)
+#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \
+ MOVQ 6*8(SI), X12; \
+ MOVQ 11*8(SI), X13; \
+ MOVQ 15*8(SI), X14; \
+ MOVQ 3*8(SI), X15; \
+ VPINSRQ_1_SI_X12(14*8); \
+ VPINSRQ_1_SI_X13_0; \
+ VPINSRQ_1_SI_X14(9*8); \
+ VPINSRQ_1_SI_X15(8*8)
+
+// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10)
+#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \
+ MOVQ 5*8(SI), X12; \
+ MOVQ 8*8(SI), X13; \
+ MOVQ 0*8(SI), X14; \
+ MOVQ 6*8(SI), X15; \
+ VPINSRQ_1_SI_X12(15*8); \
+ VPINSRQ_1_SI_X13(2*8); \
+ VPINSRQ_1_SI_X14(4*8); \
+ VPINSRQ_1_SI_X15(10*8)
+
+// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5)
+#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \
+ VMOVDQU 12*8(SI), X12; \
+ MOVQ 1*8(SI), X13; \
+ MOVQ 2*8(SI), X14; \
+ VPINSRQ_1_SI_X13(10*8); \
+ VPINSRQ_1_SI_X14(7*8); \
+ VMOVDQU 4*8(SI), X15
+
+// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0)
+#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \
+ MOVQ 15*8(SI), X12; \
+ MOVQ 3*8(SI), X13; \
+ MOVQ 11*8(SI), X14; \
+ MOVQ 12*8(SI), X15; \
+ VPINSRQ_1_SI_X12(9*8); \
+ VPINSRQ_1_SI_X13(13*8); \
+ VPINSRQ_1_SI_X14(14*8); \
+ VPINSRQ_1_SI_X15_0
+
+// func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment
+ MOVQ h+0(FP), AX
+ MOVQ c+8(FP), BX
+ MOVQ flag+16(FP), CX
+ MOVQ blocks_base+24(FP), SI
+ MOVQ blocks_len+32(FP), DI
+
+ MOVQ SP, R10
+ ADDQ $15, R10
+ ANDQ $~15, R10
+
+ VMOVDQU ·AVX_c40<>(SB), X0
+ VMOVDQU ·AVX_c48<>(SB), X1
+ VMOVDQA X0, X8
+ VMOVDQA X1, X9
+
+ VMOVDQU ·AVX_iv3<>(SB), X0
+ VMOVDQA X0, 0(R10)
+ XORQ CX, 0(R10) // 0(R10) = ·AVX_iv3 ^ (CX || 0)
+
+ VMOVDQU 0(AX), X10
+ VMOVDQU 16(AX), X11
+ VMOVDQU 32(AX), X2
+ VMOVDQU 48(AX), X3
+
+ MOVQ 0(BX), R8
+ MOVQ 8(BX), R9
+
+loop:
+ ADDQ $128, R8
+ CMPQ R8, $128
+ JGE noinc
+ INCQ R9
+
+noinc:
+ VMOVQ_R8_X15
+ VPINSRQ_1_R9_X15
+
+ VMOVDQA X10, X0
+ VMOVDQA X11, X1
+ VMOVDQU ·AVX_iv0<>(SB), X4
+ VMOVDQU ·AVX_iv1<>(SB), X5
+ VMOVDQU ·AVX_iv2<>(SB), X6
+
+ VPXOR X15, X6, X6
+ VMOVDQA 0(R10), X7
+
+ LOAD_MSG_AVX_0_2_4_6_1_3_5_7()
+ VMOVDQA X12, 16(R10)
+ VMOVDQA X13, 32(R10)
+ VMOVDQA X14, 48(R10)
+ VMOVDQA X15, 64(R10)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15)
+ VMOVDQA X12, 80(R10)
+ VMOVDQA X13, 96(R10)
+ VMOVDQA X14, 112(R10)
+ VMOVDQA X15, 128(R10)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6)
+ VMOVDQA X12, 144(R10)
+ VMOVDQA X13, 160(R10)
+ VMOVDQA X14, 176(R10)
+ VMOVDQA X15, 192(R10)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_1_0_11_5_12_2_7_3()
+ VMOVDQA X12, 208(R10)
+ VMOVDQA X13, 224(R10)
+ VMOVDQA X14, 240(R10)
+ VMOVDQA X15, 256(R10)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX_11_12_5_15_8_0_2_13()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_2_5_4_15_6_10_0_8()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX_9_5_2_10_0_7_4_15()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX_2_6_0_8_12_10_11_3()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_0_6_9_8_7_3_2_11()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_5_15_8_2_0_4_6_10()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX_6_14_11_0_15_9_3_8()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_12_13_1_10_2_7_4_5()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5)
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX()
+ LOAD_MSG_AVX_15_9_3_13_11_14_12_0()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X15, X8, X9)
+ SHUFFLE_AVX()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X15, X8, X9)
+ SHUFFLE_AVX()
+ HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X15, X8, X9)
+ SHUFFLE_AVX_INV()
+
+ VMOVDQU 32(AX), X14
+ VMOVDQU 48(AX), X15
+ VPXOR X0, X10, X10
+ VPXOR X1, X11, X11
+ VPXOR X2, X14, X14
+ VPXOR X3, X15, X15
+ VPXOR X4, X10, X10
+ VPXOR X5, X11, X11
+ VPXOR X6, X14, X2
+ VPXOR X7, X15, X3
+ VMOVDQU X2, 32(AX)
+ VMOVDQU X3, 48(AX)
+
+ LEAQ 128(SI), SI
+ SUBQ $128, DI
+ JNE loop
+
+ VMOVDQU X10, 0(AX)
+ VMOVDQU X11, 16(AX)
+
+ MOVQ R8, 0(BX)
+ MOVQ R9, 8(BX)
+ VZEROUPPER
+
+ RET
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go
new file mode 100644
index 00000000..5fa1b328
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go
@@ -0,0 +1,25 @@
+// 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.7 && amd64 && gc && !purego
+// +build !go1.7,amd64,gc,!purego
+
+package blake2b
+
+import "golang.org/x/sys/cpu"
+
+func init() {
+ useSSE4 = cpu.X86.HasSSE41
+}
+
+//go:noescape
+func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+
+func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
+ if useSSE4 {
+ hashBlocksSSE4(h, c, flag, blocks)
+ } else {
+ hashBlocksGeneric(h, c, flag, blocks)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s
new file mode 100644
index 00000000..ae75eb9a
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s
@@ -0,0 +1,279 @@
+// 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)/8, $0x6a09e667f3bcc908
+DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b
+GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16
+
+DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b
+DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1
+GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16
+
+DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1
+DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f
+GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16
+
+DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b
+DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179
+GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16
+
+DATA ·c40<>+0x00(SB)/8, $0x0201000706050403
+DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b
+GLOBL ·c40<>(SB), (NOPTR+RODATA), $16
+
+DATA ·c48<>+0x00(SB)/8, $0x0100070605040302
+DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a
+GLOBL ·c48<>(SB), (NOPTR+RODATA), $16
+
+#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \
+ MOVO v4, t1; \
+ MOVO v5, v4; \
+ MOVO t1, v5; \
+ MOVO v6, t1; \
+ PUNPCKLQDQ v6, t2; \
+ PUNPCKHQDQ v7, v6; \
+ PUNPCKHQDQ t2, v6; \
+ PUNPCKLQDQ v7, t2; \
+ MOVO t1, v7; \
+ MOVO v2, t1; \
+ PUNPCKHQDQ t2, v7; \
+ PUNPCKLQDQ v3, t2; \
+ PUNPCKHQDQ t2, v2; \
+ PUNPCKLQDQ t1, t2; \
+ PUNPCKHQDQ t2, v3
+
+#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \
+ MOVO v4, t1; \
+ MOVO v5, v4; \
+ MOVO t1, v5; \
+ MOVO v2, t1; \
+ PUNPCKLQDQ v2, t2; \
+ PUNPCKHQDQ v3, v2; \
+ PUNPCKHQDQ t2, v2; \
+ PUNPCKLQDQ v3, t2; \
+ MOVO t1, v3; \
+ MOVO v6, t1; \
+ PUNPCKHQDQ t2, v3; \
+ PUNPCKLQDQ v7, t2; \
+ PUNPCKHQDQ t2, v6; \
+ PUNPCKLQDQ t1, t2; \
+ PUNPCKHQDQ t2, v7
+
+#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \
+ PADDQ m0, v0; \
+ PADDQ m1, v1; \
+ PADDQ v2, v0; \
+ PADDQ v3, v1; \
+ PXOR v0, v6; \
+ PXOR v1, v7; \
+ PSHUFD $0xB1, v6, v6; \
+ PSHUFD $0xB1, v7, v7; \
+ PADDQ v6, v4; \
+ PADDQ v7, v5; \
+ PXOR v4, v2; \
+ PXOR v5, v3; \
+ PSHUFB c40, v2; \
+ PSHUFB c40, v3; \
+ PADDQ m2, v0; \
+ PADDQ m3, v1; \
+ PADDQ v2, v0; \
+ PADDQ v3, v1; \
+ PXOR v0, v6; \
+ PXOR v1, v7; \
+ PSHUFB c48, v6; \
+ PSHUFB c48, v7; \
+ PADDQ v6, v4; \
+ PADDQ v7, v5; \
+ PXOR v4, v2; \
+ PXOR v5, v3; \
+ MOVOU v2, t0; \
+ PADDQ v2, t0; \
+ PSRLQ $63, v2; \
+ PXOR t0, v2; \
+ MOVOU v3, t0; \
+ PADDQ v3, t0; \
+ PSRLQ $63, v3; \
+ PXOR t0, v3
+
+#define LOAD_MSG(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7) \
+ MOVQ i0*8(src), m0; \
+ PINSRQ $1, i1*8(src), m0; \
+ MOVQ i2*8(src), m1; \
+ PINSRQ $1, i3*8(src), m1; \
+ MOVQ i4*8(src), m2; \
+ PINSRQ $1, i5*8(src), m2; \
+ MOVQ i6*8(src), m3; \
+ PINSRQ $1, i7*8(src), m3
+
+// func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte)
+TEXT ·hashBlocksSSE4(SB), 4, $288-48 // frame size = 272 + 16 byte alignment
+ MOVQ h+0(FP), AX
+ MOVQ c+8(FP), BX
+ MOVQ flag+16(FP), CX
+ MOVQ blocks_base+24(FP), SI
+ MOVQ blocks_len+32(FP), DI
+
+ MOVQ SP, R10
+ ADDQ $15, R10
+ ANDQ $~15, R10
+
+ MOVOU ·iv3<>(SB), X0
+ MOVO X0, 0(R10)
+ XORQ CX, 0(R10) // 0(R10) = ·iv3 ^ (CX || 0)
+
+ MOVOU ·c40<>(SB), X13
+ MOVOU ·c48<>(SB), X14
+
+ MOVOU 0(AX), X12
+ MOVOU 16(AX), X15
+
+ MOVQ 0(BX), R8
+ MOVQ 8(BX), R9
+
+loop:
+ ADDQ $128, R8
+ CMPQ R8, $128
+ JGE noinc
+ INCQ R9
+
+noinc:
+ MOVQ R8, X8
+ PINSRQ $1, R9, X8
+
+ MOVO X12, X0
+ MOVO X15, X1
+ MOVOU 32(AX), X2
+ MOVOU 48(AX), X3
+ MOVOU ·iv0<>(SB), X4
+ MOVOU ·iv1<>(SB), X5
+ MOVOU ·iv2<>(SB), X6
+
+ PXOR X8, X6
+ MOVO 0(R10), X7
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7)
+ MOVO X8, 16(R10)
+ MOVO X9, 32(R10)
+ MOVO X10, 48(R10)
+ MOVO X11, 64(R10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15)
+ MOVO X8, 80(R10)
+ MOVO X9, 96(R10)
+ MOVO X10, 112(R10)
+ MOVO X11, 128(R10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6)
+ MOVO X8, 144(R10)
+ MOVO X9, 160(R10)
+ MOVO X10, 176(R10)
+ MOVO X11, 192(R10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3)
+ MOVO X8, 208(R10)
+ MOVO X9, 224(R10)
+ MOVO X10, 240(R10)
+ MOVO X11, 256(R10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X11, X13, X14)
+ SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9)
+ HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X11, X13, X14)
+ SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9)
+
+ MOVOU 32(AX), X10
+ MOVOU 48(AX), X11
+ PXOR X0, X12
+ PXOR X1, X15
+ PXOR X2, X10
+ PXOR X3, X11
+ PXOR X4, X12
+ PXOR X5, X15
+ PXOR X6, X10
+ PXOR X7, X11
+ MOVOU X10, 32(AX)
+ MOVOU X11, 48(AX)
+
+ LEAQ 128(SI), SI
+ SUBQ $128, DI
+ JNE loop
+
+ MOVOU X12, 0(AX)
+ MOVOU X15, 16(AX)
+
+ MOVQ R8, 0(BX)
+ MOVQ R9, 8(BX)
+
+ RET
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go
new file mode 100644
index 00000000..3168a8aa
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2b_generic.go
@@ -0,0 +1,182 @@
+// 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 blake2b
+
+import (
+ "encoding/binary"
+ "math/bits"
+)
+
+// the precomputed values for BLAKE2b
+// there are 12 16-byte arrays - one for each round
+// the entries are calculated from the sigma constants.
+var precomputed = [12][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},
+ {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, // equal to the first
+ {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, // equal to the second
+}
+
+func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
+ var m [16]uint64
+ 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] = binary.LittleEndian.Uint64(blocks[i:])
+ i += 8
+ }
+
+ for j := range precomputed {
+ s := &(precomputed[j])
+
+ v0 += m[s[0]]
+ v0 += v4
+ v12 ^= v0
+ v12 = bits.RotateLeft64(v12, -32)
+ v8 += v12
+ v4 ^= v8
+ v4 = bits.RotateLeft64(v4, -24)
+ v1 += m[s[1]]
+ v1 += v5
+ v13 ^= v1
+ v13 = bits.RotateLeft64(v13, -32)
+ v9 += v13
+ v5 ^= v9
+ v5 = bits.RotateLeft64(v5, -24)
+ v2 += m[s[2]]
+ v2 += v6
+ v14 ^= v2
+ v14 = bits.RotateLeft64(v14, -32)
+ v10 += v14
+ v6 ^= v10
+ v6 = bits.RotateLeft64(v6, -24)
+ v3 += m[s[3]]
+ v3 += v7
+ v15 ^= v3
+ v15 = bits.RotateLeft64(v15, -32)
+ v11 += v15
+ v7 ^= v11
+ v7 = bits.RotateLeft64(v7, -24)
+
+ v0 += m[s[4]]
+ v0 += v4
+ v12 ^= v0
+ v12 = bits.RotateLeft64(v12, -16)
+ v8 += v12
+ v4 ^= v8
+ v4 = bits.RotateLeft64(v4, -63)
+ v1 += m[s[5]]
+ v1 += v5
+ v13 ^= v1
+ v13 = bits.RotateLeft64(v13, -16)
+ v9 += v13
+ v5 ^= v9
+ v5 = bits.RotateLeft64(v5, -63)
+ v2 += m[s[6]]
+ v2 += v6
+ v14 ^= v2
+ v14 = bits.RotateLeft64(v14, -16)
+ v10 += v14
+ v6 ^= v10
+ v6 = bits.RotateLeft64(v6, -63)
+ v3 += m[s[7]]
+ v3 += v7
+ v15 ^= v3
+ v15 = bits.RotateLeft64(v15, -16)
+ v11 += v15
+ v7 ^= v11
+ v7 = bits.RotateLeft64(v7, -63)
+
+ v0 += m[s[8]]
+ v0 += v5
+ v15 ^= v0
+ v15 = bits.RotateLeft64(v15, -32)
+ v10 += v15
+ v5 ^= v10
+ v5 = bits.RotateLeft64(v5, -24)
+ v1 += m[s[9]]
+ v1 += v6
+ v12 ^= v1
+ v12 = bits.RotateLeft64(v12, -32)
+ v11 += v12
+ v6 ^= v11
+ v6 = bits.RotateLeft64(v6, -24)
+ v2 += m[s[10]]
+ v2 += v7
+ v13 ^= v2
+ v13 = bits.RotateLeft64(v13, -32)
+ v8 += v13
+ v7 ^= v8
+ v7 = bits.RotateLeft64(v7, -24)
+ v3 += m[s[11]]
+ v3 += v4
+ v14 ^= v3
+ v14 = bits.RotateLeft64(v14, -32)
+ v9 += v14
+ v4 ^= v9
+ v4 = bits.RotateLeft64(v4, -24)
+
+ v0 += m[s[12]]
+ v0 += v5
+ v15 ^= v0
+ v15 = bits.RotateLeft64(v15, -16)
+ v10 += v15
+ v5 ^= v10
+ v5 = bits.RotateLeft64(v5, -63)
+ v1 += m[s[13]]
+ v1 += v6
+ v12 ^= v1
+ v12 = bits.RotateLeft64(v12, -16)
+ v11 += v12
+ v6 ^= v11
+ v6 = bits.RotateLeft64(v6, -63)
+ v2 += m[s[14]]
+ v2 += v7
+ v13 ^= v2
+ v13 = bits.RotateLeft64(v13, -16)
+ v8 += v13
+ v7 ^= v8
+ v7 = bits.RotateLeft64(v7, -63)
+ v3 += m[s[15]]
+ v3 += v4
+ v14 ^= v3
+ v14 = bits.RotateLeft64(v14, -16)
+ v9 += v14
+ v4 ^= v9
+ v4 = bits.RotateLeft64(v4, -63)
+
+ }
+
+ 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/blake2b/blake2b_ref.go b/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go
new file mode 100644
index 00000000..b0137cdf
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2b_ref.go
@@ -0,0 +1,12 @@
+// 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 || purego || !gc
+// +build !amd64 purego !gc
+
+package blake2b
+
+func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) {
+ hashBlocksGeneric(h, c, flag, blocks)
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/blake2x.go b/vendor/golang.org/x/crypto/blake2b/blake2x.go
new file mode 100644
index 00000000..52c414db
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/blake2x.go
@@ -0,0 +1,177 @@
+// 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 blake2b
+
+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 = (1 << 32) - 1
+
+// maxOutputLength is the absolute maximum number of bytes to produce when the
+// number of output bytes is unknown.
+const maxOutputLength = (1 << 32) * 64
+
+// NewXOF creates a new variable-output-length hash. The hash either produce a
+// known number of bytes (1 <= size < 2**32-1), or an unknown number of bytes
+// (size == OutputLengthUnknown). In the latter case, an absolute limit of
+// 256GiB applies.
+//
+// A non-nil key turns the hash into a MAC. The key must between
+// zero and 32 bytes long.
+func NewXOF(size uint32, key []byte) (XOF, error) {
+ if len(key) > Size {
+ return nil, errKeySize
+ }
+ if size == magicUnknownOutputLength {
+ // 2^32-1 indicates an unknown number of bytes and thus isn't a
+ // valid length.
+ return nil, errors.New("blake2b: 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 uint32
+ 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("blake2b: 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.PutUint32(x.cfg[12:], x.length) // XOF length
+ x.cfg[17] = byte(Size) // inner hash size
+
+ x.d.Reset()
+ x.d.h[1] ^= uint64(x.length) << 32
+
+ 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.Uint64(cfg[i*8:])
+ }
+}
diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go
new file mode 100644
index 00000000..9d863396
--- /dev/null
+++ b/vendor/golang.org/x/crypto/blake2b/register.go
@@ -0,0 +1,33 @@
+// 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 blake2b
+
+import (
+ "crypto"
+ "hash"
+)
+
+func init() {
+ newHash256 := func() hash.Hash {
+ h, _ := New256(nil)
+ return h
+ }
+ newHash384 := func() hash.Hash {
+ h, _ := New384(nil)
+ return h
+ }
+
+ newHash512 := func() hash.Hash {
+ h, _ := New512(nil)
+ return h
+ }
+
+ crypto.RegisterHash(crypto.BLAKE2b_256, newHash256)
+ crypto.RegisterHash(crypto.BLAKE2b_384, newHash384)
+ crypto.RegisterHash(crypto.BLAKE2b_512, newHash512)
+}
diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s
index 8fb49a13..63cae9e6 100644
--- a/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s
+++ b/vendor/golang.org/x/crypto/chacha20/chacha_arm64.s
@@ -2,6 +2,7 @@
// 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
#include "textflag.h"
diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s
index 3dad4b2f..5c0fed26 100644
--- a/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s
+++ b/vendor/golang.org/x/crypto/chacha20/chacha_ppc64le.s
@@ -19,6 +19,7 @@
// The differences in this and the original implementation are
// due to the calling conventions and initialization of constants.
+//go:build gc && !purego
// +build gc,!purego
#include "textflag.h"
diff --git a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s
index 81816118..f3ef5a01 100644
--- a/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s
+++ b/vendor/golang.org/x/crypto/chacha20/chacha_s390x.s
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build gc && !purego
// +build gc,!purego
#include "go_asm.h"
diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go
index 4b9a655d..cda3fdd3 100644
--- a/vendor/golang.org/x/crypto/curve25519/curve25519.go
+++ b/vendor/golang.org/x/crypto/curve25519/curve25519.go
@@ -10,6 +10,8 @@ package curve25519 // import "golang.org/x/crypto/curve25519"
import (
"crypto/subtle"
"fmt"
+
+ "golang.org/x/crypto/curve25519/internal/field"
)
// ScalarMult sets dst to the product scalar * point.
@@ -18,7 +20,55 @@ import (
// zeroes, irrespective of the scalar. Instead, use the X25519 function, which
// will return an error.
func ScalarMult(dst, scalar, point *[32]byte) {
- scalarMult(dst, scalar, point)
+ var e [32]byte
+
+ copy(e[:], scalar[:])
+ e[0] &= 248
+ e[31] &= 127
+ e[31] |= 64
+
+ var x1, x2, z2, x3, z3, tmp0, tmp1 field.Element
+ x1.SetBytes(point[:])
+ x2.One()
+ x3.Set(&x1)
+ z3.One()
+
+ swap := 0
+ for pos := 254; pos >= 0; pos-- {
+ b := e[pos/8] >> uint(pos&7)
+ b &= 1
+ swap ^= int(b)
+ x2.Swap(&x3, swap)
+ z2.Swap(&z3, swap)
+ swap = int(b)
+
+ tmp0.Subtract(&x3, &z3)
+ tmp1.Subtract(&x2, &z2)
+ x2.Add(&x2, &z2)
+ z2.Add(&x3, &z3)
+ z3.Multiply(&tmp0, &x2)
+ z2.Multiply(&z2, &tmp1)
+ tmp0.Square(&tmp1)
+ tmp1.Square(&x2)
+ x3.Add(&z3, &z2)
+ z2.Subtract(&z3, &z2)
+ x2.Multiply(&tmp1, &tmp0)
+ tmp1.Subtract(&tmp1, &tmp0)
+ z2.Square(&z2)
+
+ z3.Mult32(&tmp1, 121666)
+ x3.Square(&x3)
+ tmp0.Add(&tmp0, &z3)
+ z3.Multiply(&x1, &z2)
+ z2.Multiply(&tmp1, &tmp0)
+ }
+
+ x2.Swap(&x3, swap)
+ z2.Swap(&z3, swap)
+
+ z2.Invert(&z2)
+ x2.Multiply(&x2, &z2)
+ copy(dst[:], x2.Bytes())
}
// ScalarBaseMult sets dst to the product scalar * base where base is the
diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go
deleted file mode 100644
index 84858480..00000000
--- a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2012 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 curve25519
-
-// These functions are implemented in the .s files. The names of the functions
-// in the rest of the file are also taken from the SUPERCOP sources to help
-// people following along.
-
-//go:noescape
-
-func cswap(inout *[5]uint64, v uint64)
-
-//go:noescape
-
-func ladderstep(inout *[5][5]uint64)
-
-//go:noescape
-
-func freeze(inout *[5]uint64)
-
-//go:noescape
-
-func mul(dest, a, b *[5]uint64)
-
-//go:noescape
-
-func square(out, in *[5]uint64)
-
-// mladder uses a Montgomery ladder to calculate (xr/zr) *= s.
-func mladder(xr, zr *[5]uint64, s *[32]byte) {
- var work [5][5]uint64
-
- work[0] = *xr
- setint(&work[1], 1)
- setint(&work[2], 0)
- work[3] = *xr
- setint(&work[4], 1)
-
- j := uint(6)
- var prevbit byte
-
- for i := 31; i >= 0; i-- {
- for j < 8 {
- bit := ((*s)[i] >> j) & 1
- swap := bit ^ prevbit
- prevbit = bit
- cswap(&work[1], uint64(swap))
- ladderstep(&work)
- j--
- }
- j = 7
- }
-
- *xr = work[1]
- *zr = work[2]
-}
-
-func scalarMult(out, in, base *[32]byte) {
- var e [32]byte
- copy(e[:], (*in)[:])
- e[0] &= 248
- e[31] &= 127
- e[31] |= 64
-
- var t, z [5]uint64
- unpack(&t, base)
- mladder(&t, &z, &e)
- invert(&z, &z)
- mul(&t, &t, &z)
- pack(out, &t)
-}
-
-func setint(r *[5]uint64, v uint64) {
- r[0] = v
- r[1] = 0
- r[2] = 0
- r[3] = 0
- r[4] = 0
-}
-
-// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian
-// order.
-func unpack(r *[5]uint64, x *[32]byte) {
- r[0] = uint64(x[0]) |
- uint64(x[1])<<8 |
- uint64(x[2])<<16 |
- uint64(x[3])<<24 |
- uint64(x[4])<<32 |
- uint64(x[5])<<40 |
- uint64(x[6]&7)<<48
-
- r[1] = uint64(x[6])>>3 |
- uint64(x[7])<<5 |
- uint64(x[8])<<13 |
- uint64(x[9])<<21 |
- uint64(x[10])<<29 |
- uint64(x[11])<<37 |
- uint64(x[12]&63)<<45
-
- r[2] = uint64(x[12])>>6 |
- uint64(x[13])<<2 |
- uint64(x[14])<<10 |
- uint64(x[15])<<18 |
- uint64(x[16])<<26 |
- uint64(x[17])<<34 |
- uint64(x[18])<<42 |
- uint64(x[19]&1)<<50
-
- r[3] = uint64(x[19])>>1 |
- uint64(x[20])<<7 |
- uint64(x[21])<<15 |
- uint64(x[22])<<23 |
- uint64(x[23])<<31 |
- uint64(x[24])<<39 |
- uint64(x[25]&15)<<47
-
- r[4] = uint64(x[25])>>4 |
- uint64(x[26])<<4 |
- uint64(x[27])<<12 |
- uint64(x[28])<<20 |
- uint64(x[29])<<28 |
- uint64(x[30])<<36 |
- uint64(x[31]&127)<<44
-}
-
-// pack sets out = x where out is the usual, little-endian form of the 5,
-// 51-bit limbs in x.
-func pack(out *[32]byte, x *[5]uint64) {
- t := *x
- freeze(&t)
-
- out[0] = byte(t[0])
- out[1] = byte(t[0] >> 8)
- out[2] = byte(t[0] >> 16)
- out[3] = byte(t[0] >> 24)
- out[4] = byte(t[0] >> 32)
- out[5] = byte(t[0] >> 40)
- out[6] = byte(t[0] >> 48)
-
- out[6] ^= byte(t[1]<<3) & 0xf8
- out[7] = byte(t[1] >> 5)
- out[8] = byte(t[1] >> 13)
- out[9] = byte(t[1] >> 21)
- out[10] = byte(t[1] >> 29)
- out[11] = byte(t[1] >> 37)
- out[12] = byte(t[1] >> 45)
-
- out[12] ^= byte(t[2]<<6) & 0xc0
- out[13] = byte(t[2] >> 2)
- out[14] = byte(t[2] >> 10)
- out[15] = byte(t[2] >> 18)
- out[16] = byte(t[2] >> 26)
- out[17] = byte(t[2] >> 34)
- out[18] = byte(t[2] >> 42)
- out[19] = byte(t[2] >> 50)
-
- out[19] ^= byte(t[3]<<1) & 0xfe
- out[20] = byte(t[3] >> 7)
- out[21] = byte(t[3] >> 15)
- out[22] = byte(t[3] >> 23)
- out[23] = byte(t[3] >> 31)
- out[24] = byte(t[3] >> 39)
- out[25] = byte(t[3] >> 47)
-
- out[25] ^= byte(t[4]<<4) & 0xf0
- out[26] = byte(t[4] >> 4)
- out[27] = byte(t[4] >> 12)
- out[28] = byte(t[4] >> 20)
- out[29] = byte(t[4] >> 28)
- out[30] = byte(t[4] >> 36)
- out[31] = byte(t[4] >> 44)
-}
-
-// invert calculates r = x^-1 mod p using Fermat's little theorem.
-func invert(r *[5]uint64, x *[5]uint64) {
- var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64
-
- square(&z2, x) /* 2 */
- square(&t, &z2) /* 4 */
- square(&t, &t) /* 8 */
- mul(&z9, &t, x) /* 9 */
- mul(&z11, &z9, &z2) /* 11 */
- square(&t, &z11) /* 22 */
- mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */
-
- square(&t, &z2_5_0) /* 2^6 - 2^1 */
- for i := 1; i < 5; i++ { /* 2^20 - 2^10 */
- square(&t, &t)
- }
- mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */
-
- square(&t, &z2_10_0) /* 2^11 - 2^1 */
- for i := 1; i < 10; i++ { /* 2^20 - 2^10 */
- square(&t, &t)
- }
- mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */
-
- square(&t, &z2_20_0) /* 2^21 - 2^1 */
- for i := 1; i < 20; i++ { /* 2^40 - 2^20 */
- square(&t, &t)
- }
- mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */
-
- square(&t, &t) /* 2^41 - 2^1 */
- for i := 1; i < 10; i++ { /* 2^50 - 2^10 */
- square(&t, &t)
- }
- mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */
-
- square(&t, &z2_50_0) /* 2^51 - 2^1 */
- for i := 1; i < 50; i++ { /* 2^100 - 2^50 */
- square(&t, &t)
- }
- mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */
-
- square(&t, &z2_100_0) /* 2^101 - 2^1 */
- for i := 1; i < 100; i++ { /* 2^200 - 2^100 */
- square(&t, &t)
- }
- mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */
-
- square(&t, &t) /* 2^201 - 2^1 */
- for i := 1; i < 50; i++ { /* 2^250 - 2^50 */
- square(&t, &t)
- }
- mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */
-
- square(&t, &t) /* 2^251 - 2^1 */
- square(&t, &t) /* 2^252 - 2^2 */
- square(&t, &t) /* 2^253 - 2^3 */
-
- square(&t, &t) /* 2^254 - 2^4 */
-
- square(&t, &t) /* 2^255 - 2^5 */
- mul(r, &t, &z11) /* 2^255 - 21 */
-}
diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s b/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s
deleted file mode 100644
index 6c533809..00000000
--- a/vendor/golang.org/x/crypto/curve25519/curve25519_amd64.s
+++ /dev/null
@@ -1,1793 +0,0 @@
-// Copyright 2012 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.
-
-// This code was translated into a form compatible with 6a from the public
-// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html
-
-// +build amd64,gc,!purego
-
-#define REDMASK51 0x0007FFFFFFFFFFFF
-
-// These constants cannot be encoded in non-MOVQ immediates.
-// We access them directly from memory instead.
-
-DATA ·_121666_213(SB)/8, $996687872
-GLOBL ·_121666_213(SB), 8, $8
-
-DATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA
-GLOBL ·_2P0(SB), 8, $8
-
-DATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE
-GLOBL ·_2P1234(SB), 8, $8
-
-// func freeze(inout *[5]uint64)
-TEXT ·freeze(SB),7,$0-8
- MOVQ inout+0(FP), DI
-
- MOVQ 0(DI),SI
- MOVQ 8(DI),DX
- MOVQ 16(DI),CX
- MOVQ 24(DI),R8
- MOVQ 32(DI),R9
- MOVQ $REDMASK51,AX
- MOVQ AX,R10
- SUBQ $18,R10
- MOVQ $3,R11
-REDUCELOOP:
- MOVQ SI,R12
- SHRQ $51,R12
- ANDQ AX,SI
- ADDQ R12,DX
- MOVQ DX,R12
- SHRQ $51,R12
- ANDQ AX,DX
- ADDQ R12,CX
- MOVQ CX,R12
- SHRQ $51,R12
- ANDQ AX,CX
- ADDQ R12,R8
- MOVQ R8,R12
- SHRQ $51,R12
- ANDQ AX,R8
- ADDQ R12,R9
- MOVQ R9,R12
- SHRQ $51,R12
- ANDQ AX,R9
- IMUL3Q $19,R12,R12
- ADDQ R12,SI
- SUBQ $1,R11
- JA REDUCELOOP
- MOVQ $1,R12
- CMPQ R10,SI
- CMOVQLT R11,R12
- CMPQ AX,DX
- CMOVQNE R11,R12
- CMPQ AX,CX
- CMOVQNE R11,R12
- CMPQ AX,R8
- CMOVQNE R11,R12
- CMPQ AX,R9
- CMOVQNE R11,R12
- NEGQ R12
- ANDQ R12,AX
- ANDQ R12,R10
- SUBQ R10,SI
- SUBQ AX,DX
- SUBQ AX,CX
- SUBQ AX,R8
- SUBQ AX,R9
- MOVQ SI,0(DI)
- MOVQ DX,8(DI)
- MOVQ CX,16(DI)
- MOVQ R8,24(DI)
- MOVQ R9,32(DI)
- RET
-
-// func ladderstep(inout *[5][5]uint64)
-TEXT ·ladderstep(SB),0,$296-8
- MOVQ inout+0(FP),DI
-
- MOVQ 40(DI),SI
- MOVQ 48(DI),DX
- MOVQ 56(DI),CX
- MOVQ 64(DI),R8
- MOVQ 72(DI),R9
- MOVQ SI,AX
- MOVQ DX,R10
- MOVQ CX,R11
- MOVQ R8,R12
- MOVQ R9,R13
- ADDQ ·_2P0(SB),AX
- ADDQ ·_2P1234(SB),R10
- ADDQ ·_2P1234(SB),R11
- ADDQ ·_2P1234(SB),R12
- ADDQ ·_2P1234(SB),R13
- ADDQ 80(DI),SI
- ADDQ 88(DI),DX
- ADDQ 96(DI),CX
- ADDQ 104(DI),R8
- ADDQ 112(DI),R9
- SUBQ 80(DI),AX
- SUBQ 88(DI),R10
- SUBQ 96(DI),R11
- SUBQ 104(DI),R12
- SUBQ 112(DI),R13
- MOVQ SI,0(SP)
- MOVQ DX,8(SP)
- MOVQ CX,16(SP)
- MOVQ R8,24(SP)
- MOVQ R9,32(SP)
- MOVQ AX,40(SP)
- MOVQ R10,48(SP)
- MOVQ R11,56(SP)
- MOVQ R12,64(SP)
- MOVQ R13,72(SP)
- MOVQ 40(SP),AX
- MULQ 40(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 40(SP),AX
- SHLQ $1,AX
- MULQ 48(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 40(SP),AX
- SHLQ $1,AX
- MULQ 56(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 40(SP),AX
- SHLQ $1,AX
- MULQ 64(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 40(SP),AX
- SHLQ $1,AX
- MULQ 72(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 48(SP),AX
- MULQ 48(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 48(SP),AX
- SHLQ $1,AX
- MULQ 56(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 48(SP),AX
- SHLQ $1,AX
- MULQ 64(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 48(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 72(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 56(SP),AX
- MULQ 56(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 56(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 64(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 56(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 72(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 64(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 64(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 64(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 72(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 72(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 72(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- ANDQ DX,SI
- MOVQ CX,R8
- SHRQ $51,CX
- ADDQ R10,CX
- ANDQ DX,R8
- MOVQ CX,R9
- SHRQ $51,CX
- ADDQ R12,CX
- ANDQ DX,R9
- MOVQ CX,AX
- SHRQ $51,CX
- ADDQ R14,CX
- ANDQ DX,AX
- MOVQ CX,R10
- SHRQ $51,CX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,80(SP)
- MOVQ R8,88(SP)
- MOVQ R9,96(SP)
- MOVQ AX,104(SP)
- MOVQ R10,112(SP)
- MOVQ 0(SP),AX
- MULQ 0(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 0(SP),AX
- SHLQ $1,AX
- MULQ 8(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 0(SP),AX
- SHLQ $1,AX
- MULQ 16(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 0(SP),AX
- SHLQ $1,AX
- MULQ 24(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 0(SP),AX
- SHLQ $1,AX
- MULQ 32(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 8(SP),AX
- MULQ 8(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SP),AX
- SHLQ $1,AX
- MULQ 16(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 8(SP),AX
- SHLQ $1,AX
- MULQ 24(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 8(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 16(SP),AX
- MULQ 16(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 16(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 24(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 16(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 24(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 24(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 24(SP),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 32(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 32(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- ANDQ DX,SI
- MOVQ CX,R8
- SHRQ $51,CX
- ADDQ R10,CX
- ANDQ DX,R8
- MOVQ CX,R9
- SHRQ $51,CX
- ADDQ R12,CX
- ANDQ DX,R9
- MOVQ CX,AX
- SHRQ $51,CX
- ADDQ R14,CX
- ANDQ DX,AX
- MOVQ CX,R10
- SHRQ $51,CX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,120(SP)
- MOVQ R8,128(SP)
- MOVQ R9,136(SP)
- MOVQ AX,144(SP)
- MOVQ R10,152(SP)
- MOVQ SI,SI
- MOVQ R8,DX
- MOVQ R9,CX
- MOVQ AX,R8
- MOVQ R10,R9
- ADDQ ·_2P0(SB),SI
- ADDQ ·_2P1234(SB),DX
- ADDQ ·_2P1234(SB),CX
- ADDQ ·_2P1234(SB),R8
- ADDQ ·_2P1234(SB),R9
- SUBQ 80(SP),SI
- SUBQ 88(SP),DX
- SUBQ 96(SP),CX
- SUBQ 104(SP),R8
- SUBQ 112(SP),R9
- MOVQ SI,160(SP)
- MOVQ DX,168(SP)
- MOVQ CX,176(SP)
- MOVQ R8,184(SP)
- MOVQ R9,192(SP)
- MOVQ 120(DI),SI
- MOVQ 128(DI),DX
- MOVQ 136(DI),CX
- MOVQ 144(DI),R8
- MOVQ 152(DI),R9
- MOVQ SI,AX
- MOVQ DX,R10
- MOVQ CX,R11
- MOVQ R8,R12
- MOVQ R9,R13
- ADDQ ·_2P0(SB),AX
- ADDQ ·_2P1234(SB),R10
- ADDQ ·_2P1234(SB),R11
- ADDQ ·_2P1234(SB),R12
- ADDQ ·_2P1234(SB),R13
- ADDQ 160(DI),SI
- ADDQ 168(DI),DX
- ADDQ 176(DI),CX
- ADDQ 184(DI),R8
- ADDQ 192(DI),R9
- SUBQ 160(DI),AX
- SUBQ 168(DI),R10
- SUBQ 176(DI),R11
- SUBQ 184(DI),R12
- SUBQ 192(DI),R13
- MOVQ SI,200(SP)
- MOVQ DX,208(SP)
- MOVQ CX,216(SP)
- MOVQ R8,224(SP)
- MOVQ R9,232(SP)
- MOVQ AX,240(SP)
- MOVQ R10,248(SP)
- MOVQ R11,256(SP)
- MOVQ R12,264(SP)
- MOVQ R13,272(SP)
- MOVQ 224(SP),SI
- IMUL3Q $19,SI,AX
- MOVQ AX,280(SP)
- MULQ 56(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 232(SP),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,288(SP)
- MULQ 48(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 200(SP),AX
- MULQ 40(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 200(SP),AX
- MULQ 48(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 200(SP),AX
- MULQ 56(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 200(SP),AX
- MULQ 64(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 200(SP),AX
- MULQ 72(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 208(SP),AX
- MULQ 40(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 208(SP),AX
- MULQ 48(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 208(SP),AX
- MULQ 56(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 208(SP),AX
- MULQ 64(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 208(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 72(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 216(SP),AX
- MULQ 40(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 216(SP),AX
- MULQ 48(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 216(SP),AX
- MULQ 56(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 216(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 64(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 216(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 72(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 224(SP),AX
- MULQ 40(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 224(SP),AX
- MULQ 48(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 280(SP),AX
- MULQ 64(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 280(SP),AX
- MULQ 72(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 232(SP),AX
- MULQ 40(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 288(SP),AX
- MULQ 56(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 288(SP),AX
- MULQ 64(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 288(SP),AX
- MULQ 72(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- MOVQ CX,R8
- SHRQ $51,CX
- ANDQ DX,SI
- ADDQ R10,CX
- MOVQ CX,R9
- SHRQ $51,CX
- ANDQ DX,R8
- ADDQ R12,CX
- MOVQ CX,AX
- SHRQ $51,CX
- ANDQ DX,R9
- ADDQ R14,CX
- MOVQ CX,R10
- SHRQ $51,CX
- ANDQ DX,AX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,40(SP)
- MOVQ R8,48(SP)
- MOVQ R9,56(SP)
- MOVQ AX,64(SP)
- MOVQ R10,72(SP)
- MOVQ 264(SP),SI
- IMUL3Q $19,SI,AX
- MOVQ AX,200(SP)
- MULQ 16(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 272(SP),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,208(SP)
- MULQ 8(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 240(SP),AX
- MULQ 0(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 240(SP),AX
- MULQ 8(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 240(SP),AX
- MULQ 16(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 240(SP),AX
- MULQ 24(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 240(SP),AX
- MULQ 32(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 248(SP),AX
- MULQ 0(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 248(SP),AX
- MULQ 8(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 248(SP),AX
- MULQ 16(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 248(SP),AX
- MULQ 24(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 248(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 32(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 256(SP),AX
- MULQ 0(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 256(SP),AX
- MULQ 8(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 256(SP),AX
- MULQ 16(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 256(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 24(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 256(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 32(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 264(SP),AX
- MULQ 0(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 264(SP),AX
- MULQ 8(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 200(SP),AX
- MULQ 24(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 200(SP),AX
- MULQ 32(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 272(SP),AX
- MULQ 0(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 208(SP),AX
- MULQ 16(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 208(SP),AX
- MULQ 24(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 208(SP),AX
- MULQ 32(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- MOVQ CX,R8
- SHRQ $51,CX
- ANDQ DX,SI
- ADDQ R10,CX
- MOVQ CX,R9
- SHRQ $51,CX
- ANDQ DX,R8
- ADDQ R12,CX
- MOVQ CX,AX
- SHRQ $51,CX
- ANDQ DX,R9
- ADDQ R14,CX
- MOVQ CX,R10
- SHRQ $51,CX
- ANDQ DX,AX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,DX
- MOVQ R8,CX
- MOVQ R9,R11
- MOVQ AX,R12
- MOVQ R10,R13
- ADDQ ·_2P0(SB),DX
- ADDQ ·_2P1234(SB),CX
- ADDQ ·_2P1234(SB),R11
- ADDQ ·_2P1234(SB),R12
- ADDQ ·_2P1234(SB),R13
- ADDQ 40(SP),SI
- ADDQ 48(SP),R8
- ADDQ 56(SP),R9
- ADDQ 64(SP),AX
- ADDQ 72(SP),R10
- SUBQ 40(SP),DX
- SUBQ 48(SP),CX
- SUBQ 56(SP),R11
- SUBQ 64(SP),R12
- SUBQ 72(SP),R13
- MOVQ SI,120(DI)
- MOVQ R8,128(DI)
- MOVQ R9,136(DI)
- MOVQ AX,144(DI)
- MOVQ R10,152(DI)
- MOVQ DX,160(DI)
- MOVQ CX,168(DI)
- MOVQ R11,176(DI)
- MOVQ R12,184(DI)
- MOVQ R13,192(DI)
- MOVQ 120(DI),AX
- MULQ 120(DI)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 120(DI),AX
- SHLQ $1,AX
- MULQ 128(DI)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 120(DI),AX
- SHLQ $1,AX
- MULQ 136(DI)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 120(DI),AX
- SHLQ $1,AX
- MULQ 144(DI)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 120(DI),AX
- SHLQ $1,AX
- MULQ 152(DI)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 128(DI),AX
- MULQ 128(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 128(DI),AX
- SHLQ $1,AX
- MULQ 136(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 128(DI),AX
- SHLQ $1,AX
- MULQ 144(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 128(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 152(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 136(DI),AX
- MULQ 136(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 136(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 144(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 136(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 152(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 144(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 144(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 144(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 152(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 152(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 152(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- ANDQ DX,SI
- MOVQ CX,R8
- SHRQ $51,CX
- ADDQ R10,CX
- ANDQ DX,R8
- MOVQ CX,R9
- SHRQ $51,CX
- ADDQ R12,CX
- ANDQ DX,R9
- MOVQ CX,AX
- SHRQ $51,CX
- ADDQ R14,CX
- ANDQ DX,AX
- MOVQ CX,R10
- SHRQ $51,CX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,120(DI)
- MOVQ R8,128(DI)
- MOVQ R9,136(DI)
- MOVQ AX,144(DI)
- MOVQ R10,152(DI)
- MOVQ 160(DI),AX
- MULQ 160(DI)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 160(DI),AX
- SHLQ $1,AX
- MULQ 168(DI)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 160(DI),AX
- SHLQ $1,AX
- MULQ 176(DI)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 160(DI),AX
- SHLQ $1,AX
- MULQ 184(DI)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 160(DI),AX
- SHLQ $1,AX
- MULQ 192(DI)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 168(DI),AX
- MULQ 168(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 168(DI),AX
- SHLQ $1,AX
- MULQ 176(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 168(DI),AX
- SHLQ $1,AX
- MULQ 184(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 168(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 192(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 176(DI),AX
- MULQ 176(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 176(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 184(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 176(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 192(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 184(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 184(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 184(DI),DX
- IMUL3Q $38,DX,AX
- MULQ 192(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 192(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 192(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- ANDQ DX,SI
- MOVQ CX,R8
- SHRQ $51,CX
- ADDQ R10,CX
- ANDQ DX,R8
- MOVQ CX,R9
- SHRQ $51,CX
- ADDQ R12,CX
- ANDQ DX,R9
- MOVQ CX,AX
- SHRQ $51,CX
- ADDQ R14,CX
- ANDQ DX,AX
- MOVQ CX,R10
- SHRQ $51,CX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,160(DI)
- MOVQ R8,168(DI)
- MOVQ R9,176(DI)
- MOVQ AX,184(DI)
- MOVQ R10,192(DI)
- MOVQ 184(DI),SI
- IMUL3Q $19,SI,AX
- MOVQ AX,0(SP)
- MULQ 16(DI)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 192(DI),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,8(SP)
- MULQ 8(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 160(DI),AX
- MULQ 0(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 160(DI),AX
- MULQ 8(DI)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 160(DI),AX
- MULQ 16(DI)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 160(DI),AX
- MULQ 24(DI)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 160(DI),AX
- MULQ 32(DI)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 168(DI),AX
- MULQ 0(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 168(DI),AX
- MULQ 8(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 168(DI),AX
- MULQ 16(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 168(DI),AX
- MULQ 24(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 168(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 32(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 176(DI),AX
- MULQ 0(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 176(DI),AX
- MULQ 8(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 176(DI),AX
- MULQ 16(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 176(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 24(DI)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 176(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 32(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 184(DI),AX
- MULQ 0(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 184(DI),AX
- MULQ 8(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 0(SP),AX
- MULQ 24(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 0(SP),AX
- MULQ 32(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 192(DI),AX
- MULQ 0(DI)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 8(SP),AX
- MULQ 16(DI)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 8(SP),AX
- MULQ 24(DI)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SP),AX
- MULQ 32(DI)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- MOVQ CX,R8
- SHRQ $51,CX
- ANDQ DX,SI
- ADDQ R10,CX
- MOVQ CX,R9
- SHRQ $51,CX
- ANDQ DX,R8
- ADDQ R12,CX
- MOVQ CX,AX
- SHRQ $51,CX
- ANDQ DX,R9
- ADDQ R14,CX
- MOVQ CX,R10
- SHRQ $51,CX
- ANDQ DX,AX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,160(DI)
- MOVQ R8,168(DI)
- MOVQ R9,176(DI)
- MOVQ AX,184(DI)
- MOVQ R10,192(DI)
- MOVQ 144(SP),SI
- IMUL3Q $19,SI,AX
- MOVQ AX,0(SP)
- MULQ 96(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 152(SP),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,8(SP)
- MULQ 88(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 120(SP),AX
- MULQ 80(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 120(SP),AX
- MULQ 88(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 120(SP),AX
- MULQ 96(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 120(SP),AX
- MULQ 104(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 120(SP),AX
- MULQ 112(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 128(SP),AX
- MULQ 80(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 128(SP),AX
- MULQ 88(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 128(SP),AX
- MULQ 96(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 128(SP),AX
- MULQ 104(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 128(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 112(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 136(SP),AX
- MULQ 80(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 136(SP),AX
- MULQ 88(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 136(SP),AX
- MULQ 96(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 136(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 104(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 136(SP),DX
- IMUL3Q $19,DX,AX
- MULQ 112(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 144(SP),AX
- MULQ 80(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 144(SP),AX
- MULQ 88(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 0(SP),AX
- MULQ 104(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 0(SP),AX
- MULQ 112(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 152(SP),AX
- MULQ 80(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 8(SP),AX
- MULQ 96(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 8(SP),AX
- MULQ 104(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SP),AX
- MULQ 112(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- MOVQ CX,R8
- SHRQ $51,CX
- ANDQ DX,SI
- ADDQ R10,CX
- MOVQ CX,R9
- SHRQ $51,CX
- ANDQ DX,R8
- ADDQ R12,CX
- MOVQ CX,AX
- SHRQ $51,CX
- ANDQ DX,R9
- ADDQ R14,CX
- MOVQ CX,R10
- SHRQ $51,CX
- ANDQ DX,AX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,40(DI)
- MOVQ R8,48(DI)
- MOVQ R9,56(DI)
- MOVQ AX,64(DI)
- MOVQ R10,72(DI)
- MOVQ 160(SP),AX
- MULQ ·_121666_213(SB)
- SHRQ $13,AX
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 168(SP),AX
- MULQ ·_121666_213(SB)
- SHRQ $13,AX
- ADDQ AX,CX
- MOVQ DX,R8
- MOVQ 176(SP),AX
- MULQ ·_121666_213(SB)
- SHRQ $13,AX
- ADDQ AX,R8
- MOVQ DX,R9
- MOVQ 184(SP),AX
- MULQ ·_121666_213(SB)
- SHRQ $13,AX
- ADDQ AX,R9
- MOVQ DX,R10
- MOVQ 192(SP),AX
- MULQ ·_121666_213(SB)
- SHRQ $13,AX
- ADDQ AX,R10
- IMUL3Q $19,DX,DX
- ADDQ DX,SI
- ADDQ 80(SP),SI
- ADDQ 88(SP),CX
- ADDQ 96(SP),R8
- ADDQ 104(SP),R9
- ADDQ 112(SP),R10
- MOVQ SI,80(DI)
- MOVQ CX,88(DI)
- MOVQ R8,96(DI)
- MOVQ R9,104(DI)
- MOVQ R10,112(DI)
- MOVQ 104(DI),SI
- IMUL3Q $19,SI,AX
- MOVQ AX,0(SP)
- MULQ 176(SP)
- MOVQ AX,SI
- MOVQ DX,CX
- MOVQ 112(DI),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,8(SP)
- MULQ 168(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 80(DI),AX
- MULQ 160(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 80(DI),AX
- MULQ 168(SP)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 80(DI),AX
- MULQ 176(SP)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 80(DI),AX
- MULQ 184(SP)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 80(DI),AX
- MULQ 192(SP)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 88(DI),AX
- MULQ 160(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 88(DI),AX
- MULQ 168(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 88(DI),AX
- MULQ 176(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 88(DI),AX
- MULQ 184(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 88(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 192(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 96(DI),AX
- MULQ 160(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 96(DI),AX
- MULQ 168(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 96(DI),AX
- MULQ 176(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 96(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 184(SP)
- ADDQ AX,SI
- ADCQ DX,CX
- MOVQ 96(DI),DX
- IMUL3Q $19,DX,AX
- MULQ 192(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 104(DI),AX
- MULQ 160(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 104(DI),AX
- MULQ 168(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 0(SP),AX
- MULQ 184(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 0(SP),AX
- MULQ 192(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 112(DI),AX
- MULQ 160(SP)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 8(SP),AX
- MULQ 176(SP)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 8(SP),AX
- MULQ 184(SP)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SP),AX
- MULQ 192(SP)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ $REDMASK51,DX
- SHLQ $13,SI,CX
- ANDQ DX,SI
- SHLQ $13,R8,R9
- ANDQ DX,R8
- ADDQ CX,R8
- SHLQ $13,R10,R11
- ANDQ DX,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ DX,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ DX,R14
- ADDQ R13,R14
- IMUL3Q $19,R15,CX
- ADDQ CX,SI
- MOVQ SI,CX
- SHRQ $51,CX
- ADDQ R8,CX
- MOVQ CX,R8
- SHRQ $51,CX
- ANDQ DX,SI
- ADDQ R10,CX
- MOVQ CX,R9
- SHRQ $51,CX
- ANDQ DX,R8
- ADDQ R12,CX
- MOVQ CX,AX
- SHRQ $51,CX
- ANDQ DX,R9
- ADDQ R14,CX
- MOVQ CX,R10
- SHRQ $51,CX
- ANDQ DX,AX
- IMUL3Q $19,CX,CX
- ADDQ CX,SI
- ANDQ DX,R10
- MOVQ SI,80(DI)
- MOVQ R8,88(DI)
- MOVQ R9,96(DI)
- MOVQ AX,104(DI)
- MOVQ R10,112(DI)
- RET
-
-// func cswap(inout *[4][5]uint64, v uint64)
-TEXT ·cswap(SB),7,$0
- MOVQ inout+0(FP),DI
- MOVQ v+8(FP),SI
-
- SUBQ $1, SI
- NOTQ SI
- MOVQ SI, X15
- PSHUFD $0x44, X15, X15
-
- MOVOU 0(DI), X0
- MOVOU 16(DI), X2
- MOVOU 32(DI), X4
- MOVOU 48(DI), X6
- MOVOU 64(DI), X8
- MOVOU 80(DI), X1
- MOVOU 96(DI), X3
- MOVOU 112(DI), X5
- MOVOU 128(DI), X7
- MOVOU 144(DI), X9
-
- MOVO X1, X10
- MOVO X3, X11
- MOVO X5, X12
- MOVO X7, X13
- MOVO X9, X14
-
- PXOR X0, X10
- PXOR X2, X11
- PXOR X4, X12
- PXOR X6, X13
- PXOR X8, X14
- PAND X15, X10
- PAND X15, X11
- PAND X15, X12
- PAND X15, X13
- PAND X15, X14
- PXOR X10, X0
- PXOR X10, X1
- PXOR X11, X2
- PXOR X11, X3
- PXOR X12, X4
- PXOR X12, X5
- PXOR X13, X6
- PXOR X13, X7
- PXOR X14, X8
- PXOR X14, X9
-
- MOVOU X0, 0(DI)
- MOVOU X2, 16(DI)
- MOVOU X4, 32(DI)
- MOVOU X6, 48(DI)
- MOVOU X8, 64(DI)
- MOVOU X1, 80(DI)
- MOVOU X3, 96(DI)
- MOVOU X5, 112(DI)
- MOVOU X7, 128(DI)
- MOVOU X9, 144(DI)
- RET
-
-// func mul(dest, a, b *[5]uint64)
-TEXT ·mul(SB),0,$16-24
- MOVQ dest+0(FP), DI
- MOVQ a+8(FP), SI
- MOVQ b+16(FP), DX
-
- MOVQ DX,CX
- MOVQ 24(SI),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,0(SP)
- MULQ 16(CX)
- MOVQ AX,R8
- MOVQ DX,R9
- MOVQ 32(SI),DX
- IMUL3Q $19,DX,AX
- MOVQ AX,8(SP)
- MULQ 8(CX)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 0(SI),AX
- MULQ 0(CX)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 0(SI),AX
- MULQ 8(CX)
- MOVQ AX,R10
- MOVQ DX,R11
- MOVQ 0(SI),AX
- MULQ 16(CX)
- MOVQ AX,R12
- MOVQ DX,R13
- MOVQ 0(SI),AX
- MULQ 24(CX)
- MOVQ AX,R14
- MOVQ DX,R15
- MOVQ 0(SI),AX
- MULQ 32(CX)
- MOVQ AX,BX
- MOVQ DX,BP
- MOVQ 8(SI),AX
- MULQ 0(CX)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SI),AX
- MULQ 8(CX)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 8(SI),AX
- MULQ 16(CX)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 8(SI),AX
- MULQ 24(CX)
- ADDQ AX,BX
- ADCQ DX,BP
- MOVQ 8(SI),DX
- IMUL3Q $19,DX,AX
- MULQ 32(CX)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 16(SI),AX
- MULQ 0(CX)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 16(SI),AX
- MULQ 8(CX)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 16(SI),AX
- MULQ 16(CX)
- ADDQ AX,BX
- ADCQ DX,BP
- MOVQ 16(SI),DX
- IMUL3Q $19,DX,AX
- MULQ 24(CX)
- ADDQ AX,R8
- ADCQ DX,R9
- MOVQ 16(SI),DX
- IMUL3Q $19,DX,AX
- MULQ 32(CX)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 24(SI),AX
- MULQ 0(CX)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ 24(SI),AX
- MULQ 8(CX)
- ADDQ AX,BX
- ADCQ DX,BP
- MOVQ 0(SP),AX
- MULQ 24(CX)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 0(SP),AX
- MULQ 32(CX)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 32(SI),AX
- MULQ 0(CX)
- ADDQ AX,BX
- ADCQ DX,BP
- MOVQ 8(SP),AX
- MULQ 16(CX)
- ADDQ AX,R10
- ADCQ DX,R11
- MOVQ 8(SP),AX
- MULQ 24(CX)
- ADDQ AX,R12
- ADCQ DX,R13
- MOVQ 8(SP),AX
- MULQ 32(CX)
- ADDQ AX,R14
- ADCQ DX,R15
- MOVQ $REDMASK51,SI
- SHLQ $13,R8,R9
- ANDQ SI,R8
- SHLQ $13,R10,R11
- ANDQ SI,R10
- ADDQ R9,R10
- SHLQ $13,R12,R13
- ANDQ SI,R12
- ADDQ R11,R12
- SHLQ $13,R14,R15
- ANDQ SI,R14
- ADDQ R13,R14
- SHLQ $13,BX,BP
- ANDQ SI,BX
- ADDQ R15,BX
- IMUL3Q $19,BP,DX
- ADDQ DX,R8
- MOVQ R8,DX
- SHRQ $51,DX
- ADDQ R10,DX
- MOVQ DX,CX
- SHRQ $51,DX
- ANDQ SI,R8
- ADDQ R12,DX
- MOVQ DX,R9
- SHRQ $51,DX
- ANDQ SI,CX
- ADDQ R14,DX
- MOVQ DX,AX
- SHRQ $51,DX
- ANDQ SI,R9
- ADDQ BX,DX
- MOVQ DX,R10
- SHRQ $51,DX
- ANDQ SI,AX
- IMUL3Q $19,DX,DX
- ADDQ DX,R8
- ANDQ SI,R10
- MOVQ R8,0(DI)
- MOVQ CX,8(DI)
- MOVQ R9,16(DI)
- MOVQ AX,24(DI)
- MOVQ R10,32(DI)
- RET
-
-// func square(out, in *[5]uint64)
-TEXT ·square(SB),7,$0-16
- MOVQ out+0(FP), DI
- MOVQ in+8(FP), SI
-
- MOVQ 0(SI),AX
- MULQ 0(SI)
- MOVQ AX,CX
- MOVQ DX,R8
- MOVQ 0(SI),AX
- SHLQ $1,AX
- MULQ 8(SI)
- MOVQ AX,R9
- MOVQ DX,R10
- MOVQ 0(SI),AX
- SHLQ $1,AX
- MULQ 16(SI)
- MOVQ AX,R11
- MOVQ DX,R12
- MOVQ 0(SI),AX
- SHLQ $1,AX
- MULQ 24(SI)
- MOVQ AX,R13
- MOVQ DX,R14
- MOVQ 0(SI),AX
- SHLQ $1,AX
- MULQ 32(SI)
- MOVQ AX,R15
- MOVQ DX,BX
- MOVQ 8(SI),AX
- MULQ 8(SI)
- ADDQ AX,R11
- ADCQ DX,R12
- MOVQ 8(SI),AX
- SHLQ $1,AX
- MULQ 16(SI)
- ADDQ AX,R13
- ADCQ DX,R14
- MOVQ 8(SI),AX
- SHLQ $1,AX
- MULQ 24(SI)
- ADDQ AX,R15
- ADCQ DX,BX
- MOVQ 8(SI),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SI)
- ADDQ AX,CX
- ADCQ DX,R8
- MOVQ 16(SI),AX
- MULQ 16(SI)
- ADDQ AX,R15
- ADCQ DX,BX
- MOVQ 16(SI),DX
- IMUL3Q $38,DX,AX
- MULQ 24(SI)
- ADDQ AX,CX
- ADCQ DX,R8
- MOVQ 16(SI),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SI)
- ADDQ AX,R9
- ADCQ DX,R10
- MOVQ 24(SI),DX
- IMUL3Q $19,DX,AX
- MULQ 24(SI)
- ADDQ AX,R9
- ADCQ DX,R10
- MOVQ 24(SI),DX
- IMUL3Q $38,DX,AX
- MULQ 32(SI)
- ADDQ AX,R11
- ADCQ DX,R12
- MOVQ 32(SI),DX
- IMUL3Q $19,DX,AX
- MULQ 32(SI)
- ADDQ AX,R13
- ADCQ DX,R14
- MOVQ $REDMASK51,SI
- SHLQ $13,CX,R8
- ANDQ SI,CX
- SHLQ $13,R9,R10
- ANDQ SI,R9
- ADDQ R8,R9
- SHLQ $13,R11,R12
- ANDQ SI,R11
- ADDQ R10,R11
- SHLQ $13,R13,R14
- ANDQ SI,R13
- ADDQ R12,R13
- SHLQ $13,R15,BX
- ANDQ SI,R15
- ADDQ R14,R15
- IMUL3Q $19,BX,DX
- ADDQ DX,CX
- MOVQ CX,DX
- SHRQ $51,DX
- ADDQ R9,DX
- ANDQ SI,CX
- MOVQ DX,R8
- SHRQ $51,DX
- ADDQ R11,DX
- ANDQ SI,R8
- MOVQ DX,R9
- SHRQ $51,DX
- ADDQ R13,DX
- ANDQ SI,R9
- MOVQ DX,AX
- SHRQ $51,DX
- ADDQ R15,DX
- ANDQ SI,AX
- MOVQ DX,R10
- SHRQ $51,DX
- IMUL3Q $19,DX,DX
- ADDQ DX,CX
- ANDQ SI,R10
- MOVQ CX,0(DI)
- MOVQ R8,8(DI)
- MOVQ R9,16(DI)
- MOVQ AX,24(DI)
- MOVQ R10,32(DI)
- RET
diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go b/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go
deleted file mode 100644
index c43b13fc..00000000
--- a/vendor/golang.org/x/crypto/curve25519/curve25519_generic.go
+++ /dev/null
@@ -1,828 +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 curve25519
-
-import "encoding/binary"
-
-// This code is a port of the public domain, "ref10" implementation of
-// curve25519 from SUPERCOP 20130419 by D. J. Bernstein.
-
-// 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
-
-func feZero(fe *fieldElement) {
- for i := range fe {
- fe[i] = 0
- }
-}
-
-func feOne(fe *fieldElement) {
- feZero(fe)
- fe[0] = 1
-}
-
-func feAdd(dst, a, b *fieldElement) {
- for i := range dst {
- dst[i] = a[i] + b[i]
- }
-}
-
-func feSub(dst, a, b *fieldElement) {
- for i := range dst {
- dst[i] = a[i] - b[i]
- }
-}
-
-func feCopy(dst, src *fieldElement) {
- for i := range dst {
- dst[i] = src[i]
- }
-}
-
-// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0.
-//
-// Preconditions: b in {0,1}.
-func feCSwap(f, g *fieldElement, b int32) {
- b = -b
- for i := range f {
- t := b & (f[i] ^ g[i])
- f[i] ^= t
- g[i] ^= t
- }
-}
-
-// load3 reads a 24-bit, little-endian value from in.
-func load3(in []byte) int64 {
- var r int64
- r = int64(in[0])
- r |= int64(in[1]) << 8
- r |= int64(in[2]) << 16
- return r
-}
-
-// load4 reads a 32-bit, little-endian value from in.
-func load4(in []byte) int64 {
- return int64(binary.LittleEndian.Uint32(in))
-}
-
-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:]) & 0x7fffff) << 2
-
- var carry [10]int64
- carry[9] = (h9 + 1<<24) >> 25
- h0 += carry[9] * 19
- h9 -= carry[9] << 25
- carry[1] = (h1 + 1<<24) >> 25
- h2 += carry[1]
- h1 -= carry[1] << 25
- carry[3] = (h3 + 1<<24) >> 25
- h4 += carry[3]
- h3 -= carry[3] << 25
- carry[5] = (h5 + 1<<24) >> 25
- h6 += carry[5]
- h5 -= carry[5] << 25
- carry[7] = (h7 + 1<<24) >> 25
- h8 += carry[7]
- h7 -= carry[7] << 25
-
- carry[0] = (h0 + 1<<25) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 26
- carry[2] = (h2 + 1<<25) >> 26
- h3 += carry[2]
- h2 -= carry[2] << 26
- carry[4] = (h4 + 1<<25) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
- carry[6] = (h6 + 1<<25) >> 26
- h7 += carry[6]
- h6 -= carry[6] << 26
- carry[8] = (h8 + 1<<25) >> 26
- h9 += carry[8]
- h8 -= carry[8] << 26
-
- dst[0] = int32(h0)
- dst[1] = int32(h1)
- dst[2] = int32(h2)
- dst[3] = int32(h3)
- dst[4] = int32(h4)
- dst[5] = int32(h5)
- dst[6] = int32(h6)
- dst[7] = int32(h7)
- dst[8] = int32(h8)
- dst[9] = int32(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<y<1.
-//
-// Write r=h-pq.
-// Have 0<=r<=p-1=2^255-20.
-// Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
-//
-// Write x=r+19(2^-255)r+y.
-// Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
-//
-// Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
-// so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
-func feToBytes(s *[32]byte, h *fieldElement) {
- var carry [10]int32
-
- q := (19*h[9] + (1 << 24)) >> 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)
-}
-
-// 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 := f[0]
- f1 := f[1]
- f2 := f[2]
- f3 := f[3]
- f4 := f[4]
- f5 := f[5]
- f6 := f[6]
- f7 := f[7]
- f8 := f[8]
- f9 := f[9]
- g0 := g[0]
- g1 := g[1]
- g2 := g[2]
- g3 := g[3]
- g4 := g[4]
- g5 := g[5]
- g6 := g[6]
- g7 := g[7]
- g8 := g[8]
- g9 := g[9]
- g1_19 := 19 * g1 // 1.4*2^29
- g2_19 := 19 * g2 // 1.4*2^30; still ok
- g3_19 := 19 * g3
- g4_19 := 19 * g4
- g5_19 := 19 * g5
- g6_19 := 19 * g6
- g7_19 := 19 * g7
- g8_19 := 19 * g8
- g9_19 := 19 * g9
- f1_2 := 2 * f1
- f3_2 := 2 * f3
- f5_2 := 2 * f5
- f7_2 := 2 * f7
- f9_2 := 2 * f9
- f0g0 := int64(f0) * int64(g0)
- f0g1 := int64(f0) * int64(g1)
- f0g2 := int64(f0) * int64(g2)
- f0g3 := int64(f0) * int64(g3)
- f0g4 := int64(f0) * int64(g4)
- f0g5 := int64(f0) * int64(g5)
- f0g6 := int64(f0) * int64(g6)
- f0g7 := int64(f0) * int64(g7)
- f0g8 := int64(f0) * int64(g8)
- f0g9 := int64(f0) * int64(g9)
- f1g0 := int64(f1) * int64(g0)
- f1g1_2 := int64(f1_2) * int64(g1)
- f1g2 := int64(f1) * int64(g2)
- f1g3_2 := int64(f1_2) * int64(g3)
- f1g4 := int64(f1) * int64(g4)
- f1g5_2 := int64(f1_2) * int64(g5)
- f1g6 := int64(f1) * int64(g6)
- f1g7_2 := int64(f1_2) * int64(g7)
- f1g8 := int64(f1) * int64(g8)
- f1g9_38 := int64(f1_2) * int64(g9_19)
- f2g0 := int64(f2) * int64(g0)
- f2g1 := int64(f2) * int64(g1)
- f2g2 := int64(f2) * int64(g2)
- f2g3 := int64(f2) * int64(g3)
- f2g4 := int64(f2) * int64(g4)
- f2g5 := int64(f2) * int64(g5)
- f2g6 := int64(f2) * int64(g6)
- f2g7 := int64(f2) * int64(g7)
- f2g8_19 := int64(f2) * int64(g8_19)
- f2g9_19 := int64(f2) * int64(g9_19)
- f3g0 := int64(f3) * int64(g0)
- f3g1_2 := int64(f3_2) * int64(g1)
- f3g2 := int64(f3) * int64(g2)
- f3g3_2 := int64(f3_2) * int64(g3)
- f3g4 := int64(f3) * int64(g4)
- f3g5_2 := int64(f3_2) * int64(g5)
- f3g6 := int64(f3) * int64(g6)
- f3g7_38 := int64(f3_2) * int64(g7_19)
- f3g8_19 := int64(f3) * int64(g8_19)
- f3g9_38 := int64(f3_2) * int64(g9_19)
- f4g0 := int64(f4) * int64(g0)
- f4g1 := int64(f4) * int64(g1)
- f4g2 := int64(f4) * int64(g2)
- f4g3 := int64(f4) * int64(g3)
- f4g4 := int64(f4) * int64(g4)
- f4g5 := int64(f4) * int64(g5)
- f4g6_19 := int64(f4) * int64(g6_19)
- f4g7_19 := int64(f4) * int64(g7_19)
- f4g8_19 := int64(f4) * int64(g8_19)
- f4g9_19 := int64(f4) * int64(g9_19)
- f5g0 := int64(f5) * int64(g0)
- f5g1_2 := int64(f5_2) * int64(g1)
- f5g2 := int64(f5) * int64(g2)
- f5g3_2 := int64(f5_2) * int64(g3)
- f5g4 := int64(f5) * int64(g4)
- f5g5_38 := int64(f5_2) * int64(g5_19)
- f5g6_19 := int64(f5) * int64(g6_19)
- f5g7_38 := int64(f5_2) * int64(g7_19)
- f5g8_19 := int64(f5) * int64(g8_19)
- f5g9_38 := int64(f5_2) * int64(g9_19)
- f6g0 := int64(f6) * int64(g0)
- f6g1 := int64(f6) * int64(g1)
- f6g2 := int64(f6) * int64(g2)
- f6g3 := int64(f6) * int64(g3)
- f6g4_19 := int64(f6) * int64(g4_19)
- f6g5_19 := int64(f6) * int64(g5_19)
- f6g6_19 := int64(f6) * int64(g6_19)
- f6g7_19 := int64(f6) * int64(g7_19)
- f6g8_19 := int64(f6) * int64(g8_19)
- f6g9_19 := int64(f6) * int64(g9_19)
- f7g0 := int64(f7) * int64(g0)
- f7g1_2 := int64(f7_2) * int64(g1)
- f7g2 := int64(f7) * int64(g2)
- f7g3_38 := int64(f7_2) * int64(g3_19)
- f7g4_19 := int64(f7) * int64(g4_19)
- f7g5_38 := int64(f7_2) * int64(g5_19)
- f7g6_19 := int64(f7) * int64(g6_19)
- f7g7_38 := int64(f7_2) * int64(g7_19)
- f7g8_19 := int64(f7) * int64(g8_19)
- f7g9_38 := int64(f7_2) * int64(g9_19)
- f8g0 := int64(f8) * int64(g0)
- f8g1 := int64(f8) * int64(g1)
- f8g2_19 := int64(f8) * int64(g2_19)
- f8g3_19 := int64(f8) * int64(g3_19)
- f8g4_19 := int64(f8) * int64(g4_19)
- f8g5_19 := int64(f8) * int64(g5_19)
- f8g6_19 := int64(f8) * int64(g6_19)
- f8g7_19 := int64(f8) * int64(g7_19)
- f8g8_19 := int64(f8) * int64(g8_19)
- f8g9_19 := int64(f8) * int64(g9_19)
- f9g0 := int64(f9) * int64(g0)
- f9g1_38 := int64(f9_2) * int64(g1_19)
- f9g2_19 := int64(f9) * int64(g2_19)
- f9g3_38 := int64(f9_2) * int64(g3_19)
- f9g4_19 := int64(f9) * int64(g4_19)
- f9g5_38 := int64(f9_2) * int64(g5_19)
- f9g6_19 := int64(f9) * int64(g6_19)
- f9g7_38 := int64(f9_2) * int64(g7_19)
- f9g8_19 := int64(f9) * int64(g8_19)
- f9g9_38 := int64(f9_2) * int64(g9_19)
- h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38
- h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19
- h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38
- h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19
- h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38
- h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19
- h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38
- h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19
- h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38
- h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0
- var carry [10]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
-
- carry[0] = (h0 + (1 << 25)) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 26
- carry[4] = (h4 + (1 << 25)) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
- // |h0| <= 2^25
- // |h4| <= 2^25
- // |h1| <= 1.51*2^58
- // |h5| <= 1.51*2^58
-
- carry[1] = (h1 + (1 << 24)) >> 25
- h2 += carry[1]
- h1 -= carry[1] << 25
- carry[5] = (h5 + (1 << 24)) >> 25
- h6 += carry[5]
- h5 -= carry[5] << 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
-
- carry[2] = (h2 + (1 << 25)) >> 26
- h3 += carry[2]
- h2 -= carry[2] << 26
- carry[6] = (h6 + (1 << 25)) >> 26
- h7 += carry[6]
- h6 -= carry[6] << 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
-
- carry[3] = (h3 + (1 << 24)) >> 25
- h4 += carry[3]
- h3 -= carry[3] << 25
- carry[7] = (h7 + (1 << 24)) >> 25
- h8 += carry[7]
- h7 -= carry[7] << 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
-
- carry[4] = (h4 + (1 << 25)) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
- carry[8] = (h8 + (1 << 25)) >> 26
- h9 += carry[8]
- h8 -= carry[8] << 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
-
- carry[9] = (h9 + (1 << 24)) >> 25
- h0 += carry[9] * 19
- h9 -= carry[9] << 25
- // |h9| <= 2^24; from now on fits into int32 unchanged
- // |h0| <= 1.8*2^37
-
- carry[0] = (h0 + (1 << 25)) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 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)
-}
-
-// 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) {
- f0 := f[0]
- f1 := f[1]
- f2 := f[2]
- f3 := f[3]
- f4 := f[4]
- f5 := f[5]
- f6 := f[6]
- f7 := f[7]
- f8 := f[8]
- f9 := f[9]
- f0_2 := 2 * f0
- f1_2 := 2 * f1
- f2_2 := 2 * f2
- f3_2 := 2 * f3
- f4_2 := 2 * f4
- f5_2 := 2 * f5
- f6_2 := 2 * f6
- f7_2 := 2 * f7
- 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
- f0f0 := int64(f0) * int64(f0)
- f0f1_2 := int64(f0_2) * int64(f1)
- f0f2_2 := int64(f0_2) * int64(f2)
- f0f3_2 := int64(f0_2) * int64(f3)
- f0f4_2 := int64(f0_2) * int64(f4)
- f0f5_2 := int64(f0_2) * int64(f5)
- f0f6_2 := int64(f0_2) * int64(f6)
- f0f7_2 := int64(f0_2) * int64(f7)
- f0f8_2 := int64(f0_2) * int64(f8)
- f0f9_2 := int64(f0_2) * int64(f9)
- f1f1_2 := int64(f1_2) * int64(f1)
- f1f2_2 := int64(f1_2) * int64(f2)
- f1f3_4 := int64(f1_2) * int64(f3_2)
- f1f4_2 := int64(f1_2) * int64(f4)
- f1f5_4 := int64(f1_2) * int64(f5_2)
- f1f6_2 := int64(f1_2) * int64(f6)
- f1f7_4 := int64(f1_2) * int64(f7_2)
- f1f8_2 := int64(f1_2) * int64(f8)
- f1f9_76 := int64(f1_2) * int64(f9_38)
- f2f2 := int64(f2) * int64(f2)
- f2f3_2 := int64(f2_2) * int64(f3)
- f2f4_2 := int64(f2_2) * int64(f4)
- f2f5_2 := int64(f2_2) * int64(f5)
- f2f6_2 := int64(f2_2) * int64(f6)
- f2f7_2 := int64(f2_2) * int64(f7)
- f2f8_38 := int64(f2_2) * int64(f8_19)
- f2f9_38 := int64(f2) * int64(f9_38)
- f3f3_2 := int64(f3_2) * int64(f3)
- f3f4_2 := int64(f3_2) * int64(f4)
- f3f5_4 := int64(f3_2) * int64(f5_2)
- f3f6_2 := int64(f3_2) * int64(f6)
- f3f7_76 := int64(f3_2) * int64(f7_38)
- f3f8_38 := int64(f3_2) * int64(f8_19)
- f3f9_76 := int64(f3_2) * int64(f9_38)
- f4f4 := int64(f4) * int64(f4)
- f4f5_2 := int64(f4_2) * int64(f5)
- f4f6_38 := int64(f4_2) * int64(f6_19)
- f4f7_38 := int64(f4) * int64(f7_38)
- f4f8_38 := int64(f4_2) * int64(f8_19)
- f4f9_38 := int64(f4) * int64(f9_38)
- f5f5_38 := int64(f5) * int64(f5_38)
- f5f6_38 := int64(f5_2) * int64(f6_19)
- f5f7_76 := int64(f5_2) * int64(f7_38)
- f5f8_38 := int64(f5_2) * int64(f8_19)
- f5f9_76 := int64(f5_2) * int64(f9_38)
- f6f6_19 := int64(f6) * int64(f6_19)
- f6f7_38 := int64(f6) * int64(f7_38)
- f6f8_38 := int64(f6_2) * int64(f8_19)
- f6f9_38 := int64(f6) * int64(f9_38)
- f7f7_38 := int64(f7) * int64(f7_38)
- f7f8_38 := int64(f7_2) * int64(f8_19)
- f7f9_76 := int64(f7_2) * int64(f9_38)
- f8f8_19 := int64(f8) * int64(f8_19)
- f8f9_38 := int64(f8) * int64(f9_38)
- f9f9_38 := int64(f9) * int64(f9_38)
- h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38
- h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38
- h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19
- h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38
- h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38
- h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38
- h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19
- h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38
- h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38
- h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2
- var carry [10]int64
-
- carry[0] = (h0 + (1 << 25)) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 26
- carry[4] = (h4 + (1 << 25)) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
-
- carry[1] = (h1 + (1 << 24)) >> 25
- h2 += carry[1]
- h1 -= carry[1] << 25
- carry[5] = (h5 + (1 << 24)) >> 25
- h6 += carry[5]
- h5 -= carry[5] << 25
-
- carry[2] = (h2 + (1 << 25)) >> 26
- h3 += carry[2]
- h2 -= carry[2] << 26
- carry[6] = (h6 + (1 << 25)) >> 26
- h7 += carry[6]
- h6 -= carry[6] << 26
-
- carry[3] = (h3 + (1 << 24)) >> 25
- h4 += carry[3]
- h3 -= carry[3] << 25
- carry[7] = (h7 + (1 << 24)) >> 25
- h8 += carry[7]
- h7 -= carry[7] << 25
-
- carry[4] = (h4 + (1 << 25)) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
- carry[8] = (h8 + (1 << 25)) >> 26
- h9 += carry[8]
- h8 -= carry[8] << 26
-
- carry[9] = (h9 + (1 << 24)) >> 25
- h0 += carry[9] * 19
- h9 -= carry[9] << 25
-
- carry[0] = (h0 + (1 << 25)) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 26
-
- 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)
-}
-
-// feMul121666 calculates h = f * 121666. 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 feMul121666(h, f *fieldElement) {
- h0 := int64(f[0]) * 121666
- h1 := int64(f[1]) * 121666
- h2 := int64(f[2]) * 121666
- h3 := int64(f[3]) * 121666
- h4 := int64(f[4]) * 121666
- h5 := int64(f[5]) * 121666
- h6 := int64(f[6]) * 121666
- h7 := int64(f[7]) * 121666
- h8 := int64(f[8]) * 121666
- h9 := int64(f[9]) * 121666
- var carry [10]int64
-
- carry[9] = (h9 + (1 << 24)) >> 25
- h0 += carry[9] * 19
- h9 -= carry[9] << 25
- carry[1] = (h1 + (1 << 24)) >> 25
- h2 += carry[1]
- h1 -= carry[1] << 25
- carry[3] = (h3 + (1 << 24)) >> 25
- h4 += carry[3]
- h3 -= carry[3] << 25
- carry[5] = (h5 + (1 << 24)) >> 25
- h6 += carry[5]
- h5 -= carry[5] << 25
- carry[7] = (h7 + (1 << 24)) >> 25
- h8 += carry[7]
- h7 -= carry[7] << 25
-
- carry[0] = (h0 + (1 << 25)) >> 26
- h1 += carry[0]
- h0 -= carry[0] << 26
- carry[2] = (h2 + (1 << 25)) >> 26
- h3 += carry[2]
- h2 -= carry[2] << 26
- carry[4] = (h4 + (1 << 25)) >> 26
- h5 += carry[4]
- h4 -= carry[4] << 26
- carry[6] = (h6 + (1 << 25)) >> 26
- h7 += carry[6]
- h6 -= carry[6] << 26
- carry[8] = (h8 + (1 << 25)) >> 26
- h9 += carry[8]
- h8 -= carry[8] << 26
-
- 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)
-}
-
-// feInvert sets out = z^-1.
-func feInvert(out, z *fieldElement) {
- var t0, t1, t2, t3 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(&t2, &t0)
- for i = 1; i < 1; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t1, &t1, &t2)
- feSquare(&t2, &t1)
- for i = 1; i < 5; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t1, &t2, &t1)
- feSquare(&t2, &t1)
- for i = 1; i < 10; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t2, &t2, &t1)
- feSquare(&t3, &t2)
- for i = 1; i < 20; i++ {
- feSquare(&t3, &t3)
- }
- feMul(&t2, &t3, &t2)
- feSquare(&t2, &t2)
- for i = 1; i < 10; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t1, &t2, &t1)
- feSquare(&t2, &t1)
- for i = 1; i < 50; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t2, &t2, &t1)
- feSquare(&t3, &t2)
- for i = 1; i < 100; i++ {
- feSquare(&t3, &t3)
- }
- feMul(&t2, &t3, &t2)
- feSquare(&t2, &t2)
- for i = 1; i < 50; i++ {
- feSquare(&t2, &t2)
- }
- feMul(&t1, &t2, &t1)
- feSquare(&t1, &t1)
- for i = 1; i < 5; i++ {
- feSquare(&t1, &t1)
- }
- feMul(out, &t1, &t0)
-}
-
-func scalarMultGeneric(out, in, base *[32]byte) {
- var e [32]byte
-
- copy(e[:], in[:])
- e[0] &= 248
- e[31] &= 127
- e[31] |= 64
-
- var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement
- feFromBytes(&x1, base)
- feOne(&x2)
- feCopy(&x3, &x1)
- feOne(&z3)
-
- swap := int32(0)
- for pos := 254; pos >= 0; pos-- {
- b := e[pos/8] >> uint(pos&7)
- b &= 1
- swap ^= int32(b)
- feCSwap(&x2, &x3, swap)
- feCSwap(&z2, &z3, swap)
- swap = int32(b)
-
- feSub(&tmp0, &x3, &z3)
- feSub(&tmp1, &x2, &z2)
- feAdd(&x2, &x2, &z2)
- feAdd(&z2, &x3, &z3)
- feMul(&z3, &tmp0, &x2)
- feMul(&z2, &z2, &tmp1)
- feSquare(&tmp0, &tmp1)
- feSquare(&tmp1, &x2)
- feAdd(&x3, &z3, &z2)
- feSub(&z2, &z3, &z2)
- feMul(&x2, &tmp1, &tmp0)
- feSub(&tmp1, &tmp1, &tmp0)
- feSquare(&z2, &z2)
- feMul121666(&z3, &tmp1)
- feSquare(&x3, &x3)
- feAdd(&tmp0, &tmp0, &z3)
- feMul(&z3, &x1, &z2)
- feMul(&z2, &tmp1, &tmp0)
- }
-
- feCSwap(&x2, &x3, swap)
- feCSwap(&z2, &z3, swap)
-
- feInvert(&z2, &z2)
- feMul(&x2, &x2, &z2)
- feToBytes(out, &x2)
-}
diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go b/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go
deleted file mode 100644
index 259728af..00000000
--- a/vendor/golang.org/x/crypto/curve25519/curve25519_noasm.go
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2019 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 curve25519
-
-func scalarMult(out, in, base *[32]byte) {
- scalarMultGeneric(out, in, base)
-}
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/README b/vendor/golang.org/x/crypto/curve25519/internal/field/README
new file mode 100644
index 00000000..e25bca7d
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/README
@@ -0,0 +1,7 @@
+This package is kept in sync with crypto/ed25519/internal/edwards25519/field in
+the standard library.
+
+If there are any changes in the standard library that need to be synced to this
+package, run sync.sh. It will not overwrite any local changes made since the
+previous sync, so it's ok to land changes in this package first, and then sync
+to the standard library later.
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go
new file mode 100644
index 00000000..ca841ad9
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe.go
@@ -0,0 +1,416 @@
+// Copyright (c) 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 field implements fast arithmetic modulo 2^255-19.
+package field
+
+import (
+ "crypto/subtle"
+ "encoding/binary"
+ "math/bits"
+)
+
+// Element represents an element of the field GF(2^255-19). Note that this
+// is not a cryptographically secure group, and should only be used to interact
+// with edwards25519.Point coordinates.
+//
+// This type works similarly to math/big.Int, and all arguments and receivers
+// are allowed to alias.
+//
+// The zero value is a valid zero element.
+type Element struct {
+ // An element t represents the integer
+ // t.l0 + t.l1*2^51 + t.l2*2^102 + t.l3*2^153 + t.l4*2^204
+ //
+ // Between operations, all limbs are expected to be lower than 2^52.
+ l0 uint64
+ l1 uint64
+ l2 uint64
+ l3 uint64
+ l4 uint64
+}
+
+const maskLow51Bits uint64 = (1 << 51) - 1
+
+var feZero = &Element{0, 0, 0, 0, 0}
+
+// Zero sets v = 0, and returns v.
+func (v *Element) Zero() *Element {
+ *v = *feZero
+ return v
+}
+
+var feOne = &Element{1, 0, 0, 0, 0}
+
+// One sets v = 1, and returns v.
+func (v *Element) One() *Element {
+ *v = *feOne
+ return v
+}
+
+// reduce reduces v modulo 2^255 - 19 and returns it.
+func (v *Element) reduce() *Element {
+ v.carryPropagate()
+
+ // After the light reduction we now have a field element representation
+ // v < 2^255 + 2^13 * 19, but need v < 2^255 - 19.
+
+ // If v >= 2^255 - 19, then v + 19 >= 2^255, which would overflow 2^255 - 1,
+ // generating a carry. That is, c will be 0 if v < 2^255 - 19, and 1 otherwise.
+ c := (v.l0 + 19) >> 51
+ c = (v.l1 + c) >> 51
+ c = (v.l2 + c) >> 51
+ c = (v.l3 + c) >> 51
+ c = (v.l4 + c) >> 51
+
+ // If v < 2^255 - 19 and c = 0, this will be a no-op. Otherwise, it's
+ // effectively applying the reduction identity to the carry.
+ v.l0 += 19 * c
+
+ v.l1 += v.l0 >> 51
+ v.l0 = v.l0 & maskLow51Bits
+ v.l2 += v.l1 >> 51
+ v.l1 = v.l1 & maskLow51Bits
+ v.l3 += v.l2 >> 51
+ v.l2 = v.l2 & maskLow51Bits
+ v.l4 += v.l3 >> 51
+ v.l3 = v.l3 & maskLow51Bits
+ // no additional carry
+ v.l4 = v.l4 & maskLow51Bits
+
+ return v
+}
+
+// Add sets v = a + b, and returns v.
+func (v *Element) Add(a, b *Element) *Element {
+ v.l0 = a.l0 + b.l0
+ v.l1 = a.l1 + b.l1
+ v.l2 = a.l2 + b.l2
+ v.l3 = a.l3 + b.l3
+ v.l4 = a.l4 + b.l4
+ // Using the generic implementation here is actually faster than the
+ // assembly. Probably because the body of this function is so simple that
+ // the compiler can figure out better optimizations by inlining the carry
+ // propagation. TODO
+ return v.carryPropagateGeneric()
+}
+
+// Subtract sets v = a - b, and returns v.
+func (v *Element) Subtract(a, b *Element) *Element {
+ // We first add 2 * p, to guarantee the subtraction won't underflow, and
+ // then subtract b (which can be up to 2^255 + 2^13 * 19).
+ v.l0 = (a.l0 + 0xFFFFFFFFFFFDA) - b.l0
+ v.l1 = (a.l1 + 0xFFFFFFFFFFFFE) - b.l1
+ v.l2 = (a.l2 + 0xFFFFFFFFFFFFE) - b.l2
+ v.l3 = (a.l3 + 0xFFFFFFFFFFFFE) - b.l3
+ v.l4 = (a.l4 + 0xFFFFFFFFFFFFE) - b.l4
+ return v.carryPropagate()
+}
+
+// Negate sets v = -a, and returns v.
+func (v *Element) Negate(a *Element) *Element {
+ return v.Subtract(feZero, a)
+}
+
+// Invert sets v = 1/z mod p, and returns v.
+//
+// If z == 0, Invert returns v = 0.
+func (v *Element) Invert(z *Element) *Element {
+ // Inversion is implemented as exponentiation with exponent p − 2. It uses the
+ // same sequence of 255 squarings and 11 multiplications as [Curve25519].
+ var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t Element
+
+ z2.Square(z) // 2
+ t.Square(&z2) // 4
+ t.Square(&t) // 8
+ z9.Multiply(&t, z) // 9
+ z11.Multiply(&z9, &z2) // 11
+ t.Square(&z11) // 22
+ z2_5_0.Multiply(&t, &z9) // 31 = 2^5 - 2^0
+
+ t.Square(&z2_5_0) // 2^6 - 2^1
+ for i := 0; i < 4; i++ {
+ t.Square(&t) // 2^10 - 2^5
+ }
+ z2_10_0.Multiply(&t, &z2_5_0) // 2^10 - 2^0
+
+ t.Square(&z2_10_0) // 2^11 - 2^1
+ for i := 0; i < 9; i++ {
+ t.Square(&t) // 2^20 - 2^10
+ }
+ z2_20_0.Multiply(&t, &z2_10_0) // 2^20 - 2^0
+
+ t.Square(&z2_20_0) // 2^21 - 2^1
+ for i := 0; i < 19; i++ {
+ t.Square(&t) // 2^40 - 2^20
+ }
+ t.Multiply(&t, &z2_20_0) // 2^40 - 2^0
+
+ t.Square(&t) // 2^41 - 2^1
+ for i := 0; i < 9; i++ {
+ t.Square(&t) // 2^50 - 2^10
+ }
+ z2_50_0.Multiply(&t, &z2_10_0) // 2^50 - 2^0
+
+ t.Square(&z2_50_0) // 2^51 - 2^1
+ for i := 0; i < 49; i++ {
+ t.Square(&t) // 2^100 - 2^50
+ }
+ z2_100_0.Multiply(&t, &z2_50_0) // 2^100 - 2^0
+
+ t.Square(&z2_100_0) // 2^101 - 2^1
+ for i := 0; i < 99; i++ {
+ t.Square(&t) // 2^200 - 2^100
+ }
+ t.Multiply(&t, &z2_100_0) // 2^200 - 2^0
+
+ t.Square(&t) // 2^201 - 2^1
+ for i := 0; i < 49; i++ {
+ t.Square(&t) // 2^250 - 2^50
+ }
+ t.Multiply(&t, &z2_50_0) // 2^250 - 2^0
+
+ t.Square(&t) // 2^251 - 2^1
+ t.Square(&t) // 2^252 - 2^2
+ t.Square(&t) // 2^253 - 2^3
+ t.Square(&t) // 2^254 - 2^4
+ t.Square(&t) // 2^255 - 2^5
+
+ return v.Multiply(&t, &z11) // 2^255 - 21
+}
+
+// Set sets v = a, and returns v.
+func (v *Element) Set(a *Element) *Element {
+ *v = *a
+ return v
+}
+
+// SetBytes sets v to x, which must be a 32-byte little-endian encoding.
+//
+// Consistent with RFC 7748, the most significant bit (the high bit of the
+// last byte) is ignored, and non-canonical values (2^255-19 through 2^255-1)
+// are accepted. Note that this is laxer than specified by RFC 8032.
+func (v *Element) SetBytes(x []byte) *Element {
+ if len(x) != 32 {
+ panic("edwards25519: invalid field element input size")
+ }
+
+ // Bits 0:51 (bytes 0:8, bits 0:64, shift 0, mask 51).
+ v.l0 = binary.LittleEndian.Uint64(x[0:8])
+ v.l0 &= maskLow51Bits
+ // Bits 51:102 (bytes 6:14, bits 48:112, shift 3, mask 51).
+ v.l1 = binary.LittleEndian.Uint64(x[6:14]) >> 3
+ v.l1 &= maskLow51Bits
+ // Bits 102:153 (bytes 12:20, bits 96:160, shift 6, mask 51).
+ v.l2 = binary.LittleEndian.Uint64(x[12:20]) >> 6
+ v.l2 &= maskLow51Bits
+ // Bits 153:204 (bytes 19:27, bits 152:216, shift 1, mask 51).
+ v.l3 = binary.LittleEndian.Uint64(x[19:27]) >> 1
+ v.l3 &= maskLow51Bits
+ // Bits 204:251 (bytes 24:32, bits 192:256, shift 12, mask 51).
+ // Note: not bytes 25:33, shift 4, to avoid overread.
+ v.l4 = binary.LittleEndian.Uint64(x[24:32]) >> 12
+ v.l4 &= maskLow51Bits
+
+ return v
+}
+
+// Bytes returns the canonical 32-byte little-endian encoding of v.
+func (v *Element) Bytes() []byte {
+ // This function is outlined to make the allocations inline in the caller
+ // rather than happen on the heap.
+ var out [32]byte
+ return v.bytes(&out)
+}
+
+func (v *Element) bytes(out *[32]byte) []byte {
+ t := *v
+ t.reduce()
+
+ var buf [8]byte
+ for i, l := range [5]uint64{t.l0, t.l1, t.l2, t.l3, t.l4} {
+ bitsOffset := i * 51
+ binary.LittleEndian.PutUint64(buf[:], l<<uint(bitsOffset%8))
+ for i, bb := range buf {
+ off := bitsOffset/8 + i
+ if off >= len(out) {
+ break
+ }
+ out[off] |= bb
+ }
+ }
+
+ return out[:]
+}
+
+// Equal returns 1 if v and u are equal, and 0 otherwise.
+func (v *Element) Equal(u *Element) int {
+ sa, sv := u.Bytes(), v.Bytes()
+ return subtle.ConstantTimeCompare(sa, sv)
+}
+
+// mask64Bits returns 0xffffffff if cond is 1, and 0 otherwise.
+func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) }
+
+// Select sets v to a if cond == 1, and to b if cond == 0.
+func (v *Element) Select(a, b *Element, cond int) *Element {
+ m := mask64Bits(cond)
+ v.l0 = (m & a.l0) | (^m & b.l0)
+ v.l1 = (m & a.l1) | (^m & b.l1)
+ v.l2 = (m & a.l2) | (^m & b.l2)
+ v.l3 = (m & a.l3) | (^m & b.l3)
+ v.l4 = (m & a.l4) | (^m & b.l4)
+ return v
+}
+
+// Swap swaps v and u if cond == 1 or leaves them unchanged if cond == 0, and returns v.
+func (v *Element) Swap(u *Element, cond int) {
+ m := mask64Bits(cond)
+ t := m & (v.l0 ^ u.l0)
+ v.l0 ^= t
+ u.l0 ^= t
+ t = m & (v.l1 ^ u.l1)
+ v.l1 ^= t
+ u.l1 ^= t
+ t = m & (v.l2 ^ u.l2)
+ v.l2 ^= t
+ u.l2 ^= t
+ t = m & (v.l3 ^ u.l3)
+ v.l3 ^= t
+ u.l3 ^= t
+ t = m & (v.l4 ^ u.l4)
+ v.l4 ^= t
+ u.l4 ^= t
+}
+
+// IsNegative returns 1 if v is negative, and 0 otherwise.
+func (v *Element) IsNegative() int {
+ return int(v.Bytes()[0] & 1)
+}
+
+// Absolute sets v to |u|, and returns v.
+func (v *Element) Absolute(u *Element) *Element {
+ return v.Select(new(Element).Negate(u), u, u.IsNegative())
+}
+
+// Multiply sets v = x * y, and returns v.
+func (v *Element) Multiply(x, y *Element) *Element {
+ feMul(v, x, y)
+ return v
+}
+
+// Square sets v = x * x, and returns v.
+func (v *Element) Square(x *Element) *Element {
+ feSquare(v, x)
+ return v
+}
+
+// Mult32 sets v = x * y, and returns v.
+func (v *Element) Mult32(x *Element, y uint32) *Element {
+ x0lo, x0hi := mul51(x.l0, y)
+ x1lo, x1hi := mul51(x.l1, y)
+ x2lo, x2hi := mul51(x.l2, y)
+ x3lo, x3hi := mul51(x.l3, y)
+ x4lo, x4hi := mul51(x.l4, y)
+ v.l0 = x0lo + 19*x4hi // carried over per the reduction identity
+ v.l1 = x1lo + x0hi
+ v.l2 = x2lo + x1hi
+ v.l3 = x3lo + x2hi
+ v.l4 = x4lo + x3hi
+ // The hi portions are going to be only 32 bits, plus any previous excess,
+ // so we can skip the carry propagation.
+ return v
+}
+
+// mul51 returns lo + hi * 2⁵¹ = a * b.
+func mul51(a uint64, b uint32) (lo uint64, hi uint64) {
+ mh, ml := bits.Mul64(a, uint64(b))
+ lo = ml & maskLow51Bits
+ hi = (mh << 13) | (ml >> 51)
+ return
+}
+
+// Pow22523 set v = x^((p-5)/8), and returns v. (p-5)/8 is 2^252-3.
+func (v *Element) Pow22523(x *Element) *Element {
+ var t0, t1, t2 Element
+
+ t0.Square(x) // x^2
+ t1.Square(&t0) // x^4
+ t1.Square(&t1) // x^8
+ t1.Multiply(x, &t1) // x^9
+ t0.Multiply(&t0, &t1) // x^11
+ t0.Square(&t0) // x^22
+ t0.Multiply(&t1, &t0) // x^31
+ t1.Square(&t0) // x^62
+ for i := 1; i < 5; i++ { // x^992
+ t1.Square(&t1)
+ }
+ t0.Multiply(&t1, &t0) // x^1023 -> 1023 = 2^10 - 1
+ t1.Square(&t0) // 2^11 - 2
+ for i := 1; i < 10; i++ { // 2^20 - 2^10
+ t1.Square(&t1)
+ }
+ t1.Multiply(&t1, &t0) // 2^20 - 1
+ t2.Square(&t1) // 2^21 - 2
+ for i := 1; i < 20; i++ { // 2^40 - 2^20
+ t2.Square(&t2)
+ }
+ t1.Multiply(&t2, &t1) // 2^40 - 1
+ t1.Square(&t1) // 2^41 - 2
+ for i := 1; i < 10; i++ { // 2^50 - 2^10
+ t1.Square(&t1)
+ }
+ t0.Multiply(&t1, &t0) // 2^50 - 1
+ t1.Square(&t0) // 2^51 - 2
+ for i := 1; i < 50; i++ { // 2^100 - 2^50
+ t1.Square(&t1)
+ }
+ t1.Multiply(&t1, &t0) // 2^100 - 1
+ t2.Square(&t1) // 2^101 - 2
+ for i := 1; i < 100; i++ { // 2^200 - 2^100
+ t2.Square(&t2)
+ }
+ t1.Multiply(&t2, &t1) // 2^200 - 1
+ t1.Square(&t1) // 2^201 - 2
+ for i := 1; i < 50; i++ { // 2^250 - 2^50
+ t1.Square(&t1)
+ }
+ t0.Multiply(&t1, &t0) // 2^250 - 1
+ t0.Square(&t0) // 2^251 - 2
+ t0.Square(&t0) // 2^252 - 4
+ return v.Multiply(&t0, x) // 2^252 - 3 -> x^(2^252-3)
+}
+
+// sqrtM1 is 2^((p-1)/4), which squared is equal to -1 by Euler's Criterion.
+var sqrtM1 = &Element{1718705420411056, 234908883556509,
+ 2233514472574048, 2117202627021982, 765476049583133}
+
+// SqrtRatio sets r to the non-negative square root of the ratio of u and v.
+//
+// If u/v is square, SqrtRatio returns r and 1. If u/v is not square, SqrtRatio
+// sets r according to Section 4.3 of draft-irtf-cfrg-ristretto255-decaf448-00,
+// and returns r and 0.
+func (r *Element) SqrtRatio(u, v *Element) (rr *Element, wasSquare int) {
+ var a, b Element
+
+ // r = (u * v3) * (u * v7)^((p-5)/8)
+ v2 := a.Square(v)
+ uv3 := b.Multiply(u, b.Multiply(v2, v))
+ uv7 := a.Multiply(uv3, a.Square(v2))
+ r.Multiply(uv3, r.Pow22523(uv7))
+
+ check := a.Multiply(v, a.Square(r)) // check = v * r^2
+
+ uNeg := b.Negate(u)
+ correctSignSqrt := check.Equal(u)
+ flippedSignSqrt := check.Equal(uNeg)
+ flippedSignSqrtI := check.Equal(uNeg.Multiply(uNeg, sqrtM1))
+
+ rPrime := b.Multiply(r, sqrtM1) // r_prime = SQRT_M1 * r
+ // r = CT_SELECT(r_prime IF flipped_sign_sqrt | flipped_sign_sqrt_i ELSE r)
+ r.Select(rPrime, r, flippedSignSqrt|flippedSignSqrtI)
+
+ r.Absolute(r) // Choose the nonnegative square root.
+ return r, correctSignSqrt | flippedSignSqrt
+}
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go
new file mode 100644
index 00000000..44dc8e8c
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.go
@@ -0,0 +1,13 @@
+// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
+
+// +build amd64,gc,!purego
+
+package field
+
+// feMul sets out = a * b. It works like feMulGeneric.
+//go:noescape
+func feMul(out *Element, a *Element, b *Element)
+
+// feSquare sets out = a * a. It works like feSquareGeneric.
+//go:noescape
+func feSquare(out *Element, a *Element)
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s
new file mode 100644
index 00000000..293f013c
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s
@@ -0,0 +1,379 @@
+// Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
+
+//go:build amd64 && gc && !purego
+// +build amd64,gc,!purego
+
+#include "textflag.h"
+
+// func feMul(out *Element, a *Element, b *Element)
+TEXT ·feMul(SB), NOSPLIT, $0-24
+ MOVQ a+8(FP), CX
+ MOVQ b+16(FP), BX
+
+ // r0 = a0×b0
+ MOVQ (CX), AX
+ MULQ (BX)
+ MOVQ AX, DI
+ MOVQ DX, SI
+
+ // r0 += 19×a1×b4
+ MOVQ 8(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 32(BX)
+ ADDQ AX, DI
+ ADCQ DX, SI
+
+ // r0 += 19×a2×b3
+ MOVQ 16(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 24(BX)
+ ADDQ AX, DI
+ ADCQ DX, SI
+
+ // r0 += 19×a3×b2
+ MOVQ 24(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 16(BX)
+ ADDQ AX, DI
+ ADCQ DX, SI
+
+ // r0 += 19×a4×b1
+ MOVQ 32(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 8(BX)
+ ADDQ AX, DI
+ ADCQ DX, SI
+
+ // r1 = a0×b1
+ MOVQ (CX), AX
+ MULQ 8(BX)
+ MOVQ AX, R9
+ MOVQ DX, R8
+
+ // r1 += a1×b0
+ MOVQ 8(CX), AX
+ MULQ (BX)
+ ADDQ AX, R9
+ ADCQ DX, R8
+
+ // r1 += 19×a2×b4
+ MOVQ 16(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 32(BX)
+ ADDQ AX, R9
+ ADCQ DX, R8
+
+ // r1 += 19×a3×b3
+ MOVQ 24(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 24(BX)
+ ADDQ AX, R9
+ ADCQ DX, R8
+
+ // r1 += 19×a4×b2
+ MOVQ 32(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 16(BX)
+ ADDQ AX, R9
+ ADCQ DX, R8
+
+ // r2 = a0×b2
+ MOVQ (CX), AX
+ MULQ 16(BX)
+ MOVQ AX, R11
+ MOVQ DX, R10
+
+ // r2 += a1×b1
+ MOVQ 8(CX), AX
+ MULQ 8(BX)
+ ADDQ AX, R11
+ ADCQ DX, R10
+
+ // r2 += a2×b0
+ MOVQ 16(CX), AX
+ MULQ (BX)
+ ADDQ AX, R11
+ ADCQ DX, R10
+
+ // r2 += 19×a3×b4
+ MOVQ 24(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 32(BX)
+ ADDQ AX, R11
+ ADCQ DX, R10
+
+ // r2 += 19×a4×b3
+ MOVQ 32(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 24(BX)
+ ADDQ AX, R11
+ ADCQ DX, R10
+
+ // r3 = a0×b3
+ MOVQ (CX), AX
+ MULQ 24(BX)
+ MOVQ AX, R13
+ MOVQ DX, R12
+
+ // r3 += a1×b2
+ MOVQ 8(CX), AX
+ MULQ 16(BX)
+ ADDQ AX, R13
+ ADCQ DX, R12
+
+ // r3 += a2×b1
+ MOVQ 16(CX), AX
+ MULQ 8(BX)
+ ADDQ AX, R13
+ ADCQ DX, R12
+
+ // r3 += a3×b0
+ MOVQ 24(CX), AX
+ MULQ (BX)
+ ADDQ AX, R13
+ ADCQ DX, R12
+
+ // r3 += 19×a4×b4
+ MOVQ 32(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 32(BX)
+ ADDQ AX, R13
+ ADCQ DX, R12
+
+ // r4 = a0×b4
+ MOVQ (CX), AX
+ MULQ 32(BX)
+ MOVQ AX, R15
+ MOVQ DX, R14
+
+ // r4 += a1×b3
+ MOVQ 8(CX), AX
+ MULQ 24(BX)
+ ADDQ AX, R15
+ ADCQ DX, R14
+
+ // r4 += a2×b2
+ MOVQ 16(CX), AX
+ MULQ 16(BX)
+ ADDQ AX, R15
+ ADCQ DX, R14
+
+ // r4 += a3×b1
+ MOVQ 24(CX), AX
+ MULQ 8(BX)
+ ADDQ AX, R15
+ ADCQ DX, R14
+
+ // r4 += a4×b0
+ MOVQ 32(CX), AX
+ MULQ (BX)
+ ADDQ AX, R15
+ ADCQ DX, R14
+
+ // First reduction chain
+ MOVQ $0x0007ffffffffffff, AX
+ SHLQ $0x0d, DI, SI
+ SHLQ $0x0d, R9, R8
+ SHLQ $0x0d, R11, R10
+ SHLQ $0x0d, R13, R12
+ SHLQ $0x0d, R15, R14
+ ANDQ AX, DI
+ IMUL3Q $0x13, R14, R14
+ ADDQ R14, DI
+ ANDQ AX, R9
+ ADDQ SI, R9
+ ANDQ AX, R11
+ ADDQ R8, R11
+ ANDQ AX, R13
+ ADDQ R10, R13
+ ANDQ AX, R15
+ ADDQ R12, R15
+
+ // Second reduction chain (carryPropagate)
+ MOVQ DI, SI
+ SHRQ $0x33, SI
+ MOVQ R9, R8
+ SHRQ $0x33, R8
+ MOVQ R11, R10
+ SHRQ $0x33, R10
+ MOVQ R13, R12
+ SHRQ $0x33, R12
+ MOVQ R15, R14
+ SHRQ $0x33, R14
+ ANDQ AX, DI
+ IMUL3Q $0x13, R14, R14
+ ADDQ R14, DI
+ ANDQ AX, R9
+ ADDQ SI, R9
+ ANDQ AX, R11
+ ADDQ R8, R11
+ ANDQ AX, R13
+ ADDQ R10, R13
+ ANDQ AX, R15
+ ADDQ R12, R15
+
+ // Store output
+ MOVQ out+0(FP), AX
+ MOVQ DI, (AX)
+ MOVQ R9, 8(AX)
+ MOVQ R11, 16(AX)
+ MOVQ R13, 24(AX)
+ MOVQ R15, 32(AX)
+ RET
+
+// func feSquare(out *Element, a *Element)
+TEXT ·feSquare(SB), NOSPLIT, $0-16
+ MOVQ a+8(FP), CX
+
+ // r0 = l0×l0
+ MOVQ (CX), AX
+ MULQ (CX)
+ MOVQ AX, SI
+ MOVQ DX, BX
+
+ // r0 += 38×l1×l4
+ MOVQ 8(CX), AX
+ IMUL3Q $0x26, AX, AX
+ MULQ 32(CX)
+ ADDQ AX, SI
+ ADCQ DX, BX
+
+ // r0 += 38×l2×l3
+ MOVQ 16(CX), AX
+ IMUL3Q $0x26, AX, AX
+ MULQ 24(CX)
+ ADDQ AX, SI
+ ADCQ DX, BX
+
+ // r1 = 2×l0×l1
+ MOVQ (CX), AX
+ SHLQ $0x01, AX
+ MULQ 8(CX)
+ MOVQ AX, R8
+ MOVQ DX, DI
+
+ // r1 += 38×l2×l4
+ MOVQ 16(CX), AX
+ IMUL3Q $0x26, AX, AX
+ MULQ 32(CX)
+ ADDQ AX, R8
+ ADCQ DX, DI
+
+ // r1 += 19×l3×l3
+ MOVQ 24(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 24(CX)
+ ADDQ AX, R8
+ ADCQ DX, DI
+
+ // r2 = 2×l0×l2
+ MOVQ (CX), AX
+ SHLQ $0x01, AX
+ MULQ 16(CX)
+ MOVQ AX, R10
+ MOVQ DX, R9
+
+ // r2 += l1×l1
+ MOVQ 8(CX), AX
+ MULQ 8(CX)
+ ADDQ AX, R10
+ ADCQ DX, R9
+
+ // r2 += 38×l3×l4
+ MOVQ 24(CX), AX
+ IMUL3Q $0x26, AX, AX
+ MULQ 32(CX)
+ ADDQ AX, R10
+ ADCQ DX, R9
+
+ // r3 = 2×l0×l3
+ MOVQ (CX), AX
+ SHLQ $0x01, AX
+ MULQ 24(CX)
+ MOVQ AX, R12
+ MOVQ DX, R11
+
+ // r3 += 2×l1×l2
+ MOVQ 8(CX), AX
+ IMUL3Q $0x02, AX, AX
+ MULQ 16(CX)
+ ADDQ AX, R12
+ ADCQ DX, R11
+
+ // r3 += 19×l4×l4
+ MOVQ 32(CX), AX
+ IMUL3Q $0x13, AX, AX
+ MULQ 32(CX)
+ ADDQ AX, R12
+ ADCQ DX, R11
+
+ // r4 = 2×l0×l4
+ MOVQ (CX), AX
+ SHLQ $0x01, AX
+ MULQ 32(CX)
+ MOVQ AX, R14
+ MOVQ DX, R13
+
+ // r4 += 2×l1×l3
+ MOVQ 8(CX), AX
+ IMUL3Q $0x02, AX, AX
+ MULQ 24(CX)
+ ADDQ AX, R14
+ ADCQ DX, R13
+
+ // r4 += l2×l2
+ MOVQ 16(CX), AX
+ MULQ 16(CX)
+ ADDQ AX, R14
+ ADCQ DX, R13
+
+ // First reduction chain
+ MOVQ $0x0007ffffffffffff, AX
+ SHLQ $0x0d, SI, BX
+ SHLQ $0x0d, R8, DI
+ SHLQ $0x0d, R10, R9
+ SHLQ $0x0d, R12, R11
+ SHLQ $0x0d, R14, R13
+ ANDQ AX, SI
+ IMUL3Q $0x13, R13, R13
+ ADDQ R13, SI
+ ANDQ AX, R8
+ ADDQ BX, R8
+ ANDQ AX, R10
+ ADDQ DI, R10
+ ANDQ AX, R12
+ ADDQ R9, R12
+ ANDQ AX, R14
+ ADDQ R11, R14
+
+ // Second reduction chain (carryPropagate)
+ MOVQ SI, BX
+ SHRQ $0x33, BX
+ MOVQ R8, DI
+ SHRQ $0x33, DI
+ MOVQ R10, R9
+ SHRQ $0x33, R9
+ MOVQ R12, R11
+ SHRQ $0x33, R11
+ MOVQ R14, R13
+ SHRQ $0x33, R13
+ ANDQ AX, SI
+ IMUL3Q $0x13, R13, R13
+ ADDQ R13, SI
+ ANDQ AX, R8
+ ADDQ BX, R8
+ ANDQ AX, R10
+ ADDQ DI, R10
+ ANDQ AX, R12
+ ADDQ R9, R12
+ ANDQ AX, R14
+ ADDQ R11, R14
+
+ // Store output
+ MOVQ out+0(FP), AX
+ MOVQ SI, (AX)
+ MOVQ R8, 8(AX)
+ MOVQ R10, 16(AX)
+ MOVQ R12, 24(AX)
+ MOVQ R14, 32(AX)
+ RET
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go
new file mode 100644
index 00000000..ddb6c9b8
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64_noasm.go
@@ -0,0 +1,12 @@
+// Copyright (c) 2019 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 field
+
+func feMul(v, x, y *Element) { feMulGeneric(v, x, y) }
+
+func feSquare(v, x *Element) { feSquareGeneric(v, x) }
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go
new file mode 100644
index 00000000..af459ef5
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.go
@@ -0,0 +1,16 @@
+// Copyright (c) 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.
+
+//go:build arm64 && gc && !purego
+// +build arm64,gc,!purego
+
+package field
+
+//go:noescape
+func carryPropagate(v *Element)
+
+func (v *Element) carryPropagate() *Element {
+ carryPropagate(v)
+ return v
+}
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s
new file mode 100644
index 00000000..5c91e458
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64.s
@@ -0,0 +1,43 @@
+// Copyright (c) 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.
+
+//go:build arm64 && gc && !purego
+// +build arm64,gc,!purego
+
+#include "textflag.h"
+
+// carryPropagate works exactly like carryPropagateGeneric and uses the
+// same AND, ADD, and LSR+MADD instructions emitted by the compiler, but
+// avoids loading R0-R4 twice and uses LDP and STP.
+//
+// See https://golang.org/issues/43145 for the main compiler issue.
+//
+// func carryPropagate(v *Element)
+TEXT ·carryPropagate(SB),NOFRAME|NOSPLIT,$0-8
+ MOVD v+0(FP), R20
+
+ LDP 0(R20), (R0, R1)
+ LDP 16(R20), (R2, R3)
+ MOVD 32(R20), R4
+
+ AND $0x7ffffffffffff, R0, R10
+ AND $0x7ffffffffffff, R1, R11
+ AND $0x7ffffffffffff, R2, R12
+ AND $0x7ffffffffffff, R3, R13
+ AND $0x7ffffffffffff, R4, R14
+
+ ADD R0>>51, R11, R11
+ ADD R1>>51, R12, R12
+ ADD R2>>51, R13, R13
+ ADD R3>>51, R14, R14
+ // R4>>51 * 19 + R10 -> R10
+ LSR $51, R4, R21
+ MOVD $19, R22
+ MADD R22, R10, R21, R10
+
+ STP (R10, R11), 0(R20)
+ STP (R12, R13), 16(R20)
+ MOVD R14, 32(R20)
+
+ RET
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go
new file mode 100644
index 00000000..234a5b2e
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_arm64_noasm.go
@@ -0,0 +1,12 @@
+// Copyright (c) 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.
+
+//go:build !arm64 || !gc || purego
+// +build !arm64 !gc purego
+
+package field
+
+func (v *Element) carryPropagate() *Element {
+ return v.carryPropagateGeneric()
+}
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go
new file mode 100644
index 00000000..7b5b78cb
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/fe_generic.go
@@ -0,0 +1,264 @@
+// Copyright (c) 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 field
+
+import "math/bits"
+
+// uint128 holds a 128-bit number as two 64-bit limbs, for use with the
+// bits.Mul64 and bits.Add64 intrinsics.
+type uint128 struct {
+ lo, hi uint64
+}
+
+// mul64 returns a * b.
+func mul64(a, b uint64) uint128 {
+ hi, lo := bits.Mul64(a, b)
+ return uint128{lo, hi}
+}
+
+// addMul64 returns v + a * b.
+func addMul64(v uint128, a, b uint64) uint128 {
+ hi, lo := bits.Mul64(a, b)
+ lo, c := bits.Add64(lo, v.lo, 0)
+ hi, _ = bits.Add64(hi, v.hi, c)
+ return uint128{lo, hi}
+}
+
+// shiftRightBy51 returns a >> 51. a is assumed to be at most 115 bits.
+func shiftRightBy51(a uint128) uint64 {
+ return (a.hi << (64 - 51)) | (a.lo >> 51)
+}
+
+func feMulGeneric(v, a, b *Element) {
+ a0 := a.l0
+ a1 := a.l1
+ a2 := a.l2
+ a3 := a.l3
+ a4 := a.l4
+
+ b0 := b.l0
+ b1 := b.l1
+ b2 := b.l2
+ b3 := b.l3
+ b4 := b.l4
+
+ // Limb multiplication works like pen-and-paper columnar multiplication, but
+ // with 51-bit limbs instead of digits.
+ //
+ // a4 a3 a2 a1 a0 x
+ // b4 b3 b2 b1 b0 =
+ // ------------------------
+ // a4b0 a3b0 a2b0 a1b0 a0b0 +
+ // a4b1 a3b1 a2b1 a1b1 a0b1 +
+ // a4b2 a3b2 a2b2 a1b2 a0b2 +
+ // a4b3 a3b3 a2b3 a1b3 a0b3 +
+ // a4b4 a3b4 a2b4 a1b4 a0b4 =
+ // ----------------------------------------------
+ // r8 r7 r6 r5 r4 r3 r2 r1 r0
+ //
+ // We can then use the reduction identity (a * 2²⁵⁵ + b = a * 19 + b) to
+ // reduce the limbs that would overflow 255 bits. r5 * 2²⁵⁵ becomes 19 * r5,
+ // r6 * 2³⁰⁶ becomes 19 * r6 * 2⁵¹, etc.
+ //
+ // Reduction can be carried out simultaneously to multiplication. For
+ // example, we do not compute r5: whenever the result of a multiplication
+ // belongs to r5, like a1b4, we multiply it by 19 and add the result to r0.
+ //
+ // a4b0 a3b0 a2b0 a1b0 a0b0 +
+ // a3b1 a2b1 a1b1 a0b1 19×a4b1 +
+ // a2b2 a1b2 a0b2 19×a4b2 19×a3b2 +
+ // a1b3 a0b3 19×a4b3 19×a3b3 19×a2b3 +
+ // a0b4 19×a4b4 19×a3b4 19×a2b4 19×a1b4 =
+ // --------------------------------------
+ // r4 r3 r2 r1 r0
+ //
+ // Finally we add up the columns into wide, overlapping limbs.
+
+ a1_19 := a1 * 19
+ a2_19 := a2 * 19
+ a3_19 := a3 * 19
+ a4_19 := a4 * 19
+
+ // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1)
+ r0 := mul64(a0, b0)
+ r0 = addMul64(r0, a1_19, b4)
+ r0 = addMul64(r0, a2_19, b3)
+ r0 = addMul64(r0, a3_19, b2)
+ r0 = addMul64(r0, a4_19, b1)
+
+ // r1 = a0×b1 + a1×b0 + 19×(a2×b4 + a3×b3 + a4×b2)
+ r1 := mul64(a0, b1)
+ r1 = addMul64(r1, a1, b0)
+ r1 = addMul64(r1, a2_19, b4)
+ r1 = addMul64(r1, a3_19, b3)
+ r1 = addMul64(r1, a4_19, b2)
+
+ // r2 = a0×b2 + a1×b1 + a2×b0 + 19×(a3×b4 + a4×b3)
+ r2 := mul64(a0, b2)
+ r2 = addMul64(r2, a1, b1)
+ r2 = addMul64(r2, a2, b0)
+ r2 = addMul64(r2, a3_19, b4)
+ r2 = addMul64(r2, a4_19, b3)
+
+ // r3 = a0×b3 + a1×b2 + a2×b1 + a3×b0 + 19×a4×b4
+ r3 := mul64(a0, b3)
+ r3 = addMul64(r3, a1, b2)
+ r3 = addMul64(r3, a2, b1)
+ r3 = addMul64(r3, a3, b0)
+ r3 = addMul64(r3, a4_19, b4)
+
+ // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0
+ r4 := mul64(a0, b4)
+ r4 = addMul64(r4, a1, b3)
+ r4 = addMul64(r4, a2, b2)
+ r4 = addMul64(r4, a3, b1)
+ r4 = addMul64(r4, a4, b0)
+
+ // After the multiplication, we need to reduce (carry) the five coefficients
+ // to obtain a result with limbs that are at most slightly larger than 2⁵¹,
+ // to respect the Element invariant.
+ //
+ // Overall, the reduction works the same as carryPropagate, except with
+ // wider inputs: we take the carry for each coefficient by shifting it right
+ // by 51, and add it to the limb above it. The top carry is multiplied by 19
+ // according to the reduction identity and added to the lowest limb.
+ //
+ // The largest coefficient (r0) will be at most 111 bits, which guarantees
+ // that all carries are at most 111 - 51 = 60 bits, which fits in a uint64.
+ //
+ // r0 = a0×b0 + 19×(a1×b4 + a2×b3 + a3×b2 + a4×b1)
+ // r0 < 2⁵²×2⁵² + 19×(2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵² + 2⁵²×2⁵²)
+ // r0 < (1 + 19 × 4) × 2⁵² × 2⁵²
+ // r0 < 2⁷ × 2⁵² × 2⁵²
+ // r0 < 2¹¹¹
+ //
+ // Moreover, the top coefficient (r4) is at most 107 bits, so c4 is at most
+ // 56 bits, and c4 * 19 is at most 61 bits, which again fits in a uint64 and
+ // allows us to easily apply the reduction identity.
+ //
+ // r4 = a0×b4 + a1×b3 + a2×b2 + a3×b1 + a4×b0
+ // r4 < 5 × 2⁵² × 2⁵²
+ // r4 < 2¹⁰⁷
+ //
+
+ c0 := shiftRightBy51(r0)
+ c1 := shiftRightBy51(r1)
+ c2 := shiftRightBy51(r2)
+ c3 := shiftRightBy51(r3)
+ c4 := shiftRightBy51(r4)
+
+ rr0 := r0.lo&maskLow51Bits + c4*19
+ rr1 := r1.lo&maskLow51Bits + c0
+ rr2 := r2.lo&maskLow51Bits + c1
+ rr3 := r3.lo&maskLow51Bits + c2
+ rr4 := r4.lo&maskLow51Bits + c3
+
+ // Now all coefficients fit into 64-bit registers but are still too large to
+ // be passed around as a Element. We therefore do one last carry chain,
+ // where the carries will be small enough to fit in the wiggle room above 2⁵¹.
+ *v = Element{rr0, rr1, rr2, rr3, rr4}
+ v.carryPropagate()
+}
+
+func feSquareGeneric(v, a *Element) {
+ l0 := a.l0
+ l1 := a.l1
+ l2 := a.l2
+ l3 := a.l3
+ l4 := a.l4
+
+ // Squaring works precisely like multiplication above, but thanks to its
+ // symmetry we get to group a few terms together.
+ //
+ // l4 l3 l2 l1 l0 x
+ // l4 l3 l2 l1 l0 =
+ // ------------------------
+ // l4l0 l3l0 l2l0 l1l0 l0l0 +
+ // l4l1 l3l1 l2l1 l1l1 l0l1 +
+ // l4l2 l3l2 l2l2 l1l2 l0l2 +
+ // l4l3 l3l3 l2l3 l1l3 l0l3 +
+ // l4l4 l3l4 l2l4 l1l4 l0l4 =
+ // ----------------------------------------------
+ // r8 r7 r6 r5 r4 r3 r2 r1 r0
+ //
+ // l4l0 l3l0 l2l0 l1l0 l0l0 +
+ // l3l1 l2l1 l1l1 l0l1 19×l4l1 +
+ // l2l2 l1l2 l0l2 19×l4l2 19×l3l2 +
+ // l1l3 l0l3 19×l4l3 19×l3l3 19×l2l3 +
+ // l0l4 19×l4l4 19×l3l4 19×l2l4 19×l1l4 =
+ // --------------------------------------
+ // r4 r3 r2 r1 r0
+ //
+ // With precomputed 2×, 19×, and 2×19× terms, we can compute each limb with
+ // only three Mul64 and four Add64, instead of five and eight.
+
+ l0_2 := l0 * 2
+ l1_2 := l1 * 2
+
+ l1_38 := l1 * 38
+ l2_38 := l2 * 38
+ l3_38 := l3 * 38
+
+ l3_19 := l3 * 19
+ l4_19 := l4 * 19
+
+ // r0 = l0×l0 + 19×(l1×l4 + l2×l3 + l3×l2 + l4×l1) = l0×l0 + 19×2×(l1×l4 + l2×l3)
+ r0 := mul64(l0, l0)
+ r0 = addMul64(r0, l1_38, l4)
+ r0 = addMul64(r0, l2_38, l3)
+
+ // r1 = l0×l1 + l1×l0 + 19×(l2×l4 + l3×l3 + l4×l2) = 2×l0×l1 + 19×2×l2×l4 + 19×l3×l3
+ r1 := mul64(l0_2, l1)
+ r1 = addMul64(r1, l2_38, l4)
+ r1 = addMul64(r1, l3_19, l3)
+
+ // r2 = l0×l2 + l1×l1 + l2×l0 + 19×(l3×l4 + l4×l3) = 2×l0×l2 + l1×l1 + 19×2×l3×l4
+ r2 := mul64(l0_2, l2)
+ r2 = addMul64(r2, l1, l1)
+ r2 = addMul64(r2, l3_38, l4)
+
+ // r3 = l0×l3 + l1×l2 + l2×l1 + l3×l0 + 19×l4×l4 = 2×l0×l3 + 2×l1×l2 + 19×l4×l4
+ r3 := mul64(l0_2, l3)
+ r3 = addMul64(r3, l1_2, l2)
+ r3 = addMul64(r3, l4_19, l4)
+
+ // r4 = l0×l4 + l1×l3 + l2×l2 + l3×l1 + l4×l0 = 2×l0×l4 + 2×l1×l3 + l2×l2
+ r4 := mul64(l0_2, l4)
+ r4 = addMul64(r4, l1_2, l3)
+ r4 = addMul64(r4, l2, l2)
+
+ c0 := shiftRightBy51(r0)
+ c1 := shiftRightBy51(r1)
+ c2 := shiftRightBy51(r2)
+ c3 := shiftRightBy51(r3)
+ c4 := shiftRightBy51(r4)
+
+ rr0 := r0.lo&maskLow51Bits + c4*19
+ rr1 := r1.lo&maskLow51Bits + c0
+ rr2 := r2.lo&maskLow51Bits + c1
+ rr3 := r3.lo&maskLow51Bits + c2
+ rr4 := r4.lo&maskLow51Bits + c3
+
+ *v = Element{rr0, rr1, rr2, rr3, rr4}
+ v.carryPropagate()
+}
+
+// carryPropagate brings the limbs below 52 bits by applying the reduction
+// identity (a * 2²⁵⁵ + b = a * 19 + b) to the l4 carry. TODO inline
+func (v *Element) carryPropagateGeneric() *Element {
+ c0 := v.l0 >> 51
+ c1 := v.l1 >> 51
+ c2 := v.l2 >> 51
+ c3 := v.l3 >> 51
+ c4 := v.l4 >> 51
+
+ v.l0 = v.l0&maskLow51Bits + c4*19
+ v.l1 = v.l1&maskLow51Bits + c0
+ v.l2 = v.l2&maskLow51Bits + c1
+ v.l3 = v.l3&maskLow51Bits + c2
+ v.l4 = v.l4&maskLow51Bits + c3
+
+ return v
+}
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint
new file mode 100644
index 00000000..e3685f95
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.checkpoint
@@ -0,0 +1 @@
+b0c49ae9f59d233526f8934262c5bbbe14d4358d
diff --git a/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh
new file mode 100644
index 00000000..1ba22a8b
--- /dev/null
+++ b/vendor/golang.org/x/crypto/curve25519/internal/field/sync.sh
@@ -0,0 +1,19 @@
+#! /bin/bash
+set -euo pipefail
+
+cd "$(git rev-parse --show-toplevel)"
+
+STD_PATH=src/crypto/ed25519/internal/edwards25519/field
+LOCAL_PATH=curve25519/internal/field
+LAST_SYNC_REF=$(cat $LOCAL_PATH/sync.checkpoint)
+
+git fetch https://go.googlesource.com/go master
+
+if git diff --quiet $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH; then
+ echo "No changes."
+else
+ NEW_REF=$(git rev-parse FETCH_HEAD | tee $LOCAL_PATH/sync.checkpoint)
+ echo "Applying changes from $LAST_SYNC_REF to $NEW_REF..."
+ git diff $LAST_SYNC_REF:$STD_PATH FETCH_HEAD:$STD_PATH | \
+ git apply -3 --directory=$LOCAL_PATH
+fi
diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go
new file mode 100644
index 00000000..593f6530
--- /dev/null
+++ b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go
@@ -0,0 +1,77 @@
+// Copyright 2012 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 pbkdf2 implements the key derivation function PBKDF2 as defined in RFC
+2898 / PKCS #5 v2.0.
+
+A key derivation function is useful when encrypting data based on a password
+or any other not-fully-random data. It uses a pseudorandom function to derive
+a secure encryption key based on the password.
+
+While v2.0 of the standard defines only one pseudorandom function to use,
+HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved
+Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To
+choose, you can pass the `New` functions from the different SHA packages to
+pbkdf2.Key.
+*/
+package pbkdf2 // import "golang.org/x/crypto/pbkdf2"
+
+import (
+ "crypto/hmac"
+ "hash"
+)
+
+// Key derives a key from the password, salt and iteration count, returning a
+// []byte of length keylen that can be used as cryptographic key. The key is
+// derived based on the method described as PBKDF2 with the HMAC variant using
+// the supplied hash function.
+//
+// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you
+// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by
+// doing:
+//
+// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New)
+//
+// Remember to get a good random salt. At least 8 bytes is recommended by the
+// RFC.
+//
+// Using a higher iteration count will increase the cost of an exhaustive
+// search but will also make derivation proportionally slower.
+func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte {
+ prf := hmac.New(h, password)
+ hashLen := prf.Size()
+ numBlocks := (keyLen + hashLen - 1) / hashLen
+
+ var buf [4]byte
+ dk := make([]byte, 0, numBlocks*hashLen)
+ U := make([]byte, hashLen)
+ for block := 1; block <= numBlocks; block++ {
+ // N.B.: || means concatenation, ^ means XOR
+ // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter
+ // U_1 = PRF(password, salt || uint(i))
+ prf.Reset()
+ prf.Write(salt)
+ buf[0] = byte(block >> 24)
+ buf[1] = byte(block >> 16)
+ buf[2] = byte(block >> 8)
+ buf[3] = byte(block)
+ prf.Write(buf[:4])
+ dk = prf.Sum(dk)
+ T := dk[len(dk)-hashLen:]
+ copy(U, T)
+
+ // U_n = PRF(password, U_(n-1))
+ for n := 2; n <= iter; n++ {
+ prf.Reset()
+ prf.Write(U)
+ U = U[:0]
+ U = prf.Sum(U)
+ for x := range U {
+ T[x] ^= U[x]
+ }
+ }
+ }
+ return dk[:keyLen]
+}
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s
index 2cb03731..1d74f0f8 100644
--- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s
+++ b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build gc && !purego
// +build gc,!purego
#include "textflag.h"
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s
index 5cd7494b..58422aad 100644
--- a/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s
+++ b/vendor/golang.org/x/crypto/poly1305/sum_ppc64le.s
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build gc && !purego
// +build gc,!purego
#include "textflag.h"
@@ -82,7 +83,7 @@ multiply:
BGE loop
bytes_between_0_and_15:
- CMP $0, R5
+ CMP R5, $0
BEQ done
MOVD $0, R16 // h0
MOVD $0, R17 // h1
@@ -122,7 +123,7 @@ just1:
// Exactly 8
MOVD (R4), R16
- CMP $0, R17
+ CMP R17, $0
// Check if we've already set R17; if not
// set 1 to indicate end of msg.
@@ -151,7 +152,7 @@ less4:
ADD $2, R4
less2:
- CMP $0, R5
+ CMP R5, $0
BEQ insert1
MOVBZ (R4), R21
SLD R22, R21, R21
@@ -166,12 +167,12 @@ insert1:
carry:
// Add new values to h0, h1, h2
- ADDC R16, R8
- ADDE R17, R9
- ADDE $0, R10
- MOVD $16, R5
- ADD R5, R4
- BR multiply
+ ADDC R16, R8
+ ADDE R17, R9
+ ADDZE R10, R10
+ MOVD $16, R5
+ ADD R5, R4
+ BR multiply
done:
// Save h0, h1, h2 in state
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s
index bdd882c6..69c64f84 100644
--- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s
+++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build gc && !purego
// +build gc,!purego
#include "textflag.h"
diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s
index f97efc67..c0892772 100644
--- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s
+++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:build amd64 && !purego && gc
// +build amd64,!purego,gc
// This code was translated into a form compatible with 6a from the public
diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go
new file mode 100644
index 00000000..bbe4494c
--- /dev/null
+++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go
@@ -0,0 +1,212 @@
+// Copyright 2012 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 scrypt implements the scrypt key derivation function as defined in
+// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard
+// Functions" (https://www.tarsnap.com/scrypt/scrypt.pdf).
+package scrypt // import "golang.org/x/crypto/scrypt"
+
+import (
+ "crypto/sha256"
+ "encoding/binary"
+ "errors"
+ "math/bits"
+
+ "golang.org/x/crypto/pbkdf2"
+)
+
+const maxInt = int(^uint(0) >> 1)
+
+// blockCopy copies n numbers from src into dst.
+func blockCopy(dst, src []uint32, n int) {
+ copy(dst, src[:n])
+}
+
+// blockXOR XORs numbers from dst with n numbers from src.
+func blockXOR(dst, src []uint32, n int) {
+ for i, v := range src[:n] {
+ dst[i] ^= v
+ }
+}
+
+// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in,
+// and puts the result into both tmp and out.
+func salsaXOR(tmp *[16]uint32, in, out []uint32) {
+ w0 := tmp[0] ^ in[0]
+ w1 := tmp[1] ^ in[1]
+ w2 := tmp[2] ^ in[2]
+ w3 := tmp[3] ^ in[3]
+ w4 := tmp[4] ^ in[4]
+ w5 := tmp[5] ^ in[5]
+ w6 := tmp[6] ^ in[6]
+ w7 := tmp[7] ^ in[7]
+ w8 := tmp[8] ^ in[8]
+ w9 := tmp[9] ^ in[9]
+ w10 := tmp[10] ^ in[10]
+ w11 := tmp[11] ^ in[11]
+ w12 := tmp[12] ^ in[12]
+ w13 := tmp[13] ^ in[13]
+ w14 := tmp[14] ^ in[14]
+ w15 := tmp[15] ^ in[15]
+
+ x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8
+ x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15
+
+ for i := 0; i < 8; i += 2 {
+ x4 ^= bits.RotateLeft32(x0+x12, 7)
+ x8 ^= bits.RotateLeft32(x4+x0, 9)
+ x12 ^= bits.RotateLeft32(x8+x4, 13)
+ x0 ^= bits.RotateLeft32(x12+x8, 18)
+
+ x9 ^= bits.RotateLeft32(x5+x1, 7)
+ x13 ^= bits.RotateLeft32(x9+x5, 9)
+ x1 ^= bits.RotateLeft32(x13+x9, 13)
+ x5 ^= bits.RotateLeft32(x1+x13, 18)
+
+ x14 ^= bits.RotateLeft32(x10+x6, 7)
+ x2 ^= bits.RotateLeft32(x14+x10, 9)
+ x6 ^= bits.RotateLeft32(x2+x14, 13)
+ x10 ^= bits.RotateLeft32(x6+x2, 18)
+
+ x3 ^= bits.RotateLeft32(x15+x11, 7)
+ x7 ^= bits.RotateLeft32(x3+x15, 9)
+ x11 ^= bits.RotateLeft32(x7+x3, 13)
+ x15 ^= bits.RotateLeft32(x11+x7, 18)
+
+ x1 ^= bits.RotateLeft32(x0+x3, 7)
+ x2 ^= bits.RotateLeft32(x1+x0, 9)
+ x3 ^= bits.RotateLeft32(x2+x1, 13)
+ x0 ^= bits.RotateLeft32(x3+x2, 18)
+
+ x6 ^= bits.RotateLeft32(x5+x4, 7)
+ x7 ^= bits.RotateLeft32(x6+x5, 9)
+ x4 ^= bits.RotateLeft32(x7+x6, 13)
+ x5 ^= bits.RotateLeft32(x4+x7, 18)
+
+ x11 ^= bits.RotateLeft32(x10+x9, 7)
+ x8 ^= bits.RotateLeft32(x11+x10, 9)
+ x9 ^= bits.RotateLeft32(x8+x11, 13)
+ x10 ^= bits.RotateLeft32(x9+x8, 18)
+
+ x12 ^= bits.RotateLeft32(x15+x14, 7)
+ x13 ^= bits.RotateLeft32(x12+x15, 9)
+ x14 ^= bits.RotateLeft32(x13+x12, 13)
+ x15 ^= bits.RotateLeft32(x14+x13, 18)
+ }
+ x0 += w0
+ x1 += w1
+ x2 += w2
+ x3 += w3
+ x4 += w4
+ x5 += w5
+ x6 += w6
+ x7 += w7
+ x8 += w8
+ x9 += w9
+ x10 += w10
+ x11 += w11
+ x12 += w12
+ x13 += w13
+ x14 += w14
+ x15 += w15
+
+ out[0], tmp[0] = x0, x0
+ out[1], tmp[1] = x1, x1
+ out[2], tmp[2] = x2, x2
+ out[3], tmp[3] = x3, x3
+ out[4], tmp[4] = x4, x4
+ out[5], tmp[5] = x5, x5
+ out[6], tmp[6] = x6, x6
+ out[7], tmp[7] = x7, x7
+ out[8], tmp[8] = x8, x8
+ out[9], tmp[9] = x9, x9
+ out[10], tmp[10] = x10, x10
+ out[11], tmp[11] = x11, x11
+ out[12], tmp[12] = x12, x12
+ out[13], tmp[13] = x13, x13
+ out[14], tmp[14] = x14, x14
+ out[15], tmp[15] = x15, x15
+}
+
+func blockMix(tmp *[16]uint32, in, out []uint32, r int) {
+ blockCopy(tmp[:], in[(2*r-1)*16:], 16)
+ for i := 0; i < 2*r; i += 2 {
+ salsaXOR(tmp, in[i*16:], out[i*8:])
+ salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:])
+ }
+}
+
+func integer(b []uint32, r int) uint64 {
+ j := (2*r - 1) * 16
+ return uint64(b[j]) | uint64(b[j+1])<<32
+}
+
+func smix(b []byte, r, N int, v, xy []uint32) {
+ var tmp [16]uint32
+ R := 32 * r
+ x := xy
+ y := xy[R:]
+
+ j := 0
+ for i := 0; i < R; i++ {
+ x[i] = binary.LittleEndian.Uint32(b[j:])
+ j += 4
+ }
+ for i := 0; i < N; i += 2 {
+ blockCopy(v[i*R:], x, R)
+ blockMix(&tmp, x, y, r)
+
+ blockCopy(v[(i+1)*R:], y, R)
+ blockMix(&tmp, y, x, r)
+ }
+ for i := 0; i < N; i += 2 {
+ j := int(integer(x, r) & uint64(N-1))
+ blockXOR(x, v[j*R:], R)
+ blockMix(&tmp, x, y, r)
+
+ j = int(integer(y, r) & uint64(N-1))
+ blockXOR(y, v[j*R:], R)
+ blockMix(&tmp, y, x, r)
+ }
+ j = 0
+ for _, v := range x[:R] {
+ binary.LittleEndian.PutUint32(b[j:], v)
+ j += 4
+ }
+}
+
+// Key derives a key from the password, salt, and cost parameters, returning
+// a byte slice of length keyLen that can be used as cryptographic key.
+//
+// N is a CPU/memory cost parameter, which must be a power of two greater than 1.
+// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the
+// limits, the function returns a nil byte slice and an error.
+//
+// For example, you can get a derived key for e.g. AES-256 (which needs a
+// 32-byte key) by doing:
+//
+// dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32)
+//
+// The recommended parameters for interactive logins as of 2017 are N=32768, r=8
+// and p=1. The parameters N, r, and p should be increased as memory latency and
+// CPU parallelism increases; consider setting N to the highest power of 2 you
+// can derive within 100 milliseconds. Remember to get a good random salt.
+func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) {
+ if N <= 1 || N&(N-1) != 0 {
+ return nil, errors.New("scrypt: N must be > 1 and a power of 2")
+ }
+ if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r {
+ return nil, errors.New("scrypt: parameters are too large")
+ }
+
+ xy := make([]uint32, 64*r)
+ v := make([]uint32, 32*N*r)
+ b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New)
+
+ for i := 0; i < p; i++ {
+ smix(b[i*128*r:], r, N, v, xy)
+ }
+
+ return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil
+}
diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go
index 7b00bff1..99f68bd3 100644
--- a/vendor/golang.org/x/crypto/ssh/client.go
+++ b/vendor/golang.org/x/crypto/ssh/client.go
@@ -77,7 +77,7 @@ func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan
}
conn := &connection{
- sshConn: sshConn{conn: c},
+ sshConn: sshConn{conn: c, user: fullConf.User},
}
if err := conn.clientHandshake(addr, &fullConf); err != nil {
diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go
index f91466f7..038941d7 100644
--- a/vendor/golang.org/x/net/html/parse.go
+++ b/vendor/golang.org/x/net/html/parse.go
@@ -663,6 +663,24 @@ func inHeadIM(p *parser) bool {
// Ignore the token.
return true
case a.Template:
+ // TODO: remove this divergence from the HTML5 spec.
+ //
+ // We don't handle all of the corner cases when mixing foreign
+ // content (i.e. <math> or <svg>) with <template>. Without this
+ // early return, we can get into an infinite loop, possibly because
+ // of the "TODO... further divergence" a little below.
+ //
+ // As a workaround, if we are mixing foreign content and templates,
+ // just ignore the rest of the HTML. Foreign content is rare and a
+ // relatively old HTML feature. Templates are also rare and a
+ // relatively new HTML feature. Their combination is very rare.
+ for _, e := range p.oe {
+ if e.Namespace != "" {
+ p.im = ignoreTheRemainingTokens
+ return true
+ }
+ }
+
p.addElement()
p.afe = append(p.afe, &scopeMarker)
p.framesetOK = false
@@ -683,7 +701,7 @@ func inHeadIM(p *parser) bool {
if !p.oe.contains(a.Template) {
return true
}
- // TODO: remove this divergence from the HTML5 spec.
+ // TODO: remove this further divergence from the HTML5 spec.
//
// See https://bugs.chromium.org/p/chromium/issues/detail?id=829668
p.generateImpliedEndTags()
@@ -2127,6 +2145,10 @@ func afterAfterFramesetIM(p *parser) bool {
return true
}
+func ignoreTheRemainingTokens(p *parser) bool {
+ return true
+}
+
const whitespaceOrNUL = whitespace + "\x00"
// Section 12.2.6.5
diff --git a/vendor/golang.org/x/net/http/httpguts/httplex.go b/vendor/golang.org/x/net/http/httpguts/httplex.go
index e7de24ee..c79aa73f 100644
--- a/vendor/golang.org/x/net/http/httpguts/httplex.go
+++ b/vendor/golang.org/x/net/http/httpguts/httplex.go
@@ -137,11 +137,13 @@ func trimOWS(x string) string {
// contains token amongst its comma-separated tokens, ASCII
// case-insensitively.
func headerValueContainsToken(v string, token string) bool {
- v = trimOWS(v)
- if comma := strings.IndexByte(v, ','); comma != -1 {
- return tokenEqual(trimOWS(v[:comma]), token) || headerValueContainsToken(v[comma+1:], token)
+ for comma := strings.IndexByte(v, ','); comma != -1; comma = strings.IndexByte(v, ',') {
+ if tokenEqual(trimOWS(v[:comma]), token) {
+ return true
+ }
+ v = v[comma+1:]
}
- return tokenEqual(v, token)
+ return tokenEqual(trimOWS(v), token)
}
// lowerASCII returns the ASCII lowercase version of b.
diff --git a/vendor/golang.org/x/net/http2/Dockerfile b/vendor/golang.org/x/net/http2/Dockerfile
index 53fc5257..85122459 100644
--- a/vendor/golang.org/x/net/http2/Dockerfile
+++ b/vendor/golang.org/x/net/http2/Dockerfile
@@ -38,7 +38,7 @@ RUN make
RUN make install
WORKDIR /root
-RUN wget http://curl.haxx.se/download/curl-7.45.0.tar.gz
+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
diff --git a/vendor/golang.org/x/net/http2/ascii.go b/vendor/golang.org/x/net/http2/ascii.go
new file mode 100644
index 00000000..17caa205
--- /dev/null
+++ b/vendor/golang.org/x/net/http2/ascii.go
@@ -0,0 +1,53 @@
+// 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 http2
+
+import "strings"
+
+// The HTTP protocols are defined in terms of ASCII, not Unicode. This file
+// contains helper functions which may use Unicode-aware functions which would
+// otherwise be unsafe and could introduce vulnerabilities if used improperly.
+
+// asciiEqualFold is strings.EqualFold, ASCII only. It reports whether s and t
+// are equal, ASCII-case-insensitively.
+func asciiEqualFold(s, t string) bool {
+ if len(s) != len(t) {
+ return false
+ }
+ for i := 0; i < len(s); i++ {
+ if lower(s[i]) != lower(t[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+// lower returns the ASCII lowercase version of b.
+func lower(b byte) byte {
+ if 'A' <= b && b <= 'Z' {
+ return b + ('a' - 'A')
+ }
+ return b
+}
+
+// isASCIIPrint returns whether s is ASCII and printable according to
+// https://tools.ietf.org/html/rfc20#section-4.2.
+func isASCIIPrint(s string) bool {
+ for i := 0; i < len(s); i++ {
+ if s[i] < ' ' || s[i] > '~' {
+ return false
+ }
+ }
+ return true
+}
+
+// asciiToLower returns the lowercase version of s if s is ASCII and printable,
+// and whether or not it was.
+func asciiToLower(s string) (lower string, ok bool) {
+ if !isASCIIPrint(s) {
+ return "", false
+ }
+ return strings.ToLower(s), true
+}
diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go
index 3a67636f..652bc11a 100644
--- a/vendor/golang.org/x/net/http2/client_conn_pool.go
+++ b/vendor/golang.org/x/net/http2/client_conn_pool.go
@@ -7,7 +7,9 @@
package http2
import (
+ "context"
"crypto/tls"
+ "errors"
"net/http"
"sync"
)
@@ -78,61 +80,69 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
// It gets its own connection.
traceGetConn(req, addr)
const singleUse = true
- cc, err := p.t.dialClientConn(addr, singleUse)
+ cc, err := p.t.dialClientConn(req.Context(), addr, singleUse)
if err != nil {
return nil, err
}
return cc, nil
}
- p.mu.Lock()
- for _, cc := range p.conns[addr] {
- if st := cc.idleState(); st.canTakeNewRequest {
- if p.shouldTraceGetConn(st) {
- traceGetConn(req, addr)
+ for {
+ p.mu.Lock()
+ for _, cc := range p.conns[addr] {
+ if st := cc.idleState(); st.canTakeNewRequest {
+ if p.shouldTraceGetConn(st) {
+ traceGetConn(req, addr)
+ }
+ p.mu.Unlock()
+ return cc, nil
}
+ }
+ if !dialOnMiss {
p.mu.Unlock()
- return cc, nil
+ return nil, ErrNoCachedConn
}
- }
- if !dialOnMiss {
+ traceGetConn(req, addr)
+ call := p.getStartDialLocked(req.Context(), addr)
p.mu.Unlock()
- return nil, ErrNoCachedConn
+ <-call.done
+ if shouldRetryDial(call, req) {
+ continue
+ }
+ return call.res, call.err
}
- traceGetConn(req, addr)
- call := p.getStartDialLocked(addr)
- p.mu.Unlock()
- <-call.done
- return call.res, call.err
}
// dialCall is an in-flight Transport dial call to a host.
type dialCall struct {
- _ incomparable
- p *clientConnPool
+ _ incomparable
+ p *clientConnPool
+ // the context associated with the request
+ // that created this dialCall
+ ctx context.Context
done chan struct{} // closed when done
res *ClientConn // valid after done is closed
err error // valid after done is closed
}
// requires p.mu is held.
-func (p *clientConnPool) getStartDialLocked(addr string) *dialCall {
+func (p *clientConnPool) getStartDialLocked(ctx context.Context, addr string) *dialCall {
if call, ok := p.dialing[addr]; ok {
// A dial is already in-flight. Don't start another.
return call
}
- call := &dialCall{p: p, done: make(chan struct{})}
+ call := &dialCall{p: p, done: make(chan struct{}), ctx: ctx}
if p.dialing == nil {
p.dialing = make(map[string]*dialCall)
}
p.dialing[addr] = call
- go call.dial(addr)
+ go call.dial(call.ctx, addr)
return call
}
// run in its own goroutine.
-func (c *dialCall) dial(addr string) {
+func (c *dialCall) dial(ctx context.Context, addr string) {
const singleUse = false // shared conn
- c.res, c.err = c.p.t.dialClientConn(addr, singleUse)
+ c.res, c.err = c.p.t.dialClientConn(ctx, addr, singleUse)
close(c.done)
c.p.mu.Lock()
@@ -276,3 +286,28 @@ type noDialClientConnPool struct{ *clientConnPool }
func (p noDialClientConnPool) GetClientConn(req *http.Request, addr string) (*ClientConn, error) {
return p.getClientConn(req, addr, noDialOnMiss)
}
+
+// shouldRetryDial reports whether the current request should
+// retry dialing after the call finished unsuccessfully, for example
+// if the dial was canceled because of a context cancellation or
+// deadline expiry.
+func shouldRetryDial(call *dialCall, req *http.Request) bool {
+ if call.err == nil {
+ // No error, no need to retry
+ return false
+ }
+ if call.ctx == req.Context() {
+ // If the call has the same context as the request, the dial
+ // should not be retried, since any cancellation will have come
+ // from this request.
+ return false
+ }
+ if !errors.Is(call.err, context.Canceled) && !errors.Is(call.err, context.DeadlineExceeded) {
+ // If the call error is not because of a context cancellation or a deadline expiry,
+ // the dial should not be retried.
+ return false
+ }
+ // Only retry if the error is a context cancellation error or deadline expiry
+ // and the context associated with the call was canceled or expired.
+ return call.ctx.Err() != nil
+}
diff --git a/vendor/golang.org/x/net/http2/go115.go b/vendor/golang.org/x/net/http2/go115.go
new file mode 100644
index 00000000..908af1ab
--- /dev/null
+++ b/vendor/golang.org/x/net/http2/go115.go
@@ -0,0 +1,27 @@
+// 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.
+
+//go:build go1.15
+// +build go1.15
+
+package http2
+
+import (
+ "context"
+ "crypto/tls"
+)
+
+// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS
+// connection.
+func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) {
+ dialer := &tls.Dialer{
+ Config: cfg,
+ }
+ cn, err := dialer.DialContext(ctx, network, addr)
+ if err != nil {
+ return nil, err
+ }
+ tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed
+ return tlsCn, nil
+}
diff --git a/vendor/golang.org/x/net/http2/headermap.go b/vendor/golang.org/x/net/http2/headermap.go
index c3ff3fa1..9e12941d 100644
--- a/vendor/golang.org/x/net/http2/headermap.go
+++ b/vendor/golang.org/x/net/http2/headermap.go
@@ -6,7 +6,6 @@ package http2
import (
"net/http"
- "strings"
"sync"
)
@@ -79,10 +78,10 @@ func buildCommonHeaderMaps() {
}
}
-func lowerHeader(v string) string {
+func lowerHeader(v string) (lower string, ascii bool) {
buildCommonHeaderMapsOnce()
if s, ok := commonLowerHeader[v]; ok {
- return s
+ return s, true
}
- return strings.ToLower(v)
+ return asciiToLower(v)
}
diff --git a/vendor/golang.org/x/net/http2/not_go115.go b/vendor/golang.org/x/net/http2/not_go115.go
new file mode 100644
index 00000000..e6c04cf7
--- /dev/null
+++ b/vendor/golang.org/x/net/http2/not_go115.go
@@ -0,0 +1,31 @@
+// 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.
+
+//go:build !go1.15
+// +build !go1.15
+
+package http2
+
+import (
+ "context"
+ "crypto/tls"
+)
+
+// dialTLSWithContext opens a TLS connection.
+func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) {
+ cn, err := tls.Dial(network, addr, cfg)
+ if err != nil {
+ return nil, err
+ }
+ if err := cn.Handshake(); err != nil {
+ return nil, err
+ }
+ if cfg.InsecureSkipVerify {
+ return cn, nil
+ }
+ if err := cn.VerifyHostname(cfg.ServerName); err != nil {
+ return nil, err
+ }
+ return cn, nil
+}
diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go
index e125bbd2..0ccbe9b4 100644
--- a/vendor/golang.org/x/net/http2/server.go
+++ b/vendor/golang.org/x/net/http2/server.go
@@ -231,13 +231,12 @@ func ConfigureServer(s *http.Server, conf *Server) error {
if s.TLSConfig == nil {
s.TLSConfig = new(tls.Config)
- } else if s.TLSConfig.CipherSuites != nil {
- // If they already provided a CipherSuite list, return
- // an error if it has a bad order or is missing
- // ECDHE_RSA_WITH_AES_128_GCM_SHA256 or ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
+ } else if s.TLSConfig.CipherSuites != nil && s.TLSConfig.MinVersion < tls.VersionTLS13 {
+ // If they already provided a TLS 1.0–1.2 CipherSuite list, return an
+ // error if it is missing ECDHE_RSA_WITH_AES_128_GCM_SHA256 or
+ // ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.
haveRequired := false
- sawBad := false
- for i, cs := range s.TLSConfig.CipherSuites {
+ for _, cs := range s.TLSConfig.CipherSuites {
switch cs {
case tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
// Alternative MTI cipher to not discourage ECDSA-only servers.
@@ -245,14 +244,9 @@ func ConfigureServer(s *http.Server, conf *Server) error {
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
haveRequired = true
}
- if isBadCipher(cs) {
- sawBad = true
- } else if sawBad {
- return fmt.Errorf("http2: TLSConfig.CipherSuites index %d contains an HTTP/2-approved cipher suite (%#04x), but it comes after unapproved cipher suites. With this configuration, clients that don't support previous, approved cipher suites may be given an unapproved one and reject the connection.", i, cs)
- }
}
if !haveRequired {
- return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher (need at least one of TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 or TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256).")
+ return fmt.Errorf("http2: TLSConfig.CipherSuites is missing an HTTP/2-required AES_128_GCM_SHA256 cipher (need at least one of TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 or TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)")
}
}
@@ -265,16 +259,12 @@ func ConfigureServer(s *http.Server, conf *Server) error {
s.TLSConfig.PreferServerCipherSuites = true
- haveNPN := false
- for _, p := range s.TLSConfig.NextProtos {
- if p == NextProtoTLS {
- haveNPN = true
- break
- }
- }
- if !haveNPN {
+ if !strSliceContains(s.TLSConfig.NextProtos, NextProtoTLS) {
s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS)
}
+ if !strSliceContains(s.TLSConfig.NextProtos, "http/1.1") {
+ s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, "http/1.1")
+ }
if s.TLSNextProto == nil {
s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){}
@@ -2789,8 +2779,12 @@ func (w *responseWriter) Push(target string, opts *http.PushOptions) error {
// but PUSH_PROMISE requests cannot have a body.
// http://tools.ietf.org/html/rfc7540#section-8.2
// Also disallow Host, since the promised URL must be absolute.
- switch strings.ToLower(k) {
- case "content-length", "content-encoding", "trailer", "te", "expect", "host":
+ if asciiEqualFold(k, "content-length") ||
+ asciiEqualFold(k, "content-encoding") ||
+ asciiEqualFold(k, "trailer") ||
+ asciiEqualFold(k, "te") ||
+ asciiEqualFold(k, "expect") ||
+ asciiEqualFold(k, "host") {
return fmt.Errorf("promised request headers cannot include %q", k)
}
}
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index 7688d72c..b97adff7 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -264,9 +264,8 @@ type ClientConn struct {
peerMaxHeaderListSize uint64
initialWindowSize uint32
- hbuf bytes.Buffer // HPACK encoder writes into this
- henc *hpack.Encoder
- freeBuf [][]byte
+ hbuf bytes.Buffer // HPACK encoder writes into this
+ henc *hpack.Encoder
wmu sync.Mutex // held while writing; acquire AFTER mu if holding both
werr error // first write error that has occurred
@@ -564,12 +563,12 @@ func canRetryError(err error) bool {
return false
}
-func (t *Transport) dialClientConn(addr string, singleUse bool) (*ClientConn, error) {
+func (t *Transport) dialClientConn(ctx context.Context, addr string, singleUse bool) (*ClientConn, error) {
host, _, err := net.SplitHostPort(addr)
if err != nil {
return nil, err
}
- tconn, err := t.dialTLS()("tcp", addr, t.newTLSConfig(host))
+ tconn, err := t.dialTLS(ctx)("tcp", addr, t.newTLSConfig(host))
if err != nil {
return nil, err
}
@@ -590,34 +589,24 @@ func (t *Transport) newTLSConfig(host string) *tls.Config {
return cfg
}
-func (t *Transport) dialTLS() func(string, string, *tls.Config) (net.Conn, error) {
+func (t *Transport) dialTLS(ctx context.Context) func(string, string, *tls.Config) (net.Conn, error) {
if t.DialTLS != nil {
return t.DialTLS
}
- return t.dialTLSDefault
-}
-
-func (t *Transport) dialTLSDefault(network, addr string, cfg *tls.Config) (net.Conn, error) {
- cn, err := tls.Dial(network, addr, cfg)
- if err != nil {
- return nil, err
- }
- if err := cn.Handshake(); err != nil {
- return nil, err
- }
- if !cfg.InsecureSkipVerify {
- if err := cn.VerifyHostname(cfg.ServerName); err != nil {
+ return func(network, addr string, cfg *tls.Config) (net.Conn, error) {
+ tlsCn, err := t.dialTLSWithContext(ctx, network, addr, cfg)
+ if err != nil {
return nil, err
}
+ state := tlsCn.ConnectionState()
+ if p := state.NegotiatedProtocol; p != NextProtoTLS {
+ return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS)
+ }
+ if !state.NegotiatedProtocolIsMutual {
+ return nil, errors.New("http2: could not negotiate protocol mutually")
+ }
+ return tlsCn, nil
}
- state := cn.ConnectionState()
- if p := state.NegotiatedProtocol; p != NextProtoTLS {
- return nil, fmt.Errorf("http2: unexpected ALPN protocol %q; want %q", p, NextProtoTLS)
- }
- if !state.NegotiatedProtocolIsMutual {
- return nil, errors.New("http2: could not negotiate protocol mutually")
- }
- return cn, nil
}
// disableKeepAlives reports whether connections should be closed as
@@ -923,46 +912,6 @@ func (cc *ClientConn) closeForLostPing() error {
return cc.closeForError(err)
}
-const maxAllocFrameSize = 512 << 10
-
-// frameBuffer returns a scratch buffer suitable for writing DATA frames.
-// They're capped at the min of the peer's max frame size or 512KB
-// (kinda arbitrarily), but definitely capped so we don't allocate 4GB
-// bufers.
-func (cc *ClientConn) frameScratchBuffer() []byte {
- cc.mu.Lock()
- size := cc.maxFrameSize
- if size > maxAllocFrameSize {
- size = maxAllocFrameSize
- }
- for i, buf := range cc.freeBuf {
- if len(buf) >= int(size) {
- cc.freeBuf[i] = nil
- cc.mu.Unlock()
- return buf[:size]
- }
- }
- cc.mu.Unlock()
- return make([]byte, size)
-}
-
-func (cc *ClientConn) putFrameScratchBuffer(buf []byte) {
- cc.mu.Lock()
- defer cc.mu.Unlock()
- const maxBufs = 4 // arbitrary; 4 concurrent requests per conn? investigate.
- if len(cc.freeBuf) < maxBufs {
- cc.freeBuf = append(cc.freeBuf, buf)
- return
- }
- for i, old := range cc.freeBuf {
- if old == nil {
- cc.freeBuf[i] = buf
- return
- }
- }
- // forget about it.
-}
-
// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not
// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests.
var errRequestCanceled = errors.New("net/http: request canceled")
@@ -1005,7 +954,7 @@ func checkConnHeaders(req *http.Request) error {
if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") {
return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv)
}
- if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && !strings.EqualFold(vv[0], "close") && !strings.EqualFold(vv[0], "keep-alive")) {
+ if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && !asciiEqualFold(vv[0], "close") && !asciiEqualFold(vv[0], "keep-alive")) {
return fmt.Errorf("http2: invalid Connection request header: %q", vv)
}
return nil
@@ -1305,11 +1254,35 @@ var (
errReqBodyTooLong = errors.New("http2: request body larger than specified content length")
)
+// frameScratchBufferLen returns the length of a buffer to use for
+// outgoing request bodies to read/write to/from.
+//
+// It returns max(1, min(peer's advertised max frame size,
+// Request.ContentLength+1, 512KB)).
+func (cs *clientStream) frameScratchBufferLen(maxFrameSize int) int {
+ const max = 512 << 10
+ n := int64(maxFrameSize)
+ if n > max {
+ n = max
+ }
+ if cl := actualContentLength(cs.req); cl != -1 && cl+1 < n {
+ // Add an extra byte past the declared content-length to
+ // give the caller's Request.Body io.Reader a chance to
+ // give us more bytes than they declared, so we can catch it
+ // early.
+ n = cl + 1
+ }
+ if n < 1 {
+ return 1
+ }
+ return int(n) // doesn't truncate; max is 512K
+}
+
+var bufPool sync.Pool // of *[]byte
+
func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) {
cc := cs.cc
sentEnd := false // whether we sent the final DATA frame w/ END_STREAM
- buf := cc.frameScratchBuffer()
- defer cc.putFrameScratchBuffer(buf)
defer func() {
traceWroteRequest(cs.trace, err)
@@ -1328,9 +1301,24 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
remainLen := actualContentLength(req)
hasContentLen := remainLen != -1
+ cc.mu.Lock()
+ maxFrameSize := int(cc.maxFrameSize)
+ cc.mu.Unlock()
+
+ // 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)
+ buf = *bp
+ } else {
+ buf = make([]byte, scratchLen)
+ defer bufPool.Put(&buf)
+ }
+
var sawEOF bool
for !sawEOF {
- n, err := body.Read(buf[:len(buf)-1])
+ n, err := body.Read(buf[:len(buf)])
if hasContentLen {
remainLen -= int64(n)
if remainLen == 0 && err == nil {
@@ -1341,8 +1329,9 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
// to send the END_STREAM bit early, double-check that we're actually
// at EOF. Subsequent reads should return (0, EOF) at this point.
// If either value is different, we return an error in one of two ways below.
+ var scratch [1]byte
var n1 int
- n1, err = body.Read(buf[n:])
+ n1, err = body.Read(scratch[:])
remainLen -= int64(n1)
}
if remainLen < 0 {
@@ -1412,10 +1401,6 @@ func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (
}
}
- cc.mu.Lock()
- maxFrameSize := int(cc.maxFrameSize)
- cc.mu.Unlock()
-
cc.wmu.Lock()
defer cc.wmu.Unlock()
@@ -1531,19 +1516,21 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
var didUA bool
for k, vv := range req.Header {
- if strings.EqualFold(k, "host") || strings.EqualFold(k, "content-length") {
+ if asciiEqualFold(k, "host") || asciiEqualFold(k, "content-length") {
// Host is :authority, already sent.
// Content-Length is automatic, set below.
continue
- } else if strings.EqualFold(k, "connection") || strings.EqualFold(k, "proxy-connection") ||
- strings.EqualFold(k, "transfer-encoding") || strings.EqualFold(k, "upgrade") ||
- strings.EqualFold(k, "keep-alive") {
+ } else if asciiEqualFold(k, "connection") ||
+ asciiEqualFold(k, "proxy-connection") ||
+ asciiEqualFold(k, "transfer-encoding") ||
+ asciiEqualFold(k, "upgrade") ||
+ asciiEqualFold(k, "keep-alive") {
// Per 8.1.2.2 Connection-Specific Header
// Fields, don't send connection-specific
// fields. We have already checked if any
// are error-worthy so just ignore the rest.
continue
- } else if strings.EqualFold(k, "user-agent") {
+ } else if asciiEqualFold(k, "user-agent") {
// Match Go's http1 behavior: at most one
// User-Agent. If set to nil or empty string,
// then omit it. Otherwise if not mentioned,
@@ -1556,7 +1543,7 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
if vv[0] == "" {
continue
}
- } else if strings.EqualFold(k, "cookie") {
+ } else if asciiEqualFold(k, "cookie") {
// Per 8.1.2.5 To allow for better compression efficiency, the
// Cookie header field MAY be split into separate header fields,
// each with one or more cookie-pairs.
@@ -1615,7 +1602,12 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
// Header list size is ok. Write the headers.
enumerateHeaders(func(name, value string) {
- name = strings.ToLower(name)
+ name, ascii := asciiToLower(name)
+ if !ascii {
+ // Skip writing invalid headers. Per RFC 7540, Section 8.1.2, header
+ // field names have to be ASCII characters (just as in HTTP/1.x).
+ return
+ }
cc.writeHeader(name, value)
if traceHeaders {
traceWroteHeaderField(trace, name, value)
@@ -1663,9 +1655,14 @@ func (cc *ClientConn) encodeTrailers(req *http.Request) ([]byte, error) {
}
for k, vv := range req.Trailer {
+ lowKey, ascii := asciiToLower(k)
+ if !ascii {
+ // Skip writing invalid headers. Per RFC 7540, Section 8.1.2, header
+ // field names have to be ASCII characters (just as in HTTP/1.x).
+ continue
+ }
// Transfer-Encoding, etc.. have already been filtered at the
// start of RoundTrip
- lowKey := strings.ToLower(k)
for _, v := range vv {
cc.writeHeader(lowKey, v)
}
diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go
index 3849bc26..33f61398 100644
--- a/vendor/golang.org/x/net/http2/write.go
+++ b/vendor/golang.org/x/net/http2/write.go
@@ -341,7 +341,12 @@ func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) {
}
for _, k := range keys {
vv := h[k]
- k = lowerHeader(k)
+ k, ascii := lowerHeader(k)
+ if !ascii {
+ // Skip writing invalid headers. Per RFC 7540, Section 8.1.2, header
+ // field names have to be ASCII characters (just as in HTTP/1.x).
+ continue
+ }
if !validWireHeaderFieldName(k) {
// Skip it as backup paranoia. Per
// golang.org/issue/14048, these should
diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go
index 7e69ee1b..5208ba6c 100644
--- a/vendor/golang.org/x/net/idna/idna10.0.0.go
+++ b/vendor/golang.org/x/net/idna/idna10.0.0.go
@@ -67,15 +67,14 @@ func Transitional(transitional bool) Option {
// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
// are longer than allowed by the RFC.
+//
+// This option corresponds to the VerifyDnsLength flag in UTS #46.
func VerifyDNSLength(verify bool) Option {
return func(o *options) { o.verifyDNSLength = verify }
}
// RemoveLeadingDots removes leading label separators. Leading runes that map to
// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
-//
-// This is the behavior suggested by the UTS #46 and is adopted by some
-// browsers.
func RemoveLeadingDots(remove bool) Option {
return func(o *options) { o.removeLeadingDots = remove }
}
@@ -83,6 +82,8 @@ func RemoveLeadingDots(remove bool) Option {
// ValidateLabels sets whether to check the mandatory label validation criteria
// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
// of hyphens ('-'), normalization, validity of runes, and the context rules.
+// In particular, ValidateLabels also sets the CheckHyphens and CheckJoiners flags
+// in UTS #46.
func ValidateLabels(enable bool) Option {
return func(o *options) {
// Don't override existing mappings, but set one that at least checks
@@ -91,25 +92,48 @@ func ValidateLabels(enable bool) Option {
o.mapping = normalize
}
o.trie = trie
- o.validateLabels = enable
- o.fromPuny = validateFromPunycode
+ o.checkJoiners = enable
+ o.checkHyphens = enable
+ if enable {
+ o.fromPuny = validateFromPunycode
+ } else {
+ o.fromPuny = nil
+ }
+ }
+}
+
+// CheckHyphens sets whether to check for correct use of hyphens ('-') in
+// labels. Most web browsers do not have this option set, since labels such as
+// "r3---sn-apo3qvuoxuxbt-j5pe" are in common use.
+//
+// This option corresponds to the CheckHyphens flag in UTS #46.
+func CheckHyphens(enable bool) Option {
+ return func(o *options) { o.checkHyphens = enable }
+}
+
+// CheckJoiners sets whether to check the ContextJ rules as defined in Appendix
+// A of RFC 5892, concerning the use of joiner runes.
+//
+// This option corresponds to the CheckJoiners flag in UTS #46.
+func CheckJoiners(enable bool) Option {
+ return func(o *options) {
+ o.trie = trie
+ o.checkJoiners = enable
}
}
// 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.
+// hyphen). This is set by default for MapForLookup and ValidateForRegistration,
+// but is only useful if ValidateLabels is set.
//
// This option is useful, for instance, for browsers that allow characters
// outside this range, for example a '_' (U+005F LOW LINE). See
-// http://www.rfc-editor.org/std/std3.txt for more details This option
-// corresponds to the UseSTD3ASCIIRules option in UTS #46.
+// http://www.rfc-editor.org/std/std3.txt for more details.
+//
+// This option corresponds to the UseSTD3ASCIIRules flag in UTS #46.
func StrictDomainName(use bool) Option {
- return func(o *options) {
- o.trie = trie
- o.useSTD3Rules = use
- o.fromPuny = validateFromPunycode
- }
+ return func(o *options) { o.useSTD3Rules = use }
}
// NOTE: the following options pull in tables. The tables should not be linked
@@ -117,6 +141,8 @@ func StrictDomainName(use bool) Option {
// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
// that relies on proper validation of labels should include this rule.
+//
+// This option corresponds to the CheckBidi flag in UTS #46.
func BidiRule() Option {
return func(o *options) { o.bidirule = bidirule.ValidString }
}
@@ -152,7 +178,8 @@ func MapForLookup() Option {
type options struct {
transitional bool
useSTD3Rules bool
- validateLabels bool
+ checkHyphens bool
+ checkJoiners bool
verifyDNSLength bool
removeLeadingDots bool
@@ -225,8 +252,11 @@ func (p *Profile) String() string {
if p.useSTD3Rules {
s += ":UseSTD3Rules"
}
- if p.validateLabels {
- s += ":ValidateLabels"
+ if p.checkHyphens {
+ s += ":CheckHyphens"
+ }
+ if p.checkJoiners {
+ s += ":CheckJoiners"
}
if p.verifyDNSLength {
s += ":VerifyDNSLength"
@@ -254,26 +284,29 @@ var (
punycode = &Profile{}
lookup = &Profile{options{
- transitional: true,
- useSTD3Rules: true,
- validateLabels: true,
- trie: trie,
- fromPuny: validateFromPunycode,
- mapping: validateAndMap,
- bidirule: bidirule.ValidString,
+ transitional: true,
+ useSTD3Rules: true,
+ checkHyphens: true,
+ checkJoiners: true,
+ trie: trie,
+ fromPuny: validateFromPunycode,
+ mapping: validateAndMap,
+ bidirule: bidirule.ValidString,
}}
display = &Profile{options{
- useSTD3Rules: true,
- validateLabels: true,
- trie: trie,
- fromPuny: validateFromPunycode,
- mapping: validateAndMap,
- bidirule: bidirule.ValidString,
+ useSTD3Rules: true,
+ checkHyphens: true,
+ checkJoiners: true,
+ trie: trie,
+ fromPuny: validateFromPunycode,
+ mapping: validateAndMap,
+ bidirule: bidirule.ValidString,
}}
registration = &Profile{options{
useSTD3Rules: true,
- validateLabels: true,
verifyDNSLength: true,
+ checkHyphens: true,
+ checkJoiners: true,
trie: trie,
fromPuny: validateFromPunycode,
mapping: validateRegistration,
@@ -340,7 +373,7 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
}
isBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight
labels.set(u)
- if err == nil && p.validateLabels {
+ if err == nil && p.fromPuny != nil {
err = p.fromPuny(p, u)
}
if err == nil {
@@ -681,16 +714,18 @@ func (p *Profile) validateLabel(s string) (err error) {
}
return nil
}
- if !p.validateLabels {
- return nil
- }
- trie := p.trie // p.validateLabels is only set if trie is set.
- if len(s) > 4 && s[2] == '-' && s[3] == '-' {
- return &labelError{s, "V2"}
+ if p.checkHyphens {
+ if len(s) > 4 && s[2] == '-' && s[3] == '-' {
+ return &labelError{s, "V2"}
+ }
+ if s[0] == '-' || s[len(s)-1] == '-' {
+ return &labelError{s, "V3"}
+ }
}
- if s[0] == '-' || s[len(s)-1] == '-' {
- return &labelError{s, "V3"}
+ if !p.checkJoiners {
+ return nil
}
+ trie := p.trie // p.checkJoiners is only set if trie is set.
// TODO: merge the use of this in the trie.
v, sz := trie.lookupString(s)
x := info(v)
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 7c745637..55f718f1 100644
--- a/vendor/golang.org/x/net/idna/idna9.0.0.go
+++ b/vendor/golang.org/x/net/idna/idna9.0.0.go
@@ -66,15 +66,14 @@ func Transitional(transitional bool) Option {
// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts
// are longer than allowed by the RFC.
+//
+// This option corresponds to the VerifyDnsLength flag in UTS #46.
func VerifyDNSLength(verify bool) Option {
return func(o *options) { o.verifyDNSLength = verify }
}
// RemoveLeadingDots removes leading label separators. Leading runes that map to
// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.
-//
-// This is the behavior suggested by the UTS #46 and is adopted by some
-// browsers.
func RemoveLeadingDots(remove bool) Option {
return func(o *options) { o.removeLeadingDots = remove }
}
@@ -82,6 +81,8 @@ func RemoveLeadingDots(remove bool) Option {
// ValidateLabels sets whether to check the mandatory label validation criteria
// as defined in Section 5.4 of RFC 5891. This includes testing for correct use
// of hyphens ('-'), normalization, validity of runes, and the context rules.
+// In particular, ValidateLabels also sets the CheckHyphens and CheckJoiners flags
+// in UTS #46.
func ValidateLabels(enable bool) Option {
return func(o *options) {
// Don't override existing mappings, but set one that at least checks
@@ -90,25 +91,48 @@ func ValidateLabels(enable bool) Option {
o.mapping = normalize
}
o.trie = trie
- o.validateLabels = enable
- o.fromPuny = validateFromPunycode
+ o.checkJoiners = enable
+ o.checkHyphens = enable
+ if enable {
+ o.fromPuny = validateFromPunycode
+ } else {
+ o.fromPuny = nil
+ }
+ }
+}
+
+// CheckHyphens sets whether to check for correct use of hyphens ('-') in
+// labels. Most web browsers do not have this option set, since labels such as
+// "r3---sn-apo3qvuoxuxbt-j5pe" are in common use.
+//
+// This option corresponds to the CheckHyphens flag in UTS #46.
+func CheckHyphens(enable bool) Option {
+ return func(o *options) { o.checkHyphens = enable }
+}
+
+// CheckJoiners sets whether to check the ContextJ rules as defined in Appendix
+// A of RFC 5892, concerning the use of joiner runes.
+//
+// This option corresponds to the CheckJoiners flag in UTS #46.
+func CheckJoiners(enable bool) Option {
+ return func(o *options) {
+ o.trie = trie
+ o.checkJoiners = enable
}
}
// StrictDomainName limits the set of permissable 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.
+// hyphen). This is set by default for MapForLookup and ValidateForRegistration,
+// but is only useful if ValidateLabels is set.
//
// This option is useful, for instance, for browsers that allow characters
// outside this range, for example a '_' (U+005F LOW LINE). See
-// http://www.rfc-editor.org/std/std3.txt for more details This option
-// corresponds to the UseSTD3ASCIIRules option in UTS #46.
+// http://www.rfc-editor.org/std/std3.txt for more details.
+//
+// This option corresponds to the UseSTD3ASCIIRules flag in UTS #46.
func StrictDomainName(use bool) Option {
- return func(o *options) {
- o.trie = trie
- o.useSTD3Rules = use
- o.fromPuny = validateFromPunycode
- }
+ return func(o *options) { o.useSTD3Rules = use }
}
// NOTE: the following options pull in tables. The tables should not be linked
@@ -116,6 +140,8 @@ func StrictDomainName(use bool) Option {
// BidiRule enables the Bidi rule as defined in RFC 5893. Any application
// that relies on proper validation of labels should include this rule.
+//
+// This option corresponds to the CheckBidi flag in UTS #46.
func BidiRule() Option {
return func(o *options) { o.bidirule = bidirule.ValidString }
}
@@ -152,7 +178,8 @@ func MapForLookup() Option {
type options struct {
transitional bool
useSTD3Rules bool
- validateLabels bool
+ checkHyphens bool
+ checkJoiners bool
verifyDNSLength bool
removeLeadingDots bool
@@ -225,8 +252,11 @@ func (p *Profile) String() string {
if p.useSTD3Rules {
s += ":UseSTD3Rules"
}
- if p.validateLabels {
- s += ":ValidateLabels"
+ if p.checkHyphens {
+ s += ":CheckHyphens"
+ }
+ if p.checkJoiners {
+ s += ":CheckJoiners"
}
if p.verifyDNSLength {
s += ":VerifyDNSLength"
@@ -255,9 +285,10 @@ var (
punycode = &Profile{}
lookup = &Profile{options{
transitional: true,
- useSTD3Rules: true,
- validateLabels: true,
removeLeadingDots: true,
+ useSTD3Rules: true,
+ checkHyphens: true,
+ checkJoiners: true,
trie: trie,
fromPuny: validateFromPunycode,
mapping: validateAndMap,
@@ -265,8 +296,9 @@ var (
}}
display = &Profile{options{
useSTD3Rules: true,
- validateLabels: true,
removeLeadingDots: true,
+ checkHyphens: true,
+ checkJoiners: true,
trie: trie,
fromPuny: validateFromPunycode,
mapping: validateAndMap,
@@ -274,8 +306,9 @@ var (
}}
registration = &Profile{options{
useSTD3Rules: true,
- validateLabels: true,
verifyDNSLength: true,
+ checkHyphens: true,
+ checkJoiners: true,
trie: trie,
fromPuny: validateFromPunycode,
mapping: validateRegistration,
@@ -339,7 +372,7 @@ func (p *Profile) process(s string, toASCII bool) (string, error) {
continue
}
labels.set(u)
- if err == nil && p.validateLabels {
+ if err == nil && p.fromPuny != nil {
err = p.fromPuny(p, u)
}
if err == nil {
@@ -629,16 +662,18 @@ func (p *Profile) validateLabel(s string) error {
if p.bidirule != nil && !p.bidirule(s) {
return &labelError{s, "B"}
}
- if !p.validateLabels {
- return nil
- }
- trie := p.trie // p.validateLabels is only set if trie is set.
- if len(s) > 4 && s[2] == '-' && s[3] == '-' {
- return &labelError{s, "V2"}
+ if p.checkHyphens {
+ if len(s) > 4 && s[2] == '-' && s[3] == '-' {
+ return &labelError{s, "V2"}
+ }
+ if s[0] == '-' || s[len(s)-1] == '-' {
+ return &labelError{s, "V3"}
+ }
}
- if s[0] == '-' || s[len(s)-1] == '-' {
- return &labelError{s, "V3"}
+ if !p.checkJoiners {
+ return nil
}
+ trie := p.trie // p.checkJoiners is only set if trie is set.
// TODO: merge the use of this in the trie.
v, sz := trie.lookupString(s)
x := info(v)
diff --git a/vendor/golang.org/x/net/publicsuffix/list.go b/vendor/golang.org/x/net/publicsuffix/list.go
new file mode 100644
index 00000000..200617ea
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/list.go
@@ -0,0 +1,181 @@
+// Copyright 2012 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:generate go run gen.go
+
+// Package publicsuffix provides a public suffix list based on data from
+// https://publicsuffix.org/
+//
+// A public suffix is one under which Internet users can directly register
+// names. It is related to, but different from, a TLD (top level domain).
+//
+// "com" is a TLD (top level domain). Top level means it has no dots.
+//
+// "com" is also a public suffix. Amazon and Google have registered different
+// siblings under that domain: "amazon.com" and "google.com".
+//
+// "au" is another TLD, again because it has no dots. But it's not "amazon.au".
+// Instead, it's "amazon.com.au".
+//
+// "com.au" isn't an actual TLD, because it's not at the top level (it has
+// dots). But it is an eTLD (effective TLD), because that's the branching point
+// for domain name registrars.
+//
+// Another name for "an eTLD" is "a public suffix". Often, what's more of
+// interest is the eTLD+1, or one more label than the public suffix. For
+// example, browsers partition read/write access to HTTP cookies according to
+// the eTLD+1. Web pages served from "amazon.com.au" can't read cookies from
+// "google.com.au", but web pages served from "maps.google.com" can share
+// cookies from "www.google.com", so you don't have to sign into Google Maps
+// separately from signing into Google Web Search. Note that all four of those
+// domains have 3 labels and 2 dots. The first two domains are each an eTLD+1,
+// the last two are not (but share the same eTLD+1: "google.com").
+//
+// All of these domains have the same eTLD+1:
+// - "www.books.amazon.co.uk"
+// - "books.amazon.co.uk"
+// - "amazon.co.uk"
+// Specifically, the eTLD+1 is "amazon.co.uk", because the eTLD is "co.uk".
+//
+// There is no closed form algorithm to calculate the eTLD of a domain.
+// Instead, the calculation is data driven. This package provides a
+// pre-compiled snapshot of Mozilla's PSL (Public Suffix List) data at
+// https://publicsuffix.org/
+package publicsuffix // import "golang.org/x/net/publicsuffix"
+
+// TODO: specify case sensitivity and leading/trailing dot behavior for
+// func PublicSuffix and func EffectiveTLDPlusOne.
+
+import (
+ "fmt"
+ "net/http/cookiejar"
+ "strings"
+)
+
+// List implements the cookiejar.PublicSuffixList interface by calling the
+// PublicSuffix function.
+var List cookiejar.PublicSuffixList = list{}
+
+type list struct{}
+
+func (list) PublicSuffix(domain string) string {
+ ps, _ := PublicSuffix(domain)
+ return ps
+}
+
+func (list) String() string {
+ return version
+}
+
+// PublicSuffix returns the public suffix of the domain using a copy of the
+// publicsuffix.org database compiled into the library.
+//
+// icann is whether the public suffix is managed by the Internet Corporation
+// for Assigned Names and Numbers. If not, the public suffix is either a
+// privately managed domain (and in practice, not a top level domain) or an
+// unmanaged top level domain (and not explicitly mentioned in the
+// publicsuffix.org list). For example, "foo.org" and "foo.co.uk" are ICANN
+// domains, "foo.dyndns.org" and "foo.blogspot.co.uk" are private domains and
+// "cromulent" is an unmanaged top level domain.
+//
+// Use cases for distinguishing ICANN domains like "foo.com" from private
+// domains like "foo.appspot.com" can be found at
+// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases
+func PublicSuffix(domain string) (publicSuffix string, icann bool) {
+ lo, hi := uint32(0), uint32(numTLD)
+ s, suffix, icannNode, wildcard := domain, len(domain), false, false
+loop:
+ for {
+ dot := strings.LastIndex(s, ".")
+ if wildcard {
+ icann = icannNode
+ suffix = 1 + dot
+ }
+ if lo == hi {
+ break
+ }
+ f := find(s[1+dot:], lo, hi)
+ if f == notFound {
+ break
+ }
+
+ u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength)
+ icannNode = u&(1<<nodesBitsICANN-1) != 0
+ u >>= nodesBitsICANN
+ u = children[u&(1<<nodesBitsChildren-1)]
+ lo = u & (1<<childrenBitsLo - 1)
+ u >>= childrenBitsLo
+ hi = u & (1<<childrenBitsHi - 1)
+ u >>= childrenBitsHi
+ switch u & (1<<childrenBitsNodeType - 1) {
+ case nodeTypeNormal:
+ suffix = 1 + dot
+ case nodeTypeException:
+ suffix = 1 + len(s)
+ break loop
+ }
+ u >>= childrenBitsNodeType
+ wildcard = u&(1<<childrenBitsWildcard-1) != 0
+ if !wildcard {
+ icann = icannNode
+ }
+
+ if dot == -1 {
+ break
+ }
+ s = s[:dot]
+ }
+ if suffix == len(domain) {
+ // If no rules match, the prevailing rule is "*".
+ return domain[1+strings.LastIndex(domain, "."):], icann
+ }
+ return domain[suffix:], icann
+}
+
+const notFound uint32 = 1<<32 - 1
+
+// find returns the index of the node in the range [lo, hi) whose label equals
+// label, or notFound if there is no such node. The range is assumed to be in
+// strictly increasing node label order.
+func find(label string, lo, hi uint32) uint32 {
+ for lo < hi {
+ mid := lo + (hi-lo)/2
+ s := nodeLabel(mid)
+ if s < label {
+ lo = mid + 1
+ } else if s == label {
+ return mid
+ } else {
+ hi = mid
+ }
+ }
+ return notFound
+}
+
+// nodeLabel returns the label for the i'th node.
+func nodeLabel(i uint32) string {
+ x := nodes[i]
+ length := x & (1<<nodesBitsTextLength - 1)
+ x >>= nodesBitsTextLength
+ offset := x & (1<<nodesBitsTextOffset - 1)
+ return text[offset : offset+length]
+}
+
+// EffectiveTLDPlusOne returns the effective top level domain plus one more
+// label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org".
+func EffectiveTLDPlusOne(domain string) (string, error) {
+ if strings.HasPrefix(domain, ".") || strings.HasSuffix(domain, ".") || strings.Contains(domain, "..") {
+ return "", fmt.Errorf("publicsuffix: empty label in domain %q", domain)
+ }
+
+ suffix, _ := PublicSuffix(domain)
+ if len(domain) <= len(suffix) {
+ return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain)
+ }
+ i := len(domain) - len(suffix) - 1
+ if domain[i] != '.' {
+ return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain)
+ }
+ return domain[1+strings.LastIndex(domain[:i], "."):], nil
+}
diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go
new file mode 100644
index 00000000..c2e368db
--- /dev/null
+++ b/vendor/golang.org/x/net/publicsuffix/table.go
@@ -0,0 +1,10520 @@
+// generated by go run gen.go; DO NOT EDIT
+
+package publicsuffix
+
+const version = "publicsuffix.org's public_suffix_list.dat, git revision 1e2388af5cee935fdec6dc557db41559111e3fb9 (2021-04-26T23:42:06Z)"
+
+const (
+ nodesBitsChildren = 10
+ nodesBitsICANN = 1
+ nodesBitsTextOffset = 15
+ nodesBitsTextLength = 6
+
+ childrenBitsWildcard = 1
+ childrenBitsNodeType = 2
+ childrenBitsHi = 14
+ childrenBitsLo = 14
+)
+
+const (
+ nodeTypeNormal = 0
+ nodeTypeException = 1
+ nodeTypeParentOnly = 2
+)
+
+// numTLD is the number of top level domains.
+const numTLD = 1506
+
+// Text is the combined text of all labels.
+const text = "9guacuiababia-goracleaningroks-theatree12hpalmasfjorden4tatarant" +
+ "ours3-ap-northeast-2ix4432-balsan-suedtirolkuszczytnord-aurdalp1" +
+ "kappchizip6116-b-datacentermezproxyzgorabogadobeaemcloud-fr1337b" +
+ "irdartcenterprisecloudaccesscambridgeiseiroumuenchenirasakincheo" +
+ "nishiazaindianapolis-a-bloggerbirkenesoddtangenovarahkkeravjuego" +
+ "shikikugawashtenawdev-myqnapcloudcontrolledekagaminogifts3-websi" +
+ "te-ap-southeast-2birthplacevje-og-hornnes3-website-eu-west-1bjar" +
+ "koyuu2-localhostrolekaniepcextraspace-to-rentalstomakomaibarabje" +
+ "rkreimbamblebesbyglandroverhallaakesvuemieleccebinagisoccertmgra" +
+ "zerbaijan-mayengerdalipaywhirlimanowarudaustevollillyokosukanrag" +
+ "rocerybnikeisenbahnaumburggfarmerseine164-balsfjordd-dnshome-web" +
+ "serverdal-o-g-i-naval-d-aosta-valleyboltateshinanomachimkentatey" +
+ "amajudygarlanddnslivefsnillfjorddnss3-ap-south-1bjugnieznord-oda" +
+ "lomzaporizhzhiablackfridayuzawabloombergbauernishigohtawaramotoi" +
+ "neppueblockbusterniiminamiawajikindianmarketinglitcheltenham-rad" +
+ "io-opencraftrainingliwicebloxcms3-website-sa-east-1bluedagestang" +
+ "emologicallyngenishiharabmoattachments3-website-us-east-1bms3-we" +
+ "bsite-us-west-1bmwedeploybnrwegroweibolognagareyamakeuparaglidin" +
+ "globoavistanbulsan-sudtirolondonetskaratebomloabathsbchernivtsic" +
+ "iliabondigitaloceanographicsxboxfordellogliastradinglogoweirbonn" +
+ "ishiizunazukindielddanuorrindigenamsosnowiechernovtsyncloudray-d" +
+ "nstracebookinghostedpictetjeldsundrayddnsfreebox-osascoli-piceno" +
+ "rdlandraydnsupdaterbookonlinewjerseyboomlajollamericanexpressexy" +
+ "boschaefflerdalondrinapleskns3-website-us-west-2bostik-serverran" +
+ "koshigayachts5ybostonakijinsekikogentappsselfiparisor-fronishika" +
+ "taketomisatomobelembetsukubankaratsuginamikatagamilanotairesakyo" +
+ "tanabellevuelosangelesjabbottjmaxxxenishikatsuragit-reposalangen" +
+ "ishikawazukamisatohoboleslawiechirurgiens-dentistes-en-francebot" +
+ "anicalgardeno-stagingloppenzaporizhzhedmarkareliancebotanicgarde" +
+ "nishimerabotanychiryukyuragifuchungbukharanzanishinomiyashironom" +
+ "niweatherchannelorenskoglugsjcbnpparibashkiriabouncemerckmsdnipr" +
+ "opetrovskjervoyageorgeorgiabounty-fullensakerrypropertiesalon-1b" +
+ "outiquebeconomiastalowa-wolawassamukawataricoharuovatmallorcafed" +
+ "eration-webpaashorokanaieboutiresindevicenzaganquannefrankfurtjo" +
+ "meloyalistoragebozen-sudtirolottebozen-suedtirolottokonamegataka" +
+ "yamassa-carrara-massacarraramassabusinessebykleclerchitachinakag" +
+ "awatchandclockariyameiwamarshallstatebankarlsoybplaceducatoraybr" +
+ "andywinevalleybrasiliabrindisibenikilatironrenderbristoloseyouri" +
+ "parliamentjxeroxfinitybritishcolumbialowiezakopanelastxjampalace" +
+ "broadcastlebtimnetzjavaldaostathelleluxembourgmbhartipschlesisch" +
+ "esaltdalouvrehabmerbroadwaybroke-itkmaxxn--0trq7p7nnishinoomoteg" +
+ "omurabrokerbronnoysundrivegarsheiheijindowapblogsiteleafamilycom" +
+ "pany-2brothermesaverdealerbrowsersafetymarketsaludrobaknoluoktac" +
+ "hikawafflecellclstagehirnrtksatxn--11b4c3drudupontariobranconaka" +
+ "niikawatanagurabrumunddalpusercontentlon-2brunelblagrarchaeology" +
+ "eongbuk0brusselsalvadordalibabalena-devicesalzburgminakamichihar" +
+ "abruxellesamegawabryanskleppgafanishinoshimatsusakahoginankokubu" +
+ "njindustriabrynewmexicodyn-o-saurlandesamnangerbuskerudurbanamex" +
+ "hibitionishiokoppegardurhamburgmodellingmxn--12c1fe0bradescotlan" +
+ "dynathomebuiltwithdarkarmoybuzentsujiiebuzzlgretakamoriokakegawa" +
+ "bwellbeingzonebzhitomirbzzwesteuropenairbusantiquest-a-la-maison" +
+ "dre-landroidyndns-at-homedepotenzaolbia-tempio-olbiatempioolbial" +
+ "ystokkeliwebhostingrimstadyndns-at-workisboringripecolumbusheyco" +
+ "mmunecommunity-prochowicecomoarekecomparemarkerryhotelsantamaria" +
+ "kecomsecaaskoyabearalvahkihokumakogenebakkeshibechambagriculture" +
+ "nnebugattiffanyaarborteaches-yogasawara-rugbydgoszczecinemacerat" +
+ "abuseating-organicbcieszyncondoshichinohealth-carereformemergenc" +
+ "yahikobeardubaiduckdnswedeniwaizumiotsukumiyamazonawsglobalaccel" +
+ "eratorahimeshimabaridagawalbrzycharternopilawalesundyndns-remote" +
+ "wdyndns-serverisignconferenceconstructionconsuladoesntexisteinge" +
+ "ekashibatakatorinzais-a-candidateconsultanthropologyconsultingro" +
+ "undhandlingroznynysaikisosakitagawacontactoyouracontagematsubara" +
+ "vpagexluzerncontemporaryarteducationalchikugodogadollsantoandrea" +
+ "mhostersanukis-a-caterercontractorskenconventureshinodearthruher" +
+ "ecifedexetercookingchannelsdvrdnsdojoburgrpasadenaritakoelncoolv" +
+ "ivanovoldacooperativano-frankivskolefrakkestadyndns-webhareidsbe" +
+ "rgentingruecopenhagencyclopedichonanbulsan-suedtirolubindalublin" +
+ "desnesamsclubartowestfalenishitosashimizunaminamibosogndalucania" +
+ "coproductionsaobernardocorporationcorsicahcesuoloansaogoncarrier" +
+ "corvettemp-dnsaotomelbournecosenzamamidorissadonnagatorogersvps-" +
+ "hostrowiechoseikarugamvikarpaczeladzcosidnsfor-better-thanawawsm" +
+ "pplanetariumemorialcostumedicinaharimalborkashiharacouchpotatofr" +
+ "iesapporocoukashiwaracouncilcouponsardegnarusawacozoracqcxn--12c" +
+ "fi8ixb8lcranbrookuwanalyticsardiniacrdyndns-wikinkobierzycecredi" +
+ "tcardyndns-workshoparenakanojohanamakinoharacreditunioncremonash" +
+ "gabadaddjaguarqhachinoheguris-a-celticsfancrewhoswholdingsmall-w" +
+ "ebredirectmeetoystre-slidrettozawacricketrzyncrimeast-kazakhstan" +
+ "angercrotonecrownipassagensarlcrsarpsborguidefenseljordyndns1cru" +
+ "isesarufutsunomiyawakasaikaitabashijonawatecuisinellancashirecip" +
+ "escaracalvinklein-berlindaskvollculturalcentertainmentozsdelmenh" +
+ "orstalbansasayamattelekommunikationcuneocupcakecuritibaghdadynns" +
+ "asebofageologycurvallee-aosteroycymrussiacyonabarumemsettlersask" +
+ "atchewancyouthachiojiyaizuwakamatsubushikusakadogawaferrarivnefe" +
+ "rrerotikagoshimalopolskanlandynv6fetsundynvpnpluscountryestateof" +
+ "delawareclaimsaudafgulenfhvalerfidoomdnsiskinkyotobetsumidatlant" +
+ "ichoshibuyahabackyardsamsungriwataraidyndns-freeboxoslocus-4fiel" +
+ "dyroyrvikinguitarsauheradynservebbsassaris-a-chefashionfigueresi" +
+ "stancefilateliafilegear-audnedalnfilegear-dealstahaugesunderseap" +
+ "ortsinfolionetworkangerfilegear-gbizfilegear-iefilegear-jpmorgan" +
+ "filegear-sg-1filminamiechizenfinalfinancefineartschokokekschokol" +
+ "adenfinlandfinnoyfirebaseappatriafirenetraniandriabarlettatrania" +
+ "ndriafirenzefirestonefirewebhopensocialfirmdalegnicapebretonamic" +
+ "rolightingunmaniwakuratefishingokasells-for-lesscholarshipschool" +
+ "sztynsettsurgeonshalloffameldalfitjarvodkafjordvagsoygardendofth" +
+ "einternetnedalceschulefitnessettlementranoyfjalerflekkefjordfles" +
+ "berguovdageaidnulminamifuranoflickragerokunohealthcareerschulser" +
+ "verflirfloginlinefloraflorencefloridatsunanjoetsuwanouchikujogas" +
+ "zkolancasterfloripaderbornfloristanohatajiris-a-cpadualstackasse" +
+ "rversailleschwarzgwangjuifminamiiserniafloromskogushikamifuranor" +
+ "e-og-uvdalflowerschweizfltranslateflynnhosting-clusterfndfnwkasu" +
+ "kabedzin-addrammenulvikasumigaurayasudafoodnetworkdalfor-ourfor-" +
+ "somedizinhistorischesciencecentersciencehistoryfor-theaterforexr" +
+ "othachirogatakanabeautysfjordforgotdnscientistordalforli-cesena-" +
+ "forlicesenaforlikescandyn53forsalegoldpoint2thisamitsukeforsanda" +
+ "suoloftransportefortalfortevaksdalfortmissoulanciafortworthadano" +
+ "rfolkebibleksvikasuyanaizuerichardlillesandefjordfosnescjohnsonf" +
+ "otaruis-a-cubicle-slavellinodeobjectscrapper-sitefoxafozfranamiz" +
+ "uhobby-sitexascrappingwiddleitungsenfrancaiseharafranziskanerima" +
+ "ringatlantakahamalselvendrellfredrikstadtvscrysecuritytacticserv" +
+ "ehttpaviancargodaddyn-vpndnservehumourfreeddnsgeekgalaxyfreedesk" +
+ "topocznordreisa-hockeynutazurestaticappspacehosted-by-previderfr" +
+ "eemasonryfreemyiphosteurovisionfreesitextileikangerfreetlserveir" +
+ "choyodobashichikashukujitawaraumalatvuopmicrosoftbankaruizawafre" +
+ "iburgxn--1ck2e1bar0emmafann-arboretumbriamallamaceiobbcg12038fre" +
+ "seniusculturecreationfribourgfriuli-v-giuliafriuli-ve-giuliafriu" +
+ "li-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiul" +
+ "iafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuli" +
+ "afriuliveneziagiuliafriulivgiuliafrlfroganserveminecraftransurlf" +
+ "rognfrolandfrom-akrehamnfrom-alfrom-arfrom-azimuthatogayabukijob" +
+ "servableusercontentrapaniizafrom-capetownnews-stagingfrom-coffee" +
+ "dbackplaneappfizerfrom-ctravelchannelfrom-dchristiansburgroks-th" +
+ "isayamanobeokakudamatsuefrom-deatnuniversityfrom-flanderservemp3" +
+ "from-gaulardalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfr" +
+ "om-in-brbar1from-kservep2pgfoggiafrom-kyowariasahikawafrom-lange" +
+ "vagrigentomologyeonggiehtavuoatnabudapest-a-la-masion-rancherkas" +
+ "ydneyfrom-malvikaszubyfrom-mdfrom-meerestaurantravelersinsurance" +
+ "from-mifunefrom-mnfrom-modalenfrom-mservepicservequakefrom-mtnfr" +
+ "om-nctulanservesarcasmatartanddesignfrom-ndfrom-nefrom-nh-serveb" +
+ "logspotrdfrom-njservicesevastopolefrom-nminamiizukaminokawanishi" +
+ "aizubangefrom-nvallee-d-aosteigenfrom-nyminamimakis-a-democratre" +
+ "ndhostingfrom-ohdattorelayfrom-oketogolffansevenassisicilyfrom-o" +
+ "rfrom-padoval-daostavalleyfrom-pratogurafrom-ris-a-designerfrom-" +
+ "schoenbrunnfrom-sdscloudfrom-tnfrom-txn--1ctwolominamatarnobrzeg" +
+ "yptianfrom-utsiracusagaeroclubmedecincinnativeamericanantiquest-" +
+ "mon-blogueurodirumadridnbloggerimo-i-rana4unjargafrom-vald-aosta" +
+ "rostwodzislawienfrom-vtrentin-sud-tirolfrom-wafrom-wiardwebspace" +
+ "from-wvalleeaosteinkjerusalempresashibetsukuis-a-doctorprojectre" +
+ "ntin-sudtirolfrom-wyfrosinonefrostaplesharis-a-financialadvisor-" +
+ "aurdalfroyaitakaharunusualpersonfstcgroupharmaciensharpharmacysh" +
+ "awaiijimarburgfujiiderafujikawaguchikonefujiminokamoenairlineen-" +
+ "rootaribeiraogashimadachicagoboatshellaspeziafujinomiyadattowebc" +
+ "ampinashikiminohostfoldnavyfujiokayamamurogawafujisatoshonairpor" +
+ "tland-4-salernoduminamiminowafujisawafujishiroishidakabiratoride" +
+ "bianfujitsurugashimandalfujiyoshidavvenjargap-northeast-3fukayab" +
+ "eatshimojis-a-geekatowicefukuchiyamadavvesiidappnodebalancertifi" +
+ "cationfukudomigawafukuis-a-greenfukumitsubishigakirovogradoyfuku" +
+ "okazakiryuohkurafukuroishikarikaturindalfukusakisarazure-mobilei" +
+ "rfjordfukuyamagatakahashimamakishiwadazaifudaigojomedio-campidan" +
+ "o-mediocampidanomediofunabashiriuchinadafunagatakahatakaishimogo" +
+ "senfunahashikamiamakusatsumasendaisennangonohejis-a-gurunzenfund" +
+ "aciofunkfeuerfuoiskujukuriyamangooglecodespotrentin-sued-tirolfu" +
+ "osskoczowiiheyakumodernfurnitureggio-calabriafurubirafurudonosti" +
+ "aafurukawairtelebitbridgestonekobayashikaoirmitakeharackmazeplay" +
+ "fusodegaurafussagamiharafutabayamaguchinomihachimanagementrentin" +
+ "-suedtirolfutboldlygoingnowhere-for-morenakatombetsumitakagiizef" +
+ "uttsurugimperiafuturecmshimokawafuturehostingfuturemailingfvghan" +
+ "gglidinghangoutsystemscloudsitehannanmokuizumodenaklodzkochikush" +
+ "inonsenergyhannorthwesternmutualhanyuzenhapmircloudletshimonitay" +
+ "anagitapphdfcbankatsuyamarugame-hostyhostinghappousrcfastly-terr" +
+ "ariumetacentrumeteorappassenger-associationharstadharvestcelebra" +
+ "tionhasamansionshimonosekikawahasaminami-alpshimosuwalkis-a-land" +
+ "scaperugiahashbanghasudahasura-apphiladelphiaareadmyblogsytehasv" +
+ "ikaufentigerhatoyamazakitahiroshimanxn--1lqs03nhatsukaichikaisei" +
+ "yoichippubetsubetsugarustkanmakiwakunigamiharutwentehattfjelldal" +
+ "hayashimamotobungotakadancehazuminobusells-for-uhelsinkitakamiiz" +
+ "umisanofidelitysvardontexistmein-iservebeerhembygdsforbundhemnes" +
+ "himotsukehemsedalhepforgeblockshimotsumaherokusslattuminamioguni" +
+ "5heroyhgtvalleedaostehidorahigashiagatsumagoianiahigashichichibu" +
+ "nkyonanaoshimakanegasakimobetsuldalhigashihiroshimanehigashiizum" +
+ "ozakitakatakaokalmykiahigashikagawahigashikagurasoedahigashikawa" +
+ "kitaaikitakyushuaiahigashikurumegurownproviderhigashimatsushimao" +
+ "ris-a-lawyerhigashimatsuyamakitaakitadaitoigawahigashimurayamamo" +
+ "torcycleshinichinanhigashinarusells-itrentino-aadigehigashinehig" +
+ "ashiomitamamurausukitamihamadahigashiosakasayamanakakogawahigash" +
+ "ishirakawamatakarazukaluganskygearapphilatelyhigashisumiyoshikaw" +
+ "aminamiaikitamotosumy-gatewayhigashitsunortonhigashiurawa-mazows" +
+ "zexnetrentino-alto-adigehigashiyamatokoriyamanashifteditorxn--1l" +
+ "qs71dhigashiyodogawahigashiyoshinogaris-a-liberalhiraizumisatohm" +
+ "apartmentshinjournalismailillehammerfeste-iphilipsynology-diskst" +
+ "ationhirakatashinagawahiranairtrafficplexus-1hirarahiratsukaeruh" +
+ "irayakagehistorichouseshinjukumamotoyamashikokuchuohitachiomiyag" +
+ "ildeskaliszhitachiotagoppdalhitraeumtgeradegreehjartdalhjelmelan" +
+ "dholeckodairaholidayhomegoodshinkamigototalhomeiphoenixn--1qqw23" +
+ "ahomelinkyard-cloudjiffylkesbiblackbaudcdn-edgestackhero-network" +
+ "inggroupowiathletajimageandsoundandvision-riopretochigiessensios" +
+ "itecnologiahomelinuxn--2m4a15ehomeofficehomesecuritymacaparecida" +
+ "homesecuritypchristmaseratinterhostsolutionsandnessjoenishiwakin" +
+ "ternationalfirearmsandoyhomesenseeringhomeunixn--2scrj9chromedic" +
+ "altanissettaishinomakinderoyhondahongotembaixadahonjyoitakasagot" +
+ "pantheonsitehornindalhorsellsyourhomeftphonefosshinshinotsurgery" +
+ "hortendofinternet-dnshinshirohospitalhoteleshintokushimahotelwit" +
+ "hflightshintomikasaharahotmailhoyangerhoylandetroitskypehumaniti" +
+ "eshinyoshitomiokamishihoronobeauxartsandcraftshiojirishirifujied" +
+ "ahurdalhurumajis-a-libertarianhyllestadhyogoris-a-linux-usershio" +
+ "yandexcloudhyugawarahyundaiwafuneis-uberleetrentino-stirolis-ver" +
+ "y-badajozis-a-painteractivestfoldis-very-evillageis-very-goodyea" +
+ "ris-very-niceis-very-sweetpepperis-with-thebandownloadisleofmana" +
+ "ustdaljenv-arubajddarchitecturealtoregontrailroadjeonnamerikawau" +
+ "ejetztrentino-sud-tiroljevnakershusdecorativeartshisognejewelryj" +
+ "ewishartgalleryjfkazteleportlligatrentino-sudtiroljgorajlljls-st" +
+ "o1jls-sto2jls-sto3jmphxn--30rr7yjnjaworznoshiroomgjoyentrentino-" +
+ "sued-tiroljoyokaichibalashovhadselburgjpnjprshisuifuettertdasnet" +
+ "zjurkosaigawakosakaerodromegallupaascolipiceno-ipifony-1koseis-a" +
+ "-photographerokuapphotographysiokosherbrookegawakoshimizumakiyos" +
+ "emitekoshunantankddiamondshizukuishimofusaitoshimatta-varjjatren" +
+ "tino-suedtirolkosugekotohiradomainsureggioemiliaromagnamsskogane" +
+ "is-a-playershiftcryptonomichigangwonkotourakouhokutamakiyosunnda" +
+ "lkounosupplieshopitsitekouyamashikekouzushimashikizunokunimilita" +
+ "rykozagawakozakis-a-republicancerresearchaeologicaliforniakozowi" +
+ "ldlifestylekpnkppspdnshoppingkrasnikahokutokamachintaifun-dnsali" +
+ "ashopwarendalenugkrasnodarkredstonekrelliankristiansandcatshouji" +
+ "s-a-rockstarachowicekristiansundkrodsheradkrokstadelvalle-aostat" +
+ "ic-accesshowakryminamisanrikubetsupportrentinoa-adigekumanottero" +
+ "ykumatorinow-dnshowtimelhusgardenkumejimasoykumenantokigawakunis" +
+ "akis-a-socialistdlibestadkunitachiarailwaykunitomigusukuleuvenet" +
+ "okashikis-a-soxfankunneppubtlshwilliamhillkunstsammlungkunstundd" +
+ "esignkuokgroupilotsienarviikamiokameokamakurazakitchenkuregruhos" +
+ "tingkurgankurobeepilepsykkylvenicekurogimimatakatsukis-a-student" +
+ "alkuroisoftwarezzokuromatsunais-a-teacherkassyno-dshirahamatonbe" +
+ "tsurnadalkurotakikawasakis-a-techietis-a-llamaritimoldell-oglias" +
+ "traderkushirogawakustanais-a-therapistoiakusupplynxn--3bst00mina" +
+ "mitanekutchanelkutnowruzhgorodeokuzumakis-an-accountantshirakoka" +
+ "miminershiranukamisunagawakvafjordkvalsundkvamlidlugolekadenagah" +
+ "amaroyerkvanangenkvinesdalkvinnheradkviteseidatingkvitsoykwpspec" +
+ "truminamiuonumassivegridkzmisconfusedmishimasudamissilewismiller" +
+ "misugitokorozawamitourismilezajskfh-muenstermitoyoakemiuramiyazu" +
+ "recontainerdpolicemiyotamanomjondalenmlbfanmontrealestatefarmequ" +
+ "ipmentrentinoaadigemonza-brianzapposigdalmonza-e-della-brianzapt" +
+ "okuyamatsumaebashikshacknetrentinoalto-adigemonzabrianzaramonzae" +
+ "brianzamonzaedellabrianzamoonscaleforcemordoviamoriyamatsumotofu" +
+ "kemoriyoshiminamiashigaramormonstermoroyamatsunomortgagemoscowin" +
+ "barclaycards3-external-1moseushistorymosjoenmoskenesilkhakassiam" +
+ "ossimple-urlmosvikharkivanylvenneslaskerrylogisticshizuokamitsue" +
+ "moteginowaniigatakamatsukawamoviemovimientokyotangovtrentinoalto" +
+ "adigemozilla-iotrentinos-tirolmtranbymuginozawaonsenmuikaminoyam" +
+ "axunispacemukoebenhavnmulhouseoullensvanguardmultibaasirdalmunak" +
+ "atanemuncienciamuosattemupimientakinouemurmanskharkovaomurotorcr" +
+ "aftrentinostirolmusashinoharamuseetrentinosud-tirolmuseumverenig" +
+ "ingmusicarbonia-iglesias-carboniaiglesiascarboniamutsuzawamy-vig" +
+ "orgemy-wanggouvichurchaseljedugit-pagespeedmobilizeroticagliarik" +
+ "uzentakataipeidsvolluccaravantaarparochernigovernmentoyosatoyoka" +
+ "wamyactivedirectorymyasustor-elvdalmycdmycloudnslupskhersonmydat" +
+ "tolocalhistorymyddnskingmydissentrentinosudtirolmydobisshikis-an" +
+ "-artistgstagemydroboehringerikemydslzmyeffectrentinosued-tirolmy" +
+ "fastblogermyfirewallonieruchomoscienceandindustrynmyforuminamiya" +
+ "mashirokawanabelaudibleasingmyfritzmyftpaccessmolarvikhmelnitski" +
+ "yamarumorimachidamyhome-servermyjinomykolaivarggatrentinosuedtir" +
+ "olmymailermymediapcircustomer-ocimdbananarepublic66myokohamamats" +
+ "udamypepinbarclays3-fips-us-gov-west-1mypetsmushcdn77-sslingmyph" +
+ "otoshibalatinoipirangalsaceomypicturesnoasakakinokiamypsxn--3ds4" +
+ "43gmysecuritycamerakermyshopblocksokndalmyshopifyresdalmythic-be" +
+ "astsolarssonmytis-a-bookkeeperspectakashimarcheapigeelvinckhmeln" +
+ "ytskyivaporcloudmytuleaprendemasakievennodesabaerobaticketsologn" +
+ "emyvncistrondheimmobilienissandiegomywireitrentinsud-tirolplatte" +
+ "rpioneerplazaplcube-serverplumbingoplurinacionalpodhalepodlasiel" +
+ "laktyubinskiptveterinairealmpmnpodzonepohlpoivronpokerpokrovsknx" +
+ "-serversicherungpoliticarrdpolitiendapolkowicepoltavalle-d-aosta" +
+ "ticsomnarvikomaganepomorzeszowindmillponpesaro-urbino-pesarourbi" +
+ "nopesaromasvuotnaroyponypordenonepornporsangerporsangugeporsgrun" +
+ "nanyokoshibahikariwanumatakkofuefukihabororosoopoznanpraxis-a-br" +
+ "uinsfanprdpresidioprgmrprimetelemarkomakiyosatokaizukamikoaniiha" +
+ "matamakawajimarnardalprincipeprivatizehealthinsuranceprofesional" +
+ "progressivestnesopotrentinsudtirolpromombetsurfaststacksavannahg" +
+ "apropertyprotectionprotonetrentinsued-tirolprudentialpruszkowind" +
+ "owskrakowinnersor-odalprvcyberlevagangaviikanonjis-an-engineerin" +
+ "gprzeworskogpulawypupippugliapvhagebostadpvtrentinsuedtirolpwcit" +
+ "adeliverydyndns-iparsanfranciscofreakunemurorangecloudplatform0p" +
+ "ythonanywherepaircraftingvollolipopittsburghofficialpzqldqotoyoh" +
+ "ashimotoolsor-varangerqponiatowadaqslgbtrentoyonakagyokutoyakolo" +
+ "brzegersundqualifioappiwatequickconnectrevisohughesorfoldquicksy" +
+ "tesorocabalestrandabergamo-siemenscaledogawarabikomaezakirunombr" +
+ "esciaquipelementsorreisahayakawakamiichikawamisatottoris-an-ente" +
+ "rtainerqvcitichitosetoeigersundyndns-blogdnsampaleomutashinaindu" +
+ "striesteamfamberkeleyswidnikkokonoeswiebodzin-butterswiftcoversw" +
+ "inoujscienceandhistoryswissmarterthanyousynology-dsowatuvalleaos" +
+ "taverntuxfamilytwmailvevelstadvibo-valentiavibovalentiavideovill" +
+ "asphinxn--3e0b707evinnicasacamdvrcampinagrandebuilderschmidtre-g" +
+ "auldalvinnytsiavipsinaappixolinovirginiavirtual-userveexchangevi" +
+ "rtualcloudvirtualservervirtualuserveftpizzavirtueeldomein-vigorl" +
+ "icevirtuelvisakegawaviterboknowsitallvivolkenkundenvixn--3hcrj9c" +
+ "ivilizationisshingucciprianidyndns-mailukowestus2vlaanderenvladi" +
+ "kavkazimierz-dolnyvladimirvlogintoyonezawavminiservervologdansko" +
+ "mmunevolvolkswagentspjelkavikomatsushimarylandvolyngdalvoorloper" +
+ "auniterois-foundationvossevangenvotevotingvotoyonowithyoutubersp" +
+ "acekitagatargitlaborwiwatsukiyonosegawawixsitewloclawekomorotsuk" +
+ "agawawmcloudwmflabsrhtritonwnextdirectromsojamisonwoodsideloitte" +
+ "mpurlworldworse-thandawowiospydebergwpdevcloudwpenginepoweredwph" +
+ "ostedmailwpmucdnpklabudhabikinokawabarthaebaruericssongdalenvikn" +
+ "akatsugawawpmudevcdnaccessokamogawawritesthisblogwroclawitdkomon" +
+ "otogawawtcircleverappspotagerwtfastvps-serveronakasatsunairguard" +
+ "iannakadomarinedre-eikerwuozuwzmiuwajimaxn--45brj9civilwarmiasak" +
+ "uchinotsuchiurakawatchesangoxn--45q11clanbibaidarmeniaxn--4gbrim" +
+ "iningxn--4it168dxn--4it797kongsbergxn--4pvxs4allxn--54b7fta0ccld" +
+ "mailuroyxn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49clic20001wwwfa" +
+ "rmsteadyndns-office-on-the-weberxn--5rtq34kongsvingerxn--5su34j9" +
+ "36bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn-" +
+ "-7t0a264clicketcloudcontrolappartintuitoyotapartsanjotoyotomiyaz" +
+ "akinuyamashinatsukigatakasakitashiobaraxn--80aaa0cvacationsrlxn-" +
+ "-80adxhksrvaroyxn--80ao21axn--80aqecdr1axn--80asehdbarefootballo" +
+ "oningjesdalimitediscourses3-sa-east-1xn--80aswgxn--80augustowith" +
+ "googleapiszxn--8ltr62koninjambylxn--8pvr4uxn--8y0a063axn--90a1af" +
+ "lakstadaokagakicks-assnasaarlandxn--90a3academiamicable-modemone" +
+ "yxn--90aeroportalaheadjudaicadaquestorebaselectroandinosaurepbod" +
+ "ynamic-dnsoruminanoxn--90aishobarakawagoexn--90amcdirxn--90azhyt" +
+ "omyravendbargainstantcloudfrontdoorlandiscoveryggeehimejiiyamano" +
+ "uchikuhokuryugasakitanakagusukumodumcpreservationayorovnoceanogr" +
+ "aphiquemrhcloudishakotanfshostrodawaraustraliamuneues3-ap-southe" +
+ "ast-1xn--9dbhblg6dietrusteexn--9dbq2axn--9et52uxn--9krt00axn--an" +
+ "dy-iraxn--aroport-byaotsurreyxn--asky-iraxn--aurskog-hland-jnbar" +
+ "reauctioncilla-speziaustrheimatunduhrennesoyokoteastasiamusement" +
+ "dllpages3-ap-southeast-2xn--avery-yuasakuhokksundxn--b-5gaxn--b4" +
+ "w605ferdxn--balsan-sdtirol-nsbstorfjordxn--bck1b9a5dre4clickrisi" +
+ "nglesannaniyodogawaxn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-" +
+ "jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuurax" +
+ "n--bievt-0qa2xn--bjarky-fyasakaiminatoyookanazawaxn--bjddar-ptar" +
+ "umizusawaxn--blt-elabourxn--bmlo-graingerxn--bod-2naturalhistory" +
+ "museumcenterxn--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-fire" +
+ "wall-gatewayxn--brnnysund-m8accident-investigation-aptibleadpage" +
+ "square7xn--brum-voagatrvestre-slidreportromsakatamayufuelverumin" +
+ "comcastresinstagingxn--btsfjord-9zaxn--bulsan-sdtirol-nsbarrel-o" +
+ "f-knowledgeappleborkaracoldwarszawauthordalandds3-ca-central-1xn" +
+ "--c1avgxn--c2br7gxn--c3s14minnesotaketakazakis-an-actorxn--cck2b" +
+ "3barrell-of-knowledgecomputerhistoryofscience-fictionfabricafjs3" +
+ "-us-east-2xn--cckwcxetdxn--cesena-forl-mcbremangerxn--cesenaforl" +
+ "-i8axn--cg4bkis-gonexn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicae" +
+ "s-v6a2oxn--correios-e-telecomunicaes-ghc29axn--czr694barsycenter" +
+ "prisesakikonaikawachinaganoharamcoachampionshiphoptobamagazineat" +
+ "-urlimolisemineu-1xn--czrs0try-snowplowiczest-le-patronxn--czru2" +
+ "dxn--czrw28barsyonlineustargardiskussionsbereichattanooganordest" +
+ "e-idcasadelamonedapliernewspaperxn--d1acj3basicservercelliguriau" +
+ "tomotivelandeportenrittogitsulikes-piedmonticellocalzoneastcoast" +
+ "aldefenceastus2xn--d1alfaromeoxn--d1atrycloudflareplantationxn--" +
+ "d5qv7z876clinichofunatoriginstitutemasekd1xn--davvenjrga-y4axn--" +
+ "djrs72d6uyxn--djty4konskowolayangroupiemontexn--dnna-grajewolter" +
+ "skluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cliniquenoharavennagasak" +
+ "indlecznagasukexn--eckvdtc9dxn--efvn9storjcloud-ver-jpchungnamda" +
+ "lseidfjordyndns-homednsandvikcoromantovalle-daostavangerxn--efvy" +
+ "88haibarakitahatakanezawaxn--ehqz56nxn--elqq16hair-surveillancex" +
+ "n--eveni-0qa01gaxn--f6qx53axn--fct429konsulatrobeeldengeluidvare" +
+ "serve-onlinexn--fhbeiarnxn--finny-yuaxn--fiq228c5hstpetersburgxn" +
+ "--fiq64basilicataniautoscanadaeguambulancentralus-2xn--fiqs8stre" +
+ "amscompute-1xn--fiqz9studioxn--fjord-lraxn--fjq720axn--fl-ziaxn-" +
+ "-flor-jraxn--flw351exn--forl-cesena-fcbsstudynamisches-dnsoundca" +
+ "stronomy-routerxn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandrapi" +
+ "dstuff-4-salexn--frna-woaraisaijosoyrovigotsukisofukushimangyshl" +
+ "akasamatsudopaasnesoddenmarkhangelskjakdnepropetrovskiervaapstei" +
+ "ermarkonyvelohmusashimurayamarylhurstjordalshalsenxn--frya-hraxn" +
+ "--fzc2c9e2clintonoshoesannohelplfinancialutskarumaifarsundyndns-" +
+ "picsanokasaokamikitayamatsurinvestmentsantabarbaraxn--fzys8d69uv" +
+ "gmailxn--g2xx48clothingdustdataitogakushimotoganewyorkshirebungo" +
+ "onordkappartyxn--gckr3f0fauskedsmokorsetagayaseralingenoamishira" +
+ "satogliattis-a-conservativegasaveincloudynufcfanxn--gecrj9cn-nor" +
+ "thwest-1xn--ggaviika-8ya47hakatanorth-kazakhstanxn--gildeskl-g0a" +
+ "xn--givuotna-8yasugitpagefrontapplantsolundbeckmpspbar2xn--gjvik" +
+ "-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-into-animeinforumzxn" +
+ "--gmqw5axn--gnstigbestellen-zvbrplsbxn--3oq18vl8pn36axn--gnstigl" +
+ "iefern-wobihirosakikamijimatsushigexn--h-2failxn--h1aeghakodatex" +
+ "n--h1ahnxn--h1alizxn--h2breg3evenestufftoread-booksnesouthcaroli" +
+ "natalxn--h2brj9c8cngrondarxn--h3cuzk1discountysnestuttgartrogsta" +
+ "dxn--hbmer-xqaxn--hcesuolo-7ya35basketballfinanzgorzeleccogjovik" +
+ "aragandaveroykenflfanpachigasakids3-eu-central-1xn--hery-iraxn--" +
+ "hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-prevention" +
+ "-k3susakis-bytomaritimekeepingxn--hnefoss-q1axn--hobl-iraxn--hol" +
+ "tlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54ax" +
+ "n--i1b6b1a6a2exn--imr513nxn--indery-fyasuokannamihokkaidovre-eik" +
+ "erxn--io0a7is-into-carshiraokamitondabayashiogamagoriziaxn--j1ad" +
+ "platformshangrilaquilanxessomaxn--j1aefbsbxn--12co0c3b4evalled-a" +
+ "ostaobaomoriguchiharag-cloud-charitychyattorneyagawakayamagnethn" +
+ "ologyxn--j1ael8batochiokinoshimaintenanceu-2xn--j1amhakonexn--j6" +
+ "w193gxn--jlq480n2rgxn--jlq61u9w7batsfjordisrechtranakaiwamizawav" +
+ "ocatanzarowbq-aukraanghkembuchikumagayagawakepnogatagajoboji234l" +
+ "ima-cityeatselinogradult3l3p0rtatamotorsitestingdyniabruzzoologi" +
+ "calabamagasakishimabaraogakibichuobiraetnaamesjevuemielnoboribet" +
+ "sucks3-ap-northeast-1xn--jlster-byatominamidaitomanchesterxn--jr" +
+ "peland-54axn--jvr189mintereisenxn--k7yn95exn--karmy-yuaxn--kbrq7" +
+ "oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dx" +
+ "n--kltx9axn--klty5xn--3pxu8komvuxn--32vp30hagakhanamigawaxn--kol" +
+ "uokta-7ya57hakubahcavuotnagaivuotnagaokakyotambabyenglandxn--kpr" +
+ "w13dxn--kpry57dxn--kput3is-into-cartoonshiratakahagithubusercont" +
+ "entrentino-altoadigexn--krager-gyatsukanoyaltakasugais-into-game" +
+ "ssinazawaxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krj" +
+ "ohka-hwab49jdevcloudfunctionshishikuis-a-patsfanxn--ksnes-uuaxn-" +
+ "-kvfjord-nxaxn--kvitsy-fyatsushiroxn--kvnangen-k0axn--l-1fairwin" +
+ "dsusonoxn--l1accentureklamborghinikolaeventsuzakanagawaxn--lahea" +
+ "dju-7yawaraxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagavii" +
+ "ka-52bauhausposts-and-telecommunicationsncfditchyouripalmsprings" +
+ "akerxn--lesund-huaxn--lgbbat1ad8jdfastlylbanzaicloudappspaceuser" +
+ "contentatsunobninskanzakiwielunnereviewsaitamatsukuribmdevelopme" +
+ "ntattoolforgerockartuzyolasitebinordre-landgcanonoichinomiyakebi" +
+ "zenakanotoddenavuotnarashinobserverevistarnbergjerstadotsuruokak" +
+ "amigaharaustinnavigationavoizumizakibigawamswatch-and-clockeretr" +
+ "osnubaltimore-og-romsdalpha-myqnapcloud66xn--lgrd-poacctrysiljan" +
+ "xn--lhppi-xqaxn--linds-pramericanartunespeedpartnersortlandxn--l" +
+ "ns-qlavagiskexn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-li" +
+ "acnpyatigorskodjeepsondriodejaneirodoyxn--lten-granexn--lury-ira" +
+ "xn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddesuzukananiikapp" +
+ "uboliviajessheimpertrixcdn77-secureggiocalabriaxn--mgb9awbfbx-os" +
+ "trowwlkpmgujoinvilleirvikashiwazakiyokawaraxn--mgba3a3ejtunkommu" +
+ "nalforbundxn--mgba3a4f16axn--mgba3a4fra1-deltaiwanairforcechirea" +
+ "dthedocscbgxn--mgba7c0bbn0axn--mgbaakc7dvfbxosaves-the-whalessan" +
+ "dria-trani-barletta-andriatranibarlettaandriaxn--mgbaam7a8hakuis" +
+ "-a-hard-workershimokitayamayfirstockholmestrandxn--mgbab2bdxn--m" +
+ "gbah1a3hjkrdxn--mgbai9a5eva00bellunord-frontierxn--mgbai9azgqp6j" +
+ "ejuniperxn--mgbayh7gpalermomahachijolsterxn--mgbbh1a71exn--mgbc0" +
+ "a9azcgxn--mgbca7dzdoxn--mgbcpq6gpa1axn--mgberp4a5d4a87gxn--mgber" +
+ "p4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2fhskydivingxn--m" +
+ "gbqly7c0a67fbcnsantacruzsewhalingrongausdaluxuryxn--mgbqly7cvafr" +
+ "-1xn--mgbt3dhdxn--mgbtf8flapymnturystykaneyamazoexn--mgbtx2benev" +
+ "entodayombolzano-altoadigeometre-experts-comptables3-us-gov-west" +
+ "-1xn--mgbx4cd0abbvieeexn--mix082fedorainfraclouderaxn--mix891fed" +
+ "orapeoplegallodingenxn--mjndalen-64axn--mk0axin-dsldxn--mk1bu44c" +
+ "ntoyotsukaidoxn--mkru45is-leetrentino-s-tirolxn--mlatvuopmi-s4ax" +
+ "n--mli-tlavangenxn--mlselv-iuaxn--moreke-juaxn--mori-qsakuragawa" +
+ "xn--mosjen-eyawatahamaxn--mot-tlazioxn--mre-og-romsdal-qqbuseran" +
+ "ishiaritakurashikis-lostre-toteneis-a-nursembokukitauraxn--msy-u" +
+ "la0hakusanagochijiwadefinimamateramobaraxn--mtta-vrjjat-k7afedor" +
+ "aprojectrani-andria-barletta-trani-andriaxn--muost-0qaxn--mxtq1m" +
+ "isakis-an-actresshiraois-a-musicianxn--ngbc5azdxn--ngbe9e0axn--n" +
+ "gbrxn--41axn--nit225kooris-a-personaltrainerxn--nmesjevuemie-tcb" +
+ "alsan-sudtirollagdenesnaaseinet-freaksuzukis-certifiedunetlifyis" +
+ "-a-nascarfanxn--nnx388axn--nodessakurais-not-certifiedxn--nqv7fs" +
+ "00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeserveg" +
+ "ame-serverxn--nvuotna-hwaxn--nyqy26axn--o1achernihivgubsvalbardu" +
+ "nloppacificivilaviationissayokkaichiropractichocolatelevisionthe" +
+ "wifiatmparmatsuzakinfinitintelligencexn--o3cw4haldenxn--o3cyx2ax" +
+ "n--od0algxn--od0aq3bentleyomitanocelotenkawavoues3-eu-west-1xn--" +
+ "ogbpf8flatangerxn--oppegrd-ixaxn--ostery-fyaxn--osyro-wuaxn--otu" +
+ "796dxn--p1acfeiraquarelleaseeklogesavonarutolgaxn--p1ais-savedxn" +
+ "--pgbs0dhlxn--porsgu-sta26fermochizukirkenesaxoxn--pssu33lxn--ps" +
+ "sy2uxn--q7ce6axn--q9jyb4collectionxn--qcka1pmckinseyxn--qqqt11mi" +
+ "sasaguris-an-anarchistoricalsocietyxn--qxa6axn--qxamsterdamnserv" +
+ "erbaniaxn--rady-iraxn--rdal-poaxn--rde-ulaxn--rdy-0nabaris-slick" +
+ "autokeinoticeablevangerxn--rennesy-v1axn--rhkkervju-01aferraraxn" +
+ "--rholt-mragowoltlab-democraciaxn--rhqv96gxn--rht27zxn--rht3dxn-" +
+ "-rht61exn--risa-5naturalsciencesnaturellesvcivilisationissedaluc" +
+ "ernexn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rn" +
+ "y31halsaintlouis-a-anarchistoireggio-emilia-romagnakayamannorthf" +
+ "lankatsushikabeebyteapplinzis-a-hunterxn--rovu88beppublishproxyo" +
+ "nagoyaxarnetflixilovecollegefantasyleaguernseyokozeatonsbergivin" +
+ "gjemnes3-eu-west-2xn--rros-granvindafjordxn--rskog-uuaxn--rst-0n" +
+ "aturbruksgymnxn--rsta-framercanvasveioxn--rvc1e0am3exn--ryken-vu" +
+ "axn--ryrvik-byaxn--s-1faithammarfeastafricapitalonewportrentino-" +
+ "a-adigexn--s9brj9colognexus-3xn--sandnessjen-ogbeskidyn-ip24xn--" +
+ "sandy-yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sgne-graphox" +
+ "n--42c2d9axn--skierv-utazasvelvikomforbarcelonagawakuyachimataij" +
+ "iitatebayashiibahccavuotnagaragusarts3-eu-west-3utilities-1xn--s" +
+ "kjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5natu" +
+ "rhistorischesvizzeraxn--slt-elabcn-north-1xn--smla-hraxn--smna-g" +
+ "ratangentlentapisa-geekopervikazunoticiashitaramaxn--snase-nraxn" +
+ "--sndre-land-0cbestbuyshouses3-us-west-1xn--snes-poaxn--snsa-roa" +
+ "xn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-g" +
+ "gbetainaboxfusejnyanagawalmartaxihuanhktcmembers3-us-west-2xn--s" +
+ "rfold-byaxn--srreisa-q1axn--srum-gratis-a-bulls-fanxn--stfold-9x" +
+ "axn--stjrdal-s1axn--stjrdalshalsen-sqbhzcasertairaholtalenhlfanh" +
+ "s3-website-ap-northeast-1xn--stre-toten-zcbieidskoguchikuzenviro" +
+ "nmentalconservationionjukudoyamaizuruhrxn--t60b56axn--tckwebthin" +
+ "gsvn-reposouthwest1-uslivinghistoryxn--tiq49xqyjelasticbeanstalk" +
+ "azoologyxn--tjme-hraxn--tn0agrinetbankoryokamikawanehonbetsuruta" +
+ "haraxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol-" +
+ "rzbielawaltervistainaioirasebastopologyeongnamegawafaicloudinebr" +
+ "askaunicommbankarasjohkameyamatotakadazurewebsiteshikagamiishibu" +
+ "kawakkanaibetsubamericanfamilydsmynasushiobaracingjerdrumcpebets" +
+ "uikiraurskog-holandingivestbytemark12xn--trentin-sdtirol-7vbiell" +
+ "ahppiacenzachpomorskienikonanporocpanamatsuuraxn--trentino-sd-ti" +
+ "rol-c3bieszczadygeyachiyodaejeonbukcoalwaysdatabaseballangenkain" +
+ "anaejrietisalatinabenonicasinorddalivornowtv-infolldalombardiade" +
+ "mbroideryonagunicloudivtasvuodnakamagayahooguyoriikarasjokarasuy" +
+ "amarriottcp4xn--trentino-sdtirol-szbievat-band-campaniaxn--trent" +
+ "inosd-tirol-rzbifukagawashingtondclk3xn--trentinosdtirol-7vbigva" +
+ "lledaostargetmyipanasonicateringebuildingladedyn-berlincolninohe" +
+ "kinannestadivttasvuotnakamuratajimidsundiyoshiokanumazuryukin-th" +
+ "e-bandain-vpncatholicaxiaskimitsubatamibudejjuedischesapeakebaye" +
+ "rnuorochesterxn--trentinsd-tirol-6vbihorologyukuhashimoichinosek" +
+ "igaharaxn--trentinsdtirol-nsbikedaemonmoutheworkpccweddinglassas" +
+ "sinationalheritagets-itgoryurihonjournalistjohninomiyakonojorpel" +
+ "andrangedalombardynalias3-website-ap-southeast-1xn--trgstad-r1ax" +
+ "n--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvestre-totennishia" +
+ "wakuraxn--uc0ay4axn--uist22hamurakamigoris-a-knightpointtohnosho" +
+ "ooshikamaishimodatexn--uisz3gxn--unjrga-rtashkentuscanyxn--unup4" +
+ "yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbtushuissier-justicexn" +
+ "--valle-d-aoste-ehbodoes-itvedestrandxn--valleaoste-e7axn--valle" +
+ "daoste-ebbvadsobetsuitaikikuchikuseihicampobassociatest-iserveco" +
+ "unterstrikeymachinewhampshirealtydalvdalaskanittedallasalleangav" +
+ "iikaasdaburxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctbit" +
+ "swidnicartoonartdecologiaxn--vermgensberatung-pwblogoiplatter-ap" +
+ "pinkhplaystation-cloudyclusterxn--vestvgy-ixa6oxn--vg-yiabkhazia" +
+ "xn--vgan-qoaxn--vgsy-qoa0jelenia-goraxn--vgu402colonialwilliamsb" +
+ "urgrossetouchihayaakasakawaharaxn--vhquvestvagoyxn--vler-qoaxn--" +
+ "vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bilbaokinawash" +
+ "irosatobishimagentositechnologyusuharaxn--w4r85el8fhu5dnraxn--w4" +
+ "rs40lxn--wcvs22dxn--wgbh1coloradoplateaudiopsysantafedjeffersonx" +
+ "n--wgbl6axn--xhq521billustrationredumbrellair-traffic-controlley" +
+ "usuisservehalflifeinsuranceu-3xn--xkc2al3hye2axn--xkc2dl3a5ee0ha" +
+ "ndsonyxn--y9a3aquariumisawaxn--yer-znatuurwetenschappenginexn--y" +
+ "fro4i67oxn--ygarden-p1axn--ygbi2ammxn--45br5cylxn--ystre-slidre-" +
+ "ujbioddaxn--zbx025dxn--zf0ao64axn--zf0avxlxn--zfr164biparachutin" +
+ "gleezeu-4xnbayxz"
+
+// nodes is the list of nodes. Each node is represented as a uint32, which
+// encodes the node's children, wildcard bit and node type (as an index into
+// the children array), ICANN bit and text.
+//
+// If the table was generated with the -comments flag, there is a //-comment
+// after each node's data. In it is the nodes-array indexes of the children,
+// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The
+// nodeType is printed as + for normal, ! for exception, and o for parent-only
+// nodes that have children but don't match a domain label in their own right.
+// An I denotes an ICANN domain.
+//
+// The layout within the uint32, from MSB to LSB, is:
+// [ 0 bits] unused
+// [10 bits] children index
+// [ 1 bits] ICANN bit
+// [15 bits] text index
+// [ 6 bits] text length
+var nodes = [...]uint32{
+ 0x329b43,
+ 0x2f0784,
+ 0x31f886,
+ 0x21a5c3,
+ 0x21a5c6,
+ 0x399386,
+ 0x3bf783,
+ 0x277104,
+ 0x2029c7,
+ 0x31f4c8,
+ 0x1a000c2,
+ 0x1f3cd07,
+ 0x37f349,
+ 0x2ddb4a,
+ 0x2ddb4b,
+ 0x23d883,
+ 0x23f745,
+ 0x2202ac2,
+ 0x28c4c4,
+ 0x2c9743,
+ 0x3734c5,
+ 0x2602c02,
+ 0x354743,
+ 0x2a85584,
+ 0x374945,
+ 0x2e0f242,
+ 0x229d8e,
+ 0x260543,
+ 0x3b9946,
+ 0x3205b42,
+ 0x378ac7,
+ 0x242446,
+ 0x36041c2,
+ 0x293b03,
+ 0x232946,
+ 0x38ec88,
+ 0x298246,
+ 0x359944,
+ 0x3a00ac2,
+ 0x34b549,
+ 0x22d607,
+ 0x2094c6,
+ 0x3679c9,
+ 0x224748,
+ 0x210204,
+ 0x2f9546,
+ 0x207b46,
+ 0x3e03742,
+ 0x239b06,
+ 0x216b8f,
+ 0x3cd40e,
+ 0x22ff04,
+ 0x311205,
+ 0x32dbc5,
+ 0x3aec89,
+ 0x2494c9,
+ 0x233147,
+ 0x221b46,
+ 0x21da43,
+ 0x420b602,
+ 0x233843,
+ 0x2b200a,
+ 0x4602043,
+ 0x3402c5,
+ 0x30c842,
+ 0x3ab409,
+ 0x4e00ec2,
+ 0x207e84,
+ 0x346706,
+ 0x2c54c5,
+ 0x376bc4,
+ 0x5646644,
+ 0x2030c3,
+ 0x23a844,
+ 0x5a00b82,
+ 0x3e3104,
+ 0x5f35d04,
+ 0x3e1b0a,
+ 0x6200882,
+ 0x2b82c7,
+ 0x36f9c8,
+ 0x7a01e02,
+ 0x335087,
+ 0x2f5404,
+ 0x2f5407,
+ 0x3ea985,
+ 0x381247,
+ 0x340886,
+ 0x349f84,
+ 0x3544c5,
+ 0x26d147,
+ 0x9205202,
+ 0x239c83,
+ 0x961a7c2,
+ 0x3b6143,
+ 0x9a04142,
+ 0x26e645,
+ 0x9e00202,
+ 0x379b84,
+ 0x239305,
+ 0x22fe47,
+ 0x2f78ce,
+ 0x2c4ac4,
+ 0x219684,
+ 0x207e43,
+ 0x3bc989,
+ 0x2e700b,
+ 0x2f8288,
+ 0x32acc8,
+ 0x330248,
+ 0x3d0bc8,
+ 0xa36780a,
+ 0x381147,
+ 0x3d7f06,
+ 0xa61a602,
+ 0x271d03,
+ 0x3dfa43,
+ 0x3e1204,
+ 0x271d43,
+ 0x396303,
+ 0x17385c2,
+ 0xaa02b82,
+ 0x28ffc5,
+ 0x266446,
+ 0x2a59c4,
+ 0x3a94c7,
+ 0x24f486,
+ 0x2d64c4,
+ 0x3c13c7,
+ 0x2194c3,
+ 0xb6e29c2,
+ 0xbb27082,
+ 0xbe27bc2,
+ 0x227bc6,
+ 0xc200282,
+ 0x269185,
+ 0x339b03,
+ 0x3d9704,
+ 0x2fe784,
+ 0x2fe785,
+ 0x3ef083,
+ 0xc658843,
+ 0xca06f02,
+ 0x20d3c5,
+ 0x20d3cb,
+ 0x20e18b,
+ 0x2045c4,
+ 0x20d7c9,
+ 0x20fcc4,
+ 0xce10602,
+ 0x210e43,
+ 0x2113c3,
+ 0xd20a182,
+ 0x21e78a,
+ 0xd602a02,
+ 0x28c745,
+ 0x2f348a,
+ 0x2510c4,
+ 0x212a43,
+ 0x213104,
+ 0x2151c3,
+ 0x2151c4,
+ 0x2151c7,
+ 0x217005,
+ 0x217c06,
+ 0x2183c6,
+ 0x21a643,
+ 0x21ffc8,
+ 0x213743,
+ 0xda037c2,
+ 0x230d08,
+ 0x2984cb,
+ 0x2284c8,
+ 0x229146,
+ 0x22a187,
+ 0x22d208,
+ 0xf205f42,
+ 0xf6272c2,
+ 0x27c848,
+ 0x2370c7,
+ 0x314b85,
+ 0xfb14b88,
+ 0xfe23848,
+ 0x2551c3,
+ 0x2319c4,
+ 0x399402,
+ 0x10232002,
+ 0x106083c2,
+ 0x10e32382,
+ 0x232383,
+ 0x11203702,
+ 0x30e183,
+ 0x220ec4,
+ 0x207243,
+ 0x2101c4,
+ 0x24f18b,
+ 0x203703,
+ 0x2fa346,
+ 0x28cfc4,
+ 0x2d06ce,
+ 0x384b05,
+ 0x277848,
+ 0x3b9a47,
+ 0x3b9a4a,
+ 0x223203,
+ 0x2f0587,
+ 0x2e71c5,
+ 0x238b84,
+ 0x25fc86,
+ 0x25fc87,
+ 0x36d4c4,
+ 0x117145c4,
+ 0x3c5a04,
+ 0x24ed84,
+ 0x3d1606,
+ 0x224dc3,
+ 0x3d5608,
+ 0x3d7348,
+ 0x29e303,
+ 0x21e743,
+ 0x343a04,
+ 0x356943,
+ 0x11e035c2,
+ 0x122b79c2,
+ 0x202546,
+ 0x2f9643,
+ 0x3b2fc4,
+ 0x12648fc2,
+ 0x29ed03,
+ 0x381a43,
+ 0x21ce82,
+ 0x12a02102,
+ 0x2dd246,
+ 0x21e247,
+ 0x36f747,
+ 0x2ef505,
+ 0x348b84,
+ 0x2fbb05,
+ 0x2d1bc7,
+ 0x2ba349,
+ 0x2bbdc6,
+ 0x2ef406,
+ 0x13a12fc2,
+ 0x318508,
+ 0x321246,
+ 0x30a6c5,
+ 0x309f47,
+ 0x310244,
+ 0x310245,
+ 0x373104,
+ 0x373108,
+ 0x13e0d482,
+ 0x14200482,
+ 0x254206,
+ 0x200488,
+ 0x328205,
+ 0x34c246,
+ 0x34ea08,
+ 0x35d3c8,
+ 0x14602cc5,
+ 0x17243244,
+ 0x285687,
+ 0x1760f742,
+ 0x17ab90c2,
+ 0x18e05842,
+ 0x346805,
+ 0x19a96945,
+ 0x277e86,
+ 0x3b6547,
+ 0x3ba447,
+ 0x19e29f43,
+ 0x33f007,
+ 0x3cc1c8,
+ 0x27635149,
+ 0x229f47,
+ 0x235887,
+ 0x342548,
+ 0x236086,
+ 0x238686,
+ 0x23b74c,
+ 0x23cd0a,
+ 0x23d8c7,
+ 0x23f60b,
+ 0x240307,
+ 0x24030e,
+ 0x27a40ec4,
+ 0x241284,
+ 0x244887,
+ 0x253c47,
+ 0x248706,
+ 0x248707,
+ 0x32b4c7,
+ 0x261c03,
+ 0x27e0f1c2,
+ 0x249ec6,
+ 0x249eca,
+ 0x24ab0b,
+ 0x24c887,
+ 0x24d305,
+ 0x24d783,
+ 0x24df46,
+ 0x24df47,
+ 0x38f183,
+ 0x28200102,
+ 0x24eaca,
+ 0x28729c42,
+ 0x28ba8ac2,
+ 0x28e48e02,
+ 0x29238fc2,
+ 0x251805,
+ 0x252204,
+ 0x29e01bc2,
+ 0x3e3185,
+ 0x24b103,
+ 0x2a4585,
+ 0x202444,
+ 0x216384,
+ 0x2dfb06,
+ 0x2608c6,
+ 0x20d5c3,
+ 0x3d4804,
+ 0x340b43,
+ 0x2ae00d02,
+ 0x22a504,
+ 0x22a506,
+ 0x257a85,
+ 0x2b5a46,
+ 0x30a048,
+ 0x2138c4,
+ 0x31de08,
+ 0x38ea45,
+ 0x281d88,
+ 0x2d9f06,
+ 0x21ba87,
+ 0x27f784,
+ 0x2c27f786,
+ 0x2c605483,
+ 0x3ac1c3,
+ 0x2cc488,
+ 0x333444,
+ 0x2ca131c7,
+ 0x24c106,
+ 0x2f1289,
+ 0x366948,
+ 0x330988,
+ 0x332384,
+ 0x3d69c3,
+ 0x24b1c2,
+ 0x2d25d9c2,
+ 0x2d61c982,
+ 0x31f383,
+ 0x2da02b02,
+ 0x38f104,
+ 0x288c46,
+ 0x23eb43,
+ 0x2cd707,
+ 0x385d43,
+ 0x2c4b88,
+ 0x229545,
+ 0x26c9c3,
+ 0x239285,
+ 0x2393c4,
+ 0x3a6f86,
+ 0x22bb06,
+ 0x22fd86,
+ 0x25db84,
+ 0x2406c3,
+ 0x2de46882,
+ 0x2e23fd85,
+ 0x200843,
+ 0x2ea03402,
+ 0x220203,
+ 0x205a45,
+ 0x2ee24d03,
+ 0x2f63e6c9,
+ 0x2fa00942,
+ 0x30204f42,
+ 0x29bc85,
+ 0x21ecc6,
+ 0x29d146,
+ 0x308d88,
+ 0x308d8b,
+ 0x345ecb,
+ 0x38a445,
+ 0x2e2f49,
+ 0x1602642,
+ 0x31fb88,
+ 0x20dac4,
+ 0x30a03642,
+ 0x33dfc3,
+ 0x31253e06,
+ 0x3160ea82,
+ 0x3d11c8,
+ 0x31a06cc2,
+ 0x26f54a,
+ 0x322771c3,
+ 0x32b7f986,
+ 0x315d88,
+ 0x398846,
+ 0x3957c7,
+ 0x216d87,
+ 0x2076ca,
+ 0x251144,
+ 0x364a84,
+ 0x37ee49,
+ 0x32fb9585,
+ 0x229dc6,
+ 0x22e783,
+ 0x282a04,
+ 0x3320a6c4,
+ 0x20a6c7,
+ 0x33656c07,
+ 0x29ed44,
+ 0x2400c5,
+ 0x277f48,
+ 0x252d07,
+ 0x252f87,
+ 0x33a18b02,
+ 0x3a8084,
+ 0x2a51c8,
+ 0x2547c4,
+ 0x259344,
+ 0x259745,
+ 0x259887,
+ 0x34689bc9,
+ 0x25a444,
+ 0x25b309,
+ 0x25b9c8,
+ 0x25c604,
+ 0x25c607,
+ 0x25d7c3,
+ 0x25e587,
+ 0x34a00c02,
+ 0x16c7402,
+ 0x25f746,
+ 0x2bf047,
+ 0x2600c4,
+ 0x261687,
+ 0x263287,
+ 0x263883,
+ 0x34e62642,
+ 0x213802,
+ 0x2649c3,
+ 0x2649c4,
+ 0x2649cb,
+ 0x32adc8,
+ 0x213804,
+ 0x265e85,
+ 0x2676c7,
+ 0x2f4d05,
+ 0x31b2ca,
+ 0x26ac43,
+ 0x35202e42,
+ 0x215a44,
+ 0x271f49,
+ 0x275843,
+ 0x275907,
+ 0x330689,
+ 0x3929c8,
+ 0x20f283,
+ 0x28f107,
+ 0x27e1c3,
+ 0x295f04,
+ 0x2975c9,
+ 0x29a286,
+ 0x3a3f03,
+ 0x202a82,
+ 0x26dc83,
+ 0x2c7207,
+ 0x39a245,
+ 0x2ca6c6,
+ 0x29e6c4,
+ 0x37bf05,
+ 0x28fa83,
+ 0x21c186,
+ 0x218143,
+ 0x20d9c2,
+ 0x258804,
+ 0x356a5c02,
+ 0x35b10a03,
+ 0x35e038c2,
+ 0x2574c3,
+ 0x218844,
+ 0x242047,
+ 0x21f406,
+ 0x20a682,
+ 0x36204682,
+ 0x330bc4,
+ 0x36a15342,
+ 0x36e05d02,
+ 0x205d04,
+ 0x205d05,
+ 0x3ce545,
+ 0x3b6ec6,
+ 0x37208442,
+ 0x3d5a05,
+ 0x3d9e45,
+ 0x296883,
+ 0x239d46,
+ 0x212005,
+ 0x227b42,
+ 0x35d005,
+ 0x227b44,
+ 0x230783,
+ 0x2309c3,
+ 0x3760ccc2,
+ 0x26d347,
+ 0x267884,
+ 0x267889,
+ 0x282904,
+ 0x2967c3,
+ 0x2c3e48,
+ 0x37a967c4,
+ 0x2967c6,
+ 0x2b5543,
+ 0x266803,
+ 0x2e9c43,
+ 0x37f003c2,
+ 0x392ec2,
+ 0x38200642,
+ 0x33b848,
+ 0x213508,
+ 0x3c4846,
+ 0x2916c5,
+ 0x234b85,
+ 0x209fc7,
+ 0x3868a905,
+ 0x21e682,
+ 0x38aa71c2,
+ 0x38e00042,
+ 0x321ec8,
+ 0x318445,
+ 0x302d04,
+ 0x24da05,
+ 0x2562c7,
+ 0x295d04,
+ 0x262442,
+ 0x3922cf82,
+ 0x351b84,
+ 0x230607,
+ 0x29c207,
+ 0x381204,
+ 0x3e0443,
+ 0x29e244,
+ 0x29e248,
+ 0x396389c6,
+ 0x25fb0a,
+ 0x35b6c4,
+ 0x2a4c08,
+ 0x23ff44,
+ 0x22a286,
+ 0x2a7184,
+ 0x346b06,
+ 0x267b49,
+ 0x223d07,
+ 0x3a6c43,
+ 0x39a04d02,
+ 0x3c3943,
+ 0x210802,
+ 0x39e0a442,
+ 0x26e406,
+ 0x24bc88,
+ 0x2b6347,
+ 0x233549,
+ 0x2b6509,
+ 0x2b9a05,
+ 0x2bb609,
+ 0x2bc705,
+ 0x2bd545,
+ 0x2be748,
+ 0x3a207304,
+ 0x3a634307,
+ 0x235c43,
+ 0x2be947,
+ 0x235c46,
+ 0x2bf5c7,
+ 0x2b4445,
+ 0x2354c3,
+ 0x3aa3cac2,
+ 0x212c84,
+ 0x3ae05302,
+ 0x3b21d7c2,
+ 0x30db46,
+ 0x36f945,
+ 0x2c2507,
+ 0x383d03,
+ 0x238404,
+ 0x20f583,
+ 0x236e03,
+ 0x3b603842,
+ 0x3be075c2,
+ 0x399484,
+ 0x262603,
+ 0x308a45,
+ 0x3c209c42,
+ 0x3ca08102,
+ 0x39f646,
+ 0x2f7804,
+ 0x2fd3c4,
+ 0x2fd3ca,
+ 0x3d2005c2,
+ 0x203e83,
+ 0x310f0a,
+ 0x3a8488,
+ 0x3d658104,
+ 0x2005c3,
+ 0x249bc3,
+ 0x34c689,
+ 0x27ddc9,
+ 0x2cd806,
+ 0x3da5e043,
+ 0x2baf8d,
+ 0x328846,
+ 0x35c70b,
+ 0x3de0f002,
+ 0x2f9388,
+ 0x42a200c2,
+ 0x42e019c2,
+ 0x2c0c85,
+ 0x43203382,
+ 0x2b2507,
+ 0x2121c3,
+ 0x2121c8,
+ 0x43605fc2,
+ 0x39ec44,
+ 0x3e0643,
+ 0x24b206,
+ 0x2274c4,
+ 0x21e703,
+ 0x44a06702,
+ 0x38a3c4,
+ 0x2c6045,
+ 0x2c6e07,
+ 0x28d743,
+ 0x2c7dc3,
+ 0x161a742,
+ 0x2c8483,
+ 0x2c8803,
+ 0x44e00c42,
+ 0x276f44,
+ 0x2408c6,
+ 0x328cc3,
+ 0x2c8c83,
+ 0x45258e02,
+ 0x258e08,
+ 0x2c9a44,
+ 0x204ec6,
+ 0x393047,
+ 0x2a2046,
+ 0x2cc404,
+ 0x53604842,
+ 0x235b0b,
+ 0x2e894e,
+ 0x21fa8f,
+ 0x2e1803,
+ 0x53e6dc42,
+ 0x161d942,
+ 0x54203e42,
+ 0x2a94c3,
+ 0x28d243,
+ 0x2bc506,
+ 0x34efc6,
+ 0x2d8bc7,
+ 0x3835c4,
+ 0x5461ee02,
+ 0x54a17682,
+ 0x240d85,
+ 0x31a707,
+ 0x2cb806,
+ 0x54e78102,
+ 0x38d184,
+ 0x2d12c3,
+ 0x55208042,
+ 0x5577c743,
+ 0x2d2684,
+ 0x2d8149,
+ 0x55adfe42,
+ 0x55e19f42,
+ 0x254b45,
+ 0x562e0602,
+ 0x56a065c2,
+ 0x362607,
+ 0x37f5cb,
+ 0x216b45,
+ 0x2610c9,
+ 0x268b06,
+ 0x56e08484,
+ 0x208489,
+ 0x36e507,
+ 0x3e2d07,
+ 0x225903,
+ 0x2f9206,
+ 0x352a87,
+ 0x21b643,
+ 0x2ab186,
+ 0x5762cbc2,
+ 0x57a2b342,
+ 0x215703,
+ 0x3ab5c5,
+ 0x223b47,
+ 0x241886,
+ 0x39a1c5,
+ 0x267804,
+ 0x2b3985,
+ 0x30c904,
+ 0x57e04442,
+ 0x2deb84,
+ 0x2d1084,
+ 0x3ec38d,
+ 0x2d1089,
+ 0x25c088,
+ 0x267384,
+ 0x209c05,
+ 0x32b287,
+ 0x3470c4,
+ 0x3d5d07,
+ 0x242f45,
+ 0x582b7144,
+ 0x2b2b85,
+ 0x20c444,
+ 0x3c8586,
+ 0x3b6345,
+ 0x58601a82,
+ 0x22b303,
+ 0x3018c3,
+ 0x244bc4,
+ 0x244bc5,
+ 0x386dc6,
+ 0x255d45,
+ 0x2680c4,
+ 0x58b0b703,
+ 0x58e12686,
+ 0x222705,
+ 0x222bc5,
+ 0x3b6444,
+ 0x2fde43,
+ 0x35b74c,
+ 0x592c5b02,
+ 0x59601742,
+ 0x59a0b982,
+ 0x2280c3,
+ 0x2280c4,
+ 0x59e0fd02,
+ 0x3619c8,
+ 0x227904,
+ 0x396a86,
+ 0x5a22d442,
+ 0x5a609cc2,
+ 0x5aa00b42,
+ 0x28ae85,
+ 0x286446,
+ 0x35bc04,
+ 0x232e86,
+ 0x211c46,
+ 0x2097c3,
+ 0x5ae99c0a,
+ 0x296705,
+ 0x2b1fc3,
+ 0x20e986,
+ 0x5b20e989,
+ 0x22a9c7,
+ 0x3d3048,
+ 0x224609,
+ 0x2ba4c8,
+ 0x2503c6,
+ 0x208143,
+ 0x5b602c82,
+ 0x3adb08,
+ 0x5ba54902,
+ 0x5be026c2,
+ 0x2335c3,
+ 0x2f7305,
+ 0x24c284,
+ 0x245489,
+ 0x238dc4,
+ 0x2472c8,
+ 0x5c610843,
+ 0x5ca643c4,
+ 0x21ed08,
+ 0x5ce08f02,
+ 0x23f002,
+ 0x32db45,
+ 0x270a09,
+ 0x219c03,
+ 0x319ac4,
+ 0x376504,
+ 0x267c43,
+ 0x29190a,
+ 0x5d20bdc2,
+ 0x5d612ac2,
+ 0x2e2943,
+ 0x39c503,
+ 0x1635002,
+ 0x271503,
+ 0x5da1dfc2,
+ 0x5de0dec2,
+ 0x5e292e44,
+ 0x292e46,
+ 0x27e5c4,
+ 0x28bc83,
+ 0x3d8d43,
+ 0x5e706943,
+ 0x24ae86,
+ 0x32df05,
+ 0x2e6707,
+ 0x2e6646,
+ 0x2e6c08,
+ 0x2e6e06,
+ 0x20dec4,
+ 0x2abf8b,
+ 0x2e9703,
+ 0x2e9705,
+ 0x226e42,
+ 0x362902,
+ 0x5ea51882,
+ 0x5ee0f782,
+ 0x21ee43,
+ 0x5f27eec2,
+ 0x27eec3,
+ 0x2ea783,
+ 0x5fa03b02,
+ 0x5feedcc6,
+ 0x29d686,
+ 0x60246542,
+ 0x60611402,
+ 0x60a30a02,
+ 0x60e05582,
+ 0x6120d082,
+ 0x61604342,
+ 0x21a083,
+ 0x3b6006,
+ 0x61a22d84,
+ 0x33bc86,
+ 0x28d5c4,
+ 0x20a383,
+ 0x62603bc2,
+ 0x2048c2,
+ 0x2350c3,
+ 0x62a127c3,
+ 0x3c97c7,
+ 0x3b6247,
+ 0x67e582c7,
+ 0x348507,
+ 0x2166c3,
+ 0x68277a44,
+ 0x31d704,
+ 0x31d70a,
+ 0x3ba585,
+ 0x6863b542,
+ 0x261643,
+ 0x68a00602,
+ 0x25c743,
+ 0x3c3903,
+ 0x69200582,
+ 0x3cc144,
+ 0x20a1c4,
+ 0x3cf585,
+ 0x32c5c5,
+ 0x2fd606,
+ 0x3a7586,
+ 0x69616602,
+ 0x69a01242,
+ 0x2f9bc5,
+ 0x29d392,
+ 0x2af9c6,
+ 0x209843,
+ 0x2dd486,
+ 0x3d19c5,
+ 0x161e7c2,
+ 0x71e09f02,
+ 0x209f03,
+ 0x211683,
+ 0x3a5bc3,
+ 0x72214542,
+ 0x21d343,
+ 0x7261c682,
+ 0x249c83,
+ 0x3856c8,
+ 0x25d543,
+ 0x2b9886,
+ 0x3e8dc7,
+ 0x34d686,
+ 0x34d68b,
+ 0x28d507,
+ 0x30b684,
+ 0x72e07c42,
+ 0x2ca605,
+ 0x73212783,
+ 0x22d043,
+ 0x3c7445,
+ 0x2165c3,
+ 0x73a165c6,
+ 0x3ddfc3,
+ 0x20f0c4,
+ 0x2003c6,
+ 0x30aac6,
+ 0x73e1f483,
+ 0x2382c7,
+ 0x34c587,
+ 0x2ad945,
+ 0x31cec6,
+ 0x21a683,
+ 0x76ac9683,
+ 0x76e00a82,
+ 0x7723e044,
+ 0x3d5409,
+ 0x218b85,
+ 0x30a444,
+ 0x388b08,
+ 0x328b05,
+ 0x7775e205,
+ 0x24d489,
+ 0x209583,
+ 0x3d9c04,
+ 0x77a0f102,
+ 0x21f043,
+ 0x77e78302,
+ 0x278306,
+ 0x162e6c2,
+ 0x782135c2,
+ 0x28ad88,
+ 0x29e203,
+ 0x2b2ac7,
+ 0x2bd9c5,
+ 0x2cb045,
+ 0x2cb48b,
+ 0x2f8f86,
+ 0x2cb686,
+ 0x27ea44,
+ 0x215506,
+ 0x786f9788,
+ 0x293ec3,
+ 0x26b483,
+ 0x26b484,
+ 0x3e5004,
+ 0x2fe047,
+ 0x316985,
+ 0x78b1f402,
+ 0x78e06582,
+ 0x79606585,
+ 0x298f04,
+ 0x3e514b,
+ 0x2fe688,
+ 0x253b44,
+ 0x79a58e42,
+ 0x79e53ac2,
+ 0x3d72c3,
+ 0x2ff984,
+ 0x2ffc45,
+ 0x3006c7,
+ 0x7a302844,
+ 0x381304,
+ 0x7a602782,
+ 0x3885c9,
+ 0x303d45,
+ 0x216e05,
+ 0x3045c5,
+ 0x7aa02783,
+ 0x244084,
+ 0x24408b,
+ 0x305d44,
+ 0x30600b,
+ 0x306885,
+ 0x21fbca,
+ 0x307048,
+ 0x30724a,
+ 0x307ac3,
+ 0x307aca,
+ 0x7b2189c2,
+ 0x7b685042,
+ 0x7baa31c3,
+ 0x7bed2102,
+ 0x309ec3,
+ 0x7c30afc2,
+ 0x7c73a282,
+ 0x30c584,
+ 0x220106,
+ 0x232bc5,
+ 0x3101c3,
+ 0x3cdb06,
+ 0x20ef45,
+ 0x255884,
+ 0x7ca00902,
+ 0x2a1b84,
+ 0x2e2bca,
+ 0x2c5747,
+ 0x3e26c6,
+ 0x24eec7,
+ 0x249f03,
+ 0x2d26c8,
+ 0x3eb80b,
+ 0x2282c5,
+ 0x376645,
+ 0x376646,
+ 0x2fd9c4,
+ 0x21cb08,
+ 0x207a43,
+ 0x207a44,
+ 0x207a47,
+ 0x30b2c6,
+ 0x33e886,
+ 0x2d050a,
+ 0x25b384,
+ 0x27d94a,
+ 0x7cf83846,
+ 0x383847,
+ 0x265f07,
+ 0x2696c4,
+ 0x2696c9,
+ 0x220a45,
+ 0x36e343,
+ 0x22bcc3,
+ 0x7d225f83,
+ 0x298ac4,
+ 0x7d600682,
+ 0x2f08c6,
+ 0x7dad3105,
+ 0x2dd6c5,
+ 0x245d86,
+ 0x2c8b44,
+ 0x7de01082,
+ 0x245e84,
+ 0x7e209942,
+ 0x237a05,
+ 0x3c78c4,
+ 0x7f62cac3,
+ 0x7fa116c2,
+ 0x2116c3,
+ 0x21d486,
+ 0x7fe01782,
+ 0x32d608,
+ 0x22a844,
+ 0x22a846,
+ 0x39cd86,
+ 0x80267784,
+ 0x21fe05,
+ 0x243148,
+ 0x255547,
+ 0x350587,
+ 0x35058f,
+ 0x2a50c6,
+ 0x248083,
+ 0x24d684,
+ 0x215c83,
+ 0x22a3c4,
+ 0x3acac4,
+ 0x80608382,
+ 0x2b76c3,
+ 0x337703,
+ 0x80a036c2,
+ 0x2036c3,
+ 0x38f1c3,
+ 0x21708a,
+ 0x314d47,
+ 0x25cbcc,
+ 0x25ce86,
+ 0x25e406,
+ 0x262287,
+ 0x80e65507,
+ 0x269d89,
+ 0x81230e44,
+ 0x81a1ee82,
+ 0x81e033c2,
+ 0x2d08c6,
+ 0x2380c4,
+ 0x38c746,
+ 0x26cb88,
+ 0x3ab684,
+ 0x32ea46,
+ 0x29d105,
+ 0x82280408,
+ 0x24e043,
+ 0x282ac5,
+ 0x396603,
+ 0x216f03,
+ 0x216f04,
+ 0x215a03,
+ 0x82639d02,
+ 0x82a04082,
+ 0x36e209,
+ 0x28ac85,
+ 0x28af84,
+ 0x28c845,
+ 0x204084,
+ 0x2e43c7,
+ 0x35b485,
+ 0x8324a3c4,
+ 0x2d1548,
+ 0x2d2e86,
+ 0x2d4204,
+ 0x2d53c8,
+ 0x83605f82,
+ 0x2e7cc4,
+ 0x315484,
+ 0x337f87,
+ 0x83a05f84,
+ 0x21a542,
+ 0x83e12882,
+ 0x254a43,
+ 0x254a44,
+ 0x2ae6c3,
+ 0x2bfcc5,
+ 0x8420c402,
+ 0x2f8dc5,
+ 0x246f82,
+ 0x312685,
+ 0x2e15c5,
+ 0x8460c582,
+ 0x3819c4,
+ 0x84a04942,
+ 0x208d46,
+ 0x25b846,
+ 0x270b48,
+ 0x2da1c8,
+ 0x30dac4,
+ 0x2fb0c5,
+ 0x2ba8c9,
+ 0x31fcc4,
+ 0x3ed084,
+ 0x224b03,
+ 0x207803,
+ 0x84e07805,
+ 0x268285,
+ 0x2800c4,
+ 0x29ec82,
+ 0x329e83,
+ 0x85203682,
+ 0x85601402,
+ 0x32d0c5,
+ 0x289807,
+ 0x286f44,
+ 0x224809,
+ 0x2e2d09,
+ 0x28a843,
+ 0x28a848,
+ 0x3917c9,
+ 0x222207,
+ 0x85b2e885,
+ 0x354f06,
+ 0x355546,
+ 0x356a05,
+ 0x2d1185,
+ 0x85e01882,
+ 0x375005,
+ 0x2cf188,
+ 0x2dcac6,
+ 0x862d4807,
+ 0x306ac4,
+ 0x2bde47,
+ 0x3a3946,
+ 0x866088c2,
+ 0x386ac6,
+ 0x311d0a,
+ 0x312585,
+ 0x86a136c2,
+ 0x86e14cc2,
+ 0x27cfc6,
+ 0x8729c3c7,
+ 0x87601b42,
+ 0x237fc3,
+ 0x2f0206,
+ 0x2d9fc4,
+ 0x36f086,
+ 0x3d51c6,
+ 0x37378a,
+ 0x200e05,
+ 0x384046,
+ 0x3c3743,
+ 0x3c3744,
+ 0x87a03142,
+ 0x321203,
+ 0x87e28102,
+ 0x320e43,
+ 0x88311184,
+ 0x2db744,
+ 0x887e954a,
+ 0x229c83,
+ 0x34c847,
+ 0x3dcdc6,
+ 0x268644,
+ 0x243502,
+ 0x2b5902,
+ 0x88a007c2,
+ 0x231403,
+ 0x265cc7,
+ 0x2007c7,
+ 0x297f84,
+ 0x2fcd07,
+ 0x3007c6,
+ 0x237207,
+ 0x227cc4,
+ 0x221705,
+ 0x201985,
+ 0x88e15642,
+ 0x21a706,
+ 0x226243,
+ 0x228882,
+ 0x228886,
+ 0x89227202,
+ 0x89608ec2,
+ 0x220d05,
+ 0x89a01c82,
+ 0x89e00fc2,
+ 0x398085,
+ 0x2e9a45,
+ 0x30c185,
+ 0x8a66e003,
+ 0x224e45,
+ 0x2f9047,
+ 0x2b6985,
+ 0x200fc5,
+ 0x277944,
+ 0x328986,
+ 0x24c344,
+ 0x8aa008c2,
+ 0x8b6dc005,
+ 0x213b47,
+ 0x20f2c8,
+ 0x278606,
+ 0x27860d,
+ 0x27db89,
+ 0x27db92,
+ 0x333505,
+ 0x33e543,
+ 0x8ba10702,
+ 0x31be44,
+ 0x3288c3,
+ 0x3888c5,
+ 0x3dfac5,
+ 0x8be6ca02,
+ 0x26ca03,
+ 0x8c231342,
+ 0x8ca27442,
+ 0x8ce00082,
+ 0x219645,
+ 0x3a6d43,
+ 0x8d205182,
+ 0x8d609e42,
+ 0x3cc106,
+ 0x27988a,
+ 0x24e2c3,
+ 0x244b43,
+ 0x2f1c43,
+ 0x8f201b02,
+ 0x9da55202,
+ 0x9e20d682,
+ 0x204c02,
+ 0x329c89,
+ 0x2df244,
+ 0x2eb948,
+ 0x9e708602,
+ 0x9ee08602,
+ 0x35f645,
+ 0x23fa48,
+ 0x23b2c8,
+ 0x30010c,
+ 0x2450c3,
+ 0x9f273ec2,
+ 0x9f612182,
+ 0x38c146,
+ 0x313dc5,
+ 0x2eef43,
+ 0x256186,
+ 0x313f06,
+ 0x24f243,
+ 0x3153c3,
+ 0x315806,
+ 0x317284,
+ 0x26f646,
+ 0x240fc4,
+ 0x317944,
+ 0x318c4a,
+ 0x9fa52ec2,
+ 0x25d945,
+ 0x31a20a,
+ 0x31a145,
+ 0x31b804,
+ 0x31b906,
+ 0x31ba84,
+ 0x21f306,
+ 0x9fe08902,
+ 0x21a246,
+ 0x23ab05,
+ 0x3c35c7,
+ 0x3cb1c6,
+ 0x262484,
+ 0x2ef1c7,
+ 0x224045,
+ 0x323447,
+ 0x21e087,
+ 0x21e08e,
+ 0x28cf06,
+ 0x3266c5,
+ 0x205ec7,
+ 0x3d9cc7,
+ 0x211845,
+ 0x213e04,
+ 0x325f42,
+ 0x24bb47,
+ 0x287304,
+ 0x249b04,
+ 0x2d77cb,
+ 0xa0225103,
+ 0x307f07,
+ 0x225104,
+ 0x308207,
+ 0x22f403,
+ 0x34de8d,
+ 0x31dc88,
+ 0xa06348c4,
+ 0x24a2c5,
+ 0x31e145,
+ 0x31e583,
+ 0xa0a2a742,
+ 0x3211c3,
+ 0x321743,
+ 0x213704,
+ 0x2262c5,
+ 0x2263c7,
+ 0x3c37c6,
+ 0x39ab03,
+ 0x22b7cb,
+ 0x27114b,
+ 0x2b6d8b,
+ 0x2bbb4b,
+ 0x2c858a,
+ 0x2dcc8b,
+ 0x2f9e0b,
+ 0x31418c,
+ 0x317d4b,
+ 0x363911,
+ 0x37848a,
+ 0x3bbfcb,
+ 0x3ee8cc,
+ 0x322a0b,
+ 0x32370a,
+ 0x323d8a,
+ 0x324c0e,
+ 0x32520b,
+ 0x3254ca,
+ 0x326d51,
+ 0x32718a,
+ 0x32768b,
+ 0x327bce,
+ 0x329f4c,
+ 0x32a3cb,
+ 0x32a68e,
+ 0x32aa0c,
+ 0x32b94a,
+ 0x32ca8c,
+ 0xa0f2d80a,
+ 0x32e048,
+ 0x32f4c9,
+ 0x3336ca,
+ 0x33394a,
+ 0x333bcb,
+ 0x336e8e,
+ 0x3379d1,
+ 0x340f89,
+ 0x3411ca,
+ 0x341dcb,
+ 0x34328d,
+ 0x34410a,
+ 0x344756,
+ 0x345acb,
+ 0x34748a,
+ 0x347dca,
+ 0x34980b,
+ 0x34b3c9,
+ 0x34e809,
+ 0x34f3cd,
+ 0x350e0b,
+ 0x3526cb,
+ 0x353309,
+ 0x35394e,
+ 0x353f8a,
+ 0x354cca,
+ 0x35530a,
+ 0x355a0b,
+ 0x35624b,
+ 0x35784d,
+ 0x35af8d,
+ 0x35cc90,
+ 0x35d14b,
+ 0x35e34c,
+ 0x35fc0b,
+ 0x36210b,
+ 0x36548e,
+ 0x36614b,
+ 0x36614d,
+ 0x36b54b,
+ 0x36bfcf,
+ 0x36c38b,
+ 0x36d08a,
+ 0x36e789,
+ 0x370b09,
+ 0xa1370e8b,
+ 0x37114e,
+ 0x3714ce,
+ 0x37628b,
+ 0x37704f,
+ 0x379e4b,
+ 0x37a10b,
+ 0x37a3ca,
+ 0x37f1c9,
+ 0x38248f,
+ 0x38b98c,
+ 0x38cbcc,
+ 0x38dace,
+ 0x38e28f,
+ 0x38e64e,
+ 0x38f2d0,
+ 0x38f6cf,
+ 0x390b4e,
+ 0x391bcc,
+ 0x391ed1,
+ 0x392312,
+ 0x392bd1,
+ 0x39320e,
+ 0x393a4b,
+ 0x393a4e,
+ 0x393dcf,
+ 0x39418e,
+ 0x394510,
+ 0x394913,
+ 0x394dd1,
+ 0x39520c,
+ 0x39550e,
+ 0x39598c,
+ 0x395ed3,
+ 0x396c10,
+ 0x39708c,
+ 0x39738c,
+ 0x397c4b,
+ 0x39908e,
+ 0x39958b,
+ 0x399ccb,
+ 0x39ad0c,
+ 0x3a0d8a,
+ 0x3a18cc,
+ 0x3a1bcc,
+ 0x3a1ec9,
+ 0x3a430b,
+ 0x3a45c8,
+ 0x3a4d89,
+ 0x3a4d8f,
+ 0x3a664b,
+ 0xa17a894a,
+ 0x3a9f0c,
+ 0x3aae4b,
+ 0xa1bab109,
+ 0x3abbc8,
+ 0x3abf8b,
+ 0x3ace8a,
+ 0x3ad10a,
+ 0x3ad38b,
+ 0x3ad88c,
+ 0x3ae8c9,
+ 0x3aeb08,
+ 0x3b17cb,
+ 0x3b598b,
+ 0x3b898e,
+ 0x3ba1cb,
+ 0x3bb94b,
+ 0x3c79cb,
+ 0x3c7c89,
+ 0x3c88cd,
+ 0x3dedca,
+ 0x3e39d7,
+ 0x3e4658,
+ 0x3e77c9,
+ 0x3e8a0b,
+ 0x3e9994,
+ 0x3e9e8b,
+ 0x3ea40a,
+ 0x3eafca,
+ 0x3eb24b,
+ 0x3ec790,
+ 0x3ecb91,
+ 0x3ed18a,
+ 0x3edecd,
+ 0x3ee5cd,
+ 0x3efa8b,
+ 0x21a803,
+ 0xa1e02843,
+ 0x2181c6,
+ 0x3d2985,
+ 0x2eaf47,
+ 0x2c2006,
+ 0xa2209302,
+ 0x2700c9,
+ 0x237744,
+ 0x2f7d08,
+ 0x225ec3,
+ 0x31bd87,
+ 0xa2601c42,
+ 0x2c2543,
+ 0xa2a04182,
+ 0x2e3786,
+ 0x2e4d84,
+ 0x2efc44,
+ 0x2021c3,
+ 0xa32e0642,
+ 0xa3632284,
+ 0x269607,
+ 0xa3a32642,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x10bb08,
+ 0x20bc03,
+ 0x2000c2,
+ 0x7ffc8,
+ 0x205842,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x217083,
+ 0x33d716,
+ 0x369b53,
+ 0x2fcb89,
+ 0x285588,
+ 0x2ca489,
+ 0x31a386,
+ 0x351bd0,
+ 0x3eba93,
+ 0x30b388,
+ 0x28bd87,
+ 0x28de87,
+ 0x2b36ca,
+ 0x354849,
+ 0x335dc9,
+ 0x29f80b,
+ 0x340886,
+ 0x32aeca,
+ 0x229146,
+ 0x2361c3,
+ 0x26d285,
+ 0x3d5608,
+ 0x290e4d,
+ 0x3468cc,
+ 0x23a7c7,
+ 0x3a728d,
+ 0x243244,
+ 0x23b4ca,
+ 0x23c84a,
+ 0x23cd0a,
+ 0x205847,
+ 0x248547,
+ 0x24ba84,
+ 0x27f786,
+ 0x384a84,
+ 0x224d08,
+ 0x238e09,
+ 0x308d86,
+ 0x308d88,
+ 0x24fa4d,
+ 0x2e2f49,
+ 0x315d88,
+ 0x216d87,
+ 0x220f4a,
+ 0x2bf046,
+ 0x33ed44,
+ 0x211e87,
+ 0x2f0aca,
+ 0x23cf4e,
+ 0x28a905,
+ 0x29bf4b,
+ 0x231149,
+ 0x27ddc9,
+ 0x2b2347,
+ 0x3da84a,
+ 0x2f5547,
+ 0x2e8a89,
+ 0x346d88,
+ 0x37078b,
+ 0x2f7305,
+ 0x25bf4a,
+ 0x2307c9,
+ 0x38638a,
+ 0x3efd8b,
+ 0x211d8b,
+ 0x29f595,
+ 0x2d8345,
+ 0x216e05,
+ 0x24408a,
+ 0x2722ca,
+ 0x32ee87,
+ 0x216e43,
+ 0x2d0848,
+ 0x2ece4a,
+ 0x22a846,
+ 0x266949,
+ 0x280408,
+ 0x2d4204,
+ 0x395c89,
+ 0x2da1c8,
+ 0x2d9e47,
+ 0x2dc006,
+ 0x213b47,
+ 0x3a2947,
+ 0x24ac85,
+ 0x2b7f0c,
+ 0x24a2c5,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x205842,
+ 0x229f43,
+ 0x2127c3,
+ 0x20bc03,
+ 0x21f483,
+ 0x229f43,
+ 0x2127c3,
+ 0xbc03,
+ 0x25d543,
+ 0x21f483,
+ 0x1df183,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x7ffc8,
+ 0x205842,
+ 0x229f43,
+ 0x234f87,
+ 0x98704,
+ 0x2127c3,
+ 0x37344,
+ 0x21f483,
+ 0xef45,
+ 0x205842,
+ 0x201902,
+ 0x30b602,
+ 0x205fc2,
+ 0x202a42,
+ 0x229ac2,
+ 0x164ca,
+ 0x14244b,
+ 0x5b547,
+ 0x1b8586,
+ 0xa1606,
+ 0x60209,
+ 0xebb49,
+ 0x1a3dc7,
+ 0x15b4e8a,
+ 0x1314e,
+ 0x10ad89,
+ 0x482cac3,
+ 0x98307,
+ 0x149c86,
+ 0x5ec3,
+ 0x11d6c5,
+ 0xc1,
+ 0x5229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x2e9c43,
+ 0x25e043,
+ 0x219c03,
+ 0x2ee0c6,
+ 0x2127c3,
+ 0x21f483,
+ 0x236f03,
+ 0x7ffc8,
+ 0x20a944,
+ 0x264187,
+ 0x202203,
+ 0x261a44,
+ 0x225f43,
+ 0x2455c3,
+ 0x2e9c43,
+ 0xf1a47,
+ 0x9c4,
+ 0x14c3,
+ 0x172f85,
+ 0x66000c2,
+ 0x58843,
+ 0x6a05842,
+ 0x6e96109,
+ 0x709b3c9,
+ 0x9b80d,
+ 0x9bb4d,
+ 0x30b602,
+ 0x58104,
+ 0x172fc9,
+ 0x2003c2,
+ 0x7658008,
+ 0x105744,
+ 0x320a03,
+ 0x7ffc8,
+ 0x87304,
+ 0x14076c2,
+ 0x14005c2,
+ 0x14076c2,
+ 0x1517b46,
+ 0x23d9c3,
+ 0x2c9ec3,
+ 0x7e29f43,
+ 0x23b4c4,
+ 0x8624d03,
+ 0x8ee9c43,
+ 0x203842,
+ 0x258104,
+ 0x2127c3,
+ 0x239503,
+ 0x200f82,
+ 0x21f483,
+ 0x222402,
+ 0x30bd83,
+ 0x201782,
+ 0x2b32c3,
+ 0x221943,
+ 0x205242,
+ 0x7ffc8,
+ 0x829db89,
+ 0x22003,
+ 0x23d9c3,
+ 0x3d7348,
+ 0x8a39503,
+ 0x200f82,
+ 0x30bd83,
+ 0x201782,
+ 0x2b32c3,
+ 0x221943,
+ 0x205242,
+ 0x25ce87,
+ 0x30bd83,
+ 0x201782,
+ 0x2b32c3,
+ 0x221943,
+ 0x205242,
+ 0x229f43,
+ 0x2b82,
+ 0x24dc3,
+ 0x3642,
+ 0x6cc2,
+ 0x4682,
+ 0x2c82,
+ 0x1b02,
+ 0x2842,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202082,
+ 0x202783,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x9a03,
+ 0x1c682,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x32e885,
+ 0x26ca02,
+ 0x2000c2,
+ 0x7ffc8,
+ 0xaeba692,
+ 0xb2d6d88,
+ 0x1475dc8,
+ 0x3424a,
+ 0x2cc5,
+ 0x2707,
+ 0x2e9c43,
+ 0x228ac1,
+ 0x2009c1,
+ 0x200a01,
+ 0x201101,
+ 0x200dc1,
+ 0x218341,
+ 0x202281,
+ 0x202f81,
+ 0x249081,
+ 0x200001,
+ 0x2000c1,
+ 0x200201,
+ 0x145d45,
+ 0x7ffc8,
+ 0x200101,
+ 0x200d01,
+ 0x200501,
+ 0x200c01,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x200c41,
+ 0x200701,
+ 0x2004c1,
+ 0x200b41,
+ 0x200581,
+ 0x2003c1,
+ 0x200a81,
+ 0x205601,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x200081,
+ 0x204c01,
+ 0x205241,
+ 0x201541,
+ 0x201c41,
+ 0x201b81,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2003c2,
+ 0x21f483,
+ 0xf1a47,
+ 0x84447,
+ 0x332c6,
+ 0x46aca,
+ 0x9a808,
+ 0x64f08,
+ 0x65bc7,
+ 0xc3184,
+ 0x71506,
+ 0xf58c5,
+ 0xcab05,
+ 0xb0e03,
+ 0x18a46,
+ 0x5b646,
+ 0x29f804,
+ 0x334f47,
+ 0x7ffc8,
+ 0x2ef2c4,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x5842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x32da08,
+ 0x209f84,
+ 0x23a844,
+ 0x2045c4,
+ 0x38c047,
+ 0x2ec207,
+ 0x229f43,
+ 0x24128b,
+ 0x3b154a,
+ 0x34a2c7,
+ 0x3e4448,
+ 0x220208,
+ 0x224d03,
+ 0x2886c7,
+ 0x28c6c3,
+ 0x214688,
+ 0x22f089,
+ 0x258104,
+ 0x25e043,
+ 0x247608,
+ 0x219c03,
+ 0x2e984a,
+ 0x2ee0c6,
+ 0x33bc87,
+ 0x2127c3,
+ 0x30eec6,
+ 0x3c0848,
+ 0x21f483,
+ 0x25a6c6,
+ 0x2fe8cd,
+ 0x300408,
+ 0x305d4b,
+ 0x20e0c6,
+ 0x385887,
+ 0x22ab45,
+ 0x2b904a,
+ 0x22b685,
+ 0x26818a,
+ 0x26ca02,
+ 0x205ec3,
+ 0x249b04,
+ 0x200006,
+ 0x3bf783,
+ 0x2a1c03,
+ 0x289e03,
+ 0x209f83,
+ 0x20c083,
+ 0x203742,
+ 0x38bd85,
+ 0x2b9dc9,
+ 0x202043,
+ 0x24b303,
+ 0x2030c3,
+ 0x219243,
+ 0x200201,
+ 0x31fa87,
+ 0x219385,
+ 0x3c5943,
+ 0x269183,
+ 0x3ef083,
+ 0x2045c4,
+ 0x383d43,
+ 0x2120c8,
+ 0x36e9c3,
+ 0x31484d,
+ 0x28cfc8,
+ 0x3d7506,
+ 0x2f77c3,
+ 0x366443,
+ 0x39afc3,
+ 0xde29f43,
+ 0x23dc08,
+ 0x241284,
+ 0x248c03,
+ 0x24c883,
+ 0x200106,
+ 0x250bc8,
+ 0x24dac3,
+ 0x22f903,
+ 0x2bfb03,
+ 0x205483,
+ 0x2b9083,
+ 0x220203,
+ 0x224d03,
+ 0x233a43,
+ 0x254583,
+ 0x209343,
+ 0x296a03,
+ 0x328343,
+ 0x20ea83,
+ 0x20a6c3,
+ 0x3ab305,
+ 0x2601c4,
+ 0x261307,
+ 0x262642,
+ 0x263d83,
+ 0x268406,
+ 0x269fc3,
+ 0x26ad43,
+ 0x28a803,
+ 0x271dc3,
+ 0x21f403,
+ 0x20a643,
+ 0x2a7a87,
+ 0xeae9c43,
+ 0x2421c3,
+ 0x208103,
+ 0x204203,
+ 0x258103,
+ 0x21a583,
+ 0x226dc5,
+ 0x382803,
+ 0x38d2c9,
+ 0x200c43,
+ 0x3dfdc3,
+ 0xee57443,
+ 0x227883,
+ 0x204603,
+ 0x217388,
+ 0x2b9d06,
+ 0x271b86,
+ 0x2c4f06,
+ 0x26bf87,
+ 0x22ea83,
+ 0x2335c3,
+ 0x219c03,
+ 0x29a906,
+ 0x226e42,
+ 0x2ed403,
+ 0x366005,
+ 0x2127c3,
+ 0x31b087,
+ 0x160bc03,
+ 0x219d03,
+ 0x2058c3,
+ 0x23eb03,
+ 0x22d043,
+ 0x21f483,
+ 0x215c46,
+ 0x200a86,
+ 0x387c83,
+ 0x22e683,
+ 0x202783,
+ 0x227d43,
+ 0x315443,
+ 0x309743,
+ 0x30c883,
+ 0x20ef45,
+ 0x23ffc3,
+ 0x23ffc6,
+ 0x21ad03,
+ 0x28c148,
+ 0x22bcc3,
+ 0x22bcc9,
+ 0x2b8a88,
+ 0x22d3c8,
+ 0x310ac5,
+ 0x235d8a,
+ 0x23ed4a,
+ 0x24430b,
+ 0x244cc8,
+ 0x31c843,
+ 0x21e6c3,
+ 0x30c8c3,
+ 0x2f3883,
+ 0x30e088,
+ 0x32a203,
+ 0x3c3744,
+ 0x203142,
+ 0x23c7c3,
+ 0x253f03,
+ 0x2007c3,
+ 0x3a8143,
+ 0x280183,
+ 0x236f03,
+ 0x26ca02,
+ 0x2f5443,
+ 0x2450c3,
+ 0x317cc3,
+ 0x319684,
+ 0x249b04,
+ 0x231a83,
+ 0x7ffc8,
+ 0xe315f8c,
+ 0xe6e5745,
+ 0xc1e05,
+ 0x2000c2,
+ 0x200ac2,
+ 0x203742,
+ 0x201182,
+ 0x200202,
+ 0x202542,
+ 0x25a282,
+ 0x203642,
+ 0x200382,
+ 0x200b42,
+ 0x208f02,
+ 0x20f782,
+ 0x27eec2,
+ 0x200a82,
+ 0x229ac2,
+ 0x20f102,
+ 0x215502,
+ 0x202782,
+ 0x2bbd02,
+ 0x206902,
+ 0x200682,
+ 0x214602,
+ 0x201082,
+ 0x2036c2,
+ 0x2033c2,
+ 0x207802,
+ 0x200fc2,
+ 0xc2,
+ 0xac2,
+ 0x3742,
+ 0x1182,
+ 0x202,
+ 0x2542,
+ 0x5a282,
+ 0x3642,
+ 0x382,
+ 0xb42,
+ 0x8f02,
+ 0xf782,
+ 0x7eec2,
+ 0xa82,
+ 0x29ac2,
+ 0xf102,
+ 0x15502,
+ 0x2782,
+ 0xbbd02,
+ 0x6902,
+ 0x682,
+ 0x14602,
+ 0x1082,
+ 0x36c2,
+ 0x33c2,
+ 0x7802,
+ 0xfc2,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x5ec2,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x9c589,
+ 0x5842,
+ 0x205842,
+ 0x21f483,
+ 0x10a29f43,
+ 0x2e9c43,
+ 0x219c03,
+ 0xf19c7,
+ 0x81983,
+ 0x247f42,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x1e683,
+ 0x2127c3,
+ 0xbc03,
+ 0x81983,
+ 0x21f483,
+ 0x4182,
+ 0x2001c2,
+ 0x1405405,
+ 0x145d45,
+ 0x212d02,
+ 0x7ffc8,
+ 0x5842,
+ 0x240482,
+ 0x203782,
+ 0x20a382,
+ 0x23b542,
+ 0x216602,
+ 0xcab05,
+ 0x20ad82,
+ 0x200f82,
+ 0x214542,
+ 0x203fc2,
+ 0x20f102,
+ 0x248dc2,
+ 0x212882,
+ 0x223ac2,
+ 0x11a7c7c4,
+ 0x142,
+ 0xf1a47,
+ 0x13683,
+ 0x1b670d,
+ 0xf5949,
+ 0x1a5fcb,
+ 0xf8f08,
+ 0x6b349,
+ 0x1133c6,
+ 0x2e9c43,
+ 0x7ffc8,
+ 0x9c4,
+ 0x14c3,
+ 0x172f85,
+ 0x7ffc8,
+ 0xf2447,
+ 0x12c5a847,
+ 0x13263284,
+ 0x66806,
+ 0x172fc9,
+ 0xb714e,
+ 0x13e007,
+ 0x15b2a43,
+ 0x13602c02,
+ 0x1edc89,
+ 0x1f04,
+ 0x2000c2,
+ 0x29f804,
+ 0x205842,
+ 0x229f43,
+ 0x201902,
+ 0x224d03,
+ 0x26403,
+ 0x200382,
+ 0x2ef2c4,
+ 0x25e043,
+ 0x254902,
+ 0x2127c3,
+ 0x16602,
+ 0x2003c2,
+ 0x21f483,
+ 0x216e06,
+ 0x33418f,
+ 0x725ec3,
+ 0x2fc58a,
+ 0x7ffc8,
+ 0x205842,
+ 0x28c6c3,
+ 0x2e9c43,
+ 0x219c03,
+ 0xbc03,
+ 0x14bb6147,
+ 0x1582a46,
+ 0x1d1ec6,
+ 0x14fc8bc8,
+ 0x1e6644,
+ 0x152c518a,
+ 0x15c34147,
+ 0xd6d88,
+ 0xb7148,
+ 0x15e930b,
+ 0x147ccca,
+ 0x1606ac83,
+ 0xfb6c9,
+ 0x165045c8,
+ 0x16a54187,
+ 0x14b8e4a,
+ 0x1500f47,
+ 0xb378b,
+ 0x16e81f4c,
+ 0xaa845,
+ 0xfc185,
+ 0x11adc9,
+ 0x1bddc4,
+ 0x1153c3,
+ 0x156c52c5,
+ 0x124283,
+ 0x15a32783,
+ 0x124283,
+ 0x13682,
+ 0x1c82,
+ 0x9e42,
+ 0x9e42,
+ 0x3702,
+ 0x9e42,
+ 0x1b02,
+ 0x2102,
+ 0xd02,
+ 0x145d45,
+ 0xf1a47,
+ 0x1e6644,
+ 0x102504,
+ 0x205842,
+ 0x229f43,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x2000c2,
+ 0x204cc2,
+ 0x206f02,
+ 0x17e29f43,
+ 0x248d82,
+ 0x224d03,
+ 0x200c02,
+ 0x2a5c02,
+ 0x2e9c43,
+ 0x21e682,
+ 0x271102,
+ 0x232242,
+ 0x2086c2,
+ 0x2a1342,
+ 0x200802,
+ 0x202142,
+ 0x204d02,
+ 0x227e02,
+ 0x20a442,
+ 0x13038c,
+ 0x2c7dc2,
+ 0x2803c2,
+ 0x226282,
+ 0x240e42,
+ 0x219c03,
+ 0x20dec2,
+ 0x2127c3,
+ 0x20e942,
+ 0x2a28c2,
+ 0x21f483,
+ 0x24b382,
+ 0x2036c2,
+ 0x21ee82,
+ 0x204082,
+ 0x20c582,
+ 0x2136c2,
+ 0x215642,
+ 0x231342,
+ 0x226d82,
+ 0x3254ca,
+ 0x36d08a,
+ 0x3a8fca,
+ 0x3f0382,
+ 0x2102c2,
+ 0x227482,
+ 0x18239b09,
+ 0x187bf80a,
+ 0x1542547,
+ 0x18a05f02,
+ 0x142cb83,
+ 0x10c2,
+ 0x1bf80a,
+ 0x15fe8e,
+ 0x259b44,
+ 0x100585,
+ 0x19229f43,
+ 0x498c3,
+ 0x224d03,
+ 0x25b9c4,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x13de09,
+ 0x136086,
+ 0x219c03,
+ 0xf9704,
+ 0xd83,
+ 0x2127c3,
+ 0x8e345,
+ 0x20bc03,
+ 0x21f483,
+ 0x1528a44,
+ 0x23ffc3,
+ 0x1954bc04,
+ 0x205ec3,
+ 0x7ffc8,
+ 0x3842,
+ 0x154d603,
+ 0x125e06,
+ 0x1471484,
+ 0x1fc5,
+ 0x1bdbca,
+ 0x86a42,
+ 0x1a002acd,
+ 0x1b9946,
+ 0x187591,
+ 0x1a639b09,
+ 0x15500a,
+ 0x2048,
+ 0x1b5508,
+ 0x6e90e,
+ 0x182d13,
+ 0x21121487,
+ 0xec2,
+ 0x39c94,
+ 0x46f07,
+ 0x2d74e,
+ 0x145d4b,
+ 0x1482cb,
+ 0x1c304a,
+ 0x110947,
+ 0x7ffc8,
+ 0xa1d08,
+ 0xf647,
+ 0x2141f6cb,
+ 0x21646,
+ 0x24bc7,
+ 0x37c2,
+ 0x3124d,
+ 0x142e85,
+ 0x18ee07,
+ 0x10a6ca,
+ 0x12820c,
+ 0x1283cf,
+ 0x570f,
+ 0xb90c2,
+ 0x5842,
+ 0x96948,
+ 0x218f754c,
+ 0x1aee0a,
+ 0xf1f4a,
+ 0x8240a,
+ 0x8cdc8,
+ 0x15948,
+ 0x6da88,
+ 0xf2408,
+ 0xc348,
+ 0xd02,
+ 0x548f,
+ 0x152038d,
+ 0x181acb,
+ 0xd1e88,
+ 0x40787,
+ 0x5494a,
+ 0x3bc0b,
+ 0xa54c9,
+ 0x54847,
+ 0x159286,
+ 0x15848,
+ 0x3ef0c,
+ 0x1cd787,
+ 0x2f5ca,
+ 0x1db408,
+ 0x332ce,
+ 0x3464e,
+ 0x11078b,
+ 0x5594b,
+ 0x15024b,
+ 0x10a249,
+ 0x11870b,
+ 0x12618d,
+ 0x15be4b,
+ 0x3accd,
+ 0x3b04d,
+ 0x41b4a,
+ 0x4994b,
+ 0x4a10b,
+ 0x50ec5,
+ 0x21dc8c10,
+ 0x32c4f,
+ 0x7c98f,
+ 0x147a8d,
+ 0x85f10,
+ 0x6cc2,
+ 0x222fc8c8,
+ 0x1cd608,
+ 0x9ed50,
+ 0x1217ce,
+ 0x2276e985,
+ 0x5a44b,
+ 0x13cf10,
+ 0xa650b,
+ 0x1b858c,
+ 0x15a4a,
+ 0x55b09,
+ 0x6f248,
+ 0x762c7,
+ 0x76607,
+ 0x767c7,
+ 0x77707,
+ 0x78487,
+ 0x78947,
+ 0x79607,
+ 0x79b07,
+ 0x7a007,
+ 0x7a387,
+ 0x7aa47,
+ 0x7ac07,
+ 0x7adc7,
+ 0x7af87,
+ 0x7b307,
+ 0x7b847,
+ 0x7d147,
+ 0x7d587,
+ 0x7e007,
+ 0x7e2c7,
+ 0x7e487,
+ 0x7e787,
+ 0x7ed87,
+ 0x7ef87,
+ 0x7f907,
+ 0x7fac7,
+ 0x7fc87,
+ 0x80247,
+ 0x80887,
+ 0x81247,
+ 0x82247,
+ 0x82687,
+ 0x82e87,
+ 0x83047,
+ 0x83687,
+ 0x83a07,
+ 0x83ec7,
+ 0x842c7,
+ 0x84607,
+ 0x847c7,
+ 0x85187,
+ 0x86c47,
+ 0x87407,
+ 0x879c7,
+ 0x87b87,
+ 0x88007,
+ 0x89347,
+ 0xd9c2,
+ 0x6db8a,
+ 0x18848,
+ 0x1c014c,
+ 0x1d5287,
+ 0x9ae85,
+ 0x17ac91,
+ 0x1f0006,
+ 0x12c00a,
+ 0x967ca,
+ 0x66806,
+ 0xbcf4b,
+ 0x642,
+ 0x389d1,
+ 0xcb289,
+ 0xa6a09,
+ 0xa7546,
+ 0x4d02,
+ 0x6b04a,
+ 0xb92c9,
+ 0xb9a0f,
+ 0xba00e,
+ 0xbb988,
+ 0x22a6eb12,
+ 0x15388,
+ 0x22e6f447,
+ 0xbee0f,
+ 0x1d7c2,
+ 0x719c9,
+ 0x8654a,
+ 0x23217d09,
+ 0x18c389,
+ 0x18c38c,
+ 0x2994b,
+ 0x1b438e,
+ 0x448c,
+ 0xfb3cf,
+ 0x1c494e,
+ 0x3f30c,
+ 0x56a09,
+ 0x15f291,
+ 0x61ac8,
+ 0x6a152,
+ 0x81c4d,
+ 0x83b8d,
+ 0x88b0b,
+ 0x89a95,
+ 0x90249,
+ 0x9158a,
+ 0x95bc9,
+ 0x190f90,
+ 0x1b56cb,
+ 0xa0dcf,
+ 0xab04b,
+ 0xb194c,
+ 0xc1390,
+ 0xdb90a,
+ 0x1a158d,
+ 0x1a3f8e,
+ 0x19e84a,
+ 0xc324c,
+ 0x1a2614,
+ 0xcaf11,
+ 0xce00b,
+ 0xd03cf,
+ 0xd2fcd,
+ 0xd608e,
+ 0xd9d0c,
+ 0xda74c,
+ 0xdb60b,
+ 0xdc60e,
+ 0xdd9d0,
+ 0x141b0b,
+ 0x1a110d,
+ 0x1ae1cf,
+ 0xf2ecc,
+ 0x108c0e,
+ 0x10fd91,
+ 0x1a3a8c,
+ 0x144347,
+ 0x162a4d,
+ 0x16d2cc,
+ 0x17a610,
+ 0x17bd0d,
+ 0x19b5c7,
+ 0x1a4990,
+ 0x1afe08,
+ 0xc284b,
+ 0xc480f,
+ 0x1c03c8,
+ 0x6e30d,
+ 0x112610,
+ 0x17d2c9,
+ 0x237c8bc8,
+ 0x23ac8c86,
+ 0xc9983,
+ 0x61ec9,
+ 0x25889,
+ 0xd0e85,
+ 0x8042,
+ 0x14a749,
+ 0x6738a,
+ 0x23e6a606,
+ 0x146a60d,
+ 0x242ff684,
+ 0x1e4c46,
+ 0x25dca,
+ 0x2c60d,
+ 0x246e034b,
+ 0x98e08,
+ 0x2489f389,
+ 0x2f443,
+ 0x119aca,
+ 0xebb49,
+ 0xf1091,
+ 0xf14c9,
+ 0xf1ec7,
+ 0xf2c08,
+ 0xf3347,
+ 0x6f348,
+ 0x558b,
+ 0x130049,
+ 0xfa0d0,
+ 0xfa58c,
+ 0xfaa09,
+ 0x24efadcd,
+ 0xfc408,
+ 0xfd045,
+ 0x146f08,
+ 0x1a370a,
+ 0x1325c7,
+ 0x1242,
+ 0x25276f95,
+ 0x13dc0a,
+ 0x142cc9,
+ 0x25a48,
+ 0x1a7ec9,
+ 0x1d2a45,
+ 0x11af0a,
+ 0x173947,
+ 0x9c30f,
+ 0xaa8cb,
+ 0x16154c,
+ 0xef892,
+ 0x3e046,
+ 0x1409588,
+ 0x7b645,
+ 0x115608,
+ 0x1e4d8b,
+ 0x1e5151,
+ 0x17587,
+ 0x6798a,
+ 0x25704485,
+ 0x1b5ccc,
+ 0x2590afce,
+ 0x13a283,
+ 0x19de06,
+ 0x48dc2,
+ 0x10d2cb,
+ 0x10de4a,
+ 0x150f14c,
+ 0x98d08,
+ 0x3ae88,
+ 0x25e25ac6,
+ 0x152f8e,
+ 0x132207,
+ 0x9942,
+ 0x1782,
+ 0x18fb50,
+ 0x6ca87,
+ 0x6cb8f,
+ 0x18a46,
+ 0x5c88e,
+ 0xa494b,
+ 0x566c8,
+ 0xa5889,
+ 0x1e1e52,
+ 0x115c4d,
+ 0x1167c8,
+ 0x1a5e89,
+ 0x1ec14d,
+ 0x6cf09,
+ 0x6d6cb,
+ 0x6fe48,
+ 0x79e08,
+ 0x7b488,
+ 0x7e909,
+ 0x7eb0a,
+ 0x7f28c,
+ 0xcf34a,
+ 0xe808a,
+ 0x115487,
+ 0xae6ca,
+ 0xf8ac8,
+ 0x780d,
+ 0xb7bd1,
+ 0x262d6386,
+ 0x16588b,
+ 0x3754c,
+ 0x45188,
+ 0x1d9a49,
+ 0x15d48d,
+ 0x77950,
+ 0x1476cc,
+ 0x14b94d,
+ 0x9e42,
+ 0x8a4cd,
+ 0x1b02,
+ 0x55202,
+ 0x1153ca,
+ 0x267cbc4a,
+ 0x2b10a,
+ 0x26a87cc8,
+ 0x12bf0a,
+ 0x11bc8b,
+ 0x11c9c7,
+ 0x1b134c,
+ 0x348cc,
+ 0x11e90a,
+ 0x26d1eb8f,
+ 0x11ef4c,
+ 0x11f247,
+ 0x1208ce,
+ 0x271f0245,
+ 0x184588,
+ 0x4182,
+ 0x1405483,
+ 0x1ab751ce,
+ 0x1b20118e,
+ 0x1ba0c98a,
+ 0x1c332dce,
+ 0x1ca060ce,
+ 0x1d340c8c,
+ 0x1542547,
+ 0x15550c9,
+ 0x142cb83,
+ 0x1db6890c,
+ 0x1e206cc9,
+ 0x1ebb7249,
+ 0x1f3bd9c9,
+ 0x10c2,
+ 0x175111,
+ 0x10d1,
+ 0xc8cd,
+ 0x132d11,
+ 0x1361d1,
+ 0x140bcf,
+ 0x16884f,
+ 0x1a9c0c,
+ 0x1b718c,
+ 0x1bd90c,
+ 0xe72cd,
+ 0xf8455,
+ 0x12b64c,
+ 0x142f8c,
+ 0x198c90,
+ 0x1c170c,
+ 0x1c3bcc,
+ 0x1c6019,
+ 0x1db5d9,
+ 0x5e19,
+ 0x6a14,
+ 0xf7d4,
+ 0x10954,
+ 0x10ed4,
+ 0x17714,
+ 0x1fa0fa89,
+ 0x20010c09,
+ 0x20b43049,
+ 0x1ae61cc9,
+ 0x10c2,
+ 0x1b661cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1be61cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1c661cc9,
+ 0x10c2,
+ 0x1ce61cc9,
+ 0x10c2,
+ 0x1d661cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1de61cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1e661cc9,
+ 0x10c2,
+ 0x1ee61cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1f661cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1fe61cc9,
+ 0x10c2,
+ 0x20661cc9,
+ 0x10c2,
+ 0x20e61cc9,
+ 0x10c2,
+ 0x5e0a,
+ 0x10c2,
+ 0x1400401,
+ 0x187585,
+ 0x1c3044,
+ 0x145b883,
+ 0x15cf803,
+ 0x158f143,
+ 0x1751ce,
+ 0x118e,
+ 0x8face,
+ 0xc98a,
+ 0x132dce,
+ 0x60ce,
+ 0x140c8c,
+ 0x16890c,
+ 0x6cc9,
+ 0x1b7249,
+ 0x1bd9c9,
+ 0xfa89,
+ 0x10c09,
+ 0x143049,
+ 0xf864d,
+ 0x11189,
+ 0x179c9,
+ 0x147384,
+ 0x170a04,
+ 0x1ec684,
+ 0x1f0144,
+ 0xb3a44,
+ 0x154bc4,
+ 0x1ba644,
+ 0x55e04,
+ 0x18944,
+ 0x212c4,
+ 0x16f4c9,
+ 0x16f4cc,
+ 0x14fa46,
+ 0x14fa4e,
+ 0x81d84,
+ 0x1596343,
+ 0x1c3a47,
+ 0x1490c0c,
+ 0x2043,
+ 0x212c4,
+ 0x6cc2,
+ 0x4f087,
+ 0xf7548,
+ 0xa2108,
+ 0xdcbc4,
+ 0x1a9806,
+ 0x1351c7,
+ 0xe3504,
+ 0x114046,
+ 0x1f182,
+ 0x1541,
+ 0x22104,
+ 0x6e786,
+ 0x1a883,
+ 0x6cc2,
+ 0x2043,
+ 0xdc843,
+ 0xef683,
+ 0x12683,
+ 0x10a1c3,
+ 0xef885,
+ 0x803c2,
+ 0x7102,
+ 0x7108,
+ 0xf4c87,
+ 0x1300c7,
+ 0xd02,
+ 0x2000c2,
+ 0x205842,
+ 0x201902,
+ 0x218b02,
+ 0x200382,
+ 0x2003c2,
+ 0x201782,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258103,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2127c3,
+ 0x21f483,
+ 0x12c03,
+ 0x2e9c43,
+ 0x58104,
+ 0x2000c2,
+ 0x258843,
+ 0x29629f43,
+ 0x3ab707,
+ 0x2e9c43,
+ 0x2280c3,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x22600a,
+ 0x216e05,
+ 0x202783,
+ 0x208ec2,
+ 0x7ffc8,
+ 0x29ae574a,
+ 0xc41,
+ 0x7ffc8,
+ 0x5842,
+ 0x137d42,
+ 0x2a29f10b,
+ 0x2a635204,
+ 0xff5c5,
+ 0x1402cc5,
+ 0xf7546,
+ 0x2aa02cc5,
+ 0x635c3,
+ 0x9ec43,
+ 0x9c4,
+ 0x14c3,
+ 0x172f85,
+ 0x145d45,
+ 0x7ffc8,
+ 0x24bc7,
+ 0x29f43,
+ 0x3514d,
+ 0x2b246907,
+ 0xac86,
+ 0x2b40c7c5,
+ 0x148792,
+ 0xad47,
+ 0x1624a,
+ 0x14e88,
+ 0x16147,
+ 0x1d5b4a,
+ 0x1bad08,
+ 0x6d487,
+ 0x156acf,
+ 0x4dd87,
+ 0x539c6,
+ 0x13cf10,
+ 0xc9c8f,
+ 0x1ac09,
+ 0x1e4cc4,
+ 0x2b80ae0e,
+ 0x4f3c9,
+ 0x7b0c6,
+ 0x111ac9,
+ 0x19ab46,
+ 0x1d71c6,
+ 0xbe24c,
+ 0x3be0a,
+ 0xa5647,
+ 0x1e224a,
+ 0xb209,
+ 0xfe38c,
+ 0x2724a,
+ 0x6b68a,
+ 0x172fc9,
+ 0x1e4c46,
+ 0xa570a,
+ 0x116d4a,
+ 0xaf4ca,
+ 0x157189,
+ 0xeee88,
+ 0xef106,
+ 0xf644d,
+ 0x5fe0b,
+ 0xd1445,
+ 0x2bf889cc,
+ 0x13e007,
+ 0x1c8049,
+ 0xdab07,
+ 0xb2c54,
+ 0x112a0b,
+ 0xd1cca,
+ 0x1e1cca,
+ 0xb578d,
+ 0x151be89,
+ 0x115a0c,
+ 0x1165cb,
+ 0x163217,
+ 0x163d55,
+ 0x2f5c3,
+ 0x2f5c3,
+ 0x332c6,
+ 0x2f5c3,
+ 0xf7548,
+ 0x156983,
+ 0x51384,
+ 0x1c244,
+ 0x1c24c,
+ 0x63883,
+ 0x14af587,
+ 0xa5845,
+ 0x142b343,
+ 0x142b348,
+ 0x60209,
+ 0xef885,
+ 0x1e4d8b,
+ 0xce2cb,
+ 0x14f3143,
+ 0x14f3148,
+ 0x149c86,
+ 0x1441d07,
+ 0x191207,
+ 0x2cd82bc9,
+ 0x12686,
+ 0x58843,
+ 0x7ffc8,
+ 0x5842,
+ 0x5b9c4,
+ 0x97783,
+ 0x12e885,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x2030c3,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x39ac43,
+ 0x205ec3,
+ 0x2030c3,
+ 0x29f804,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x2043c3,
+ 0x208d43,
+ 0x208ec2,
+ 0x2e582cc5,
+ 0x14325c3,
+ 0x229f43,
+ 0x224d03,
+ 0x226403,
+ 0x28c6c3,
+ 0x2e9c43,
+ 0x258104,
+ 0x3ce883,
+ 0x2335c3,
+ 0x219c03,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x202783,
+ 0x2f2265c3,
+ 0xef789,
+ 0x5842,
+ 0x2f0243,
+ 0x2fe29f43,
+ 0x224d03,
+ 0x255f03,
+ 0x2e9c43,
+ 0x22d643,
+ 0x2335c3,
+ 0x21f483,
+ 0x203303,
+ 0x3d2bc4,
+ 0x7ffc8,
+ 0x30629f43,
+ 0x224d03,
+ 0x2bba43,
+ 0x2e9c43,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x265503,
+ 0x7ffc8,
+ 0x30e29f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x20bc03,
+ 0x21f483,
+ 0x7ffc8,
+ 0x1542547,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x145d45,
+ 0xf1a47,
+ 0xb2e8b,
+ 0x31e3eb46,
+ 0xf18c4,
+ 0xd1445,
+ 0x1475dc8,
+ 0x3204d,
+ 0x1c8bc8,
+ 0x3275e205,
+ 0x2c684,
+ 0x5842,
+ 0xb8c3,
+ 0x14f945,
+ 0x47f42,
+ 0x340a45,
+ 0x7ffc8,
+ 0x33f0ac4d,
+ 0x3420244a,
+ 0xc142,
+ 0x5083,
+ 0x16934f,
+ 0x18b02,
+ 0x81d84,
+ 0x212c4,
+ 0x5842,
+ 0x2000c2,
+ 0x258843,
+ 0x229f43,
+ 0x2e9c43,
+ 0x258104,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x229f43,
+ 0x224d03,
+ 0x2127c3,
+ 0x21f483,
+ 0xef45,
+ 0x32e1c8,
+ 0x29f804,
+ 0x371f86,
+ 0x3a9ac6,
+ 0x7ffc8,
+ 0x3184c3,
+ 0x236c09,
+ 0x21b795,
+ 0x1b79f,
+ 0x229f43,
+ 0x8bf47,
+ 0x398852,
+ 0x18ce86,
+ 0x18fa45,
+ 0x15a4a,
+ 0x55b09,
+ 0x39860f,
+ 0x2ef2c4,
+ 0x231b05,
+ 0x3dfb90,
+ 0x285787,
+ 0x20bc03,
+ 0x219d08,
+ 0x21146,
+ 0x28aa0a,
+ 0x257fc4,
+ 0x3041c3,
+ 0x208ec2,
+ 0x2ff38b,
+ 0x224d03,
+ 0x2e9c43,
+ 0xbc03,
+ 0x18a044,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x309a43,
+ 0x205842,
+ 0x38fc3,
+ 0x1e3084,
+ 0x2127c3,
+ 0x21f483,
+ 0x36426b85,
+ 0x1d9806,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2280c3,
+ 0x2307c3,
+ 0x21f483,
+ 0x58843,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x1a802,
+ 0x2000c2,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x2cc5,
+ 0x63649,
+ 0x2043,
+ 0x29f804,
+ 0x229f43,
+ 0x224d03,
+ 0x292e44,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x12b409,
+ 0x45c4,
+ 0x229f43,
+ 0xd02,
+ 0x224d03,
+ 0x28c6c3,
+ 0x204203,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0xfc2,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x3547c4,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x205ec3,
+ 0x2b82,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x15aec3,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x352e83,
+ 0x3e83,
+ 0x280c3,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x36146,
+ 0x3254ca,
+ 0x344509,
+ 0x3627cb,
+ 0x362f8a,
+ 0x36d08a,
+ 0x38068b,
+ 0x39a90a,
+ 0x3a0d8a,
+ 0x3a8fca,
+ 0x3a924b,
+ 0x3c9509,
+ 0x3dc94a,
+ 0x3dd18b,
+ 0x3ea14b,
+ 0x3ef7ca,
+ 0x35c2,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x344b,
+ 0x1217c7,
+ 0x6f7c8,
+ 0x1ec284,
+ 0x1e6644,
+ 0x9dac8,
+ 0xf3f86,
+ 0x56c6,
+ 0x11df87,
+ 0x120287,
+ 0xf0c9,
+ 0x7ffc8,
+ 0x229f43,
+ 0x15a44,
+ 0x2762c4,
+ 0x202182,
+ 0x222d84,
+ 0x3734c5,
+ 0x2030c3,
+ 0x29f804,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x25b9c4,
+ 0x2ef2c4,
+ 0x258104,
+ 0x2335c3,
+ 0x2127c3,
+ 0x21f483,
+ 0x28a685,
+ 0x2043c3,
+ 0x202783,
+ 0x21cb03,
+ 0x24a3c4,
+ 0x325d84,
+ 0x22cc85,
+ 0x7ffc8,
+ 0x20b904,
+ 0x3d1606,
+ 0x373104,
+ 0x205842,
+ 0x2efc87,
+ 0x253087,
+ 0x259344,
+ 0x2f4d05,
+ 0x37bf05,
+ 0x235c45,
+ 0x258104,
+ 0x26c048,
+ 0x260ec6,
+ 0x35a148,
+ 0x358fc5,
+ 0x2f7305,
+ 0x277a44,
+ 0x21f483,
+ 0x305744,
+ 0x37f506,
+ 0x216f03,
+ 0x24a3c4,
+ 0x268285,
+ 0x34a6c4,
+ 0x2affc4,
+ 0x208ec2,
+ 0x24fd46,
+ 0x3bc546,
+ 0x313dc5,
+ 0x2000c2,
+ 0x258843,
+ 0xf4106,
+ 0x3ba05842,
+ 0x22f904,
+ 0x197604,
+ 0x68585,
+ 0x200382,
+ 0x219c03,
+ 0x205582,
+ 0x2127c3,
+ 0x2003c2,
+ 0x301946,
+ 0x217083,
+ 0x1e4bc5,
+ 0x205ec3,
+ 0x7ffc8,
+ 0x7ffc8,
+ 0x2e9c43,
+ 0x81983,
+ 0x2000c2,
+ 0x3c605842,
+ 0x2e9c43,
+ 0x27ad43,
+ 0x3ce883,
+ 0x235204,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x3df87,
+ 0x2000c2,
+ 0x3ce05842,
+ 0x229f43,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x682,
+ 0x210702,
+ 0x26ca02,
+ 0x2280c3,
+ 0x2fe343,
+ 0x2000c2,
+ 0x145d45,
+ 0x7ffc8,
+ 0xf1a47,
+ 0x205842,
+ 0x224d03,
+ 0x25b9c4,
+ 0x204b03,
+ 0x2e9c43,
+ 0x204203,
+ 0x219c03,
+ 0x2127c3,
+ 0x21c043,
+ 0x21f483,
+ 0x216e43,
+ 0x5ec3,
+ 0x13fe13,
+ 0x142054,
+ 0x145d45,
+ 0xf1a47,
+ 0x16249,
+ 0x114786,
+ 0x12efcb,
+ 0x332c6,
+ 0x64d47,
+ 0x162e06,
+ 0x649,
+ 0x78e0a,
+ 0x9a6cd,
+ 0x1b640c,
+ 0x1176ca,
+ 0x191648,
+ 0xcab05,
+ 0x16288,
+ 0x18a46,
+ 0x1d1ac6,
+ 0x5b646,
+ 0x206cc2,
+ 0x71e44,
+ 0xfbbc6,
+ 0x14e1f4e,
+ 0x23c6,
+ 0x7804c,
+ 0x3e382a4b,
+ 0x145d45,
+ 0x149a8b,
+ 0x3e7b5347,
+ 0x3ebb534a,
+ 0x3efd4ec4,
+ 0x1c3207,
+ 0x2a691,
+ 0x12130a,
+ 0x229f43,
+ 0x3f290b08,
+ 0x1d5ac5,
+ 0x19f508,
+ 0x2ba44,
+ 0x67585,
+ 0xb0d07,
+ 0x3f5d14c6,
+ 0xe184b,
+ 0x3fb84209,
+ 0x15345,
+ 0x17ac86,
+ 0x11c306,
+ 0xa160a,
+ 0x9e80c,
+ 0x1c5983,
+ 0x1e6644,
+ 0x3ffeba44,
+ 0x60209,
+ 0x10b707,
+ 0x10e60a,
+ 0x14e5649,
+ 0x605,
+ 0x118683,
+ 0x4023fcc7,
+ 0x8e345,
+ 0x1569f86,
+ 0x14b89c6,
+ 0xbd00c,
+ 0x1074c8,
+ 0x40448dc3,
+ 0x10be44,
+ 0x18ef4b,
+ 0x2178b,
+ 0x40b3f1cc,
+ 0x1418303,
+ 0xd2cc8,
+ 0xce2cb,
+ 0xb0bc9,
+ 0xd7743,
+ 0x11bf88,
+ 0x1425d06,
+ 0x98307,
+ 0x40f5d489,
+ 0x422eb088,
+ 0xa3b47,
+ 0xfc18a,
+ 0x42763748,
+ 0x11628d,
+ 0x1c7e49,
+ 0x11448,
+ 0x2043,
+ 0x1455349,
+ 0x212c4,
+ 0x14c945,
+ 0x2d143,
+ 0x332c6,
+ 0xf7548,
+ 0x1403842,
+ 0x18944,
+ 0x2b405,
+ 0x149c3c3,
+ 0x2d907,
+ 0x41205483,
+ 0x41771a06,
+ 0x41a44084,
+ 0x41f73a47,
+ 0xf7544,
+ 0xf7544,
+ 0xf7544,
+ 0xf7544,
+ 0x2cc9,
+ 0x41,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x2000c2,
+ 0x205842,
+ 0x2e9c43,
+ 0x203842,
+ 0x2127c3,
+ 0x21f483,
+ 0x217083,
+ 0x38e28f,
+ 0x38e64e,
+ 0x7ffc8,
+ 0x229f43,
+ 0x50a07,
+ 0x224d03,
+ 0x2e9c43,
+ 0x25e043,
+ 0x2127c3,
+ 0x21f483,
+ 0x2304,
+ 0x1604,
+ 0xa9c4,
+ 0x225543,
+ 0x373d07,
+ 0x205b42,
+ 0x27c049,
+ 0x200ac2,
+ 0x38fe4b,
+ 0x2b038a,
+ 0x2e9f09,
+ 0x200542,
+ 0x22be06,
+ 0x3a0355,
+ 0x38ff95,
+ 0x25ab13,
+ 0x390513,
+ 0x20b602,
+ 0x20b605,
+ 0x20b60c,
+ 0x2833cb,
+ 0x251605,
+ 0x201182,
+ 0x30c842,
+ 0x36e406,
+ 0x200ec2,
+ 0x2da306,
+ 0x215ccd,
+ 0x2ca88c,
+ 0x3c8c84,
+ 0x200882,
+ 0x204e42,
+ 0x26a508,
+ 0x200202,
+ 0x2016c6,
+ 0x3a2fcf,
+ 0x2016d0,
+ 0x23a404,
+ 0x3a0515,
+ 0x25ac93,
+ 0x21e943,
+ 0x3541ca,
+ 0x392747,
+ 0x397ec9,
+ 0x30e4c7,
+ 0x327082,
+ 0x200282,
+ 0x3ceec6,
+ 0x2045c2,
+ 0x7ffc8,
+ 0x20a182,
+ 0x202a02,
+ 0x211907,
+ 0x398247,
+ 0x398251,
+ 0x2223c5,
+ 0x2223ce,
+ 0x22284f,
+ 0x2037c2,
+ 0x30ef87,
+ 0x225588,
+ 0x205f42,
+ 0x2272c2,
+ 0x212306,
+ 0x21230f,
+ 0x242910,
+ 0x232382,
+ 0x203702,
+ 0x2efdc8,
+ 0x207243,
+ 0x297948,
+ 0x2bbfcd,
+ 0x203703,
+ 0x3d3bc8,
+ 0x293e0f,
+ 0x2941ce,
+ 0x3e198a,
+ 0x2ee1d1,
+ 0x2ee650,
+ 0x22320d,
+ 0x22354c,
+ 0x3c5a07,
+ 0x354347,
+ 0x372049,
+ 0x21e742,
+ 0x202542,
+ 0x266e4c,
+ 0x26714b,
+ 0x202102,
+ 0x2db7c6,
+ 0x212fc2,
+ 0x200482,
+ 0x2b90c2,
+ 0x205842,
+ 0x235644,
+ 0x2456c7,
+ 0x20f1c2,
+ 0x24adc7,
+ 0x24d147,
+ 0x213682,
+ 0x215582,
+ 0x2508c5,
+ 0x201bc2,
+ 0x2dbd4e,
+ 0x2138cd,
+ 0x224d03,
+ 0x3b494e,
+ 0x2cda8d,
+ 0x332183,
+ 0x200d42,
+ 0x2958c4,
+ 0x29e2c2,
+ 0x220f42,
+ 0x3ac685,
+ 0x3b0dc7,
+ 0x254482,
+ 0x218b02,
+ 0x25b147,
+ 0x260588,
+ 0x262642,
+ 0x27b6c6,
+ 0x266ccc,
+ 0x26700b,
+ 0x202e42,
+ 0x27274f,
+ 0x272b10,
+ 0x272f0f,
+ 0x2732d5,
+ 0x273814,
+ 0x273d0e,
+ 0x27408e,
+ 0x27440f,
+ 0x2747ce,
+ 0x274b54,
+ 0x275053,
+ 0x27550d,
+ 0x289509,
+ 0x29be83,
+ 0x2038c2,
+ 0x35ed05,
+ 0x204b06,
+ 0x200382,
+ 0x36dc47,
+ 0x2e9c43,
+ 0x200642,
+ 0x3e7088,
+ 0x2ee411,
+ 0x2ee850,
+ 0x208102,
+ 0x29b207,
+ 0x203382,
+ 0x262807,
+ 0x208042,
+ 0x335309,
+ 0x36e3c7,
+ 0x28c948,
+ 0x3d1306,
+ 0x2fe243,
+ 0x39d7c5,
+ 0x22b342,
+ 0x2004c2,
+ 0x208a85,
+ 0x367d45,
+ 0x204442,
+ 0x25c083,
+ 0x349e07,
+ 0x3d1887,
+ 0x202d02,
+ 0x39a304,
+ 0x20d003,
+ 0x3d1d49,
+ 0x3db288,
+ 0x20b982,
+ 0x20fd02,
+ 0x243e47,
+ 0x2f04c5,
+ 0x237e48,
+ 0x350847,
+ 0x20e983,
+ 0x2fba46,
+ 0x22308d,
+ 0x22340c,
+ 0x39f706,
+ 0x203782,
+ 0x202c82,
+ 0x2026c2,
+ 0x293c8f,
+ 0x29408e,
+ 0x37bf87,
+ 0x205c02,
+ 0x219c05,
+ 0x219c06,
+ 0x21dfc2,
+ 0x20dec2,
+ 0x29cb06,
+ 0x210043,
+ 0x347146,
+ 0x2e34c5,
+ 0x2e34cd,
+ 0x2e3a55,
+ 0x2e4b0c,
+ 0x2e4e8d,
+ 0x2e51d2,
+ 0x20f782,
+ 0x27eec2,
+ 0x204342,
+ 0x217506,
+ 0x204346,
+ 0x43a8bec4,
+ 0x201242,
+ 0x204b86,
+ 0x214542,
+ 0x3d8045,
+ 0x202a42,
+ 0x2139c9,
+ 0x23388c,
+ 0x233bcb,
+ 0x2003c2,
+ 0x261708,
+ 0x20df02,
+ 0x200a82,
+ 0x283186,
+ 0x261c45,
+ 0x393507,
+ 0x3a81c5,
+ 0x26d105,
+ 0x2020c2,
+ 0x216342,
+ 0x20f102,
+ 0x2a10c7,
+ 0x301a0d,
+ 0x301d8c,
+ 0x24efc7,
+ 0x22e6c2,
+ 0x215502,
+ 0x3cf0c8,
+ 0x34a8c8,
+ 0x34d908,
+ 0x3c0384,
+ 0x2dc887,
+ 0x2ff703,
+ 0x253ac2,
+ 0x2043c2,
+ 0x302609,
+ 0x2336c7,
+ 0x202782,
+ 0x2837c5,
+ 0x285042,
+ 0x20e0c2,
+ 0x3095c3,
+ 0x3095c6,
+ 0x309742,
+ 0x30bd02,
+ 0x200402,
+ 0x3bd706,
+ 0x34ed07,
+ 0x21e202,
+ 0x200902,
+ 0x29778f,
+ 0x3b478d,
+ 0x38c84e,
+ 0x2cd90c,
+ 0x20a602,
+ 0x203342,
+ 0x3d1145,
+ 0x323f46,
+ 0x202682,
+ 0x206902,
+ 0x200682,
+ 0x2cdc04,
+ 0x2bbe44,
+ 0x358906,
+ 0x201782,
+ 0x28e207,
+ 0x248883,
+ 0x248888,
+ 0x2496c8,
+ 0x256887,
+ 0x3ab886,
+ 0x205f82,
+ 0x212f43,
+ 0x212f47,
+ 0x282d06,
+ 0x2d8485,
+ 0x285348,
+ 0x204942,
+ 0x38a4c7,
+ 0x207802,
+ 0x29ec82,
+ 0x203682,
+ 0x201889,
+ 0x2088c2,
+ 0x14cc8,
+ 0x200e02,
+ 0x2aa083,
+ 0x200e87,
+ 0x202602,
+ 0x233a0c,
+ 0x233d0b,
+ 0x39f786,
+ 0x20e385,
+ 0x43e27303,
+ 0x201c82,
+ 0x200fc2,
+ 0x2d5146,
+ 0x243783,
+ 0x354547,
+ 0x26d0c2,
+ 0x2008c2,
+ 0x3a01d5,
+ 0x390155,
+ 0x25a9d3,
+ 0x390693,
+ 0x277487,
+ 0x287591,
+ 0x288f50,
+ 0x296b12,
+ 0x299e51,
+ 0x2ac948,
+ 0x3b9dd0,
+ 0x2ac94f,
+ 0x2b0153,
+ 0x37b092,
+ 0x39b750,
+ 0x2c2acf,
+ 0x2c6152,
+ 0x2c7851,
+ 0x2c8dd3,
+ 0x2ccf12,
+ 0x2d498f,
+ 0x2e314e,
+ 0x2e4692,
+ 0x2e9d11,
+ 0x2ea3cf,
+ 0x2ed08e,
+ 0x2ed891,
+ 0x2f2810,
+ 0x2f3b12,
+ 0x2f6c51,
+ 0x2fda90,
+ 0x3064cf,
+ 0x307691,
+ 0x309ad0,
+ 0x30c9c6,
+ 0x30d987,
+ 0x311047,
+ 0x205dc2,
+ 0x292805,
+ 0x3dec07,
+ 0x26ca02,
+ 0x202d82,
+ 0x3cbe45,
+ 0x20a503,
+ 0x2718c6,
+ 0x301bcd,
+ 0x301f0c,
+ 0x204c02,
+ 0x20b48b,
+ 0x28328a,
+ 0x286d8a,
+ 0x227549,
+ 0x2d3d0b,
+ 0x300ccd,
+ 0x35098c,
+ 0x312e0a,
+ 0x36ee0c,
+ 0x3d4f8b,
+ 0x25144c,
+ 0x2813ce,
+ 0x28818b,
+ 0x2a724c,
+ 0x2ecd03,
+ 0x352f06,
+ 0x363742,
+ 0x308602,
+ 0x25f183,
+ 0x208602,
+ 0x23fa43,
+ 0x2d6ec6,
+ 0x273487,
+ 0x2d9706,
+ 0x3aefc8,
+ 0x349c88,
+ 0x321a86,
+ 0x212182,
+ 0x31378d,
+ 0x313acc,
+ 0x221947,
+ 0x317507,
+ 0x228282,
+ 0x21f182,
+ 0x212ec2,
+ 0x28f8c2,
+ 0x337216,
+ 0x33c315,
+ 0x33f8d6,
+ 0x3435d3,
+ 0x343c92,
+ 0x356513,
+ 0x3573d2,
+ 0x3bb24f,
+ 0x3caad8,
+ 0x3ce957,
+ 0x3cfb99,
+ 0x3d3318,
+ 0x3d3dd8,
+ 0x3d4957,
+ 0x3d8357,
+ 0x3d91d6,
+ 0x3df613,
+ 0x3dff95,
+ 0x3e0952,
+ 0x3e0dd3,
+ 0x1e702,
+ 0x4420f0c4,
+ 0x447c8bc8,
+ 0x2cc5,
+ 0x205842,
+ 0x2127c3,
+ 0x47f42,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x217083,
+ 0x2000c2,
+ 0x202ac2,
+ 0x456a2d45,
+ 0x45a3d685,
+ 0x45f6f186,
+ 0x7ffc8,
+ 0x462c9445,
+ 0x205842,
+ 0x201902,
+ 0x46730c85,
+ 0x46a91485,
+ 0x46e91f07,
+ 0x47358c49,
+ 0x4761d684,
+ 0x200382,
+ 0x200642,
+ 0x47a5c245,
+ 0x47ea2689,
+ 0x4836cc48,
+ 0x486c19c5,
+ 0x48b51107,
+ 0x48e1b008,
+ 0x4930d585,
+ 0x49623f46,
+ 0x49a531c9,
+ 0x49f7fbc8,
+ 0x4a2db448,
+ 0x4a6aa18a,
+ 0x4aa39104,
+ 0x4ae9cdc5,
+ 0x4b2b4708,
+ 0x4b654b45,
+ 0x21c142,
+ 0x4ba089c3,
+ 0x4beb4ec6,
+ 0x4c328ec8,
+ 0x4c746546,
+ 0x4cb4ee48,
+ 0x4cfb6006,
+ 0x4d3854c4,
+ 0x4d6048c2,
+ 0x4dee9287,
+ 0x4e2bcd44,
+ 0x4e68d7c7,
+ 0x4ebe8dc7,
+ 0x2003c2,
+ 0x4eead945,
+ 0x4f2854c4,
+ 0x4f7839c7,
+ 0x4fa48087,
+ 0x4fe95706,
+ 0x50218085,
+ 0x506a8b87,
+ 0x50ae8c88,
+ 0x50eb8c07,
+ 0x512bebc9,
+ 0x516e9a45,
+ 0x51b0fc07,
+ 0x51ea2386,
+ 0x2c68b,
+ 0x5236fc88,
+ 0x2289cd,
+ 0x284949,
+ 0x2a290b,
+ 0x2b0e8b,
+ 0x2b94cb,
+ 0x37880b,
+ 0x32414b,
+ 0x32440b,
+ 0x3248c9,
+ 0x32574b,
+ 0x325a0b,
+ 0x32680b,
+ 0x32740a,
+ 0x32794a,
+ 0x327f4c,
+ 0x32c2cb,
+ 0x32c80a,
+ 0x34144a,
+ 0x34bf0e,
+ 0x34cf0e,
+ 0x34d28a,
+ 0x34f70a,
+ 0x35164b,
+ 0x35190b,
+ 0x35240b,
+ 0x3767cb,
+ 0x376dca,
+ 0x377a8b,
+ 0x377d4a,
+ 0x377fca,
+ 0x37824a,
+ 0x39b34b,
+ 0x3a228b,
+ 0x3a548e,
+ 0x3a580b,
+ 0x3acbcb,
+ 0x3add0b,
+ 0x3b1a8a,
+ 0x3b1d09,
+ 0x3b1f4a,
+ 0x3b3e8a,
+ 0x3ca4cb,
+ 0x3dd44b,
+ 0x3de4ca,
+ 0x3df04b,
+ 0x3e694b,
+ 0x3ef20b,
+ 0x52693288,
+ 0x52a99789,
+ 0x52eb0a49,
+ 0x532f7d08,
+ 0x358685,
+ 0x20c003,
+ 0x260a44,
+ 0x34f285,
+ 0x21d3c6,
+ 0x223cc5,
+ 0x299004,
+ 0x36db48,
+ 0x31e445,
+ 0x2a46c4,
+ 0x3d5f87,
+ 0x2afb4a,
+ 0x384c8a,
+ 0x37c087,
+ 0x329087,
+ 0x2f2d47,
+ 0x25c3c7,
+ 0x207505,
+ 0x224346,
+ 0x37bb87,
+ 0x3ce084,
+ 0x2ced86,
+ 0x3048c6,
+ 0x3cf605,
+ 0x3324c4,
+ 0x2ad586,
+ 0x2aed87,
+ 0x2301c6,
+ 0x318287,
+ 0x240903,
+ 0x3c6c46,
+ 0x220b05,
+ 0x292007,
+ 0x27ba0a,
+ 0x310484,
+ 0x21a988,
+ 0x2be509,
+ 0x3c0a07,
+ 0x3c9f86,
+ 0x26c248,
+ 0x3e9149,
+ 0x310504,
+ 0x282884,
+ 0x304b45,
+ 0x222c88,
+ 0x2e1b87,
+ 0x30bec9,
+ 0x2f0e88,
+ 0x319806,
+ 0x328986,
+ 0x2aadc8,
+ 0x375846,
+ 0x23d685,
+ 0x2957c6,
+ 0x28db88,
+ 0x293b86,
+ 0x26608b,
+ 0x29eb06,
+ 0x2ac4cd,
+ 0x3da785,
+ 0x2bcc06,
+ 0x21b0c5,
+ 0x304d09,
+ 0x2d86c7,
+ 0x219a88,
+ 0x3c0746,
+ 0x2ab709,
+ 0x2ca346,
+ 0x27b985,
+ 0x219186,
+ 0x2dd006,
+ 0x2e6089,
+ 0x2d1846,
+ 0x2c8a07,
+ 0x364e85,
+ 0x202a43,
+ 0x266205,
+ 0x39ea47,
+ 0x335ac6,
+ 0x3da689,
+ 0x36f186,
+ 0x295a06,
+ 0x24b3c9,
+ 0x2951c9,
+ 0x2b3587,
+ 0x3642c8,
+ 0x29df09,
+ 0x292488,
+ 0x3ed546,
+ 0x2eec45,
+ 0x3220ca,
+ 0x295a86,
+ 0x3cb586,
+ 0x2e91c5,
+ 0x25f988,
+ 0x35b587,
+ 0x2387ca,
+ 0x25c686,
+ 0x303605,
+ 0x30c706,
+ 0x2a3407,
+ 0x3c9e47,
+ 0x30eb45,
+ 0x27bb45,
+ 0x242786,
+ 0x246246,
+ 0x255046,
+ 0x2b4bc4,
+ 0x294549,
+ 0x29afc6,
+ 0x378bca,
+ 0x22de48,
+ 0x30f908,
+ 0x384c8a,
+ 0x23c3c5,
+ 0x2aecc5,
+ 0x3d2808,
+ 0x3206c8,
+ 0x248307,
+ 0x23c286,
+ 0x339dc8,
+ 0x3d7687,
+ 0x292b88,
+ 0x2d0286,
+ 0x296488,
+ 0x2a8046,
+ 0x359147,
+ 0x245906,
+ 0x2ad586,
+ 0x243aca,
+ 0x39f886,
+ 0x2eec49,
+ 0x3bd606,
+ 0x211a4a,
+ 0x3854c9,
+ 0x240c06,
+ 0x2d2544,
+ 0x35edcd,
+ 0x2912c7,
+ 0x3c7506,
+ 0x2db305,
+ 0x2ca3c5,
+ 0x39cd86,
+ 0x2cc849,
+ 0x2dddc7,
+ 0x28ea46,
+ 0x2c9b06,
+ 0x299089,
+ 0x23d5c4,
+ 0x240d04,
+ 0x20bec8,
+ 0x35dac6,
+ 0x3dde08,
+ 0x219108,
+ 0x264787,
+ 0x3bcd49,
+ 0x3d0487,
+ 0x2c930a,
+ 0x3030cf,
+ 0x39b0ca,
+ 0x3d0f45,
+ 0x28ddc5,
+ 0x218f45,
+ 0x23a347,
+ 0x28f6c3,
+ 0x3644c8,
+ 0x236606,
+ 0x236709,
+ 0x2fc746,
+ 0x2e6a47,
+ 0x2ab4c9,
+ 0x219988,
+ 0x304ec7,
+ 0x322683,
+ 0x358705,
+ 0x2a2f45,
+ 0x2b4a0b,
+ 0x254c04,
+ 0x37a8c4,
+ 0x28b806,
+ 0x322847,
+ 0x39d30a,
+ 0x259587,
+ 0x2297c7,
+ 0x291485,
+ 0x3d9745,
+ 0x29e409,
+ 0x2ad586,
+ 0x25940d,
+ 0x346cc5,
+ 0x2b4c83,
+ 0x21df03,
+ 0x2fcac5,
+ 0x33a6c5,
+ 0x26c248,
+ 0x28f207,
+ 0x24e486,
+ 0x2b06c6,
+ 0x2316c5,
+ 0x23e987,
+ 0x331047,
+ 0x260d87,
+ 0x29ce4a,
+ 0x3c6d08,
+ 0x2b4bc4,
+ 0x293907,
+ 0x290647,
+ 0x360686,
+ 0x2a76c7,
+ 0x2f50c8,
+ 0x278fc8,
+ 0x280b46,
+ 0x3292c8,
+ 0x22ec44,
+ 0x37bb86,
+ 0x2693c6,
+ 0x38d946,
+ 0x20a246,
+ 0x2add04,
+ 0x25c486,
+ 0x2d9886,
+ 0x2aa686,
+ 0x20e506,
+ 0x3dac86,
+ 0x239a46,
+ 0x24e388,
+ 0x2cbd48,
+ 0x2ebec8,
+ 0x223ec8,
+ 0x3d2786,
+ 0x204005,
+ 0x372b86,
+ 0x2c1a45,
+ 0x32d207,
+ 0x280d85,
+ 0x215243,
+ 0x310c85,
+ 0x396884,
+ 0x3dadc5,
+ 0x20df03,
+ 0x2ca187,
+ 0x3ae008,
+ 0x318346,
+ 0x2c004d,
+ 0x28dd86,
+ 0x2a9c05,
+ 0x201883,
+ 0x2d6749,
+ 0x23d746,
+ 0x2a9146,
+ 0x21b404,
+ 0x39b047,
+ 0x3cdf86,
+ 0x303845,
+ 0x239803,
+ 0x3ec004,
+ 0x290806,
+ 0x224444,
+ 0x3c3448,
+ 0x3d8b09,
+ 0x281009,
+ 0x2b1d0a,
+ 0x25258d,
+ 0x3e7507,
+ 0x3d7086,
+ 0x216384,
+ 0x358c49,
+ 0x297d48,
+ 0x299606,
+ 0x246dc6,
+ 0x2a76c7,
+ 0x37aa06,
+ 0x21de46,
+ 0x3bd006,
+ 0x3e8e4a,
+ 0x21b008,
+ 0x2bae85,
+ 0x3866c9,
+ 0x3ccd0a,
+ 0x397988,
+ 0x2ae188,
+ 0x2a90c8,
+ 0x3296cc,
+ 0x3a2505,
+ 0x2b0948,
+ 0x2cfd86,
+ 0x2a3a06,
+ 0x2e0947,
+ 0x259485,
+ 0x295945,
+ 0x280ec9,
+ 0x20db47,
+ 0x2366c5,
+ 0x228e87,
+ 0x21df03,
+ 0x2e2545,
+ 0x22e248,
+ 0x294e47,
+ 0x2ae049,
+ 0x2d4205,
+ 0x36e684,
+ 0x31cf48,
+ 0x2bc287,
+ 0x305088,
+ 0x22c1c8,
+ 0x39e745,
+ 0x276dc6,
+ 0x2b07c6,
+ 0x35c509,
+ 0x2694c7,
+ 0x2c2306,
+ 0x3684c7,
+ 0x205383,
+ 0x21d684,
+ 0x22ed45,
+ 0x23eac4,
+ 0x38d244,
+ 0x293507,
+ 0x27a4c7,
+ 0x28ec04,
+ 0x2ade90,
+ 0x3868c7,
+ 0x3d9745,
+ 0x385f4c,
+ 0x207504,
+ 0x2bf3c8,
+ 0x359049,
+ 0x2c5ec6,
+ 0x31c0c8,
+ 0x205c04,
+ 0x28bb08,
+ 0x298b06,
+ 0x243948,
+ 0x2af346,
+ 0x31ffcb,
+ 0x3745c5,
+ 0x22ebc8,
+ 0x2186c4,
+ 0x3d8f4a,
+ 0x2ae049,
+ 0x3d6746,
+ 0x222f08,
+ 0x26a045,
+ 0x2d5cc4,
+ 0x2bf2c6,
+ 0x260c48,
+ 0x293288,
+ 0x3344c6,
+ 0x331c84,
+ 0x322046,
+ 0x3d0507,
+ 0x28d6c7,
+ 0x2a76cf,
+ 0x346087,
+ 0x39e187,
+ 0x36ca85,
+ 0x209e85,
+ 0x2b3249,
+ 0x31f7c6,
+ 0x292145,
+ 0x2954c7,
+ 0x2e4288,
+ 0x2244c5,
+ 0x245906,
+ 0x22dc88,
+ 0x34654a,
+ 0x24a588,
+ 0x29c887,
+ 0x303506,
+ 0x386686,
+ 0x2003c3,
+ 0x219d43,
+ 0x3ccec9,
+ 0x29dd89,
+ 0x2beac6,
+ 0x2d4205,
+ 0x329548,
+ 0x222f08,
+ 0x2ad1c8,
+ 0x3bd08b,
+ 0x2c0287,
+ 0x31c609,
+ 0x2a7948,
+ 0x34eb84,
+ 0x3d6a48,
+ 0x2a07c9,
+ 0x2c2605,
+ 0x2b83c7,
+ 0x21d705,
+ 0x293188,
+ 0x2a2bcb,
+ 0x2a88d0,
+ 0x2bc845,
+ 0x21860c,
+ 0x24e645,
+ 0x288a83,
+ 0x2d4d46,
+ 0x2d8d84,
+ 0x299486,
+ 0x2aed87,
+ 0x223ec4,
+ 0x2ce548,
+ 0x36438d,
+ 0x341805,
+ 0x22ebc4,
+ 0x2ba544,
+ 0x39dec9,
+ 0x2ac208,
+ 0x32f6c7,
+ 0x298b88,
+ 0x294608,
+ 0x28ed45,
+ 0x3cd207,
+ 0x28ecc7,
+ 0x2369c7,
+ 0x27bb49,
+ 0x288849,
+ 0x221346,
+ 0x223746,
+ 0x295586,
+ 0x323a45,
+ 0x3c6a84,
+ 0x3d4386,
+ 0x3d88c6,
+ 0x28ed88,
+ 0x2a30cb,
+ 0x310347,
+ 0x216384,
+ 0x3cdec6,
+ 0x219447,
+ 0x239645,
+ 0x286745,
+ 0x269984,
+ 0x2887c6,
+ 0x3d4408,
+ 0x358c49,
+ 0x25f5c6,
+ 0x297b48,
+ 0x303906,
+ 0x364dc8,
+ 0x2dadcc,
+ 0x28ec06,
+ 0x2a98cd,
+ 0x2a9d4b,
+ 0x2c8ac5,
+ 0x331187,
+ 0x2d1946,
+ 0x3c9d08,
+ 0x2213c9,
+ 0x2c0588,
+ 0x3d9745,
+ 0x2a82c7,
+ 0x292588,
+ 0x371d89,
+ 0x38eb86,
+ 0x262d4a,
+ 0x3c9a88,
+ 0x2c03cb,
+ 0x2de38c,
+ 0x28bc08,
+ 0x28fec6,
+ 0x3725c8,
+ 0x3461c7,
+ 0x2a8589,
+ 0x2a258d,
+ 0x2ad486,
+ 0x3049c8,
+ 0x2cbc09,
+ 0x2d7488,
+ 0x296588,
+ 0x2da48c,
+ 0x2dc187,
+ 0x2dd187,
+ 0x27b985,
+ 0x2cf707,
+ 0x2e4148,
+ 0x2bf346,
+ 0x25f44c,
+ 0x306948,
+ 0x2e7608,
+ 0x220846,
+ 0x30aa07,
+ 0x221544,
+ 0x223ec8,
+ 0x321b8c,
+ 0x29aa0c,
+ 0x3d0fc5,
+ 0x3cf687,
+ 0x331c06,
+ 0x30a986,
+ 0x38be48,
+ 0x225804,
+ 0x2301cb,
+ 0x374dcb,
+ 0x303506,
+ 0x364207,
+ 0x374845,
+ 0x2827c5,
+ 0x230306,
+ 0x26a005,
+ 0x254bc5,
+ 0x2e5ec7,
+ 0x20df09,
+ 0x203a84,
+ 0x248c45,
+ 0x309505,
+ 0x217f48,
+ 0x35de45,
+ 0x2d4649,
+ 0x2c0cc7,
+ 0x2c0ccb,
+ 0x302106,
+ 0x24e0c9,
+ 0x332408,
+ 0x289985,
+ 0x236ac8,
+ 0x288888,
+ 0x3b5207,
+ 0x298907,
+ 0x293589,
+ 0x243887,
+ 0x29b5c9,
+ 0x2bdbcc,
+ 0x2beac8,
+ 0x2de1c9,
+ 0x3a1407,
+ 0x2946c9,
+ 0x3e1347,
+ 0x2de488,
+ 0x3e1545,
+ 0x37bb06,
+ 0x2db348,
+ 0x2ec7c8,
+ 0x3ccbc9,
+ 0x254c07,
+ 0x2b1f05,
+ 0x207c09,
+ 0x36a346,
+ 0x2a2384,
+ 0x30ce06,
+ 0x328d48,
+ 0x23da47,
+ 0x2a32c8,
+ 0x329389,
+ 0x323307,
+ 0x2ad306,
+ 0x331244,
+ 0x310d09,
+ 0x3cd088,
+ 0x220707,
+ 0x297346,
+ 0x2a3006,
+ 0x3cb504,
+ 0x2fb8c6,
+ 0x207cc3,
+ 0x374149,
+ 0x374586,
+ 0x2bce85,
+ 0x2b06c6,
+ 0x20e685,
+ 0x292a08,
+ 0x204f87,
+ 0x247806,
+ 0x330cc6,
+ 0x30f908,
+ 0x2b33c7,
+ 0x2ad4c5,
+ 0x2adc88,
+ 0x3dd848,
+ 0x3c9a88,
+ 0x24e505,
+ 0x37bb86,
+ 0x280dc9,
+ 0x35c384,
+ 0x20e50b,
+ 0x21db4b,
+ 0x2bad89,
+ 0x21df03,
+ 0x267ec5,
+ 0x338106,
+ 0x250248,
+ 0x3a7644,
+ 0x318346,
+ 0x29cf89,
+ 0x2c6c05,
+ 0x2e5e06,
+ 0x2bc286,
+ 0x222f04,
+ 0x2ae30a,
+ 0x2bcdc8,
+ 0x2ec7c6,
+ 0x379ac5,
+ 0x383187,
+ 0x33a907,
+ 0x276dc4,
+ 0x21dd87,
+ 0x2c9304,
+ 0x2f0f06,
+ 0x205bc3,
+ 0x27bb45,
+ 0x2c4ac5,
+ 0x3e1708,
+ 0x293ac5,
+ 0x28e949,
+ 0x223d07,
+ 0x223d0b,
+ 0x2b4ccc,
+ 0x2b52ca,
+ 0x351107,
+ 0x208c03,
+ 0x28d0c8,
+ 0x240cc5,
+ 0x224545,
+ 0x3587c4,
+ 0x2de386,
+ 0x359046,
+ 0x2fb907,
+ 0x26458b,
+ 0x2add04,
+ 0x36cbc4,
+ 0x2e1404,
+ 0x2e5bc6,
+ 0x223ec4,
+ 0x222d88,
+ 0x3585c5,
+ 0x252bc5,
+ 0x2ad107,
+ 0x331289,
+ 0x33a6c5,
+ 0x39cd8a,
+ 0x3de289,
+ 0x2a678a,
+ 0x3e8f89,
+ 0x312c84,
+ 0x2c9bc5,
+ 0x37ab08,
+ 0x383a8b,
+ 0x304b45,
+ 0x219286,
+ 0x24d204,
+ 0x28ee86,
+ 0x323189,
+ 0x219547,
+ 0x36f348,
+ 0x252906,
+ 0x3d0487,
+ 0x293288,
+ 0x380146,
+ 0x3d6e04,
+ 0x26ae87,
+ 0x390e85,
+ 0x39f0c7,
+ 0x205b04,
+ 0x2d18c6,
+ 0x33aa48,
+ 0x2a9f08,
+ 0x31a707,
+ 0x385088,
+ 0x2a8105,
+ 0x21dc84,
+ 0x384b88,
+ 0x320fc4,
+ 0x218ec5,
+ 0x38bc44,
+ 0x3d7787,
+ 0x29b087,
+ 0x294808,
+ 0x305206,
+ 0x293a45,
+ 0x28e748,
+ 0x24a788,
+ 0x2b1c49,
+ 0x21de46,
+ 0x238848,
+ 0x3d8dca,
+ 0x2396c8,
+ 0x30d585,
+ 0x372d86,
+ 0x3de148,
+ 0x2a838a,
+ 0x35bb07,
+ 0x298185,
+ 0x2a4d88,
+ 0x270504,
+ 0x25fa06,
+ 0x2dd808,
+ 0x3dac86,
+ 0x33b048,
+ 0x231cc7,
+ 0x3d5e86,
+ 0x2d2544,
+ 0x34c407,
+ 0x2cc184,
+ 0x323147,
+ 0x2eff4d,
+ 0x248385,
+ 0x2cc64b,
+ 0x29ac86,
+ 0x261808,
+ 0x2ce504,
+ 0x255246,
+ 0x290806,
+ 0x372907,
+ 0x2a958d,
+ 0x308a87,
+ 0x2cd508,
+ 0x3b4dc5,
+ 0x29e5c8,
+ 0x2e1b06,
+ 0x2a8188,
+ 0x23f1c6,
+ 0x385cc7,
+ 0x2e93c9,
+ 0x35b387,
+ 0x2998c8,
+ 0x26e5c5,
+ 0x231748,
+ 0x30a8c5,
+ 0x245845,
+ 0x370505,
+ 0x2191c3,
+ 0x20a2c4,
+ 0x239785,
+ 0x2531c9,
+ 0x37b946,
+ 0x2f51c8,
+ 0x249b85,
+ 0x2cf5c7,
+ 0x2d89ca,
+ 0x2e5d49,
+ 0x2dcf0a,
+ 0x2ebf48,
+ 0x228ccc,
+ 0x29554d,
+ 0x303b03,
+ 0x33af48,
+ 0x3ebfc5,
+ 0x346306,
+ 0x219806,
+ 0x35ea85,
+ 0x3685c9,
+ 0x208b85,
+ 0x28e748,
+ 0x268e86,
+ 0x370d06,
+ 0x2b3cc9,
+ 0x26ba87,
+ 0x2a2e86,
+ 0x2d8948,
+ 0x38d848,
+ 0x2f7f07,
+ 0x2e62ce,
+ 0x2e1d45,
+ 0x371c85,
+ 0x3dab88,
+ 0x3327c7,
+ 0x20df82,
+ 0x2da144,
+ 0x29938a,
+ 0x2207c8,
+ 0x2889c6,
+ 0x2ab608,
+ 0x2b07c6,
+ 0x209d08,
+ 0x2c2308,
+ 0x245804,
+ 0x2cf985,
+ 0x773104,
+ 0x773104,
+ 0x773104,
+ 0x203e03,
+ 0x2038c6,
+ 0x28ec06,
+ 0x2af74c,
+ 0x205c43,
+ 0x205b06,
+ 0x21b284,
+ 0x23d6c8,
+ 0x29cdc5,
+ 0x299486,
+ 0x2b4808,
+ 0x2ecdc6,
+ 0x247786,
+ 0x3d6548,
+ 0x22edc7,
+ 0x243649,
+ 0x33824a,
+ 0x27a644,
+ 0x280d85,
+ 0x30be85,
+ 0x358a46,
+ 0x3e7546,
+ 0x3316c6,
+ 0x36a0c6,
+ 0x243784,
+ 0x24378b,
+ 0x23da44,
+ 0x24e245,
+ 0x2c1285,
+ 0x264846,
+ 0x3e9788,
+ 0x295407,
+ 0x374504,
+ 0x26f0c3,
+ 0x270005,
+ 0x30ccc7,
+ 0x29530b,
+ 0x3e1607,
+ 0x2b4708,
+ 0x2cfac7,
+ 0x27e146,
+ 0x284c08,
+ 0x2a6d4b,
+ 0x34f1c6,
+ 0x2103c9,
+ 0x2a6ec5,
+ 0x322683,
+ 0x2e5e06,
+ 0x231bc8,
+ 0x214283,
+ 0x2d1a03,
+ 0x293286,
+ 0x2b07c6,
+ 0x37e60a,
+ 0x28ff05,
+ 0x29064b,
+ 0x2b060b,
+ 0x24da83,
+ 0x20a8c3,
+ 0x2c9284,
+ 0x2d8807,
+ 0x231c44,
+ 0x23d6c4,
+ 0x2cfc04,
+ 0x2399c8,
+ 0x379a08,
+ 0x219f49,
+ 0x2e9ac8,
+ 0x3c7787,
+ 0x20e506,
+ 0x2f4e0f,
+ 0x2e1e86,
+ 0x2eb284,
+ 0x37984a,
+ 0x30cbc7,
+ 0x2cc286,
+ 0x2a23c9,
+ 0x219ec5,
+ 0x246305,
+ 0x21a006,
+ 0x231883,
+ 0x270549,
+ 0x21b186,
+ 0x329149,
+ 0x39d306,
+ 0x27bb45,
+ 0x3d13c5,
+ 0x203383,
+ 0x3cc588,
+ 0x32f887,
+ 0x236604,
+ 0x23d548,
+ 0x2a3784,
+ 0x320ec6,
+ 0x2d4d46,
+ 0x249406,
+ 0x22ea89,
+ 0x2244c5,
+ 0x2ad586,
+ 0x262689,
+ 0x2e1006,
+ 0x239a46,
+ 0x3afcc6,
+ 0x22e9c5,
+ 0x38bc46,
+ 0x385cc4,
+ 0x3e1545,
+ 0x2db344,
+ 0x2cec86,
+ 0x346c84,
+ 0x219543,
+ 0x297e05,
+ 0x23fb48,
+ 0x255787,
+ 0x3a76c9,
+ 0x298088,
+ 0x2aab91,
+ 0x2bc30a,
+ 0x303447,
+ 0x279306,
+ 0x21b284,
+ 0x2db448,
+ 0x2f6088,
+ 0x2aad4a,
+ 0x2d440d,
+ 0x219186,
+ 0x3d6646,
+ 0x34c4c6,
+ 0x30e9c7,
+ 0x2cd5c5,
+ 0x3bcb07,
+ 0x23d605,
+ 0x2c0e04,
+ 0x347246,
+ 0x23c0c7,
+ 0x27024d,
+ 0x3de087,
+ 0x36da48,
+ 0x28ea49,
+ 0x372c86,
+ 0x38eb05,
+ 0x245404,
+ 0x328e46,
+ 0x3bcc46,
+ 0x220946,
+ 0x2abe88,
+ 0x233803,
+ 0x218183,
+ 0x384745,
+ 0x25c786,
+ 0x2c22c5,
+ 0x252b08,
+ 0x2aef4a,
+ 0x276ec4,
+ 0x23d6c8,
+ 0x2a90c8,
+ 0x39ec07,
+ 0x298789,
+ 0x2d6a88,
+ 0x2bec47,
+ 0x2d9a06,
+ 0x3dac8a,
+ 0x328ec8,
+ 0x31ce09,
+ 0x2ac2c8,
+ 0x21d009,
+ 0x2791c7,
+ 0x2cca05,
+ 0x3bd286,
+ 0x2bf1c8,
+ 0x28a308,
+ 0x2662c8,
+ 0x341948,
+ 0x24e245,
+ 0x20bcc4,
+ 0x23dd08,
+ 0x24cf84,
+ 0x3e8d84,
+ 0x27bb45,
+ 0x2a4707,
+ 0x331049,
+ 0x372707,
+ 0x238885,
+ 0x28ba06,
+ 0x3792c6,
+ 0x210504,
+ 0x2b3fc6,
+ 0x290a84,
+ 0x28b0c6,
+ 0x330e06,
+ 0x2140c6,
+ 0x3d9745,
+ 0x2529c7,
+ 0x208c03,
+ 0x270d09,
+ 0x30f708,
+ 0x23d544,
+ 0x358b4d,
+ 0x2aa008,
+ 0x3012c8,
+ 0x31cd86,
+ 0x2e94c9,
+ 0x2e5d49,
+ 0x322e85,
+ 0x2af04a,
+ 0x281a0a,
+ 0x28e44c,
+ 0x28e5c6,
+ 0x28ccc6,
+ 0x2e2486,
+ 0x3ac749,
+ 0x346546,
+ 0x2b3406,
+ 0x208c46,
+ 0x223ec8,
+ 0x24a586,
+ 0x2eaa4b,
+ 0x2a4885,
+ 0x252bc5,
+ 0x28d7c5,
+ 0x20bc46,
+ 0x219143,
+ 0x249386,
+ 0x3de007,
+ 0x2db305,
+ 0x28c085,
+ 0x2ca3c5,
+ 0x2f9a46,
+ 0x322f44,
+ 0x336946,
+ 0x2a0b09,
+ 0x20bacc,
+ 0x2c0b48,
+ 0x260bc4,
+ 0x37fac6,
+ 0x29ad86,
+ 0x231bc8,
+ 0x222f08,
+ 0x20b9c9,
+ 0x383187,
+ 0x35d809,
+ 0x283886,
+ 0x219104,
+ 0x20fd44,
+ 0x293884,
+ 0x293288,
+ 0x330e8a,
+ 0x33a646,
+ 0x36c947,
+ 0x39f347,
+ 0x24e1c5,
+ 0x2b6904,
+ 0x2a0786,
+ 0x2cd606,
+ 0x205083,
+ 0x30f547,
+ 0x22c0c8,
+ 0x322fca,
+ 0x3cf988,
+ 0x34ee48,
+ 0x346cc5,
+ 0x229005,
+ 0x310445,
+ 0x24e586,
+ 0x250fc6,
+ 0x3e1845,
+ 0x374389,
+ 0x2b670c,
+ 0x34a587,
+ 0x2aadc8,
+ 0x295dc5,
+ 0x773104,
+ 0x2bb4c4,
+ 0x294f84,
+ 0x24b586,
+ 0x2b150e,
+ 0x246387,
+ 0x301285,
+ 0x35c30c,
+ 0x2a3647,
+ 0x23c047,
+ 0x247a89,
+ 0x21aa49,
+ 0x298185,
+ 0x30f708,
+ 0x280dc9,
+ 0x3c9945,
+ 0x2db248,
+ 0x2e8e86,
+ 0x384e06,
+ 0x3854c4,
+ 0x31c7c8,
+ 0x252483,
+ 0x2034c4,
+ 0x270085,
+ 0x3a4807,
+ 0x3235c5,
+ 0x3d8c89,
+ 0x39138d,
+ 0x2b2246,
+ 0x3d5504,
+ 0x23c208,
+ 0x20dd4a,
+ 0x3a9947,
+ 0x34a405,
+ 0x203503,
+ 0x2b07ce,
+ 0x3cc68c,
+ 0x397a87,
+ 0x2b16c7,
+ 0x4dba3607,
+ 0x2b4c6,
+ 0x2c684,
+ 0x205b43,
+ 0x346585,
+ 0x294f85,
+ 0x2ab9c8,
+ 0x2a8f09,
+ 0x260ac6,
+ 0x231c44,
+ 0x303386,
+ 0x38d60b,
+ 0x2e00cc,
+ 0x267c47,
+ 0x2ead05,
+ 0x3dd748,
+ 0x2f7cc5,
+ 0x379847,
+ 0x2e9287,
+ 0x252485,
+ 0x219143,
+ 0x245ac4,
+ 0x328c05,
+ 0x203985,
+ 0x203986,
+ 0x2a0588,
+ 0x23c0c7,
+ 0x219b06,
+ 0x3cb406,
+ 0x370446,
+ 0x2d1a49,
+ 0x3cd307,
+ 0x260946,
+ 0x2e0246,
+ 0x239006,
+ 0x2bcd05,
+ 0x20d646,
+ 0x3b5c05,
+ 0x35dec8,
+ 0x2a434b,
+ 0x2a0106,
+ 0x39f384,
+ 0x23a1c9,
+ 0x223d04,
+ 0x2e8e08,
+ 0x311707,
+ 0x296484,
+ 0x2d5ec8,
+ 0x2dca44,
+ 0x2bcd44,
+ 0x23d485,
+ 0x341846,
+ 0x239907,
+ 0x22eb83,
+ 0x2ad3c5,
+ 0x33ecc4,
+ 0x371cc6,
+ 0x322f08,
+ 0x384f85,
+ 0x2a4009,
+ 0x207e05,
+ 0x205b08,
+ 0x35c1c7,
+ 0x374688,
+ 0x2d5b07,
+ 0x39e249,
+ 0x25c306,
+ 0x3a0fc6,
+ 0x208c44,
+ 0x20e445,
+ 0x3dce8c,
+ 0x28d7c7,
+ 0x28dc87,
+ 0x3e7188,
+ 0x2b2246,
+ 0x3ddf44,
+ 0x31da44,
+ 0x293409,
+ 0x2e2586,
+ 0x29e487,
+ 0x372a44,
+ 0x2b40c6,
+ 0x3d22c5,
+ 0x2e9107,
+ 0x2ea9c6,
+ 0x262c09,
+ 0x31f9c7,
+ 0x2a76c7,
+ 0x2b3b46,
+ 0x297285,
+ 0x291a88,
+ 0x21b008,
+ 0x375b46,
+ 0x384fc5,
+ 0x2dedc6,
+ 0x203e43,
+ 0x2ab849,
+ 0x33144e,
+ 0x2d5848,
+ 0x2a3888,
+ 0x37594b,
+ 0x2a4246,
+ 0x39f244,
+ 0x247784,
+ 0x33154a,
+ 0x218507,
+ 0x260a05,
+ 0x2103c9,
+ 0x2d9945,
+ 0x3e8dc7,
+ 0x245b84,
+ 0x2900c7,
+ 0x219008,
+ 0x3c0ac6,
+ 0x2d6fc9,
+ 0x2d6b8a,
+ 0x218486,
+ 0x2a9b46,
+ 0x2c1205,
+ 0x3a5dc5,
+ 0x3a9647,
+ 0x251a88,
+ 0x3d2208,
+ 0x245806,
+ 0x3d1445,
+ 0x3e72ce,
+ 0x2b4bc4,
+ 0x2ab945,
+ 0x28b389,
+ 0x31f5c8,
+ 0x29c7c6,
+ 0x2ad78c,
+ 0x2aeb50,
+ 0x2b114f,
+ 0x2b3148,
+ 0x351107,
+ 0x3d9745,
+ 0x239785,
+ 0x239789,
+ 0x2a4f89,
+ 0x322146,
+ 0x304bc7,
+ 0x38bd45,
+ 0x248309,
+ 0x360706,
+ 0x34638d,
+ 0x293749,
+ 0x23d6c4,
+ 0x2d5048,
+ 0x23ddc9,
+ 0x33a806,
+ 0x28d2c5,
+ 0x3a0fc6,
+ 0x36f209,
+ 0x36fb08,
+ 0x204005,
+ 0x2a0504,
+ 0x2ad94b,
+ 0x33a6c5,
+ 0x2502c6,
+ 0x295886,
+ 0x25d146,
+ 0x24e80b,
+ 0x2a4109,
+ 0x3e1485,
+ 0x32d107,
+ 0x2bc286,
+ 0x261986,
+ 0x294d08,
+ 0x2d9b09,
+ 0x36d80c,
+ 0x30cac8,
+ 0x31bb06,
+ 0x3344c3,
+ 0x235f06,
+ 0x240c45,
+ 0x291188,
+ 0x3d0e46,
+ 0x304f88,
+ 0x259605,
+ 0x26bf45,
+ 0x2ddf88,
+ 0x383487,
+ 0x219747,
+ 0x2fb907,
+ 0x31c0c8,
+ 0x351248,
+ 0x2f5f86,
+ 0x2ceac7,
+ 0x21d547,
+ 0x39dfca,
+ 0x205cc3,
+ 0x20bc46,
+ 0x260d05,
+ 0x2854c4,
+ 0x28ea49,
+ 0x39e1c4,
+ 0x200e84,
+ 0x2af3c4,
+ 0x2b16cb,
+ 0x32f7c7,
+ 0x2f9a05,
+ 0x2a7e08,
+ 0x28ba06,
+ 0x28ba08,
+ 0x28fe46,
+ 0x29d2c5,
+ 0x29d805,
+ 0x2a1486,
+ 0x276c48,
+ 0x2a2308,
+ 0x28ec06,
+ 0x2a7c4f,
+ 0x2ab310,
+ 0x3da785,
+ 0x208c03,
+ 0x286385,
+ 0x31c548,
+ 0x2a4e89,
+ 0x3c9a88,
+ 0x21b288,
+ 0x263f08,
+ 0x32f887,
+ 0x28b6c9,
+ 0x305188,
+ 0x3c8fc4,
+ 0x2af248,
+ 0x218009,
+ 0x2cf047,
+ 0x39eb84,
+ 0x3727c8,
+ 0x25278a,
+ 0x32f346,
+ 0x219186,
+ 0x21dd09,
+ 0x2aed87,
+ 0x2e68c8,
+ 0x245c08,
+ 0x3cbac8,
+ 0x2775c5,
+ 0x348d85,
+ 0x252bc5,
+ 0x294f45,
+ 0x2cba47,
+ 0x21dcc5,
+ 0x2db305,
+ 0x21da06,
+ 0x3c99c7,
+ 0x3839c7,
+ 0x252a86,
+ 0x2ec485,
+ 0x2502c6,
+ 0x205005,
+ 0x36d588,
+ 0x320644,
+ 0x2e1086,
+ 0x398084,
+ 0x2d5cc8,
+ 0x2e118a,
+ 0x28f20c,
+ 0x2afd05,
+ 0x30ea86,
+ 0x36d9c6,
+ 0x3b6b46,
+ 0x31bb84,
+ 0x3d2b45,
+ 0x28f707,
+ 0x2aee09,
+ 0x2e6187,
+ 0x773104,
+ 0x773104,
+ 0x32f645,
+ 0x30e584,
+ 0x2acf4a,
+ 0x28b886,
+ 0x2ddf04,
+ 0x3cf605,
+ 0x2cae05,
+ 0x2cd504,
+ 0x2954c7,
+ 0x207d87,
+ 0x2e5bc8,
+ 0x2deec8,
+ 0x204009,
+ 0x320fc8,
+ 0x299a0b,
+ 0x2398c4,
+ 0x34a4c5,
+ 0x2921c5,
+ 0x2fb889,
+ 0x2d9b09,
+ 0x23a0c8,
+ 0x2f0d08,
+ 0x264844,
+ 0x29adc5,
+ 0x20c003,
+ 0x358a05,
+ 0x2ad606,
+ 0x2a8d4c,
+ 0x21b086,
+ 0x28d1c6,
+ 0x29ca45,
+ 0x2f9ac8,
+ 0x2e0a86,
+ 0x279486,
+ 0x219186,
+ 0x22e80c,
+ 0x282384,
+ 0x37058a,
+ 0x29c988,
+ 0x2a8b87,
+ 0x33ebc6,
+ 0x260b87,
+ 0x302f85,
+ 0x297346,
+ 0x361386,
+ 0x37b807,
+ 0x255844,
+ 0x3d7885,
+ 0x28b384,
+ 0x2c0e87,
+ 0x28b5c8,
+ 0x28cb4a,
+ 0x292407,
+ 0x2bc907,
+ 0x351087,
+ 0x2f7e09,
+ 0x2a8d4a,
+ 0x232443,
+ 0x255745,
+ 0x214103,
+ 0x2cfc49,
+ 0x231e08,
+ 0x36ca87,
+ 0x3c9b89,
+ 0x21b106,
+ 0x2050c8,
+ 0x2ca105,
+ 0x24a88a,
+ 0x3a8289,
+ 0x280a09,
+ 0x2e0947,
+ 0x2f6189,
+ 0x213fc8,
+ 0x3d6c46,
+ 0x30ec48,
+ 0x28c3c7,
+ 0x243887,
+ 0x3de287,
+ 0x2e8c88,
+ 0x37f046,
+ 0x252545,
+ 0x28f707,
+ 0x2a9648,
+ 0x3703c4,
+ 0x378a84,
+ 0x2a2d87,
+ 0x2c2687,
+ 0x280c4a,
+ 0x3d6bc6,
+ 0x3d2e4a,
+ 0x2da087,
+ 0x2b4987,
+ 0x3d7944,
+ 0x29b684,
+ 0x2e9006,
+ 0x3cd884,
+ 0x3cd88c,
+ 0x311645,
+ 0x218e49,
+ 0x205c84,
+ 0x2cd5c5,
+ 0x20dcc8,
+ 0x2a23c5,
+ 0x39cd86,
+ 0x2a50c4,
+ 0x2a5fca,
+ 0x2c1f06,
+ 0x3513ca,
+ 0x2b8c07,
+ 0x2a3405,
+ 0x231885,
+ 0x24e20a,
+ 0x28a245,
+ 0x239746,
+ 0x24cf84,
+ 0x2c9406,
+ 0x3a9705,
+ 0x3d0f06,
+ 0x31a70c,
+ 0x36464a,
+ 0x281b04,
+ 0x20e506,
+ 0x2aed87,
+ 0x2ea944,
+ 0x223ec8,
+ 0x3ab986,
+ 0x39f1c9,
+ 0x37d709,
+ 0x2bebc9,
+ 0x20e6c6,
+ 0x28c4c6,
+ 0x30ed87,
+ 0x3742c8,
+ 0x28c2c9,
+ 0x32f7c7,
+ 0x2a7f86,
+ 0x3d0507,
+ 0x34c385,
+ 0x2b4bc4,
+ 0x30e947,
+ 0x21d705,
+ 0x2992c5,
+ 0x393747,
+ 0x252348,
+ 0x3dd6c6,
+ 0x2aa4cd,
+ 0x2abbcf,
+ 0x2b060d,
+ 0x21dc04,
+ 0x23fc46,
+ 0x2ed548,
+ 0x208c05,
+ 0x24e6c8,
+ 0x3b50ca,
+ 0x23d6c4,
+ 0x2cbec6,
+ 0x2b6187,
+ 0x2cde87,
+ 0x22ee89,
+ 0x30ec05,
+ 0x2cd504,
+ 0x2cf8ca,
+ 0x2d6649,
+ 0x2f6287,
+ 0x2aa786,
+ 0x33a806,
+ 0x29ad06,
+ 0x26af46,
+ 0x35a38f,
+ 0x2ed409,
+ 0x24a586,
+ 0x26be86,
+ 0x237789,
+ 0x2cebc7,
+ 0x20ae43,
+ 0x22e986,
+ 0x219d43,
+ 0x35e948,
+ 0x255107,
+ 0x2b3349,
+ 0x2b4588,
+ 0x219888,
+ 0x254d46,
+ 0x22af49,
+ 0x35d745,
+ 0x235e44,
+ 0x2ccac7,
+ 0x3ac7c5,
+ 0x21dc04,
+ 0x3e75c8,
+ 0x2187c4,
+ 0x2ce907,
+ 0x3adf86,
+ 0x242845,
+ 0x2ac2c8,
+ 0x33a6cb,
+ 0x30fc07,
+ 0x24e486,
+ 0x2e1f04,
+ 0x3b5f86,
+ 0x27bb45,
+ 0x21d705,
+ 0x291809,
+ 0x2950c9,
+ 0x2438c4,
+ 0x243905,
+ 0x20e545,
+ 0x24a706,
+ 0x30f808,
+ 0x2d9286,
+ 0x22bf0b,
+ 0x2c5d4a,
+ 0x2d5c05,
+ 0x29d886,
+ 0x236305,
+ 0x3c5b45,
+ 0x2a9247,
+ 0x20bec8,
+ 0x276cc4,
+ 0x25be46,
+ 0x2a2386,
+ 0x214187,
+ 0x322644,
+ 0x290806,
+ 0x23a445,
+ 0x23a449,
+ 0x28c6c4,
+ 0x30bfc9,
+ 0x28ec06,
+ 0x2dc248,
+ 0x20e545,
+ 0x39f445,
+ 0x3d0f06,
+ 0x36d709,
+ 0x21aa49,
+ 0x28d246,
+ 0x31f6c8,
+ 0x35c408,
+ 0x2362c4,
+ 0x2d0084,
+ 0x2d0088,
+ 0x3c7608,
+ 0x35d909,
+ 0x2ad586,
+ 0x219186,
+ 0x339c8d,
+ 0x318346,
+ 0x2dac89,
+ 0x3bcf05,
+ 0x21a006,
+ 0x36fc88,
+ 0x336885,
+ 0x21d584,
+ 0x27bb45,
+ 0x294a08,
+ 0x2acd09,
+ 0x28b444,
+ 0x2d18c6,
+ 0x2eadca,
+ 0x397988,
+ 0x280dc9,
+ 0x28d90a,
+ 0x3c9b06,
+ 0x2abd88,
+ 0x379605,
+ 0x3b4c48,
+ 0x303005,
+ 0x21afc9,
+ 0x33c7c9,
+ 0x23bc42,
+ 0x2a6ec5,
+ 0x292286,
+ 0x28eb47,
+ 0x2854c5,
+ 0x33eac6,
+ 0x317308,
+ 0x2b2246,
+ 0x37a9c9,
+ 0x28dd86,
+ 0x294b88,
+ 0x2be0c5,
+ 0x24c706,
+ 0x385dc8,
+ 0x293288,
+ 0x2790c8,
+ 0x319888,
+ 0x20d644,
+ 0x223803,
+ 0x37ac04,
+ 0x292606,
+ 0x34c3c4,
+ 0x2a37c7,
+ 0x279389,
+ 0x2e1405,
+ 0x245c06,
+ 0x22e986,
+ 0x2a03cb,
+ 0x2cc1c6,
+ 0x237fc6,
+ 0x2e3fc8,
+ 0x328986,
+ 0x2a3203,
+ 0x207083,
+ 0x2b4bc4,
+ 0x238745,
+ 0x303747,
+ 0x28b5c8,
+ 0x28b5cf,
+ 0x28f60b,
+ 0x30f608,
+ 0x2d1946,
+ 0x30f90e,
+ 0x24e643,
+ 0x3036c4,
+ 0x2cc145,
+ 0x2cd386,
+ 0x2a088b,
+ 0x2a47c6,
+ 0x22dd09,
+ 0x242845,
+ 0x248a08,
+ 0x203cc8,
+ 0x21a90c,
+ 0x2b1706,
+ 0x358a46,
+ 0x2d4205,
+ 0x299688,
+ 0x28f205,
+ 0x34eb88,
+ 0x2adb0a,
+ 0x2b0a49,
+ 0x773104,
+ 0x2000c2,
+ 0x53a05842,
+ 0x200382,
+ 0x258104,
+ 0x2026c2,
+ 0x292e44,
+ 0x2048c2,
+ 0xbc03,
+ 0x2003c2,
+ 0x2036c2,
+ 0x7ffc8,
+ 0x45c4,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0xf002,
+ 0x58e02,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x6ca02,
+ 0x9e42,
+ 0x1b02,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x220743,
+ 0x29f804,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x2ef2c4,
+ 0x2e9c43,
+ 0x285787,
+ 0x219c03,
+ 0x20bc03,
+ 0x219d08,
+ 0x21f483,
+ 0x28aa0b,
+ 0x3041c3,
+ 0x216e06,
+ 0x208ec2,
+ 0x2ff38b,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x21f483,
+ 0x21ad03,
+ 0x207743,
+ 0x2000c2,
+ 0x7ffc8,
+ 0x232a05,
+ 0x21d788,
+ 0x34fd88,
+ 0x205842,
+ 0x354705,
+ 0x3d0647,
+ 0x203642,
+ 0x2ce747,
+ 0x200382,
+ 0x262447,
+ 0x22cf89,
+ 0x27c388,
+ 0x3cb949,
+ 0x212c82,
+ 0x203e87,
+ 0x392fc4,
+ 0x3d0707,
+ 0x2c5c47,
+ 0x26dc42,
+ 0x219c03,
+ 0x20f782,
+ 0x2048c2,
+ 0x2003c2,
+ 0x20f102,
+ 0x200902,
+ 0x2036c2,
+ 0x2eb705,
+ 0x212345,
+ 0x5842,
+ 0x24d03,
+ 0x229f43,
+ 0x224d03,
+ 0x219443,
+ 0x2e9c43,
+ 0x204203,
+ 0x2127c3,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x14fa46,
+ 0x566c744b,
+ 0x219c03,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0xca7c5,
+ 0x11643,
+ 0x101,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x21fc83,
+ 0x5706e786,
+ 0x5483,
+ 0x1739c5,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x7042,
+ 0x7ffc8,
+ 0x361c3,
+ 0xbc03,
+ 0x81983,
+ 0x51a44,
+ 0x1487dc4,
+ 0xf80c5,
+ 0x2000c2,
+ 0x32d4c4,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x240a03,
+ 0x235c45,
+ 0x25e043,
+ 0x2280c3,
+ 0x2127c3,
+ 0x25c743,
+ 0x21f483,
+ 0x217083,
+ 0x208d43,
+ 0x205ec3,
+ 0xc8bc3,
+ 0x5c2,
+ 0x47f42,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x2000c2,
+ 0x258843,
+ 0x205842,
+ 0xd02,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x2036c2,
+ 0x7ffc8,
+ 0x2e9c43,
+ 0x81983,
+ 0x7ffc8,
+ 0x81983,
+ 0x2c9ec3,
+ 0x229f43,
+ 0x23b4c4,
+ 0x224d03,
+ 0x2e9c43,
+ 0x203842,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x203842,
+ 0x2335c3,
+ 0x2127c3,
+ 0x21f483,
+ 0x2fe343,
+ 0x217083,
+ 0x2000c2,
+ 0x205842,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x216e05,
+ 0x157246,
+ 0x762c4,
+ 0x31384,
+ 0x29f804,
+ 0x208ec2,
+ 0x882,
+ 0x7ffc8,
+ 0xd02,
+ 0x58e02,
+ 0xfc2,
+ 0x2000c2,
+ 0x145d45,
+ 0x25388,
+ 0xf7c03,
+ 0x205842,
+ 0x48244,
+ 0x5c149406,
+ 0xc344,
+ 0xb2e8b,
+ 0x46a06,
+ 0x84447,
+ 0xb7ac9,
+ 0x224d03,
+ 0x573c8,
+ 0x573cb,
+ 0x5784b,
+ 0x585cb,
+ 0x5890b,
+ 0x58bcb,
+ 0x5900b,
+ 0xeb86,
+ 0x2e9c43,
+ 0x146bc5,
+ 0x172ec4,
+ 0x267c83,
+ 0x1196c7,
+ 0x15a2c6,
+ 0x12fc05,
+ 0x1cde04,
+ 0xf37c4,
+ 0x7f0c4,
+ 0x2127c3,
+ 0x8d346,
+ 0xf9304,
+ 0x81983,
+ 0x21f483,
+ 0x305744,
+ 0x1300c7,
+ 0x156e49,
+ 0xb2c48,
+ 0x1e3f05,
+ 0x1d3204,
+ 0x1d0844,
+ 0x172283,
+ 0x5b646,
+ 0x11448,
+ 0x198185,
+ 0x71c9,
+ 0x13803,
+ 0x10b2c6,
+ 0x145d45,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x20bc03,
+ 0x21f483,
+ 0x3041c3,
+ 0x208ec2,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258103,
+ 0x222d84,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2ef2c4,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x216e06,
+ 0x224d03,
+ 0x2e9c43,
+ 0x1d343,
+ 0x81983,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x145d45,
+ 0x84447,
+ 0x84c3,
+ 0x13803,
+ 0x7ffc8,
+ 0x2e9c43,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x979c3,
+ 0x2127c3,
+ 0x21f483,
+ 0x5f629f43,
+ 0x224d03,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x2000c2,
+ 0x205842,
+ 0x229f43,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x2003c2,
+ 0x21f483,
+ 0x33cd07,
+ 0x236d4b,
+ 0x219dc3,
+ 0x321e08,
+ 0x374047,
+ 0x3e2986,
+ 0x3112c5,
+ 0x354849,
+ 0x216b88,
+ 0x285b89,
+ 0x285b90,
+ 0x38864b,
+ 0x3aec89,
+ 0x2084c3,
+ 0x221c49,
+ 0x23ca06,
+ 0x23ca0c,
+ 0x232ac8,
+ 0x3ed388,
+ 0x271709,
+ 0x2d094e,
+ 0x22cd4b,
+ 0x2c54cc,
+ 0x2030c3,
+ 0x27f60c,
+ 0x2030c9,
+ 0x3e4347,
+ 0x23e60c,
+ 0x2c714a,
+ 0x259b44,
+ 0x2c084d,
+ 0x27f4c8,
+ 0x3d9ecd,
+ 0x282c06,
+ 0x29f80b,
+ 0x356fc9,
+ 0x26c107,
+ 0x386206,
+ 0x332949,
+ 0x349f8a,
+ 0x3a73c8,
+ 0x303dc4,
+ 0x2c3087,
+ 0x250d47,
+ 0x20a3c4,
+ 0x22d744,
+ 0x387109,
+ 0x3bc989,
+ 0x3d0bc8,
+ 0x32e9c5,
+ 0x212bc5,
+ 0x20da06,
+ 0x2c0709,
+ 0x352bcd,
+ 0x21a108,
+ 0x20d907,
+ 0x311348,
+ 0x24f486,
+ 0x2443c4,
+ 0x269185,
+ 0x3e8c86,
+ 0x3eb4c4,
+ 0x202fc7,
+ 0x20644a,
+ 0x213f04,
+ 0x2183c6,
+ 0x21bf49,
+ 0x21bf4f,
+ 0x21cd0d,
+ 0x21d246,
+ 0x224f90,
+ 0x225386,
+ 0x225c47,
+ 0x226587,
+ 0x22658f,
+ 0x227009,
+ 0x22ca86,
+ 0x22d207,
+ 0x22d208,
+ 0x22e049,
+ 0x3d5848,
+ 0x30b9c7,
+ 0x20e2c3,
+ 0x234e06,
+ 0x32e6c8,
+ 0x2d0c0a,
+ 0x203709,
+ 0x216cc3,
+ 0x354606,
+ 0x25bc8a,
+ 0x244e47,
+ 0x3e418a,
+ 0x34910e,
+ 0x227146,
+ 0x33f0c7,
+ 0x24b806,
+ 0x202546,
+ 0x348b8b,
+ 0x20ec8a,
+ 0x3d7c8d,
+ 0x28c587,
+ 0x27a688,
+ 0x27a689,
+ 0x27a68f,
+ 0x3a784c,
+ 0x3a7b09,
+ 0x278ace,
+ 0x28588a,
+ 0x237d46,
+ 0x2f7486,
+ 0x3b2acc,
+ 0x317fcc,
+ 0x322c88,
+ 0x35b287,
+ 0x224245,
+ 0x3d08c4,
+ 0x34aece,
+ 0x22f544,
+ 0x3405c7,
+ 0x3ad60a,
+ 0x3e6bd4,
+ 0x3ea64f,
+ 0x226748,
+ 0x234cc8,
+ 0x38168d,
+ 0x38168e,
+ 0x235149,
+ 0x342548,
+ 0x34254f,
+ 0x23e30c,
+ 0x23e30f,
+ 0x23f987,
+ 0x2422ca,
+ 0x2445cb,
+ 0x245008,
+ 0x2474c7,
+ 0x253c4d,
+ 0x366a06,
+ 0x2c0a06,
+ 0x249209,
+ 0x272348,
+ 0x24f808,
+ 0x24f80e,
+ 0x236e47,
+ 0x308645,
+ 0x251805,
+ 0x209484,
+ 0x3e2c46,
+ 0x3d0ac8,
+ 0x264283,
+ 0x2c68ce,
+ 0x254008,
+ 0x24fe4b,
+ 0x359547,
+ 0x233645,
+ 0x27f786,
+ 0x2bfb07,
+ 0x32ecc8,
+ 0x330989,
+ 0x23ec45,
+ 0x297e48,
+ 0x230546,
+ 0x3b984a,
+ 0x34adc9,
+ 0x23e6c9,
+ 0x23e6cb,
+ 0x284f88,
+ 0x20a289,
+ 0x2c9806,
+ 0x26c4ca,
+ 0x3d1fca,
+ 0x2424cc,
+ 0x379c87,
+ 0x27c18a,
+ 0x3c6e8b,
+ 0x3c6e99,
+ 0x2d9408,
+ 0x216e85,
+ 0x253e06,
+ 0x36ff09,
+ 0x240186,
+ 0x22ff8a,
+ 0x229dc6,
+ 0x20a6c4,
+ 0x2e2e4d,
+ 0x20a6c7,
+ 0x325f89,
+ 0x255f05,
+ 0x256dc8,
+ 0x257189,
+ 0x259344,
+ 0x259a47,
+ 0x259a48,
+ 0x25a107,
+ 0x279c48,
+ 0x260787,
+ 0x2e5885,
+ 0x26888c,
+ 0x268c89,
+ 0x31b2ca,
+ 0x26b909,
+ 0x221d49,
+ 0x26bc4c,
+ 0x26ef8b,
+ 0x270f48,
+ 0x272548,
+ 0x275904,
+ 0x295f08,
+ 0x2975c9,
+ 0x2c7207,
+ 0x21c186,
+ 0x2af587,
+ 0x2fbc89,
+ 0x20ffcb,
+ 0x2511c7,
+ 0x21f507,
+ 0x2b8d47,
+ 0x3d9e44,
+ 0x3d9e45,
+ 0x2eefc5,
+ 0x357dcb,
+ 0x208f44,
+ 0x3b6988,
+ 0x25d44a,
+ 0x230607,
+ 0x3ecf87,
+ 0x29fc92,
+ 0x28afc6,
+ 0x2389c6,
+ 0x33564e,
+ 0x28c886,
+ 0x2a4c08,
+ 0x2a5acf,
+ 0x3da288,
+ 0x3b4608,
+ 0x3ae48a,
+ 0x3ae491,
+ 0x2b424e,
+ 0x26524a,
+ 0x26524c,
+ 0x265a07,
+ 0x342750,
+ 0x3d8948,
+ 0x2b4445,
+ 0x2bfe0a,
+ 0x3eb50c,
+ 0x2b84cd,
+ 0x204206,
+ 0x204207,
+ 0x20420c,
+ 0x20e80c,
+ 0x3a864c,
+ 0x2c340b,
+ 0x3ab384,
+ 0x21de84,
+ 0x2c4d89,
+ 0x31dac7,
+ 0x3ead89,
+ 0x288509,
+ 0x2c6e07,
+ 0x2c6fc6,
+ 0x2c6fc9,
+ 0x2c73c3,
+ 0x2b234a,
+ 0x32e587,
+ 0x20c0cb,
+ 0x3d7b0a,
+ 0x262584,
+ 0x2128c6,
+ 0x292689,
+ 0x368784,
+ 0x2eb30a,
+ 0x240d85,
+ 0x2d7a85,
+ 0x2d7a8d,
+ 0x2d7dce,
+ 0x31c3c5,
+ 0x33b486,
+ 0x216a07,
+ 0x24ecca,
+ 0x22f846,
+ 0x27f1c4,
+ 0x2fb147,
+ 0x2e0d4b,
+ 0x3d5d07,
+ 0x3b55c4,
+ 0x3c8586,
+ 0x3c858d,
+ 0x2f208c,
+ 0x212686,
+ 0x21a30a,
+ 0x2281c6,
+ 0x222088,
+ 0x3b2f47,
+ 0x22790a,
+ 0x23e186,
+ 0x286443,
+ 0x286446,
+ 0x220d48,
+ 0x375c0a,
+ 0x2a0207,
+ 0x2a0208,
+ 0x2a2844,
+ 0x28b1c7,
+ 0x36a3c8,
+ 0x2dbb08,
+ 0x31a988,
+ 0x35a6ca,
+ 0x2f7305,
+ 0x2bbec7,
+ 0x265093,
+ 0x27d886,
+ 0x2472c8,
+ 0x22a349,
+ 0x2ce608,
+ 0x254dcb,
+ 0x2cfe88,
+ 0x2e0e84,
+ 0x2de086,
+ 0x323fc6,
+ 0x341689,
+ 0x2e0c07,
+ 0x268988,
+ 0x297446,
+ 0x393644,
+ 0x32df05,
+ 0x3d98c8,
+ 0x34a9ca,
+ 0x2e2ac8,
+ 0x2e6e06,
+ 0x2abf8a,
+ 0x203b08,
+ 0x2e1908,
+ 0x2eb588,
+ 0x2ec146,
+ 0x2ed746,
+ 0x33c00c,
+ 0x2edcd0,
+ 0x2ee0c5,
+ 0x2bb0c8,
+ 0x2bb0d0,
+ 0x3da090,
+ 0x285a0e,
+ 0x33bc8e,
+ 0x33bc94,
+ 0x3b244f,
+ 0x3b2806,
+ 0x3bef11,
+ 0x3ed913,
+ 0x20a488,
+ 0x20b405,
+ 0x3cbf08,
+ 0x332c05,
+ 0x3e244c,
+ 0x2166c9,
+ 0x22f389,
+ 0x3b9c47,
+ 0x3495c9,
+ 0x35dbc7,
+ 0x207586,
+ 0x268f87,
+ 0x201245,
+ 0x211683,
+ 0x21d343,
+ 0x23d384,
+ 0x21338d,
+ 0x331e0f,
+ 0x393685,
+ 0x2165c6,
+ 0x22bbc7,
+ 0x232847,
+ 0x2c5886,
+ 0x2c588b,
+ 0x2b5485,
+ 0x213786,
+ 0x3a7107,
+ 0x261449,
+ 0x226e86,
+ 0x310b85,
+ 0x381d4b,
+ 0x3cf886,
+ 0x218b85,
+ 0x240a88,
+ 0x28ad88,
+ 0x2a184c,
+ 0x2a1850,
+ 0x2ae909,
+ 0x2b6c07,
+ 0x2cb48b,
+ 0x2d8346,
+ 0x30b88a,
+ 0x24704b,
+ 0x34bc8a,
+ 0x361806,
+ 0x2fe205,
+ 0x32e2c6,
+ 0x28df48,
+ 0x2c760a,
+ 0x38131c,
+ 0x33194c,
+ 0x304288,
+ 0x216e05,
+ 0x288dc7,
+ 0x2d0586,
+ 0x38bfc5,
+ 0x220106,
+ 0x2c5a48,
+ 0x2d68c7,
+ 0x2d0848,
+ 0x256f0a,
+ 0x38a5cc,
+ 0x3d8109,
+ 0x384347,
+ 0x2cdc04,
+ 0x2518c6,
+ 0x3b418a,
+ 0x288605,
+ 0x22d3cc,
+ 0x22da88,
+ 0x2fd6c8,
+ 0x30a50c,
+ 0x35c98c,
+ 0x3963c9,
+ 0x3eab87,
+ 0x251f0c,
+ 0x22b704,
+ 0x306dca,
+ 0x227d8c,
+ 0x28400b,
+ 0x259e4b,
+ 0x25ce86,
+ 0x263407,
+ 0x265507,
+ 0x34298f,
+ 0x312151,
+ 0x2f47d2,
+ 0x26550d,
+ 0x26550e,
+ 0x26584e,
+ 0x3b2608,
+ 0x3b2612,
+ 0x230e48,
+ 0x257f07,
+ 0x25e70a,
+ 0x251d48,
+ 0x28c845,
+ 0x2cb88a,
+ 0x225707,
+ 0x2e7cc4,
+ 0x254a43,
+ 0x2417c5,
+ 0x3ae707,
+ 0x2fce87,
+ 0x2b86ce,
+ 0x365d4d,
+ 0x3c8249,
+ 0x207805,
+ 0x31e6c3,
+ 0x33e006,
+ 0x26c905,
+ 0x250088,
+ 0x385989,
+ 0x224805,
+ 0x253e4f,
+ 0x2b2f87,
+ 0x311145,
+ 0x359f0a,
+ 0x3daa46,
+ 0x3917c9,
+ 0x353c8c,
+ 0x366c49,
+ 0x3ec046,
+ 0x25d24c,
+ 0x3345c6,
+ 0x3bf308,
+ 0x239546,
+ 0x27cfc6,
+ 0x2cc344,
+ 0x3c39c3,
+ 0x3e954a,
+ 0x250491,
+ 0x3a7cca,
+ 0x26b245,
+ 0x26f947,
+ 0x265cc7,
+ 0x2d54c4,
+ 0x36a4cb,
+ 0x3cb7c8,
+ 0x2d5146,
+ 0x3e7205,
+ 0x277944,
+ 0x268189,
+ 0x2008c4,
+ 0x3ebe47,
+ 0x333505,
+ 0x333507,
+ 0x335885,
+ 0x25f3c3,
+ 0x257dc8,
+ 0x27988a,
+ 0x22eb83,
+ 0x232a4a,
+ 0x3bd7c6,
+ 0x253bcf,
+ 0x272109,
+ 0x2c6850,
+ 0x2d5648,
+ 0x2e7709,
+ 0x2aa307,
+ 0x3c850f,
+ 0x3c9f44,
+ 0x2ef344,
+ 0x20b786,
+ 0x2f0686,
+ 0x26204a,
+ 0x256186,
+ 0x2c3a87,
+ 0x315808,
+ 0x315a07,
+ 0x3170c7,
+ 0x318c4a,
+ 0x3179cb,
+ 0x23ab05,
+ 0x2f4408,
+ 0x2098c3,
+ 0x3d458c,
+ 0x386b0f,
+ 0x22404d,
+ 0x29d4c7,
+ 0x243449,
+ 0x396687,
+ 0x2d0f88,
+ 0x3e6dcc,
+ 0x301748,
+ 0x24a2c8,
+ 0x33314e,
+ 0x344cd4,
+ 0x3451e4,
+ 0x364b8a,
+ 0x388ecb,
+ 0x35dc84,
+ 0x35dc89,
+ 0x2cbf48,
+ 0x252245,
+ 0x373e4a,
+ 0x3c9047,
+ 0x285584,
+ 0x258843,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x219c03,
+ 0x2edcc6,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x2000c2,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x2e9c43,
+ 0x25e043,
+ 0x2edcc6,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x258843,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x2000c2,
+ 0x289e03,
+ 0x205842,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x203702,
+ 0x2035c2,
+ 0x205842,
+ 0x229f43,
+ 0x208542,
+ 0x2005c2,
+ 0x258104,
+ 0x292e44,
+ 0x230a02,
+ 0x222d84,
+ 0x2003c2,
+ 0x21f483,
+ 0x202783,
+ 0x25ce86,
+ 0x26ca02,
+ 0x201b02,
+ 0x22a742,
+ 0x61e12d83,
+ 0x62265243,
+ 0x66746,
+ 0x66746,
+ 0x29f804,
+ 0x20bc03,
+ 0x2acd,
+ 0x1d094a,
+ 0x1d39cc,
+ 0x92ccc,
+ 0x62c6e64f,
+ 0x1cc94d,
+ 0x713c4,
+ 0x7b204,
+ 0x161cc4,
+ 0x145d45,
+ 0x98409,
+ 0xb778c,
+ 0x110947,
+ 0x16906,
+ 0x1eb88,
+ 0x24bc7,
+ 0x286c8,
+ 0x1c14ca,
+ 0x1145c7,
+ 0xb79c9,
+ 0x632f8c05,
+ 0xf8c09,
+ 0x634404cb,
+ 0x125c88,
+ 0x137dcb,
+ 0x344b,
+ 0x182bc8,
+ 0x13054a,
+ 0x17d3ce,
+ 0x638b738a,
+ 0x1e544d,
+ 0x3514d,
+ 0x14ce40b,
+ 0xf1f4a,
+ 0xc344,
+ 0x8ef86,
+ 0x19f508,
+ 0xd1e88,
+ 0x40787,
+ 0x16245,
+ 0x1e0507,
+ 0xa54c9,
+ 0x1cd787,
+ 0x1db408,
+ 0x31009,
+ 0x15f9c4,
+ 0x53705,
+ 0x3810e,
+ 0x1401c7,
+ 0x63e26c46,
+ 0xbe10d,
+ 0x1cd608,
+ 0xf4008,
+ 0x6429ed46,
+ 0x64d82888,
+ 0x106b8a,
+ 0xb2908,
+ 0x13cf10,
+ 0x6388c,
+ 0x76987,
+ 0x77d47,
+ 0x7bd87,
+ 0x81847,
+ 0xd9c2,
+ 0x1da407,
+ 0xee4c,
+ 0x1e1905,
+ 0xbd847,
+ 0xb6ac6,
+ 0xb92c9,
+ 0xbb988,
+ 0x1d7c2,
+ 0x5c2,
+ 0x19ab46,
+ 0x1d6ecb,
+ 0x1d71c6,
+ 0x71c84,
+ 0xcabc7,
+ 0x56a09,
+ 0x90249,
+ 0x1c03c8,
+ 0x58e02,
+ 0x12d349,
+ 0x15288,
+ 0xfff4a,
+ 0xd28c8,
+ 0x652e034b,
+ 0x162d09,
+ 0x51c86,
+ 0xe5649,
+ 0xf1ec7,
+ 0xf2609,
+ 0xf3948,
+ 0xf5707,
+ 0xf7289,
+ 0xf9d05,
+ 0xfa0d0,
+ 0x1c5e46,
+ 0xcab05,
+ 0xd5247,
+ 0x12634d,
+ 0x65ac9683,
+ 0x4d385,
+ 0x2e6c6,
+ 0xff7c7,
+ 0x105758,
+ 0x98d08,
+ 0x4c08a,
+ 0x152f8e,
+ 0x9942,
+ 0x65f5f74b,
+ 0x662e574a,
+ 0x59c0a,
+ 0x6a90d,
+ 0x33c2,
+ 0xdfa46,
+ 0x18a46,
+ 0xac788,
+ 0xbb70a,
+ 0x566c8,
+ 0x7fe89,
+ 0x1167c8,
+ 0x75a8e,
+ 0x29c08,
+ 0x13e007,
+ 0x6669ec84,
+ 0xd3f0d,
+ 0x10df85,
+ 0x1735c8,
+ 0x3fe48,
+ 0x66888d0a,
+ 0x66eb3dc8,
+ 0x1133c6,
+ 0x9e42,
+ 0xa6f44,
+ 0x6d586,
+ 0x67045f08,
+ 0x5b646,
+ 0x678c200b,
+ 0x4182,
+ 0x154a09,
+ 0x135c08,
+ 0x14b207,
+ 0x3268a,
+ 0x118a87,
+ 0x401,
+ 0x81,
+ 0x18e907,
+ 0x1c8388,
+ 0xc7e88,
+ 0xc8088,
+ 0xc8288,
+ 0x6fcc7,
+ 0xb1fc3,
+ 0x64644084,
+ 0x64aa6b83,
+ 0xc1,
+ 0x39d46,
+ 0xc1,
+ 0x201,
+ 0x39d46,
+ 0xb1fc3,
+ 0x656212c4,
+ 0x196f84,
+ 0x1fe85,
+ 0x2c945,
+ 0xcad04,
+ 0x2a084,
+ 0x59244,
+ 0x1434307,
+ 0x1421207,
+ 0x1c8bc8,
+ 0x148e4c,
+ 0xc41,
+ 0x8d43,
+ 0x2c684,
+ 0xef885,
+ 0x1c8bc8,
+ 0x677c8bc8,
+ 0x54e83,
+ 0x80383,
+ 0x16c43,
+ 0x22207,
+ 0x5ec7,
+ 0x145e305,
+ 0x5d8c4,
+ 0x76ac7,
+ 0x5842,
+ 0x2c904,
+ 0x1b01ca,
+ 0x259b44,
+ 0x229f43,
+ 0x25b9c4,
+ 0x258104,
+ 0x2127c3,
+ 0x22a205,
+ 0x21fc83,
+ 0x23ffc3,
+ 0x32e885,
+ 0x205ec3,
+ 0x15d43,
+ 0x68e29f43,
+ 0x224d03,
+ 0x5b9c4,
+ 0x4b03,
+ 0x2e9c43,
+ 0x200181,
+ 0x280c3,
+ 0x219c03,
+ 0x292e44,
+ 0x222d84,
+ 0x2127c3,
+ 0x5c743,
+ 0x21f483,
+ 0x217083,
+ 0x7ffc8,
+ 0x2000c2,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x2005c2,
+ 0x258104,
+ 0x25e043,
+ 0x219c03,
+ 0x2127c3,
+ 0x20bc03,
+ 0x21f483,
+ 0x205ec3,
+ 0x186a44,
+ 0x7ffc8,
+ 0xfd147,
+ 0x5842,
+ 0x12de85,
+ 0x639cf,
+ 0x1e50c6,
+ 0x1475dc8,
+ 0x116ace,
+ 0x69e087c2,
+ 0x2373c8,
+ 0x3d1086,
+ 0x25da46,
+ 0x3a33c7,
+ 0x6a204cc2,
+ 0x6a6c66c8,
+ 0x22ad4a,
+ 0x276408,
+ 0x200ac2,
+ 0x32e3c9,
+ 0x23ab47,
+ 0x21c106,
+ 0x257b09,
+ 0x2bc004,
+ 0x3e2886,
+ 0x2deb04,
+ 0x20de84,
+ 0x267f09,
+ 0x314a86,
+ 0x2bb4c5,
+ 0x27a245,
+ 0x235987,
+ 0x2d2187,
+ 0x305344,
+ 0x35eb06,
+ 0x2e88c5,
+ 0x3d7605,
+ 0x236245,
+ 0x24f647,
+ 0x359385,
+ 0x257609,
+ 0x372385,
+ 0x32ee04,
+ 0x22f787,
+ 0x3ce14e,
+ 0x209a09,
+ 0x335509,
+ 0x3681c6,
+ 0x24b088,
+ 0x3793cb,
+ 0x3bd38c,
+ 0x323ac6,
+ 0x2c5387,
+ 0x2f9185,
+ 0x30e20a,
+ 0x3d0cc9,
+ 0x20aa89,
+ 0x208186,
+ 0x3a6ec5,
+ 0x251b85,
+ 0x371809,
+ 0x2363cb,
+ 0x239186,
+ 0x353486,
+ 0x20d904,
+ 0x241f86,
+ 0x3086c8,
+ 0x3d38c6,
+ 0x242d46,
+ 0x204788,
+ 0x206f07,
+ 0x207f49,
+ 0x20cc05,
+ 0x7ffc8,
+ 0x3e0484,
+ 0x317644,
+ 0x212a45,
+ 0x343a49,
+ 0x2292c7,
+ 0x2292cb,
+ 0x22c3ca,
+ 0x22f2c5,
+ 0x6aa0a582,
+ 0x3d79c7,
+ 0x6ae2fbc8,
+ 0x2083c7,
+ 0x223a85,
+ 0x2449ca,
+ 0x5842,
+ 0x28f84b,
+ 0x29090a,
+ 0x279746,
+ 0x2114c3,
+ 0x21438d,
+ 0x3d250c,
+ 0x3d628d,
+ 0x245b45,
+ 0x36cdc5,
+ 0x2642c7,
+ 0x3db089,
+ 0x22ac46,
+ 0x256005,
+ 0x30d0c8,
+ 0x241e83,
+ 0x350088,
+ 0x241e88,
+ 0x3c6b07,
+ 0x2f0308,
+ 0x310589,
+ 0x33edc7,
+ 0x2368c7,
+ 0x209348,
+ 0x25e1c4,
+ 0x25e1c7,
+ 0x282b08,
+ 0x365746,
+ 0x20668f,
+ 0x35bcc7,
+ 0x35e606,
+ 0x3eacc5,
+ 0x22a8c3,
+ 0x253847,
+ 0x395c03,
+ 0x25a2c6,
+ 0x25d7c6,
+ 0x25eac6,
+ 0x2a3e05,
+ 0x279c43,
+ 0x32cfc8,
+ 0x3aa189,
+ 0x25ec4b,
+ 0x25ef08,
+ 0x260445,
+ 0x2629c5,
+ 0x6b262642,
+ 0x269049,
+ 0x3d1bc7,
+ 0x213805,
+ 0x267e07,
+ 0x269c46,
+ 0x26ae05,
+ 0x26c74b,
+ 0x270f44,
+ 0x275fc5,
+ 0x276107,
+ 0x289746,
+ 0x28a185,
+ 0x296347,
+ 0x296f87,
+ 0x2cc984,
+ 0x2b758a,
+ 0x2fabc8,
+ 0x379689,
+ 0x2f9505,
+ 0x2464c6,
+ 0x30888a,
+ 0x27a146,
+ 0x396907,
+ 0x27c50d,
+ 0x2b4fc9,
+ 0x389205,
+ 0x3b7007,
+ 0x3cdc48,
+ 0x385b88,
+ 0x32b107,
+ 0x367e86,
+ 0x21c507,
+ 0x267883,
+ 0x314a04,
+ 0x38abc5,
+ 0x3b76c7,
+ 0x3bffc9,
+ 0x234488,
+ 0x396805,
+ 0x2421c4,
+ 0x2544c5,
+ 0x25f0cd,
+ 0x2086c2,
+ 0x228346,
+ 0x2c9706,
+ 0x3097ca,
+ 0x3a8b86,
+ 0x3b40c5,
+ 0x2defc5,
+ 0x2defc7,
+ 0x3b968c,
+ 0x2b278a,
+ 0x29da06,
+ 0x2ed645,
+ 0x241dc6,
+ 0x29fac7,
+ 0x2a1f06,
+ 0x2a3d0c,
+ 0x257c49,
+ 0x6b61c907,
+ 0x2a5e85,
+ 0x2a5e86,
+ 0x2a6248,
+ 0x256505,
+ 0x2b5705,
+ 0x2b5bc8,
+ 0x2b5dca,
+ 0x6ba27e02,
+ 0x6be10802,
+ 0x21b485,
+ 0x30bac3,
+ 0x336a48,
+ 0x24bc83,
+ 0x2b6044,
+ 0x39190b,
+ 0x3c5c88,
+ 0x2bda08,
+ 0x6c340949,
+ 0x2bd309,
+ 0x2be006,
+ 0x2bf788,
+ 0x2bf989,
+ 0x2c1046,
+ 0x2c11c5,
+ 0x254646,
+ 0x2c1789,
+ 0x2d6487,
+ 0x24c5c6,
+ 0x2bc547,
+ 0x34a147,
+ 0x3a6c84,
+ 0x6c609189,
+ 0x38c208,
+ 0x2c65c8,
+ 0x393887,
+ 0x2e2746,
+ 0x3dae89,
+ 0x25da07,
+ 0x3cc38a,
+ 0x3d2c88,
+ 0x224a07,
+ 0x231546,
+ 0x3affca,
+ 0x3ac908,
+ 0x31f445,
+ 0x22e5c5,
+ 0x319f87,
+ 0x324689,
+ 0x326a8b,
+ 0x3c0588,
+ 0x372409,
+ 0x25f847,
+ 0x2d2acc,
+ 0x2d350c,
+ 0x2d380a,
+ 0x2d3a8c,
+ 0x2de688,
+ 0x2de888,
+ 0x2dea84,
+ 0x2df209,
+ 0x2df449,
+ 0x2df68a,
+ 0x2df909,
+ 0x2dfc87,
+ 0x20878c,
+ 0x3cefc6,
+ 0x27bec8,
+ 0x27a206,
+ 0x2f5c06,
+ 0x389107,
+ 0x39c208,
+ 0x3e2e4b,
+ 0x208287,
+ 0x26fa89,
+ 0x292f49,
+ 0x38d487,
+ 0x207484,
+ 0x269247,
+ 0x31fe46,
+ 0x217246,
+ 0x21a4c5,
+ 0x3b03c8,
+ 0x3494c4,
+ 0x3494c6,
+ 0x2b264b,
+ 0x269889,
+ 0x24f546,
+ 0x242f49,
+ 0x212b06,
+ 0x39a308,
+ 0x20d003,
+ 0x3a7045,
+ 0x21e3c9,
+ 0x3a98c5,
+ 0x3619c4,
+ 0x383706,
+ 0x3250c5,
+ 0x263c06,
+ 0x31ac07,
+ 0x210286,
+ 0x2707cb,
+ 0x26c3c7,
+ 0x27d286,
+ 0x28f486,
+ 0x235a46,
+ 0x305309,
+ 0x200b4a,
+ 0x2d59c5,
+ 0x2ccc0d,
+ 0x2b5ec6,
+ 0x25d646,
+ 0x2d5546,
+ 0x222005,
+ 0x2fa3c7,
+ 0x3d6847,
+ 0x314e0e,
+ 0x219c03,
+ 0x2e2709,
+ 0x286809,
+ 0x2356c7,
+ 0x27e5c7,
+ 0x3317c5,
+ 0x2dbc85,
+ 0x6cb8724f,
+ 0x2e7947,
+ 0x2e7b08,
+ 0x2e7fc4,
+ 0x2e8306,
+ 0x6ce51882,
+ 0x2ec3c6,
+ 0x2edcc6,
+ 0x374a0e,
+ 0x34feca,
+ 0x214806,
+ 0x2cdd4a,
+ 0x3d6089,
+ 0x3023c5,
+ 0x2d8548,
+ 0x301186,
+ 0x2c4f88,
+ 0x385348,
+ 0x32234b,
+ 0x3a34c5,
+ 0x359408,
+ 0x2048cc,
+ 0x223947,
+ 0x25e646,
+ 0x3b2d88,
+ 0x3e2b08,
+ 0x6d216602,
+ 0x201ccb,
+ 0x392889,
+ 0x20ce09,
+ 0x3d1707,
+ 0x35e048,
+ 0x6d615f88,
+ 0x38480b,
+ 0x26e189,
+ 0x262f4d,
+ 0x385188,
+ 0x2d4e48,
+ 0x6da00f82,
+ 0x3ef104,
+ 0x6de47f42,
+ 0x365c06,
+ 0x6e201a42,
+ 0x3021ca,
+ 0x2b5586,
+ 0x230388,
+ 0x2583c8,
+ 0x264bc6,
+ 0x330846,
+ 0x309186,
+ 0x250005,
+ 0x245704,
+ 0x6e655cc4,
+ 0x358806,
+ 0x251647,
+ 0x6ea8d407,
+ 0x39e54b,
+ 0x2085c9,
+ 0x36ce0a,
+ 0x2df104,
+ 0x25dcc8,
+ 0x24c38d,
+ 0x302949,
+ 0x302b88,
+ 0x302e09,
+ 0x305744,
+ 0x230d44,
+ 0x291dc5,
+ 0x204c8b,
+ 0x3c5c06,
+ 0x358645,
+ 0x241949,
+ 0x35ebc8,
+ 0x26ae44,
+ 0x30e389,
+ 0x270705,
+ 0x2d21c8,
+ 0x236f87,
+ 0x335908,
+ 0x292886,
+ 0x3d5707,
+ 0x2f3589,
+ 0x381ec9,
+ 0x218c05,
+ 0x245a05,
+ 0x6ee09702,
+ 0x32ebc4,
+ 0x38a845,
+ 0x3a32c6,
+ 0x33ea05,
+ 0x262a87,
+ 0x303a05,
+ 0x287004,
+ 0x368286,
+ 0x256087,
+ 0x220bc6,
+ 0x330b45,
+ 0x21ae08,
+ 0x3d1285,
+ 0x228047,
+ 0x22f989,
+ 0x2699ca,
+ 0x2baac7,
+ 0x2baacc,
+ 0x2bb486,
+ 0x24d809,
+ 0x254345,
+ 0x256448,
+ 0x218a43,
+ 0x2c97c5,
+ 0x2ef5c5,
+ 0x24dc07,
+ 0x6f200bc2,
+ 0x2fef07,
+ 0x2e38c6,
+ 0x387e86,
+ 0x2ebd46,
+ 0x3e2a46,
+ 0x253548,
+ 0x3cc045,
+ 0x35e6c7,
+ 0x35e6cd,
+ 0x254a43,
+ 0x3cf485,
+ 0x359cc7,
+ 0x2ff248,
+ 0x359885,
+ 0x21f1c8,
+ 0x38a2c6,
+ 0x2a6bc7,
+ 0x2f5b45,
+ 0x3a3546,
+ 0x32d545,
+ 0x20c58a,
+ 0x2f9946,
+ 0x243cc7,
+ 0x2c6cc5,
+ 0x2fa847,
+ 0x2fb0c4,
+ 0x361946,
+ 0x3010c5,
+ 0x232f4b,
+ 0x31fcc9,
+ 0x289f0a,
+ 0x218c88,
+ 0x308388,
+ 0x30c28c,
+ 0x30dc87,
+ 0x30f408,
+ 0x388cc8,
+ 0x32f245,
+ 0x31a4ca,
+ 0x31e6c9,
+ 0x6f601402,
+ 0x20fec6,
+ 0x224804,
+ 0x2276c9,
+ 0x350bc9,
+ 0x312fc7,
+ 0x281687,
+ 0x288389,
+ 0x35a8c8,
+ 0x35a8cf,
+ 0x234046,
+ 0x2f160b,
+ 0x266b05,
+ 0x266b07,
+ 0x337789,
+ 0x30e306,
+ 0x30e307,
+ 0x2f4b45,
+ 0x23bb04,
+ 0x2a8746,
+ 0x215784,
+ 0x2cee87,
+ 0x2db048,
+ 0x6fba6dc8,
+ 0x3b8845,
+ 0x3bc687,
+ 0x2d9589,
+ 0x21a004,
+ 0x24cf48,
+ 0x6ff04708,
+ 0x2d54c4,
+ 0x30b548,
+ 0x3862c4,
+ 0x215649,
+ 0x221f45,
+ 0x70208ec2,
+ 0x234085,
+ 0x3aba85,
+ 0x3b6d08,
+ 0x23f7c7,
+ 0x706008c2,
+ 0x371bc5,
+ 0x2ea7c6,
+ 0x25e946,
+ 0x32eb88,
+ 0x366e48,
+ 0x33e9c6,
+ 0x31d946,
+ 0x2fd209,
+ 0x387dc6,
+ 0x3e068b,
+ 0x3e27c5,
+ 0x25d086,
+ 0x266548,
+ 0x366b06,
+ 0x2a5346,
+ 0x21f8ca,
+ 0x2eb7ca,
+ 0x264485,
+ 0x286a87,
+ 0x2852c6,
+ 0x70a04c02,
+ 0x359e07,
+ 0x3e1285,
+ 0x308804,
+ 0x308805,
+ 0x25dbc6,
+ 0x2686c7,
+ 0x20b785,
+ 0x2eb944,
+ 0x2e85c8,
+ 0x2a5405,
+ 0x2f6ac7,
+ 0x32a285,
+ 0x20c4c5,
+ 0x229604,
+ 0x229609,
+ 0x2e8708,
+ 0x20b0c6,
+ 0x217e86,
+ 0x3ce5c6,
+ 0x70ec3648,
+ 0x306247,
+ 0x33e5cd,
+ 0x3dcb8c,
+ 0x3e79c9,
+ 0x313549,
+ 0x7137e082,
+ 0x3e6403,
+ 0x246583,
+ 0x31ff05,
+ 0x3b77ca,
+ 0x33e406,
+ 0x241145,
+ 0x31b544,
+ 0x31b54b,
+ 0x333e8c,
+ 0x33474c,
+ 0x334a55,
+ 0x33660d,
+ 0x3384cf,
+ 0x338892,
+ 0x338d0f,
+ 0x3390d2,
+ 0x339553,
+ 0x339a0d,
+ 0x339fcd,
+ 0x33a34e,
+ 0x33ac4e,
+ 0x33b24c,
+ 0x33b60c,
+ 0x33ba4b,
+ 0x33ca0e,
+ 0x33d312,
+ 0x33e1cc,
+ 0x33f4d0,
+ 0x34ca92,
+ 0x34db0c,
+ 0x34e1cd,
+ 0x34e50c,
+ 0x351fd1,
+ 0x35360d,
+ 0x3556cd,
+ 0x355cca,
+ 0x355f4c,
+ 0x357b8c,
+ 0x35834c,
+ 0x35ac8c,
+ 0x360213,
+ 0x360c10,
+ 0x361010,
+ 0x361dcd,
+ 0x3623cc,
+ 0x3648c9,
+ 0x36704d,
+ 0x367393,
+ 0x368f11,
+ 0x369713,
+ 0x36a78f,
+ 0x36ab4c,
+ 0x36ae4f,
+ 0x36b20d,
+ 0x36b80f,
+ 0x36bbd0,
+ 0x36c64e,
+ 0x37554e,
+ 0x375e90,
+ 0x376a8d,
+ 0x37740e,
+ 0x37778c,
+ 0x378e53,
+ 0x37b50e,
+ 0x37c250,
+ 0x37c651,
+ 0x37ca8f,
+ 0x37ce53,
+ 0x37dc0d,
+ 0x37df4f,
+ 0x37e30e,
+ 0x37e890,
+ 0x37ec89,
+ 0x37fdd0,
+ 0x3802cf,
+ 0x38094f,
+ 0x380d12,
+ 0x38210e,
+ 0x387a4d,
+ 0x38800d,
+ 0x38834d,
+ 0x38934d,
+ 0x38968d,
+ 0x3899d0,
+ 0x389dcb,
+ 0x38a98c,
+ 0x38ad0c,
+ 0x38b30c,
+ 0x38b60e,
+ 0x39a510,
+ 0x39bb52,
+ 0x39bfcb,
+ 0x39c40e,
+ 0x39c78e,
+ 0x39d00e,
+ 0x39d58b,
+ 0x7179d916,
+ 0x39edcd,
+ 0x39fa14,
+ 0x3a0a4d,
+ 0x3a2b15,
+ 0x3a514d,
+ 0x3a5acf,
+ 0x3a628f,
+ 0x3aa3cf,
+ 0x3aa78e,
+ 0x3aab0d,
+ 0x3ac291,
+ 0x3af1cc,
+ 0x3af4cc,
+ 0x3af7cb,
+ 0x3afa8c,
+ 0x3b05cf,
+ 0x3b0992,
+ 0x3b0f8d,
+ 0x3b21cc,
+ 0x3b310c,
+ 0x3b340d,
+ 0x3b374f,
+ 0x3b3b0e,
+ 0x3b748c,
+ 0x3b7a4d,
+ 0x3b7d8b,
+ 0x3b834c,
+ 0x3b8d0d,
+ 0x3b904e,
+ 0x3b93c9,
+ 0x3ba753,
+ 0x3baf0d,
+ 0x3bb60d,
+ 0x3bbc0c,
+ 0x3bc28e,
+ 0x3bdecf,
+ 0x3be28c,
+ 0x3be58d,
+ 0x3be8cf,
+ 0x3bec8c,
+ 0x3bf50c,
+ 0x3bfa8c,
+ 0x3bfd8c,
+ 0x3c0c4d,
+ 0x3c0f92,
+ 0x3c1a0c,
+ 0x3c1d0c,
+ 0x3c2011,
+ 0x3c244f,
+ 0x3c280f,
+ 0x3c2bd3,
+ 0x3c3ece,
+ 0x3c424f,
+ 0x3c460c,
+ 0x71bc4cce,
+ 0x3c504f,
+ 0x3c5416,
+ 0x3c6652,
+ 0x3c920c,
+ 0x3ca10f,
+ 0x3ca78d,
+ 0x3dbc0f,
+ 0x3dbfcc,
+ 0x3dc2cd,
+ 0x3dc60d,
+ 0x3de74e,
+ 0x3df30c,
+ 0x3e32cc,
+ 0x3e35d0,
+ 0x3e5791,
+ 0x3e5bcb,
+ 0x3e600c,
+ 0x3e630e,
+ 0x3e7f11,
+ 0x3e834e,
+ 0x3e86cd,
+ 0x3ed6cb,
+ 0x3ee20f,
+ 0x3eebd4,
+ 0x21e682,
+ 0x21e682,
+ 0x2048c3,
+ 0x21e682,
+ 0x2048c3,
+ 0x21e682,
+ 0x204fc2,
+ 0x254685,
+ 0x3e7c0c,
+ 0x21e682,
+ 0x21e682,
+ 0x204fc2,
+ 0x21e682,
+ 0x2a7045,
+ 0x2699c5,
+ 0x21e682,
+ 0x21e682,
+ 0x202a02,
+ 0x2a7045,
+ 0x336c49,
+ 0x368c0c,
+ 0x21e682,
+ 0x21e682,
+ 0x21e682,
+ 0x21e682,
+ 0x254685,
+ 0x21e682,
+ 0x21e682,
+ 0x21e682,
+ 0x21e682,
+ 0x202a02,
+ 0x336c49,
+ 0x21e682,
+ 0x21e682,
+ 0x21e682,
+ 0x2699c5,
+ 0x21e682,
+ 0x2699c5,
+ 0x368c0c,
+ 0x3e7c0c,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x31cf,
+ 0xa788,
+ 0x75bc4,
+ 0xbc03,
+ 0xe44c8,
+ 0x1df183,
+ 0x2000c2,
+ 0x72a05842,
+ 0x24c883,
+ 0x23bf84,
+ 0x204b03,
+ 0x2e9c44,
+ 0x2389c6,
+ 0x20f503,
+ 0x3835c4,
+ 0x2aaf45,
+ 0x219c03,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x22600a,
+ 0x25ce86,
+ 0x39cb0c,
+ 0x7ffc8,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2335c3,
+ 0x2edcc6,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x13803,
+ 0xb7048,
+ 0x735eb785,
+ 0x80407,
+ 0x57dc5,
+ 0x1c387,
+ 0x145d45,
+ 0x3589,
+ 0x2c02,
+ 0x1cb20a,
+ 0x74332b45,
+ 0x145d45,
+ 0x110947,
+ 0x29b08,
+ 0x1060e,
+ 0x9a352,
+ 0x12dc8b,
+ 0x1146c6,
+ 0x746f8c05,
+ 0x74b8c5cc,
+ 0x8e07,
+ 0xf1a47,
+ 0x1b654a,
+ 0x47cd0,
+ 0xc7c5,
+ 0xb2e8b,
+ 0xd1e88,
+ 0x40787,
+ 0x3bc0b,
+ 0xa54c9,
+ 0x54847,
+ 0x1cd787,
+ 0x393c7,
+ 0x406c6,
+ 0x1db408,
+ 0x750332c6,
+ 0x56607,
+ 0xef6c6,
+ 0xbe10d,
+ 0x5de50,
+ 0x75406cc2,
+ 0x1cd608,
+ 0x199810,
+ 0x199f4c,
+ 0x75b9fecd,
+ 0x6d988,
+ 0x6de0b,
+ 0x7d747,
+ 0x9e6c9,
+ 0x66806,
+ 0xa6448,
+ 0x4d02,
+ 0x6b04a,
+ 0x150407,
+ 0xbd847,
+ 0xb92c9,
+ 0xbb988,
+ 0x146bc5,
+ 0x19ab46,
+ 0x1d71c6,
+ 0x103e4e,
+ 0x3c4ce,
+ 0x4b6cf,
+ 0x56a09,
+ 0x90249,
+ 0x1dda0b,
+ 0xc1b4f,
+ 0x17d90c,
+ 0xd71cb,
+ 0x11b208,
+ 0x19e447,
+ 0x1abd88,
+ 0xc2e8b,
+ 0xc384c,
+ 0xc3c4c,
+ 0xc404c,
+ 0xc434d,
+ 0x1c03c8,
+ 0x803c2,
+ 0x12d349,
+ 0x191648,
+ 0xe068b,
+ 0xe2946,
+ 0xea14b,
+ 0x13ce4b,
+ 0xf428a,
+ 0xf58c5,
+ 0xfa0d0,
+ 0xfd8c6,
+ 0x1683c6,
+ 0xcab05,
+ 0xd5247,
+ 0xec648,
+ 0xff7c7,
+ 0xffa87,
+ 0x121587,
+ 0xd7606,
+ 0x165a4a,
+ 0xa1b8a,
+ 0x18a46,
+ 0xbd60d,
+ 0x566c8,
+ 0x1167c8,
+ 0x1a5e89,
+ 0x4be49,
+ 0xd1445,
+ 0x15804c,
+ 0xc454b,
+ 0x184109,
+ 0x18de04,
+ 0x113189,
+ 0x1133c6,
+ 0x15fa86,
+ 0x1b02,
+ 0x5b646,
+ 0x4bfcb,
+ 0x11d147,
+ 0x11d307,
+ 0x4182,
+ 0xe3f05,
+ 0x29c84,
+ 0x101,
+ 0x5fdc3,
+ 0x74f4c586,
+ 0xa6b83,
+ 0x382,
+ 0xae04,
+ 0xac2,
+ 0x9f804,
+ 0x882,
+ 0x1e02,
+ 0x2b82,
+ 0x127082,
+ 0x3702,
+ 0xb79c2,
+ 0x2102,
+ 0xb90c2,
+ 0x38fc2,
+ 0x1bc2,
+ 0xd02,
+ 0x5d9c2,
+ 0x24d03,
+ 0x942,
+ 0x3642,
+ 0x18b02,
+ 0x2e42,
+ 0x642,
+ 0x3cac2,
+ 0x1d7c2,
+ 0x75c2,
+ 0x9c42,
+ 0x5c2,
+ 0x5e043,
+ 0x3382,
+ 0x5fc2,
+ 0x58e02,
+ 0x8042,
+ 0xb982,
+ 0xfd02,
+ 0x2d442,
+ 0x2c82,
+ 0x26c2,
+ 0xbdc2,
+ 0x7eec2,
+ 0x5582,
+ 0x127c3,
+ 0x602,
+ 0x16602,
+ 0x1242,
+ 0x1c682,
+ 0x18b85,
+ 0x6582,
+ 0x85042,
+ 0x172303,
+ 0x682,
+ 0x9942,
+ 0x33c2,
+ 0x5f82,
+ 0x12882,
+ 0x8c2,
+ 0x9e42,
+ 0x1b02,
+ 0x2cc5,
+ 0x75e04fc2,
+ 0x762f3143,
+ 0x2043,
+ 0x76604fc2,
+ 0x2043,
+ 0xe2207,
+ 0x2029c3,
+ 0x2000c2,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x2005c3,
+ 0x2335c3,
+ 0x2127c3,
+ 0x20bc03,
+ 0x21f483,
+ 0x39ac43,
+ 0x16fe06,
+ 0xd1484,
+ 0x17585,
+ 0x108585,
+ 0xb8c3,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x219c03,
+ 0x2127c3,
+ 0x20bc03,
+ 0x81983,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x200181,
+ 0x219c03,
+ 0x2127c3,
+ 0x25c743,
+ 0x21f483,
+ 0x2ec4,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x229dc3,
+ 0x28c6c3,
+ 0x25c783,
+ 0x244d83,
+ 0x2b5543,
+ 0x204f83,
+ 0x2e9c43,
+ 0x258104,
+ 0x2127c3,
+ 0x21f483,
+ 0x205ec3,
+ 0x209f84,
+ 0x239343,
+ 0x30c3,
+ 0x220cc3,
+ 0x32bd48,
+ 0x349f84,
+ 0x20020a,
+ 0x264086,
+ 0xd9384,
+ 0x3babc7,
+ 0x22688a,
+ 0x233f09,
+ 0x3cb087,
+ 0x3d018a,
+ 0x258843,
+ 0x21b50b,
+ 0x237ac9,
+ 0x36a2c5,
+ 0x2384c7,
+ 0x5842,
+ 0x229f43,
+ 0x246747,
+ 0x347a05,
+ 0x2dec09,
+ 0x224d03,
+ 0x22cb86,
+ 0x2dd343,
+ 0xe3943,
+ 0x119e46,
+ 0x173bc6,
+ 0xf487,
+ 0x213cc6,
+ 0x22dc45,
+ 0x20ccc7,
+ 0x316f07,
+ 0x792e9c43,
+ 0x34dd47,
+ 0x24be03,
+ 0x23aa45,
+ 0x258104,
+ 0x2c8888,
+ 0x3e664c,
+ 0x2c7c85,
+ 0x2b5146,
+ 0x246607,
+ 0x384407,
+ 0x27d3c7,
+ 0x290448,
+ 0x3190cf,
+ 0x372ac5,
+ 0x24c987,
+ 0x29cc87,
+ 0x249c4a,
+ 0x30cf09,
+ 0x32c545,
+ 0x34d4ca,
+ 0x1080c6,
+ 0xd1747,
+ 0x2dd3c5,
+ 0x397644,
+ 0x340386,
+ 0x14f0c6,
+ 0x25bb47,
+ 0x2e1687,
+ 0x209748,
+ 0x20d005,
+ 0x347906,
+ 0x43288,
+ 0x242cc5,
+ 0x42e86,
+ 0x318985,
+ 0x29bcc4,
+ 0x247907,
+ 0x25338a,
+ 0x2afe88,
+ 0x3d6cc6,
+ 0x335c3,
+ 0x2f7305,
+ 0x220346,
+ 0x2089c6,
+ 0x374cc6,
+ 0x219c03,
+ 0x3b1207,
+ 0x29cc05,
+ 0x2127c3,
+ 0x2f454d,
+ 0x20bc03,
+ 0x209848,
+ 0x23d404,
+ 0x220645,
+ 0x2b6086,
+ 0x201a46,
+ 0x25cf87,
+ 0x26e047,
+ 0x280745,
+ 0x21f483,
+ 0x3326c7,
+ 0x207349,
+ 0x246049,
+ 0x38cf8a,
+ 0x2020c2,
+ 0x23aa04,
+ 0x32c1c4,
+ 0x2fec07,
+ 0x2fedc8,
+ 0x300949,
+ 0x3cf349,
+ 0x3014c7,
+ 0x10c5c9,
+ 0x2b81c6,
+ 0x103bc6,
+ 0x305744,
+ 0x2353ca,
+ 0x307d48,
+ 0x309049,
+ 0x309306,
+ 0x2cd685,
+ 0x2afd48,
+ 0x2e2bca,
+ 0x21cb03,
+ 0x20a106,
+ 0x3015c7,
+ 0x35c0c5,
+ 0x84408,
+ 0x3c3345,
+ 0x216f03,
+ 0x24a3c4,
+ 0x4a3c9,
+ 0x22e585,
+ 0x297087,
+ 0x2e8845,
+ 0x2f1bc6,
+ 0x1063c5,
+ 0x2148c3,
+ 0x2148c9,
+ 0x22040c,
+ 0x2d320c,
+ 0x3485c8,
+ 0x2a0c47,
+ 0x3e4008,
+ 0x111547,
+ 0x3118ca,
+ 0x311f8b,
+ 0x237c08,
+ 0x201b48,
+ 0x260fc6,
+ 0x31c245,
+ 0x284d8a,
+ 0x3da585,
+ 0x208ec2,
+ 0x2e1487,
+ 0x278606,
+ 0x37f485,
+ 0x3977c9,
+ 0x36f885,
+ 0x1d2348,
+ 0x2a3585,
+ 0x23a609,
+ 0x322dc6,
+ 0x3406c8,
+ 0x246ec3,
+ 0x211706,
+ 0x383646,
+ 0x31cb85,
+ 0x31cb89,
+ 0x287109,
+ 0x284b07,
+ 0x120c44,
+ 0x320c47,
+ 0x3cf249,
+ 0x221a85,
+ 0x26a88,
+ 0x372185,
+ 0x2028c5,
+ 0x367bc9,
+ 0x201182,
+ 0x2556c4,
+ 0x20f582,
+ 0x203382,
+ 0x361b85,
+ 0x352948,
+ 0x2d1385,
+ 0x2dfe43,
+ 0x2dfe45,
+ 0x2ec5c3,
+ 0x211402,
+ 0x298a44,
+ 0x203a83,
+ 0x200a82,
+ 0x2f81c4,
+ 0x30d543,
+ 0x2043c2,
+ 0x26e983,
+ 0x2189c4,
+ 0x309483,
+ 0x2623c4,
+ 0x201782,
+ 0x21ee83,
+ 0x21e503,
+ 0x204942,
+ 0x29ec82,
+ 0x286f49,
+ 0x205182,
+ 0x29b184,
+ 0x203ac2,
+ 0x264644,
+ 0x2b8184,
+ 0x2d4844,
+ 0x201b02,
+ 0x249442,
+ 0x396583,
+ 0x311d43,
+ 0x297204,
+ 0x2e6f44,
+ 0x31e604,
+ 0x320dc4,
+ 0x31c503,
+ 0x383983,
+ 0x308044,
+ 0x322604,
+ 0x322746,
+ 0x202742,
+ 0x5842,
+ 0x4d383,
+ 0x205842,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x14305,
+ 0x2000c2,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x206dc3,
+ 0x2e9c43,
+ 0x258104,
+ 0x287204,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x305d44,
+ 0x329b43,
+ 0x223503,
+ 0x387d04,
+ 0x371f86,
+ 0x207e43,
+ 0x145d45,
+ 0xf1a47,
+ 0x261c03,
+ 0x7ae14fc8,
+ 0x209343,
+ 0x2ca043,
+ 0x21b643,
+ 0x2335c3,
+ 0x371ac5,
+ 0x38483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x211543,
+ 0x2033c3,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x25e043,
+ 0x2127c3,
+ 0x294384,
+ 0x81983,
+ 0x21f483,
+ 0x2d0584,
+ 0x145d45,
+ 0x2f5345,
+ 0xf1a47,
+ 0x205842,
+ 0x201902,
+ 0x200382,
+ 0x2048c2,
+ 0xbc03,
+ 0x2003c2,
+ 0x1544,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x217083,
+ 0x29f804,
+ 0x7ffc8,
+ 0x229f43,
+ 0x20bc03,
+ 0xb8c3,
+ 0x123944,
+ 0x259b44,
+ 0x7ffc8,
+ 0x5842,
+ 0x229f43,
+ 0x25b9c4,
+ 0x258104,
+ 0x20bc03,
+ 0x200f82,
+ 0x81983,
+ 0x21f483,
+ 0x23ffc3,
+ 0x4a3c4,
+ 0x32e885,
+ 0x208ec2,
+ 0x325ec3,
+ 0x172fc9,
+ 0xf2386,
+ 0x87e08,
+ 0x2000c2,
+ 0x7ffc8,
+ 0x205842,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2005c2,
+ 0xbc03,
+ 0x21f483,
+ 0x2802,
+ 0x82,
+ 0xc2,
+ 0x1d0347,
+ 0x1e949,
+ 0x2fc3,
+ 0x7ffc8,
+ 0x18f203,
+ 0x7e724f47,
+ 0x29f43,
+ 0xfdc8,
+ 0x24d03,
+ 0x86247,
+ 0xe9c43,
+ 0x3d286,
+ 0x5e043,
+ 0xa9388,
+ 0xdc448,
+ 0x1d4883,
+ 0x122246,
+ 0x7e92fc05,
+ 0x1318c5,
+ 0x19c03,
+ 0x9dac8,
+ 0xe59c8,
+ 0x62b03,
+ 0x7ecf6786,
+ 0xfb305,
+ 0x869c4,
+ 0x3e8c7,
+ 0x127c3,
+ 0x4b83,
+ 0x1f483,
+ 0x2082,
+ 0x18a0ca,
+ 0x37945,
+ 0x3d43,
+ 0x7f2d8e0c,
+ 0x161c43,
+ 0x120984,
+ 0x118ecb,
+ 0x119488,
+ 0x1965c4,
+ 0xa1342,
+ 0x45f03,
+ 0x1434307,
+ 0x15ce3c7,
+ 0x14dff08,
+ 0x1445f03,
+ 0x1c8bc8,
+ 0x1496944,
+ 0x183dcb,
+ 0x12c82,
+ 0x1300c7,
+ 0x14bc04,
+ 0x2000c2,
+ 0x205842,
+ 0x241284,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2335c3,
+ 0x2127c3,
+ 0x21f483,
+ 0x2a31c3,
+ 0x217083,
+ 0x13803,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0xb8c3,
+ 0x24d03,
+ 0x814e9c43,
+ 0x80407,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x2335c3,
+ 0x2127c3,
+ 0x21f483,
+ 0x26ca02,
+ 0x2000c1,
+ 0x2000c2,
+ 0x200201,
+ 0x3385c2,
+ 0x7ffc8,
+ 0x224f85,
+ 0x200101,
+ 0x29f43,
+ 0x3b4c4,
+ 0x200d01,
+ 0x200501,
+ 0x200c01,
+ 0x254602,
+ 0x395c04,
+ 0x254603,
+ 0x200041,
+ 0x200801,
+ 0x200181,
+ 0x1eaa46,
+ 0x200701,
+ 0x3bc807,
+ 0x38decf,
+ 0x3786c6,
+ 0x2004c1,
+ 0x323986,
+ 0x200b41,
+ 0x200581,
+ 0x3b7fce,
+ 0x2003c1,
+ 0x21f483,
+ 0x200a81,
+ 0x328745,
+ 0x202082,
+ 0x216e05,
+ 0x200401,
+ 0x200741,
+ 0x2007c1,
+ 0x208ec2,
+ 0x200081,
+ 0x205241,
+ 0x201541,
+ 0x201c41,
+ 0x201b81,
+ 0x60209,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x10e7c8,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x21fc83,
+ 0x1efd03,
+ 0x229f43,
+ 0x2e9c43,
+ 0xa1288,
+ 0x219c03,
+ 0x2127c3,
+ 0x9843,
+ 0x21f483,
+ 0x82f0ad88,
+ 0x1ef9c3,
+ 0x11448,
+ 0x12d02,
+ 0x2583,
+ 0x6cc2,
+ 0x1b02,
+ 0x145d45,
+ 0x7ffc8,
+ 0x9e0c6,
+ 0x161487,
+ 0xbc03,
+ 0x145d45,
+ 0x179c04,
+ 0x199ac8,
+ 0x51a44,
+ 0x1217c7,
+ 0x63e44,
+ 0x5818c,
+ 0x1e6644,
+ 0x27885,
+ 0x60209,
+ 0x176507,
+ 0x1df86,
+ 0x5b74a,
+ 0x156e00a,
+ 0x11d484,
+ 0x1506c43,
+ 0x7ffc8,
+ 0x81983,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2127c3,
+ 0x21f483,
+ 0x2030c3,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2ef2c4,
+ 0x21f483,
+ 0x28a685,
+ 0x279884,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2026c2,
+ 0x2127c3,
+ 0x21f483,
+ 0x17083,
+ 0xf3f86,
+ 0xc2904,
+ 0x124a86,
+ 0x258843,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2026c2,
+ 0x2127c3,
+ 0x21f483,
+ 0x217083,
+ 0x205842,
+ 0x229f43,
+ 0x23ba49,
+ 0x224d03,
+ 0x2bc9c9,
+ 0x219c03,
+ 0x2127c3,
+ 0x8d344,
+ 0xbc03,
+ 0x21f483,
+ 0x305548,
+ 0x245347,
+ 0x32e885,
+ 0xd2048,
+ 0x12e889,
+ 0x1e5e08,
+ 0x1d0347,
+ 0xff04a,
+ 0x15964b,
+ 0x123bc7,
+ 0x4af48,
+ 0x8fca,
+ 0xc9508,
+ 0x1e949,
+ 0x2e447,
+ 0x1d8c7,
+ 0xbd08,
+ 0xfdc8,
+ 0x4cc4f,
+ 0xb0045,
+ 0x1f507,
+ 0x3d286,
+ 0x41007,
+ 0x12c686,
+ 0xa9388,
+ 0xae506,
+ 0x1404c7,
+ 0x167fc9,
+ 0x1ca87,
+ 0xe7d89,
+ 0xd2449,
+ 0xd9106,
+ 0xdc448,
+ 0xd2305,
+ 0x158e0a,
+ 0xe59c8,
+ 0x62b03,
+ 0xec9c8,
+ 0x3e8c7,
+ 0x1865c5,
+ 0x160810,
+ 0x4b83,
+ 0x81983,
+ 0x183307,
+ 0x1c605,
+ 0xffd88,
+ 0x7a605,
+ 0x161c43,
+ 0x1dea48,
+ 0x2606,
+ 0x15f089,
+ 0xbfb87,
+ 0x17328b,
+ 0x7f144,
+ 0x112d84,
+ 0x118ecb,
+ 0x119488,
+ 0x119d47,
+ 0x145d45,
+ 0x229f43,
+ 0x224d03,
+ 0x28c6c3,
+ 0x21f483,
+ 0x249f03,
+ 0x2e9c43,
+ 0x81983,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x1ddb4b,
+ 0x2000c2,
+ 0x205842,
+ 0x21f483,
+ 0x2102,
+ 0x26c2,
+ 0x5ec2,
+ 0x7ffc8,
+ 0x12b409,
+ 0x1c8bc8,
+ 0x5842,
+ 0x2000c2,
+ 0x205842,
+ 0x200382,
+ 0x2005c2,
+ 0x205c02,
+ 0x2127c3,
+ 0x165c6,
+ 0x2003c2,
+ 0x4a3c4,
+ 0x2000c2,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x200382,
+ 0x2e9c43,
+ 0x25e043,
+ 0x219c03,
+ 0x222d84,
+ 0x2127c3,
+ 0x21c043,
+ 0xbc03,
+ 0x21f483,
+ 0x320984,
+ 0x205ec3,
+ 0x2e9c43,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x20bc03,
+ 0x21f483,
+ 0x3c96c7,
+ 0x229f43,
+ 0x24dac7,
+ 0x3a3d06,
+ 0x21b983,
+ 0x226403,
+ 0x2e9c43,
+ 0x204203,
+ 0x258104,
+ 0x3b4204,
+ 0x33ef46,
+ 0x231083,
+ 0x2127c3,
+ 0x10aacb,
+ 0x21f483,
+ 0x28a685,
+ 0x22b5c4,
+ 0x3b6a43,
+ 0x3d8003,
+ 0x2e1487,
+ 0x236f05,
+ 0x2283,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x1c3404,
+ 0x21f483,
+ 0x1f343,
+ 0x8a30d6cc,
+ 0x5db43,
+ 0x53a87,
+ 0x4c106,
+ 0xd5247,
+ 0x135f85,
+ 0x204e42,
+ 0x256803,
+ 0x219383,
+ 0x258843,
+ 0x8ae29f43,
+ 0x208542,
+ 0x224d03,
+ 0x204b03,
+ 0x2e9c43,
+ 0x258104,
+ 0x3ce883,
+ 0x372ac3,
+ 0x219c03,
+ 0x222d84,
+ 0x8b203bc2,
+ 0x2127c3,
+ 0x21f483,
+ 0x2043c3,
+ 0x229c83,
+ 0x212843,
+ 0x26ca02,
+ 0x205ec3,
+ 0x7ffc8,
+ 0x2e9c43,
+ 0xb8c3,
+ 0x285584,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x241284,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x276f44,
+ 0x292e44,
+ 0x2edcc6,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x278606,
+ 0x46bcb,
+ 0x332c6,
+ 0x12650a,
+ 0x11e28a,
+ 0x7ffc8,
+ 0x243244,
+ 0x8c629f43,
+ 0x384f44,
+ 0x224d03,
+ 0x29e6c4,
+ 0x2e9c43,
+ 0x352e83,
+ 0x219c03,
+ 0x2127c3,
+ 0x81983,
+ 0x21f483,
+ 0x2f7c3,
+ 0x34804b,
+ 0x3dc94a,
+ 0x3ef4cc,
+ 0xf7088,
+ 0x2000c2,
+ 0x205842,
+ 0x200382,
+ 0x235c45,
+ 0x258104,
+ 0x2026c2,
+ 0x219c03,
+ 0x292e44,
+ 0x2048c2,
+ 0x2003c2,
+ 0x2036c2,
+ 0x26ca02,
+ 0x58843,
+ 0x35c2,
+ 0x2da949,
+ 0x27ce48,
+ 0x2f0949,
+ 0x3a6ac9,
+ 0x212d4a,
+ 0x214aca,
+ 0x20d482,
+ 0x2b90c2,
+ 0x5842,
+ 0x229f43,
+ 0x20f1c2,
+ 0x24cb46,
+ 0x329c42,
+ 0x48e02,
+ 0x20ad42,
+ 0x3599ce,
+ 0x21eece,
+ 0x212747,
+ 0x2154c2,
+ 0x224d03,
+ 0x2e9c43,
+ 0x205d42,
+ 0x2005c2,
+ 0x58103,
+ 0x24148f,
+ 0x21d942,
+ 0x2e8447,
+ 0x2ecb87,
+ 0x2f1d07,
+ 0x2f5d4c,
+ 0x2fbe8c,
+ 0x2fc844,
+ 0x291c0a,
+ 0x21ee02,
+ 0x208042,
+ 0x2d4344,
+ 0x200702,
+ 0x24f6c2,
+ 0x2fc0c4,
+ 0x21c142,
+ 0x20b982,
+ 0x280c3,
+ 0x2ae587,
+ 0x35ba05,
+ 0x22d442,
+ 0x240f84,
+ 0x20bdc2,
+ 0x2f6908,
+ 0x2127c3,
+ 0x37f808,
+ 0x204982,
+ 0x2fca05,
+ 0x3a4706,
+ 0x21f483,
+ 0x206582,
+ 0x300b87,
+ 0x2082,
+ 0x252e45,
+ 0x331d05,
+ 0x20b082,
+ 0x208382,
+ 0x3cb68a,
+ 0x2805ca,
+ 0x246f82,
+ 0x2af444,
+ 0x202602,
+ 0x23a8c8,
+ 0x20d682,
+ 0x2dd588,
+ 0x4c01,
+ 0x314487,
+ 0x315189,
+ 0x252ec2,
+ 0x31ab85,
+ 0x37ba45,
+ 0x21c6cb,
+ 0x20d0cc,
+ 0x2323c8,
+ 0x32ff08,
+ 0x202742,
+ 0x25d042,
+ 0x2000c2,
+ 0x7ffc8,
+ 0x205842,
+ 0x229f43,
+ 0x200382,
+ 0x2048c2,
+ 0xbc03,
+ 0x2003c2,
+ 0x21f483,
+ 0x2036c2,
+ 0x2000c2,
+ 0x145d45,
+ 0x8da05842,
+ 0x10d804,
+ 0x44005,
+ 0x8eae9c43,
+ 0x2280c3,
+ 0x2026c2,
+ 0x2127c3,
+ 0x3c5f83,
+ 0x8ee1f483,
+ 0x2fe343,
+ 0x2e2306,
+ 0x1976c5,
+ 0x1617083,
+ 0x145d45,
+ 0x1482cb,
+ 0x7ffc8,
+ 0x8dfce6c8,
+ 0x6b547,
+ 0x8e2ce18a,
+ 0x7fdc7,
+ 0xcab05,
+ 0x8e786f09,
+ 0x3204d,
+ 0x3d082,
+ 0x119a82,
+ 0xc41,
+ 0xf7544,
+ 0xb978a,
+ 0x80407,
+ 0x1e5c4,
+ 0x1e603,
+ 0x1e604,
+ 0x8f603e02,
+ 0x8fa00ac2,
+ 0x8fe00ec2,
+ 0x90200b82,
+ 0x90604142,
+ 0x90a03702,
+ 0xf1a47,
+ 0x90e05842,
+ 0x91215582,
+ 0x91605802,
+ 0x91a00d02,
+ 0x21eec3,
+ 0x2ba44,
+ 0x91f0e7c8,
+ 0x220f43,
+ 0x92217202,
+ 0x6d988,
+ 0x92602a82,
+ 0x82907,
+ 0x1bbe47,
+ 0x92a00042,
+ 0x92e02142,
+ 0x93200182,
+ 0x93603842,
+ 0x93a09c42,
+ 0x93e005c2,
+ 0x16a205,
+ 0x2191c3,
+ 0x368784,
+ 0x94200702,
+ 0x94619f42,
+ 0x94a065c2,
+ 0x8e04b,
+ 0x94e00b42,
+ 0x95654902,
+ 0x95a026c2,
+ 0x95e05c02,
+ 0x9dac8,
+ 0x9621dfc2,
+ 0x9660dec2,
+ 0x96a0f782,
+ 0x96e7eec2,
+ 0x97203bc2,
+ 0x97604242,
+ 0x97a048c2,
+ 0x97e0ee02,
+ 0x9822f002,
+ 0x9860e942,
+ 0xf9304,
+ 0x381983,
+ 0x98a3fa02,
+ 0x98e1d342,
+ 0x9920dcc2,
+ 0x996006c2,
+ 0x99a003c2,
+ 0x99e00a82,
+ 0xfde88,
+ 0x1ddcc7,
+ 0x9a202782,
+ 0x9a603342,
+ 0x9aa036c2,
+ 0x9ae1ee82,
+ 0x15804c,
+ 0x9b201c82,
+ 0x9b626d42,
+ 0x9ba06202,
+ 0x9be04c02,
+ 0x9c212182,
+ 0x9c612ec2,
+ 0x9ca05242,
+ 0x9ce0f542,
+ 0x9d288142,
+ 0x9d689482,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x2d643,
+ 0xc8503,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x953ce883,
+ 0x22d643,
+ 0x371b44,
+ 0x2f0846,
+ 0x309a43,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x271609,
+ 0x2035c2,
+ 0x367e03,
+ 0x2d2743,
+ 0x3b6c85,
+ 0x204b03,
+ 0x3ce883,
+ 0x22d643,
+ 0x2ed403,
+ 0x23c7c3,
+ 0x205249,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x2035c2,
+ 0x2035c2,
+ 0x3ce883,
+ 0x22d643,
+ 0x9de29f43,
+ 0x224d03,
+ 0x3a6d03,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0x7ffc8,
+ 0x205842,
+ 0x229f43,
+ 0x2127c3,
+ 0x21f483,
+ 0x71482,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x9e90b602,
+ 0x219c03,
+ 0x2127c3,
+ 0xbc03,
+ 0x21f483,
+ 0xd01,
+ 0x259b44,
+ 0x205842,
+ 0x229f43,
+ 0x200983,
+ 0x224d03,
+ 0x25b9c4,
+ 0x28c6c3,
+ 0x2e9c43,
+ 0x258104,
+ 0x25e043,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x23ffc3,
+ 0x32e885,
+ 0x23c7c3,
+ 0x205ec3,
+ 0x882,
+ 0xbc03,
+ 0x205842,
+ 0x229f43,
+ 0x3ce883,
+ 0x2127c3,
+ 0x21f483,
+ 0x2000c2,
+ 0x258843,
+ 0x7ffc8,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x2389c6,
+ 0x258104,
+ 0x25e043,
+ 0x222d84,
+ 0x2127c3,
+ 0x21f483,
+ 0x202783,
+ 0x45c4,
+ 0xb90c2,
+ 0x229f43,
+ 0x5483,
+ 0x224d03,
+ 0x26c2,
+ 0x2127c3,
+ 0x21f483,
+ 0x76c04,
+ 0x762c4,
+ 0xfc2,
+ 0x1489e07,
+ 0x187887,
+ 0x229f43,
+ 0x332c6,
+ 0x224d03,
+ 0x2e9c43,
+ 0xf8986,
+ 0x2127c3,
+ 0x21f483,
+ 0x32bbc8,
+ 0x32fd49,
+ 0x340f89,
+ 0x34b788,
+ 0x3a6908,
+ 0x3a6909,
+ 0x3254ca,
+ 0x362f8a,
+ 0x3a0d8a,
+ 0x3a8fca,
+ 0x3dc94a,
+ 0x3ea14b,
+ 0x230a4d,
+ 0x248e4f,
+ 0x36ea90,
+ 0x36668d,
+ 0x38b00c,
+ 0x3a8d0b,
+ 0x1a20c7,
+ 0x1299ce,
+ 0x12cd8a,
+ 0x12fa49,
+ 0x140f89,
+ 0x164fc9,
+ 0x16520a,
+ 0x16de09,
+ 0x16e789,
+ 0x17014b,
+ 0x29b08,
+ 0x10b448,
+ 0x14abc9,
+ 0x1498307,
+ 0xe3f05,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x1f483,
+ 0x2000c2,
+ 0x236d45,
+ 0x228083,
+ 0xa2e05842,
+ 0x224d03,
+ 0x2e9c43,
+ 0x3664c7,
+ 0x21b643,
+ 0x219c03,
+ 0x2127c3,
+ 0x25c743,
+ 0x21c043,
+ 0x204003,
+ 0x20bc03,
+ 0x21f483,
+ 0x25ce86,
+ 0x208ec2,
+ 0x205ec3,
+ 0x7ffc8,
+ 0x2000c2,
+ 0x258843,
+ 0x205842,
+ 0x229f43,
+ 0x224d03,
+ 0x2e9c43,
+ 0x258104,
+ 0x219c03,
+ 0x2127c3,
+ 0x21f483,
+ 0x217083,
+ 0x187887,
+ 0x12c82,
+ 0x9744,
+ 0x151d546,
+ 0x2000c2,
+ 0x205842,
+ 0x2e9c43,
+ 0x219c03,
+ 0x21f483,
+}
+
+// children is the list of nodes' children, the parent's wildcard bit and the
+// parent's node type. If a node has no children then their children index
+// will be in the range [0, 6), depending on the wildcard bit and node type.
+//
+// The layout within the uint32, from MSB to LSB, is:
+// [ 1 bits] unused
+// [ 1 bits] wildcard bit
+// [ 2 bits] node type
+// [14 bits] high nodes index (exclusive) of children
+// [14 bits] low nodes index (inclusive) of children
+var children = [...]uint32{
+ 0x0,
+ 0x10000000,
+ 0x20000000,
+ 0x40000000,
+ 0x50000000,
+ 0x60000000,
+ 0x17a05e2,
+ 0x17a45e8,
+ 0x17a85e9,
+ 0x17cc5ea,
+ 0x19245f3,
+ 0x193c649,
+ 0x195064f,
+ 0x1968654,
+ 0x198865a,
+ 0x19ac662,
+ 0x19c466b,
+ 0x1a04671,
+ 0x1a08681,
+ 0x1a30682,
+ 0x1a3468c,
+ 0x1a4c68d,
+ 0x1a50693,
+ 0x1a54694,
+ 0x1a94695,
+ 0x1a986a5,
+ 0x1a9c6a6,
+ 0x21aa06a7,
+ 0x61aa86a8,
+ 0x21ab06aa,
+ 0x1af86ac,
+ 0x1b006be,
+ 0x21b046c0,
+ 0x1b286c1,
+ 0x1b2c6ca,
+ 0x1b406cb,
+ 0x1b446d0,
+ 0x1b646d1,
+ 0x1b946d9,
+ 0x1bb06e5,
+ 0x1bb86ec,
+ 0x1be06ee,
+ 0x1bf86f8,
+ 0x21bfc6fe,
+ 0x21c006ff,
+ 0x1c04700,
+ 0x1c9c701,
+ 0x1cb0727,
+ 0x1cc472c,
+ 0x1cfc731,
+ 0x1d0c73f,
+ 0x1d20743,
+ 0x1d38748,
+ 0x1ddc74e,
+ 0x2010777,
+ 0x2018804,
+ 0x2201c806,
+ 0x22020807,
+ 0x208c808,
+ 0x20f8823,
+ 0x211083e,
+ 0x2124844,
+ 0x2128849,
+ 0x212c84a,
+ 0x213484b,
+ 0x214c84d,
+ 0x2150853,
+ 0x2174854,
+ 0x21c485d,
+ 0x21c8871,
+ 0x221cc872,
+ 0x21ec873,
+ 0x21f087b,
+ 0x21f487c,
+ 0x222087d,
+ 0x62224888,
+ 0x2222c889,
+ 0x2223088b,
+ 0x227488c,
+ 0x6227889d,
+ 0x229489e,
+ 0x22ec8a5,
+ 0x222f08bb,
+ 0x222f48bc,
+ 0x222fc8bd,
+ 0x223008bf,
+ 0x223048c0,
+ 0x23088c1,
+ 0x23108c2,
+ 0x23148c4,
+ 0x223208c5,
+ 0x223288c8,
+ 0x23388ca,
+ 0x23488ce,
+ 0x23fc8d2,
+ 0x24008ff,
+ 0x22410900,
+ 0x22414904,
+ 0x2241c905,
+ 0x2474907,
+ 0x247891d,
+ 0x247c91e,
+ 0x248091f,
+ 0x2a4c920,
+ 0x2a50a93,
+ 0x22af8a94,
+ 0x22afcabe,
+ 0x22b00abf,
+ 0x22b0cac0,
+ 0x22b10ac3,
+ 0x22b1cac4,
+ 0x22b20ac7,
+ 0x22b24ac8,
+ 0x22b28ac9,
+ 0x22b2caca,
+ 0x22b30acb,
+ 0x22b3cacc,
+ 0x22b40acf,
+ 0x22b4cad0,
+ 0x22b50ad3,
+ 0x22b54ad4,
+ 0x22b58ad5,
+ 0x22b64ad6,
+ 0x22b68ad9,
+ 0x22b74ada,
+ 0x22b78add,
+ 0x22b7cade,
+ 0x22b80adf,
+ 0x2b84ae0,
+ 0x22b88ae1,
+ 0x22b94ae2,
+ 0x22b98ae5,
+ 0x2b9cae6,
+ 0x2ba4ae7,
+ 0x62bb0ae9,
+ 0x2bf4aec,
+ 0x22c14afd,
+ 0x22c18b05,
+ 0x22c1cb06,
+ 0x22c24b07,
+ 0x22c2cb09,
+ 0x22c30b0b,
+ 0x22c34b0c,
+ 0x22c3cb0d,
+ 0x22c40b0f,
+ 0x22c44b10,
+ 0x2c48b11,
+ 0x22c74b12,
+ 0x22c78b1d,
+ 0x22c7cb1e,
+ 0x2c80b1f,
+ 0x22c84b20,
+ 0x22c88b21,
+ 0x22c94b22,
+ 0x22c98b25,
+ 0x2c9cb26,
+ 0x2ca4b27,
+ 0x2cacb29,
+ 0x2cb0b2b,
+ 0x2cccb2c,
+ 0x2ce4b33,
+ 0x2ce8b39,
+ 0x2cf8b3a,
+ 0x2d04b3e,
+ 0x2d38b41,
+ 0x2d40b4e,
+ 0x22d44b50,
+ 0x2d5cb51,
+ 0x22d64b57,
+ 0x22d68b59,
+ 0x22d70b5a,
+ 0x2e74b5c,
+ 0x22e78b9d,
+ 0x2e80b9e,
+ 0x2e84ba0,
+ 0x22e88ba1,
+ 0x2e8cba2,
+ 0x2ed0ba3,
+ 0x2ed4bb4,
+ 0x2ed8bb5,
+ 0x2ef0bb6,
+ 0x2f04bbc,
+ 0x2f2cbc1,
+ 0x2f54bcb,
+ 0x2f58bd5,
+ 0x62f5cbd6,
+ 0x2f90bd7,
+ 0x2f94be4,
+ 0x22f98be5,
+ 0x2f9cbe6,
+ 0x2fc4be7,
+ 0x2fc8bf1,
+ 0x2fecbf2,
+ 0x2ff0bfb,
+ 0x3004bfc,
+ 0x3008c01,
+ 0x300cc02,
+ 0x302cc03,
+ 0x304cc0b,
+ 0x23050c13,
+ 0x3054c14,
+ 0x23058c15,
+ 0x305cc16,
+ 0x3060c17,
+ 0x3064c18,
+ 0x3068c19,
+ 0x3084c1a,
+ 0x23088c21,
+ 0x23090c22,
+ 0x3094c24,
+ 0x30bcc25,
+ 0x30d0c2f,
+ 0x3144c34,
+ 0x3150c51,
+ 0x3154c54,
+ 0x3174c55,
+ 0x318cc5d,
+ 0x3190c63,
+ 0x31a4c64,
+ 0x31bcc69,
+ 0x31dcc6f,
+ 0x31f4c77,
+ 0x31fcc7d,
+ 0x3218c7f,
+ 0x3234c86,
+ 0x3238c8d,
+ 0x3264c8e,
+ 0x3284c99,
+ 0x32a4ca1,
+ 0x32a8ca9,
+ 0x3310caa,
+ 0x3330cc4,
+ 0x3358ccc,
+ 0x335ccd6,
+ 0x3374cd7,
+ 0x33b8cdd,
+ 0x3438cee,
+ 0x3478d0e,
+ 0x347cd1e,
+ 0x3488d1f,
+ 0x34a8d22,
+ 0x34b0d2a,
+ 0x34d4d2c,
+ 0x34dcd35,
+ 0x351cd37,
+ 0x3570d47,
+ 0x3574d5c,
+ 0x3678d5d,
+ 0x23680d9e,
+ 0x23684da0,
+ 0x23688da1,
+ 0x2368cda2,
+ 0x23690da3,
+ 0x3694da4,
+ 0x23698da5,
+ 0x2369cda6,
+ 0x236a0da7,
+ 0x36a4da8,
+ 0x236a8da9,
+ 0x236b8daa,
+ 0x236bcdae,
+ 0x236c0daf,
+ 0x236c4db0,
+ 0x236c8db1,
+ 0x236ccdb2,
+ 0x236d0db3,
+ 0x36e8db4,
+ 0x370cdba,
+ 0x372cdc3,
+ 0x3da0dcb,
+ 0x23da4f68,
+ 0x23da8f69,
+ 0x23dacf6a,
+ 0x23db0f6b,
+ 0x3dc0f6c,
+ 0x3de0f70,
+ 0x3fa0f78,
+ 0x4070fe8,
+ 0x40e101c,
+ 0x4139038,
+ 0x422104e,
+ 0x4279088,
+ 0x42b509e,
+ 0x43b10ad,
+ 0x447d0ec,
+ 0x451511f,
+ 0x45a5145,
+ 0x4609169,
+ 0x4841182,
+ 0x48f9210,
+ 0x49c523e,
+ 0x4a11271,
+ 0x4a99284,
+ 0x4ad52a6,
+ 0x4b252b5,
+ 0x4b9d2c9,
+ 0x64ba12e7,
+ 0x64ba52e8,
+ 0x64ba92e9,
+ 0x4c252ea,
+ 0x4c81309,
+ 0x4cfd320,
+ 0x4d7533f,
+ 0x4df535d,
+ 0x4e6137d,
+ 0x4f8d398,
+ 0x4fe53e3,
+ 0x64fe93f9,
+ 0x50813fa,
+ 0x5089420,
+ 0x2508d422,
+ 0x5115423,
+ 0x5161445,
+ 0x51c9458,
+ 0x5271472,
+ 0x533949c,
+ 0x53a14ce,
+ 0x54b54e8,
+ 0x654b952d,
+ 0x654bd52e,
+ 0x551952f,
+ 0x5575546,
+ 0x560555d,
+ 0x5681581,
+ 0x56c55a0,
+ 0x57a95b1,
+ 0x57dd5ea,
+ 0x583d5f7,
+ 0x58b160f,
+ 0x593962c,
+ 0x597964e,
+ 0x59e965e,
+ 0x659ed67a,
+ 0x5a1567b,
+ 0x5a19685,
+ 0x5a49686,
+ 0x5a65692,
+ 0x5aa9699,
+ 0x5ab96aa,
+ 0x5ad16ae,
+ 0x5b496b4,
+ 0x5b516d2,
+ 0x5b6d6d4,
+ 0x5b816db,
+ 0x5ba56e0,
+ 0x25ba96e9,
+ 0x5bd56ea,
+ 0x5bd96f5,
+ 0x5be16f6,
+ 0x5bf56f8,
+ 0x5c156fd,
+ 0x5c25705,
+ 0x5c31709,
+ 0x5c6d70c,
+ 0x5c7171b,
+ 0x5c7971c,
+ 0x5c8d71e,
+ 0x5cb5723,
+ 0x5cc172d,
+ 0x5cc9730,
+ 0x5cf1732,
+ 0x5d1573c,
+ 0x5d2d745,
+ 0x5d3174b,
+ 0x5d3974c,
+ 0x5d4174e,
+ 0x5d55750,
+ 0x5e11755,
+ 0x5e15784,
+ 0x5e1d785,
+ 0x5e21787,
+ 0x5e45788,
+ 0x5e69791,
+ 0x5e8579a,
+ 0x5e997a1,
+ 0x5ead7a6,
+ 0x5eb57ab,
+ 0x5ebd7ad,
+ 0x5ec57af,
+ 0x5edd7b1,
+ 0x5eed7b7,
+ 0x5ef17bb,
+ 0x5f0d7bc,
+ 0x67957c3,
+ 0x67cd9e5,
+ 0x67f99f3,
+ 0x68159fe,
+ 0x6839a05,
+ 0x6859a0e,
+ 0x689da16,
+ 0x68a5a27,
+ 0x268a9a29,
+ 0x268ada2a,
+ 0x68b5a2b,
+ 0x6ae5a2d,
+ 0x6af9ab9,
+ 0x26afdabe,
+ 0x6b01abf,
+ 0x6b09ac0,
+ 0x26b15ac2,
+ 0x26b25ac5,
+ 0x26b2dac9,
+ 0x26b39acb,
+ 0x6b3dace,
+ 0x26b41acf,
+ 0x26b59ad0,
+ 0x26b61ad6,
+ 0x26b69ad8,
+ 0x26b6dada,
+ 0x26b75adb,
+ 0x6b79add,
+ 0x26b7dade,
+ 0x6b81adf,
+ 0x26b8dae0,
+ 0x6b95ae3,
+ 0x6ba9ae5,
+ 0x6badaea,
+ 0x6bd5aeb,
+ 0x6c11af5,
+ 0x6c15b04,
+ 0x6c4db05,
+ 0x6c71b13,
+ 0x77c9b1c,
+ 0x77cddf2,
+ 0x77d1df3,
+ 0x277d5df4,
+ 0x77d9df5,
+ 0x277dddf6,
+ 0x77e1df7,
+ 0x277eddf8,
+ 0x77f1dfb,
+ 0x77f5dfc,
+ 0x277f9dfd,
+ 0x77fddfe,
+ 0x27805dff,
+ 0x7809e01,
+ 0x780de02,
+ 0x2781de03,
+ 0x7821e07,
+ 0x7825e08,
+ 0x7829e09,
+ 0x782de0a,
+ 0x27831e0b,
+ 0x7835e0c,
+ 0x7839e0d,
+ 0x783de0e,
+ 0x7841e0f,
+ 0x27849e10,
+ 0x784de12,
+ 0x7851e13,
+ 0x7855e14,
+ 0x27859e15,
+ 0x785de16,
+ 0x27865e17,
+ 0x27869e19,
+ 0x7885e1a,
+ 0x789de21,
+ 0x78e1e27,
+ 0x78e5e38,
+ 0x7909e39,
+ 0x791de42,
+ 0x7921e47,
+ 0x7925e48,
+ 0x7ae9e49,
+ 0x27aedeba,
+ 0x27af5ebb,
+ 0x27af9ebd,
+ 0x27afdebe,
+ 0x7b05ebf,
+ 0x7be1ec1,
+ 0x27bedef8,
+ 0x27bf1efb,
+ 0x27bf5efc,
+ 0x27bf9efd,
+ 0x7bfdefe,
+ 0x7c29eff,
+ 0x7c39f0a,
+ 0x7c3df0e,
+ 0x7c61f0f,
+ 0x7c6df18,
+ 0x7c8df1b,
+ 0x7c91f23,
+ 0x7cc9f24,
+ 0x7f85f32,
+ 0x8041fe1,
+ 0x8046010,
+ 0x804a011,
+ 0x805e012,
+ 0x8062017,
+ 0x8096018,
+ 0x80ce025,
+ 0x280d2033,
+ 0x80ee034,
+ 0x811603b,
+ 0x811a045,
+ 0x813e046,
+ 0x815a04f,
+ 0x8182056,
+ 0x8192060,
+ 0x8196064,
+ 0x819a065,
+ 0x81d6066,
+ 0x81e2075,
+ 0x820a078,
+ 0x82ae082,
+ 0x282b20ab,
+ 0x82b60ac,
+ 0x82c60ad,
+ 0x282ca0b1,
+ 0x82de0b2,
+ 0x82fa0b7,
+ 0x831a0be,
+ 0x831e0c6,
+ 0x83320c7,
+ 0x83460cc,
+ 0x834a0d1,
+ 0x83520d2,
+ 0x83560d4,
+ 0x83760d5,
+ 0x84220dd,
+ 0x8426108,
+ 0x8446109,
+ 0x8472111,
+ 0x2848211c,
+ 0x8486120,
+ 0x8496121,
+ 0x84d6125,
+ 0x84de135,
+ 0x84f2137,
+ 0x851213c,
+ 0x852e144,
+ 0x853a14b,
+ 0x855a14e,
+ 0x858e156,
+ 0x8596163,
+ 0x866a165,
+ 0x866e19a,
+ 0x868219b,
+ 0x868a1a0,
+ 0x86a21a2,
+ 0x86a61a8,
+ 0x86b21a9,
+ 0x86be1ac,
+ 0x86c21af,
+ 0x86ca1b0,
+ 0x86ce1b2,
+ 0x86f21b3,
+ 0x87321bc,
+ 0x87361cc,
+ 0x87561cd,
+ 0x87aa1d5,
+ 0x87da1ea,
+ 0x287de1f6,
+ 0x87e61f7,
+ 0x883e1f9,
+ 0x884220f,
+ 0x8846210,
+ 0x884a211,
+ 0x888e212,
+ 0x889e223,
+ 0x88de227,
+ 0x88e2237,
+ 0x8912238,
+ 0x8a5e244,
+ 0x8a86297,
+ 0x8ac22a1,
+ 0x8aea2b0,
+ 0x28af22ba,
+ 0x28af62bc,
+ 0x28afa2bd,
+ 0x8b022be,
+ 0x8b0e2c0,
+ 0x8c322c3,
+ 0x8c3e30c,
+ 0x8c4a30f,
+ 0x8c56312,
+ 0x8c62315,
+ 0x8c6e318,
+ 0x8c7a31b,
+ 0x8c8631e,
+ 0x8c92321,
+ 0x8c9e324,
+ 0x8caa327,
+ 0x28cae32a,
+ 0x8cba32b,
+ 0x8cc632e,
+ 0x8cd2331,
+ 0x8cda334,
+ 0x8ce6336,
+ 0x8cf2339,
+ 0x8cfe33c,
+ 0x8d0a33f,
+ 0x8d16342,
+ 0x8d22345,
+ 0x8d2e348,
+ 0x8d3a34b,
+ 0x8d4634e,
+ 0x8d52351,
+ 0x8d5e354,
+ 0x8d8a357,
+ 0x8d96362,
+ 0x8da2365,
+ 0x8dae368,
+ 0x8dba36b,
+ 0x8dc636e,
+ 0x8dce371,
+ 0x8dda373,
+ 0x8de6376,
+ 0x8df2379,
+ 0x8dfe37c,
+ 0x8e0a37f,
+ 0x8e16382,
+ 0x8e22385,
+ 0x8e2e388,
+ 0x8e3a38b,
+ 0x8e4638e,
+ 0x8e52391,
+ 0x8e5a394,
+ 0x8e66396,
+ 0x8e6e399,
+ 0x8e7a39b,
+ 0x8e8639e,
+ 0x8e923a1,
+ 0x8e9e3a4,
+ 0x8eaa3a7,
+ 0x8eb63aa,
+ 0x8ec23ad,
+ 0x8ece3b0,
+ 0x8ed23b3,
+ 0x8ede3b4,
+ 0x8efa3b7,
+ 0x8efe3be,
+ 0x8f0e3bf,
+ 0x8f323c3,
+ 0x8f363cc,
+ 0x8f7a3cd,
+ 0x8f823de,
+ 0x8f963e0,
+ 0x8fca3e5,
+ 0x8fea3f2,
+ 0x8fee3fa,
+ 0x8ff63fb,
+ 0x901a3fd,
+ 0x9032406,
+ 0x904a40c,
+ 0x9062412,
+ 0x908a418,
+ 0x909e422,
+ 0x90b6427,
+ 0x90ba42d,
+ 0x2910242e,
+ 0x9106440,
+ 0x9132441,
+ 0x914244c,
+ 0x9156450,
+}
+
+// max children 654 (capacity 1023)
+// max text offset 31758 (capacity 32767)
+// max text length 36 (capacity 63)
+// max hi 9301 (capacity 16383)
+// max lo 9296 (capacity 16383)