~tsileo/blobstash

215df8407ff1403efd97b57f8c00c225fc0b2085 — Thomas Sileo 18 days ago f51afd9
vendor: update deps
81 files changed, 1217 insertions(+), 801 deletions(-)

M go.mod
M go.sum
M vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
M vendor/github.com/aws/aws-sdk-go/aws/version.go
M vendor/github.com/golang/protobuf/proto/buffer.go
M vendor/github.com/golang/protobuf/proto/extensions.go
M vendor/github.com/golang/protobuf/proto/registry.go
M vendor/github.com/golang/protobuf/proto/text_encode.go
M vendor/github.com/klauspost/cpuid/cpuid.go
M vendor/github.com/klauspost/reedsolomon/.travis.yml
M vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.go
M vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.s
M vendor/github.com/klauspost/reedsolomon/galois_amd64.go
M vendor/github.com/klauspost/reedsolomon/galois_arm64.go
M vendor/github.com/klauspost/reedsolomon/galois_noasm.go
A vendor/github.com/klauspost/reedsolomon/galois_notamd64.go
M vendor/github.com/klauspost/reedsolomon/galois_ppc64le.go
A vendor/github.com/klauspost/reedsolomon/go.mod
A vendor/github.com/klauspost/reedsolomon/go.sum
M vendor/github.com/klauspost/reedsolomon/options.go
M vendor/github.com/klauspost/reedsolomon/reedsolomon.go
M vendor/github.com/sirupsen/logrus/CHANGELOG.md
M vendor/github.com/sirupsen/logrus/appveyor.yml
M vendor/github.com/sirupsen/logrus/entry.go
M vendor/github.com/sirupsen/logrus/go.mod
M vendor/github.com/sirupsen/logrus/go.sum
M vendor/github.com/sirupsen/logrus/text_formatter.go
A vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go
M vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go
M vendor/golang.org/x/sys/unix/syscall_linux.go
M vendor/golang.org/x/sys/unix/syscall_linux_386.go
M vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
M vendor/golang.org/x/sys/unix/syscall_linux_arm.go
M vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
M vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
M vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
M vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
M vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
M vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
M vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
M vendor/golang.org/x/sys/unix/syscall_unix.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
M vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
M vendor/google.golang.org/protobuf/encoding/prototext/encode.go
M vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
M vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go
M vendor/google.golang.org/protobuf/internal/fieldsort/fieldsort.go
M vendor/google.golang.org/protobuf/internal/filedesc/desc.go
M vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
M vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
M vendor/google.golang.org/protobuf/internal/impl/codec_message.go
M vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
M vendor/google.golang.org/protobuf/internal/impl/convert.go
M vendor/google.golang.org/protobuf/internal/impl/convert_list.go
M vendor/google.golang.org/protobuf/internal/impl/convert_map.go
M vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
M vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
M vendor/google.golang.org/protobuf/internal/impl/message.go
M vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
M vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
M vendor/google.golang.org/protobuf/internal/impl/validate.go
M vendor/google.golang.org/protobuf/internal/impl/weak.go
M vendor/google.golang.org/protobuf/internal/version/version.go
M vendor/google.golang.org/protobuf/proto/checkinit.go
M vendor/google.golang.org/protobuf/proto/encode.go
M vendor/google.golang.org/protobuf/proto/extension.go
M vendor/google.golang.org/protobuf/proto/merge.go
M vendor/google.golang.org/protobuf/proto/size.go
M vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go
M vendor/google.golang.org/protobuf/reflect/protoreflect/type.go
M vendor/google.golang.org/protobuf/reflect/protoreflect/value.go
M vendor/modules.txt
M go.mod => go.mod +6 -6
@@ 7,14 7,14 @@ require (
	a4.io/go/indieauth v1.0.3
	a4.io/ssse v0.0.0-20181202155639-1949828a8689
	github.com/alecthomas/chroma v0.7.2 // indirect
	github.com/aws/aws-sdk-go v1.30.18
	github.com/aws/aws-sdk-go v1.30.23
	github.com/blevesearch/segment v0.9.0
	github.com/carbocation/interpose v0.0.0-20161206215253-723534742ba3
	github.com/dave/jennifer v1.4.0
	github.com/dustin/go-humanize v1.0.0
	github.com/e3b0c442/warp v0.6.1
	github.com/evanphx/json-patch v4.5.0+incompatible
	github.com/golang/protobuf v1.4.0 // indirect
	github.com/golang/protobuf v1.4.1 // indirect
	github.com/golang/snappy v0.0.1
	github.com/gorilla/context v1.1.1
	github.com/gorilla/handlers v1.4.2


@@ 22,7 22,7 @@ require (
	github.com/gorilla/sessions v1.2.0
	github.com/hashicorp/golang-lru v0.5.4
	github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1
	github.com/klauspost/reedsolomon v1.9.4 // indirect
	github.com/klauspost/reedsolomon v1.9.6 // indirect
	github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect
	github.com/mvdan/xurls v1.1.0 // indirect
	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646


@@ 30,7 30,7 @@ require (
	github.com/restic/chunker v0.3.0
	github.com/robfig/cron v1.2.0
	github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd
	github.com/sirupsen/logrus v1.5.0 // indirect
	github.com/sirupsen/logrus v1.6.0 // indirect
	github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d
	github.com/unrolled/secure v1.0.7
	github.com/vmihailenco/msgpack v4.0.4+incompatible


@@ 38,8 38,8 @@ require (
	github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb
	github.com/zpatrick/rbac v0.0.0-20180829190353-d2c4f050cf28
	golang.org/x/crypto v0.0.0-20200429183012-4b2356b1ed79
	golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 // indirect
	golang.org/x/sys v0.0.0-20200430082407-1f5687305801 // indirect
	golang.org/x/net v0.0.0-20200506145744-7e3656a0809f // indirect
	golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect
	google.golang.org/appengine v1.6.6 // indirect
	gopkg.in/inconshreveable/log15.v2 v2.0.0-20200109203555-b30bc20e4fd1
	gopkg.in/src-d/go-git.v4 v4.13.1

M go.sum => go.sum +16 -0
@@ 91,6 91,8 @@ github.com/aws/aws-sdk-go v1.30.14 h1:vZfX2b/fknc9wKcytbLWykM7in5k6dbQ8iHTJDUP1N
github.com/aws/aws-sdk-go v1.30.14/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/aws/aws-sdk-go v1.30.18 h1:aRdRUA5V7RMvScHBBg+4elOrSM+5oHsYzUngLuSK6lY=
github.com/aws/aws-sdk-go v1.30.18/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/aws/aws-sdk-go v1.30.23 h1:1Npeg2q6hicbrHoFu6MoeqZdcQf8187BI0VwKxEfLAY=
github.com/aws/aws-sdk-go v1.30.23/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f h1:kqbi9lqXLLs+zfWlgo1PIiRQ86n33K1JKotjj4rSYOg=
github.com/blevesearch/segment v0.0.0-20160915185041-762005e7a34f/go.mod h1:IInt5XRvpiGE09KOk9mmCMLjHhydIhNPKPPFLFBB7L8=
github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac=


@@ 185,6 187,8 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=


@@ 263,6 267,8 @@ github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.4 h1:EBfaK0SWSwk+fgk6efYFWdzl8MwRWoOO1gkmiaTXPW4=
github.com/klauspost/cpuid v1.2.4/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/reedsolomon v1.7.0 h1:pLFmRKGko2ZieiTGyo9DahLCIuljyxm+Zzhz/fYEonE=
github.com/klauspost/reedsolomon v1.7.0/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
github.com/klauspost/reedsolomon v1.8.0 h1:lvvOkvk64cE1EGbBIgFk7WSOOsI1GexpuLiT7zjab6g=


@@ 271,6 277,8 @@ github.com/klauspost/reedsolomon v1.9.3 h1:N/VzgeMfHmLc+KHMD1UL/tNkfXAt8FnUqlgXG
github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
github.com/klauspost/reedsolomon v1.9.4 h1:FB9jDBGqUNyhUg4Gszz384ulFqVSc61Pdap+HRPgnSo=
github.com/klauspost/reedsolomon v1.9.4/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
github.com/klauspost/reedsolomon v1.9.6 h1:sXZANEgYACIcmbk90z6MV4XL29d0Lm6AFleWRPZJxi8=
github.com/klauspost/reedsolomon v1.9.6/go.mod h1:+8WD025Xpby8/kG5h/HDPIFhiiuGEtZOKw+5Y4drAD8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=


@@ 374,6 382,8 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q=
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4=
github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI=
github.com/src-d/go-oniguruma v1.1.0 h1:EG+Nm5n2JqWUaCjtM0NtutPxU7ZN5Tp50GWrrV8bTww=


@@ 508,6 518,8 @@ golang.org/x/net v0.0.0-20200421231249-e086a090c8fd h1:QPwSajcTUrFriMF1nJ3Xzgoqa
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=


@@ 555,6 567,8 @@ golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f h1:gWF768j/LaZugp8dyS4UwsslY
golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200430082407-1f5687305801 h1:Jp2/1+ZY++XrlALjnberpN8QkAUPNLkIjQIMInPpQxc=
golang.org/x/sys v0.0.0-20200430082407-1f5687305801/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w=
golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=


@@ 575,6 589,8 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

M vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go => vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +128 -22
@@ 25,12 25,12 @@ const (
	ApSoutheast1RegionID = "ap-southeast-1" // Asia Pacific (Singapore).
	ApSoutheast2RegionID = "ap-southeast-2" // Asia Pacific (Sydney).
	CaCentral1RegionID   = "ca-central-1"   // Canada (Central).
	EuCentral1RegionID   = "eu-central-1"   // EU (Frankfurt).
	EuNorth1RegionID     = "eu-north-1"     // EU (Stockholm).
	EuCentral1RegionID   = "eu-central-1"   // Europe (Frankfurt).
	EuNorth1RegionID     = "eu-north-1"     // Europe (Stockholm).
	EuSouth1RegionID     = "eu-south-1"     // Europe (Milan).
	EuWest1RegionID      = "eu-west-1"      // EU (Ireland).
	EuWest2RegionID      = "eu-west-2"      // EU (London).
	EuWest3RegionID      = "eu-west-3"      // EU (Paris).
	EuWest1RegionID      = "eu-west-1"      // Europe (Ireland).
	EuWest2RegionID      = "eu-west-2"      // Europe (London).
	EuWest3RegionID      = "eu-west-3"      // Europe (Paris).
	MeSouth1RegionID     = "me-south-1"     // Middle East (Bahrain).
	SaEast1RegionID      = "sa-east-1"      // South America (Sao Paulo).
	UsEast1RegionID      = "us-east-1"      // US East (N. Virginia).


@@ 48,7 48,7 @@ const (
// AWS GovCloud (US) partition's regions.
const (
	UsGovEast1RegionID = "us-gov-east-1" // AWS GovCloud (US-East).
	UsGovWest1RegionID = "us-gov-west-1" // AWS GovCloud (US).
	UsGovWest1RegionID = "us-gov-west-1" // AWS GovCloud (US-West).
)

// AWS ISO (US) partition's regions.


@@ 134,22 134,22 @@ var awsPartition = partition{
			Description: "Canada (Central)",
		},
		"eu-central-1": region{
			Description: "EU (Frankfurt)",
			Description: "Europe (Frankfurt)",
		},
		"eu-north-1": region{
			Description: "EU (Stockholm)",
			Description: "Europe (Stockholm)",
		},
		"eu-south-1": region{
			Description: "Europe (Milan)",
		},
		"eu-west-1": region{
			Description: "EU (Ireland)",
			Description: "Europe (Ireland)",
		},
		"eu-west-2": region{
			Description: "EU (London)",
			Description: "Europe (London)",
		},
		"eu-west-3": region{
			Description: "EU (Paris)",
			Description: "Europe (Paris)",
		},
		"me-south-1": region{
			Description: "Middle East (Bahrain)",


@@ 3221,6 3221,7 @@ var awsPartition = partition{
				"eu-central-1":   endpoint{},
				"eu-west-1":      endpoint{},
				"eu-west-2":      endpoint{},
				"sa-east-1":      endpoint{},
				"us-east-1":      endpoint{},
				"us-east-2":      endpoint{},
				"us-west-1":      endpoint{},


@@ 3870,11 3871,41 @@ var awsPartition = partition{
				"eu-west-1":      endpoint{},
				"eu-west-2":      endpoint{},
				"eu-west-3":      endpoint{},
				"me-south-1":     endpoint{},
				"us-east-1":      endpoint{},
				"us-east-2":      endpoint{},
				"us-west-1":      endpoint{},
				"us-west-2":      endpoint{},
				"fips-ca-central-1": endpoint{
					Hostname: "outposts-fips.ca-central-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "ca-central-1",
					},
				},
				"fips-us-east-1": endpoint{
					Hostname: "outposts-fips.us-east-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-east-1",
					},
				},
				"fips-us-east-2": endpoint{
					Hostname: "outposts-fips.us-east-2.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-east-2",
					},
				},
				"fips-us-west-1": endpoint{
					Hostname: "outposts-fips.us-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-west-1",
					},
				},
				"fips-us-west-2": endpoint{
					Hostname: "outposts-fips.us-west-2.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-west-2",
					},
				},
				"me-south-1": endpoint{},
				"us-east-1":  endpoint{},
				"us-east-2":  endpoint{},
				"us-west-1":  endpoint{},
				"us-west-2":  endpoint{},
			},
		},
		"pinpoint": service{


@@ 4632,6 4663,7 @@ var awsPartition = partition{
		"secretsmanager": service{

			Endpoints: endpoints{
				"af-south-1":     endpoint{},
				"ap-east-1":      endpoint{},
				"ap-northeast-1": endpoint{},
				"ap-northeast-2": endpoint{},


@@ 4641,6 4673,7 @@ var awsPartition = partition{
				"ca-central-1":   endpoint{},
				"eu-central-1":   endpoint{},
				"eu-north-1":     endpoint{},
				"eu-south-1":     endpoint{},
				"eu-west-1":      endpoint{},
				"eu-west-2":      endpoint{},
				"eu-west-3":      endpoint{},


@@ 4679,6 4712,7 @@ var awsPartition = partition{
		"securityhub": service{

			Endpoints: endpoints{
				"af-south-1":     endpoint{},
				"ap-east-1":      endpoint{},
				"ap-northeast-1": endpoint{},
				"ap-northeast-2": endpoint{},


@@ 4688,6 4722,7 @@ var awsPartition = partition{
				"ca-central-1":   endpoint{},
				"eu-central-1":   endpoint{},
				"eu-north-1":     endpoint{},
				"eu-south-1":     endpoint{},
				"eu-west-1":      endpoint{},
				"eu-west-2":      endpoint{},
				"eu-west-3":      endpoint{},


@@ 6612,7 6647,7 @@ var awsusgovPartition = partition{
			Description: "AWS GovCloud (US-East)",
		},
		"us-gov-west-1": region{
			Description: "AWS GovCloud (US)",
			Description: "AWS GovCloud (US-West)",
		},
	},
	Services: services{


@@ 6812,8 6847,18 @@ var awsusgovPartition = partition{
		"cloudtrail": service{

			Endpoints: endpoints{
				"us-gov-east-1": endpoint{},
				"us-gov-west-1": endpoint{},
				"us-gov-east-1": endpoint{
					Hostname: "cloudtrail.us-gov-east-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-east-1",
					},
				},
				"us-gov-west-1": endpoint{
					Hostname: "cloudtrail.us-gov-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-west-1",
					},
				},
			},
		},
		"codebuild": service{


@@ 7101,12 7146,36 @@ var awsusgovPartition = partition{
		"elasticmapreduce": service{

			Endpoints: endpoints{
				"fips-us-gov-east-1": endpoint{
					Hostname: "elasticmapreduce.us-gov-east-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-east-1",
					},
				},
				"fips-us-gov-west-1": endpoint{
					Hostname: "elasticmapreduce.us-gov-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-west-1",
					},
				},
				"us-gov-east-1": endpoint{},
				"us-gov-west-1": endpoint{
					Protocols: []string{"https"},
				},
			},
		},
		"email": service{

			Endpoints: endpoints{
				"fips-us-gov-west-1": endpoint{
					Hostname: "email-fips.us-gov-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-west-1",
					},
				},
				"us-gov-west-1": endpoint{},
			},
		},
		"es": service{

			Endpoints: endpoints{


@@ 7123,8 7192,18 @@ var awsusgovPartition = partition{
		"events": service{

			Endpoints: endpoints{
				"us-gov-east-1": endpoint{},
				"us-gov-west-1": endpoint{},
				"us-gov-east-1": endpoint{
					Hostname: "events.us-gov-east-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-east-1",
					},
				},
				"us-gov-west-1": endpoint{
					Hostname: "events.us-gov-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-west-1",
					},
				},
			},
		},
		"firehose": service{


@@ 7255,6 7334,13 @@ var awsusgovPartition = partition{
				"us-gov-west-1": endpoint{},
			},
		},
		"kafka": service{

			Endpoints: endpoints{
				"us-gov-east-1": endpoint{},
				"us-gov-west-1": endpoint{},
			},
		},
		"kinesis": service{

			Endpoints: endpoints{


@@ 7389,7 7475,27 @@ var awsusgovPartition = partition{
		"outposts": service{

			Endpoints: endpoints{
				"us-gov-east-1": endpoint{},
				"us-gov-east-1": endpoint{
					Hostname: "outposts.us-gov-east-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-east-1",
					},
				},
				"us-gov-west-1": endpoint{
					Hostname: "outposts.us-gov-west-1.amazonaws.com",
					CredentialScope: credentialScope{
						Region: "us-gov-west-1",
					},
				},
			},
		},
		"pinpoint": service{
			Defaults: endpoint{
				CredentialScope: credentialScope{
					Service: "mobiletargeting",
				},
			},
			Endpoints: endpoints{
				"us-gov-west-1": endpoint{},
			},
		},

M vendor/github.com/aws/aws-sdk-go/aws/version.go => vendor/github.com/aws/aws-sdk-go/aws/version.go +1 -1
@@ 5,4 5,4 @@ package aws
const SDKName = "aws-sdk-go"

// SDKVersion is the version of this SDK
const SDKVersion = "1.30.18"
const SDKVersion = "1.30.23"

M vendor/github.com/golang/protobuf/proto/buffer.go => vendor/github.com/golang/protobuf/proto/buffer.go +7 -7
@@ 33,8 33,8 @@ func SizeVarint(v uint64) int {
	return protowire.SizeVarint(v)
}

// DecodeVarint parses a varint encoded integer from b, returning the
// integer value and the length of the varint.
// DecodeVarint parses a varint encoded integer from b,
// returning the integer value and the length of the varint.
// It returns (0, 0) if there is a parse error.
func DecodeVarint(b []byte) (uint64, int) {
	v, n := protowire.ConsumeVarint(b)


@@ 112,9 112,9 @@ func (b *Buffer) Marshal(m Message) error {
	return err
}

// Unmarshal parses the wire-format message in the buffer and places the decoded results in m.
//
// Unlike proto.Unmarshal, this does not reset the message before starting to unmarshal.
// Unmarshal parses the wire-format message in the buffer and
// places the decoded results in m.
// It does not reset m before unmarshaling.
func (b *Buffer) Unmarshal(m Message) error {
	err := UnmarshalMerge(b.Unread(), m)
	b.idx = len(b.buf)


@@ 260,7 260,7 @@ func (b *Buffer) DecodeStringBytes() (string, error) {
}

// DecodeMessage consumes a length-prefixed message from the buffer.
// It does not reset m.
// It does not reset m before unmarshaling.
func (b *Buffer) DecodeMessage(m Message) error {
	v, err := b.DecodeRawBytes(false)
	if err != nil {


@@ 272,7 272,7 @@ func (b *Buffer) DecodeMessage(m Message) error {
// DecodeGroup consumes a message group from the buffer.
// It assumes that the start group marker has already been consumed and
// consumes all bytes until (and including the end group marker).
// It does not reset m.
// It does not reset m before unmarshaling.
func (b *Buffer) DecodeGroup(m Message) error {
	v, n, err := consumeGroup(b.buf[b.idx:])
	if err != nil {

M vendor/github.com/golang/protobuf/proto/extensions.go => vendor/github.com/golang/protobuf/proto/extensions.go +2 -2
@@ 68,7 68,7 @@ func HasExtension(m Message, xt *ExtensionDesc) (has bool) {
	return has
}

// ClearExtension removes the the exntesion field from m
// ClearExtension removes the extension field from m
// either as an explicitly populated field or as an unknown field.
func ClearExtension(m Message, xt *ExtensionDesc) {
	mr := MessageReflect(m)


@@ 108,7 108,7 @@ func ClearAllExtensions(m Message) {
	clearUnknown(mr, mr.Descriptor().ExtensionRanges())
}

// GetExtension retrieves a proto2 extended field from pb.
// GetExtension retrieves a proto2 extended field from m.
//
// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil),
// then GetExtension parses the encoded field and returns a Go value of the specified type.

M vendor/github.com/golang/protobuf/proto/registry.go => vendor/github.com/golang/protobuf/proto/registry.go +5 -5
@@ 29,7 29,7 @@ var fileCache sync.Map // map[filePath]fileDescGZIP
// RegisterFile is called from generated code to register the compressed
// FileDescriptorProto with the file path for a proto source file.
//
// Deprecated: Use protoregistry.GlobalFiles.Register instead.
// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead.
func RegisterFile(s filePath, d fileDescGZIP) {
	// Decompress the descriptor.
	zr, err := gzip.NewReader(bytes.NewReader(d))


@@ 53,7 53,7 @@ func RegisterFile(s filePath, d fileDescGZIP) {
// FileDescriptor returns the compressed FileDescriptorProto given the file path
// for a proto source file. It returns nil if not found.
//
// Deprecated: Use protoregistry.GlobalFiles.RangeFilesByPath instead.
// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead.
func FileDescriptor(s filePath) fileDescGZIP {
	if v, ok := fileCache.Load(s); ok {
		return v.(fileDescGZIP)


@@ 98,7 98,7 @@ var numFilesCache sync.Map // map[protoreflect.FullName]int
// RegisterEnum is called from the generated code to register the mapping of
// enum value names to enum numbers for the enum identified by s.
//
// Deprecated: Use protoregistry.GlobalTypes.Register instead.
// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead.
func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) {
	if _, ok := enumCache.Load(s); ok {
		panic("proto: duplicate enum registered: " + s)


@@ 181,7 181,7 @@ var messageTypeCache sync.Map // map[messageName]reflect.Type
// RegisterType is called from generated code to register the message Go type
// for a message of the given name.
//
// Deprecated: Use protoregistry.GlobalTypes.Register instead.
// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead.
func RegisterType(m Message, s messageName) {
	mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s))
	if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil {


@@ 280,7 280,7 @@ func MessageName(m Message) messageName {
// RegisterExtension is called from the generated code to register
// the extension descriptor.
//
// Deprecated: Use protoregistry.GlobalTypes.Register instead.
// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead.
func RegisterExtension(d *ExtensionDesc) {
	if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil {
		panic(err)

M vendor/github.com/golang/protobuf/proto/text_encode.go => vendor/github.com/golang/protobuf/proto/text_encode.go +4 -4
@@ 94,16 94,16 @@ var (
)

// MarshalText writes the proto text format of m to w.
func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) }
func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) }

// MarshalTextString returns a proto text formatted string of m.
func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) }
func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) }

// CompactText writes the compact proto text format of m to w.
func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) }
func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) }

// CompactTextString returns a compact proto text formatted string of m.
func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) }
func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) }

var (
	newline         = []byte("\n")

M vendor/github.com/klauspost/cpuid/cpuid.go => vendor/github.com/klauspost/cpuid/cpuid.go +128 -4
@@ 10,7 10,13 @@
// Package home: https://github.com/klauspost/cpuid
package cpuid

import "strings"
import (
	"math"
	"strings"
)

// AMD refererence: https://www.amd.com/system/files/TechDocs/25481.pdf
// and Processor Programming Reference (PPR)

// Vendor is a representation of a CPU vendor.
type Vendor int


@@ 178,11 184,12 @@ type CPUInfo struct {
	Family         int    // CPU family number
	Model          int    // CPU model number
	CacheLine      int    // Cache line size in bytes. Will be 0 if undetectable.
	Hz             int64  // Clock speed, if known
	Cache          struct {
		L1I int // L1 Instruction Cache (per core or shared). Will be -1 if undetected
		L1D int // L1 Data Cache (per core or shared). Will be -1 if undetected
		L2  int // L2 Cache (per core or shared). Will be -1 if undetected
		L3  int // L3 Instruction Cache (per core or shared). Will be -1 if undetected
		L3  int // L3 Cache (per core, per ccx or shared). Will be -1 if undetected
	}
	SGX       SGXSupport
	maxFunc   uint32


@@ 225,6 232,7 @@ func Detect() {
	CPU.LogicalCores = logicalCores()
	CPU.PhysicalCores = physicalCores()
	CPU.VendorID = vendorID()
	CPU.Hz = hertz(CPU.BrandName)
	CPU.cacheSize()
}



@@ 601,6 609,65 @@ func (c CPUInfo) LogicalCPU() int {
	return int(ebx >> 24)
}

// hertz tries to compute the clock speed of the CPU. If leaf 15 is
// supported, use it, otherwise parse the brand string. Yes, really.
func hertz(model string) int64 {
	mfi := maxFunctionID()
	if mfi >= 0x15 {
		eax, ebx, ecx, _ := cpuid(0x15)
		if eax != 0 && ebx != 0 && ecx != 0 {
			return int64((int64(ecx) * int64(ebx)) / int64(eax))
		}
	}
	// computeHz determines the official rated speed of a CPU from its brand
	// string. This insanity is *actually the official documented way to do
	// this according to Intel*, prior to leaf 0x15 existing. The official
	// documentation only shows this working for exactly `x.xx` or `xxxx`
	// cases, e.g., `2.50GHz` or `1300MHz`; this parser will accept other
	// sizes.
	hz := strings.LastIndex(model, "Hz")
	if hz < 3 {
		return -1
	}
	var multiplier int64
	switch model[hz-1] {
	case 'M':
		multiplier = 1000 * 1000
	case 'G':
		multiplier = 1000 * 1000 * 1000
	case 'T':
		multiplier = 1000 * 1000 * 1000 * 1000
	}
	if multiplier == 0 {
		return -1
	}
	freq := int64(0)
	divisor := int64(0)
	decimalShift := int64(1)
	var i int
	for i = hz - 2; i >= 0 && model[i] != ' '; i-- {
		if model[i] >= '0' && model[i] <= '9' {
			freq += int64(model[i]-'0') * decimalShift
			decimalShift *= 10
		} else if model[i] == '.' {
			if divisor != 0 {
				return -1
			}
			divisor = decimalShift
		} else {
			return -1
		}
	}
	// we didn't find a space
	if i < 0 {
		return -1
	}
	if divisor != 0 {
		return (freq * multiplier) / divisor
	}
	return freq * multiplier
}

// VM Will return true if the cpu id indicates we are in
// a virtual machine. This is only a hint, and will very likely
// have many false negatives.


@@ 659,11 726,14 @@ func brandName() string {

func threadsPerCore() int {
	mfi := maxFunctionID()
	if mfi < 0x4 || vendorID() != Intel {
	if mfi < 0x4 || (vendorID() != Intel && vendorID() != AMD) {
		return 1
	}

	if mfi < 0xb {
		if vendorID() != Intel {
			return 1
		}
		_, b, _, d := cpuid(1)
		if (d & (1 << 28)) != 0 {
			// v will contain logical core count


@@ 727,6 797,13 @@ func physicalCores() int {
	case Intel:
		return logicalCores() / threadsPerCore()
	case AMD, Hygon:
		lc := logicalCores()
		tpc := threadsPerCore()
		if lc > 0 && tpc > 0 {
			return lc / tpc
		}
		// The following is inaccurate on AMD EPYC 7742 64-Core Processor

		if maxExtendedFunction() >= 0x80000008 {
			_, _, c, _ := cpuid(0x80000008)
			return int(c&0xff) + 1


@@ 837,6 914,49 @@ func (c *CPUInfo) cacheSize() {
		}
		_, _, ecx, _ = cpuid(0x80000006)
		c.Cache.L2 = int(((ecx >> 16) & 0xFFFF) * 1024)

		// CPUID Fn8000_001D_EAX_x[N:0] Cache Properties
		if maxExtendedFunction() < 0x8000001D {
			return
		}
		for i := uint32(0); i < math.MaxUint32; i++ {
			eax, ebx, ecx, _ := cpuidex(0x8000001D, i)

			level := (eax >> 5) & 7
			cacheNumSets := ecx + 1
			cacheLineSize := 1 + (ebx & 2047)
			cachePhysPartitions := 1 + ((ebx >> 12) & 511)
			cacheNumWays := 1 + ((ebx >> 22) & 511)

			typ := eax & 15
			size := int(cacheNumSets * cacheLineSize * cachePhysPartitions * cacheNumWays)
			if typ == 0 {
				return
			}

			switch level {
			case 1:
				switch typ {
				case 1:
					// Data cache
					c.Cache.L1D = size
				case 2:
					// Inst cache
					c.Cache.L1I = size
				default:
					if c.Cache.L1D < 0 {
						c.Cache.L1I = size
					}
					if c.Cache.L1I < 0 {
						c.Cache.L1I = size
					}
				}
			case 2:
				c.Cache.L2 = size
			case 3:
				c.Cache.L3 = size
			}
		}
	}

	return


@@ 954,7 1074,11 @@ func support() Flags {
			rval |= HTT
		}
	}

	if vend == AMD && (d&(1<<28)) != 0 && mfi >= 4 {
		if threadsPerCore() > 1 {
			rval |= HTT
		}
	}
	// Check XGETBV, OXSAVE and AVX bits
	if c&(1<<26) != 0 && c&(1<<27) != 0 && c&(1<<28) != 0 {
		// Check for OS support

M vendor/github.com/klauspost/reedsolomon/.travis.yml => vendor/github.com/klauspost/reedsolomon/.travis.yml +7 -2
@@ 7,9 7,9 @@ os:
  - osx 

go:
  - 1.11.x
  - 1.12.x
  - 1.13.x
  - 1.14.x
  - master

install:


@@ 19,12 19,17 @@ script:
 - go vet ./...
 - go test -v -cpu=1,2,4 .
 - go test -v -cpu=1,2,4 -short -race .
 - go test -tags=noasm -v -cpu=1,2,4 -short -race .
 - go test -no-avx512
 - go test -no-avx512 -no-avx2
 - go test -tags=noasm -v -cpu=1,4 -short -race .
 - go build examples/simple-decoder.go
 - go build examples/simple-encoder.go
 - go build examples/stream-decoder.go
 - go build examples/stream-encoder.go
 - diff <(gofmt -d .) <("")
 - GOARCH=386 GOOS=linux go build .
 - GOARCH=arm64 GOOS=linux go build .
 - GOARCH=ppc64le GOOS=linux go build .

matrix:
  allow_failures:

M vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.go => vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.go +150 -41
@@ 7,6 7,8 @@

package reedsolomon

import "sync"

//go:noescape
func _galMulAVX512Parallel82(in, out [][]byte, matrix *[matrixSize82]byte, addTo bool)



@@ 70,9 72,9 @@ func setupMatrix84(matrixRows [][]byte, inputOffset, outputOffset int, matrix *[
}

// Invoke AVX512 routine for 2 output rows in parallel
func galMulAVX512Parallel82(in, out [][]byte, matrixRows [][]byte, inputOffset, outputOffset int) {
	done := len(in[0])
	if done == 0 {
func galMulAVX512Parallel82(in, out [][]byte, matrixRows [][]byte, inputOffset, outputOffset, start, stop int, matrix82 *[matrixSize82]byte) {
	done := stop - start
	if done <= 0 {
		return
	}



@@ 85,21 87,29 @@ func galMulAVX512Parallel82(in, out [][]byte, matrixRows [][]byte, inputOffset, 
		outputEnd = len(out)
	}

	matrix82 := [matrixSize82]byte{}
	setupMatrix82(matrixRows, inputOffset, outputOffset, &matrix82)
	// We know the max size, alloc temp array.
	var inTmp [dimIn][]byte
	for i, v := range in[inputOffset:inputEnd] {
		inTmp[i] = v[start:stop]
	}
	var outTmp [dimOut82][]byte
	for i, v := range out[outputOffset:outputEnd] {
		outTmp[i] = v[start:stop]
	}

	addTo := inputOffset != 0 // Except for the first input column, add to previous results
	_galMulAVX512Parallel82(in[inputOffset:inputEnd], out[outputOffset:outputEnd], &matrix82, addTo)
	_galMulAVX512Parallel82(inTmp[:inputEnd-inputOffset], outTmp[:outputEnd-outputOffset], matrix82, addTo)

	done = (done >> 6) << 6
	if len(in[0])-done == 0 {
	done = start + ((done >> 6) << 6)
	if done == stop {
		return
	}

	for c := inputOffset; c < inputOffset+dimIn; c++ {
		for iRow := outputOffset; iRow < outputOffset+dimOut82; iRow++ {
	for c := inputOffset; c < inputEnd; c++ {
		for iRow := outputOffset; iRow < outputEnd; iRow++ {
			if c < len(matrixRows[iRow]) {
				mt := mulTable[matrixRows[iRow][c]][:256]
				for i := done; i < len(in[0]); i++ {
				for i := done; i < stop; i++ {
					if c == 0 { // only set value for first input column
						out[iRow][i] = mt[in[c][i]]
					} else { // and add for all others


@@ 112,9 122,9 @@ func galMulAVX512Parallel82(in, out [][]byte, matrixRows [][]byte, inputOffset, 
}

// Invoke AVX512 routine for 4 output rows in parallel
func galMulAVX512Parallel84(in, out [][]byte, matrixRows [][]byte, inputOffset, outputOffset int) {
	done := len(in[0])
	if done == 0 {
func galMulAVX512Parallel84(in, out [][]byte, matrixRows [][]byte, inputOffset, outputOffset, start, stop int, matrix84 *[matrixSize84]byte) {
	done := stop - start
	if done <= 0 {
		return
	}



@@ 127,21 137,30 @@ func galMulAVX512Parallel84(in, out [][]byte, matrixRows [][]byte, inputOffset, 
		outputEnd = len(out)
	}

	matrix84 := [matrixSize84]byte{}
	setupMatrix84(matrixRows, inputOffset, outputOffset, &matrix84)
	// We know the max size, alloc temp array.
	var inTmp [dimIn][]byte
	for i, v := range in[inputOffset:inputEnd] {
		inTmp[i] = v[start:stop]
	}
	var outTmp [dimOut84][]byte
	for i, v := range out[outputOffset:outputEnd] {
		outTmp[i] = v[start:stop]
	}

	addTo := inputOffset != 0 // Except for the first input column, add to previous results
	_galMulAVX512Parallel84(in[inputOffset:inputEnd], out[outputOffset:outputEnd], &matrix84, addTo)
	_galMulAVX512Parallel84(inTmp[:inputEnd-inputOffset], outTmp[:outputEnd-outputOffset], matrix84, addTo)

	done = (done >> 6) << 6
	if len(in[0])-done == 0 {
	done += start
	if done == stop {
		return
	}

	for c := inputOffset; c < inputOffset+dimIn; c++ {
		for iRow := outputOffset; iRow < outputOffset+dimOut84; iRow++ {
	for c := inputOffset; c < inputEnd; c++ {
		for iRow := outputOffset; iRow < outputEnd; iRow++ {
			if c < len(matrixRows[iRow]) {
				mt := mulTable[matrixRows[iRow][c]][:256]
				for i := done; i < len(in[0]); i++ {
				for i := done; i < stop; i++ {
					if c == 0 { // only set value for first input column
						out[iRow][i] = mt[in[c][i]]
					} else { // and add for all others


@@ 156,29 175,119 @@ func galMulAVX512Parallel84(in, out [][]byte, matrixRows [][]byte, inputOffset, 
// Perform the same as codeSomeShards, but taking advantage of
// AVX512 parallelism for up to 4x faster execution as compared to AVX2
func (r reedSolomon) codeSomeShardsAvx512(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	outputRow := 0
	// First process (multiple) batches of 4 output rows in parallel
	for ; outputRow+dimOut84 <= len(outputs); outputRow += dimOut84 {
		for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
			galMulAVX512Parallel84(inputs, outputs, matrixRows, inputRow, outputRow)
		}
	// Process using no goroutines
	start, end := 0, r.o.perRound
	if end > byteCount {
		end = byteCount
	}
	// Then process a (single) batch of 2 output rows in parallel
	if outputRow+dimOut82 <= len(outputs) {
		// fmt.Println(outputRow, len(outputs))
		for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
			galMulAVX512Parallel82(inputs, outputs, matrixRows, inputRow, outputRow)
	for start < byteCount {
		matrix84 := [matrixSize84]byte{}
		matrix82 := [matrixSize82]byte{}

		outputRow := 0
		// First process (multiple) batches of 4 output rows in parallel
		if outputRow+dimOut84 <= outputCount {
			for ; outputRow+dimOut84 <= outputCount; outputRow += dimOut84 {
				for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
					setupMatrix84(matrixRows, inputRow, outputRow, &matrix84)
					galMulAVX512Parallel84(inputs, outputs, matrixRows, inputRow, outputRow, start, end, &matrix84)
				}
			}
		}
		outputRow += dimOut82
	}
	// Lastly, we may have a single output row left (for uneven parity)
	if outputRow < len(outputs) {
		for c := 0; c < r.DataShards; c++ {
			if c == 0 {
				galMulSlice(matrixRows[outputRow][c], inputs[c], outputs[outputRow], &r.o)
			} else {
				galMulSliceXor(matrixRows[outputRow][c], inputs[c], outputs[outputRow], &r.o)
		// Then process a (single) batch of 2 output rows in parallel
		if outputRow+dimOut82 <= outputCount {
			for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
				setupMatrix82(matrixRows, inputRow, outputRow, &matrix82)
				galMulAVX512Parallel82(inputs, outputs, matrixRows, inputRow, outputRow, start, end, &matrix82)
			}
			outputRow += dimOut82
		}
		// Lastly, we may have a single output row left (for uneven parity)
		if outputRow < outputCount {
			for c := 0; c < r.DataShards; c++ {
				if c == 0 {
					galMulSlice(matrixRows[outputRow][c], inputs[c], outputs[outputRow], &r.o)
				} else {
					galMulSliceXor(matrixRows[outputRow][c], inputs[c], outputs[outputRow], &r.o)
				}
			}
		}

		start = end
		end += r.o.perRound
		if end > byteCount {
			end = byteCount
		}
	}
}

// Perform the same as codeSomeShards, but taking advantage of
// AVX512 parallelism for up to 4x faster execution as compared to AVX2
func (r reedSolomon) codeSomeShardsAvx512P(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	var wg sync.WaitGroup
	do := byteCount / r.o.maxGoroutines
	if do < r.o.minSplitSize {
		do = r.o.minSplitSize
	}
	// Make sizes divisible by 64
	do = (do + 63) & (^63)
	start := 0
	for start < byteCount {
		if start+do > byteCount {
			do = byteCount - start
		}
		wg.Add(1)
		go func(grStart, grStop int) {
			start, stop := grStart, grStart+r.o.perRound
			if stop > grStop {
				stop = grStop
			}
			// Loop for each round.
			matrix84 := [matrixSize84]byte{}
			matrix82 := [matrixSize82]byte{}
			for start < grStop {
				outputRow := 0
				// First process (multiple) batches of 4 output rows in parallel
				if outputRow+dimOut84 <= outputCount {
					// 1K matrix buffer
					for ; outputRow+dimOut84 <= outputCount; outputRow += dimOut84 {
						for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
							setupMatrix84(matrixRows, inputRow, outputRow, &matrix84)
							galMulAVX512Parallel84(inputs, outputs, matrixRows, inputRow, outputRow, start, stop, &matrix84)
						}
					}
				}
				// Then process a (single) batch of 2 output rows in parallel
				if outputRow+dimOut82 <= outputCount {
					// 512B matrix buffer
					for inputRow := 0; inputRow < len(inputs); inputRow += dimIn {
						setupMatrix82(matrixRows, inputRow, outputRow, &matrix82)
						galMulAVX512Parallel82(inputs, outputs, matrixRows, inputRow, outputRow, start, stop, &matrix82)
					}
					outputRow += dimOut82
				}
				// Lastly, we may have a single output row left (for uneven parity)
				if outputRow < outputCount {
					for c := 0; c < r.DataShards; c++ {
						in := inputs[c][start:stop]
						for iRow := 0; iRow < outputCount; iRow++ {
							if c == 0 {
								galMulSlice(matrixRows[iRow][c], in, outputs[iRow][start:stop], &r.o)
							} else {
								galMulSliceXor(matrixRows[iRow][c], in, outputs[iRow][start:stop], &r.o)
							}
						}
					}
				}
				start = stop
				stop += r.o.perRound
				if stop > grStop {
					stop = grStop
				}
			}
			wg.Done()
		}(start, start+do)
		start += do
	}
	wg.Wait()
}

M vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.s => vendor/github.com/klauspost/reedsolomon/galoisAvx512_amd64.s +123 -448
@@ 3,6 3,21 @@
// Copyright 2015, Klaus Post, see LICENSE for details.
// Copyright 2019, Minio, Inc.

#define LOAD(OFFSET)           \
	MOVQ       OFFSET(SI), BX  \
	VMOVDQU64  (BX)(R11*1), Z0 \
	VPSRLQ     $4, Z0, Z1      \ // high input
	VPANDQ     Z2, Z0, Z0      \ // low input
	VPANDQ     Z2, Z1, Z1        // high input

#define GALOIS(C1, C2, IN, LO, HI, OUT) \
	VSHUFI64X2 $C1, IN, IN, LO          \
	VSHUFI64X2 $C2, IN, IN, HI          \
	VPSHUFB    Z0, LO, LO               \ // mul low part
	VPSHUFB    Z1, HI, HI               \ // mul high part
	VPTERNLOGD $0x96, LO, HI, OUT


//
// Process 2 output rows in parallel from a total of 8 input rows
//


@@ 15,23 30,21 @@ TEXT ·_galMulAVX512Parallel82(SB), 7, $0
	JZ    done_avx512_parallel82

	MOVQ matrix+48(FP), SI
	LONG $0x48fee162; WORD $0x066f // VMOVDQU64 ZMM16, 0x000[rsi]
	LONG $0x48fee162; WORD $0x4e6f; BYTE $0x01 // VMOVDQU64 ZMM17, 0x040[rsi]
	LONG $0x48fee162; WORD $0x566f; BYTE $0x02 // VMOVDQU64 ZMM18, 0x080[rsi]
	LONG $0x48fee162; WORD $0x5e6f; BYTE $0x03 // VMOVDQU64 ZMM19, 0x0c0[rsi]
	LONG $0x48fee162; WORD $0x666f; BYTE $0x04 // VMOVDQU64 ZMM20, 0x100[rsi]
	LONG $0x48fee162; WORD $0x6e6f; BYTE $0x05 // VMOVDQU64 ZMM21, 0x140[rsi]
	LONG $0x48fee162; WORD $0x766f; BYTE $0x06 // VMOVDQU64 ZMM22, 0x180[rsi]
	LONG $0x48fee162; WORD $0x7e6f; BYTE $0x07 // VMOVDQU64 ZMM23, 0x1c0[rsi]
	VMOVDQU64 0x000(SI), Z16
	VMOVDQU64 0x040(SI), Z17
	VMOVDQU64 0x080(SI), Z18
	VMOVDQU64 0x0c0(SI), Z19
	VMOVDQU64 0x100(SI), Z20
	VMOVDQU64 0x140(SI), Z21
	VMOVDQU64 0x180(SI), Z22
	VMOVDQU64 0x1c0(SI), Z23

	MOVQ         $15, BX
	MOVQ         BX, X5
	LONG $0x487df262; WORD $0xd578 // VPBROADCASTB ZMM2, XMM5
	VPBROADCASTB BX, Z2

	MOVB addTo+56(FP), AX
	LONG $0xffc0c749; WORD $0xffff; BYTE $0xff // mov r8, -1
	WORD $0xf749; BYTE $0xe0 // mul r8
	LONG $0x92fbe1c4; BYTE $0xc8 // kmovq k1, rax
	IMULQ $-0x1, AX
	KMOVQ AX, K1
	MOVQ in+0(FP), SI  //  SI: &in
	MOVQ in_len+8(FP), AX  // number of inputs
	XORQ R11, R11


@@ 40,185 53,65 @@ TEXT ·_galMulAVX512Parallel82(SB), 7, $0
	MOVQ (DX), DX      //  DX: &out[0][0]

loopback_avx512_parallel82:
	LONG $0xc9fef162; WORD $0x226f // VMOVDQU64 ZMM4{k1}{z}, [rdx]
	LONG $0xc9fef162; WORD $0x296f // VMOVDQU64 ZMM5{k1}{z}, [rcx]

	MOVQ (SI), BX      //  BX: &in[0][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40fd3362; WORD $0xf043; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM16, ZMM16, 0x00
	LONG $0x40fd3362; WORD $0xf843; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM16, ZMM16, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40dd3362; WORD $0xe443; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM20, ZMM20, 0x00
	LONG $0x40dd3362; WORD $0xec43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM20, ZMM20, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	VMOVDQU64.Z (DX), K1, Z4
	VMOVDQU64.Z (CX), K1, Z5

	LOAD(0x00) // &in[0][0]
	GALOIS(0x00, 0x55, Z16, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z20, Z12, Z13, Z5)

    CMPQ AX, $1
    JE skip_avx512_parallel82

 	MOVQ 24(SI), BX    //  BX: &in[1][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40fd3362; WORD $0xf043; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM16, ZMM16, 0xaa
	LONG $0x40fd3362; WORD $0xf843; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM16, ZMM16, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40dd3362; WORD $0xe443; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM20, ZMM20, 0xaa
	LONG $0x40dd3362; WORD $0xec43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM20, ZMM20, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x18) // &in[1][0]
	GALOIS(0xaa, 0xff, Z16, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z20, Z12, Z13, Z5)

    CMPQ AX, $2
    JE skip_avx512_parallel82

	MOVQ 48(SI), BX    //  BX: &in[2][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40f53362; WORD $0xf143; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM17, ZMM17, 0x00
	LONG $0x40f53362; WORD $0xf943; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM17, ZMM17, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40d53362; WORD $0xe543; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM21, ZMM21, 0x00
	LONG $0x40d53362; WORD $0xed43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM21, ZMM21, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x30) // &in[2][0]
	GALOIS(0x00, 0x55, Z17, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z21, Z12, Z13, Z5)

    CMPQ AX, $3
    JE skip_avx512_parallel82

	MOVQ 72(SI), BX    // BX: &in[3][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40f53362; WORD $0xf143; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM17, ZMM17, 0xaa
	LONG $0x40f53362; WORD $0xf943; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM17, ZMM17, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40d53362; WORD $0xe543; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM21, ZMM21, 0xaa
	LONG $0x40d53362; WORD $0xed43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM21, ZMM21, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x48) // &in[3][0]
	GALOIS(0xaa, 0xff, Z17, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z21, Z12, Z13, Z5)

    CMPQ AX, $4
    JE skip_avx512_parallel82

	MOVQ 96(SI), BX    // BX: &in[4][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40ed3362; WORD $0xf243; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM18, ZMM18, 0x00
	LONG $0x40ed3362; WORD $0xfa43; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM18, ZMM18, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40cd3362; WORD $0xe643; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM22, ZMM22, 0x00
	LONG $0x40cd3362; WORD $0xee43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM22, ZMM22, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x60) // &in[4][0]
	GALOIS(0x00, 0x55, Z18, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z22, Z12, Z13, Z5)

    CMPQ AX, $5
    JE skip_avx512_parallel82

	MOVQ 120(SI), BX   // BX: &in[5][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40ed3362; WORD $0xf243; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM18, ZMM18, 0xaa
	LONG $0x40ed3362; WORD $0xfa43; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM18, ZMM18, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40cd3362; WORD $0xe643; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM22, ZMM22, 0xaa
	LONG $0x40cd3362; WORD $0xee43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM22, ZMM22, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x78) // &in[5][0]
	GALOIS(0xaa, 0xff, Z18, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z22, Z12, Z13, Z5)

    CMPQ AX, $6
    JE skip_avx512_parallel82

	MOVQ 144(SI), BX   // BX: &in[6][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40e53362; WORD $0xf343; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM19, ZMM19, 0x00
	LONG $0x40e53362; WORD $0xfb43; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM19, ZMM19, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40c53362; WORD $0xe743; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM23, ZMM23, 0x00
	LONG $0x40c53362; WORD $0xef43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM23, ZMM23, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0x90) // &in[6][0]
	GALOIS(0x00, 0x55, Z19, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z23, Z12, Z13, Z5)

    CMPQ AX, $7
    JE skip_avx512_parallel82

	MOVQ 168(SI), BX   //  BX: &in[7][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40e53362; WORD $0xf343; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM19, ZMM19, 0xaa
	LONG $0x40e53362; WORD $0xfb43; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM19, ZMM19, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40c53362; WORD $0xe743; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM23, ZMM23, 0xaa
	LONG $0x40c53362; WORD $0xef43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM23, ZMM23, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12
	LOAD(0xa8) // &in[7][0]
	GALOIS(0xaa, 0xff, Z19, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z23, Z12, Z13, Z5)

skip_avx512_parallel82:
	LONG $0x48fef162; WORD $0x227f // VMOVDQU64 [rdx], ZMM4
	LONG $0x48fef162; WORD $0x297f // VMOVDQU64 [rcx], ZMM5
	VMOVDQU64 Z4, (DX)
	VMOVDQU64 Z5, (CX)

	ADDQ $64, R11 // in4+=64



@@ 244,31 137,29 @@ TEXT ·_galMulAVX512Parallel84(SB), 7, $0
	JZ    done_avx512_parallel84

	MOVQ matrix+48(FP), SI
	LONG $0x48fee162; WORD $0x066f // VMOVDQU64 ZMM16, 0x000[rsi]
	LONG $0x48fee162; WORD $0x4e6f; BYTE $0x01 // VMOVDQU64 ZMM17, 0x040[rsi]
	LONG $0x48fee162; WORD $0x566f; BYTE $0x02 // VMOVDQU64 ZMM18, 0x080[rsi]
	LONG $0x48fee162; WORD $0x5e6f; BYTE $0x03 // VMOVDQU64 ZMM19, 0x0c0[rsi]
	LONG $0x48fee162; WORD $0x666f; BYTE $0x04 // VMOVDQU64 ZMM20, 0x100[rsi]
	LONG $0x48fee162; WORD $0x6e6f; BYTE $0x05 // VMOVDQU64 ZMM21, 0x140[rsi]
	LONG $0x48fee162; WORD $0x766f; BYTE $0x06 // VMOVDQU64 ZMM22, 0x180[rsi]
	LONG $0x48fee162; WORD $0x7e6f; BYTE $0x07 // VMOVDQU64 ZMM23, 0x1c0[rsi]
	LONG $0x48fe6162; WORD $0x466f; BYTE $0x08 // VMOVDQU64 ZMM24, 0x200[rsi]
	LONG $0x48fe6162; WORD $0x4e6f; BYTE $0x09 // VMOVDQU64 ZMM25, 0x240[rsi]
	LONG $0x48fe6162; WORD $0x566f; BYTE $0x0a // VMOVDQU64 ZMM26, 0x280[rsi]
	LONG $0x48fe6162; WORD $0x5e6f; BYTE $0x0b // VMOVDQU64 ZMM27, 0x2c0[rsi]
	LONG $0x48fe6162; WORD $0x666f; BYTE $0x0c // VMOVDQU64 ZMM28, 0x300[rsi]
	LONG $0x48fe6162; WORD $0x6e6f; BYTE $0x0d // VMOVDQU64 ZMM29, 0x340[rsi]
	LONG $0x48fe6162; WORD $0x766f; BYTE $0x0e // VMOVDQU64 ZMM30, 0x380[rsi]
	LONG $0x48fe6162; WORD $0x7e6f; BYTE $0x0f // VMOVDQU64 ZMM31, 0x3c0[rsi]
	VMOVDQU64 0x000(SI), Z16
	VMOVDQU64 0x040(SI), Z17
	VMOVDQU64 0x080(SI), Z18
	VMOVDQU64 0x0c0(SI), Z19
	VMOVDQU64 0x100(SI), Z20
	VMOVDQU64 0x140(SI), Z21
	VMOVDQU64 0x180(SI), Z22
	VMOVDQU64 0x1c0(SI), Z23
	VMOVDQU64 0x200(SI), Z24
	VMOVDQU64 0x240(SI), Z25
	VMOVDQU64 0x280(SI), Z26
	VMOVDQU64 0x2c0(SI), Z27
	VMOVDQU64 0x300(SI), Z28
	VMOVDQU64 0x340(SI), Z29
	VMOVDQU64 0x380(SI), Z30
	VMOVDQU64 0x3c0(SI), Z31

	MOVQ         $15, BX
	MOVQ         BX, X5
	LONG $0x487df262; WORD $0xd578 // VPBROADCASTB ZMM2, XMM5
	VPBROADCASTB BX, Z2

	MOVB addTo+56(FP), AX
	LONG $0xffc0c749; WORD $0xffff; BYTE $0xff // mov r8, -1
	WORD $0xf749; BYTE $0xe0 // mul r8
	LONG $0x92fbe1c4; BYTE $0xc8 // kmovq k1, rax
	IMULQ $-0x1, AX
	KMOVQ AX, K1
	MOVQ in+0(FP), SI  //  SI: &in
	MOVQ in_len+8(FP), AX  // number of inputs
	XORQ R11, R11


@@ 279,301 170,85 @@ TEXT ·_galMulAVX512Parallel84(SB), 7, $0
	MOVQ (DX), DX      //  DX: &out[0][0]

loopback_avx512_parallel84:
	LONG $0xc9fef162; WORD $0x226f // VMOVDQU64 ZMM4{k1}{z}, [rdx]
	LONG $0xc9fef162; WORD $0x296f // VMOVDQU64 ZMM5{k1}{z}, [rcx]
	LONG $0xc9fed162; WORD $0x326f // VMOVDQU64 ZMM6{k1}{z}, [r10]
	LONG $0xc9fed162; WORD $0x3c6f; BYTE $0x24 // VMOVDQU64 ZMM7{k1}{z}, [r12]

	MOVQ (SI), BX      //  BX: &in[0][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40fd3362; WORD $0xf043; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM16, ZMM16, 0x00
	LONG $0x40fd3362; WORD $0xf843; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM16, ZMM16, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40dd3362; WORD $0xe443; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM20, ZMM20, 0x00
	LONG $0x40dd3362; WORD $0xec43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM20, ZMM20, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40bd1362; WORD $0xd043; BYTE $0x00 // VSHUFI64x2 ZMM10, ZMM24, ZMM24, 0x00
	LONG $0x40bd1362; WORD $0xd843; BYTE $0x55 // VSHUFI64x2 ZMM11, ZMM24, ZMM24, 0x55
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x409d1362; WORD $0xc443; BYTE $0x00 // VSHUFI64x2 ZMM8, ZMM28, ZMM28, 0x00
	LONG $0x409d1362; WORD $0xcc43; BYTE $0x55 // VSHUFI64x2 ZMM9, ZMM28, ZMM28, 0x55
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	VMOVDQU64.Z (DX), K1, Z4
	VMOVDQU64.Z (CX), K1, Z5
	VMOVDQU64.Z (R10), K1, Z6
	VMOVDQU64.Z (R12), K1, Z7

	LOAD(0x00) // &in[0][0]
	GALOIS(0x00, 0x55, Z16, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z20, Z12, Z13, Z5)
	GALOIS(0x00, 0x55, Z24, Z10, Z11, Z6)
	GALOIS(0x00, 0x55, Z28,  Z8,  Z9, Z7)

	CMPQ AX, $1
	JE skip_avx512_parallel84

     MOVQ 24(SI), BX    //  BX: &in[1][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40fd3362; WORD $0xf043; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM16, ZMM16, 0xaa
	LONG $0x40fd3362; WORD $0xf843; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM16, ZMM16, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40dd3362; WORD $0xe443; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM20, ZMM20, 0xaa
	LONG $0x40dd3362; WORD $0xec43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM20, ZMM20, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40bd1362; WORD $0xd043; BYTE $0xaa // VSHUFI64x2 ZMM10, ZMM24, ZMM24, 0xaa
	LONG $0x40bd1362; WORD $0xd843; BYTE $0xff // VSHUFI64x2 ZMM11, ZMM24, ZMM24, 0xff
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x409d1362; WORD $0xc443; BYTE $0xaa // VSHUFI64x2 ZMM8, ZMM28, ZMM28, 0xaa
	LONG $0x409d1362; WORD $0xcc43; BYTE $0xff // VSHUFI64x2 ZMM9, ZMM28, ZMM28, 0xff
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x18) // &in[1][0]
	GALOIS(0xaa, 0xff, Z16, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z20, Z12, Z13, Z5)
	GALOIS(0xaa, 0xff, Z24, Z10, Z11, Z6)
	GALOIS(0xaa, 0xff, Z28,  Z8,  Z9, Z7)

	CMPQ AX, $2
	JE skip_avx512_parallel84

	MOVQ 48(SI), BX    //  BX: &in[2][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40f53362; WORD $0xf143; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM17, ZMM17, 0x00
	LONG $0x40f53362; WORD $0xf943; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM17, ZMM17, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40d53362; WORD $0xe543; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM21, ZMM21, 0x00
	LONG $0x40d53362; WORD $0xed43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM21, ZMM21, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40b51362; WORD $0xd143; BYTE $0x00 // VSHUFI64x2 ZMM10, ZMM25, ZMM25, 0x00
	LONG $0x40b51362; WORD $0xd943; BYTE $0x55 // VSHUFI64x2 ZMM11, ZMM25, ZMM25, 0x55
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x40951362; WORD $0xc543; BYTE $0x00 // VSHUFI64x2 ZMM8, ZMM29, ZMM29, 0x00
	LONG $0x40951362; WORD $0xcd43; BYTE $0x55 // VSHUFI64x2 ZMM9, ZMM29, ZMM29, 0x55
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x30) // &in[2][0]
	GALOIS(0x00, 0x55, Z17, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z21, Z12, Z13, Z5)
	GALOIS(0x00, 0x55, Z25, Z10, Z11, Z6)
	GALOIS(0x00, 0x55, Z29,  Z8,  Z9, Z7)

	CMPQ AX, $3
	JE skip_avx512_parallel84

	MOVQ 72(SI), BX    // BX: &in[3][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40f53362; WORD $0xf143; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM17, ZMM17, 0xaa
	LONG $0x40f53362; WORD $0xf943; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM17, ZMM17, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40d53362; WORD $0xe543; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM21, ZMM21, 0xaa
	LONG $0x40d53362; WORD $0xed43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM21, ZMM21, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40b51362; WORD $0xd143; BYTE $0xaa // VSHUFI64x2 ZMM10, ZMM25, ZMM25, 0xaa
	LONG $0x40b51362; WORD $0xd943; BYTE $0xff // VSHUFI64x2 ZMM11, ZMM25, ZMM25, 0xff
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x40951362; WORD $0xc543; BYTE $0xaa // VSHUFI64x2 ZMM8, ZMM29, ZMM29, 0xaa
	LONG $0x40951362; WORD $0xcd43; BYTE $0xff // VSHUFI64x2 ZMM9, ZMM29, ZMM29, 0xff
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x48) // &in[3][0]
	GALOIS(0xaa, 0xff, Z17, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z21, Z12, Z13, Z5)
	GALOIS(0xaa, 0xff, Z25, Z10, Z11, Z6)
	GALOIS(0xaa, 0xff, Z29,  Z8,  Z9, Z7)

	CMPQ AX, $4
	JE skip_avx512_parallel84

	MOVQ 96(SI), BX    // BX: &in[4][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40ed3362; WORD $0xf243; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM18, ZMM18, 0x00
	LONG $0x40ed3362; WORD $0xfa43; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM18, ZMM18, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40cd3362; WORD $0xe643; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM22, ZMM22, 0x00
	LONG $0x40cd3362; WORD $0xee43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM22, ZMM22, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40ad1362; WORD $0xd243; BYTE $0x00 // VSHUFI64x2 ZMM10, ZMM26, ZMM26, 0x00
	LONG $0x40ad1362; WORD $0xda43; BYTE $0x55 // VSHUFI64x2 ZMM11, ZMM26, ZMM26, 0x55
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x408d1362; WORD $0xc643; BYTE $0x00 // VSHUFI64x2 ZMM8, ZMM30, ZMM30, 0x00
	LONG $0x408d1362; WORD $0xce43; BYTE $0x55 // VSHUFI64x2 ZMM9, ZMM30, ZMM30, 0x55
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x60) // &in[4][0]
	GALOIS(0x00, 0x55, Z18, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z22, Z12, Z13, Z5)
	GALOIS(0x00, 0x55, Z26, Z10, Z11, Z6)
	GALOIS(0x00, 0x55, Z30,  Z8,  Z9, Z7)

	CMPQ AX, $5
	JE skip_avx512_parallel84

	MOVQ 120(SI), BX   // BX: &in[5][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40ed3362; WORD $0xf243; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM18, ZMM18, 0xaa
	LONG $0x40ed3362; WORD $0xfa43; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM18, ZMM18, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40cd3362; WORD $0xe643; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM22, ZMM22, 0xaa
	LONG $0x40cd3362; WORD $0xee43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM22, ZMM22, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40ad1362; WORD $0xd243; BYTE $0xaa // VSHUFI64x2 ZMM10, ZMM26, ZMM26, 0xaa
	LONG $0x40ad1362; WORD $0xda43; BYTE $0xff // VSHUFI64x2 ZMM11, ZMM26, ZMM26, 0xff
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x408d1362; WORD $0xc643; BYTE $0xaa // VSHUFI64x2 ZMM8, ZMM30, ZMM30, 0xaa
	LONG $0x408d1362; WORD $0xce43; BYTE $0xff // VSHUFI64x2 ZMM9, ZMM30, ZMM30, 0xff
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x78) // &in[5][0]
	GALOIS(0xaa, 0xff, Z18, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z22, Z12, Z13, Z5)
	GALOIS(0xaa, 0xff, Z26, Z10, Z11, Z6)
	GALOIS(0xaa, 0xff, Z30,  Z8,  Z9, Z7)

	CMPQ AX, $6
	JE skip_avx512_parallel84

	MOVQ 144(SI), BX   // BX: &in[6][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40e53362; WORD $0xf343; BYTE $0x00 // VSHUFI64x2 ZMM14, ZMM19, ZMM19, 0x00
	LONG $0x40e53362; WORD $0xfb43; BYTE $0x55 // VSHUFI64x2 ZMM15, ZMM19, ZMM19, 0x55
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40c53362; WORD $0xe743; BYTE $0x00 // VSHUFI64x2 ZMM12, ZMM23, ZMM23, 0x00
	LONG $0x40c53362; WORD $0xef43; BYTE $0x55 // VSHUFI64x2 ZMM13, ZMM23, ZMM23, 0x55
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40a51362; WORD $0xd343; BYTE $0x00 // VSHUFI64x2 ZMM10, ZMM27, ZMM27, 0x00
	LONG $0x40a51362; WORD $0xdb43; BYTE $0x55 // VSHUFI64x2 ZMM11, ZMM27, ZMM27, 0x55
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x40851362; WORD $0xc743; BYTE $0x00 // VSHUFI64x2 ZMM8, ZMM31, ZMM31, 0x00
	LONG $0x40851362; WORD $0xcf43; BYTE $0x55 // VSHUFI64x2 ZMM9, ZMM31, ZMM31, 0x55
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0x90) // &in[6][0]
	GALOIS(0x00, 0x55, Z19, Z14, Z15, Z4)
	GALOIS(0x00, 0x55, Z23, Z12, Z13, Z5)
	GALOIS(0x00, 0x55, Z27, Z10, Z11, Z6)
	GALOIS(0x00, 0x55, Z31,  Z8,  Z9, Z7)

	CMPQ AX, $7
	JE skip_avx512_parallel84

	MOVQ 168(SI), BX   //  BX: &in[7][0]
	LONG $0x48feb162; WORD $0x046f; BYTE $0x1b // VMOVDQU64 ZMM0, [rbx+r11]
	LONG $0x40e53362; WORD $0xf343; BYTE $0xaa // VSHUFI64x2 ZMM14, ZMM19, ZMM19, 0xaa
	LONG $0x40e53362; WORD $0xfb43; BYTE $0xff // VSHUFI64x2 ZMM15, ZMM19, ZMM19, 0xff
	LONG $0x48f5f162; WORD $0xd073; BYTE $0x04 // VPSRLQ   ZMM1, ZMM0, 4     ; high input
	LONG $0x48fdf162; WORD $0xc2db // VPANDQ   ZMM0, ZMM0, ZMM2  ; low input
	LONG $0x48f5f162; WORD $0xcadb // VPANDQ   ZMM1, ZMM1, ZMM2  ; high input
	LONG $0x480d7262; WORD $0xf000 // VPSHUFB  ZMM14, ZMM14, ZMM0  ; mul low part
	LONG $0x48057262; WORD $0xf900 // VPSHUFB  ZMM15, ZMM15, ZMM1  ; mul high part
	LONG $0x488d5162; WORD $0xf7ef // VPXORQ   ZMM14, ZMM14, ZMM15  ; result
	LONG $0x48ddd162; WORD $0xe6ef // VPXORQ   ZMM4, ZMM4, ZMM14

	LONG $0x40c53362; WORD $0xe743; BYTE $0xaa // VSHUFI64x2 ZMM12, ZMM23, ZMM23, 0xaa
	LONG $0x40c53362; WORD $0xef43; BYTE $0xff // VSHUFI64x2 ZMM13, ZMM23, ZMM23, 0xff
	LONG $0x481d7262; WORD $0xe000 // VPSHUFB  ZMM12, ZMM12, ZMM0  ; mul low part
	LONG $0x48157262; WORD $0xe900 // VPSHUFB  ZMM13, ZMM13, ZMM1  ; mul high part
	LONG $0x489d5162; WORD $0xe5ef // VPXORQ   ZMM12, ZMM12, ZMM13  ; result
	LONG $0x48d5d162; WORD $0xecef // VPXORQ   ZMM5, ZMM5, ZMM12

	LONG $0x40a51362; WORD $0xd343; BYTE $0xaa // VSHUFI64x2 ZMM10, ZMM27, ZMM27, 0xaa
	LONG $0x40a51362; WORD $0xdb43; BYTE $0xff // VSHUFI64x2 ZMM11, ZMM27, ZMM27, 0xff
	LONG $0x482d7262; WORD $0xd000 // VPSHUFB  ZMM10, ZMM10, ZMM0  ; mul low part
	LONG $0x48257262; WORD $0xd900 // VPSHUFB  ZMM11, ZMM11, ZMM1  ; mul high part
	LONG $0x48ad5162; WORD $0xd3ef // VPXORQ   ZMM10, ZMM10, ZMM11  ; result
	LONG $0x48cdd162; WORD $0xf2ef // VPXORQ   ZMM6, ZMM6, ZMM10

	LONG $0x40851362; WORD $0xc743; BYTE $0xaa // VSHUFI64x2 ZMM8, ZMM31, ZMM31, 0xaa
	LONG $0x40851362; WORD $0xcf43; BYTE $0xff // VSHUFI64x2 ZMM9, ZMM31, ZMM31, 0xff
	LONG $0x483d7262; WORD $0xc000 // VPSHUFB  ZMM8, ZMM8, ZMM0  ; mul low part
	LONG $0x48357262; WORD $0xc900 // VPSHUFB  ZMM9, ZMM9, ZMM1  ; mul high part
	LONG $0x48bd5162; WORD $0xc1ef // VPXORQ   ZMM8, ZMM8, ZMM9  ; result
	LONG $0x48c5d162; WORD $0xf8ef // VPXORQ   ZMM7, ZMM7, ZMM8
	LOAD(0xa8) // &in[7][0]
	GALOIS(0xaa, 0xff, Z19, Z14, Z15, Z4)
	GALOIS(0xaa, 0xff, Z23, Z12, Z13, Z5)
	GALOIS(0xaa, 0xff, Z27, Z10, Z11, Z6)
	GALOIS(0xaa, 0xff, Z31,  Z8,  Z9, Z7)

skip_avx512_parallel84:
	LONG $0x48fef162; WORD $0x227f // VMOVDQU64 [rdx], ZMM4
	LONG $0x48fef162; WORD $0x297f // VMOVDQU64 [rcx], ZMM5
	LONG $0x48fed162; WORD $0x327f // VMOVDQU64 [r10], ZMM6
	LONG $0x48fed162; WORD $0x3c7f; BYTE $0x24 // VMOVDQU64 [r12], ZMM7
	VMOVDQU64 Z4, (DX)
	VMOVDQU64 Z5, (CX)
	VMOVDQU64 Z6, (R10)
	VMOVDQU64 Z7, (R12)

	ADDQ $64, R11 // in4+=64


M vendor/github.com/klauspost/reedsolomon/galois_amd64.go => vendor/github.com/klauspost/reedsolomon/galois_amd64.go +17 -17
@@ 49,12 49,12 @@ func galMulSlice(c byte, in, out []byte, o *options) {
		galMulSSSE3(mulTableLow[c][:], mulTableHigh[c][:], in, out)
		done = (len(in) >> 4) << 4
	}
	remain := len(in) - done
	if remain > 0 {
		mt := mulTable[c][:256]
		for i := done; i < len(in); i++ {
			out[i] = mt[in[i]]
		}
	in = in[done:]
	out = out[done:]
	out = out[:len(in)]
	mt := mulTable[c][:256]
	for i := range in {
		out[i] = mt[in[i]]
	}
}



@@ 67,12 67,12 @@ func galMulSliceXor(c byte, in, out []byte, o *options) {
		galMulSSSE3Xor(mulTableLow[c][:], mulTableHigh[c][:], in, out)
		done = (len(in) >> 4) << 4
	}
	remain := len(in) - done
	if remain > 0 {
		mt := mulTable[c][:256]
		for i := done; i < len(in); i++ {
			out[i] ^= mt[in[i]]
		}
	in = in[done:]
	out = out[done:]
	out = out[:len(in)]
	mt := mulTable[c][:256]
	for i := range in {
		out[i] ^= mt[in[i]]
	}
}



@@ 83,10 83,10 @@ func sliceXor(in, out []byte, sse2 bool) {
		sSE2XorSlice(in, out)
		done = (len(in) >> 4) << 4
	}
	remain := len(in) - done
	if remain > 0 {
		for i := done; i < len(in); i++ {
			out[i] ^= in[i]
		}
	in = in[done:]
	out = out[done:]
	out = out[:len(in)]
	for i := range in {
		out[i] ^= in[i]
	}
}

M vendor/github.com/klauspost/reedsolomon/galois_arm64.go => vendor/github.com/klauspost/reedsolomon/galois_arm64.go +0 -3
@@ 47,6 47,3 @@ func sliceXor(in, out []byte, sse2 bool) {
		out[n] ^= input
	}
}

func (r reedSolomon) codeSomeShardsAvx512(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
}

M vendor/github.com/klauspost/reedsolomon/galois_noasm.go => vendor/github.com/klauspost/reedsolomon/galois_noasm.go +0 -4
@@ 32,7 32,3 @@ func sliceXor(in, out []byte, sse2 bool) {
func init() {
	defaultOptions.useAVX512 = false
}

func (r reedSolomon) codeSomeShardsAvx512(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	panic("unreachable")
}

A vendor/github.com/klauspost/reedsolomon/galois_notamd64.go => vendor/github.com/klauspost/reedsolomon/galois_notamd64.go +13 -0
@@ 0,0 1,13 @@
//+build !amd64 noasm appengine gccgo

// Copyright 2020, Klaus Post, see LICENSE for details.

package reedsolomon

func (r reedSolomon) codeSomeShardsAvx512(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	panic("codeSomeShardsAvx512 should not be called if built without asm")
}

func (r reedSolomon) codeSomeShardsAvx512P(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	panic("codeSomeShardsAvx512P should not be called if built without asm")
}

M vendor/github.com/klauspost/reedsolomon/galois_ppc64le.go => vendor/github.com/klauspost/reedsolomon/galois_ppc64le.go +0 -3
@@ 65,6 65,3 @@ func sliceXor(in, out []byte, sse2 bool) {
		out[n] ^= input
	}
}

func (r reedSolomon) codeSomeShardsAvx512(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
}

A vendor/github.com/klauspost/reedsolomon/go.mod => vendor/github.com/klauspost/reedsolomon/go.mod +5 -0
@@ 0,0 1,5 @@
module github.com/klauspost/reedsolomon

go 1.14

require github.com/klauspost/cpuid v1.2.4

A vendor/github.com/klauspost/reedsolomon/go.sum => vendor/github.com/klauspost/reedsolomon/go.sum +4 -0
@@ 0,0 1,4 @@
github.com/klauspost/cpuid v1.2.3 h1:CCtW0xUnWGVINKvE/WWOYKdsPV6mawAtvQuSl8guwQs=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/cpuid v1.2.4 h1:EBfaK0SWSwk+fgk6efYFWdzl8MwRWoOO1gkmiaTXPW4=
github.com/klauspost/cpuid v1.2.4/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=

M vendor/github.com/klauspost/reedsolomon/options.go => vendor/github.com/klauspost/reedsolomon/options.go +1 -0
@@ 16,6 16,7 @@ type options struct {
	usePAR1Matrix                         bool
	useCauchy                             bool
	shardSize                             int
	perRound                              int
}

var defaultOptions = options{

M vendor/github.com/klauspost/reedsolomon/reedsolomon.go => vendor/github.com/klauspost/reedsolomon/reedsolomon.go +68 -30
@@ 242,23 242,31 @@ func New(dataShards, parityShards int, opts ...Option) (Encoder, error) {
	if err != nil {
		return nil, err
	}

	// Calculate what we want per round
	r.o.perRound = cpuid.CPU.Cache.L2
	if r.o.perRound <= 0 {
		// Set to 128K if undetectable.
		r.o.perRound = 128 << 10
	}

	if cpuid.CPU.ThreadsPerCore > 1 && r.o.maxGoroutines > cpuid.CPU.PhysicalCores {
		// If multiple threads per core, make sure they don't contend for cache.
		r.o.perRound /= cpuid.CPU.ThreadsPerCore
	}
	// 1 input + parity must fit in cache, and we add one more to be safer.
	r.o.perRound = r.o.perRound / (1 + parityShards)
	// Align to 64 bytes.
	r.o.perRound = ((r.o.perRound + 63) / 64) * 64

	if r.o.perRound < r.o.minSplitSize {
		r.o.perRound = r.o.minSplitSize
	}

	if r.o.shardSize > 0 {
		cacheSize := cpuid.CPU.Cache.L2
		if cacheSize <= 0 {
			// Set to 128K if undetectable.
			cacheSize = 128 << 10
		}
		p := runtime.NumCPU()
		g := r.o.shardSize / r.o.perRound

		// 1 input + parity must fit in cache, and we add one more to be safer.
		shards := 1 + parityShards
		g := (r.o.shardSize * shards) / (cacheSize - (cacheSize >> 4))

		if cpuid.CPU.ThreadsPerCore > 1 {
			// If multiple threads per core, make sure they don't contend for cache.
			g *= cpuid.CPU.ThreadsPerCore
		}
		g *= 2
		if g < p {
			g = p
		}


@@ 276,6 284,7 @@ func New(dataShards, parityShards int, opts ...Option) (Encoder, error) {
		if cacheSize <= 0 {
			cacheSize = 32 << 10
		}

		r.o.minSplitSize = cacheSize / (parityShards + 1)
		// Min 1K
		if r.o.minSplitSize < 1024 {


@@ 450,22 459,39 @@ func (r reedSolomon) Verify(shards [][]byte) (bool, error) {
// number of matrix rows used, is determined by
// outputCount, which is the number of outputs to compute.
func (r reedSolomon) codeSomeShards(matrixRows, inputs, outputs [][]byte, outputCount, byteCount int) {
	if r.o.useAVX512 && len(inputs) >= 4 && len(outputs) >= 2 {
	switch {
	case r.o.useAVX512 && r.o.maxGoroutines > 1 && byteCount > r.o.minSplitSize && len(inputs) >= 4 && len(outputs) >= 2:
		r.codeSomeShardsAvx512P(matrixRows, inputs, outputs, outputCount, byteCount)
		return
	case r.o.useAVX512 && len(inputs) >= 4 && len(outputs) >= 2:
		r.codeSomeShardsAvx512(matrixRows, inputs, outputs, outputCount, byteCount)
		return
	} else if r.o.maxGoroutines > 1 && byteCount > r.o.minSplitSize {
	case r.o.maxGoroutines > 1 && byteCount > r.o.minSplitSize:
		r.codeSomeShardsP(matrixRows, inputs, outputs, outputCount, byteCount)
		return
	}
	for c := 0; c < r.DataShards; c++ {
		in := inputs[c]
		for iRow := 0; iRow < outputCount; iRow++ {
			if c == 0 {
				galMulSlice(matrixRows[iRow][c], in, outputs[iRow], &r.o)
			} else {
				galMulSliceXor(matrixRows[iRow][c], in, outputs[iRow], &r.o)

	// Process using no goroutines
	start, end := 0, r.o.perRound
	if end > len(inputs[0]) {
		end = len(inputs[0])
	}
	for start < len(inputs[0]) {
		for c := 0; c < r.DataShards; c++ {
			in := inputs[c][start:end]
			for iRow := 0; iRow < outputCount; iRow++ {
				if c == 0 {
					galMulSlice(matrixRows[iRow][c], in, outputs[iRow][start:end], &r.o)
				} else {
					galMulSliceXor(matrixRows[iRow][c], in, outputs[iRow][start:end], &r.o)
				}
			}
		}
		start = end
		end += r.o.perRound
		if end > len(inputs[0]) {
			end = len(inputs[0])
		}
	}
}



@@ 484,17 510,29 @@ func (r reedSolomon) codeSomeShardsP(matrixRows, inputs, outputs [][]byte, outpu
		if start+do > byteCount {
			do = byteCount - start
		}

		wg.Add(1)
		go func(start, stop int) {
			for c := 0; c < r.DataShards; c++ {
				in := inputs[c][start:stop]
				for iRow := 0; iRow < outputCount; iRow++ {
					if c == 0 {
						galMulSlice(matrixRows[iRow][c], in, outputs[iRow][start:stop], &r.o)
					} else {
						galMulSliceXor(matrixRows[iRow][c], in, outputs[iRow][start:stop], &r.o)
			lstart, lstop := start, start+r.o.perRound
			if lstop > stop {
				lstop = stop
			}
			for lstart < stop {
				for c := 0; c < r.DataShards; c++ {
					in := inputs[c][lstart:lstop]
					for iRow := 0; iRow < outputCount; iRow++ {
						if c == 0 {
							galMulSlice(matrixRows[iRow][c], in, outputs[iRow][lstart:lstop], &r.o)
						} else {
							galMulSliceXor(matrixRows[iRow][c], in, outputs[iRow][lstart:lstop], &r.o)
						}
					}
				}
				lstart = lstop
				lstop += r.o.perRound
				if lstop > stop {
					lstop = stop
				}
			}
			wg.Done()
		}(start, start+do)

M vendor/github.com/sirupsen/logrus/CHANGELOG.md => vendor/github.com/sirupsen/logrus/CHANGELOG.md +25 -2
@@ 1,9 1,32 @@
# 1.6.0
Fixes:
  * end of line cleanup
  * revert the entry concurrency bug fix whic leads to deadlock under some circumstances
  * update dependency on go-windows-terminal-sequences to fix a crash with go 1.14

Features:
  * add an option to the `TextFormatter` to completely disable fields quoting

# 1.5.0
Code quality:
  * add golangci linter run on travis

Fixes:
  * add mutex for hooks concurrent access on `Entry` data
  * caller function field for go1.14
  * fix build issue for gopherjs target

Feature:
  * add an hooks/writer sub-package whose goal is to split output on different stream depending on the trace level
  * add a `DisableHTMLEscape` option in the `JSONFormatter`
  * add `ForceQuote` and `PadLevelText` options in the `TextFormatter`

# 1.4.2
  * Fixes build break for plan9, nacl, solaris
# 1.4.1
This new release introduces:
  * Enhance TextFormatter to not print caller information when they are empty (#944)
  * Remove dependency on golang.org/x/crypto (#932, #943) 
  * Remove dependency on golang.org/x/crypto (#932, #943)

Fixes:
  * Fix Entry.WithContext method to return a copy of the initial entry (#941)


@@ 11,7 34,7 @@ Fixes:
# 1.4.0
This new release introduces:
  * Add `DeferExitHandler`, similar to `RegisterExitHandler` but prepending the handler to the list of handlers (semantically like `defer`) (#848).
  * Add `CallerPrettyfier` to `JSONFormatter` and `TextFormatter (#909, #911)
  * Add `CallerPrettyfier` to `JSONFormatter` and `TextFormatter` (#909, #911)
  * Add `Entry.WithContext()` and `Entry.Context`, to set a context on entries to be used e.g. in hooks (#919).

Fixes:

M vendor/github.com/sirupsen/logrus/appveyor.yml => vendor/github.com/sirupsen/logrus/appveyor.yml +14 -14
@@ 1,14 1,14 @@
version: "{build}"
platform: x64
clone_folder: c:\gopath\src\github.com\sirupsen\logrus
environment:  
  GOPATH: c:\gopath
branches:  
  only:
    - master
install:  
  - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
  - go version
build_script:  
  - go get -t
  - go test
version: "{build}"
platform: x64
clone_folder: c:\gopath\src\github.com\sirupsen\logrus
environment:
  GOPATH: c:\gopath
branches:
  only:
    - master
install:
  - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
  - go version
build_script:
  - go get -t
  - go test

M vendor/github.com/sirupsen/logrus/entry.go => vendor/github.com/sirupsen/logrus/entry.go +0 -2
@@ 122,8 122,6 @@ func (entry *Entry) WithField(key string, value interface{}) *Entry {

// Add a map of fields to the Entry.
func (entry *Entry) WithFields(fields Fields) *Entry {
	entry.Logger.mu.Lock()
	defer entry.Logger.mu.Unlock()
	data := make(Fields, len(entry.Data)+len(fields))
	for k, v := range entry.Data {
		data[k] = v

M vendor/github.com/sirupsen/logrus/go.mod => vendor/github.com/sirupsen/logrus/go.mod +1 -1
@@ 2,7 2,7 @@ module github.com/sirupsen/logrus

require (
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/konsorten/go-windows-terminal-sequences v1.0.1
	github.com/konsorten/go-windows-terminal-sequences v1.0.3
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/stretchr/testify v1.2.2
	golang.org/x/sys v0.0.0-20190422165155-953cdadca894

M vendor/github.com/sirupsen/logrus/go.sum => vendor/github.com/sirupsen/logrus/go.sum +2 -0
@@ 2,6 2,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=

M vendor/github.com/sirupsen/logrus/text_formatter.go => vendor/github.com/sirupsen/logrus/text_formatter.go +8 -0
@@ 37,6 37,11 @@ type TextFormatter struct {
	// Force quoting of all values
	ForceQuote bool

	// DisableQuote disables quoting for all values.
	// DisableQuote will have a lower priority than ForceQuote.
	// If both of them are set to true, quote will be forced on all values.
	DisableQuote bool

	// Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/
	EnvironmentOverrideColors bool



@@ 292,6 297,9 @@ func (f *TextFormatter) needsQuoting(text string) bool {
	if f.QuoteEmptyFields && len(text) == 0 {
		return true
	}
	if f.DisableQuote {
		return false
	}
	for _, ch := range text {
		if !((ch >= 'a' && ch <= 'z') ||
			(ch >= 'A' && ch <= 'Z') ||

A vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go => vendor/golang.org/x/sys/internal/unsafeheader/unsafeheader.go +30 -0
@@ 0,0 1,30 @@
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Package unsafeheader contains header declarations for the Go runtime's
// slice and string implementations.
//
// This package allows x/sys to use types equivalent to
// reflect.SliceHeader and reflect.StringHeader without introducing
// a dependency on the (relatively heavy) "reflect" package.
package unsafeheader

import (
	"unsafe"
)

// Slice is the runtime representation of a slice.
// It cannot be used safely or portably and its representation may change in a later release.
type Slice struct {
	Data unsafe.Pointer
	Len  int
	Cap  int
}

// String is the runtime representation of a string.
// It cannot be used safely or portably and its representation may change in a later release.
type String struct {
	Data unsafe.Pointer
	Len  int
}

M vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go => vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go +14 -7
@@ 6,7 6,11 @@

package unix

import "unsafe"
import (
	"unsafe"

	"golang.org/x/sys/internal/unsafeheader"
)

//sys	closedir(dir uintptr) (err error)
//sys	readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno)


@@ 71,6 75,7 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
			cnt++
			continue
		}

		reclen := int(entry.Reclen)
		if reclen > len(buf) {
			// Not enough room. Return for now.


@@ 79,13 84,15 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
			// restarting is O(n^2) in the length of the directory. Oh well.
			break
		}

		// Copy entry into return buffer.
		s := struct {
			ptr unsafe.Pointer
			siz int
			cap int
		}{ptr: unsafe.Pointer(&entry), siz: reclen, cap: reclen}
		copy(buf, *(*[]byte)(unsafe.Pointer(&s)))
		var s []byte
		hdr := (*unsafeheader.Slice)(unsafe.Pointer(&s))
		hdr.Data = unsafe.Pointer(&entry)
		hdr.Cap = reclen
		hdr.Len = reclen
		copy(buf, s)

		buf = buf[reclen:]
		n += reclen
		cnt++

M vendor/golang.org/x/sys/unix/syscall_linux.go => vendor/golang.org/x/sys/unix/syscall_linux.go +9 -0
@@ 1633,6 1633,15 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
//sys	CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
//sys	DeleteModule(name string, flags int) (err error)
//sys	Dup(oldfd int) (fd int, err error)

func Dup2(oldfd, newfd int) error {
	// Android O and newer blocks dup2; riscv and arm64 don't implement dup2.
	if runtime.GOOS == "android" || runtime.GOARCH == "riscv64" || runtime.GOARCH == "arm64" {
		return Dup3(oldfd, newfd, 0)
	}
	return dup2(oldfd, newfd)
}

//sys	Dup3(oldfd int, newfd int, flags int) (err error)
//sysnb	EpollCreate1(flag int) (fd int, err error)
//sysnb	EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)

M vendor/golang.org/x/sys/unix/syscall_linux_386.go => vendor/golang.org/x/sys/unix/syscall_linux_386.go +1 -1
@@ 49,7 49,7 @@ func Pipe2(p []int, flags int) (err error) {

// 64-bit file system and 32-bit uid calls
// (386 default is 32-bit file system and 16-bit uid).
//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64

M vendor/golang.org/x/sys/unix/syscall_linux_amd64.go => vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +1 -1
@@ 6,7 6,7 @@

package unix

//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64

M vendor/golang.org/x/sys/unix/syscall_linux_arm.go => vendor/golang.org/x/sys/unix/syscall_linux_arm.go +1 -1
@@ 80,7 80,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {

// 64-bit file system and 32-bit uid calls
// (16-bit uid calls are not always supported in newer kernels)
//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32

M vendor/golang.org/x/sys/unix/syscall_linux_arm64.go => vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +3 -3
@@ 210,9 210,9 @@ func InotifyInit() (fd int, err error) {
	return InotifyInit1(0)
}

func Dup2(oldfd int, newfd int) (err error) {
	return Dup3(oldfd, newfd, 0)
}
// dup2 exists because func Dup3 in syscall_linux.go references
// it in an unreachable path. dup2 isn't available on arm64.
func dup2(oldfd int, newfd int) error

func Pause() error {
	_, err := ppoll(nil, 0, nil, nil)

M vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go => vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +1 -1
@@ 7,7 7,7 @@

package unix

//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64

M vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go => vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +1 -1
@@ 14,7 14,7 @@ import (

func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)

//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64

M vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go => vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +1 -1
@@ 7,7 7,7 @@

package unix

//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64

M vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go => vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +4 -4
@@ 191,10 191,6 @@ func InotifyInit() (fd int, err error) {
	return InotifyInit1(0)
}

func Dup2(oldfd int, newfd int) (err error) {
	return Dup3(oldfd, newfd, 0)
}

func Pause() error {
	_, err := ppoll(nil, 0, nil, nil)
	return err


@@ 228,3 224,7 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error 
	}
	return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags)
}

// dup2 exists because func Dup3 in syscall_linux.go references
// it in an unreachable path. dup2 isn't available on arm64.
func dup2(oldfd int, newfd int) error

M vendor/golang.org/x/sys/unix/syscall_linux_s390x.go => vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +1 -1
@@ 10,7 10,7 @@ import (
	"unsafe"
)

//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sysnb	EpollCreate(size int) (fd int, err error)
//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64

M vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go => vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +1 -1
@@ 8,7 8,7 @@ package unix

//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
//sys	Dup2(oldfd int, newfd int) (err error)
//sys	dup2(oldfd int, newfd int) (err error)
//sys	Fchown(fd int, uid int, gid int) (err error)
//sys	Fstat(fd int, stat *Stat_t) (err error)
//sys	Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64

M vendor/golang.org/x/sys/unix/syscall_unix.go => vendor/golang.org/x/sys/unix/syscall_unix.go +8 -9
@@ 12,6 12,8 @@ import (
	"sync"
	"syscall"
	"unsafe"

	"golang.org/x/sys/internal/unsafeheader"
)

var (


@@ 113,15 115,12 @@ func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (d
		return nil, errno
	}

	// Slice memory layout
	var sl = struct {
		addr uintptr
		len  int
		cap  int
	}{addr, length, length}

	// Use unsafe to turn sl into a []byte.
	b := *(*[]byte)(unsafe.Pointer(&sl))
	// Use unsafe to convert addr into a []byte.
	var b []byte
	hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b))
	hdr.Data = unsafe.Pointer(addr)
	hdr.Cap = length
	hdr.Len = length

	// Register mapping in m and return it.
	p := &b[cap(b)-1]

M vendor/golang.org/x/sys/unix/zsyscall_linux_386.go => vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +1 -1
@@ 55,7 55,7 @@ func pipe(p *[2]_C_int) (err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go => vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go => vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +1 -1
@@ 234,7 234,7 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go => vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go => vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go => vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go => vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go => vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go => vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go => vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +1 -1
@@ 45,7 45,7 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go => vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +1 -1
@@ 72,7 72,7 @@ func Fadvise(fd int, offset int64, length int64, advice int) (err error) {

// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT

func Dup2(oldfd int, newfd int) (err error) {
func dup2(oldfd int, newfd int) (err error) {
	_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)
	if e1 != 0 {
		err = errnoErr(e1)

M vendor/google.golang.org/protobuf/encoding/prototext/encode.go => vendor/google.golang.org/protobuf/encoding/prototext/encode.go +6 -0
@@ 106,6 106,12 @@ func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) {
		return nil, err
	}

	// Treat nil message interface as an empty message,
	// in which case there is nothing to output.
	if m == nil {
		return []byte{}, nil
	}

	enc := encoder{internalEnc, o}
	err = enc.marshalMessage(m.ProtoReflect(), false)
	if err != nil {

M vendor/google.golang.org/protobuf/internal/descfmt/stringer.go => vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +1 -1
@@ 106,7 106,7 @@ func formatListOpt(vs list, isRoot, allowMulti bool) string {
var descriptorAccessors = map[reflect.Type][]string{
	reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem():      {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"},
	reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem():   {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"},
	reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem():     {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "IsPacked", "IsExtension", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"},
	reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem():     {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"},
	reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem():     {"Fields"}, // not directly used; must keep in sync with formatDescOpt
	reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem():      {"Values", "ReservedNames", "ReservedRanges"},
	reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"},

M vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go => vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go +11 -10
@@ 61,16 61,17 @@ const (

// Field numbers for google.protobuf.FieldDescriptorProto.
const (
	FieldDescriptorProto_Name         = 1  // optional string
	FieldDescriptorProto_Number       = 3  // optional int32
	FieldDescriptorProto_Label        = 4  // optional google.protobuf.FieldDescriptorProto.Label
	FieldDescriptorProto_Type         = 5  // optional google.protobuf.FieldDescriptorProto.Type
	FieldDescriptorProto_TypeName     = 6  // optional string
	FieldDescriptorProto_Extendee     = 2  // optional string
	FieldDescriptorProto_DefaultValue = 7  // optional string
	FieldDescriptorProto_OneofIndex   = 9  // optional int32
	FieldDescriptorProto_JsonName     = 10 // optional string
	FieldDescriptorProto_Options      = 8  // optional google.protobuf.FieldOptions
	FieldDescriptorProto_Name           = 1  // optional string
	FieldDescriptorProto_Number         = 3  // optional int32
	FieldDescriptorProto_Label          = 4  // optional google.protobuf.FieldDescriptorProto.Label
	FieldDescriptorProto_Type           = 5  // optional google.protobuf.FieldDescriptorProto.Type
	FieldDescriptorProto_TypeName       = 6  // optional string
	FieldDescriptorProto_Extendee       = 2  // optional string
	FieldDescriptorProto_DefaultValue   = 7  // optional string
	FieldDescriptorProto_OneofIndex     = 9  // optional int32
	FieldDescriptorProto_JsonName       = 10 // optional string
	FieldDescriptorProto_Options        = 8  // optional google.protobuf.FieldOptions
	FieldDescriptorProto_Proto3Optional = 17 // optional bool
)

// Field numbers for google.protobuf.OneofDescriptorProto.

M vendor/google.golang.org/protobuf/internal/fieldsort/fieldsort.go => vendor/google.golang.org/protobuf/internal/fieldsort/fieldsort.go +2 -2
@@ 30,9 30,9 @@ func Less(a, b protoreflect.FieldDescriptor) bool {
			return a.Number() < b.Number()
		}
		return oa.Index() < ob.Index()
	case oa != nil:
	case oa != nil && !oa.IsSynthetic():
		return false
	case ob != nil:
	case ob != nil && !ob.IsSynthetic():
		return true
	default:
		return a.Number() < b.Number()

M vendor/google.golang.org/protobuf/internal/filedesc/desc.go => vendor/google.golang.org/protobuf/internal/filedesc/desc.go +41 -26
@@ 77,7 77,7 @@ func (fd *File) Enums() pref.EnumDescriptors           { return &fd.L1.Enums }
func (fd *File) Messages() pref.MessageDescriptors     { return &fd.L1.Messages }
func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions }
func (fd *File) Services() pref.ServiceDescriptors     { return &fd.L1.Services }
func (fd *File) SourceLocations() pref.SourceLocations { return &fd.L2.Locations }
func (fd *File) SourceLocations() pref.SourceLocations { return &fd.lazyInit().Locations }
func (fd *File) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, fd) }
func (fd *File) ProtoType(pref.FileDescriptor)         {}
func (fd *File) ProtoInternal(pragma.DoNotImplement)   {}


@@ 202,20 202,21 @@ type (
		L1 FieldL1
	}
	FieldL1 struct {
		Options         func() pref.ProtoMessage
		Number          pref.FieldNumber
		Cardinality     pref.Cardinality // must be consistent with Message.RequiredNumbers
		Kind            pref.Kind
		JSONName        jsonName
		IsWeak          bool // promoted from google.protobuf.FieldOptions
		HasPacked       bool // promoted from google.protobuf.FieldOptions
		IsPacked        bool // promoted from google.protobuf.FieldOptions
		HasEnforceUTF8  bool // promoted from google.protobuf.FieldOptions
		EnforceUTF8     bool // promoted from google.protobuf.FieldOptions
		Default         defaultValue
		ContainingOneof pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields
		Enum            pref.EnumDescriptor
		Message         pref.MessageDescriptor
		Options          func() pref.ProtoMessage
		Number           pref.FieldNumber
		Cardinality      pref.Cardinality // must be consistent with Message.RequiredNumbers
		Kind             pref.Kind
		JSONName         jsonName
		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto
		IsWeak           bool // promoted from google.protobuf.FieldOptions
		HasPacked        bool // promoted from google.protobuf.FieldOptions
		IsPacked         bool // promoted from google.protobuf.FieldOptions
		HasEnforceUTF8   bool // promoted from google.protobuf.FieldOptions
		EnforceUTF8      bool // promoted from google.protobuf.FieldOptions
		Default          defaultValue
		ContainingOneof  pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields
		Enum             pref.EnumDescriptor
		Message          pref.MessageDescriptor
	}

	Oneof struct {


@@ 277,6 278,12 @@ func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality }
func (fd *Field) Kind() pref.Kind               { return fd.L1.Kind }
func (fd *Field) HasJSONName() bool             { return fd.L1.JSONName.has }
func (fd *Field) JSONName() string              { return fd.L1.JSONName.get(fd) }
func (fd *Field) HasPresence() bool {
	return fd.L1.Cardinality != pref.Repeated && (fd.L0.ParentFile.L1.Syntax == pref.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil)
}
func (fd *Field) HasOptionalKeyword() bool {
	return (fd.L0.ParentFile.L1.Syntax == pref.Proto2 && fd.L1.Cardinality == pref.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional
}
func (fd *Field) IsPacked() bool {
	if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated {
		switch fd.L1.Kind {


@@ 338,6 345,9 @@ func (fd *Field) EnforceUTF8() bool {
	return fd.L0.ParentFile.L1.Syntax == pref.Proto3
}

func (od *Oneof) IsSynthetic() bool {
	return od.L0.ParentFile.L1.Syntax == pref.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword()
}
func (od *Oneof) Options() pref.ProtoMessage {
	if f := od.L1.Options; f != nil {
		return f()


@@ 361,12 371,13 @@ type (
		Kind        pref.Kind
	}
	ExtensionL2 struct {
		Options  func() pref.ProtoMessage
		JSONName jsonName
		IsPacked bool // promoted from google.protobuf.FieldOptions
		Default  defaultValue
		Enum     pref.EnumDescriptor
		Message  pref.MessageDescriptor
		Options          func() pref.ProtoMessage
		JSONName         jsonName
		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto
		IsPacked         bool // promoted from google.protobuf.FieldOptions
		Default          defaultValue
		Enum             pref.EnumDescriptor
		Message          pref.MessageDescriptor
	}
)



@@ 376,11 387,15 @@ func (xd *Extension) Options() pref.ProtoMessage {
	}
	return descopts.Field
}
func (xd *Extension) Number() pref.FieldNumber                   { return xd.L1.Number }
func (xd *Extension) Cardinality() pref.Cardinality              { return xd.L1.Cardinality }
func (xd *Extension) Kind() pref.Kind                            { return xd.L1.Kind }
func (xd *Extension) HasJSONName() bool                          { return xd.lazyInit().JSONName.has }
func (xd *Extension) JSONName() string                           { return xd.lazyInit().JSONName.get(xd) }
func (xd *Extension) Number() pref.FieldNumber      { return xd.L1.Number }
func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality }
func (xd *Extension) Kind() pref.Kind               { return xd.L1.Kind }
func (xd *Extension) HasJSONName() bool             { return xd.lazyInit().JSONName.has }
func (xd *Extension) JSONName() string              { return xd.lazyInit().JSONName.get(xd) }
func (xd *Extension) HasPresence() bool             { return xd.L1.Cardinality != pref.Repeated }
func (xd *Extension) HasOptionalKeyword() bool {
	return (xd.L0.ParentFile.L1.Syntax == pref.Proto2 && xd.L1.Cardinality == pref.Optional) || xd.lazyInit().IsProto3Optional
}
func (xd *Extension) IsPacked() bool                             { return xd.lazyInit().IsPacked }
func (xd *Extension) IsExtension() bool                          { return true }
func (xd *Extension) IsWeak() bool                               { return false }

M vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go => vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +9 -0
@@ 441,6 441,8 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des
					panic("oneof type already set")
				}
				fd.L1.ContainingOneof = od
			case fieldnum.FieldDescriptorProto_Proto3Optional:
				fd.L1.IsProto3Optional = protowire.DecodeBool(v)
			}
		case protowire.BytesType:
			v, m := protowire.ConsumeBytes(b)


@@ 537,6 539,13 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
		num, typ, n := protowire.ConsumeTag(b)
		b = b[n:]
		switch typ {
		case protowire.VarintType:
			v, m := protowire.ConsumeVarint(b)
			b = b[m:]
			switch num {
			case fieldnum.FieldDescriptorProto_Proto3Optional:
				xd.L2.IsProto3Optional = protowire.DecodeBool(v)
			}
		case protowire.BytesType:
			v, m := protowire.ConsumeBytes(b)
			b = b[m:]

M vendor/google.golang.org/protobuf/internal/impl/codec_gen.go => vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +40 -0
@@ 5078,6 5078,46 @@ var coderStringPtr = pointerCoderFuncs{
	merge:     mergeStringPtr,
}

// appendStringPtrValidateUTF8 wire encodes a *string pointer as a String.
// It panics if the pointer is nil.
func appendStringPtrValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
	v := **p.StringPtr()
	b = protowire.AppendVarint(b, f.wiretag)
	b = protowire.AppendString(b, v)
	if !utf8.ValidString(v) {
		return b, errInvalidUTF8{}
	}
	return b, nil
}

// consumeStringPtrValidateUTF8 wire decodes a *string pointer as a String.
func consumeStringPtrValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
	if wtyp != protowire.BytesType {
		return out, errUnknown
	}
	v, n := protowire.ConsumeString(b)
	if n < 0 {
		return out, protowire.ParseError(n)
	}
	if !utf8.ValidString(v) {
		return out, errInvalidUTF8{}
	}
	vp := p.StringPtr()
	if *vp == nil {
		*vp = new(string)
	}
	**vp = v
	out.n = n
	return out, nil
}

var coderStringPtrValidateUTF8 = pointerCoderFuncs{
	size:      sizeStringPtr,
	marshal:   appendStringPtrValidateUTF8,
	unmarshal: consumeStringPtrValidateUTF8,
	merge:     mergeStringPtr,
}

// sizeStringSlice returns the size of wire encoding a []string pointer as a repeated String.
func sizeStringSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
	s := *p.StringSlice()

M vendor/google.golang.org/protobuf/internal/impl/codec_message.go => vendor/google.golang.org/protobuf/internal/impl/codec_message.go +22 -9
@@ 31,6 31,11 @@ type coderMessageInfo struct {
	needsInitCheck     bool
	isMessageSet       bool
	numRequiredFields  uint8

	// Include space for a number of coderFieldInfos to improve cache locality.
	// The number of entries is chosen through a combination of guesswork and
	// empirical testing.
	coderFieldBuf [32]coderFieldInfo
}

type coderFieldInfo struct {


@@ 53,11 58,13 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {

	mi.coderFields = make(map[protowire.Number]*coderFieldInfo)
	fields := mi.Desc.Fields()
	preallocFields := mi.coderFieldBuf[:]
	for i := 0; i < fields.Len(); i++ {
		fd := fields.Get(i)

		fs := si.fieldsByNumber[fd.Number()]
		if fd.ContainingOneof() != nil {
		isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic()
		if isOneof {
			fs = si.oneofsByName[fd.ContainingOneof().Name()]
		}
		ft := fs.Type


@@ 71,7 78,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
		var funcs pointerCoderFuncs
		var childMessage *MessageInfo
		switch {
		case fd.ContainingOneof() != nil:
		case isOneof:
			fieldOffset = offsetOf(fs, mi.Exporter)
		case fd.IsWeak():
			fieldOffset = si.weakOffset


@@ 80,7 87,14 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
			fieldOffset = offsetOf(fs, mi.Exporter)
			childMessage, funcs = fieldCoder(fd, ft)
		}
		cf := &coderFieldInfo{
		var cf *coderFieldInfo
		if len(preallocFields) > 0 {
			cf = &preallocFields[0]
			preallocFields = preallocFields[1:]
		} else {
			cf = new(coderFieldInfo)
		}
		*cf = coderFieldInfo{
			num:        fd.Number(),
			offset:     fieldOffset,
			wiretag:    wiretag,


@@ 89,17 103,16 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
			funcs:      funcs,
			mi:         childMessage,
			validation: newFieldValidationInfo(mi, si, fd, ft),
			isPointer: (fd.Cardinality() == pref.Repeated ||
				fd.Kind() == pref.MessageKind ||
				fd.Kind() == pref.GroupKind ||
				fd.Syntax() != pref.Proto3),
			isPointer:  fd.Cardinality() == pref.Repeated || fd.HasPresence(),
			isRequired: fd.Cardinality() == pref.Required,
		}
		mi.orderedCoderFields = append(mi.orderedCoderFields, cf)
		mi.coderFields[cf.num] = cf
	}
	for i, oneofs := 0, mi.Desc.Oneofs(); i < oneofs.Len(); i++ {
		mi.initOneofFieldCoders(oneofs.Get(i), si)
		if od := oneofs.Get(i); !od.IsSynthetic() {
			mi.initOneofFieldCoders(od, si)
		}
	}
	if messageset.IsMessageSet(mi.Desc) {
		if !mi.extensionOffset.IsValid() {


@@ 123,7 136,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
	}
	mi.denseCoderFields = make([]*coderFieldInfo, maxDense+1)
	for _, cf := range mi.orderedCoderFields {
		if int(cf.num) > len(mi.denseCoderFields) {
		if int(cf.num) >= len(mi.denseCoderFields) {
			break
		}
		mi.denseCoderFields[cf.num] = cf

M vendor/google.golang.org/protobuf/internal/impl/codec_tables.go => vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +3 -0
@@ 338,6 338,9 @@ func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointer
				return nil, coderDoublePtr
			}
		case pref.StringKind:
			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
				return nil, coderStringPtrValidateUTF8
			}
			if ft.Kind() == reflect.String {
				return nil, coderStringPtr
			}

M vendor/google.golang.org/protobuf/internal/impl/convert.go => vendor/google.golang.org/protobuf/internal/impl/convert.go +11 -11
@@ 162,7 162,7 @@ func (c *boolConverter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *boolConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *boolConverter) New() pref.Value  { return c.def }
func (c *boolConverter) Zero() pref.Value { return c.def }


@@ 186,7 186,7 @@ func (c *int32Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *int32Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *int32Converter) New() pref.Value  { return c.def }
func (c *int32Converter) Zero() pref.Value { return c.def }


@@ 210,7 210,7 @@ func (c *int64Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *int64Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *int64Converter) New() pref.Value  { return c.def }
func (c *int64Converter) Zero() pref.Value { return c.def }


@@ 234,7 234,7 @@ func (c *uint32Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *uint32Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *uint32Converter) New() pref.Value  { return c.def }
func (c *uint32Converter) Zero() pref.Value { return c.def }


@@ 258,7 258,7 @@ func (c *uint64Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *uint64Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *uint64Converter) New() pref.Value  { return c.def }
func (c *uint64Converter) Zero() pref.Value { return c.def }


@@ 282,7 282,7 @@ func (c *float32Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *float32Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *float32Converter) New() pref.Value  { return c.def }
func (c *float32Converter) Zero() pref.Value { return c.def }


@@ 306,7 306,7 @@ func (c *float64Converter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *float64Converter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *float64Converter) New() pref.Value  { return c.def }
func (c *float64Converter) Zero() pref.Value { return c.def }


@@ 336,7 336,7 @@ func (c *stringConverter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *stringConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *stringConverter) New() pref.Value  { return c.def }
func (c *stringConverter) Zero() pref.Value { return c.def }


@@ 363,7 363,7 @@ func (c *bytesConverter) IsValidPB(v pref.Value) bool {
	return ok
}
func (c *bytesConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}
func (c *bytesConverter) New() pref.Value  { return c.def }
func (c *bytesConverter) Zero() pref.Value { return c.def }


@@ 400,7 400,7 @@ func (c *enumConverter) IsValidPB(v pref.Value) bool {
}

func (c *enumConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}

func (c *enumConverter) New() pref.Value {


@@ 455,7 455,7 @@ func (c *messageConverter) IsValidPB(v pref.Value) bool {
}

func (c *messageConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}

func (c *messageConverter) New() pref.Value {

M vendor/google.golang.org/protobuf/internal/impl/convert_list.go => vendor/google.golang.org/protobuf/internal/impl/convert_list.go +5 -5
@@ 22,7 22,7 @@ func newListConverter(t reflect.Type, fd pref.FieldDescriptor) Converter {
}

type listConverter struct {
	goType reflect.Type
	goType reflect.Type // []T
	c      Converter
}



@@ 48,11 48,11 @@ func (c *listConverter) IsValidPB(v pref.Value) bool {
	if !ok {
		return false
	}
	return list.v.Type().Elem() == c.goType && list.IsValid()
	return list.v.Type().Elem() == c.goType
}

func (c *listConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}

func (c *listConverter) New() pref.Value {


@@ 64,7 64,7 @@ func (c *listConverter) Zero() pref.Value {
}

type listPtrConverter struct {
	goType reflect.Type
	goType reflect.Type // *[]T
	c      Converter
}



@@ 88,7 88,7 @@ func (c *listPtrConverter) IsValidPB(v pref.Value) bool {
}

func (c *listPtrConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}

func (c *listPtrConverter) New() pref.Value {

M vendor/google.golang.org/protobuf/internal/impl/convert_map.go => vendor/google.golang.org/protobuf/internal/impl/convert_map.go +3 -3
@@ 12,7 12,7 @@ import (
)

type mapConverter struct {
	goType           reflect.Type
	goType           reflect.Type // map[K]V
	keyConv, valConv Converter
}



@@ 43,11 43,11 @@ func (c *mapConverter) IsValidPB(v pref.Value) bool {
	if !ok {
		return false
	}
	return mapv.v.Type() == c.goType && mapv.IsValid()
	return mapv.v.Type() == c.goType
}

func (c *mapConverter) IsValidGo(v reflect.Value) bool {
	return v.Type() == c.goType
	return v.IsValid() && v.Type() == c.goType
}

func (c *mapConverter) New() pref.Value {

M vendor/google.golang.org/protobuf/internal/impl/legacy_export.go => vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +0 -12
@@ 7,14 7,12 @@ package impl
import (
	"encoding/binary"
	"encoding/json"
	"fmt"
	"hash/crc32"
	"math"
	"reflect"

	"google.golang.org/protobuf/internal/errors"
	pref "google.golang.org/protobuf/reflect/protoreflect"
	"google.golang.org/protobuf/reflect/protoregistry"
	piface "google.golang.org/protobuf/runtime/protoiface"
)



@@ 92,13 90,3 @@ func (Export) CompressGZIP(in []byte) (out []byte) {
	out = append(out, gzipFooter[:]...)
	return out
}

// WeakNil returns a typed nil pointer to a concrete message.
// It panics if the message is not linked into the binary.
func (Export) WeakNil(s pref.FullName) piface.MessageV1 {
	mt, err := protoregistry.GlobalTypes.FindMessageByName(s)
	if err != nil {
		panic(fmt.Sprintf("weak message %v is not linked in", s))
	}
	return mt.Zero().Interface().(piface.MessageV1)
}

M vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go => vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +2 -0
@@ 155,6 155,8 @@ func (x placeholderExtension) Cardinality() pref.Cardinality              { retu
func (x placeholderExtension) Kind() pref.Kind                            { return 0 }
func (x placeholderExtension) HasJSONName() bool                          { return false }
func (x placeholderExtension) JSONName() string                           { return "" }
func (x placeholderExtension) HasPresence() bool                          { return false }
func (x placeholderExtension) HasOptionalKeyword() bool                   { return false }
func (x placeholderExtension) IsExtension() bool                          { return true }
func (x placeholderExtension) IsWeak() bool                               { return false }
func (x placeholderExtension) IsPacked() bool                             { return false }

M vendor/google.golang.org/protobuf/internal/impl/message.go => vendor/google.golang.org/protobuf/internal/impl/message.go +1 -2
@@ 15,7 15,6 @@ import (
	"google.golang.org/protobuf/internal/genname"
	"google.golang.org/protobuf/reflect/protoreflect"
	pref "google.golang.org/protobuf/reflect/protoreflect"
	piface "google.golang.org/protobuf/runtime/protoiface"
)

// MessageInfo provides protobuf related functionality for a given Go type


@@ 109,7 108,7 @@ func (mi *MessageInfo) getPointer(m pref.Message) (p pointer, ok bool) {

type (
	SizeCache       = int32
	WeakFields      = map[int32]piface.MessageV1
	WeakFields      = map[int32]protoreflect.ProtoMessage
	UnknownFields   = []byte
	ExtensionFields = map[int32]ExtensionField
)

M vendor/google.golang.org/protobuf/internal/impl/message_reflect.go => vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +20 -5
@@ 53,7 53,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
		fs := si.fieldsByNumber[fd.Number()]
		var fi fieldInfo
		switch {
		case fd.ContainingOneof() != nil:
		case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
			fi = fieldInfoForOneof(fd, si.oneofsByName[fd.ContainingOneof().Name()], mi.Exporter, si.oneofWrappersByNumber[fd.Number()])
		case fd.IsMap():
			fi = fieldInfoForMap(fd, fs, mi.Exporter)


@@ 72,7 72,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
	mi.oneofs = map[pref.Name]*oneofInfo{}
	for i := 0; i < md.Oneofs().Len(); i++ {
		od := md.Oneofs().Get(i)
		mi.oneofs[od.Name()] = makeOneofInfo(od, si.oneofsByName[od.Name()], mi.Exporter, si.oneofWrappersByType)
		mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter)
	}

	mi.denseFields = make([]*fieldInfo, fds.Len()*2)


@@ 84,7 84,7 @@ func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {

	for i := 0; i < fds.Len(); {
		fd := fds.Get(i)
		if od := fd.ContainingOneof(); od != nil {
		if od := fd.ContainingOneof(); od != nil && !od.IsSynthetic() {
			mi.rangeInfos = append(mi.rangeInfos, mi.oneofs[od.Name()])
			i += od.Fields().Len()
		} else {


@@ 170,6 170,8 @@ func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) {
		return x.Value().List().Len() > 0
	case xd.IsMap():
		return x.Value().Map().Len() > 0
	case xd.Message() != nil:
		return x.Value().Message().IsValid()
	}
	return true
}


@@ 186,15 188,28 @@ func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value {
	return xt.Zero()
}
func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) {
	if !xt.IsValidValue(v) {
	xd := xt.TypeDescriptor()
	isValid := true
	switch {
	case !xt.IsValidValue(v):
		isValid = false
	case xd.IsList():
		isValid = v.List().IsValid()
	case xd.IsMap():
		isValid = v.Map().IsValid()
	case xd.Message() != nil:
		isValid = v.Message().IsValid()
	}
	if !isValid {
		panic(fmt.Sprintf("%v: assigning invalid value", xt.TypeDescriptor().FullName()))
	}

	if *m == nil {
		*m = make(map[int32]ExtensionField)
	}
	var x ExtensionField
	x.Set(xt, v)
	(*m)[int32(xt.TypeDescriptor().Number())] = x
	(*m)[int32(xd.Number())] = x
}
func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value {
	xd := xt.TypeDescriptor()

M vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go => vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +25 -10
@@ 221,7 221,7 @@ var (

func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo {
	ft := fs.Type
	nullable := fd.Syntax() == pref.Proto2
	nullable := fd.HasPresence()
	isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8
	if nullable {
		if ft.Kind() != reflect.Ptr && ft.Kind() != reflect.Slice {


@@ 290,9 290,9 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor
			rv.Set(conv.GoValueOf(v))
			if isBytes && rv.Len() == 0 {
				if nullable {
					rv.Set(emptyBytes) // preserve presence in proto2
					rv.Set(emptyBytes) // preserve presence
				} else {
					rv.Set(nilBytes) // do not preserve presence in proto3
					rv.Set(nilBytes) // do not preserve presence
				}
			}
		},


@@ 426,11 426,25 @@ type oneofInfo struct {
	which     func(pointer) pref.FieldNumber
}

func makeOneofInfo(od pref.OneofDescriptor, fs reflect.StructField, x exporter, wrappersByType map[reflect.Type]pref.FieldNumber) *oneofInfo {
	fieldOffset := offsetOf(fs, x)
	return &oneofInfo{
		oneofDesc: od,
		which: func(p pointer) pref.FieldNumber {
func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInfo {
	oi := &oneofInfo{oneofDesc: od}
	if od.IsSynthetic() {
		fs := si.fieldsByNumber[od.Fields().Get(0).Number()]
		fieldOffset := offsetOf(fs, x)
		oi.which = func(p pointer) pref.FieldNumber {
			if p.IsNil() {
				return 0
			}
			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
			if rv.IsNil() { // valid on either *T or []byte
				return 0
			}
			return od.Fields().Get(0).Number()
		}
	} else {
		fs := si.oneofsByName[od.Name()]
		fieldOffset := offsetOf(fs, x)
		oi.which = func(p pointer) pref.FieldNumber {
			if p.IsNil() {
				return 0
			}


@@ 442,7 456,8 @@ func makeOneofInfo(od pref.OneofDescriptor, fs reflect.StructField, x exporter, 
			if rv.IsNil() {
				return 0
			}
			return wrappersByType[rv.Type().Elem()]
		},
			return si.oneofWrappersByType[rv.Type().Elem()]
		}
	}
	return oi
}

M vendor/google.golang.org/protobuf/internal/impl/validate.go => vendor/google.golang.org/protobuf/internal/impl/validate.go +1 -1
@@ 108,7 108,7 @@ const (
func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescriptor, ft reflect.Type) validationInfo {
	var vi validationInfo
	switch {
	case fd.ContainingOneof() != nil:
	case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
		switch fd.Kind() {
		case pref.MessageKind:
			vi.typ = validationTypeMessage

M vendor/google.golang.org/protobuf/internal/impl/weak.go => vendor/google.golang.org/protobuf/internal/impl/weak.go +46 -18
@@ 5,9 5,10 @@
package impl

import (
	"reflect"
	"fmt"

	pref "google.golang.org/protobuf/reflect/protoreflect"
	"google.golang.org/protobuf/reflect/protoregistry"
)

// weakFields adds methods to the exported WeakFields type for internal use.


@@ 16,31 17,58 @@ import (
// defined directly on it.
type weakFields WeakFields

func (w *weakFields) get(num pref.FieldNumber) (_ pref.ProtoMessage, ok bool) {
	if *w == nil {
		return nil, false
	}
	m, ok := (*w)[int32(num)]
	if !ok {
		return nil, false
	}
	// As a legacy quirk, consider a typed nil to be unset.
	//
	// TODO: Consider fixing the generated set methods to clear the field
	// when provided with a typed nil.
	if v := reflect.ValueOf(m); v.Kind() == reflect.Ptr && v.IsNil() {
		return nil, false
	}
	return Export{}.ProtoMessageV2Of(m), true
func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) {
	m, ok := w[int32(num)]
	return m, ok
}

func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) {
	if *w == nil {
		*w = make(weakFields)
	}
	(*w)[int32(num)] = Export{}.ProtoMessageV1Of(m)
	(*w)[int32(num)] = m
}

func (w *weakFields) clear(num pref.FieldNumber) {
	delete(*w, int32(num))
}

func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool {
	_, ok := w[int32(num)]
	return ok
}

func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) {
	delete(*w, int32(num))
}

func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage {
	if m, ok := w[int32(num)]; ok {
		return m
	}
	mt, _ := protoregistry.GlobalTypes.FindMessageByName(name)
	if mt == nil {
		panic(fmt.Sprintf("message %v for weak field is not linked in", name))
	}
	return mt.Zero().Interface()
}

func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) {
	if m != nil {
		mt, _ := protoregistry.GlobalTypes.FindMessageByName(name)
		if mt == nil {
			panic(fmt.Sprintf("message %v for weak field is not linked in", name))
		}
		if mt != m.ProtoReflect().Type() {
			panic(fmt.Sprintf("invalid message type for weak field: got %T, want %T", m, mt.Zero().Interface()))
		}
	}
	if m == nil || !m.ProtoReflect().IsValid() {
		delete(*w, int32(num))
		return
	}
	if *w == nil {
		*w = make(weakFields)
	}
	(*w)[int32(num)] = m
}

M vendor/google.golang.org/protobuf/internal/version/version.go => vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
@@ 52,7 52,7 @@ import (
//	10. Send out the CL for review and submit it.
const (
	Major      = 1
	Minor      = 21
	Minor      = 22
	Patch      = 0
	PreRelease = ""
)

M vendor/google.golang.org/protobuf/proto/checkinit.go => vendor/google.golang.org/protobuf/proto/checkinit.go +6 -0
@@ 12,6 12,12 @@ import (

// CheckInitialized returns an error if any required fields in m are not set.
func CheckInitialized(m Message) error {
	// Treat a nil message interface as an "untyped" empty message,
	// which we assume to have no required fields.
	if m == nil {
		return nil
	}

	return checkInitialized(m.ProtoReflect())
}


M vendor/google.golang.org/protobuf/proto/encode.go => vendor/google.golang.org/protobuf/proto/encode.go +35 -0
@@ 74,19 74,54 @@ type MarshalOptions struct {

// Marshal returns the wire-format encoding of m.
func Marshal(m Message) ([]byte, error) {
	// Treat nil message interface as an empty message; nothing to output.
	if m == nil {
		return nil, nil
	}

	out, err := MarshalOptions{}.marshal(nil, m.ProtoReflect())
	if len(out.Buf) == 0 && err == nil {
		out.Buf = emptyBytesForMessage(m)
	}
	return out.Buf, err
}

// Marshal returns the wire-format encoding of m.
func (o MarshalOptions) Marshal(m Message) ([]byte, error) {
	// Treat nil message interface as an empty message; nothing to output.
	if m == nil {
		return nil, nil
	}

	out, err := o.marshal(nil, m.ProtoReflect())
	if len(out.Buf) == 0 && err == nil {
		out.Buf = emptyBytesForMessage(m)
	}
	return out.Buf, err
}

// emptyBytesForMessage returns a nil buffer if and only if m is invalid,
// otherwise it returns a non-nil empty buffer.
//
// This is to assist the edge-case where user-code does the following:
//	m1.OptionalBytes, _ = proto.Marshal(m2)
// where they expect the proto2 "optional_bytes" field to be populated
// if any only if m2 is a valid message.
func emptyBytesForMessage(m Message) []byte {
	if m == nil || !m.ProtoReflect().IsValid() {
		return nil
	}
	return emptyBuf[:]
}

// MarshalAppend appends the wire-format encoding of m to b,
// returning the result.
func (o MarshalOptions) MarshalAppend(b []byte, m Message) ([]byte, error) {
	// Treat nil message interface as an empty message; nothing to append.
	if m == nil {
		return b, nil
	}

	out, err := o.marshal(b, m.ProtoReflect())
	return out.Buf, err
}

M vendor/google.golang.org/protobuf/proto/extension.go => vendor/google.golang.org/protobuf/proto/extension.go +69 -13
@@ 9,28 9,84 @@ import (
)

// HasExtension reports whether an extension field is populated.
// It panics if ext does not extend m.
func HasExtension(m Message, ext protoreflect.ExtensionType) bool {
	return m.ProtoReflect().Has(ext.TypeDescriptor())
// It returns false if m is invalid or if xt does not extend m.
func HasExtension(m Message, xt protoreflect.ExtensionType) bool {
	// Treat nil message interface as an empty message; no populated fields.
	if m == nil {
		return false
	}

	// As a special-case, we reports invalid or mismatching descriptors
	// as always not being populated (since they aren't).
	if xt == nil || m.ProtoReflect().Descriptor() != xt.TypeDescriptor().ContainingMessage() {
		return false
	}

	return m.ProtoReflect().Has(xt.TypeDescriptor())
}

// ClearExtension clears an extension field such that subsequent
// HasExtension calls return false.
// It panics if ext does not extend m.
func ClearExtension(m Message, ext protoreflect.ExtensionType) {
	m.ProtoReflect().Clear(ext.TypeDescriptor())
// It panics if m is invalid or if xt does not extend m.
func ClearExtension(m Message, xt protoreflect.ExtensionType) {
	m.ProtoReflect().Clear(xt.TypeDescriptor())
}

// GetExtension retrieves the value for an extension field.
// If the field is unpopulated, it returns the default value for
// scalars and an immutable, empty value for lists, maps, or messages.
// It panics if ext does not extend m.
func GetExtension(m Message, ext protoreflect.ExtensionType) interface{} {
	return ext.InterfaceOf(m.ProtoReflect().Get(ext.TypeDescriptor()))
// scalars and an immutable, empty value for lists or messages.
// It panics if xt does not extend m.
func GetExtension(m Message, xt protoreflect.ExtensionType) interface{} {
	// Treat nil message interface as an empty message; return the default.
	if m == nil {
		return xt.InterfaceOf(xt.Zero())
	}

	return xt.InterfaceOf(m.ProtoReflect().Get(xt.TypeDescriptor()))
}

// SetExtension stores the value of an extension field.